From 9e53314c3a6a51f4385e2f654e9cea607990bcd8 Mon Sep 17 00:00:00 2001 From: nikitozzzzzzz Date: Wed, 26 Jul 2017 14:57:52 +0300 Subject: [PATCH] !!! IMPORTANT 2.0 version before upgrade please run full backup of your site !!! - new code structure, optimized for next development; - created spl_autoloader for remove includes; - UM classes with namespaces; - deprecated global $ultimatemember; variable (use UM() instead); - new UM/WP roles logic; - new settings class and logic (deprecated Redux framework, deprecated some old options, added some new options); - new dependencies class for extensions; - WP native styles for backend fields; - new upgrades and license activations for extensions; - new logic form backend forms and fields; - created uninstall.php file for delete permanently all UM settings; - optimized registration/upgrade profile process; Deprecated Hooks: um_new_user_registration_plain um_user_registration_extra_hook um_add_user_frontend um_post_registration_global_hook um_admin_extend_directory_options_general (was action...will be filter) --- addons/generate_random_users.php | 5 +- admin/assets/css/um-admin-global.css | 90 - admin/assets/css/um-admin-redux.css | 227 - admin/assets/js/um-admin-users.js | 30 - admin/core/lib/ReduxFramework/CHANGELOG.md | 2000 -------- admin/core/lib/ReduxFramework/README.md | 134 - admin/core/lib/ReduxFramework/README.txt | 1207 ----- .../assets/css/color-picker/color-picker.css | 1 - .../assets/css/color-picker/color-picker.scss | 97 - .../css/import_export/import_export.css | 1 - .../ReduxCore/assets/css/media/media.css | 1 - .../ReduxCore/assets/css/media/media.scss | 61 - .../ReduxCore/assets/css/redux-admin.css | 1 - .../ReduxCore/assets/css/redux-admin.scss | 1516 ------- .../ReduxCore/assets/css/redux-fields.css | 1 - .../ReduxCore/assets/css/redux-vendor.css | 1 - .../ReduxCore/assets/css/rtl.css | 1 - .../ReduxCore/assets/css/rtl.scss | 126 - .../vendor/elusive-icons/elusive-icons.css | 4 - .../fonts/elusiveicons-webfont.eot | Bin 80440 -> 0 bytes .../fonts/elusiveicons-webfont.svg | 934 ---- .../fonts/elusiveicons-webfont.ttf | Bin 80248 -> 0 bytes .../fonts/elusiveicons-webfont.woff | Bin 49068 -> 0 bytes .../vendor/elusive-icons/scss/_animated.scss | 34 - .../elusive-icons/scss/_bordered-pulled.scss | 16 - .../css/vendor/elusive-icons/scss/_core.scss | 13 - .../elusive-icons/scss/_fixed-width.scss | 6 - .../css/vendor/elusive-icons/scss/_icons.scss | 615 --- .../vendor/elusive-icons/scss/_larger.scss | 13 - .../css/vendor/elusive-icons/scss/_list.scss | 19 - .../vendor/elusive-icons/scss/_mixins.scss | 27 - .../css/vendor/elusive-icons/scss/_path.scss | 14 - .../elusive-icons/scss/_rotated-flipped.scss | 20 - .../vendor/elusive-icons/scss/_stacked.scss | 20 - .../vendor/elusive-icons/scss/_variables.scss | 318 -- .../elusive-icons/scss/elusive-icons.css | 4 - .../elusive-icons/scss/elusive-icons.css.map | 7 - .../elusive-icons/scss/elusive-icons.scss | 17 - .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 180 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 120 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 105 -> 0 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 111 -> 0 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 110 -> 0 bytes .../images/ui-bg_glass_75_ffffff_1x400.png | Bin 107 -> 0 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 101 -> 0 bytes .../ui-bg_inset-soft_95_fef1ec_1x100.png | Bin 123 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_454545_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_888888_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_f6cf3b_256x240.png | Bin 8884 -> 0 bytes .../images/ui-icons_ffffff_256x240.png | Bin 4369 -> 0 bytes .../jquery-ui-1.10.0.custom.css | 9 - .../jquery-ui-1.10.0.custom.less | 793 ---- .../jquery-ui-1.10.0.custom.scss | 799 ---- .../assets/css/vendor/qtip/jquery.qtip.css | 617 --- .../css/vendor/qtip/jquery.qtip.min.css | 3 - .../css/vendor/spectrum/redux-spectrum.css | 507 --- .../vendor/spectrum/redux-spectrum.min.css | 1 - .../ReduxCore/assets/img/1c.png | Bin 138 -> 0 bytes .../ReduxCore/assets/img/1col.png | Bin 2895 -> 0 bytes .../ReduxCore/assets/img/2-col-portfolio.png | Bin 1045 -> 0 bytes .../ReduxCore/assets/img/2cl.png | Bin 2984 -> 0 bytes .../ReduxCore/assets/img/2cr.png | Bin 2985 -> 0 bytes .../ReduxCore/assets/img/3-col-portfolio.png | Bin 1025 -> 0 bytes .../ReduxCore/assets/img/3cl.png | Bin 3156 -> 0 bytes .../ReduxCore/assets/img/3cm.png | Bin 3036 -> 0 bytes .../ReduxCore/assets/img/3cr.png | Bin 3050 -> 0 bytes .../ReduxCore/assets/img/4-col-portfolio.png | Bin 1033 -> 0 bytes .../ReduxCore/assets/img/ajax.gif | Bin 1392 -> 0 bytes .../ReduxCore/assets/img/menu_icon.png | Bin 1447 -> 0 bytes .../ReduxCore/assets/img/toggle_tabs.png | Bin 358 -> 0 bytes .../ReduxCore/assets/js/media/media.js | 220 - .../ReduxCore/assets/js/media/media.min.js | 1 - .../ReduxCore/assets/js/redux.js | 1818 -------- .../ReduxCore/assets/js/redux.min.js | 2 - .../ReduxCore/assets/js/vendor.min.js | 1 - .../ReduxCore/assets/js/vendor/cookie.js | 95 - .../assets/js/vendor/jquery.alphanum.js | 786 ---- .../assets/js/vendor/jquery.serializeForm.js | 60 - .../assets/js/vendor/jquery.typewatch.js | 94 - .../ReduxCore/assets/js/vendor/jsonview.js | 265 -- .../assets/js/vendor/jsonview.min.js | 16 - .../ReduxCore/assets/js/vendor/lte-ie7.js | 311 -- .../assets/js/vendor/qtip/jquery.qtip.js | 3451 -------------- .../assets/js/vendor/qtip/jquery.qtip.min.js | 5 - .../js/vendor/redux.select2.sortable.js | 152 - .../js/vendor/redux.select2.sortable.min.js | 1 - .../js/vendor/spectrum/redux-spectrum.js | 2088 --------- .../js/vendor/spectrum/redux-spectrum.min.js | 1 - .../ReduxCore/core/dashboard.php | 37 - .../ReduxFramework/ReduxCore/core/enqueue.php | 513 --- .../ReduxCore/core/newsflash.php | 124 - .../ReduxFramework/ReduxCore/core/panel.php | 332 -- .../ReduxCore/core/required.php | 25 - .../ReduxFramework/ReduxCore/framework.php | 4042 ----------------- .../ReduxFramework/ReduxCore/inc/browser.php | 1282 ------ .../ReduxFramework/ReduxCore/inc/class.p.php | 303 -- .../inc/class.redux_admin_notices.php | 189 - .../ReduxCore/inc/class.redux_api.php | 638 --- .../ReduxCore/inc/class.redux_cdn.php | 155 - .../ReduxCore/inc/class.redux_filesystem.php | 286 -- .../ReduxCore/inc/class.redux_functions.php | 262 -- .../ReduxCore/inc/class.redux_helpers.php | 715 --- .../ReduxCore/inc/class.redux_instances.php | 166 - .../ReduxCore/inc/class.thirdparty.fixes.php | 10 - .../ReduxCore/inc/extensions/README.txt | 1 - .../customizer/extension_customizer.css | 1 - .../customizer/extension_customizer.js | 375 -- .../customizer/extension_customizer.min.js | 1 - .../customizer/extension_customizer.php | 807 ---- .../customizer/extension_customizer.scss | 197 - .../customizer/inc/customizer_control.php | 50 - .../customizer/inc/customizer_devs.php | 43 - .../customizer/inc/customizer_fields.php | 53 - .../customizer/inc/customizer_panel.php | 157 - .../customizer/inc/customizer_section.php | 150 - .../import_export/extension_import_export.php | 209 - .../import_export/field_import_export.css | 1 - .../import_export/field_import_export.js | 200 - .../import_export/field_import_export.min.js | 1 - .../import_export/field_import_export.php | 188 - .../import_export/field_import_export.scss | 13 - .../extension_options_object.php | 101 - .../options_object/field_options_object.css | 1 - .../options_object/field_options_object.js | 44 - .../field_options_object.min.js | 1 - .../options_object/field_options_object.php | 164 - .../options_object/field_options_object.scss | 7 - .../fields/ace_editor/field_ace_editor.css | 1 - .../inc/fields/ace_editor/field_ace_editor.js | 58 - .../fields/ace_editor/field_ace_editor.min.js | 1 - .../fields/ace_editor/field_ace_editor.php | 131 - .../fields/ace_editor/field_ace_editor.scss | 16 - .../fields/background/field_background.css | 1 - .../inc/fields/background/field_background.js | 324 -- .../fields/background/field_background.min.js | 1 - .../fields/background/field_background.php | 430 -- .../fields/background/field_background.scss | 59 - .../inc/fields/border/field_border.css | 1 - .../inc/fields/border/field_border.js | 131 - .../inc/fields/border/field_border.min.js | 1 - .../inc/fields/border/field_border.php | 323 -- .../inc/fields/border/field_border.scss | 47 - .../inc/fields/button_set/field_button_set.js | 56 - .../fields/button_set/field_button_set.min.js | 1 - .../fields/button_set/field_button_set.php | 154 - .../inc/fields/checkbox/field_checkbox.css | 1 - .../inc/fields/checkbox/field_checkbox.js | 55 - .../inc/fields/checkbox/field_checkbox.min.js | 1 - .../inc/fields/checkbox/field_checkbox.php | 159 - .../inc/fields/checkbox/field_checkbox.scss | 13 - .../ReduxCore/inc/fields/color/field_color.js | 175 - .../inc/fields/color/field_color.min.js | 1 - .../inc/fields/color/field_color.php | 122 - .../color_gradient/field_color_gradient.css | 1 - .../color_gradient/field_color_gradient.js | 142 - .../field_color_gradient.min.js | 1 - .../color_gradient/field_color_gradient.php | 128 - .../color_gradient/field_color_gradient.scss | 17 - .../fields/color_rgba/field_color_rgba.css | 1 - .../inc/fields/color_rgba/field_color_rgba.js | 217 - .../fields/color_rgba/field_color_rgba.min.js | 1 - .../fields/color_rgba/field_color_rgba.php | 295 -- .../fields/color_rgba/field_color_rgba.scss | 61 - .../ReduxCore/inc/fields/date/field_date.css | 1 - .../ReduxCore/inc/fields/date/field_date.js | 82 - .../inc/fields/date/field_date.min.js | 1 - .../ReduxCore/inc/fields/date/field_date.php | 95 - .../ReduxCore/inc/fields/date/field_date.scss | 8 - .../fields/dimensions/field_dimensions.css | 1 - .../inc/fields/dimensions/field_dimensions.js | 76 - .../fields/dimensions/field_dimensions.less | 30 - .../fields/dimensions/field_dimensions.min.js | 1 - .../fields/dimensions/field_dimensions.php | 306 -- .../fields/dimensions/field_dimensions.scss | 33 - .../inc/fields/divide/field_divide.css | 1 - .../inc/fields/divide/field_divide.php | 85 - .../inc/fields/divide/field_divide.scss | 50 - .../inc/fields/editor/field_editor.css | 1 - .../inc/fields/editor/field_editor.js | 44 - .../inc/fields/editor/field_editor.min.js | 1 - .../inc/fields/editor/field_editor.php | 115 - .../inc/fields/editor/field_editor.scss | 50 - .../inc/fields/gallery/field_gallery.js | 117 - .../inc/fields/gallery/field_gallery.min.js | 1 - .../inc/fields/gallery/field_gallery.php | 105 - .../image_select/field_image_select.css | 1 - .../fields/image_select/field_image_select.js | 119 - .../image_select/field_image_select.min.js | 1 - .../image_select/field_image_select.php | 274 -- .../image_select/field_image_select.scss | 62 - .../ReduxCore/inc/fields/info/field_info.css | 1 - .../ReduxCore/inc/fields/info/field_info.php | 167 - .../ReduxCore/inc/fields/info/field_info.scss | 159 - .../fields/link_color/field_link_color.css | 1 - .../inc/fields/link_color/field_link_color.js | 111 - .../fields/link_color/field_link_color.min.js | 1 - .../fields/link_color/field_link_color.php | 224 - .../fields/link_color/field_link_color.scss | 7 - .../inc/fields/media/field_media.css | 1 - .../inc/fields/media/field_media.less | 53 - .../inc/fields/media/field_media.php | 238 - .../inc/fields/media/field_media.scss | 61 - .../fields/multi_text/field_multi_text.css | 1 - .../inc/fields/multi_text/field_multi_text.js | 65 - .../fields/multi_text/field_multi_text.min.js | 1 - .../fields/multi_text/field_multi_text.php | 113 - .../fields/multi_text/field_multi_text.scss | 53 - .../inc/fields/palette/field_palette.css | 1 - .../inc/fields/palette/field_palette.js | 53 - .../inc/fields/palette/field_palette.min.js | 1 - .../inc/fields/palette/field_palette.php | 110 - .../inc/fields/palette/field_palette.scss | 55 - .../inc/fields/password/field_password.php | 106 - .../inc/fields/radio/field_radio.php | 57 - .../ReduxCore/inc/fields/raw/field_raw.php | 53 - .../ReduxCore/inc/fields/raw/parsedown.php | 1542 ------- .../inc/fields/section/field_section.css | 1 - .../inc/fields/section/field_section.php | 130 - .../inc/fields/section/field_section.scss | 24 - .../inc/fields/select/elusive-icons.php | 312 -- .../inc/fields/select/field_select.css | 1 - .../inc/fields/select/field_select.js | 87 - .../inc/fields/select/field_select.min.js | 1 - .../inc/fields/select/field_select.php | 180 - .../inc/fields/select/field_select.scss | 9 - .../select_image/field_select_image.css | 1 - .../fields/select_image/field_select_image.js | 72 - .../select_image/field_select_image.min.js | 1 - .../select_image/field_select_image.php | 176 - .../select_image/field_select_image.scss | 19 - .../inc/fields/slider/field_slider.css | 1 - .../inc/fields/slider/field_slider.js | 269 -- .../inc/fields/slider/field_slider.min.js | 1 - .../inc/fields/slider/field_slider.php | 414 -- .../inc/fields/slider/field_slider.scss | 81 - .../nouislider/redux.jquery.nouislider.css | 172 - .../nouislider/redux.jquery.nouislider.js | 1420 ------ .../nouislider/redux.jquery.nouislider.min.js | 20 - .../inc/fields/slides/field_slides.css | 1 - .../inc/fields/slides/field_slides.js | 150 - .../inc/fields/slides/field_slides.min.js | 1 - .../inc/fields/slides/field_slides.php | 270 -- .../inc/fields/slides/field_slides.scss | 92 - .../inc/fields/sortable/field_sortable.css | 1 - .../inc/fields/sortable/field_sortable.js | 91 - .../inc/fields/sortable/field_sortable.min.js | 1 - .../inc/fields/sortable/field_sortable.php | 164 - .../inc/fields/sortable/field_sortable.scss | 73 - .../inc/fields/sorter/field_sorter.css | 1 - .../inc/fields/sorter/field_sorter.js | 151 - .../inc/fields/sorter/field_sorter.min.js | 1 - .../inc/fields/sorter/field_sorter.php | 223 - .../inc/fields/sorter/field_sorter.scss | 63 - .../inc/fields/spacing/field_spacing.css | 1 - .../inc/fields/spacing/field_spacing.js | 86 - .../inc/fields/spacing/field_spacing.min.js | 1 - .../inc/fields/spacing/field_spacing.php | 385 -- .../inc/fields/spacing/field_spacing.scss | 33 - .../inc/fields/spinner/arrow_left.png | Bin 150 -> 0 bytes .../inc/fields/spinner/arrow_right.png | Bin 154 -> 0 bytes .../inc/fields/spinner/field_spinner.css | 1 - .../inc/fields/spinner/field_spinner.js | 129 - .../inc/fields/spinner/field_spinner.min.js | 1 - .../inc/fields/spinner/field_spinner.php | 183 - .../inc/fields/spinner/field_spinner.scss | 101 - .../fields/spinner/vendor/spinner_custom.js | 1 - .../inc/fields/switch/field_switch.css | 1 - .../inc/fields/switch/field_switch.js | 91 - .../inc/fields/switch/field_switch.min.js | 1 - .../inc/fields/switch/field_switch.php | 79 - .../inc/fields/switch/field_switch.scss | 68 - .../inc/fields/switch/slider-control.png | Bin 1690 -> 0 bytes .../ReduxCore/inc/fields/switch/switch.gif | Bin 1233 -> 0 bytes .../ReduxCore/inc/fields/text/field_text.css | 1 - .../ReduxCore/inc/fields/text/field_text.php | 93 - .../ReduxCore/inc/fields/text/field_text.scss | 44 - .../inc/fields/textarea/field_textarea.php | 79 - .../fields/typography/field_typography.css | 1 - .../inc/fields/typography/field_typography.js | 655 --- .../fields/typography/field_typography.json | 1093 ----- .../fields/typography/field_typography.min.js | 1 - .../fields/typography/field_typography.php | 1093 ----- .../fields/typography/field_typography.scss | 247 - .../typography/field_typography_json.js | 669 --- .../typography/field_typography_json.min.js | 1 - .../inc/fields/typography/googlefonts.php | 1 - .../ReduxCore/inc/lib.redux_instances.php | 34 - .../inc/themecheck/checks/embedded.php | 58 - .../inc/themecheck/checks/full_package.php | 55 - .../ReduxCore/inc/themecheck/checks/index.php | 2 - .../inc/themecheck/class.redux_themecheck.php | 227 - .../ReduxCore/inc/themecheck/css/admin.css | 9 - .../ReduxCore/inc/themecheck/index.php | 2 - .../ReduxCore/inc/themecheck/js/admin.js | 14 - .../ReduxCore/inc/themecheck/lang/index.php | 2 - .../inc/themecheck/lang/themeforest-check.pot | 27 - .../ReduxFramework/ReduxCore/inc/tracking.php | 501 -- .../inc/validation/color/validation_color.php | 70 - .../color_rgba/validation_color_rgba.php | 62 - .../colorrgba/validation_colorrgba.php | 78 - .../validation_comma_numeric.php | 39 - .../inc/validation/css/validation_css.php | 47 - .../inc/validation/date/validation_date.php | 53 - .../inc/validation/email/validation_email.php | 37 - .../validation_email_not_empty.php | 37 - .../inc/validation/html/validation_html.php | 33 - .../html_custom/validation_html_custom.php | 34 - .../inc/validation/js/validation_js.php | 33 - .../validation/no_html/validation_no_html.php | 39 - .../validation_no_special_chars.php | 38 - .../not_empty/validation_not_empty.php | 37 - .../validation/numeric/validation_numeric.php | 37 - .../validation_numeric_not_empty.php | 36 - .../preg_replace/validation_preg_replace.php | 34 - .../str_replace/validation_str_replace.php | 33 - .../unique_slug/validation_unique_slug.php | 69 - .../inc/validation/url/validation_url.php | 39 - .../inc/welcome/css/redux-welcome.css | 1 - .../inc/welcome/css/redux-welcome.scss | 696 --- .../inc/welcome/js/jquery.easing.min.js | 44 - .../inc/welcome/js/redux-welcome-admin.js | 294 -- .../ReduxCore/inc/welcome/views/about.php | 79 - .../ReduxCore/inc/welcome/views/changelog.php | 23 - .../ReduxCore/inc/welcome/views/credits.php | 22 - .../inc/welcome/views/extensions.php | 152 - .../inc/welcome/views/status_report.php | 838 ---- .../ReduxCore/inc/welcome/views/support.php | 146 - .../ReduxCore/inc/welcome/welcome.php | 568 --- .../ReduxCore/languages/README.txt | 1 - .../ReduxCore/languages/redux-framework.pot | 1556 ------- .../templates/panel/container.tpl.php | 58 - .../ReduxCore/templates/panel/content.tpl.php | 99 - .../ReduxCore/templates/panel/footer.tpl.php | 71 - .../ReduxCore/templates/panel/header.tpl.php | 73 - .../templates/panel/header_stickybar.tpl.php | 39 - .../templates/panel/menu_container.tpl.php | 51 - .../lib/ReduxFramework/bootstrap_tests.php | 31 - .../lib/ReduxFramework/class.redux-plugin.php | 433 -- admin/core/lib/ReduxFramework/index.php | 2 - admin/core/lib/ReduxFramework/license.txt | 702 --- .../lib/ReduxFramework/redux-framework.php | 49 - admin/core/lib/ReduxFramework/uninstall.php | 16 - admin/core/lib/ReduxFramework/wpml-config.xml | 7 - admin/core/um-admin-access.php | 146 - admin/core/um-admin-actions-ajax.php | 82 - admin/core/um-admin-actions-fields.php | 67 - admin/core/um-admin-actions-modal.php | 369 -- admin/core/um-admin-actions.php | 452 -- admin/core/um-admin-builder.php | 299 -- admin/core/um-admin-columns.php | 119 - admin/core/um-admin-dashboard.php | 346 -- admin/core/um-admin-dragdrop.php | 220 - admin/core/um-admin-enqueue.php | 295 -- admin/core/um-admin-functions.php | 112 - admin/core/um-admin-metabox.php | 1548 ------- admin/core/um-admin-notices.php | 229 - admin/core/um-admin-redux.php | 126 - admin/core/um-admin-roles.php | 86 - admin/core/um-admin-upgrade.php | 31 - admin/core/um-admin-users.php | 414 -- admin/index.php | 5 - admin/templates/access/settings.php | 72 - admin/templates/directory/appearance.php | 15 - admin/templates/directory/general.php | 97 - admin/templates/directory/pagination.php | 36 - admin/templates/directory/profile.php | 168 - admin/templates/directory/profile_card.php | 23 - admin/templates/directory/search.php | 119 - admin/templates/directory/shortcode.php | 5 - admin/templates/extensions.php | 195 - admin/templates/form/login_css.php | 8 - admin/templates/form/login_customize.php | 111 - admin/templates/form/login_settings.php | 20 - admin/templates/form/profile_css.php | 8 - admin/templates/form/profile_customize.php | 208 - admin/templates/form/profile_settings.php | 51 - admin/templates/form/register_css.php | 8 - admin/templates/form/register_customize.php | 105 - admin/templates/form/shortcode.php | 5 - admin/templates/role/admin.php | 65 - admin/templates/role/delete.php | 30 - admin/templates/role/general.php | 19 - admin/templates/role/home.php | 27 - admin/templates/role/login.php | 32 - admin/templates/role/logout.php | 30 - admin/templates/role/profile.php | 37 - admin/templates/role/register.php | 148 - admin/templates/role/sync.php | 34 - admin/templates/welcome/about_footer.php | 14 - admin/um-admin-init.php | 77 - assets/css/um-old-default.css | 253 ++ assets/dynamic_css/dynamic_global.php | 297 -- assets/dynamic_css/dynamic_profile.php | 90 - assets/js/um-conditional.js | 422 +- assets/js/um-crop.js | 14 +- assets/js/um-functions.js | 1 - assets/js/um-masonry.js | 1 - assets/js/um-members.js | 13 + assets/js/um-modal.js | 9 +- assets/js/um-profile.js | 6 +- assets/js/um-scripts.js | 21 +- assets/js/um.min.js | 16 +- core/lib/mobiledetect/Mobile_Detect.php | 1320 ------ core/um-access.php | 87 - core/um-account.php | 364 -- core/um-actions-access.php | 876 ---- core/um-actions-ajax.php | 222 - core/um-actions-register.php | 370 -- core/um-api.php | 870 ---- core/um-builtin.php | 1625 ------- core/um-chart.php | 130 - core/um-cron.php | 52 - core/um-datetime.php | 119 - core/um-enqueue.php | 396 -- core/um-fields.php | 2910 ------------ core/um-files.php | 704 --- core/um-filters-addons.php | 67 - core/um-filters-commenting.php | 32 - core/um-fonticons.php | 37 - core/um-form.php | 283 -- core/um-login.php | 5 - core/um-logout.php | 80 - core/um-mail.php | 123 - core/um-members.php | 372 -- core/um-menu.php | 33 - core/um-modal.php | 25 - core/um-password.php | 234 - core/um-permalinks.php | 513 --- core/um-profile.php | 207 - core/um-query.php | 428 -- core/um-register.php | 31 - core/um-rewrite.php | 194 - core/um-setup.php | 492 -- core/um-shortcodes.php | 609 --- core/um-taxonomies.php | 76 - core/um-tracking.php | 156 - core/um-uninstall.php | 49 - core/um-user-posts.php | 127 - core/um-user.php | 1130 ----- core/um-validation.php | 210 - .../admin}/assets/css/um-admin-builder.css | 12 +- .../admin}/assets/css/um-admin-columns.css | 2 +- .../admin}/assets/css/um-admin-dashboard.css | 11 +- .../admin}/assets/css/um-admin-form.css | 0 includes/admin/assets/css/um-admin-forms.css | 174 + includes/admin/assets/css/um-admin-global.css | 181 + .../admin}/assets/css/um-admin-menu.css | 0 .../admin}/assets/css/um-admin-misc.css | 9 +- .../admin}/assets/css/um-admin-modal.css | 8 +- .../admin}/assets/css/um-admin-rtl.css | 17 +- .../admin}/assets/css/um-admin-select2.css | 0 .../admin/assets/css/um-admin-settings.css | 216 + .../admin}/assets/img/1-column-active.gif | Bin .../admin}/assets/img/1-column.gif | Bin .../admin}/assets/img/2-columns-active.gif | Bin .../admin}/assets/img/2-columns.gif | Bin .../admin}/assets/img/3-columns-active.gif | Bin .../admin}/assets/img/3-columns.gif | Bin .../admin}/assets/img/ajax-loader.gif | Bin .../admin}/assets/img/logo-header.png | Bin .../admin}/assets/img/logo-small.png | Bin {admin => includes/admin}/assets/img/logo.png | Bin .../admin}/assets/img/logo_small.png | Bin .../admin}/assets/js/um-admin-ajax.js | 4 +- .../admin}/assets/js/um-admin-builder.js | 8 +- .../admin}/assets/js/um-admin-dashboard.js | 0 .../admin}/assets/js/um-admin-dragdrop.js | 4 +- .../admin}/assets/js/um-admin-field.js | 6 +- .../admin}/assets/js/um-admin-form.js | 0 includes/admin/assets/js/um-admin-forms.js | 241 + .../admin}/assets/js/um-admin-modal.js | 57 +- .../admin/assets/js/um-admin-role-wrapper.js | 12 + .../admin}/assets/js/um-admin-scripts.js | 87 +- includes/admin/assets/js/um-admin-settings.js | 12 + includes/admin/class-admin.php | 43 + includes/admin/core/class-admin-builder.php | 681 +++ includes/admin/core/class-admin-columns.php | 121 + includes/admin/core/class-admin-dragdrop.php | 216 + includes/admin/core/class-admin-enqueue.php | 390 ++ includes/admin/core/class-admin-forms.php | 890 ++++ includes/admin/core/class-admin-functions.php | 121 + includes/admin/core/class-admin-menu.php | 321 ++ includes/admin/core/class-admin-metabox.php | 1953 ++++++++ includes/admin/core/class-admin-notices.php | 220 + includes/admin/core/class-admin-settings.php | 1963 ++++++++ includes/admin/core/class-admin-upgrade.php | 73 + includes/admin/core/class-admin-users.php | 295 ++ .../core/list-tables/emails-list-table.php | 192 + .../core/list-tables/roles-list-table.php | 366 ++ .../admin}/core/packages/1.3.39.php | 2 +- includes/admin/core/packages/2.0.php | 1128 +++++ .../admin/core/um-admin-actions-modal.php | 87 + .../admin}/core/um-admin-actions-user.php | 16 +- includes/admin/core/um-admin-actions.php | 226 + .../admin}/core/um-admin-filters-fields.php | 20 +- .../templates/access/restrict_content.php | 129 + .../admin}/templates/dashboard/cache.php | 0 .../admin}/templates/dashboard/feed.php | 0 .../templates/dashboard/language-contrib.php | 0 .../templates/dashboard/language-download.php | 2 +- .../templates/dashboard/language-update.php | 2 +- .../admin}/templates/dashboard/purge.php | 0 .../admin}/templates/dashboard/users.php | 12 +- .../admin/templates/directory/appearance.php | 17 + .../admin/templates/directory/general.php | 101 + .../admin/templates/directory/pagination.php | 38 + .../admin/templates/directory/profile.php | 95 + includes/admin/templates/directory/search.php | 94 + .../admin/templates/directory/shortcode.php | 5 + includes/admin/templates/extensions.php | 214 + .../admin}/templates/form/builder.php | 16 +- .../admin/templates/form/login_customize.php | 87 + .../admin/templates/form/login_settings.php | 32 + .../admin}/templates/form/mode.php | 2 +- .../templates/form/profile_customize.php | 154 + .../admin/templates/form/profile_settings.php | 27 + .../templates/form/register_customize.php | 88 + includes/admin/templates/form/shortcode.php | 5 + .../templates/modal/dynamic_edit_field.php | 0 .../templates/modal/dynamic_edit_row.php | 0 .../templates/modal/dynamic_form_preview.php | 0 .../templates/modal/dynamic_new_divider.php | 0 .../templates/modal/dynamic_new_field.php | 0 .../templates/modal/dynamic_new_group.php | 0 .../modal/dynamic_registration_preview.php | 0 .../admin}/templates/modal/fields.php | 0 .../admin}/templates/modal/fonticons.php | 2 +- includes/admin/templates/role/admin.php | 64 + includes/admin/templates/role/delete.php | 33 + includes/admin/templates/role/general.php | 26 + includes/admin/templates/role/home.php | 29 + includes/admin/templates/role/login.php | 35 + includes/admin/templates/role/logout.php | 33 + includes/admin/templates/role/profile.php | 46 + includes/admin/templates/role/publish.php | 11 + includes/admin/templates/role/register.php | 121 + includes/admin/templates/role/role-edit.php | 139 + .../admin/templates/role/wp-capabilities.php | 36 + .../admin}/templates/welcome/about.php | 5 +- .../admin/templates/welcome/about_footer.php | 8 + .../admin}/templates/welcome/about_header.php | 0 .../admin}/templates/welcome/start.php | 7 +- includes/class-config.php | 530 +++ includes/class-dependencies.php | 132 + includes/class-functions.php | 181 + includes/class-init.php | 927 ++++ includes/core/class-access.php | 480 ++ includes/core/class-account.php | 359 ++ includes/core/class-ajax-common.php | 64 + includes/core/class-builtin.php | 1620 +++++++ includes/core/class-chart.php | 135 + includes/core/class-common.php | 93 + includes/core/class-cron.php | 58 + includes/core/class-date-time.php | 125 + includes/core/class-enqueue.php | 413 ++ includes/core/class-fields.php | 2961 ++++++++++++ includes/core/class-files.php | 747 +++ includes/core/class-fonticons.php | 43 + includes/core/class-form.php | 342 ++ includes/core/class-login.php | 13 + includes/core/class-logout.php | 86 + includes/core/class-mail.php | 131 + includes/core/class-members.php | 376 ++ includes/core/class-menu.php | 39 + includes/core/class-modal.php | 29 + includes/core/class-password.php | 229 + includes/core/class-permalinks.php | 511 +++ includes/core/class-profile.php | 248 + includes/core/class-query.php | 300 ++ includes/core/class-register.php | 35 + includes/core/class-rest-api.php | 864 ++++ includes/core/class-rewrite.php | 216 + includes/core/class-roles-capabilities.php | 344 ++ includes/core/class-router.php | 103 + includes/core/class-setup.php | 219 + includes/core/class-shortcodes.php | 604 +++ includes/core/class-tracking.php | 158 + includes/core/class-user-posts.php | 110 + includes/core/class-user.php | 1243 +++++ includes/core/class-validation.php | 187 + includes/core/um-actions-access.php | 350 ++ .../core}/um-actions-account.php | 96 +- includes/core/um-actions-ajax.php | 22 + {core => includes/core}/um-actions-core.php | 38 +- {core => includes/core}/um-actions-form.php | 196 +- {core => includes/core}/um-actions-global.php | 16 +- {core => includes/core}/um-actions-login.php | 80 +- .../core}/um-actions-members.php | 27 +- {core => includes/core}/um-actions-misc.php | 17 +- .../core}/um-actions-password.php | 54 +- .../core}/um-actions-profile.php | 192 +- includes/core/um-actions-register.php | 355 ++ .../core}/um-actions-save-profile.php | 19 +- {core => includes/core}/um-actions-user.php | 42 +- .../core}/um-actions-wpadmin.php | 11 +- .../core}/um-filters-account.php | 11 +- .../core}/um-filters-arguments.php | 18 +- .../core}/um-filters-avatars.php | 0 includes/core/um-filters-commenting.php | 31 + {core => includes/core}/um-filters-fields.php | 78 +- {core => includes/core}/um-filters-files.php | 0 .../core}/um-filters-language.php | 39 +- {core => includes/core}/um-filters-login.php | 0 .../core}/um-filters-members.php | 142 +- {core => includes/core}/um-filters-misc.php | 0 .../core}/um-filters-navmenu.php | 4 +- .../core}/um-filters-profile.php | 25 +- {core => includes/core}/um-filters-user.php | 30 +- .../core}/um-navmenu-walker-edit.php | 4 +- {core => includes/core}/um-navmenu-walker.php | 0 {core => includes/core}/um-navmenu.php | 0 {core => includes}/lib/array2xml.php | 0 {core => includes}/lib/browser.php | 0 .../lib/mobiledetect/class-mobile-detect.php | 1321 ++++++ .../lib/upload/um-file-upload.php | 38 +- .../lib/upload/um-image-upload.php | 30 +- {core => includes}/um-short-functions.php | 652 ++- .../widgets/class-um-search-widget.php | 12 +- index.php | 64 - templates/account.php | 6 +- templates/members-grid.php | 9 +- templates/password-change.php | 2 +- templates/password-reset.php | 4 +- templates/profile.php | 4 +- templates/profile/comments-single.php | 6 +- templates/profile/comments.php | 8 +- templates/profile/posts-single.php | 6 +- templates/profile/posts.php | 10 +- ultimate-member.php | 26 + um-config.php | 2170 --------- um-init.php | 234 - uninstall.php | 106 + 635 files changed, 30753 insertions(+), 83847 deletions(-) delete mode 100644 admin/assets/css/um-admin-global.css delete mode 100644 admin/assets/css/um-admin-redux.css delete mode 100644 admin/assets/js/um-admin-users.js delete mode 100755 admin/core/lib/ReduxFramework/CHANGELOG.md delete mode 100644 admin/core/lib/ReduxFramework/README.md delete mode 100644 admin/core/lib/ReduxFramework/README.txt delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/color-picker/color-picker.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/color-picker/color-picker.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/import_export/import_export.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/media/media.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/media/media.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-admin.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-admin.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-fields.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-vendor.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/rtl.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/rtl.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/elusive-icons.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/fonts/elusiveicons-webfont.eot delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/fonts/elusiveicons-webfont.svg delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/fonts/elusiveicons-webfont.ttf delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/fonts/elusiveicons-webfont.woff delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_animated.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_bordered-pulled.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_core.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_fixed-width.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_icons.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_larger.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_list.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_mixins.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_path.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_rotated-flipped.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_stacked.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_variables.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/elusive-icons.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/elusive-icons.css.map delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/elusive-icons.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_glass_75_dadada_1x400.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_glass_75_e6e6e6_1x400.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_glass_75_ffffff_1x400.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_highlight-soft_75_cccccc_1x100.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_inset-soft_95_fef1ec_1x100.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_222222_256x240.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_2e83ff_256x240.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_454545_256x240.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_888888_256x240.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_cd0a0a_256x240.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_f6cf3b_256x240.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_ffffff_256x240.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/jquery-ui-1.10.0.custom.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/jquery-ui-1.10.0.custom.less delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/jquery-ui-1.10.0.custom.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/qtip/jquery.qtip.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/qtip/jquery.qtip.min.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/spectrum/redux-spectrum.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/spectrum/redux-spectrum.min.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/img/1c.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/img/1col.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/img/2-col-portfolio.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/img/2cl.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/img/2cr.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/img/3-col-portfolio.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/img/3cl.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/img/3cm.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/img/3cr.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/img/4-col-portfolio.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/img/ajax.gif delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/img/menu_icon.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/img/toggle_tabs.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/media/media.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/media/media.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/redux.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/redux.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/cookie.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/jquery.alphanum.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/jquery.serializeForm.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/jquery.typewatch.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/jsonview.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/jsonview.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/lte-ie7.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/qtip/jquery.qtip.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/qtip/jquery.qtip.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/redux.select2.sortable.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/redux.select2.sortable.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/spectrum/redux-spectrum.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/spectrum/redux-spectrum.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/core/dashboard.php delete mode 100644 admin/core/lib/ReduxFramework/ReduxCore/core/enqueue.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/core/newsflash.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/core/panel.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/core/required.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/framework.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/browser.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/class.p.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_admin_notices.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_api.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_cdn.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_filesystem.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_functions.php delete mode 100644 admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_helpers.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_instances.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/class.thirdparty.fixes.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/README.txt delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/inc/customizer_control.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/inc/customizer_devs.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/inc/customizer_fields.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/inc/customizer_panel.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/inc/customizer_section.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/extension_import_export.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/extension_options_object.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/button_set/field_button_set.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/button_set/field_button_set.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/button_set/field_button_set.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color/field_color.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color/field_color.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color/field_color.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.less delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/divide/field_divide.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/divide/field_divide.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/divide/field_divide.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/gallery/field_gallery.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/gallery/field_gallery.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/gallery/field_gallery.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/info/field_info.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/info/field_info.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/info/field_info.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.less delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/password/field_password.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/radio/field_radio.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/raw/field_raw.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/raw/parsedown.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/section/field_section.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/section/field_section.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/section/field_section.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/elusive-icons.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/field_select.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/field_select.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/field_select.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/field_select.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/field_select.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/vendor/nouislider/redux.jquery.nouislider.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/vendor/nouislider/redux.jquery.nouislider.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/vendor/nouislider/redux.jquery.nouislider.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slides/field_slides.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slides/field_slides.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slides/field_slides.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slides/field_slides.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slides/field_slides.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/sortable/field_sortable.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/sortable/field_sortable.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/sortable/field_sortable.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/sortable/field_sortable.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/sortable/field_sortable.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/sorter/field_sorter.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/sorter/field_sorter.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/sorter/field_sorter.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/sorter/field_sorter.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/sorter/field_sorter.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/spacing/field_spacing.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/spacing/field_spacing.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/spacing/field_spacing.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/spacing/field_spacing.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/spacing/field_spacing.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/spinner/arrow_left.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/spinner/arrow_right.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/spinner/field_spinner.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/spinner/field_spinner.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/spinner/field_spinner.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/spinner/field_spinner.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/spinner/field_spinner.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/spinner/vendor/spinner_custom.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/switch/field_switch.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/switch/field_switch.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/switch/field_switch.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/switch/field_switch.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/switch/field_switch.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/switch/slider-control.png delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/switch/switch.gif delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/text/field_text.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/text/field_text.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/text/field_text.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/textarea/field_textarea.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/typography/field_typography.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/typography/field_typography.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/typography/field_typography.json delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/typography/field_typography.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/typography/field_typography.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/typography/field_typography.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/typography/field_typography_json.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/typography/field_typography_json.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/fields/typography/googlefonts.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/lib.redux_instances.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/themecheck/checks/embedded.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/themecheck/checks/full_package.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/themecheck/checks/index.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/themecheck/class.redux_themecheck.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/themecheck/css/admin.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/themecheck/index.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/themecheck/js/admin.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/themecheck/lang/index.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/themecheck/lang/themeforest-check.pot delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/tracking.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/color/validation_color.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/color_rgba/validation_color_rgba.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/colorrgba/validation_colorrgba.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/comma_numeric/validation_comma_numeric.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/css/validation_css.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/date/validation_date.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/email/validation_email.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/email_not_empty/validation_email_not_empty.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/html/validation_html.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/html_custom/validation_html_custom.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/js/validation_js.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/no_html/validation_no_html.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/no_special_chars/validation_no_special_chars.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/not_empty/validation_not_empty.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/numeric/validation_numeric.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/numeric_not_empty/validation_numeric_not_empty.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/preg_replace/validation_preg_replace.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/str_replace/validation_str_replace.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/unique_slug/validation_unique_slug.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/validation/url/validation_url.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/welcome/css/redux-welcome.css delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/welcome/css/redux-welcome.scss delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/welcome/js/jquery.easing.min.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/welcome/js/redux-welcome-admin.js delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/welcome/views/about.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/welcome/views/changelog.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/welcome/views/credits.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/welcome/views/extensions.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/welcome/views/status_report.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/welcome/views/support.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/inc/welcome/welcome.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/languages/README.txt delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/languages/redux-framework.pot delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/templates/panel/container.tpl.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/templates/panel/content.tpl.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/templates/panel/footer.tpl.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/templates/panel/header.tpl.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/templates/panel/header_stickybar.tpl.php delete mode 100755 admin/core/lib/ReduxFramework/ReduxCore/templates/panel/menu_container.tpl.php delete mode 100755 admin/core/lib/ReduxFramework/bootstrap_tests.php delete mode 100755 admin/core/lib/ReduxFramework/class.redux-plugin.php delete mode 100755 admin/core/lib/ReduxFramework/index.php delete mode 100755 admin/core/lib/ReduxFramework/license.txt delete mode 100755 admin/core/lib/ReduxFramework/redux-framework.php delete mode 100755 admin/core/lib/ReduxFramework/uninstall.php delete mode 100755 admin/core/lib/ReduxFramework/wpml-config.xml delete mode 100644 admin/core/um-admin-access.php delete mode 100644 admin/core/um-admin-actions-ajax.php delete mode 100644 admin/core/um-admin-actions-fields.php delete mode 100644 admin/core/um-admin-actions-modal.php delete mode 100644 admin/core/um-admin-actions.php delete mode 100644 admin/core/um-admin-builder.php delete mode 100644 admin/core/um-admin-columns.php delete mode 100644 admin/core/um-admin-dashboard.php delete mode 100644 admin/core/um-admin-dragdrop.php delete mode 100644 admin/core/um-admin-enqueue.php delete mode 100644 admin/core/um-admin-functions.php delete mode 100644 admin/core/um-admin-metabox.php delete mode 100644 admin/core/um-admin-notices.php delete mode 100644 admin/core/um-admin-redux.php delete mode 100644 admin/core/um-admin-roles.php delete mode 100644 admin/core/um-admin-upgrade.php delete mode 100644 admin/core/um-admin-users.php delete mode 100644 admin/index.php delete mode 100644 admin/templates/access/settings.php delete mode 100644 admin/templates/directory/appearance.php delete mode 100644 admin/templates/directory/general.php delete mode 100644 admin/templates/directory/pagination.php delete mode 100644 admin/templates/directory/profile.php delete mode 100644 admin/templates/directory/profile_card.php delete mode 100644 admin/templates/directory/search.php delete mode 100644 admin/templates/directory/shortcode.php delete mode 100644 admin/templates/extensions.php delete mode 100644 admin/templates/form/login_css.php delete mode 100644 admin/templates/form/login_customize.php delete mode 100644 admin/templates/form/login_settings.php delete mode 100644 admin/templates/form/profile_css.php delete mode 100644 admin/templates/form/profile_customize.php delete mode 100644 admin/templates/form/profile_settings.php delete mode 100644 admin/templates/form/register_css.php delete mode 100644 admin/templates/form/register_customize.php delete mode 100644 admin/templates/form/shortcode.php delete mode 100644 admin/templates/role/admin.php delete mode 100644 admin/templates/role/delete.php delete mode 100644 admin/templates/role/general.php delete mode 100644 admin/templates/role/home.php delete mode 100644 admin/templates/role/login.php delete mode 100644 admin/templates/role/logout.php delete mode 100644 admin/templates/role/profile.php delete mode 100644 admin/templates/role/register.php delete mode 100644 admin/templates/role/sync.php delete mode 100644 admin/templates/welcome/about_footer.php delete mode 100644 admin/um-admin-init.php create mode 100644 assets/css/um-old-default.css delete mode 100644 assets/js/um-masonry.js delete mode 100644 core/lib/mobiledetect/Mobile_Detect.php delete mode 100644 core/um-access.php delete mode 100644 core/um-account.php delete mode 100644 core/um-actions-access.php delete mode 100644 core/um-actions-ajax.php delete mode 100644 core/um-actions-register.php delete mode 100644 core/um-api.php delete mode 100644 core/um-builtin.php delete mode 100644 core/um-chart.php delete mode 100644 core/um-cron.php delete mode 100644 core/um-datetime.php delete mode 100644 core/um-enqueue.php delete mode 100644 core/um-fields.php delete mode 100644 core/um-files.php delete mode 100644 core/um-filters-addons.php delete mode 100644 core/um-filters-commenting.php delete mode 100644 core/um-fonticons.php delete mode 100644 core/um-form.php delete mode 100644 core/um-login.php delete mode 100644 core/um-logout.php delete mode 100644 core/um-mail.php delete mode 100644 core/um-members.php delete mode 100644 core/um-menu.php delete mode 100644 core/um-modal.php delete mode 100644 core/um-password.php delete mode 100644 core/um-permalinks.php delete mode 100644 core/um-profile.php delete mode 100644 core/um-query.php delete mode 100644 core/um-register.php delete mode 100644 core/um-rewrite.php delete mode 100644 core/um-setup.php delete mode 100644 core/um-shortcodes.php delete mode 100644 core/um-taxonomies.php delete mode 100644 core/um-tracking.php delete mode 100644 core/um-uninstall.php delete mode 100644 core/um-user-posts.php delete mode 100644 core/um-user.php delete mode 100644 core/um-validation.php rename {admin => includes/admin}/assets/css/um-admin-builder.css (95%) rename {admin => includes/admin}/assets/css/um-admin-columns.css (98%) rename {admin => includes/admin}/assets/css/um-admin-dashboard.css (95%) rename {admin => includes/admin}/assets/css/um-admin-form.css (100%) create mode 100644 includes/admin/assets/css/um-admin-forms.css create mode 100644 includes/admin/assets/css/um-admin-global.css rename {admin => includes/admin}/assets/css/um-admin-menu.css (100%) rename {admin => includes/admin}/assets/css/um-admin-misc.css (95%) rename {admin => includes/admin}/assets/css/um-admin-modal.css (98%) rename {admin => includes/admin}/assets/css/um-admin-rtl.css (71%) rename {admin => includes/admin}/assets/css/um-admin-select2.css (100%) create mode 100644 includes/admin/assets/css/um-admin-settings.css rename {admin => includes/admin}/assets/img/1-column-active.gif (100%) rename {admin => includes/admin}/assets/img/1-column.gif (100%) rename {admin => includes/admin}/assets/img/2-columns-active.gif (100%) rename {admin => includes/admin}/assets/img/2-columns.gif (100%) rename {admin => includes/admin}/assets/img/3-columns-active.gif (100%) rename {admin => includes/admin}/assets/img/3-columns.gif (100%) rename {admin => includes/admin}/assets/img/ajax-loader.gif (100%) rename {admin => includes/admin}/assets/img/logo-header.png (100%) rename {admin => includes/admin}/assets/img/logo-small.png (100%) rename {admin => includes/admin}/assets/img/logo.png (100%) rename {admin => includes/admin}/assets/img/logo_small.png (100%) rename {admin => includes/admin}/assets/js/um-admin-ajax.js (86%) rename {admin => includes/admin}/assets/js/um-admin-builder.js (84%) rename {admin => includes/admin}/assets/js/um-admin-dashboard.js (100%) rename {admin => includes/admin}/assets/js/um-admin-dragdrop.js (99%) rename {admin => includes/admin}/assets/js/um-admin-field.js (90%) rename {admin => includes/admin}/assets/js/um-admin-form.js (100%) create mode 100644 includes/admin/assets/js/um-admin-forms.js rename {admin => includes/admin}/assets/js/um-admin-modal.js (87%) create mode 100644 includes/admin/assets/js/um-admin-role-wrapper.js rename {admin => includes/admin}/assets/js/um-admin-scripts.js (68%) create mode 100644 includes/admin/assets/js/um-admin-settings.js create mode 100644 includes/admin/class-admin.php create mode 100644 includes/admin/core/class-admin-builder.php create mode 100644 includes/admin/core/class-admin-columns.php create mode 100644 includes/admin/core/class-admin-dragdrop.php create mode 100644 includes/admin/core/class-admin-enqueue.php create mode 100644 includes/admin/core/class-admin-forms.php create mode 100644 includes/admin/core/class-admin-functions.php create mode 100644 includes/admin/core/class-admin-menu.php create mode 100644 includes/admin/core/class-admin-metabox.php create mode 100644 includes/admin/core/class-admin-notices.php create mode 100644 includes/admin/core/class-admin-settings.php create mode 100644 includes/admin/core/class-admin-upgrade.php create mode 100644 includes/admin/core/class-admin-users.php create mode 100644 includes/admin/core/list-tables/emails-list-table.php create mode 100644 includes/admin/core/list-tables/roles-list-table.php rename {admin => includes/admin}/core/packages/1.3.39.php (95%) create mode 100644 includes/admin/core/packages/2.0.php create mode 100644 includes/admin/core/um-admin-actions-modal.php rename {admin => includes/admin}/core/um-admin-actions-user.php (64%) create mode 100644 includes/admin/core/um-admin-actions.php rename {admin => includes/admin}/core/um-admin-filters-fields.php (80%) create mode 100644 includes/admin/templates/access/restrict_content.php rename {admin => includes/admin}/templates/dashboard/cache.php (100%) rename {admin => includes/admin}/templates/dashboard/feed.php (100%) rename {admin => includes/admin}/templates/dashboard/language-contrib.php (100%) rename {admin => includes/admin}/templates/dashboard/language-download.php (65%) rename {admin => includes/admin}/templates/dashboard/language-update.php (82%) rename {admin => includes/admin}/templates/dashboard/purge.php (100%) rename {admin => includes/admin}/templates/dashboard/users.php (70%) create mode 100644 includes/admin/templates/directory/appearance.php create mode 100644 includes/admin/templates/directory/general.php create mode 100644 includes/admin/templates/directory/pagination.php create mode 100644 includes/admin/templates/directory/profile.php create mode 100644 includes/admin/templates/directory/search.php create mode 100644 includes/admin/templates/directory/shortcode.php create mode 100644 includes/admin/templates/extensions.php rename {admin => includes/admin}/templates/form/builder.php (62%) create mode 100644 includes/admin/templates/form/login_customize.php create mode 100644 includes/admin/templates/form/login_settings.php rename {admin => includes/admin}/templates/form/mode.php (89%) create mode 100644 includes/admin/templates/form/profile_customize.php create mode 100644 includes/admin/templates/form/profile_settings.php create mode 100644 includes/admin/templates/form/register_customize.php create mode 100644 includes/admin/templates/form/shortcode.php rename {admin => includes/admin}/templates/modal/dynamic_edit_field.php (100%) rename {admin => includes/admin}/templates/modal/dynamic_edit_row.php (100%) rename {admin => includes/admin}/templates/modal/dynamic_form_preview.php (100%) rename {admin => includes/admin}/templates/modal/dynamic_new_divider.php (100%) rename {admin => includes/admin}/templates/modal/dynamic_new_field.php (100%) rename {admin => includes/admin}/templates/modal/dynamic_new_group.php (100%) rename {admin => includes/admin}/templates/modal/dynamic_registration_preview.php (100%) rename {admin => includes/admin}/templates/modal/fields.php (100%) rename {admin => includes/admin}/templates/modal/fonticons.php (87%) create mode 100644 includes/admin/templates/role/admin.php create mode 100644 includes/admin/templates/role/delete.php create mode 100644 includes/admin/templates/role/general.php create mode 100644 includes/admin/templates/role/home.php create mode 100644 includes/admin/templates/role/login.php create mode 100644 includes/admin/templates/role/logout.php create mode 100644 includes/admin/templates/role/profile.php create mode 100644 includes/admin/templates/role/publish.php create mode 100644 includes/admin/templates/role/register.php create mode 100644 includes/admin/templates/role/role-edit.php create mode 100644 includes/admin/templates/role/wp-capabilities.php rename {admin => includes/admin}/templates/welcome/about.php (94%) create mode 100644 includes/admin/templates/welcome/about_footer.php rename {admin => includes/admin}/templates/welcome/about_header.php (100%) rename {admin => includes/admin}/templates/welcome/start.php (89%) create mode 100644 includes/class-config.php create mode 100644 includes/class-dependencies.php create mode 100644 includes/class-functions.php create mode 100644 includes/class-init.php create mode 100644 includes/core/class-access.php create mode 100644 includes/core/class-account.php create mode 100644 includes/core/class-ajax-common.php create mode 100644 includes/core/class-builtin.php create mode 100644 includes/core/class-chart.php create mode 100644 includes/core/class-common.php create mode 100644 includes/core/class-cron.php create mode 100644 includes/core/class-date-time.php create mode 100644 includes/core/class-enqueue.php create mode 100644 includes/core/class-fields.php create mode 100644 includes/core/class-files.php create mode 100644 includes/core/class-fonticons.php create mode 100644 includes/core/class-form.php create mode 100644 includes/core/class-login.php create mode 100644 includes/core/class-logout.php create mode 100644 includes/core/class-mail.php create mode 100644 includes/core/class-members.php create mode 100644 includes/core/class-menu.php create mode 100644 includes/core/class-modal.php create mode 100644 includes/core/class-password.php create mode 100644 includes/core/class-permalinks.php create mode 100644 includes/core/class-profile.php create mode 100644 includes/core/class-query.php create mode 100644 includes/core/class-register.php create mode 100644 includes/core/class-rest-api.php create mode 100644 includes/core/class-rewrite.php create mode 100644 includes/core/class-roles-capabilities.php create mode 100644 includes/core/class-router.php create mode 100644 includes/core/class-setup.php create mode 100644 includes/core/class-shortcodes.php create mode 100644 includes/core/class-tracking.php create mode 100644 includes/core/class-user-posts.php create mode 100644 includes/core/class-user.php create mode 100644 includes/core/class-validation.php create mode 100644 includes/core/um-actions-access.php rename {core => includes/core}/um-actions-account.php (78%) create mode 100644 includes/core/um-actions-ajax.php rename {core => includes/core}/um-actions-core.php (57%) rename {core => includes/core}/um-actions-form.php (54%) rename {core => includes/core}/um-actions-global.php (55%) rename {core => includes/core}/um-actions-login.php (76%) rename {core => includes/core}/um-actions-members.php (73%) rename {core => includes/core}/um-actions-misc.php (88%) rename {core => includes/core}/um-actions-password.php (76%) rename {core => includes/core}/um-actions-profile.php (72%) create mode 100644 includes/core/um-actions-register.php rename {core => includes/core}/um-actions-save-profile.php (78%) rename {core => includes/core}/um-actions-user.php (66%) rename {core => includes/core}/um-actions-wpadmin.php (90%) rename {core => includes/core}/um-filters-account.php (82%) rename {core => includes/core}/um-filters-arguments.php (60%) rename {core => includes/core}/um-filters-avatars.php (100%) create mode 100644 includes/core/um-filters-commenting.php rename {core => includes/core}/um-filters-fields.php (87%) rename {core => includes/core}/um-filters-files.php (100%) rename {core => includes/core}/um-filters-language.php (58%) rename {core => includes/core}/um-filters-login.php (100%) rename {core => includes/core}/um-filters-members.php (63%) rename {core => includes/core}/um-filters-misc.php (100%) rename {core => includes/core}/um-filters-navmenu.php (95%) rename {core => includes/core}/um-filters-profile.php (77%) rename {core => includes/core}/um-filters-user.php (81%) rename {core => includes/core}/um-navmenu-walker-edit.php (97%) rename {core => includes/core}/um-navmenu-walker.php (100%) rename {core => includes/core}/um-navmenu.php (100%) rename {core => includes}/lib/array2xml.php (100%) rename {core => includes}/lib/browser.php (100%) create mode 100644 includes/lib/mobiledetect/class-mobile-detect.php rename {core => includes}/lib/upload/um-file-upload.php (52%) rename {core => includes}/lib/upload/um-image-upload.php (64%) rename {core => includes}/um-short-functions.php (73%) rename core/widgets/um-search-widget.php => includes/widgets/class-um-search-widget.php (88%) delete mode 100644 index.php create mode 100644 ultimate-member.php delete mode 100644 um-config.php delete mode 100644 um-init.php create mode 100644 uninstall.php diff --git a/addons/generate_random_users.php b/addons/generate_random_users.php index 69cd2135..c36ad627 100644 --- a/addons/generate_random_users.php +++ b/addons/generate_random_users.php @@ -71,7 +71,8 @@ class UM_ADDON_generate_random_users { remove_action('um_after_new_user_register', 'um_after_new_user_register', 10, 2); $failed_dummies = 0; - $default_role = um_get_option("default_role"); + //$default_role = um_get_option("default_role"); + $default_role = get_option( "default_role", true ); foreach( $json->results as $dummy ){ @@ -119,7 +120,7 @@ class UM_ADDON_generate_random_users { 'synced_gravatar_hashed_id' => md5( strtolower( trim( $dummy->email ) ) ), 'account_status' => 'approved', '_um_profile_dummy' => true, - 'role' => isset( $default_role ) ? $default_role: 'member' + 'role' => isset( $default_role ) ? $default_role: 'subscriber' ); if( isset( $_GET['add_cover_photo'] ) && $_GET['add_cover_photo'] == 1 ){ diff --git a/admin/assets/css/um-admin-global.css b/admin/assets/css/um-admin-global.css deleted file mode 100644 index f8d2ea64..00000000 --- a/admin/assets/css/um-admin-global.css +++ /dev/null @@ -1,90 +0,0 @@ -.um-admin-notice { - border-color: #3ba1da !important; - color: #555; -} - -.um-admin-notice a.button-primary { - background-color: #3ba1da !important; - border-color: #3ba1da !important; -} - -.um-admin-notice a.button-primary:hover { - background-color: #2295d8 !important; - border-color: #2295d8 !important; -} - -.um-admin-notice a.button-secondary {opacity: 0.7} -.um-admin-notice a.button-secondary:hover {opacity: 0.9} -.um-admin-notice a {text-decoration: none;color: #3ba1da} -.um-admin-notice a:hover {color: #44b0ec} - -.um-filter { - padding: 12px; - border-color: #ddd !important; - margin: 20px 0 0 0 !important; - font-size: 14px; - line-height: 24px; -} - -/* - - General metabox styling -*/ - -#um-admin-access-settings h3 { - padding: 10px 20px 10px 60px; - color: #fff; - background: #3ba1da url(../img/logo-small.png) no-repeat 12px center; - font-weight: bold; - font-size: 14px !important; - -webkit-font-smoothing: antialiased !important; - -moz-osx-font-smoothing: grayscale !important; -} - -#um-admin-access-settings h4 { margin: 10px 0 4px 0!important} - -#um-admin-access-settings div.handlediv { - color: #fff !important; - -webkit-font-smoothing: antialiased !important; - -moz-osx-font-smoothing: grayscale !important; -} - -#um-admin-access-settings p {font-size: 13px} - -#um-admin-access-settings input[type=text] {font-size: 13px} - -/* - - Nav Menu -*/ - -.um-nav-edit * { - -webkit-font-smoothing: antialiased !important; - -moz-osx-font-smoothing: grayscale !important; -} - -.um-nav-edit-h2 { - padding: 10px 20px 10px 60px; - margin: 14px 12px 0 0; - border-radius: 3px; - color: #fff; - background: #3ba1da url(../img/logo-small.png) no-repeat 12px center; - font-weight: bold; -} - -.um-nav-mode {margin-top:10px} -.um-nav-roles {display: none;margin-top:5px} - -/* - - jQuery Tooltips -*/ - -.um-admin-tip { - margin: 0 0 0 2px; - color: #3ba1da !important; - vertical-align: middle; - position: relative; - top: -3px; - opacity: 0.8; -} -.um-admin-tip.n {margin-left: 5px} -.um-admin-tip i {cursor: pointer; vertical-align: middle; font-size: 20px; line-height: 20px;color: #3ba1da !important;} -a.um-delete{ color: #a00; } \ No newline at end of file diff --git a/admin/assets/css/um-admin-redux.css b/admin/assets/css/um-admin-redux.css deleted file mode 100644 index 58f86293..00000000 --- a/admin/assets/css/um-admin-redux.css +++ /dev/null @@ -1,227 +0,0 @@ -/* - - ReduxPanel -*/ - -.redux-container { - border-radius: 0 !important; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - background: none !important; - box-shadow: none !important; - border: 0 !important; -} - -.redux-container #import_export_default_section_group h4 { - margin: 0 0 12px 0 !important; -} - -.redux-container #import_export_default_section_group .hr { - height: 4px !important; -} - -.redux-sidebar .redux-group-menu li.active a, .redux-sidebar .redux-group-menu li.active a:hover, .redux-sidebar .redux-group-menu li.activeChild a, .redux-sidebar .redux-group-menu li.activeChild a:hover { - background: transparent; -} - -.redux-container #info_bar { - display: none; -} - -.redux-sidebar .redux-group-menu { - font-size: 14px; -} - -.redux-sidebar .redux-group-menu li.active a, .admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild a { - color: #3ba1da !important; - background: #e5e5e5 !important; -} - -.redux-sidebar .redux-group-menu li.activeChild.hasSubSections a { - color: #fff !important; -} - -.redux-container .redux_field_th { - font-size: 14px; - font-weight: 600; - color: #222; -} - -.redux-main { - background: none !important; - box-shadow: none !important; - border-left: 0 !important; - padding: 0 25px; -} - -.redux-container-sortable .checkbox-container input { - display: none; -} - -#redux-header { - background: transparent !important; - border: none !important; - padding: 0 !important; -} - -.redux-container #redux-header .display_header { - margin: 0 0 10px 0 !important; -} - -#redux-header .display_header span { - font-size: 14px; - position: relative; - font-weight: 400; - background: #3ba1da; - color: #fff !important; - padding: 2px 4px !important; - border-radius: 3px; - position: relative; - top: -3px; - left: 0; -} - -#redux-header h2 { - color: #222; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - font-size: 23px; - font-weight: 400; - padding: 1px 15px 4px 0px; - line-height: 29px; - margin: 5px 0 0 0; -} - -#redux-share {margin-top: 11px !important} - -#redux-share a { - margin: 0 15px 0 0 !important; - text-decoration: none !important; - color: #777 !important; - font-size: 22px !important; -} -#redux-share a:hover {color: #3ba1da !important} - -.redux-main .form-table tr { - border-bottom: 0; -} - -.redux-main .redux-option-image { - max-width: 200px; - max-height: 200px; -} - -.redux-container #redux-footer { - border-radius: 0; - background: none !important; - padding: 10px 0; - border-top: 1px solid #D8D8D8; -} - -.redux-container #redux-footer .redux-action_bar { - padding-top: 9px !important; -} - -.redux-container textarea, .redux-container input[type=text], .redux-container ul.data-full li { - font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif; - font-size: 13px; - line-height: 19px; - color: #333; -} - -.redux-sidebar .redux-group-tab-link-a i { - vertical-align: middle; - font-size: 1.2em; - position: absolute; - width: 20px; - text-align: center; - top: 6px; - color: #888; -} - -@media screen and (max-width:1124px){ - .redux-sidebar .redux-group-tab-link-a i { - position: relative; - top: auto; - } - .redux-sidebar .redux-group-menu li a { - text-align: center; - padding: 6px !important; - } -} - -.redux-sidebar .redux-menu-warning i, .redux-sidebar .redux-menu-error i, .redux-sidebar .hasSubSections .extraIconSubsections i { - top: 11px; -} - -.redux-container ul.data-full{padding:0!important;margin:0!important} - -.redux-container .description { - color: #666 !important; - font-size: 14px !important; - font-style: italic !important; - margin-top: 10px !important; -} - -.redux-container-switch {font-size: 13px} - -.redux-sidebar .redux-group-menu li { - margin-top: 4px; -} - -.redux-sidebar .redux-group-menu li a { - color: #555; - opacity: 1 !important; - padding: 6px 4px 6px 14px; - border-radius: 3px; - border: none; - transition: all .2s linear !important; -} - -.redux-sidebar .redux-group-menu li a:hover { - background: #e5e5e5; - color: #333; -} - -.redux-main #redux-sticky { - margin: 0; - min-height: auto; -} - -.redux-sidebar .redux-group-menu li.activeChild.hasSubSections a { - background: #3ba1da !important; - color: #fff; -} - -.redux-sidebar .redux-group-menu li.activeChild.hasSubSections a i {color: #fff !important} - -.redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active { - border-right: 0; -} - -.redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li { - border-right: 0; - margin-top: 4px; - padding-left: 12px; -} - -.redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a { - background: transparent !important; - color: #555 !important; - border-bottom: 0; - padding: 6px 4px 6px 14px !important; -} - -.redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a:hover { - background: #e5e5e5 !important; - color: #333 !important; -} - -.redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a { - color: #3ba1da !important; - background: #e5e5e5 !important; - text-shadow: none !important; -} - -.redux-sidebar .redux-group-menu li.activeChild.hasSubSections .active a:after { - border: none !important; -} \ No newline at end of file diff --git a/admin/assets/js/um-admin-users.js b/admin/assets/js/um-admin-users.js deleted file mode 100644 index c9dcb5e6..00000000 --- a/admin/assets/js/um-admin-users.js +++ /dev/null @@ -1,30 +0,0 @@ -jQuery(document).ready(function() { - - function getParameterByName(name, url) { - if (!url) url = window.location.href; - name = name.replace(/[\[\]]/g, "\\$&"); - var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), - results = regex.exec(url); - if (!results) return null; - if (!results[2]) return ''; - return decodeURIComponent(results[2].replace(/\+/g, " ")); - } - - jQuery("#_um_synced_role").on("change",function(){ - $sync_button = jQuery("#_um_button_sync_update_button"); - var url = $sync_button.attr("href"); - - if ( ! getParameterByName('wp_role', url) ) { - console.log("wp_role is not set"); - } - - var um_role = getParameterByName('um_role', url); - var wp_role = jQuery(this).val(); - $sync_button.attr("href", window.location.href+'&um_adm_action=mass_role_sync&um_role='+um_role+'&wp_role='+wp_role ); - - }); - - - -}); - diff --git a/admin/core/lib/ReduxFramework/CHANGELOG.md b/admin/core/lib/ReduxFramework/CHANGELOG.md deleted file mode 100755 index 8e03d236..00000000 --- a/admin/core/lib/ReduxFramework/CHANGELOG.md +++ /dev/null @@ -1,2000 +0,0 @@ -# Redux Framework Changelog - -## 3.6.2 -* WP.org release and cleanup - -## 3.6.1.3 -* Fixed: #3105 - link_color output failing due to PHP error. - -## 3.6.1.2 -* Fixed: #3103 - WP 4.6 forces new default date format, breaking date validation. - -## 3.6.1.1 -* Fixed: Typography subsets error due to typo. - -## 3.6.1 - WP.org release - -## 3.6.0.11 -* Removed: Empty PHP file from editor field. -* Modified: Replaced class primary function name in browser.php to __construct for PHP7 compatibility. - -## 3.6.0.10 -* Fixed: #3051 - Color_RBGA field RGBA value outputting zeros when color is left blank. - -## 3.6.0.9 -* Fixed: #3048 - Subsection tabs not including specified section class name. - -## 3.6.0.8 -* Fixed: Incorrect string comparison result in admin link check. Thanks @ksere. -* Fixed: Check value exists before validating when used with Metabox extension. Thanks @Enchiridion - - -## 3.6.0.7 -* Fixed: Empty values not passing to validation_callback. - - -## 3.6.0.6 -* Fixed: Javascript error in customizer javascript, preventing save of changed options. -* Fixed: #3019 - Section descriptions incorrect when opt_name contains digits. - -## 3.6.0.5 -* Reverted: Changes to typography. The on input variable solution was not working. -* Fixed: Support URL has generator was failing with an error. - -## 3.6.0.4 -* Changed: Typography field is now only ONE input variable. Should reduce our - max_input_vars errors dramatically. - -## 3.6.0.3 -* Fixed: Some XSS vulnerabilities only available in the backend when authenticated as a user. - -## 3.6.0.2 -* Fixed: Customizer.min.js compression issue. Deploy. - -## 3.6.0.1 -* Fixed Outdated redux.min.js on wp.org causing option panel failure. -* Fixed: #2936 - Border field outputting px with blank value. -* Fixed: Resolved Theme-Check php shortcode false notice. -* Modified: No more major redirect for the Redux page, only on first install with the plugin. -* Fixed: IE11 bug in the customizer. Thanks @anikitas! - -## 3.6.0 -* Fixed: Fixed Customizer path issues -* Added: Added new default arguments filter by opt_name and type. :) -* Notice: WP.org release - -## 3.5.9.8 -* Fixed: #2903 - False positive flag in border field JS. Avast doesn't like empty document ready statements. - -## 3.5.9.7 -* Fixed: #2880 - More issues with the extensions_url routine. - -## 3.5.9.6 -* Fixed: #2876 - Fixing more unvetted user contributions. - -## 3.5.9.5 -* Modified: #2855 - Extensions now have a helper class to help composer-based installs. Thanks @2ndkauboy! - -## 3.5.9.4 -* Fixed: #2857 - Required 'contains' not properly evaluating with checkboxes. - -## 3.5.9.3 -* Fixed: #2831 - Localization was complete broken. -* Fixed: #2832 - CSS conflicts with Rev Slider (Hey, Rev Slider guys, you don't have to load your CSS on every admin page. Really?) - -## 3.5.9.2 -* Fixed: Leftover debug echo line in basic customizer extension. - -## 3.5.9.1 -* Added: EXPERIMENTAL: New parsing code in an effort to break the 1000 max_input_var issue that crops up from time to time. Thanks, @harunbasic -* Added: EXPERIMENTAL: "Bugfix" for extension_url in an effort to make it correct. Thanks, @ottok - -## 3.5.9 -* Notice: New wp.org release - -## 3.5.8.15 -* Fixed: Wordpress 4.4.1 related issues. - -## 3.5.8.14 -* Fixed: #2794 - User contributed code from #2716 did not contain isset and caused an index error. - -## 3.5.8.13 -* Modified: Added tons of wp_remote_get handlings to stop bringing down site if Redux is down. -* Modified: When some items appear or not. Making devs lives easier. ;) - -## 3.5.8.12 -* Updated: parsedown.php vendor code, to deal. with PHP 7.0 errors. - -## 3.5.8.11 -* Fixed: #2774 - border fields set to 0 would disappear after saving. -* Modified: Post/page settings on the media gallery window hidden for gallery field, since they are not applicable to Redux. -* Added: #2728 - Filter for hints HTML. 'redux/hints/html'. Thanks, @nyordanov. -* Fixed: #2716 - Enqueue jquery sortable when select field is set to sortable. Thanks, @josh-rathke. - -## 3.5.8.10 -* Fixed: #2726 - Redux fixes for WordPress 4.4. -* Fixed: #2713 - Alerts wouldn't disappear. - -## 3.5.8.9 -* Fixed: #2726 - WP 4.4 breaking template.php include, because the core WP guys thought it would be hilarious to break everyone else's stuff. - -## 3.5.8.8 -* Fixed: Specifying 'user' in a field's data argument would produce WordPress depreciation errors. - -## 3.5.8.7 -* Fixed: Reflective XSS security fix. Thanks to Kacper Szurek for the information. - -## 3.5.8.6 -* Modified: #2685 - Rejoined http strings to prevent errors in theme check. Trade off, INFO notices will appear. @Otto says this is ok. - -## 3.5.8.5 -* Fixed: #2684 - Sorter not displaying (or saving) WordPress data when using the data argument. - -## 3.5.8.4 -* Added: #2673 - WP_CLI check before welcome page redirect. -* Fixed: #2677 - tinymce javascript errors when wp editor is disabled. - -## 3.5.8.3 -* Modified: While in dev_mode, notices will appear if Redux sample data in share_icons and admin_bar_links arguments is not changed. - This became necessary because devs are not changing this data and theme ends users are coming to us for theme support. -* Modified: Redux links to be // instead of http:// or https:// to ensure portability for secure sites. - -## 3.5.8.2 -* Fixed: #2665 - For those who must have empty dirs in the extensions dir. No more errors. -* Added: #2660 - Added 'user'/'users' data type to wordpress data arg. Thanks @golchha21. - -## 3.5.8.1 -* Fixed: #2652 - load_plugin_textdomain using depreciated argument. - -## 3.5.8 -* Fixed: Customizer preview callback working again. - -## 3.5.7.12 -* Fixed: last_tab argument not working. - -## 3.5.7.11 -* Fixed: #2637 - color picker clear. -* Fixed: #2633. - -## 3.5.7.10 -* Fixed: #2624 - Border field saving/output 0px when no default set. Now accepts no default and outputs no CSS for blank values. -* Fixed: color_rgba no long outputs CSS with empty color values. - -## 3.5.7.9 -* Fixed: #2612 - pseudo classes not appending to multiple selectors in link_color output. - -## 3.5.7.8 -* Modified: The mass data escaping of Redux Core output. Part I. - -## 3.5.7.7 -* Fixed: #2609 - Section not folding correctly with class argument specified. - -## 3.5.7.6 -* Fixed: #2607 - button_set required scalar check for array returned by terms in the data arg. Thanks @Enchiridion. - -## 3.5.7.5 -* Fixed: Fixing more inconsistencies with wp_filesystem dirlist. How about some proper documentation, Otto? - -## 3.5.7.4 -* Fixed: #2582: Added extra check for get_terms to avoid error. - -## 3.5.7.3 -* Fixed Filesystem proxy dirlist triggering file permission errors on empty array. - -## 3.5.7.2 -* Fixed: #2571 - Sorter adding extra disable column on new entries if 'disabled' is lowercase. -* Updated Fields css for dev_mode off. - -## 3.5.7.1 -* Updated: Updated container.tpl version. -* Fixed: #2570 - multi-text field CSS bleeding over into WP. - -## 3.5.7 -* Fixed Customizer customizer_only and customizer section overrides. Also global customizer => false was not working. - -## 3.5.6.9 -* Added Security suggestions posed in #2543 by Julio Potier from SecuPress. - -## 3.5.6.8 -* Fixed: 'dirlist' in filesystem proxy returning permission error on empty dirs. - -## 3.5.6.7 -* Added setOption and getOption to Redux API. -* Added 'hide_save' argument. - -## 3.5.6.6 -* Added: 'readonly' argument for textarea. - -## 3.5.6.5 -* Fixed: #2545 - CSS validator error output misconfigured. -* Fixed: ACE adding escape slashes to quotes via CSS validation, causing improper error message. - -## 3.5.6.4 -* Added: `ajax_save` arg for fields. Setting to false will reload the options panel when the set option has changed. -* Fixed: #2532 - Spinner field arrow spacing off when dev_mode set to false due to missing `!important` CSS suffix. - -## 3.5.6.3 -* Added: `autocomplete` arg to text field. This is FALSE by default. - -## 3.5.6.2 -* Fixed: Color RGBA field missing name_suffix. Will now work in repeater extension. - -## 3.5.6.1 -* Fixed: Index error regarding icon argument. - -## 3.5.6 -* Fixed Customizer WP 4.3 final fixes. - -## 3.5.5.9 -* Fixed #2500 - Conflict with outdated select2 in JW Player plugin. - -## 3.5.5.8 -* Modified: icon_type no longer needed for section icons. Now detects if URLs are provided for images. -* Fixed: Various customizer fixes. HTML in the customizer title. -* Modified: Media URL now is 95% wide. -* Modified: Select2 now 100% width instead of just resolve (that doesn't always work). - -## 3.5.5.7 -* Modified: Field enqueue method to allow for more flexibility. -* Added: Support for Airplane Mode plugin (https://github.com/norcross/airplane-mode) by @norcross. Thanks @chriscct7 #2463 - -## 3.5.5.6 -* Fixed: Undefined index in theme-check enhancements. Thanks @winwinwebdesign! -* Removed: SASS compiler & code. Note needed. -* Fixed: Color transparency live-update for Customizer for color, background, - and color gradient fields. - -## 3.5.5.5 -* Fixed: Undefined index when removing a section. - -## 3.5.5.4 -* Fixed: Typography bug onload always saying settings have changed. -* Modified: Added minified customizer JS. - -## 3.5.5.3 -* Fixed: Redux CUSTOMIZER! YEA! - -## 3.5.5.2 -* Fixed: Small echo in Redux API - -## 3.5.5.1 -* Fixed: PHP 5.2 Theme-Check error. - -## 3.5.5 -* Fixed: Date-time fixes with CSS overloading and positioning. - -## 3.5.4.35 -* Added: Lite support for https://wordpress.org/plugins/plugin-dependencies/ -* Modified: CDN to be a more bulletproof solution (http://jsdelivr.net). -* Modified: CDN alerts to be more clear, and have proper links. - -## 3.5.4.34 -* Fixed: Bad code in raw field hosing up the entire panel. - -## 3.5.4.33 -* Modified: #2436 - Validation check for any validation type ending in 'not_empty' now recognized. - -## 3.5.4.32 -* Fixed: Undefined index for undeclared variable in Theme-Check checks. -* Fixed: Annoying Redux Theme-Check notices. -* Fixed: How some functions were called. - -## 3.5.4.31 -* Fixed: Theme-Check baby! Everything working as it should with extra theme-check hints to prepare - your theme for submission! -* Fixed: Better .org hinting for theme submission. -* Modified: `forced_dev_mode_off` argument that will ensure dev_mode is ALWAYS off. - PLEASE do not ship with this enabled. We will NOT provide any support for any instance that - has this argument enabled. Disable and test prior to posting on our issue tracker. -* Added: `customizer_only` as a global arg that disables all of Redux except for the customizer, in - preparation for our customizer integration. - -## 3.5.4.30 -* Modified: Dissmissable Redux Admin notices now use the WP 4.2 dismiss JS and Ajax. Pretty. -* Modified: Admin notice code is now it's own isolated class inside core. -* Modified: Use DB for admin notice, not flat-files. Boo. -* Modified: Sample configs not to cause errors if multiple users use the same function name. -* Fixed: CDN internationalization class. -* Modified: Parsedown so as not to throw a shortcode error that didn't actually exist. - -## 3.5.4.29 -* Fixed: #2446 - Non google font choice not saving in certain instances. - -## 3.5.4.28 -* Fixed: Added additional check in redux.js to stop errors with panels containing multiple raw fields. -* Fixed: Hopefully, the issue of settings not saving on first install when using the Redux API. - -## 3.5.4.27 -* Fixed: Set use_cdn argument to true, by default. - -## 3.5.4.26 -* Fixed #2437 - undefined value set to blank line height. - -## 3.5.4.25 -* Fixed: #2429 - Required evaluator 'contains' not working properly with multi_check - -## 3.5.4.24 -* Fixed: #2426 - Section field not indenting. - -## 3.5.4.23 -* Fixed: Divider field not rendering properly. -* Added: `fieldset_class` argument for fields. Thanks @Enchiridion. -* Added: Option to set checkbox label. Thanks @Enchiridion. -* Added: javascript .trigger('change') to switch, spinner, and image_select. Thanks @Enchiridion. - -## 3.5.4.22 -* Modified: Ajax change output of error and notice via hooks. - -## 3.5.4.21 -* Fixed: #2414 - Bad ajax save due to mis-initialized variable. - -## 3.5.4.20 -* Fixed: CSS in metabox fields all wanky. -* Added: 'reload_on_change' arg for fields, to force page reload after setting change. - -## 3.5.4.19 -* Fixed: #2377 - Replaced mysql_gets_server_info with $wpdb. - -## 3.5.4.18 -* Modified: Templates to properly excape values. -* Fixed: Import/Export to properly be full-width and use lazy-load JS. -* Modified: CSS for sections to bound to the section, not all of Redux. - -## 3.5.4.17 -* Fixed: #2368 - Options panel layout offset. -* Fixed: #2369 - validate_callback not working for color, color_gradient, and date. - -## 3.5.4.16 -* Fixed: #2355 - Space missing in switch class arg. -* Fixed: Fixed all fields without leading space in class arg. - -## 3.5.4.15 -* Modified: Restrict table modification to redux-container. -* Fixed: Container overflow for pre's. -* Modified: Redux API to include removeSection and removeField. -* Added: Added before and after hooks to any panel template file. - -## 3.5.4.14 -* Fixed: #2351 - WP_Error check added to admin blast remote get. - -## 3.5.4.13 -* Modified: Moved styling for the divide field into it's own CSS file. -* Modified: All WP Color Pickers to properly save the value before save. -* Added: CSS Styles for the customizer. ;) - -## 3.5.4.12 -* Modified: Panel is MUCH more responsive now. -* Fixed: Small stylings for a few fields. -* Fixed: Added extra qTip class. - -## 3.5.4.11 -* Modified: Ajax save animation. Added fallback for pre 4.2 CSS. -* Fixed: Small issue with Redux info boxes and spacing. -* Fixed: Small bug with the Redux API where divide sections were causing errors. -* Fixed: Small admin blast fix. - -## 3.5.4.10 -* Modified: Qtip and Spectrum vendor libraries restored to local. -* Fixed: Admin notice loading on front end. -* Modified: Callback actions run with do_action_ref_array now. -* Added: show_options_object argument to enable or disable option object. - -## 3.5.4.9 -* Added: Error suppressing to filesystem class to avoid notice errors when site goes down. - -## 3.5.4.8 -* Fixed: Panels not rendering, again -* Added: Vendor support plugin link to CDN fallback message. - -## 3.5.4.7 -* Modified: Moved vendor libraries ACE, select2, qtip, and spectrum to CDN. -* Removed: Local installs of above libraries. - -## 3.5.4.6 -* Fixed: Option panel not rendering due to experimental code. - -## 3.5.4.5 -* Fixed: How sorter works with data -* Modified: How the data arg is stored in Redux. - -## 3.5.4.4 -* Removed: sysinfo.php. No longer needed in lieu of our support URL feature. -* Removed: debug.php. Moved to options_object extension. -* Modified: #2274 - PHP Unit test compatibility. Thanks @daithi-coombes. -* Modified: #2144 - Optional class argument per image. Thanks @paulthecoder. -* Fixed: #2278 - More W3 Total Cache hacks. - -## 3.5.4.3 -* Fixed: #2258 - welcome redirect error with embedding plugin scenarios. -* Fixed: Redux plugin load order when activating plugins. - -## 3.5.4.2 -* Fixed: #2271 - stuck redirect on godaddy (seriously, get a real host, people) servers. - -## 3.5.4.1 -* Fixed: #2216 - Reset section not always working within FF. - -## 3.5.4 -* Modified: update_notice arg only truly shows up if dev_mode is on. - -## 3.5.3.3 -* Added: Tooltip to developer mode badge, for informational purposes. -* Modified: Added css_layout ext to default value filter, to avoid errors. - -## 3.5.3.2 -* Fixed: #2239 - Various extensions didn't support default values for default arg. Filtered out offending extensions. - -## 3.5.3.1 -* Fixed: WP.org ONLY SVN mixup. - -## 3.5.3 -* Fixed: #2228 - Submenu items still visible if permissions not allowed. -* Fixed: Import/Export showing up in customizer. -* Modified: Admin-fresh theme to match new WordPress 4.2 -* Modified: Redux widget now has a proper ID. Thanks @corradomatt! -* Modified: Added text-shadow to submenu items to give a stronger "pop" -* Modified: Page_slug now dynamically generated if not specified. - -## 3.5.2.2 -* Modified: Admin blast message pinging server on each load after three day expiration. Possible slow down of the overall panel loading time. - -## 3.5.2.1 -* Fixed: #2221 - Background field media not enqueueing when used with no other media based fields. - -## 3.5.2 -* Fixed: #2214: Bad path for import/export enqueue. -* Release: Wp.org release. - -## 3.5.1 -* Release: Wp.org release. - -## 3.5.0.7 -* Modified: Redux News dashboard widget appears only when dev_mode is true or in a local host environment. - -## 3.5.0.6 -* Fixed #2127 - Elusive icons not working in footer as before. -* Fixed Issue where Status tab not showing extension versions properly. -* Fixed Issue in support URL not passing data correctly. - -## 3.5.0.5 -* Fixed Support URLs now work even if max_input_vars is way low in PHP 5.3+ - -## 3.5.0.4 -* Fixed #2197 - Import/export not loading proper for those who have opted to install Wordpress in ways it was never intended. - -## 3.5.0.3 -* Fixed: 'Generate Support URL' feature kicking back error. - -## 3.5.0.2 -* Fixed Sortable checkbox labels not displaying properly. -* Fixed Sortable textbox not displaying default value as placeholder. -* Updated: sample-config with accurate example for both sortable modes. - -## 3.5.0.1 -* Fixed #2181 - Fixed issue with Ajax Save when PHP 5.3 Magic Quotes were disabled. - -## 3.5.0 OFFICIAL RELEASE - Various fixes and improvements for release. - -## 3.4.4.9.4 -* Fixed: #2181 - Issue with PHP < 5.4 and the Ace Editor field. Oy. - -## 3.4.4.9.3 -* Fixed: #2163 - Undefined error in JS. - -## 3.4.4.9.2 -* Fixed: #2176 - Infinite loop in the customizer for live preview of themes. - -## 3.4.4.9.1 -* Fixed: Support page now works. -* Fixed: Fix for MySQL deprecated functions in php 5.5+. - -## 3.4.4.9 -* Added: Dynamic admin messages (aka Newsflash). Dismissable admin messages announcing breaking Redux news. - Messages will not appear for users when dev_mode is set to `false`. However, messages remain active - on localhosts, so devs may benefit. - -## 3.4.4.8 -* Fixed: #2155 - Fixed import with ajax_save. -* Fixed: Changelog now uses raw field parsedown if present. - -## 3.4.4.7 -* Added: Redux Framework News Widget on the WP Dashboard. - -## 3.4.4.6 -* Fixed: #2156: `label` argument not recognized when using sortable as textbox. - -## 3.4.4.5 -* Fixed: #2140 Another PHP 5.2 issue with ajax_save. -* Modified: Opt groups for select field now working in customizer even if not supported. - -## 3.4.4.4 -* Added: `full_width` arg now makes ANY field full-width. :) - -## 3.4.4.3 -* Fixed: #2133 - Ajax save adding extra backspashes in PHP 5.2 only (They didn't use array map properly). -* Fixed: Customizer wasn't working. Thanks @sgssandhu! - -## 3.4.4.2 -* Fixed: #2125 - Compiler not firing on first save, when using ajax_save. - -## 3.4.4.1 -* Fixed: #2118 - Typography JS error. - -## 3.4.4 -* Fixed: Odd typography bug no one has reported. -* Modified: Sticky header and footer to remain within the redux-main container. - -## 3.4.3.9 -* Fixed #2097 - Slash fix for ajax_save that was previously believed to be an isolated issue. Now applied on all ajax saves. - -## 3.4.3.8 -* Fixed: #2086 - color_rgba improperly functioning when transparent mode set to false. - -## 3.4.3.7 -* Fixed Import/Export bug where it wasn't running. -* Modified Locations of the core extensions directory as well as grunt configuration. - -## 3.4.3.6 -* Fixed #2047 - Validation will now accept 0 as a value to be tested. Thanks @Ninos! -* Added url_slug validation with option flush_permalinks! -* Fixed Issue where the remove of background field was always showing an empty preview box. -* Modified Turned ajax_save on by default for additional bug reports. ;) -* Modified Added some margin above validation errors/warnings so they look better. -* Modified Removed previous element border for any section so it looks better. - -## 3.4.3.5 -* Fixed #2081 - Section field hiding any field after. Weird. - -## 3.4.3.4 -* Added #2047 - `output_transparent` argument to output the blank color feature as 'transparent'. -* Fixed #2080 - missing 'rem' unit and inability to process float values. Thanks to @HELWATANY for the fixes! -* Fixed #2043 - misaligned images in image_select field. - -## 3.4.3.3 -* Added: #2064 - Merge argument for image_select. Thanks @Ninos -* Modified: Import/Export is now an extensiona and decoupled from the core. -* Fixed: Spinner had a nasty number bug, now resolved. -* Fixed: #2076 - RTL bug with old ID's. Thanks @mahfoozroy. -* Fixed: #2072 - Ajax_save editor type bug fix. - -## 3.4.3.2 -* Fixed: #2058 - Incorrect path in include statement for sysinfo.php - -## 3.4.3.1 -* Modified: Templates now have versioning with a warning (dev_mode only) if they are outdated from the core templates. - -## 3.4.3 -* Modified: Ajax saving now has overlay during save to avoid confusion for users. - -## 3.4.2.9 -* Modified: Template files even more for simplicity and ease. -* Modified: Saving. Redux now has the ajax_save argument if you want it! -* Modified: Validation warnings now work. - -## 3.4.2.8 -* Fixed: Changed set_transient function to public to avoid errors in new templating code. - -## 3.4.2.7 -* Modified: Entire panel template is now decoupled from the theme and implemented with many filters for easy customization. - -## 3.4.2.6 -* Fixed: #1478 - Import/export failing when two instances if Redux in use. Thanks, @desaiuditd! -* Fixed: Section field not indenting properly, if at all. - -## 3.4.2.5 -* Added: #2031 - Proper CSS sanitization for compliancy with WP.org. - -## 3.4.2.4 -* Fixed: #2027 - added isset() - -## 3.4.2.3 -* Fixed: #2019 - Reset issues with PHP 5.2. Thanks a bunch, @Webcreations907! - -## 3.4.2.2 -* Fixed: #2023: Issue with custom submenus in menu. - -## 3.4.2.1 -* Fixed: #2025: Issue with select sorting. - -## 3.4.2 -* Update: ACE Editor. Thanks @corradomatt. - -## 3.4.1 -* Fixed: Small filesystem option with bad filter key reference. -* Added: Small return if $section filter returned the section empty. - -## 3.4.0 -* WP.org Release - -## 3.3.10.7 -* Fixed: Reset section hook firing too early. - -## 3.3.10.6 -* Modified: The Redux Repeater field has landed! - -## 3.3.10.5 -* Fixed: #1983 - color_rgba not outputting default values on first load (before save). - -## 3.3.10.4 -* Fixed: Google font enqueues with opt_name to avoid collision with multiple Redux instances. - -## 3.3.10.3 -* Fixed: #1980 - JS errors with sorter & sortable. -* Fixed: color_rgba field outputting incorrect information via output/compiler. - -## 3.3.10.2 -* Fixed: #1979 - Goole fonts not properly loading in typography dropdown. - -## 3.3.10.1 -* Fixed: Undefined index error on MU installs. - -## 3.3.10 -* Removed: SASS compile of field CSS, for the time being. Compiler remains in core. -* Improved: Panel load time, most notable when not in dev_mode. Better for your clients. :) -* Updated: Elusive Font library. -* Fixed: #1961 - color_rgba field defaulting to black on reset. - -## 3.3.9.35 -* Fixed: #1941 - Datepicker opened off screen. -* Fixed: #1756, #1957 - Slider issues. Thanks @FFIN! -* Fixed: #1960 - Duplicate slide when clicking Add. Again, thanks to @FFIN for the fix. -* Added: New filter: apply_filters 'redux/validate/{opt_name}/before_validation' -* Fixed: #1745 - Adding settings submenu to empty submenu now works. Many, many thanks to @No3x for cracking this one! - -## 3.3.9.34 -* Fixed: #1955 - Undefined index rgba in output routine. - -## 3.3.9.33 -* Modified: #1947 - Added display:none to TR tag under info field. - -## 3.3.9.32 -* Replaced: #1951 - Replaced develop branch of scssphp to master branch due to PHP 5.2 incompatibililty. - -## 3.3.9.31 -* Fixed: #1943 - Removed premature DIV close. -* Fixed: #1945 - Media preview not rendering when default ID specified. - -## 3.3.9.30 -* Modified: #1930 - reorder 'psedo-class of link_color field. Thanks @freddessaint -* Modified: SASS compiler outputs to page by default. Faster. -* Fixed: #1927 - Incorrect dir path to spectrum library in color_rgba field corrected. - -## 3.3.9.29 -* Modified: color_rgba field now usees spectrum color picker. minicolors removed. Just...too buggy. - -## 3.3.9.28 -* Modified: #1922 - Filesystem output function. - -## 3.3.9.27 -* Fixed: Added PHP 5.2 support (ugh!) for SASS compiler. - -## 3.3.9.26 -* Fixed: More SASS compiler tweaking. - -## 3.3.9.25 -* Fixed: PHP errors when disabling SASS. - -## 3.3.9.24 -* Fixed #1909 - malformed DIV class HTML in slider field. - -## 3.3.9.23 -* Removed Argument for SASS compile file output location removed. Didn't work, too much trouble. - -## 3.3.9.22 -* Fixed: #1904 - select_image field not displaying saved value on page reload. - -## 3.3.9.21 -* Fixed: SASS compile under multi-instance outputting incorrect CSS file - -## 3.3.9.20 -* Fixed: redux-admin scss images converted to base64 - -## 3.3.9.17 -* Added SASS compiler for admin CSS. -* Added SASS to CSS for grunt compiler. - -## 3.3.9.16 -* Added SASS compiler for fields. - -## 3.3.9.16 -* Updated: select2 3.5.2 - -## 3.3.9.15 -* Fixed: #1856 - Illegal offset string warnings in framework.php. Thanks @CGlingener. -* Fixed: #1874 - Required operator 'contains' and 'not_contains' not working with select set to multi. -* Fixed: #1829 - Required operator '=' and '!=' not working with select set to multi. - -## 3.3.9.14 -* Fixed: #1870 - Border field doubling up on px in output/compiler. -* Added: `hidden` argument for fields. -* Added: `hidden` argument for sections. - -## 3.3.9.12 -* Fixed: #1868 - Improper panel render when opening expanded, when `open_expanded` set to true. -* Added: `hide_expand` argument, to hide the expand options button. - -## 3.3.9.11 -* Fixed: #1865 - Sortable select not saving proper order. -* Fixed: #1864 - Footer z-index CSS adjusted. - -## 3.3.9.10 -* Fixed: #1848 - Import-export filed buttons not functioning properly. - -## 3.3.9.9 -* Fixed: #1834 - Wordpress data dealing with IDs as array keys not rendering properly. -* Fixed: #1830 - Font lists were added in quotes. Thanks @karimhossenbux. - -## 3.3.9.8 -* Fixed: #1798 - Fixed lazy load JS to only load visible sections. Much more optimized. - -## 3.3.9.7 -* Fixed: #1821 - Exo 2 font not working, issue with typography and escaping. - -## 3.3.9.6 -* Added: #1803 - Optgroup support for select field. - -## 3.3.9.5 -* Added: Decimal increments to spinner. - -## 3.3.9.4 -* Added: Customizer now supports PANEL! Yay 4.0. - -## 3.3.9.3 -* Fixed: #1789 - Customizer now properly working again with WP 4.0. Odd bug. -* Modified: README.md updates as per @cmwwebfx suggestions. - -## 3.3.9.2 -* Fixed: #1782 - Fixed some extra themecheck and customizer issues. - -## 3.3.9.1 -* Fixed: #1782 - Media field not showing files after upload? Hopefully this fixes it. - -## 3.3.9 -* Fixed: #1775 - Call to undefined function is_customize_preview() in pre WP 4.0. -* Fixed: Issue where in some cases tracking still occuring after opt-out. -* Modified: Documentation URL. - -## 3.3.8.8 -* Fixed: #1742 - Sidebar subsections don't always expand. - -## 3.3.8.7 -* Fixed: #1758 - Thanks @echo1consulting! -* Added: 'hidden' to menu_type argument to allow for hidden menus until available. - -## 3.3.8.6 -* Fixed: #1749 - Remove font-wight and font-style from css output when not in use. - -## 3.3.8.5 -* Modified: Added the "redux/options/{$this->args['opt_name']}/compiler/advanced" hook for more advanced compiling. -* Added: Suggestions as per #1709. Thanks @echo1consulting. - -## 3.3.8.4 -* Modified: Removed a cURL instance from the core and fixed the developer ad resizing. -* Fixed: PHP 5.2 issues. *sigh* - -## 3.3.8.3 -* Added: #1593 - Great pull request by @JonasDoebertin. Now you can enqueue dynamic output to the login screen or admin backend. - -## 3.3.8.2 -* Fixed: Customizer wasn't saving at all! That's been like 4 months. No one's reported it. Hmm. -* Fixed: #1702 - Customizer only fields were being erased on panel save. - -## 3.3.8.1 -* Fixed: Various Theme-Check errors with languages. -* Added: Theme-Check class to help devs know what is what. -* Fixed: The way we include files from include_once to require_once everywhere. -* Modified: Language files to reflect new strings. -* Modified: Formatted a bunch of old class files. -* Added: Notice on the updates for non-devs to use the new dev_mode disabler plugin and notify their developer. ;) - -## 3.3.8 -* Modified: Updated potomo, thanks @shivapoudel. -* Added: Grunt checktextdomain and made improvements. Thanks @shivapoudel. - -## 3.3.7.11 -* Modified: #1685 - Specifying no default argument for image_select caused errors on reset. - -## 3.3.7.10 -* Fixed: #1667 - Slides Upload button causing JS error. - -## 3.3.7.9 -* Fixed: #1670 - Fix for Theme Check -> `add_setting() method needs to have a sanitization callback function passed.` - -## 3.3.7.8 -* Fixed: #1661 - Fix for undefined index in some versions of PHP. Thanks @gianbalex! -* Modified: #1658 - Improvements from @shivapoudel, including: - * Removed makepot and used grunt-wp-i18n instead. - * Added a jshintrc file - * Added a `grunt addtextdomain` to correct any bad textdomains in the core. - * Updated .gitignore for better readability - * Updates to a few other files including package.json. - * Updated language files. - * Update codestyles/.editorconfig to reflect the project's standards. - -## 3.3.7.7 -* Modified: #1653 - Better admin bar with external links: Admin bar menu priority, icon, and external links. Thanks @shivapoudel! - -## 3.3.7.6 -* Added: #1651 - `library_filter` argument. Allows specification of what files to display in the media library. -* Modified: #1651 - `mode` argument accepts either file type or mime type (but not both). - -## 3.3.7.5 -* Fixed: #1650 - Toogle error with responsive CSS. - -## 3.3.7.4 -* Fixed: #1643 - Slight border issue (2px) on sticky footer. - -## 3.3.7.3 -* Fixed: #1642 - Added `font_family_clear` arg, enabling the clear option for font-family. -* Fixed: #1638 - Spacing field not outputting when units values attached to default values. -* Modified #1644 - `import_icon` argument now accepts wordpress dashicons - -## 3.3.7.2 -* Fixed: #1634 - Double border for sections field. Thanks @AlexandruDoda -* Modified: Changelog location to now Changelog.md. - -## 3.3.7.1 -* Fixed: #1632 - Sortable with no defaults set revert to false (instead of options values). -* Fixed: Labels for sortable in text mode updated to match framework. - -## 3.3.7 -* Added: #1586 - Class-level declaration for callbacks and validation. Thanks @echo1consulting. -* Modified: Typography field now fully dynamic. -* Modified: No longer require a google_api_key for the typography module. :) -* Fixed: FTP credentials screen giving a "undefined submit_button function". Resolved. -* Modified: #1628 - Spacing and dimensions now only output 0 if the entry is a 0, not empty. - Thanks @Webcreations907 -* Modified: CSS for menu items when active (no hover). -* Added: Visual feedback to left menu if active. - -## 3.3.6.9 -* Fixed: #1623 - Registered older noUISlider JS under a new name to avoid conflicts. -* Modified: #1622 - Removed googlefonts.js dependency. - -## 3.3.6.8 -* Fixed: #1600 - ACE Editor bombing in PHP 5.2 environments. - -## 3.3.6.7 -* Fixed: #1591 - Erroneous outputting of font-weight and font-style when no font-family selected. -* Updated: #1569 - Improved submenu highlighting. -* Added: #1487 - Added `get_default_value` function into the framework.php - -## 3.3.6.6 -* Fixed: Framework URI errors when using child themes. Some restructuring. - -## 3.3.6.5 -* Fixed: Framework URI errors when embedded in theme with Windows. - -## 3.3.6.4 -* Added: image_size as an option for the data argument. Thanks @Gyroscopic! - -## 3.3.6.3 -* Modified: How Redux paths are run. Should cover all use cases now. Child themes can also embed - Redux properly now. Thanks @cfoellmann for the suggestions. Fix for issue #1566. - -## 3.3.6.2 -* Modified: How we declare the uploads directory and URL. Using core WP functions now. - -## 3.3.6.1 -* Modified: Now if a section is empty, but has subsections, that section will be "skipped" when - clicked and the first subsection will then be shown. - -## 3.3.6 -* Modified: Language files. -* Fixed: #1560 - IE8 RGBA fallack - -## 3.3.5.12 -* Fixed: #1543 - Hint icon not changing when set in args. - -## 3.3.5.11 -* Fixed: #1537 - Media field not accepting images with mode set to false. - -## 3.3.5.10 -* Fixed: #1529 - ACE Editor conflict with Visual Composer. -* Added: #1530 - Added argument to specify admin bar icon, `admin_bar_icon`. Thanks Ninos! -* Fixed: #1532 - Media field not accepting any mime type when `'mode' => false`. - -## 3.3.5.9 -* Fixed: #1520 - Checkbox field not displaying Wordpress data when using data argument. - -## 3.3.5.8 -* Fixed: #1516 - Invalid index and foreach when using compiler and async_typography. - -## 3.3.5.7 -* Fixed: #1509 - Sorter adding unnecessary bits on some items. -* Fixed: #1514 - Customizer and multisite not getting on properly. -* Fixed: #1512 - Slides 'Upload' button not showing or saving selected image. - -## 3.3.5.6 -* Fixed: Checkboxes with required were working in reverse. - -## 3.3.5.5 -* Fixed: ASync Typography now works! No more flashing fonts. - -## 3.3.5.4 -* Fixed: #1489 - Color picker UI lining up improperly. -* Fixed: #1497 - dev_mode spinner issue. - -## 3.3.5.3 -* Fixed: Spelling error in tracking dialog. -* Modified: Updated ace_editor. -* Modified: Many MANY fields for the group field. -* Fixed: Some CSS bugs. - -## 3.3.5.2 -* Fixed: #1481 - Custom fonts loading in google font CSS. -* Fixed: #1485 - Customizer 'invalid argument' error. Thanks @rnlmedia. - -## 3.3.5.1 -* Fixed: #1472 - font style not displaying saved valie with no font-family argument set. -* Fixed: #1471 - raw field and required not playing nice together. - -## 3.3.5 -* Added: An annoying notice at the top so our devs don't ship with dev_mode on. ;) - -## 3.3.4.9 -* Fixed: #1462 - Google fonts not loading in font drop down. - -## 3.3.4.8 -* Fixed: More WP FileSystem tanking. Did PHP fallback before FTP. Works 99.9% of the time without credentials. - -## 3.3.4.7 -* Fixed: Incorrect folder CHMOD in filesystem class. - -## 3.3.4.6 -* Fixed: #1454 - Chmod permissions for redux folder. - -## 3.3.4.5 -* Fixed: #1451 - Googlefonts not loading due to failing copy function. - -## 3.3.4.4 -* Fixed: #1450 - Saves witch values with no `on` or `off` args make the core unhappy. - -## 3.3.4.3 -* Fixed: #1444, again, due to filesystem growing pains. -* Fixed: #1449 - Restoring `options` argument over a lousy attempt to fix placeholder. - -## 3.3.4.2 -* Fixed: More file permission issues. - -## 3.3.4.1 -* Fixed: Font debug was left from last commit. Sorry all. - -## 3.3.3.8 -* Fixed: Issues with file writing. Basically many users don't install WordPress with all the permissions correct. - So... Had to move it back to /uploads/. Sorry Otto, that's just how it is. -* Fixed: #1444 - output of typography all_styles when font_style UI was hidden. - -## 3.3.3.7 -* Fixed: #1440 - flaw in new cleanFilePath logic. - -## 3.3.3.6 -* Fixed: #1432 - Theme check failing when double-slashes existed in get_template_directory() return. -* Removed: curlRead from helper class. - -## 3.3.3.5 -* Fixed: #1426 - menu_name not appearing on front end admin bar. -* Added: #1427 - button_set added to customizer UI. Thanks @wpexplorer. - -## 3.3.3.4 -* Fixed: #1429 - ACE Editor erroring with no default value set. -* Fixed: wp_filesystem now initialized with credentials in an effort to combat the tmp file issue. - -## 3.3.3.3 -* Modified: Code purification. - -## 3.3.3.2 -* Modified: How section tabs work. Isolated within the redux-container class. - -## 3.3.3 -* Modified: #1412 - Redesigned text label, placeholder fix. - -## 3.3.2.10 -* Fixed: #1408 & #1357 - Typography subsets losing value after multiple saves - on other panels. - -## 3.3.2.9 -* Fixed: #1403 - unit value no longer prints after empty typography values -* Modified: Typography: Backup font no longer appends to `font-family` variable. - Please use the `backup-font` variable to specify backup fonts. This - does not apply to output/compiler strings. - -## 3.3.2.8 -* Fixed: #1403 - Backup font not appearing in font-family variable. - -## 3.3.2.7 -* Modified: Customizer now supports section and field `permissions` argument. -* Fixed: #1399 - Customizer respects `page_permissions` argument. - -## 3.3.2.6 -* Fixed: #1400 - output/compiler string incomplete using multiple selectors. - -## 3.3.2.5 -* Fixed: #1396 - Custom fonts cutting off multiple families in selector, after save. -* Fixed: Typography attempting to queue up non google fonts on backend. -* Added: #1395 - Display of child theme status in sysinfo, thanks @SiR-DanieL. - -## 3.3.2.4 -* Fixed: #1387 - Page jump when clicking "Options Object". Thanks @rrikesh. -* Added: #1392 - Filters to change the following localized strings: - redux/{opt_name}/localize/reset - redux/{opt_name}/localize/reset_all - redux/{opt_name}/localize/save_pending - redux/{opt_name}/localize/preset - -## 3.3.2.3 -* Fixed: #1376 - checkbox.min.js missing. - -## 3.3.2.2 -* Fixed: Static variable changes for instances and basic comment cleanup - -## 3.3.2.1 -* Fixed: #1361 - Raw field not hiding with required. -* Fixed: Datepicker not formatting properly. Still needs some work. - -## 3.3.1.9 -* Fixed: #1357 - Preview not rendering font on page load. - -## 3.3.1.8 -* Fixed: #1356 - Color fields and transparency not syncing due to new JS. - -## 3.3.1.7 -* Fixed: #1354 - Add class check for W3_ObjectCache. - -## 3.3.1.6 -* Fixed: #1341 - JS not initializing properly in import_export. - -## 3.3.1.5 -* Fixed: #1339 - Typography would lose Font Weight and Style. value was - named val in the HTML, so it would be destroyed on the next save - if not initialized. - -## 3.3.1.4 -* Fixed: #1226 - W3 Total Cache was affecting validation and compiler hooks. -* Fixed: Menu errors weren't showing properly for non-subsectioned items. - -## 3.3.1.3 -* Fixed: #1341 - Import/Export buttons not functioning. Also fixed sortable somehow. - -## 3.3.1.2 -* Fixed: Slides not initializing with the last fix. - -## 3.3.1.1 -* Fixed: Slides field was not properly initialized for the media elements. Fixed. - -## 3.3.0.6 -* Fixed: #1337 - `redux` JS dependency loading issue. Many thanks @tpaksu - -## 3.3.0.5 -* Modified: Drastically changed the way JavaScript is used in the panel. Forced as-needed - initialization of fields. Thus reducing dramatically the overall load time of - the panel. The effects have been seen up to 300% speed improvement. The only - time a field will be initialized is if it's visible, thus reducing the processing - needed in DOM overall. - -## 3.3.0.4 -* Fixed: #1336 - fixed default font in preview. - -## 3.3.0.3 -* Fixed: #1334 - Typography not un-saving italics. - -## 3.3.0.2 -* Added: #1332 - New validation: numeric_not_empty. - -## 3.3.0.1 -* Fixed: #1330 - Required not working on all fields. - -## 3.3.0 -* Added: #1329 - `'preview' = array('always_display' => true)` argument to typography, to determine if preview field show always be shown. - -## 3.2.9.38 -* Fixed: #1322 - Sections not folding with required argument. -* Modified: Portions of core javascript rewritten into object code. - -## 3.2.9.37 -* Fixed: #1270 - Editor field compiler hook not firing in visual mode. - -## 3.2.9.36 -* Added: `hide_reset` argument, to hide the Reset All and Reset Section buttons. - -## 3.2.9.35 -* Fixed: select2 dependency in select_image, and other fields. - -## 3.2.9.34 -* Fixed: Filter out `@eaDir` directories in extensions folder. -* Added: `content_title` argument to slides field. Thanks @psaikali! - -## 3.2.9.33 -* Fixed: Fixed the image_select presets to work again. Also now will function even if import/export is disabled. - -## 3.2.9.32 -* Fixed: Minor tweaks for metabox update. - -## 3.2.9.31 -* Fixed: #1297 - Missing space in image_select class. -* Fixed: Slider field tweaked for metaboxes. - -## 3.2.9.30 -* Fixed: #1291 - Change of font-family would not trigger preview, or show in open preview. - -## 3.2.9.29 -* Fixed: #1289 - Typography not retaining size/height/spacing/word/letter spacing settings. - -## 3.2.9.28 -* Fixed: #1288 - Background color-picker dependency missing. Thanks @farhanwazir. - -## 3.2.9.27 -* Fixed: Search extension failed do to dependency issue from the core. - -## 3.2.9.26 -* Fixed: #1281 - color field output/compiler outputting incorrect selector when only one array present. - -## 3.2.9.25 -* Fixed: Update check only appears once if multiple instances of Redux are loaded in the same wordpress instance. - -## 3.2.9.24 -* Fixed: Changing font-family in typography didn't trigger 'save changes' notification. -* Fixed: More typography: Back up font appearing in font-family when opening selector. -* Fixed: Typography: undefined message when NOT using google fonts. Thanks @farhanwazir - -## 3.2.9.23 -* Added: `customizer_only` argument for fields & sections, contributed by @andreilupu. - -## 3.2.9.22 -* Fixed: Typography font backup not in sync with font-family. -* Fixed: Typography not saving font-family after switching back and forth between standard - and google fonts. -* Fixed: Background field selects not properly aligned. - -## 3.2.9.21 -* Added: select2 args for spacing field. -* Modified: All field javascript rewritten using jQuery objects (versus standard function). - Prepping for another crack at group field. - -## 3.2.9.20 -* Added: select2 args for the following fields: typography, background, border, dimensions and slider. -* Fixed: Removed select field dependency from background field. - -## 3.2.9.19 -* Fixed: #1264 - Color-picker/transparent checkbox functionality. -* Fixed: Typography fine-tuning. - -## 3.2.9.18 -* Modified: Typography field rewritten to fill out font-family field dynamically, versus on page load. -* Fixed: All typography select fields render as select2. - -## 3.2.9.17 -* Fixed: Switching between transparency on and off now restores the last chosen color in - all color fields. - -## 3.2.9.16 -* Fixed: Redux uploads dir should NOT be ~/wp-content/uploads, but just wp-content. - As per Otto. -* Fixed: Navigation no longer has that annoying outline around the links. Yuk. - -## 3.2.9.15 -* Fixed: #1218 - Select2 multi select not accepting any keyboard input. - -## 3.2.9.14 -* Fixed: #1228 - CSS fixes - -## 3.2.9.13 -* Fixed: #1255 - button_set multi field not saving when all buttons not selected. - -## 3.2.9.12 -* Fixed: #1254 - Border field with 0px not outputting properly. -* Fixed: #1250 - Typography preview font-size not set in preview. -* Fixed: #1247 - Spacing field not outputting properly in `absolute` mode. -* Modified: Typography previewing hidden until font inputs are changed. - -## 3.2.9.11 -* Fixed: Vendor js not loading properly when dev_mode = true -* Fixed: Border field not outputting properly. - -## 3.2.9.10 -* Modified: Centralized import/export code in anticipation of new builder features. -* Fixed: Removed rogue echo statement. - -## 3.2.9.9 -* Modified: select2 loads only when a field requires it. - -## 3.2.9.8 -* Modified: More code to load JS on demand for fields require it. - -## 3.2.9.7 -* Modified: Field specific JS only loads with active field. -* Fixed: Hints stopped working due to classname change. - -## 3.2.9.6 -* Fixed: Permissions argument on section array not filtering out raw field. - -## 3.2.9.5 -* Fixed: Too many CSS tweaks to list, due to last build. -* Fixed: Sortable and Sorter fields now sort without page scroll when page size is - under 782px. -* Fixed: Hint icon defaults to left position when screen size is under 782px. -* Fixed: `permissions` argument for fields and sections erasing saved field data. See #1231 - -## 3.2.9.4 -* Modified: Woohoo! Nearly fully responsive. Yanked out all SMOF and NHP field customizations. - Lots of little fixes on all browser screens. This will also greatly benefit Metaboxes - and other areas of Redux. -* Fixed: In dev_mode panel CSS was being loaded 2x. - -## 3.2.9.3 -* Fixed: Typography color picker bleeding under other elements. #1225 -* Fixed: Hint icon_color index error from builder. #1222 - -## 3.2.9.2 -* Fixed: Tracking. It was... odd. Also started our support hooks, UI to come. -* Fixed: Now import/export supports multiple instances. I can't believe this has been this way for so long. - -## 3.2.9.1 -* Fixed: Spacing field not outputting proper CSS when `mode` was set to absolute, and `all` was set to true. -* Fixed: CSS fix for typography. Color picker would interfere with save/reset bar. - -## 3.2.8.21 -* Added: Network admin support! Set argument 'database' to network and data will be saved site-wide. - Also two new arguments: network_admin & network_sites for where to show the panel. - -## 3.2.8.20 -* Fixed: Redux now ignores any directories that begin with `.` in the extension folder. See #1213. - -## 3.2.8.19 -* Fixed: Redux not saving when validating uploads. -* Modified: Dimension field default now accepts either `units` or `unit`. - -## 3.2.8.18 -* Fixed: Border field output/compiler formatting. Removed 'inherit' in place of default values. See #1208. -* Fixed: Trim() warning in framework.php when saving. See #1209, #1201. - -## 3.2.8.17 -* Fixed: Typography not outputting all styles when `all_styles` set to true. - -## 3.2.8.16 -* Added: `output` argument for `color` and `color_rgba` fields accepts key/pairs for different modes. Example: -``` - 'output' => array('color' => '.site-title, .site-header', 'background-color' => '.site-background') -``` - -## 3.2.8.15 -* Added: Customizer hook that can be used to simulate the customizer for live preview in the customizer. - `redux/customizer/live_preview` - -## 3.2.8.14 -* Fixed: 'Cannot send header' issues with typography. -* Modified: Google CSS moved into HEAD via WP enqueue. - -## 3.2.8.13 -* Added: `class` argument to the Redux Arguments, section array, and metabox array. If set, a class will be - appended to whichever level is used. This allows further customization for our users. - -## 3.2.8.12 -* Fixed: Small fix for validation if subsection parent is free of errors, remove the red highlight when - not expanded. -* Fixed: Small CSS classes for flashing fonts where web-font-loader. -* Fixed: ASync Flash on fonts. FINALLY. What a pain. -* Modified: Now do a trim on all fields before validating. No need to alert because of a space... - -## 3.2.8.11 -* Modified: Typography field CSS completely rewritten. All thanks to @eplanetdesign! -* Modified: Validation now works in metaboxes as well as updates numbers as changes occur. Validation for - subsections is SO hot now. -* Modified: Various CSS fixes and improvements. -* Fixed: 3+ JavaScript errors found in the background field. Now works flawlessly. -* Added: disable_save_warn flags to the arguments to disable the "you should save" slidedown. - -## 3.2.8.10 -* Fixed: PHP warnings in background field. #1173. Thanks, @abossola. -* Fixed: CSS validation not respecting child selector symbol. #1162 - -## 3.2.8.9 -* Modified: Turned of mod_rewrite check. - -## 3.2.8.8 -* Modified: How errors are displayed, no longer dependent on the ID, now proper classes. -* Fixed: Extra check for typography bug. -* Fixed: Error css alignment issue with subsections. -* Modified: Error notice stays until all errors are gone. Also updates it's number as errors fixed! - -## 3.2.8.7 -* Modified: Moved google font files to proprietary folder in upload to help with permission issues. - -## 3.2.8.6 -* Fixed: javascript error in typography field. - -## 3.2.8.5 -* Fixed: Added a title to the google fonts stylesheet to fix validation errors. - -## 3.2.8.4 -* Fixed: One more slides field error check, and an extra JS goodie for an extension. - -## 3.2.8.3 -* Fixed: Leftover debug code messing up slides field. - -## 3.2.8.2 -* Fixed: More reliable saved action hook. -* Added: Actions hooks for errors and warnings. - -## 3.2.8.1 -* Fixed: Removed erroneous debug output in link_color field. - -## 3.2.7.3 -* Added: is_empty / empty / !isset AND not_empty / !empty / isset as required operations - -## 3.2.7.2 -* Fixed: Reset defaults error. -* Added: `show` argument to turn on and off input boxes in slider. - -## 3.2.7.1 -* Fixed: Required now works with muti-check fields and button set when set to multi. - -## 3.2.7 -* Fixed: Import works again. A single line was missed... - -## 3.2.6.2 -* Fixed: link_color field not outputting CSS properly via compiler or output. Thanks @vertigo7x -* Fixed: Sorter field CSS. Buttons were all smushed together. - -## 3.2.6.1 -* Fixed: 'undefined' error in typography.js. Thanks @ksere. - -## 3.2.6 -* Fixed: Another stray undefined index. Oy. - -## 3.2.5.1 -* Added: `open_expanded` argument to start the panel completely expanded initially. - -## 3.2.5 -* Fixed: Various bad mistakes. Oy. - -## 3.2.4 -* Fixed: Slight typography speed improvement. Less HTML hopefully faster page loads. -* Fixed: Unload error on first load if the typography defaults are not set. - -## 3.2.3.5 -* Modified: Moved update check functions to class file and out of the core. -* Fixed: Errors pertaining to mod_rewrite check. - -## 3.2.3.4 -* Fixed: All those headers already set errors. - -## 3.2.3.3 -* Added: $changed_values variable to save hooks denoting the old values on a save. -* Added: Pointers to Extensions on load. -* Modified: CSS Output for the background field. - -## 3.2.3.2 -* Fixed: Validation error messages not appearing on save. -* Modified: Speed boost on validation types. -* Added: Apache mod_rewrite check. This should solve many issues we've been seeing regarding mod_rewrite noe being enabled. - -## 3.2.3.1 -* Fixed: Sortable field not saving properly. -* Fixed: Erroneous data in admin.less -* Updated: sample-config.php. Sortable checkbox field example now uses true/false instead of text - meant for textbox example. - -## 3.2.3 -* Fixed: Responsive issues with spacing and dimension fields. - -## 3.2.2.16 -* Fixed: Style conflicts with WP 3.9. Added register filter to fields via id. - -## 3.2.2.15 -* Fixed: Metaboxes issues. - -## 3.2.2.14 -* Modified: Some admin panel stylings. Now perfect with mobile hover. Also fixed an issue - with the slidedown width for sections. No more 2 empty pixels. - -## 3.2.2.13 -* Added: Tick mark if section has sub sections. Hidden when subsections expanded. - -## 3.2.2.12 -* Fixed: Compiler hook in the customizer now passes the CSS. - -## 3.2.2.11 -* Fixed: Compiler hook now properly fires in the customizer. - -## 3.2.2.10 -* Fixed: Validation error with headers already being set. - -## 3.2.2.9 -* Fixed: Added mode for width/height to override dimensions css output. - -## 3.2.2.8 -* Fixed: Restoring lost formatting from multiple merges. - -## 3.2.2.7 -* Fixed: New sorter default values get set properly now. ;) - -## 3.2.2.6 -* Added: `data` and `args` can now be set to sorter! Just make sure to have it be a key based on what - you want it to display as. IE: `array('Main'=>'sidebars')` - -## 3.2.2.5 -* Added: Prevent Redux from firing on AJAX heartbeat, but added hook for it 'redux/ajax/heartbeat'. -* Fixed: Removed erroneous 's' character from HTML. - -## 3.2.2.4 -* Added: Check to make sure a field isn't empty after the filter. If it is empty, skip over it. - -## 3.2.2.3 -* Added: Subsections now show icon if they have it. Show text only (without indent) if they do not. - -## 3.2.2.2 -* Added: Set a section or field argument of `'panel' => false` to skip over that field or panel and - hide it. It will still be registered with defaults saved, but not display. This can be useful - for things like the customizer. - -## 3.2.2.1 -* Added: SUBSECTIONS! Just add `'subsection' => true` to any section that isn't a divide/callback and - isn't the first section in your panel. ;) - -## 3.2.1.2 -* Fixed: Info field didn't intend within section. - -## 3.2.1.1 -* Fixed: Compiler hook wasn't running. - - -## 3.1.9.44 -* Fixed: Small bug in image_select javascript. - -## 3.1.9.43 -* Added: Import hook, just because we can. :) - -## 3.1.9.42 -* Fixed: Customizer now TRULY outputting CSS if output_tag is set to false. - -## 3.1.9.41 -* Fixed: Reset section, etc. Discovered an odd WordPress thing. - -## 3.1.9.40 -* Fixed: Image_select size override. -* Fixed: Customizer save not firing the compiler hook. -* Fixed: Customizer not outputting CSS if output_tag is set to false. -* Fixed: Small empty variable check. Undefined index in the defaults generating function. - -## 3.1.9.39 -* Fixed: WP 3.9 update made editor field button look ugly. -* Fixed: Save hook not firing when save_default set to false. - -## 3.1.9.38 -* Fixed: Reset section anomalies. Maybe. - -## 3.1.9.37 -* Fixed: Array of values in required not recognized. - -## 3.1.9.36 -* Fixed: Updated hint defaults to prevent index warning. - -## 3.1.9.35 -* Fixed: Removed leftover debug code. - -## 3.1.9.34 -* Added: New readonly argument for text field. - -## 3.1.9.33 -* Fixed: Reset/Reset section actions hooks now fire properly. - -## 3.1.9.32 -* Fixed: When developer uses section field but does not specify an indent argument. - -## 3.1.9.31 -* Fixed: Dynamic URL for slides -* Fixed: Accidently removed reset action on section reset. Restored. - -## 3.1.9.30 -* Fixed: Section defaults bug for certain field types. - -## 3.1.9.29 -* Fixed: Dynamic URL if site URL changed now updates media properly if attachement exists. - -## 3.1.9.28 -* Fixed: Customizer now correctly does live preview. - -## 3.1.9.27 -* Fixed: Special enqueue case fix. - -## 3.1.9.26 -* Added: A few more hooks for defaults and options. -* Fixed: Small undefined index error. -* Added: Section key generation via title. -* Modified: File intending. - -## 3.1.9.25 -* Fixed: Custom menus not displaying options panel. - -## 3.1.9.24 -* Fixed: Single checkbox option not retaining checked value. -* Fixed: Border field returning bad CSS in CSS compiler. - -## 3.1.9.23 -* Fixed: Import/Export fix. Thanks, CGlingener! - -## 3.1.9.22 -* Added: Save warning now is sticky to the top and responsive. -* Fixed: Mobile fixes for Redux. Looks great on small screens how. -* Fixed: Slight CSS fixes. -* Fixed: Compiler fixes and added notices. -* Added: Import/Export more reasonable text. - -## 3.1.9.21 -* Added: `force_output` are on the field level to bypass the required check that removes the output - if the field is hidden. Thanks @rffaguiar. - -## 3.1.9.20 -* Fixed: Rare case (mediatemple grid server) when file_get_contents won't work outside of the - uploads dir. Used curl to grab the font HTML. ;) - -## 3.1.9.19 -* Fixed: Undefined index for admin bar. - -## 3.1.9.18 -* Fixed: SMALL issue with WordPress 3.9. Now it works. ;) - -## 3.1.9.17 -* Fixed: Info and divide field now work with required. - -## 3.1.9.16 -* Added: Fallback. Now if the media, slides, or background URL doesn't match the site URL, but the - attachment ID is present, the data is updated. - -## 3.1.9.15 -* Fixed: Last tab not properly set. Slow rendering. - -## 3.1.9.14 -* Modified: Replaced transients with cookies. - -## 3.1.9.13 -* Fixed: Undefined variable issues for new required methods. - -## 3.1.9.12 -* Fixed: Default_show display error with a non-array being steralized. -* Added: Multiple required parent value checking! Booya! -* Fixed: Sections now fold with required. - -## 3.1.9.11 -* Fixed: select2 not rendering properly when dev_mode = false, because of ace_editor fix. -* Fixed: Removed mistakenly compiled test code from redux.js. - -## 3.1.9.10 -* Fixed: ace_editor not rendering properly in certain instances. -* Modified: Small change to import_export field in checking for existing instance of itself. - -## 3.1.9.9 -* Fixed: import_export not rendering when the menutype argument was set to menu - -## 3.1.9.8 -* Fixed: Ace_editor not enqueued unless used. MEMORY HOG. - -## 3.1.9.7 -* Fixed: Color_Gradient transparency to was being auto-selected if from way transparent. -* Fixed: Enqueue select with slider for local dev. - -## 3.1.9.6 -* Modified: removed add_submenu_page when creating a submenu for us in the WP admin area. WP - approved API is used in it's place to being Redux up to wp.org theme check standards. - -## 3.1.9.5 -* Fixed: Massive speed issue with button_set. Resolved. -* Fixed: Issue where default values throws an error if ID is not set. - -## 3.1.9.4 -* Fixed: Continuing effort to ensure proper loading of config from child themes. - -## 3.1.9.3 -* Fixed: Import/Export array search bug if section['fields'] is not defined. - -## 3.1.9.2 -* Fixed: Inconsistencies in import/export across different versions of PHP. - -## 3.1.9.1 -* Fixed: Redux checks for child or parent theme exclusively before loading. - -## 3.1.9 -* Updated: RGBA Field stability. Thank you, SilverKenn. - -## 3.1.8.23 -* Modified: Separated Import/Export from the core. It can now be used as a field. - -## 3.1.8.22 -* Fixed: Typography custom preview text/size not outputting. -* Fixed: No font selected in typography would default to 'inherit'. -* Fixed: Hint feature kicking back a notice if no title was specified. - -## 3.1.8.21 -* Fixed: Sortable field, when used a checkboxes, were all checked by default, even when set not to be. -* Fixed: button_set field not setting properly in multi mode. - -## 3.1.8.20 -* Fixed: Javascript console object not printing options object. -* Fixed: Load errors from child themes no longer occur. - -## 3.1.8.19 -* Modified: Typography word and letter spacing now accept negative values. -* Modified: Typography preview shows spaces between upper and lower case groupings. -* Fixed: Compiler output for slider field. - -## 3.1.8.18 -* Fixed: update_check produced a fatal error on a local install with no internet connection. -* Modified: Google font CSS moved to header so pages will pass HTML5 validation. - -## 3.1.8.17 -* Fixed: Compiler hook failing on slider. - -## 3.1.8.16 -* Fixed: Error on update_check when the response code was something other than 200. -* Modified: Removed Google font CSS line from header (because it's in the footer via wp_enqueue_style. - -## 3.1.8.15 -* Added: Admin notice for new builds of Redux on Github as they become available. This feature is - available on in dev_mode, and may be turned off by setting the `update_notice` argument to - false. See the Arguments page of the wiki for more details. -* Added: text-transform option for the typography field. -* Fixed: image_select images not resizing properly in FF and IE. -* Fixed: Layout for the typography field, so everything isn't smushed together. The new layout is - as follows: - [family-font] [backup-font] - [style] [script] [align] [transform] - [size] [height] [word space] [letter space] - [color] - -## 3.1.8.14 -* Added: Newsletter sign-up popup at first load of the Redux options panel. - -## 3.1.8.12 -* Added: Added PHP 5.2 support for import/export. - -## 3.1.8.11 -* Added: Action hooks for options reset and options reset section. -* Added: Theme responsive for date picker. - -## 3.1.8.10 -* Added: New slider. Better looking UI, double handles and support for floating - point values. See the wiki for more info. - -## 3.1.8.9 -* Fixed: link_color field showing notice on default, if user enters no defaults. -* Fixed: Fixed tab notice in framework.php if no tab parameter is set in URL. - -## 3.1.8.8 -* Added: Typography improvements. - -## 3.1.8.7 -* Added: Hints! More info: https://github.com/ReduxFramework/ReduxFramework/wiki/Using-Hints-in-Fields - -## 3.1.8.6 -* Added: Complete Wordpress admin color styles. Blessed LESS/SCSS mixins. ;) - -## 3.1.8.5 -* Added: Font family not required for the typography module any longer. - -## 3.1.8.4 -* Added: Support for using the divide field in folding. -* Added: Error trapping in typography.js for those still attempting to use - typography with no font-family. - -## 3.1.8.3 -* Added: Full asynchronous font loading. -* -## 3.1.8.2 -* Added: email_not_empty validation field. -* Reverted: email validation field only checks for valid email. not_empty check moved - to new validation field. - -## 3.1.8.1 -* Fixed: Hide demo hook wasn't hiding demo links. - -## 3.1.8 -* Fixed: Improper enqueue in tracking class. -* Fixed: Few classes missed for various fields. -* Fixed: Spacing field kicking back notices and warnings when 'output' wasn't set. -* Modified: Added file_exists check to all include lines in framework.php -* Fixed: Background field now works with dynamic preview as it should. -* Fixed: Extension fields now enqueueing properly. -* Added: Text-align to typography field. -* Fixed: Servers returning forwards slashes in TEMPLATEPATH, while Redux is installed - embedded would not show options menu. -* Fixed: On and Off for switch field not displaying language translation. -* Fixed: email validation allowing a blank field. -* Fixed: Now allow for empty values as valid keys. -* Added: Dismiss option to admin notices (internal function) - -## 3.1.6 -* Fixed: CSS spacing issue -* Fixed: Customizer now works and doesn't break other customizer fields outside of Redux. -* Fixed: Several minor bug fixes -* Added: Metabox support via extension http://reduxframework.com/extensions/ -* Added: Admin-bar menu -* Fixed: Section field now folds. -* Fixed: wp_content_dir path now handles double forward slashes. -* Fixed: Typography field missing italics in Google fonts. -* Fixed: Default color in border field not saving properly. -* Fixed: hex2rgba in class.redux_helpers.php changed to static. -* Fixed: 'sortable' field type not saving options as default. -* Fixed: Specified default color not set when clicking the color box default button. -* Fixed: Sorter field options are now saved as default in database. -* Fixed: Issues with checkboxes displaying default values instead of labels. -* Fixed: Outstanding render issues with spacing field. -* Fixed: Plugins using Redux from load failure. -* Fixed: 'not_empty' field validation. -* Fixed: Media field. -* Added: 'read-only' option for media text field. -* Added: 'mode' option to image_select, so CSS output element may be specified. -* Added: Admin Bar menu for option panel. -* Modified: Removed raw_align field and added align option to raw field. - See wiki for more info. -* Modified: media field 'read-only' to 'readonly' to vonform to HTML standards. -* Removed: EDD extension. It never belonged in Core and will be re-released as a - downloadable extension shortly -* Removed: Group field, temporarily. -* Removed: wp_get_current_user check. - -## 3.1.5 -* Typography font arrays may not contain comma spaces. -* Merge in pull request - 542, code cleanup and better readability -* Change how HTML is output to support metaboxes -* CSS only on pages that matter, better checks. -* font-backup in typography now appends to font-family in output and compiler. -* More fixes for Google font css outputting. -* Addded output and compiler to field_image_select. Images will be output as 'background-image'. -* Fixed output in field_background. -* Prevent standard fonts from outputting to Google fonts CSS call. -* class_exists in field_section checking for incorrect classname. -* sample_config fix. -* Compiler not outputting CSS without output set to comthing other than false. -* Google fonts not rendering on frontend. -* Rewrote sample_config as a class - -## 3.1.4 -* Fixed error in redux-framework.php. -* Added select_image field. - -## 3.1.3 -* Fixed a few undefined variables -* Removed old code from the repo. -* Fix for validation. -* Remove the compiler hook by default. -* Fix to sortable field. -* Added an extra check for link color. Removes user error. -* Localization updates. -* Error in slides. -* Fixed the info box bug with spacing and padding. -* Fixed the first item in each section having WAY too much padding. ;) -* Fixed section reset issue where values weren't being saved to the db properly. - -## 3.1.2 -* Feature - Sortable select boxes! -* Feature - Reset a section only or the whole panel! -* New Field - RGBA Color Field! -* Improvement - Use of REM throughout. -* Fixed Typography - Fix output option and various small bugs. -* Fixed Border - Fix output option and various small bugs. -* Fixed Dimensions - Fix output option and various small bugs. -* Fixed Image_select - Various small bugs. -* Fixed Slides - Various small bugs. -* Fixed Sortable - Using native jQuery UI library same as within WordPress. -* Fixed Slider and Spinner Input Field - Values now move to the closest valid - value in regards to the step, automatically. -* Fixed Ace Editor -* FEATURE - All CSS/JS files are compiled into a single file now! Speed - improvements for the backend. -* Fix in how WordPress data is received, improved some output. -* Fix for various fields not triggering fold/compiler/save. -* Fixed elusive icons to use the new version and classes. -* Fixed media thumb to only be the thumbnail version. -* Fixed admin https error with WordPress core not renaming URL. -* Placeholders throughout the framework are now properly there. -* Feature - Setting to not save defaults to database on load. -* Fixed - Computability issue with GT3 builder. -* Fixed localization issue with default values. -* Language - Added Russian -* Feature - Media now can have any content type passed in to limit content types. -* Allow negative values in typography and other fields. -* WordPress 3.8 computability. -* CSS validation issue. -* Feature - User contributed text direction feature. -* EDD Extension now fully function for plugins or themes. -* Removed get_theme_data() fallbacks, we're well pass WordPress 3.4 now. ;) -* A ton of other small updates and improvements. - -## 3.1.0 -* Fix Issue 224 - Image Select width was breaking the panel. -* Fix Issue 181 - Broken panel in firefox -* Fix Issue 225 - 0px typography bug. Thanks @partnuz. -* Fix Issue 228 - Resolved a duplicated enqueue on color_link field. Thanks @vertigo7x. -* Fix Issue 231 - Field spacing bug fixes. -* Fix Issue 232 & 233 - Dimensions: bug fix with units and multiple units. Thanks @kpodemski -* Fix Issue 234 - Pass options as a ref so validating actions can modify/sanitize them. Thanks @ZeroBeeOne -* Fix Issue 222 - Tab cookie function wasn't working. -* Feature - Pass params to Select2. Thanks @andreilupu -* Fix Issue 238 - Fix for conditional output. Thanks @partnuz. -* Fix Issue 211 - Google Web font wasn't loading at first init of theme. -* Fix Issue 210 - Elusive Icons update. Changed classes to force use of full elusive name. -* Fix Issue 247 - Media thumbnails were not showing. Also fixed media to keep the largest file, but display the small - version in the panel as a thumb. Thanks @kwayyinfotech. -* Fix Issue 144 - JS error when no item found in slider. -* Fix Issue 246 - Typography output errors. -* Feature & Issue 259 - Multi-Text now support validation! -* Fix Issue 248/261 - Links color issue. Also fixed color validation. -* Feature & Issue 262 - Now registered sidebars can be used as a data type. -* Fix Issue 194/276 - Custom taxonomy terms now passing properly. Thanks @kprovance. -* Feature & Issue 273 - Argument save_defaults: Disable the auto-save of the default options to the database if not set. -* Feature - Docs now being moved to the wiki for community participation. -* Issue 283 - Date placeholder. Thanks @kprovance. -* Issue 285 - HTTPS errors on admin. Known WordPress bug. Resolved. -* Fix Issue 288 - Float values now possible for border, dimensions, and spacing. -* Feature - Media field can now accept non-image files with a argument being set. -* Fix Issue 252 - Post Type data wasn't working properly. Thanks @Abu-Taymiyyah. -* Fix Issue 213 - Radio and Button Set wasn't folding. - -## 3.0.9 -* Feature - Added possibility to set default icon class for all sections and tabs. -* Feature - Make is to the WP dir can be moved elsewhere and Redux still function. -* Added Spanish Language. Thanks @vertigo7x. -* Fix Issue 5 - Small RGBA validation fix. -* Fix Issue 176 - Fold by Image Select. Thanks @andreilupu. -* Fix Issue 194 - Custom taxonomy terms in select field. -* Fix Issue 195 - Border defaults not working. -* Fix Issue 197 - Hidden elements were showing up on a small screen. Thanks @ThinkUpThemes. -* Fix issue 200 - Compiler not working with media field. -* Fix Issue 201 - Spacing field not using default values. -* Fix Issue 202 - Dimensions field not using units. -* Fix Issue 208 - Checkbox + Required issue. -* Fix Issue 211 - Google Font default not working on page load. -* Fix Issue 214 - Validation notice not working for fields. -* Fix Issue 181/224 - Firefox 24 image resize errors. -* Fix Issue 223 - Slides were losing the url input field for the image link. -* Fix - Various issues in the password field. -* Fixed various spelling issues and typos in sample-config file. -* Initialize vars before extract() - to shut down undefined vars wargnings. -* Various other fixes. - -## 3.0.8 -* Version push to ensure all bugs fixes were deployed to users. Various. - -## 3.0.7 -* Feature - Completely redone spacing field. Choose to apply to sides or all at once with CSS output! -* Feature - Completely redone border field. Choose to apply to sides or all at once with CSS output! -* Feature - Added opt-in anonymous tracking, allowing us to further analyze usage. -* Feature - Enable weekly updates of the Google Webfonts cache is desired. Also remove the Google Webfont files from - shipping with Redux. Will re-download at first panel run to ensure users always have the most recent copy. -* Language translation of german updated alone with ReduxFramework pot file. -* Fix Issue 146 - Spacing field not storing data. -* Fix - Firefox field description rendering bug. -* Fix - Small issue where themes without tags were getting errors from the sample data. - -## 3.0.6 -* Hide customizer fields by default while still under development. -* Fix Issue 123 - Language translations to actually function properly embedded as well as in the plugin. -* Fix Issue 151 - Media field uses thumbnail not full image for preview. Also now storing the thumbnail URL. Uses - the smallest available size as the thumb regardless of the name. -* Fix Issue 147 - Option to pass params to select2. Contributed by @andreilupu. Thanks! -* Added trim function to ace editor value to prevent whitespace before and after value keep being added -* htmlspecialchars() value in pre editor for ace. to prevent html tags being hidden in editor and rendered in dom -* Feature: Added optional 'add_text' argument for multi_text field so users can define button text. -* Added consistent remove button on multi text, and used sanitize function for section id -* Feature: Added roles as data for field data -* Feature: Adding data layout options for multi checkbox and radio, we now have quarter, third, half, and full - column layouts for these fields. -* Feature: Eliminate REDUX_DIR and REDUX_URL constants and instead created static ReduxFramework::$\_url and - ReduxFramework::$\_dir for cleaner code. -* Feature: Code at bottom of sample-config.php to hide plugin activation text about a demo plugin as well as - code to demo how to hide the plugin demo_mode link. -* Started work on class definitions of each field and class. Preparing for the panel builder we are planning to make. - -## 3.0.5 -* Fixed how Redux is initialised so it works in any and all files without hooking into the init function. -* Issue #151: Added thumbnails to media and displayed those instead of full image. -* Issue #144: Slides had error if last slide was deleted. -* Color field was outputting hex in the wrong location. -* Added ACE Editor field, allowing for better inline editing. - -## 3.0.4 -* Fixed an odd saving issue. -* Fixed link issues in the framework -* Issue #135: jQuery UI wasn't being properly queued -* Issue #140: Admin notice glitch. See http://reduxframework.com/2013/10/wordpress-notifications-custom-options-panels/ -* Use hooks instead of custom variable for custom admin CSS -* Added "raw" field that allows PHP or a hook to embed anything in the panel. -* Submenus in Admin now change the tabs without reloading the page. -* Small fix for multi-text. -* Added IT_it and RO_ro languages. -* Updated readme file for languages. - -## 3.0.3 -* Fixed Issue #129: Spacing field giving an undefined. -* Fixed Issue #131: Google Fonts stylesheet appending to body and also to the top of the header. Now properly placed - both at the end of the head tag as to overload any theme stylesheets. -* Fixed issue #132 (See #134, thanks @andreilupu): Could not have multiple WordPress Editors (wp_editor) as the - same ID was shared. Also fixed various styles to match WordPress for this field. -* Fixed Issue #133: Issue when custom admin stylesheet was used, a JS error resulted. - -## 3.0.2 -* Improvements to slides, various field fixes and improvements. Also fixed a few user submitted issues. - -## 3.0.1 -* Backing out a bit of submitted code that caused the input field to not properly break. - -## 3.0.0 -* Initial WordPress.org plugin release. - -## 3.0 -Redux is now hosted on WordPress.org! Update in order to get proper, stable updates. - -* Removed get() and show() -* Fixed huge performance bug -* More bugfixes -* Fixed spacing field -* Converted Redux to run as an auto-updating plugin. Getting ready to post to WordPress.org -* Fixed the auto updater to properly show changes since the last update -* Various fields including link_color, spacing, dimensions -* Compiler hooks to allow developers to generate CSS files only when needed -* Stability and standardizing in HTML output throughout -* PHP/CSS/JS fixes -* Compress JS and use LESS (and compressed CSS) throughout - -## Version 3.0.0 Beta (September 12, 2013) - -* Massive code overhaul -* Replaced redundant field types with data elements -* Migrated to company repo -* Added several new storage methods -* Numerous bugfixes -* Renamed std argument to default -* Added MP6 support -* Complete CSS rewrite -* Globals are now conditional -* Added nesting support -* Added repeatable field -* Restyled Dev Mode -* Added System Info tab -* Added compiler hooks -* Added style and icon support to info field -* Switched to Elusive Icons -* Huge performance updates - -## Version 2.0.1 Final (September 1, 2013) - -* Added option to override ```icon_type``` per icon -* Minor bug/versioning fixes -* Added Font Awesome intro -* Added ```raw_html``` option -* Added ```text_sortable``` option -* Switched from Aristo to Bootstrap jQuery UI theme - -## Version 2.0.0 (January 31, 2013) - -* Fixed SSL error which occurred occasionally with Google Webfonts -* Added optional flag for ```wpautop``` on editors -* Added password field type -* Added ```checkbox_hide_all``` option -* Added WP3.5 media chooser -* Added Google webfonts previews -* Updated to WP3.5 color picker -* Minor style tweaks -* Added graphical 'switch' option for checkboxes -* Removed dependency on class extension for fields -* Deprecated icons in favor of iconfonts - -## Version 1.0.0 (December 5, 2012) - -* Based on NHP Theme Options Framework v1.0.6 -* Cleaned up codebase -* Changed option group name to allow multiple instances -* Changed checkbox name attribute to id -* Added rows attribute to textareas -* Removed extra linebreak in upload field -* Set default menu position to null to avoid conflicts -* Added sample content for dashboard credit line -* Minor style changes -* Changed name of upload button -* Refactored Google Webfonts function -* Replaced ```stylesheet_override``` with ```admin_stylesheet``` -* Made text domain a constant -* Removed PHP closing tags to prevent issues with newlines -* Added option to define custom start tab diff --git a/admin/core/lib/ReduxFramework/README.md b/admin/core/lib/ReduxFramework/README.md deleted file mode 100644 index 1c1f1ebb..00000000 --- a/admin/core/lib/ReduxFramework/README.md +++ /dev/null @@ -1,134 +0,0 @@ -## Redux Options Framework [![Build Status](https://travis-ci.org/reduxframework/redux-framework.png?branch=master)](https://travis-ci.org/reduxframework/redux-framework) [![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/) [![Slack](http://slack.redux.io/badge.svg)](http://slack.redux.io) - -WordPress options framework which uses the [WordPress Settings API](http://codex.wordpress.org/Settings_API "WordPress Settings API"), Custom Error/Validation Handling, Custom Field/Validation Types, and import/export functionality. - -## Posting Guidelines for issues and questions ## -When using our Issue Tracker, you may ask questions where you may be a bit lost or need help understanding the documentation. If, however, you find a bug we require you to read and provide the information contained in our [Contributing Guidelines](https://github.com/ReduxFramework/redux-framework/blob/master/CONTRIBUTING.md). If you do not provide this information, we will request it before we can support you. - -If you are stuck in some of your own code, or need help with PHP and anything else not Redux specific, we request you purchase some [Premium Support](http://reduxframework.com/extension/premium-support/) and we will be happy to assist you. If we feel the issue is outside of our scope we will suggest you to purchase some [Premium Support](http://reduxframework.com/extension/premium-support/) in order for us to serve you. - -## Kickstart Your Development ## - -Are you authoring a theme, or plugin? Visit the [Redux Builder](http://build.reduxframework.com) site and get started! - -## Demo Your Products ## -We help you create a seamless user experience for your users to demo your WordPress products. Not only that, we help you make sure they’re engaged, turning them into a potential customer. Visit [wpdemo.io/](http://wpdemo.io/) - -## Documentation ## - -Need a little help with Redux? Come check out our brand new documentation site at [docs.reduxframework.com](http://docs.reduxframework.com), chock full of tutorials and examples! - - -## SMOF (Simple Modified Option Users) Converter! ## - -Hot off the press, our Redux Converter plugin. It takes your SMOF instance, and allows you to try out Redux without any fear. It also spits out valid PHP source for you if you want to migrate complete with data migration! Give it a try today. It will be in the WordPress.org repo shortly. ;) -https://github.com/ReduxFramework/redux-converter - -## Help Us Translate Redux ## - -Please head over to the wiki to learn how you can help us translate Redux quickly. Any and all are welcome. We appreciate your help! -https://github.com/ReduxFramework/ReduxFramework/wiki/translate - -## Getting Started with Redux ## - -ReduxFramework has been built from the ground up to be the most flexible framework around. You can run it as an auto-updating plugin, or embed it inside your plugin or theme. It allows for multiple copies of itself within the same WordPress instance. For a guide on getting started please refer to [https://github.com/ReduxFramework/redux-framework/wiki/Getting-Started](https://github.com/ReduxFramework/redux-framework/wiki/Getting-Started). - -You can also [download our sample theme available here](https://github.com/ReduxFramework/ReduxSampleTheme) to start developing right away. - -## Please Post Reviews and Spread the Word ## - -ReduxFramework has just released to the WordPress Plugins directory. Please spread the word, tweet, and (most importantly) post reviews on http://wordpress.org/plugins/redux-framework/. - - -## Donate to the Framework ## - -If you can, please donate to help support the ongoing development of Redux Framework! - -[![Donate to the framework](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "Donate to the framework")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=MMFMHWUPKHKPW) - -## Features ## - -* Uses the [WordPress Settings API](http://codex.wordpress.org/Settings_API "WordPress Settings API") -* Multiple built in field types -* Multple layout field types -* Fields can be overloaded with a callback function, for custom field types -* Easily extendable by creating Field Classes -* Built in Validation Classes -* Easily extendable by creating Validation Classes -* Custom Validation error handling, including error counts for each section, and custom styling for error fields -* Custom Validation warning handling, including warning counts for each section, and custom styling for warning fields -* Multiple Hook Points for customisation -* Import / Export Functionality - including cross site importing of settings -* Easily add page help through the class -* Fully responsive options panel -* Much more - -## Stay In The Loop! ## - -[![Follow us on Twitter](http://iod.unh.edu/Images/Twitter_follow_us.png "Follow us on Twitter")](https://www.twitter.com/ReduxFramework) - -## FAQs ## - -1. Why should we use ```require_once``` instead of ```get_template_part```? - * First, because ```get_template_part``` is for... you guessed it, themes! Redux is designed to work with both themes *and* plugins. - * Second, read [this](http://kovshenin.com/2013/get_template_part/). -2. Why shouldn't we edit ```sample-config.php``` in the plugin directory? - * Because ```sample-config.php``` will be replaced at each update of the plugin. You will lose all your effort - -## Are you using Redux? ## - -Send us an email at info@reduxframework.com so we can add you to our showcase! - -## Changelog ## - -See [Changelog.md](https://github.com/ReduxFramework/redux-framework/blob/master/CHANGELOG.md) - -## Running PHP Unit tests ## - -The tests are built using [wordpress's make subversion repository](https://make.wordpress.org/core/handbook/automated-testing/) - -`/var/www/wordpress-develop` as the destination for the core test files. -First download the wordress core tests repository, for these files. - -```bash -cd /var/www -svn co http://develop.svn.wordpress.org/trunk/ wordpress-develop -``` - -In the newly created `/var/www/wordpress-develop` directory rename -`wp-tests-config-sample.php` to `wp-tests-config.php`. Now add your database -details to the new file: -```php -// WARNING WARNING WARNING! -// These tests will DROP ALL TABLES in the database with the prefix named below. -// DO NOT use a production database or one that is shared with something else. - -define( 'DB_NAME', 'wordpress-tests' ); -define( 'DB_USER', 'root' ); -define( 'DB_PASSWORD', 'passowrd' ); -define( 'DB_HOST', 'localhost' ); -define( 'DB_CHARSET', 'utf8' ); -define( 'DB_COLLATE', '' ); -``` - - n.b. you may need to create the database first. - - n.b. n.b. also note that the database used will be emptied on each run. - -Set the `WP_TESTS_DIR` environment variable so that the `redux-framework` test bootstrap file can find the wordpress core tests: -```bash -export WP_TESTS_DIR='/var/www/wordpress-develop/tests/phpunit/includes/' -``` - -You should now be able to run the `redux-framework` unit tests: -```bash -redux-framework$ phpunit -Welcome to the TIVWP Test Suite -Version: 1.0 - -Tests folder: /var/www/wordpress-develop/tests/phpunit/includes/ - -Installing... -... -Configuration read from -redux-framework/phpunit.xml -... -``` diff --git a/admin/core/lib/ReduxFramework/README.txt b/admin/core/lib/ReduxFramework/README.txt deleted file mode 100644 index 17e83a7f..00000000 --- a/admin/core/lib/ReduxFramework/README.txt +++ /dev/null @@ -1,1207 +0,0 @@ -=== Redux Framework === -Contributors: dovyp, kprovance -Donate link: http://ideas.reduxframework.com -Tags: admin, admin interface, options, theme options, plugin options, options framework, settings, web fonts, google fonts -Requires at least: 3.5.1 -Tested up to: 4.6 -Stable tag: 3.6.0 -License: GPLv3 or later -License URI: http://www.gnu.org/licenses/gpl-3.0.html - -Redux is a simple, truly extensible and fully responsive options framework for WordPress themes and plugins. Ships with an integrated demo. - -== Description == - -Redux is a simple, truly extensible and fully responsive options framework for WordPress themes and plugins. Built on the WordPress Settings API, Redux supports a multitude of field types as well as: custom error handling, custom fields & validation types, and import/export functionality. - -But what does Redux actually DO? We don't believe that theme and plugin -developers should have to reinvent the wheel every time they start work on a -project. Redux is designed to simplify the development cycle by providing a -streamlined, extensible framework for developers to build on. Through a -simple, well-documented config file, third-party developers can build out an -options panel limited only by their own imagination in a fraction of the time -it would take to build from the ground up! - -= Online Demo = -Don't take our word for it, check out our online demo and try Redux without installing a thing! -[**http://demo.redux.io/**](http://demo.redux.io/) - -= Use the Redux Builder to Get Started = -Want to use Redux, but not sure what to do? Use our [builder](http://build.reduxframework.com/)! It will allow you to make -a custom theme based on [_s](http://underscores.me), [TGM](http://tgmpluginactivation.com), and [Redux](http://reduxframework.com), and any Redux arguments you want to set. -Don't want to make your own theme? Then output a custom admin folder that you can place -in a theme or plugin. Oh and did we mention it's free? Try it today at: -[**http://build.reduxframework.com/**](http://build.reduxframework.com/) - - -= Docs & Support = -We have extremely extensive docs. Please visit [http://docs.reduxframework.com/](http://docs.reduxframework.com/) If that doesn’t solve your concern, you should search [the issue tracker on Github](https://github.com/reduxframework/redux-framework/issues). If you can't locate any topics that pertain to your particular issue, [post a new issue](https://github.com/reduxframework/redux-framework/issues/new) for it. Before you submit an issue, please read [our contributing requirements](https://github.com/redux-framework/redux-framework/blob/master/CONTRIBUTING.md). We build off of the dev version and push to WordPress.org when all is confirmed stable and ready for release. - - -= Redux Framework Needs Your Support = -It is hard to continue development and support for this free plugin without contributions from users like you. If you enjoy using Redux Framework, and find it useful, please consider [making a donation](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=MMFMHWUPKHKPW). Your donation will help encourage and support the plugin's continued development and better user support. - -= Fields Types = - -* Background -* Border -* Button Set -* Checkbox / Multi-Check -* Color (WordPress Native) -* Color Gradient -* Color RGBA -* Date -* Dimensions (Height/Width) -* Divide (Divider) -* Editor (WordPress Native) -* Gallery (WordPress Native) -* Image Select (Patterns/Presets) -* Import/Export -* Info (Header/Notice) -* Link Color -* Media (WordPress Native) -* Multi-Text -* Password -* Radio (w/ WordPress Data) -* Raw (HTML/PHP/MarkDown) -* Section (Indent and Group Fields) -* Select (Select/Multi-Select w/ Select2 & WordPress Data) -* Select Image -* Slider (Drag a Handle) -* Slides (Multiple Images, Titles, and Descriptions) -* Sortable (Drag/Drop Checkbox/Input Fields) -* Sorter (Drag/Drop Manager - Works great for content blocks) -* Spacing (Margin/Padding/Absolute) -* Spinner -* Switch -* Text -* Textarea -* Typography - * The most advanced typography module complete with preview, Google fonts, and auto-css output! - -= Additional Features = - -* Field Validation -* MANY translations. (See below) -* Full value escaping. -* Required - Link visibility from parent fields. Set this to affect the visibility of the field on the parent's value. Fully nested with multiple required parents possible. -* Output CSS Automatically - Redux generates CSS and the appropriate Google Fonts stylesheets for you on select fields. You need only specify the CSS selector to apply the CSS to (limited to certain fields). -* Compiler integration! A custom hook runs when any fields with the argument `compile => true` are changed. -* Oh, and did we mention a fully integrated Google Webfonts setup that will make you so happy you'll want to cry? - - -= Translators & Non-English Speakers = -We need your help to translate Redux into your language! Redux is part of the WP-Translations.org team. To help us translate Redux create a few account here: https://www.transifex.com/organization/wp-translations. Once you're in, you can head over to the Redux sub-project and translate away. Thank you for your assistance. - -= Get Involved = -Redux is an ever-changing, living system. Want to stay up to date or -contribute? Subscribe to one of our mailing lists or join us on [Facebook](https://facebook.com/reduxframework) or [Twitter](https://twitter.com/reduxframework) or [Github](https://github.com/ReduxFramework/ReduxFramework)! - -NOTE: Redux is not intended to be used on its own. It requires a config file -provided by a third-party theme or plugin developer to actual do anything -cool! - -== Installation == - -= For Complete Documentation and Examples = -Visit: [http://docs.reduxframework.com/](http://docs.reduxframework.com/) - -== Frequently Asked Questions == - -= Why doesn't this plugin do anything? = - -Redux is an options framework... in other words, it's not designed to do anything on its own! You can however activate a demo mode to see how it works. - -= How can I learn more about Redux? = - -Visit our website at [http://reduxframework.com/](http://reduxframework.com/) - -= You don't have much content in this FAQ section = -That's because the real FAQ section is on our site! Please visit [http://docs.reduxframework.com/faq/](http://docs.reduxframework.com/faq/) - -== Screenshots == - -1. This is the demo mode of Redux Framework. Activate it and you will find a fully-functional admin panel that you can play with. On the Plugins page, beneath the description and an activated Redux Framework, you will find a Demo Mode link. Click that link to activate or deactivate the sample-config file Redux ships with. Don't take our word for it, check out our online demo and try Redux without installing a thing! [**http://demo.reduxframework.com/wp-admin/**](http://demo.reduxframework.com/wp-admin/) - -== Changelog == - -## 3.6.0.1 -* Fixed: Minor bugs causing some users issues. - -## 3.6.0 -* Fixed: Customizer path issues -* Added: New default arguments filter by opt_name and type. :) -* Fixed: #2903 - False positive flag in border field JS. Avast doesn't like empty document ready statements. -* Fixed: #2880 - More issues with the extensions_url routine. -* Fixed: #2876 - Fixing more unvetted user contributions. -* Modified: #2855 - Extensions now have a helper class to help composer-based installs. Thanks @2ndkauboy! -* Fixed: #2857 - Required 'contains' not properly evaluating with checkboxes. -* Fixed: #2831 - Localization was complete broken. -* Fixed: #2832 - CSS conflicts with Rev Slider (Hey, Rev Slider guys, you don't have to load your CSS on every admin page. Really?) -* Fixed: Leftover debug echo line in basic customizer extension. -* Added: EXPERIMENTAL: New parsing code in an effort to break the 1000 max_input_var issue that crops up from time to time. Thanks, @harunbasic -* Added: EXPERIMENTAL: "Bugfix" for extension_url in an effort to make it correct. Thanks, @ottok - -## 3.5.9 -* Fixed: Wordpress 4.4.1 related issues. -* Fixed: #2794 - User contributed code from #2716 did not contain isset and caused an index error. -* Modified: Added tons of wp_remote_get handlings to stop bringing down site if Redux is down. -* Modified: When some items appear or not. Making devs lives easier. ;) -* Updated: parsedown.php vendor code, to deal. with PHP 7.0 errors. -* Fixed: #2774 - border fields set to 0 would disappear after saving. -* Modified: Post/page settings on the media gallery window hidden for gallery field, since they are not applicable to Redux. -* Added: #2728 - Filter for hints HTML. 'redux/hints/html'. Thanks, @nyordanov. -* Fixed: #2716 - Enqueue jquery sortable when select field is set to sortable. Thanks, @josh-rathke. -* Fixed: #2726 - Redux fixes for WordPress 4.4. -* Fixed: #2713 - Alerts wouldn't disappear. -* Fixed: #2726 - WP 4.4 breaking template.php include, because the core WP guys thought it would be hilarious to break everyone else's stuff. -* Fixed: Specifying 'user' in a field's data argument would produce WordPress depreciation errors. -* Fixed: Reflective XSS security fix. Thanks to Kacper Szurek for the information. -* Modified: #2685 - Rejoined http strings to prevent errors in theme check. Trade off, INFO notices will appear. @Otto says this is ok. -* Fixed: #2684 - Sorter not displaying (or saving) WordPress data when using the data argument. -* Added: #2673 - WP_CLI check before welcome page redirect. -* Fixed: #2677 - tinymce javascript errors when wp editor is disabled. -* Modified: While in dev_mode, noticies will appear if Redux sample data in share_icons and admin_bar_links arguments is not changed. - This became necessary because devs are not changing this data and theme ends users are coming to us for theme support. -* Modified: Redux links to be // instead of http:// or https:// to ensure portability for secure sites. -* Fixed: #2665 - For those who must have empty dirs in the extensions dir. No more errors. -* Added: #2660 - Added 'user'/'users' data type to wordpress data arg. Thanks @golchha21. -* Fixed: #2652 - load_plugin_textdomain using depreciated argument. -* Fixed: Customizer preview callback working again. -* Fixed: Issue with added plugin textdomain support. - -## 3.5.8 -* Fixed: Customizer preview callback working again. -* Fixed: last_tab argument not working. -* Fixed: #2637 - color picker clear. -* Fixed: #2633. -* Fixed: #2624 - Border field saving/output 0px when no default set. Now accepts no default and outputs no CSS for blank values. -* Fixed: color_rgba no long outputs CSS with empty color values. -* Fixed: #2612 - pseudo classes not appending to multiple selectors in link_color output. -* Modified: The mass data escaping of Redux Core output. Part I. -* Fixed: #2609 - Section not folding correctly with class argument specified. -* Fixed: #2607 - button_set required scalar check for array returned by terms in the data arg. Thanks @Enchiridion. -* Fixed: Fixing more inconsistencies with wp_filesystem dirlist. How about some proper documentation, Otto? -* Fixed: #2582: Added extra check for get_terms to avoid error. -* Fixed Filesystem proxy dirlist triggering file permission errors on empty array. -* Fixed: #2571 - Sorter adding extra disable column on new entries if 'disabled' is lowercase. -* Updated Fields css for dev_mode off. -* Updated: Updated container.tpl version. -* Fixed: #2570 - multi-text field CSS bleeding over into WP. - -## 3.5.7 -* Fixed Customizer customizer_only and customizer section overrides. Also global customizer => false was not working. -* Added Security suggestions posed in #2543 by Julio Potier from SecuPress. -* Fixed: 'dirlist' in filesystem proxy returning permission error on empty dirs. -* Added setOption and getOption to Redux API. -* Added 'hide_save' argument. -* Added: 'readonly' argument for textarea. -* Fixed: #2545 - CSS validator error output misconfigured. -* Fixed: ACE adding escape slashes to quotes via CSS validation, causing improper error message. -* Added: `ajax_save` arg for fields. Setting to false will reload the options panel when the set option has changed. -* Fixed: #2532 - Spinner field arrow spacing off when dev_mode set to false due to missing `!important` CSS suffix. -* Added: `autocomplete` arg to text field. This is FALSE by default. -* Fixed: Color RGBA field missing name_suffix. Will now work in repeater extension. - -## 3.5.6.1 -* Fixed: Index error regarding icon argument. - -## 3.5.6 -* Fixed Customizer WP 4.3 final fixes. -* Fixed #2500 - Conflict with outdated select2 in JW Player plugin. -* Modified: icon_type no longer needed for section icons. Now detects if URLs are provided for images. -* Fixed: Various customizer fixes. HTML in the customizer title. -* Modified: Media URL now is 95% wide. -* Modified: Select2 now 100% width instead of just resolve (that doesn't always work). -* Modified: Field enqueue method to allow for more flexibility. -* Added: Support for Airplane Mode plugin (https://github.com/norcross/airplane-mode) by @norcross. Thanks @chriscct7 #2463 -* Fixed: Undefined index in theme-check enhancements. Thanks @winwinwebdesign! -* Removed: SASS compiler & code. Note needed. -* Fixed: Color transparency live-update for Customizer for color, background, - and color gradient fields. -* Fixed: Undefined index when removing a section. -* Fixed: Typography bug onload always saying settings have changed. -* Modified: Added minified customizer JS. -* Fixed: Redux CUSTOMIZER! YEA! -* Fixed: Small echo in Redux API - -= 3.5.5.1 = -* Fixed: Sigh, PHP 5.2 issues. - -= 3.5.5 = -* Fixed: Date-time fixes with CSS overloading and positioning. -* Added: Lite support for https://wordpress.org/plugins/plugin-dependencies/ -* Modified: CDN to be a more bulletproof solution (http://jsdelivr.net). -* Modified: CDN alerts to be more clear, and have proper links. -* Fixed: Bad code in raw field hosing up the entire panel. -* Modified: #2436 - Validation check for any validation type ending in 'not_empty' now recognized. -* Fixed: Undefined index for undeclared variable in Theme-Check checks. -* Fixed: Annoying Redux Theme-Check notices. -* Fixed: How some functions were called. -* Fixed: Theme-Check baby! Everything working as it should with extra theme-check hints to prepare - your theme for submission! -* Fixed: Better .org hinting for theme submission. -* Modified: `forced_dev_mode_off` argument that will ensure dev_mode is ALWAYS off. - PLEASE do not ship with this enabled. We will NOT provide any support for any instance that - has this argument enabled. Disable and test prior to posting on our issue tracker. -* Added: `customizer_only` as a global arg that disables all of Redux except for the customizer, in - preparation for our customizer integration. -* Modified: Dissmissable Redux Admin notices now use the WP 4.2 dismiss JS and Ajax. Pretty. -* Modified: Admin notice code is now it's own isolated class inside core. -* Modified: Use DB for admin notice, not flat-files. Boo. -* Modified: Sample configs not to cause errors if multiple users use the same function name. -* Fixed: CDN internationalization class. -* Modified: Parsedown so as not to throw a shortcode error that didn't actually exist. -* Fixed: #2446 - Non google font choice not saving in certain instances. -* Fixed: Added additional check in redux.js to stop errors with panels containing multiple raw fields. -* Fixed: Hopefully, the issue of settings not saving on first install when using the Redux API. -* Fixed: Set use_cdn argument to true, by default. -* Fixed #2437 - undefined value set to blank line height. -* Fixed: #2429 - Required evaluator 'contains' not working properly with multi_check -* Fixed: #2426 - Section field not indenting. -* Fixed: Divider field not rendering properly. -* Added: `fieldset_class` argument for fields. Thanks @Enchiridion. -* Added: Option to set checkbox label. Thanks @Enchiridion. -* Added: javascript .trigger('change') to switch, spinner, and image_select. Thanks @Enchiridion. -* Modified: Ajax change output of error and notice via hooks. -* Fixed: #2414 - Bad ajax save due to mis-initialized variable. -* Fixed: CSS in metabox fields all wanky. -* Added: 'reload_on_change' arg for fields, to force page reload after setting change. -* Fixed: #2377 - Replaced mysql_gets_server_info with $wpdb. -* Modified: Templates to properly excape values. -* Fixed: Import/Export to properly be full-width and use lazy-load JS. -* Modified: CSS for sections to bound to the section, not all of Redux. -* Fixed: #2368 - Options panel layout offset. -* Fixed: #2369 - validate_callback not working for color, color_gradient, and date. -* Fixed: #2355 - Space missing in switch class arg. -* Fixed: Fixed all fields without leading space in class arg. -* Modified: Restrict table modification to redux-container. -* Fixed: Container overflow for pre's. -* Modified: Redux API to include removeSection and removeField. -* Added: Added before and after hooks to any panel template file. -* Fixed: #2351 - WP_Error check added to admin blast remote get. -* Modified: Moved styling for the divide field into it's own CSS file. -* Modified: All WP Color Pickers to properly save the value before save. -* Added: CSS Styles for the customizer. ;) -* Modified: Panel is MUCH more responsive now. -* Fixed: Small stylings for a few fields. -* Fixed: Added extra qTip class. -* Modified: Ajax save animation. Added fallback for pre 4.2 CSS. -* Fixed: Small issue with Redux info boxes and spacing. -* Fixed: Small bug with the Redux API where divide sections were causing errors. -* Fixed: Small admin blast fix. -* Modified: Qtip and Spectrum vendor libraries restored to local. -* Fixed: Admin notice loading on front end. -* Modified: Callback actions run with do_action_ref_array now. -* Added: show_options_object argument to enable or disable option object. -* Added: Error suppressing to filesystem class to avoid notice errors when site goes down. -* Fixed: Panels not rendering, again -* Added: Vendor support plugin link to CDN fallback message. -* Modified: Moved vendor libraries ACE, select2, qtip, and spectrum to CDN. -* Removed: Local installs of above libraries. -* Fixed: Option panel not rendering due to experimental code. -* Fixed: How sorter works with data -* Modified: How the data arg is stored in Redux. -* Removed: sysinfo.php. No longer needed in lieu of our support URL feature. -* Removed: debug.php. Moved to options_object extension. -* Modified: #2274 - PHP Unit test compatibility. Thanks @daithi-coombes. -* Modified: #2144 - Optional class argument per image. Thanks @paulthecoder. -* Fixed: #2278 - More W3 Total Cache hacks. - -= 3.5.4.3 = -* Fixed: #2258 - welcome redirect error with embedding plugin scenarios. -* Fixed: Redux plugin load order when activating plugins. -* Fixed: #2271 - stuck redirect on godaddy (seriously, get a real host, people) servers. -* Fixed: #2216 - Reset section not always working within FF. - -= 3.5.4 = -* Modified: update_notice arg only truly shows up if dev_mode is on. -* Added: Tooltip to developer mode badge, for informational purposes. -* Modified: Added css_layout ext to default value filter, to avoid errors. -* Fixed: #2239 - Various extensions didn't support default values for default arg. Filtered out offending extensions. - -= 3.5.3.1 = -* Fixed: WP.org ONLY SVN mixup. - -= 3.5.3 = -* Fixed: #2228 - Submenu items still visible if permissions not allowed. -* Fixed: Import/Export showing up in customizer. -* Modified: Admin-fresh theme to match new WordPress 4.2 -* Modified: Redux widget now has a proper ID. Thanks @corradomatt! -* Modified: Added text-shadow to submenu items to give a stronger "pop" -* Modified: Page_slug now dynamically generated if not specified. -* Modified: Admin blast message pinging server on each load after three day expiration. Possible slow down of the overall panel loading time. -* Fixed: #2221 - Background field media not enqueueing when used with no other media based fields. -* Fixed: #2214: Bad path for import/export enqueue. -* Release: Wp.org release. -* Fixed: #2214 - Import/export field contained bad enqueue path. -* Modified: If running localhost or WP_DEBUG is set to true, Redux dev_mode is forced to true. -* Modified: Page_slug now dynamically generated if not specified. - -= 3.5.1 = -* Modified: Redux News dashboard widget appears only when dev_mode is true or in a local host environment. -* Fixed #2127 - Elusive icons not working in footer as before. -* Fixed Issue where Status tab not showing extension versions properly. -* Fixed Issue in support URL not passing data correctly. -* Fixed Support URLs now work even if max_input_vars is way low in PHP 5.3+ -* Fixed #2197 - Import/export not loading proper for those who have opted to install Wordpress in ways it was never intended. -* Fixed: 'Generate Support URL' feature kicking back error. -* Fixed Sortable checkbox labels not displaying properly. -* Fixed Sortable textbox not displaying default value as placeholder. -* Updated: sample-config with accurate example for both sortable modes. -* Fixed #2181 - Fixed issue with Ajax Save when PHP 5.3 Magic Quotes were disabled. -* Fixed: #2181 - Lingering issue with Ajax Save and PHP Magic Quotes. - -= 3.5.0 = -* Fixed: #2181 - Issue with PHP < 5.4 and the Ace Editor field. Oy. -* Fixed: #2163 - Undefined error in JS. -* Fixed: #2176 - Infinite loop in the customizer for live preview of themes. -* Fixed: Support page now works. -* Fixed: Fix for MySQL deprecated functions in php 5.5+. -* Added: Dynamic admin messages (aka Newsflash). Dismissable admin messages announcing breaking Redux news. - Messages will not appear for users when dev_mode is set to `false`. However, messages remain active - on localhosts, so devs may benefit. -* Fixed: #2155 - Fixed import with ajax_save. -* Fixed: Changelog now uses raw field parsedown if present. -* Added: Redux Framework News Widget on the WP Dashboard. -* Fixed: #2156: `label` argument not recognized when using sortable as textbox. -* Fixed: #2140 Another PHP 5.2 issue with ajax_save. -* Modified: Opt groups for select field now working in customizer even if not supported. -* Added: `full_width` arg now makes ANY field full-width. :) -* Fixed: #2133 - Ajax save adding extra backspashes in PHP 5.2 only (They didn't use array map properly). -* Fixed: Customizer wasn't working. Thanks @sgssandhu! -* Fixed: #2125 - Compiler not firing on first save, when using ajax_save. -* Fixed: #2118 - Typography JS error. -* Fixed: Odd typography bug no one has reported. -* Modified: Sticky header and footer to remain within the redux-main container. -* Fixed #2097 - Slash fix for ajax_save that was previously believed to be an isolated issue. Now applied on all ajax saves. -* Fixed: #2086 - color_rgba improperly functioning when transparent mode set to false. -* Fixed Import/Export bug where it wasn't running. -* Modified Locations of the core extensions directory as well as grunt configuration. -* Fixed #2047 - Validation will now accept 0 as a value to be tested. Thanks @Ninos! -* Added url_slug validation with option flush_permalinks! -* Fixed Issue where the remove of background field was always showing an empty preview box. -* Modified Turned ajax_save on by default for additional bug reports. ;) -* Modified Added some margin above validation errors/warnings so they look better. -* Modified Removed previous element border for any section so it looks better. -* Fixed #2081 - Section field hiding any field after. Weird. -* Added #2047 - `output_transparent` argument to output the blank color feature as 'transparent'. -* Fixed #2080 - missing 'rem' unit and inability to process float values. Thanks to @HELWATANY for the fixes! -* Fixed #2043 - misaligned images in image_select field. -* Added: #2064 - Merge argument for image_select. Thanks @Ninos -* Modified: Import/Export is now an extensiona and decoupled from the core. -* Fixed: Spinner had a nasty number bug, now resolved. -* Fixed: #2076 - RTL bug with old ID's. Thanks @mahfoozroy. -* Fixed: #2072 - Ajax_save editor type bug fix. -* Fixed: #2058 - Incorrect path in include statement for sysinfo.php -* Modified: Templates now have versioning with a warning (dev_mode only) if they are outdated from the core templates. -* Modified: Ajax saving now has overlay during save to avoid confusion for users. -* Modified: Template files even more for simplicity and ease. -* Modified: Saving. Redux now has the ajax_save argument if you want it! -* Modified: Validation warnings now work. -* Fixed: Changed set_transient function to public to avoid errors in new templating code. -* Modified: Entire panel template is now decoupled from the theme and implemented with many filters for easy customization. -* Fixed: #1478 - Import/export failing when two instances if Redux in use. Thanks, @desaiuditd! -* Fixed: Section field not indenting properly, if at all. -* Added: #2031 - Proper CSS sanitization for compliancy with WP.org. -* Fixed: #2027 - added isset() -* Fixed: #2019 - Reset issues with PHP 5.2. Thanks a bunch, @Webcreations907! -* Fixed: #2023: Issue with custom submenus in menu. -* Fixed: #2025: Issue with select sorting. -* Update: ACE Editor. Thanks @corradomatt. - -= 3.4.1 = -* Fixed: Small filesystem option with bad filter key reference.. -* Added: Small return if $section filter returned the section empty. - -= 3.4.0 = -* Fixed: Reset section hook firing too early. -* Modified: The Redux Repeater field has landed! -* Fixed: #1983 - color_rgba not outputting default values on first load (before save). -* Fixed: Google font enqueues with opt_name to avoid collision with multiple Redux instances. -* Fixed: #1980 - JS errors with sorter & sortable. -* Fixed: color_rgba field outputting incorrect information via output/compiler. -* Fixed: #1979 - Goole fonts not properly loading in typography dropdown. -* Fixed: Undefined index error on MU installs. -* Removed: SASS compile of field CSS, for the time being. Compiler remains in core. -* Improved: Panel load time, most notable when not in dev_mode. Better for your clients. :) -* Updated: Elusive Font library. -* Fixed: #1961 - color_rgba field defaulting to black on reset. -* Fixed: #1941 - Datepicker opened off screen. -* Fixed: #1756, #1957 - Slider issues. Thanks @FFIN! -* Fixed: #1960 - Duplicate slide when clicking Add. Again, thanks to @FFIN for the fix. -* Added: New filter: apply_filters 'redux/validate/{opt_name}/before_validation' -* Fixed: #1745 - Adding settings submenu to empty submenu now works. Many, many thanks to @No3x for cracking this one! -* Fixed: #1955 - Undefined index rgba in output routine. -* Modified: #1947 - Added display:none to TR tag under info field. -* Replaced: #1951 - Replaced develop branch of scssphp to master branch due to PHP 5.2 incompatibililty. -* Fixed: #1943 - Removed premature DIV close. -* Fixed: #1945 - Media preview not rendering when default ID specified. -* Modified: #1930 - reorder 'psedo-class of link_color field. Thanks @freddessaint -* Modified: SASS compiler outputs to page by default. Faster. -* Fixed: #1927 - Incorrect dir path to spectrum library in color_rgba field corrected. -* Modified: color_rgba field now usees spectrum color picker. minicolors removed. Just...too buggy. -* Modified: #1922 - Filesystem output function. -* Fixed: Added PHP 5.2 support (ugh!) for SASS compiler. -* Fixed: More SASS compiler tweaking. -* Fixed: PHP errors when disabling SASS. -* Fixed #1909 - malformed DIV class HTML in slider field. -* Removed Argument for SASS compile file output location removed. Didn't work, too much trouble. -* Fixed: #1904 - select_image field not displaying saved value on page reload. -* Fixed: SASS compile under multi-instance outputting incorrect CSS file -* Fixed: redux-admin scss images converted to base64 -* Added SASS compiler for admin CSS. -* Added SASS to CSS for grunt compiler. -* Added SASS compiler for fields. -* Updated: select2 3.5.2 -* Fixed: #1856 - Illegal offset string warnings in framework.php. Thanks @CGlingener. -* Fixed: #1874 - Required operator 'contains' and 'not_contains' not working with select set to multi. -* Fixed: #1829 - Required operator '=' and '!=' not working with select set to multi. -* Fixed: #1870 - Border field doubling up on px in output/compiler. -* Added: `hidden` argument for fields. -* Added: `hidden` argument for sections. -* Fixed: #1868 - Improper panel render when opening expanded, when `open_expanded` set to true. -* Added: `hide_expand` argument, to hide the expand options button. -* Fixed: #1865 - Sortable select not saving proper order. -* Fixed: #1864 - Footer z-index CSS adjusted. -* Fixed: #1848 - Import-export filed buttons not functioning properly. -* Fixed: #1834 - Wordpress data dealing with IDs as array keys not rendering properly. -* Fixed: #1830 - Font lists were added in quotes. Thanks @karimhossenbux. -* Fixed: #1798 - Fixed lazy load JS to only load visible sections. Much more optimized. -* Fixed: #1821 - Exo 2 font not working, issue with typography and escaping. -* Added: #1803 - Optgroup support for select field. -* Added: Decimal increments to spinner. - -= 3.3.9.4 = -* Added: Customizer now supports PANEL! Yay 4.0. -* Fixed: #1789 - Customizer now properly working again with WP 4.0. Odd bug. - -= 3.3.9.2 = -* Fixed: #1670 - Fixed some extra themecheck and customizer issues. -* Fixed: #1782 - Media field not showing files after upload? Hopefully this fixes it. - -= 3.3.9 = -* Fixed: #1775 - Call to undefined function is_customize_preview() in pre WP 4.0. -* Fixed: Issue where in some cases tracking still occuring after opt-out. -* Modified: Documentation URL. -* Fixed: #1742 - Sidebar subsections don't always expand. -* Fixed: #1758 - Thanks @echo1consulting! -* Added: 'hidden' to menu_type argument to allow for hidden menus until available. -* Fixed: #1749 - Remove font-wight and font-style from css output when not in use. -* Modified: Added the "redux/options/{$this->args['opt_name']}/compiler/advanced" hook for more advanced compiling. -* Added: Suggestions as per #1709. Thanks @echo1consulting. -* Modified: Removed a cURL instance from the core and fixed the developer ad resizing. -* Fixed: PHP 5.2 issues. *sigh* - -= 3.3.8.3 = -* Added: #1593 - Great pull request by @JonasDoebertin. Now you can enqueue dynamic output to the login screen or admin backend. -* Fixed: Customizer wasn't saving at all! That's been like 4 months. No one's reported it. Hmm. -* Fixed: #1702 - Customizer only fields were being erased on panel save. -* Fixed: Various Theme-Check errors with languages. -* Added: Theme-Check class to help devs know what is what. -* Fixed: The way we include files from include_once to require_once everywhere. -* Modified: Language files to reflect new strings. -* Modified: Formatted a bunch of old class files. -* Added: Notice on the updates for non-devs to use the new dev_mode disabler plugin and notify their developer. ;) - -= 3.3.8 = -* Modified: Updated potomo, thanks @shivapoudel. -* Added: Grunt checktextdomain and made improvements. Thanks @shivapoudel. -* Modified: #1685 - Specifying no default argument for image_select caused errors on reset. -* Fixed: #1667 - Slides Upload button causing JS error. -* Fixed: #1670 - Fix for Theme Check -> `add_setting() method needs to have a sanitization callback function passed.` -* Fixed: #1661 - Fix for undefined index in some versions of PHP. Thanks @gianbalex! -* Modified: #1658 - Improvements from @shivapoudel, including: - * Removed makepot and used grunt-wp-i18n instead. - * Added a jshintrc file - * Added a `grunt addtextdomain` to correct any bad textdomains in the core. - * Updated .gitignore for better readability - * Updates to a few other files including package.json. - * Updated language files. - * Update codestyles/.editorconfig to reflect the project's standards. -* Modified: #1653 - Better admin bar with external links: Admin bar menu priority, icon, and external links. Thanks @shivapoudel! -* Added: #1651 - `library_filter` argument. Allows specification of what files to display in the media library. -* Modified: #1651 - `mode` argument accepts either file type or mime type (but not both). -* Fixed: #1650 - Toogle error with responsive CSS. -* Fixed: #1643 - Slight border issue (2px) on sticky footer. -* Fixed: #1642 - Added `font_family_clear` arg, enabling the clear option for font-family. -* Fixed: #1638 - Spacing field not outputting when units values attached to default values. -* Modified #1644 - `import_icon` argument now accepts wordpress dashicons -* Fixed: #1634 - Double border for sections field. Thanks @AlexandruDoda -* Modified: Changelog location to now Changelog.md. -* Fixed: #1632 - Sortable with no defaults set revert to false (instead of options values). -* Fixed: Labels for sortable in text mode updated to match framework. - -= 3.3.7 = -* Added: #1586 - Class-level declaration for callbacks and validation. Thanks @echo1consulting. -* Modified: Typography field now fully dynamic. -* Modified: No longer require a google_api_key for the typography module. :) -* Fixed: FTP credentials screen giving a "undefined submit_button function". Resolved. -* Fixed: #1623 - Registered older noUISlider JS under a new name to avoid conflicts. -* Modified: #1622 - Removed googlefonts.js dependency. -* Modified: #1628 - Spacing and dimensions now only output 0 if the entry is a 0, not empty. - Thanks @Webcreations907 -* Modified: CSS for menu items when active (no hover). -* Added: Visual feedback to left menu if active. - -= 3.3.6.8 = -* Fixed: #1600 - ACE Editor bombing in PHP 5.2 environments. -* Fixed: #1591 - Erroneous outputting of font-weight and font-style when no font-family selected. -* Updated: #1569 - Improved submenu highlighting. -* Added: #1487 - Added `get_default_value` function into the framework.php -* Fixed: Framework URI errors when using child themes. Some restructuring. -* Fixed: Framework URI errors when embedded in theme with Windows. -* Added: image_size as an option for the data argument. Thanks @Gyroscopic! -* Modified: How Redux paths are run. Should cover all use cases now. Child themes can also embed - Redux properly now. Thanks @cfoellmann for the suggestions. Fix for issue #1566. -* Modified: How we declare the uploads directory and URL. Using core WP functions now. -* Modified: Now if a section is empty, but has subsections, that section will be "skipped" when - clicked and the first subsection will then be shown. - -= 3.3.6 = -* Fixed: #1560 - IE8 RGBA fallack -* Modified: Language files. -* Fixed: #1543 - Hint icon not changing when set in args. -* Fixed: #1537 - Media field not accepting images with mode set to false. -* Fixed: #1529 - ACE Editor conflict with Visual Composer. -* Added: #1530 - Added argument to specify admin bar icon, `admin_bar_icon`. Thanks Ninos! -* Fixed: #1532 - Media field not accepting any mime type when `'mode' => false`. -* Fixed: #1520 - Checkbox field not displaying Wordpress data when using data argument. -* Fixed: #1516 - Invalid index and foreach when using compiler and async_typography. -* Fixed: #1509 - Sorter adding unnecessary bits on some items. -* Fixed: #1514 - Customizer and multisite not getting on properly. -* Fixed: #1512 - Slides 'Upload' button not showing or saving selected image. -* Fixed: Checkboxes with required were working in reverse. -* Fixed: ASync Typography now works! No more flashing fonts. -* Fixed: #1489 - Color picker UI lining up improperly. -* Fixed: #1497 - dev_mode spinner issue. -* Fixed: Spelling error in tracking dialog. -* Modified: Updated ace_editor. -* Modified: Many MANY fields for the group field. -* Fixed: Some CSS bugs. -* Fixed: #1481 - Custom fonts loading in google font CSS. -* Fixed: #1485 - Customizer 'invalid argument' error. Thanks @rnlmedia. -* Fixed: #1472 - font style not displaying saved valie with no font-family argument set. -* Fixed: #1471 - raw field and required not playing nice together. - -= 3.3.5 = -* Added: An annoying notice at the top so our devs don't ship with dev_mode on. ;) - -= 3.3.4.9 = -* Fixed: #1462 - Google fonts not loading in font drop down. - -= 3.3.4.8 = -* Fixed: More WP FileSystem tanking. Did PHP fallback before FTP. Works 99.9% of the time without credentials. - -= 3.3.4.7 = -* Fixed: Incorrect folder CHMOD in filesystem class. - -= 3.3.4.6 = -* Fixed: #1454 - Chmod permissions for redux folder. - -= 3.3.4.5 = -* Fixed: #1451 - Googlefonts not loading due to failing copy function. - -= 3.3.4.4 = -* Fixed: #1450 - Saves witch values with no `on` or `off` args make the core unhappy. - -= 3.3.4.3 = -* Fixed: #1444, again, due to filesystem growing pains. -* Fixed: #1449 - Restoring `options` argument over a lousy attempt to fix placeholder. - -= 3.3.4.2 = -* Fixed: More file permission issues. - -= 3.3.4.1 = -* Fixed: Font debug was left from last commit. Sorry all. - -= 3.3.4 = -* Fixed: Issues with file writing. Basically many users don't install WordPress with all the permissions - correct. So... Had to move it back to ~/uploads/. Sorry Otto, that's just how it is. -* Fixed: #1444 - output of typography all_styles when font_style UI was hidden. -* Fixed: #1440 - flaw in new cleanFilePath logic. -* Fixed: #1432 - Theme check failing when double-slashes existed in get_template_directory() return. -* Removed: curlRead from helper class. -* Fixed: #1426 - menu_name not appearing on front end admin bar. -* Added: #1427 - button_set added to customizer UI. Thanks @wpexplorer. -* Fixed: #1429 - ACE Editor erroring with no default value set. -* Fixed: wp_filesystem now initialized with credentials in an effort to combat the tmp file issue. -* Modified: Code purification. -* Modified: How section tabs work. Isolated within the redux-container class. -* Modified: #1412 - Redesigned text label, placeholder fix. - -= 3.3.3 = -* Fixed: #1408 & #1357 - Typography subsets losing value after multiple saves on other panels. -* Fixed: #1403 - unit value no longer prints after empty typography values -* Modified: Typography: Backup font no longer appends to `font-family` variable. Please use the - `backup-font` variable to specify backup fonts. This does not apply to output/compiler strings. -* Fixed: #1403 - Backup font not appearing in font-family variable. -* Modified: Customizer now supports section and field `permissions` argument. -* Fixed: #1399 - Customizer respects `page_permissions` argument. -* Fixed: #1400 - output/compiler string incomplete using multiple selectors. -* Fixed: #1396 - Custom fonts cutting off multiple families in selector, after save. -* Fixed: Typography attempting to queue up non google fonts on backend. -* Added: #1395 - Display of child theme status in sysinfo, thanks @SiR-DanieL. -* Fixed: #1387 - Page jump when clicking "Options Object". Thanks @rrikesh. -* Added: #1392 - Filters to change the following localized strings: - redux/{opt_name}/localize/reset - redux/{opt_name}/localize/reset_all - redux/{opt_name}/localize/save_pending - redux/{opt_name}/localize/preset -* Fixed: #1376 - checkbox.min.js missing. -* Fixed: Static variable changes for instances and basic comment cleanup -* Fixed: #1361 - Raw field not hiding with required. -* Fixed: Datepicker not formatting properly. Still needs some work. - - -= 3.3.2 = -* Fixed: #1357 - Preview not rendering font on page load. -* Fixed: #1356 - Color fields and transparency not syncing due to new JS. -* Fixed: #1354 - Add class check for W3_ObjectCache. -* Fixed: #1341 - JS not initializing properly in import_export. -* Fixed: #1339 - Typography would lose Font Weight and Style. value was named val in the - HTML, so it would be destroyed on the next save if not initialized. -* Fixed: #1226 - W3 Total Cache was affecting validation and compiler hooks. -* Fixed: Menu errors weren't showing properly for non-subsectioned items. -* Fixed: #1341 - Import/Export buttons not functioning. Also fixed sortable somehow. -* Fixed: Slides not initializing with the last fix. -* Fixed: Slides field was not properly initialized for the media elements. Fixed. - -= 3.3.1 = -* Fixed: #1337 - `redux` JS dependency loading issue. Many thanks @tpaksu -* Modified: Drastically changed the way JavaScript is used in the panel. Forced as-needed - initialization of fields. Thus reducing dramatically the overall load time of - the panel. The effects have been seen up to 300% speed improvement. The only - time a field will be initialized is if it's visible, thus reducing the processing - needed in DOM overall. -* Fixed: #1336 - fixed default font in preview. -* Fixed: #1334 - Typography not un-saving italics. -* Added: #1332 - New validation: numeric_not_empty. -* Fixed: #1330 - Required not working on all fields. - -= 3.3.0 = -* Fixed: #1322 - Sections not folding with required argument. -* Fixed: #1270 - Editor field compiler hook not firing in visual mode. -* Fixed: select2 dependency in select_image, and other fields. -* Fixed: Filter out `@eaDir` directories in extensions folder. -* Fixed: Fixed the image_select presets to work again. Also now will function even if import/export is disabled. -* Fixed: Minor tweaks for metabox update. -* Fixed: #1297 - Missing space in image_select class. -* Fixed: Slider field tweaked for metaboxes. -* Fixed: #1291 - Change of font-family would not trigger preview, or show in open preview. -* Fixed: #1289 - Typography not retaining size/height/spacing/word/letter spacing settings. -* Fixed: #1288 - Background color-picker dependency missing. Thanks @farhanwazir. -* Fixed: Search extension failed do to dependency issue from the core. -* Fixed: #1281 - color field output/compiler outputting incorrect selector when only one array present. -* Fixed: Update check only appears once if multiple instances of Redux are loaded in the same wordpress instance. -* Fixed: Changing font-family in typography didn't trigger 'save changes' notification. -* Fixed: More typography: Back up font appearing in font-family when opening selector. -* Fixed: Typography: undefined message when NOT using google fonts. Thanks @farhanwazir -* Fixed: Typography font backup not in sync with font-family. -* Fixed: Typography not saving font-family after switching back and forth between standard and google fonts. -* Fixed: Background field selects not properly aligned. -* Fixed: Removed select field dependency from background field. -* Fixed: #1264 - Color-picker/transparent checkbox functionality. -* Fixed: Typography fine-tuning. -* Fixed: All typography select fields render as select2. -* Fixed: Switching between transparency on and off now restores the last chosen color in all color fields. -* Fixed: Redux uploads dir should NOT be ~/wp-content/uploads, but just wp-content. As per Otto. -* Fixed: Navigation no longer has that annoying outline around the links. Yuk. -* Fixed: #1218 - Select2 multi select not accepting any keyboard input. -* Fixed: #1228 - CSS fixes -* Added: `hide_reset` argument, to hide the Reset All and Reset Section buttons. -* Added: `content_title` argument to slides field. Thanks @psaikali! -* Added: `customizer_only` argument for fields & sections, contributed by @andreilupu. -* Added: select2 args for spacing field. -* Added: select2 args for the following fields: typography, background, border, dimensions and slider. -* Added: #1329 - `'preview' = array('always_display' => true)` argument to typography, to determine if - preview field show always be shown. -* Modified: Portions of core javascript rewritten into object code. -* Modified: All field javascript rewritten using jQuery objects (versus standard function). -* Modified: Typography field rewritten to fill out font-family field dynamically, versus on page load. - -= 3.2.9.13 = -* Modified data => taxonomies now has a little more power behind it. -* Fixed: #1255 - button_set multi field not saving when all buttons not selected. -* Fixed: #1254 - Border field with 0px not outputting properly. -* Fixed: #1250 - Typography preview font-size not set in preview. -* Fixed: #1247 - Spacing field not outputting properly in `absolute` mode. -* Modified: Typography previewing hidden until font inputs are changed. -* Fixed: Vendor js not loading properly when dev_mode = true -* Fixed: Border field not outputting properly. -* Modified: Centralized import/export code in anticipation of new builder features. -* Fixed: Removed rogue echo statement. -* Modified: select2 loads only when a field requires it. -* Modified: More code to load JS on demand for fields require it. -* Modified: Field specific JS only loads with active field. -* Fixed: Hints stopped working due to classname change. -* Fixed: Permissions argument on section array not filtering out raw field. -* Fixed: Too many CSS tweaks to list, due to last build. -* Fixed: Sortable and Sorter fields now sort without page scroll when page size is under 782px. -* Fixed: Hint icon defaults to left position when screen size is under 782px. -* Fixed: `permissions` argument for fields and sections erasing saved field data. See #1231 -* Modified: Woohoo! Nearly fully responsive. Yanked out all SMOF and NHP field customizations. Lots of little - fixes on all browser screens. This will also greatly benefit Metaboxes and other areas of Redux. -* Fixed: In dev_mode panel CSS was being loaded 2x. -* Fixed: Typography color picker bleeding under other elements. #1225 -* Fixed: Hint icon_color index error from builder. #1222 - -= 3.2.9 = -* Added: Network admin support! Set argument 'database' to network and data will be saved site-wide. Also - two new arguments: network_admin & network_sites for where to show the panel. -* Added: Customizer hook that can be used to simulate the customizer for live preview in the customizer. - `redux/customizer/live_preview` -* Added: `output` argument for `color` and `color_rgba` fields accepts key/pairs for different modes. -* Added: `class` argument to the Redux Arguments, section array, and metabox array. If set, a class will - be appended to whichever level is used. This allows further customization for our users. -* Added: disable_save_warn flags to the arguments to disable the "you should save" slidedown. -* Added: Actions hooks for errors and warnings. -* Fixed: Redux now ignores any directories that begin with `.` in the extension folder. See #1213. -* Fixed: Redux not saving when validating uploads. -* Fixed: Border field output/compiler formatting. Removed 'inherit' in place of default values. See #1208. -* Fixed: Trim() warning in framework.php when saving. See #1209, #1201. -* Fixed: Typography not outputting all styles when `all_styles` set to true. -* Fixed: 'Cannot send header' issues with typography. -* Fixed: Small fix for validation if subsection parent is free of errors, remove the red highlight when not - expanded. -* Fixed: Small CSS classes for flashing fonts where web-font-loader. -* Fixed: ASync Flash on fonts. FINALLY. What a pain. -* Fixed: 3+ JavaScript errors found in the background field. Now works flawlessly. -* Fixed: PHP warnings in background field. #1173. Thanks, @abossola. -* Fixed: CSS validation not respecting child selector symbol. #1162 -* Fixed: Extra check for typography bug. -* Fixed: Error css alignment issue with subsections. -* Fixed: javascript error in typography field. -* Fixed: Added a title to the google fonts stylesheet to fix validation errors. -* Fixed: One more slides field error check, and an extra JS goodie for an extension. -* Fixed: Leftover debug code messing up slides field. -* Fixed: More reliable saved action hook. -* Fixed: Removed erroneous debug output in link_color field. -* Modified: Dimension field default now accepts either `units` or `unit`. -* Modified: Google CSS moved into HEAD via WP enqueue. -* Modified: Now do a trim on all fields before validating. No need to alert because of a space... -* Modified: Typography field CSS completely rewritten. All thanks to @eplanetdesign! -* Modified: Validation now works in metaboxes as well as updates numbers as changes occur. Validation for - subsections is SO hot now. -* Modified: Various CSS fixes and improvements. -* Modified: Turned of mod_rewrite check. -* Modified: How errors are displayed, no longer dependent on the ID, now proper classes. -* Modified: Error notice stays until all errors are gone. Also updates it's number as errors fixed! -* Modified: Moved google font files to proprietary folder in upload to help with permission issues. - -= 3.2.8 = -* Fixed: Formatting of field files. Normalizing headers. -* Added: is_empty / empty / !isset AND not_empty / !empty / isset as required operations -* Fixed: Reset defaults error. -* Added: `show` argument to turn on and off input boxes in slider. -* Fixed: Required now works with muti-check fields and button set when set to multi. - -= 3.2.7 = -* Fixed: Import works again. A single line was missed... -* Fixed: link_color field not outputting CSS properly via compiler or output. Thanks @vertigo7x -* Fixed: Sorter field CSS. Buttons were all smushed together. -* Fixed: 'undefined' error in typography.js. Thanks @ksere. - -= 3.2.6 = -* Fixed: Another stray undefined index. Oy. -* Added: `open_expanded` argument to start the panel completely expanded initially. - -= 3.2.5 = -* Fixed: Various bad mistakes. Oy. - -= 3.2.4 = -* Fixed: Slight typography speed improvement. Less HTML hopefully faster page loads. -* Fixed: Unload error on first load if the typography defaults are not set. -* Fixed: Errors pertaining to mod_rewrite check. -* Fixed: All those headers already set errors. -* Added: $changed_values variable to save hooks denoting the old values on a save. -* Added: Pointers to Extensions on load. -* Modified: CSS Output for the background field. -* Fixed: Validation error messages not appearing on save. -* Modified: Speed boost on validation types. -* Added: Apache mod_rewrite check. This should solve many issues we've been seeing regarding mod_rewrite - not being enabled. -* Fixed: Sortable field not saving properly. -* Fixed: Erroneous data in admin.less -* Updated: sample-config.php. Sortable checkbox field example now uses true/false instead of text meant for - textbox example. - -= 3.2.3 = -* Fixed: Responsive issues with spacing and dimension fields. -* Fixed: Style conflicts with WP 3.9. Added register filter to fields via id. -* Fixed: Metaboxes issues. -* Fixed: Compiler hook in the customizer now passes the CSS. -* Fixed: Compiler hook now properly fires in the customizer. -* Fixed: Validation error with headers already being set. -* Fixed: Added mode for width/height to override dimensions css output. -* Fixed: Restoring lost formatting from multiple merges. -* Fixed: New sorter default values get set properly now. ;) -* Fixed: Removed erroneous 's' character from HTML. -* Fixed: Info field didn't intend within section. -* Fixed: Compiler hook wasn't running. -* Modified: Some admin panel stylings. Now perfect with mobile hover. Also fixed an issue with the slidedown - width for sections. No more 2 empty pixels. -* Added: `data` and `args` can now be set to sorter! Just make sure to have it be a key based on what you - want it to display as. IE: `array('Main'=>'sidebars')` -* Added: Prevent Redux from firing on AJAX heartbeat, but added hook for it 'redux/ajax/heartbeat'. -* Added: Tick mark if section has sub sections. Hidden when subsections expanded. -* Added: Check to make sure a field isn't empty after the filter. If it is empty, skip over it. -* Added: Subsections now show icon if they have it. Show text only (without indent) if they do not. -* Added: Set a section or field argument of `'panel' => false` to skip over that field or panel and hide it. - It will still be registered with defaults saved, but not display. This can be useful for things - like the customizer. -* Added: SUBSECTIONS! Just add `'subsection' => true` to any section that isn't a divide/callback and isn't - the first section in your panel. ;) - -= 3.2.1 = -* Fixed: Small bug in image_select javascript. -* Added: Import hook, just because we can. :) -* Fixed: Customizer preview now TRULY outputs CSS even if output_tag is set to false; -* Fixed: Reset section, etc. Discovered an odd WordPress thing. -* Fixed: Image_select size override. -* Fixed: Customizer save not firing the compiler hook. -* Fixed: Customizer not outputting CSS if output_tag is set to false. -* Fixed: Small empty variable check. Undefined index in the defaults generating function. -* Fixed: WP 3.9 update made editor field button look ugly. -* Fixed: Save hook not firing when save_default set to false. -* Fixed: Reset section anomalies. Maybe. -* Fixed: Array of values in required not recognized. -* Fixed: Updated hint defaults to prevent index warning. -* Fixed: Removed leftover debug code. -* Added: New readonly argument for text field. -* Fixed: Reset/Reset section actions hooks now fire properly. -* Fixed: When developer uses section field but does not specify an indent argument. -* Fixed: Dynamic URL for slides -* Fixed: Accidently removed reset action on section reset. Restored. -* Fixed: Section defaults bug for certain field types. -* Fixed: Dynamic URL if site URL changed now updates media properly if attachement exists. -* Fixed: Customizer now correctly does live preview. -* Fixed: Special enqueue case fix. -* Added: A few more hooks for defaults and options. -* Fixed: Small undefined index error. -* Added: Section key generation via title. -* Modified: File intending. -* Fixed: Custom menus not displaying options panel. -* Fixed: Single checkbox option not retaining checked value. -* Fixed: Border field returning bad CSS in CSS compiler. -* Fixed: Import/Export fix. Thanks, @CGlingener! - -= 3.2.0 = -* Added: Save warning now is sticky to the top and responsive. -* Fixed: Mobile fixes for Redux. Looks great on small screens how. -* Fixed: Slight CSS fixes. -* Fixed: Compiler fixes and added notices. -* Added: Import/Export more reasonable text. -* Added: `force_output` on the field level to bypass the required check that removes the output if the field is hidden. Thanks @rffaguiar. -* Fixed: Fully compatible with WordPress 3.9. Now it just works. ;) -* Fixed: Info and divide field now work with required. -* Added: Fallback. Now if the media, slides, or background URL doesn't match the site URL, but the attachment ID is present, the data is updated. -* Fixed: Last tab not properly set. Slow rendering. -* Modified: Replaced transients with cookies. Less DB queries. -* Fixed: Undefined variable issues for new required methods. -* Fixed: Default_show display error with a non-array being steralized. -* Added: Multiple required parent value checking! Booya! -* Fixed: Sections now fold with required. -* Fixed: select2 not rendering properly when dev_mode = false, because of ace_editor fix. -* Fixed: Removed mistakenly compiled test code from redux.js. -* Fixed: ace_editor not rendering properly in certain instances. -* Modified: Small change to import_export field in checking for existing instance of itself. -* Fixed: import_export not rendering when the menutype argument was set to menu -* Fixed: Ace_editor not enqueued unless used. MEMORY HOG. -* Fixed: Color_Gradient transparency to was being auto-selected if from way transparent. -* Fixed: Enqueue select with slider for local dev. -* Modified: removed add_submenu_page when creating a submenu for us in the WP admin area. WP approved API is used in it's place to being Redux up to wp.org theme check standards. -* Fixed: Massive speed issue with button_set. Resolved. -* Fixed: Issue where default values throws an error if ID is not set. -* Fixed: Continuing effort to ensure proper loading of config from child themes. -* Fixed: Import/Export array search bug if section['fields'] is not defined. -* Fixed: Inconsistencies in import/export across different versions of PHP. -* Fixed: Redux checks for child or parent theme exclusively before loading. - -= 3.1.9 = -* Fixed: Typography custom preview text/size not outputting. -* Fixed: No font selected in typography would default to 'inherit'. -* Fixed: Hint feature kicking back a notice if no title was specified. -* Fixed: Sortable field, when used a checkboxes, were all checked by default, even when set not to be. -* Fixed: button_set field not setting properly in multi mode. -* Fixed: Javascript console object not printing options object. -* Fixed: Load errors from child themes no longer occur. -* Fixed: Compiler output for slider field. -* Fixed: update_check produced a fatal error on a local install with no internet connection. -* Fixed: Compiler hook failing on slider. -* Fixed: Error on update_check when the response code was something other than 200. -* Fixed: image_select images not resizing properly in FF and IE. -* Fixed: Layout for the typography field, so everything isn't smushed together. The new layout is as follows: -* Fixed: link_color field showing notice on default, if user enters no defaults. -* Fixed: Fixed tab notice in framework.php if no tab parameter is set in URL. -* Fixed: Hide demo hook wasn't hiding demo links. -* Added: Admin notice for new builds of Redux on Github as they become available. This feature is available on in dev_mode, and may be turned off by setting the `update_notice` argument to false. See the Arguments page of the wiki for more details. -* Added: text-transform option for the typography field. -* Added: Newsletter sign-up popup at first load of the Redux options panel. -* Added: Added PHP 5.2 support for import/export. -* Added: Action hooks for options reset and options reset section. -* Added: Theme responsive for date picker. -* Added: New slider. Better looking UI, double handles and support for floating point values. See the wiki for more info. -* Added: Typography improvements. -* Added: Hints! More info: https://github.com/ReduxFramework/ReduxFramework/wiki/Using-Hints-in-Fields -* Added: Complete Wordpress admin color styles. Blessed LESS/SCSS mixins. ;) -* Added: Font family not required for the typography module any longer. -* Added: Support for using the divide field in folding. -* Added: Error trapping in typography.js for those still attempting to use typography with no font-family. -* Added: Full asynchronous font loading. -* Added: email_not_empty validation field. -* Modified: Typography word and letter spacing now accept negative values. -* Modified: Typography preview shows spaces between upper and lower case groupings. -* Modified: Google font CSS moved to header so pages will pass HTML5 validation. -* Modified: Removed Google font CSS line from header (because it's in the footer via wp_enqueue_style. -* Modified: RGBA Field stability. Thank you, @SilverKenn. -* Modified: Separated Import/Export from the core. It can now be used as a field. - [family-font] [backup-font] - [style] [script] [align] [transform] - [size] [height] [word space] [letter space] - [color] -* Reverted: email validation field only checks for valid email. not_empty check moved to new validation field. - -= 3.1.8 = -* Fixed: Improper enqueue in tracking class. -* Fixed: Few classes missed for various fields. -* Fixed: Spacing field kicking back notices and warnings when 'output' wasn't set. -* Modified: Added file_exists check to all include lines in framework.php -* Fixed: Background field now works with dynamic preview as it should. -* Fixed: Extension fields now enqueueing properly. -* Added: Text-align to typography field. -* Fixed: Servers returning forwards slashes in TEMPLATEPATH, while Redux is installed embedded would not show options menu. -* Fixed: On and Off for switch field not displaying language translation. -* Fixed: email validation allowing a blank field. -* Fixed: Now allow for empty values as valid keys. -* Added: Dismiss option to admin notices (internal function) - -= 3.1.7 = -* Fixed: Servers returning forwards slashes in TEMPLATEPATH, while Redux is installed embedded would not show options menu. -* Fixed: On and Off for switch field not displaying language translation. -* Fixed: email validation allowing a blank field. -* Added: Dismiss option to admin notices (internal function) -* Fixed: On and Off for switch field not displaying language translation. -* Fixed: email validation allowing a blank field. -* Added: Dismiss option to admin notices (internal function) - -= 3.1.6 = -* Fixed: CSS spacing issue -* Fixed: Customizer now works and doesn't break other customizer fields outside of Redux. -* Fixed: Several minor bug fixes -* Added: Metabox support via extension http://reduxframework.com/extensions/ -* Added: Admin-bar menu -* Fixed: Section field now folds. -* Fixed: wp_content_dir path now handles double forward slashes. -* Fixed: Typography field missing italics in Google fonts. -* Fixed: Default color in border field not saving properly. -* Fixed: hex2rgba in class.redux_helpers.php changed to static. -* Fixed: 'sortable' field type not saving options as default. -* Fixed: Specified default color not set when clicking the color box default button. -* Fixed: Sorter field options are now saved as default in database. -* Fixed: Issues with checkboxes displaying default values instead of labels. -* Fixed: Outstanding render issues with spacing field. -* Fixed: Plugins using Redux from load failure. -* Fixed: 'not_empty' field validation. -* Fixed: Media field. -* Added: 'read-only' option for media text field. -* Added: 'mode' option to image_select, so CSS output element may be specified. -* Added: Admin Bar menu for option panel. -* Modified: media field 'read-only' to 'readonly' to vonform to HTML standards. -* Modified: Removed raw_align field and added align option to raw field. See wiki for more info. -* Removed: EDD extension. It never belonged in Core and will be re-released as a downloadable extension shortly -* Removed: Group field, temporarily. -* Removed: wp_get_current_user check. See https://github.com/ReduxFramework/ReduxFramework/wiki/How-to-fix-%22Fatal-error%3A-Call-to-undefined-function-wp_get_current_user%28%29-%22 - -= 3.1.5 = -* Typography font arrays may not contain comma spaces. -* Merge in pull request - 542, code cleanup and better readability -* Change how HTML is output to support metaboxes -* CSS only on pages that matter, better checks. -* font-backup in typography now appends to font-family in output and compiler. -* More fixes for Google font css outputting. -* Addded output and compiler to field_image_select. Images will be output as 'background-image'. -* Fixed output in field_background. -* Prevent standard fonts from outputting to Google fonts CSS call. -* class_exists in field_section checking for incorrect classname. -* sample_config fix. -* Compiler not outputting CSS without output set to comthing other than false. -* Google fonts not rendering on frontend. -* Rewrote sample_config as a class - -= 3.1.4 = -* Fixed error in redux-framework.php. -* Added select_image field. - -= 3.1.3 = -* Fixed a few undefined variables -* Removed old code from the repo. -* Fix for validation. -* Remove the compiler hook by default. -* Fix to sortable field. -* Added an extra check for link color. Removes user error. -* Localization updates. -* Error in slides. -* Fixed the info box bug with spacing and padding. -* Fixed the first item in each section having WAY too much padding. ;) -* Fixed section reset issue where values weren't being saved to the db properly. - -= 3.1.2 = -* Feature - Sortable select boxes! -* Feature - Reset a section only or the whole panel! -* New Field - RGBA Color Field! -* Improvement - Use of REM throughout. -* Fixed Typography - Fix output option and various small bugs. -* Fixed Border - Fix output option and various small bugs. -* Fixed Dimensions - Fix output option and various small bugs. -* Fixed Image_select - Various small bugs. -* Fixed Slides - Various small bugs. -* Fixed Sortable - Using native jQuery UI library same as within WordPress. -* Fixed Slider and Spinner Input Field - Values now move to the closest valid value in regards to the step, automatically. -* Fixed Ace Editor -* FEATURE - All CSS/JS files are compiled into a single file now! Speed improvements for the backend. -* Fix in how WordPress data is received, improved some output. -* Fix for various fields not triggering fold/compiler/save. -* Fixed elusive icons to use the new version and classes. -* Fixed media thumb to only be the thumbnail version. -* Fixed admin https error with WordPress core not renaming URL. -* Placeholders throughout the framework are now properly there. -* Feature - Setting to not save defaults to database on load. -* Fixed - Computability issue with GT3 builder. -* Fixed localization issue with default values. -* Language - Added Russian -* Feature - Media now can have any content type passed in to limit content types. -* Allow negative values in typography and other fields. -* WordPress 3.8 computability. -* CSS validation issue. -* Feature - User contributed text direction feature. -* EDD Extension now fully function for plugins or themes. -* Removed get_theme_data() fallbacks, we're well pass WordPress 3.4 now. ;) -* A ton of other small updates and improvements. - - -= 3.1.0 = -* Fix Issue 224 - Image Select width was breaking the panel. -* Fix Issue 181 - Broken panel in firefox -* Fix Issue 225 - 0px typography bug. Thanks @partnuz. -* Fix Issue 228 - Resolved a duplicated enqueue on color_link field. Thanks @vertigo7x. -* Fix Issue 231 - Field spacing bug fixes. -* Fix Issue 232 & 233 - Dimensions: bug fix with units and multiple units. Thanks @kpodemski -* Fix Issue 234 - Pass options as a ref so validating actions can modify/sanitize them. Thanks @ZeroBeeOne -* Fix Issue 222 - Tab cookie function wasn't working. -* Feature - Pass params to Select2. Thanks @andreilupu -* Fix Issue 238 - Fix for conditional output. Thanks @partnuz. -* Fix Issue 211 - Google Web font wasn't loading at first init of theme. -* Fix Issue 210 - Elusive Icons update. Changed classes to force use of full elusive name. -* Fix Issue 247 - Media thumbnails were not showing. Also fixed media to keep the largest file, but display the small version in the panel as a thumb. Thanks @kwayyinfotech. -* Fix Issue 144 - JS error when no item found in slider. -* Fix Issue 246 - Typography output errors. -* Feature & Issue 259 - Multi-Text now support validation! -* Fix Issue 248/261 - Links color issue. Also fixed color validation. -* Feature & Issue 262 - Now registered sidebars can be used as a data type. -* Fix Issue 194/276 - Custom taxonomy terms now passing properly. Thanks @kprovance. -* Feature & Issue 273 - Argument save_defaults: Disable the auto-save of the default options to the database if not set. -* Feature - Docs now being moved to the wiki for community participation. -* Issue 283 - Date placeholder. Thanks @kprovance. -* Issue 285 - HTTPS errors on admin. Known WordPress bug. Resolved. -* Fix Issue 288 - Float values now possible for border, dimensions, and spacing. -* Feature - Media field can now accept non-image files with a argument being set. -* Fix Issue 252 - Post Type data wasn't working properly. Thanks @Abu-Taymiyyah. -* Fix Issue 213 - Radio and Button Set wasn't folding. - -= 3.0.9 = -* Feature - Added possibility to set default icon class for all sections and tabs. -* Feature - Make is to the WP dir can be moved elsewhere and Redux still function. -* Added Spanish Language. Thanks @vertigo7x. -* Fix Issue 5 - Small RGBA validation fix. -* Fix Issue 176 - Fold by Image Select. Thanks @andreilupu. -* Fix Issue 194 - Custom taxonomy terms in select field. -* Fix Issue 195 - Border defaults not working. -* Fix Issue 197 - Hidden elements were showing up on a small screen. Thanks @ThinkUpThemes. -* Fix issue 200 - Compiler not working with media field. -* Fix Issue 201 - Spacing field not using default values. -* Fix Issue 202 - Dimensions field not using units. -* Fix Issue 208 - Checkbox + Required issue. -* Fix Issue 211 - Google Font default not working on page load. -* Fix Issue 214 - Validation notice not working for fields. -* Fix Issue 181/224 - Firefox 24 image resize errors. -* Fix Issue 223 - Slides were losing the url input field for the image link. -* Fix - Various issues in the password field. -* Fixed various spelling issues and typos in sample-config file. -* Initialize vars before extract() - to shut down undefined vars wargnings. -* Various other fixes. - -= 3.0.8 = -* Version push to ensure all bugs fixes were deployed to users. Various. - -= 3.0.7 = -* Feature - Completely redone spacing field. Choose to apply to sides or all at once with CSS output! -* Feature - Completely redone border field. Choose to apply to sides or all at once with CSS output! -* Feature - Added opt-in anonymous tracking, allowing us to further analyze usage. -* Feature - Enable weekly updates of the Google Webfonts cache is desired. Also remove the Google Webfont files from shipping with Redux. Will re-download at first panel run to ensure users always have the most recent copy. -* Language translation of german updated alone with ReduxFramework pot file. -* Fix Issue 146 - Spacing field not storing data. -* Fix - Firefox field description rendering bug. -* Fix - Small issue where themes without tags were getting errors from the sample data. - -= 3.0.6 = -* Hide customizer fields by default while still under development. -* Fix Issue 123 - Language translations to actually function properly embedded as well as in the plugin. -* Fix Issue 151 - Media field uses thumbnail not full image for preview. Also now storing the thumbnail URL. Uses the smallest available size as the thumb regardless of the name. -* Fix Issue 147 - Option to pass params to select2. Contributed by @andreilupu. Thanks! -* Added trim function to ace editor value to prevent whitespace before and after value keep being added -* htmlspecialchars() value in pre editor for ace. to prevent html tags being hidden in editor and rendered in dom -* Feature: Added optional 'add_text' argument for multi_text field so users can define button text. -* Added consistent remove button on multi text, and used sanitize function for section id -* Feature: Added roles as data for field data -* Feature: Adding data layout options for multi checkbox and radio, we now have quarter, third, half, and full column layouts for these fields. -* Feature: Eliminate REDUX_DIR and REDUX_URL constants and instead created static ReduxFramework::$_url and ReduxFramework::$_dir for cleaner code. -Feature: Code at bottom of sample-config.php to hide plugin activation text about a demo plugin as well as code to demo how to hide the plugin demo_mode link. -* Started work on class definitions of each field and class. Preparing for the panel builder we are planning to make. - -= 3.0.5 = -* Fixed how Redux is initialised so it works in any and all files without hooking into the init function. -* Issue #151: Added thumbnails to media and displayed those instead of full image. -* Issue #144: Slides had error if last slide was deleted. -* Color field was outputting hex in the wrong location. -* Added ACE Editor field, allowing for better inline editing. - -= 3.0.4 = -* Fixed an odd saving issue. -* Fixed link issues in the framework -* Issue #135: jQuery UI wasn't being properly queued -* Issue #140: Admin notice glitch. See http://reduxframework.com/2013/10/wordpress-notifications-custom-options-panels/ -* Use hooks instead of custom variable for custom admin CSS -* Added "raw" field that allows PHP or a hook to embed anything in the panel. -* Submenus in Admin now change the tabs without reloading the page. -* Small fix for multi-text. -* Added IT_it and RO_ro languages. -* Updated readme file for languages. - -= 3.0.3 = -* Fixed Issue #129: Spacing field giving an undefined. -* Fixed Issue #131: Google Fonts stylesheet appending to body and also to the top of the header. Now properly placed both at the end of the head tag as to overload any theme stylesheets. -* Fixed issue #132 (See #134, thanks @andreilupu): Could not have multiple WordPress Editors (wp_editor) as the same ID was shared. Also fixed various styles to match WordPress for this field. -* Fixed Issue #133: Issue when custom admin stylesheet was used, a JS error resulted. - -= 3.0.2 = -* Improvements to slides, various field fixes and improvements. Also fixed a few user submitted issues. - -= 3.0.1 = -* Backing out a bit of submitted code that caused the input field to not properly break. - -= 3.0.0 = -* Initial WordPress.org plugin release. - -= 3.0 = -Redux is now hosted on WordPress.org! Update in order to get proper, stable updates. - - -== Attribution == - -Redux is was originally based off the following frameworks: - -* [NHP](https://github.com/leemason/NHP-Theme-Options-Framework) -* [SMOF](https://github.com/syamilmj/Options-Framework "Slightly Modified Options Framework") - -It has now a completely different code base. If you like what you see, realize this is a labor of love. Please [donate to the Redux Framework](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=N5AD7TSH8YA5U) if you are able. diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/color-picker/color-picker.css b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/color-picker/color-picker.css deleted file mode 100755 index adf0cc46..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/color-picker/color-picker.css +++ /dev/null @@ -1 +0,0 @@ -.redux-main input.redux-color{float:left;width:70px;margin-left:5px}.redux-main input.color-transparency{margin-left:10px;margin-right:3px}.redux-main input.wp-color-picker{width:80px !important}.redux-main .section-color .controls{width:345px}.redux-main .section-color .explain{width:225px}.redux-main .iris-picker .iris-strip .ui-slider-handle{position:absolute;background:none !important;right:-3px;left:-3px;border:4px solid #aaa !important;border-width:4px 3px;width:auto;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,0.2);opacity:.9;z-index:5;cursor:ns-resize}.redux-main .iris-picker .iris-slider-offset{position:absolute;top:2px;left:0;right:0;bottom:4px;width:28px;background:none !important;border:0 !important;height:auto}.redux-main .wp-picker-container input{margin-bottom:inherit;margin-top:inherit;padding:3px 5px}.redux-main .wp-picker-container .wp-color-result{outline:0;margin:0}.redux-main .wp-picker-container .wp-picker-default{padding:0 10px 1px}.redux-main .redux-color-gradient{line-height:24px}.redux-main .color-transparency-check{line-height:1;margin-top:0px !important}.redux-main .wp-picker-clear{margin-top:0 !important}.wp-customizer .redux-main input.wp-picker-default,.wp-customizer .redux-main .redux-typography-container input.wp-picker-default,.wp-customizer .redux-main .redux-typography-container .redux-typography-color{padding:0px 4px !important}.wp-customizer .redux-main input.wp-color-picker{width:65px !important;margin-left:5px !important} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/color-picker/color-picker.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/color-picker/color-picker.scss deleted file mode 100755 index 8c8159c5..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/color-picker/color-picker.scss +++ /dev/null @@ -1,97 +0,0 @@ -.redux-main { - input{ - &.redux-color { - float: left; - width: 70px; - margin-left: 5px; - } - - &.color-transparency { - margin-left: 10px; - margin-right: 3px; - } - - &.wp-color-picker { - width: 80px !important; - } - } - - .section-color { - .controls { - width: 345px; - } - - .explain { - width: 225px; - } - } - - .iris-picker { - .iris-strip .ui-slider-handle { - position: absolute; - background: none !important; - right: -3px; - left: -3px; - border: 4px solid #aaa !important; - border-width: 4px 3px; - width: auto; - border-radius: 4px; - box-shadow: 0 1px 2px rgba(0, 0, 0, .2); - opacity: .9; - z-index: 5; - cursor: ns-resize; - } - - .iris-slider-offset { - position: absolute; - top: 2px; - left: 0; - right: 0; - bottom: 4px; - width: 28px; - background: none !important; - border: 0 !important; - height: auto; - } - } - - .wp-picker-container { - input { - margin-bottom: inherit; - margin-top: inherit; - padding: 3px 5px; - } - - .wp-color-result { - outline: 0; - margin: 0; - } - - .wp-picker-default { - padding: 0 10px 1px; - } - } - - .redux-color-gradient { - line-height: 24px; - } - - .color-transparency-check { - line-height: 1; - margin-top: 0px !important; - } - - .wp-picker-clear { - margin-top: 0 !important; - } -} - -.wp-customizer { - .redux-main input.wp-picker-default, .redux-main .redux-typography-container input.wp-picker-default, .redux-main .redux-typography-container .redux-typography-color { - padding: 0px 4px !important; - } - .redux-main input.wp-color-picker { - width: 65px !important; - margin-left: 5px !important; - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/import_export/import_export.css b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/import_export/import_export.css deleted file mode 100755 index 70f310d3..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/import_export/import_export.css +++ /dev/null @@ -1 +0,0 @@ -#redux-import-link-wrapper,#redux-import-code-wrapper{display:none}#redux-export-code,#redux-export-link-value{display:none}#redux-import-action span{color:#B94A48} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/media/media.css b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/media/media.css deleted file mode 100755 index 737309c1..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/media/media.css +++ /dev/null @@ -1 +0,0 @@ -.redux-main .button.remove-image,.redux-main .removeCSS{margin-left:10px;color:#ef521d}.redux-main .button.remove-image:hover,.redux-main .removeCSS:hover{color:red}.redux-main .upload_button_div{margin-bottom:5px}.redux-main .upload-error{float:left;color:#666;font-size:10px;font-weight:bold;text-decoration:none;text-shadow:1px 1px 0 #FFFFFF;margin:0 10px 0 0;padding:3px 10px;background:#FFDFEC;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.redux-main .reset-button{font-family:Arial, Verdana, sans-serif;float:left;margin:0;color:#ef521d;border-color:#bbb}.redux-main .redux-option-image{max-height:340px;max-width:340px;padding:5px;margin-bottom:0;margin-top:10px;margin-right:15px;border:1px solid #e3e3e3;background:#f7f7f7;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.redux-main .redux-main .upload{width:80% !important}.redux-main .button{margin-top:2px} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/media/media.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/media/media.scss deleted file mode 100755 index 86086aed..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/media/media.scss +++ /dev/null @@ -1,61 +0,0 @@ -.redux-main { - .button.remove-image, - .removeCSS { - margin-left: 10px; - color: #ef521d; - - &:hover { - color: red; - } - } - - .upload_button_div { - margin-bottom: 5px; - } - - .upload-error { - float: left; - color: #666; - font-size: 10px; - font-weight: bold; - text-decoration: none; - text-shadow: 1px 1px 0 #FFFFFF; - margin: 0 10px 0 0; - padding: 3px 10px; - background: #FFDFEC; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - - .reset-button { - font-family: Arial, Verdana, sans-serif; - float: left; - margin: 0; - color: #ef521d; - border-color: #bbb; - } - - .redux-option-image { - max-height: 340px; - max-width: 340px; - padding: 5px; - margin-bottom: 0; - margin-top: 10px; - margin-right: 15px; - border: 1px solid #e3e3e3; - background: #f7f7f7; - -moz-border-radius: 3px; - -khtml-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - } - - .redux-main .upload { - width: 80% !important; - } - - .button { - margin-top: 2px; - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-admin.css b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-admin.css deleted file mode 100755 index 969ab04d..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-admin.css +++ /dev/null @@ -1 +0,0 @@ -.spinner{visibility:hidden;display:block}.spinner.is-active{visibility:visible}.redux-main .description{margin-top:7px}.form-table>tbody>tr>th{width:30%}.redux-container{background-color:#f5f5f5;background-repeat:repeat-x;background-image:-moz-linear-gradient(top, #f2f2f2 0%, #f5f5f5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #f2f2f2), color-stop(100%, #f5f5f5));background-image:-webkit-linear-gradient(top, #f2f2f2 0%, #f5f5f5 100%);background-image:-ms-linear-gradient(top, #f2f2f2 0%, #f5f5f5 100%);background-image:-o-linear-gradient(top, #f2f2f2 0%, #f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#eeeeee', GradientType=0);background-image:-linear-gradient(top, #f2f2f2 0%, #f5f5f5 100%);border:1px solid #dedede;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.04);box-shadow:0 1px 1px rgba(0,0,0,0.04);-moz-box-shadow:0 1px 5px rgba(0,0,0,0.4);margin-top:5px;overflow:hidden}.redux-container a:focus{box-shadow:none}.redux-container #redux-header,.redux-container #redux-footer{text-align:right;padding:6px 10px}.redux-container #redux-header{background:#f1f1f1;border-bottom:3px solid blue}.redux-container #redux-header .display_header{float:left;margin:20px 10px}.redux-container #redux-header .display_header h2{display:inline-block;font-style:normal;padding-right:5px}.redux-container #redux-header .display_header .redux-dev-mode-notice-container{position:absolute;top:67px;left:20px;bottom:auto;width:auto}.redux-container #redux-header .display_header span{color:#888}.redux-container #redux-header .display_header span.redux-dev-mode-notice{background-color:#f0ad4e;display:inline;padding:.2em .5em .2em;font-weight:700;line-height:1;color:#fff !important;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.redux-container #redux-header .icon32{float:right;margin:16px 16px 0}.redux-container #redux-footer{border-top:1px solid #E7E7E7;z-index:999}.redux-container #redux-footer #redux-share{float:left;line-height:28px;font-size:15px}.redux-container #redux-footer #redux-share a{text-decoration:none;margin-right:10px}.redux-container #redux-footer #redux-share a img{margin-bottom:-3px}.redux-container .notice-green{margin:0;border-bottom:1px solid #E7E7E7;background-color:#DFF0D8;color:#468847;padding:8px 35px 8px 14px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.redux-container .notice-blue{margin:0;border-bottom:1px solid #BCE8F1;background-color:#D9EDF7;color:#3A87AD;padding:8px 35px 8px 14px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.redux-container .notice-yellow{margin:0;border-bottom:1px solid #E7E7E7;background-color:#FCF8E3;color:#C09853;padding:8px 35px 8px 14px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.redux-container .notice-red,.redux-container .redux-field-errors{margin:0;border-bottom:1px solid #E7E7E7;background-color:#F2DEDE;color:#B94A48;padding:8px 35px 8px 14px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.redux-container .redux-field-error input,.redux-container .redux-field-error textarea,.redux-container .redux-field-error checkbox{background-color:#FFF6F6;color:#A00}.redux-container .redux-field-warning input,.redux-container .redux-field-warning textarea,.redux-container .redux-field-warning checkbox{background-color:#fcf8e3;color:#444}.redux-container .redux-field-errors,.redux-container .redux-field-warnings,.redux-container .redux-save-warn{display:none}.redux-container .sticky-save-warn{min-height:76px}.redux-container .sticky-save-warn .redux-save-warn{position:fixed;top:32px;right:21px;left:183px;opacity:1;z-index:9999}.redux-container #info_bar{background:#f3f3f3;border-bottom:1px solid #dedede;padding:6px 10px 6px 6px;text-align:right;-moz-box-shadow:inset 0 1px 0 #fcfcfc;-webkit-box-shadow:inset 0 1px 0 #fcfcfc;box-shadow:inset 0 1px 0 #fcfcfc}.redux-container .redux-group-tab{display:none;margin-bottom:15px}.redux-container .redux-group-tab .redux-theme-data{padding:20px 0;border-top:1px solid #E7E7E7}.redux-container .redux-group-tab .redux-theme-data.theme-description{padding:10px 0;border-width:0}.redux-container .redux-group-tab .redux-theme-data.theme-uri,.redux-container .redux-group-tab .redux-theme-data.theme-author,.redux-container .redux-group-tab .redux-theme-data.theme-version{padding:0;border-width:0}.redux-container .redux-group-tab h3{margin-top:0;line-height:2em;border-bottom:1px solid #E7E7E7}.redux-container .redux-group-tab .redux-section-desc{margin-bottom:15px;color:#666}.redux-container .redux-action_bar{float:right}.redux-container .redux-action_bar .spinner{float:left;margin-top:4px}.redux-container .redux-ajax-loading{display:none;background:red url(data:image/gif;base64,R0lGODlhEAAQAPUAAIiIiIqKio2NjZSUlJqamp6enqKioqSkpK+vr7i4uL+/v8PDw8XFxcnJyc/Pz9HR0dTU1NjY2Nzc3OLi4ubm5unp6ezs7PPz88vLy83NzdDQ0NXV1d3d3eHh4bu7u8zMzOvr6+3t7ZiYmNbW1sDAwMTExNra2s7OztPT09vb2+Xl5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/i1NYWRlIGJ5IEtyYXNpbWlyYSBOZWpjaGV2YSAod3d3LmxvYWRpbmZvLm5ldCkAIfkEAAoA/wAsAAAAABAAEAAABXDgJY6XZZEoOTnOlI5WdUFNA5UnSR3FJNUSieFAIUUEgcdl4noEBBGSZaHIiSqKhTX2GhVFiQGjuxgkSoYAoosAGE6RhKQrUURHlS+pItMVCHMjEgQ9JBJISg+JT3ciFg4NFkcCNw0OViiDgF0oTC8hACH5BAAKAP8ALAAAAAAQABAAAAVx4CWOZGle1qJYp2hV1xYE29V1JXUYHWUcnQgGwyFFBAENiqUZ1kapFamTyeBcsNOLMkoMGC3GIIEyBBAtRMDAiiSKp04iQqpwc9kRpUCAizgEBVciEQNJFxpKGgECdFAYYBsCAjUMGS0XgAODmDacIyEAIfkEAAoA/wAsAAAAABAAEAAABnbAi3BILBovIMUidBSGQJdNIKBBMomUg6FDMRgoHcOBQowIqNaLJiCIEEMLxdWpnIfITRAHnxgwjiEfDR8UIQYBCEcgDYwdUR6ORxEfG3MgeFiFRB0FBBxEHAQFkUJmaBofamxuRB9/GwICGxeMTRehnrabpERBACH5BAAKAP8ALAAAAAAQABAAAAZ9wItwSCwaL5aFwnIUWiqXUSAwulSYRMrB0KEYDJSO4UAhRgQBDZLpCAgixOSSWFEssEho81IWJgYMTQwDCUgGAQhNCAEGTCMJHU0dCXBDFX1DFhwdeHwFIhxmGBihQxEDaRcOGhYao1WZGIFnAiMUDg6YRR0ioE57Fx2RRkEAIfkEAAoA/wAsAAAAABAAEAAABXLgJY5kaV7WolinaLGQEEBXxZLUUUyUYVATw4FCisg0NZYmIIiQUosKqaJY3FDS1oUoSgwYrcUggTIAEC1EwMCKJCatSYI2qnBx2dGkQOCQOAQFdxdGARoVGhCITE4kGBgWEI8QFgwYWhGTWiMWERFXIyEAIfkEAAoA/wAsAAAAABAAEAAABn/Ai3BILBovloXCchRaKpdRIDC6VJhEysHQoRgMlI7hQCFGBAENkukICCLE5JJYUSywSGjzUhYmBgxNDAMJSAYBCE0IAAZMEQkdTRwKVUMcHHhCFXpDERgYcJYEBZFDI58aFhoOFxpuoUIUGhoUZwJVGA6ZaxccBAQce0QdpUVBACH5BAAKAP8ALAAAAAAQABAAAAZ8wItwSCwaLyEFKXQUhioXSCAAuVSYRMrB0KEYDJSO4UAhmgQBDZKpCQhMxFBJgRVWlFkOtElhUj4NH3VEJQMJFx0NintFCAEGISEQH3BHHR5VThVlRRSMQh0FBBxEHAQFnEJnaRcfHxdtb0WKIWcCVSUNTYgEo7tEHR1HQQAh+QQACgD/ACwAAAAAEAAQAAAGdcCLcEgsGi8hhSJ0FHY6l1EgMLqAmEROo5HqGAwqL5g42qKsoAsqIEgRVacTdAhSLLBI1bWpwiYGDE0MAwlIBgEITQgBBkwjCRxNHQlVdCpGekUqBQSRQxwEBZdDKQIBZ3FqbG5EDYEjpikhW3hFoJ1NRU9HQQA7) no-repeat;width:16px;height:16px;margin:3px 4px 0;float:right}.redux-container #redux-intro-text{background:#f3f3f3;border-bottom:1px solid #dedede;-moz-box-shadow:inset 0 1px 0 #fcfcfc;-webkit-box-shadow:inset 0 1px 0 #fcfcfc;box-shadow:inset 0 1px 0 #fcfcfc;padding:3px;padding:10px 10px}.redux-container #redux-intro-text p{margin:0;font-family:"Lucida Grande", Sans-serif;color:#888}.redux-container .expand_options{cursor:pointer;display:block;height:22px;width:21px;float:left;font-size:0;text-indent:-9999px;margin:1px 0 0 5px;border:1px solid #bbb;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAyCAIAAAAm4OfBAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQhJREFUeNrslT0KhDAQhTeLR7ATT6IXSKGFYO0lciFrO1N4AU8TLNXKv0CaJbLJRAZxl1hYyJuXN+PoR/Z9fyFdBNNr27Zf8Oq6bhgGSGUYhpTSzyeBNi8hRFVVEK+6rrXaQFOs6yrvTdOYjcqyVEpTLqXI89yaSypBudq2xckF2TipOSvfmmhZFuAGnJV6Licvey5gj7fnwpwXvEfLfqnT0jQ1OBJCQLnUBvZ9b85VFAV076UU8g1ZckVRxBiDzD6OY62WzPOM9i+cpunvvcZxfCQfPWs9a91Ym2UZ5xyHtd/e8hXWng+/zlrD9jmz1tDj7bkw5wXv0Y210itJEs9az9oHsPYQYACveK0/IuB51AAAAABJRU5ErkJggg==) no-repeat -2px -26px}.redux-container .expand_options.expanded{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAyCAIAAAAm4OfBAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQhJREFUeNrslT0KhDAQhTeLR7ATT6IXSKGFYO0lciFrO1N4AU8TLNXKv0CaJbLJRAZxl1hYyJuXN+PoR/Z9fyFdBNNr27Zf8Oq6bhgGSGUYhpTSzyeBNi8hRFVVEK+6rrXaQFOs6yrvTdOYjcqyVEpTLqXI89yaSypBudq2xckF2TipOSvfmmhZFuAGnJV6Licvey5gj7fnwpwXvEfLfqnT0jQ1OBJCQLnUBvZ9b85VFAV076UU8g1ZckVRxBiDzD6OY62WzPOM9i+cpunvvcZxfCQfPWs9a91Ym2UZ5xyHtd/e8hXWng+/zlrD9jmz1tDj7bkw5wXv0Y210itJEs9az9oHsPYQYACveK0/IuB51AAAAABJRU5ErkJggg==) no-repeat -2px -1px}.redux-container .expand_options:hover{border-color:#888}.redux-container .sticky-footer-fixed{background:#f3f3f3;border-top:1px solid #dedede !important;-moz-box-shadow:inset 0 1px 0 #fcfcfc;-webkit-box-shadow:inset 0 1px 0 #fcfcfc;box-shadow:inset 0 1px 0 #fcfcfc}.redux-container .redux-sidebar,.redux-container .redux-main{min-height:300px}.no-js{border:1px solid #ffbaba;margin:0;border-bottom:1px solid #E7E7E7;background-color:#F2DEDE;color:#B94A48;padding:8px 35px 8px 14px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.redux-main{background:#FCFCFC;margin-left:201px;border-left:1px solid #D8D8D8;padding:10px 20px;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #FFF;box-shadow:inset 0 1px 0 #FFF;position:relative}.redux-main #redux_ajax_overlay{position:absolute;top:0;left:0;right:0;bottom:0;-moz-opacity:0.10;-khtml-opacity:0.10;opacity:0.10;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=10);filter:alpha(opacity=10);background:#000;z-index:200;display:none}.redux-main .form-table.no-border{border-top:none}.redux-main .form-table tr{border-bottom:1px solid #E7E7E7}.redux-main .form-table tr:last-child{border-bottom:none !important}.redux-main .form-table tr th,.redux-main .form-table tr td{color:#333}.redux-main .form-table tr td table.mceLayout,.redux-main .form-table tr td table.mceLayout tr,.redux-main .form-table tr td table.mceLayout tr td{padding:0;border-width:0}.redux-main .form-table tr td .redux-th-warning{font-size:1em;color:#C09853;font-weight:normal;display:block;margin-top:10px}.redux-main .form-table tr td .redux-field-warning{border-color:#C09853;margin-top:10px}.redux-main .form-table tr td .redux-th-error{font-size:1em;color:#B94A48;font-weight:normal;display:block;margin-top:10px}.redux-main input.large-text{width:100%}.redux-main .hide{display:none}.redux-main .redux-field-container{padding:20px 0}.redux-main .mini,.redux-main input[type=text].mini{width:60px;text-align:center}.redux-main input{line-height:19px}.redux-main img{max-width:100%;height:auto;width:auto !important}.redux-main .select2-default{width:auto !important}.redux-main .showDefaults{display:block;font-weight:normal;font-size:.8em;color:#888}.redux-main span.description{display:block;font-style:normal;font-weight:400}.redux-main #redux-system-info textarea{min-height:730px;width:100%}.redux-main .field-desc{clear:both;font-size:13px}.redux-main .data-full li{width:100%}.redux-main .data-half li{width:50%;float:left}.redux-main .data-third li{width:33.3%;float:left}.redux-main .data-quarter li{width:25%;float:left}.redux-main .ui-helper-hidden-accessible{top:inherit}.redux-main .form-table{clear:none;margin-top:0px !important}.redux-main .form-table tr:first-child th,.redux-main .form-table tr:first-child td{padding-top:0}.redux-main .input-append input{border-right:0;margin-bottom:0;border-top-right-radius:0;border-bottom-right-radius:0;margin-right:0;float:left;margin-top:0;display:block}.redux-main .input-append .add-on{border-top-right-radius:3px;border-bottom-right-radius:3px;margin-left:-2px;padding-top:4px !important;padding-bottom:2px !important}.redux-main .input-prepend input{border-left:0;margin-bottom:0;border-top-left-radius:0;border-bottom-left-radius:0;margin-left:0;padding-top:2px;padding-bottom:5px;float:left;margin-top:0;display:block}.redux-main .input-prepend .add-on{border-top-left-radius:3px;border-bottom-left-radius:3px;float:left}.redux-main .input-append{margin-right:10px;font-size:0;white-space:nowrap;float:left;display:inline-block;margin-bottom:6px}.redux-main .input-append .add-on,.redux-main .input-prepend .add-on{width:auto;display:inline-block;min-width:16px;padding:3px 4px;font-size:12px;font-weight:400;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #cccccc}.redux-main .input-prepend{font-size:0;white-space:nowrap;float:left;display:inline-block;margin-bottom:6px}.redux-sidebar{width:202px;float:left}.redux-sidebar .redux-group-menu{margin-top:0 !important}.redux-sidebar .redux-group-menu li{margin-top:0}.redux-sidebar .redux-group-menu li.active a,.redux-sidebar .redux-group-menu li.active a:hover,.redux-sidebar .redux-group-menu li.activeChild a,.redux-sidebar .redux-group-menu li.activeChild a:hover{background:#FCFCFC;color:#269ad6;width:184px;opacity:1}.redux-sidebar .redux-group-menu li.active a li a{background:#333;padding-left:5px}.redux-sidebar .redux-group-menu li.divide{padding:0;border-width:1px 0;border-style:solid;border-bottom-color:#E7E7E7;border-top-color:#F9F9F9}.redux-sidebar .redux-group-menu li a:first-child{border-top:none}.redux-sidebar .redux-group-menu li a{display:block;padding:10px 4px 10px 14px;background:#e0e0e0;background:transparent;border-width:1px 0;border-style:solid;border-bottom-color:#E7E7E7;border-top-color:#F9F9F9;opacity:0.7;color:#555;font-weight:600;text-decoration:none;-webkit-transition:none;transition:none}.redux-sidebar .redux-group-menu li a.custom-tab{background:#f6f6f6}.redux-sidebar .redux-group-menu li a img{width:16px;height:16px;position:absolute;left:15px}.redux-sidebar .redux-group-menu li a:hover{background:#e5e5e5;color:#777;opacity:1}.redux-sidebar .redux-menu-warning,.redux-sidebar .redux-menu-error,.redux-sidebar .hasSubSections .extraIconSubsections{display:inline-block;float:right;padding:6px 7px 4px 7px;margin-left:4px;font-family:sans-serif;font-size:9px;font-weight:600;line-height:9px;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;border:0 solid transparent}.redux-sidebar .redux-menu-warning i,.redux-sidebar .redux-menu-error i,.redux-sidebar .hasSubSections .extraIconSubsections i{margin-left:-3px;margin-top:-3px}.redux-sidebar .redux-menu-error{background-color:#b94a48;color:#f2dede}.redux-sidebar .redux-menu-warning{background-color:#C09853;color:#FCF8E3}.redux-sidebar ul .subsection{display:none}.redux-sidebar .redux-group-tab-link-a{position:relative;outline:0}.redux-sidebar .redux-group-tab-link-a i{vertical-align:middle;font-size:1.35em;position:absolute}.redux-sidebar .redux-group-tab-link-a span{display:block}.redux-sidebar .redux-group-tab-link-a span.group_title{padding-left:30px}.redux-sidebar .redux-group-tab-link-li a.hasError span.group_title{padding-right:25px}.redux-sidebar #redux-header{text-align:center}.redux-sidebar #redux-header .display_header{float:none}.form-table th,.form-table td{margin:0;padding:0;width:auto}.redux_field_th{font-weight:600;padding:20px 10px 20px 0px;display:block}.redux_field_th span:first-child{font-weight:normal;display:block;color:#666}.farb-popup-wrapper{position:relative;display:block}.farb-popup{position:absolute;left:40px;top:40px;background-color:white;border:1px solid #222;padding:5px;z-index:100}#ui-datepicker-div{display:none}.mp6 .icon-themes{display:none}.mp6 .redux-container #info_bar{padding:6px 10px 6px 6px}.mp6 .redux-container #info_bar a{margin-top:2px}.redux-timer{text-align:center;font-size:10px;color:#888}.wrap{margin-top:0}@media screen and (max-width: 600px){.redux-sidebar{width:44px}.redux-sidebar .extraIconSubsections{display:none !important}.redux-sidebar .redux-group-menu li a,.redux-sidebar .redux-group-menu li a:hover,.redux-sidebar .redux-group-menu li.active a,.redux-sidebar .redux-group-menu li.active a:hover,.redux-sidebar .redux-group-menu li.activeChild a,.redux-sidebar .redux-group-menu li.activeChild a:hover{width:auto}.redux-sidebar .redux-group-tab-link-a{position:relative}.redux-sidebar .redux-group-tab-link-a i{position:inherit}.redux-sidebar .redux-group-tab-link-a span{display:none;position:absolute;top:0;left:44px;padding:12px;width:200px;background:#eeeeee;border:1px solid #ccc;-webkit-box-shadow:2px 2px 8px rgba(0,0,0,0.2);-moz-box-shadow:2px 2px 8px rgba(0,0,0,0.2);box-shadow:2px 2px 8px rgba(0,0,0,0.2);border-width:1px 1px 1px 0px;z-index:3}.redux-sidebar .redux-group-tab-link-a:hover>span{display:block}.redux-main{margin-left:43px;width:auto;max-width:100%}table.form-table,.form-table>thead,.form-table>tbody,.form-table>tbody>tr>th,.form-table>tbody>tr>td,.form-table>tbody>tr{display:block;width:100% !important;padding:0px !important}.form-table>tbody>tr>th,.form-table>tbody>tr>td{padding:10px !important}.form-table>tbody>tr>th,.form-table>tbody>tr>td{padding:10px !important}}@media screen and (max-width: 782px){.form-table>tbody>tr>th{width:100%}.redux_field_th{padding-bottom:0}.mp6 .redux-container #info_bar{height:auto;padding-bottom:1px}.mp6 .redux-container #info_bar a{margin-top:5px}.redux-container-switch label{padding:5px 10px !important}.redux-container-button_set label{padding:12px 10px}.redux-container #redux-footer #redux-share{line-height:34px}}pre{overflow:hidden}#redux-header h2{color:#fff}.admin-color-fresh .button.ui-datepicker-current,.admin-color-fresh button.ui-datepicker-close,.wp-customizer .button.ui-datepicker-current,.wp-customizer button.ui-datepicker-close{background-color:#007db9 !important}.admin-color-fresh .ui-datepicker-buttonpane button.ui-datepicker-current,.wp-customizer .ui-datepicker-buttonpane button.ui-datepicker-current{background:#1e8cbe !important;color:white !important;border:1px solid #104b66 !important}.admin-color-fresh .ui-datepicker-header .ui-icon,.wp-customizer .ui-datepicker-header .ui-icon{background-image:url(data:image/png;base64,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) !important}.admin-color-fresh .ui-datepicker-header,.wp-customizer .ui-datepicker-header{background-color:#23282d !important;color:white !important}.admin-color-fresh .ui-datepicker td .ui-state-active,.wp-customizer .ui-datepicker td .ui-state-active{background-color:#007db9 !important;color:white !important}.admin-color-fresh .ui-datepicker td .ui-state-hover,.wp-customizer .ui-datepicker td .ui-state-hover{color:#007db9 !important}.admin-color-fresh .ui-datepicker td .ui-state-highlight,.wp-customizer .ui-datepicker td .ui-state-highlight{background:#0073aa !important;border:1px solid #23282d !important;color:white !important}.admin-color-fresh .redux-container-switch .cb-disable,.admin-color-fresh .redux-container-switch .cb-enable,.admin-color-fresh .ui-state-default,.admin-color-fresh .ui-widget-content .ui-state-default,.admin-color-fresh .ui-widget-header .ui-state-default,.wp-customizer .redux-container-switch .cb-disable,.wp-customizer .redux-container-switch .cb-enable,.wp-customizer .ui-state-default,.wp-customizer .ui-widget-content .ui-state-default,.wp-customizer .ui-widget-header .ui-state-default{background-color:#f5f5f5 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#f8f8f8), to(#f5f5f5)) !important;background-image:-moz-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-ms-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #f8f8f8), color-stop(100%, #f5f5f5)) !important;background-image:-webkit-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-o-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-linear-gradient(top, #f8f8f8, #f5f5f5) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8', endColorstr='#f5f5f5', GradientType=0) !important;border-color:#ccc !important}.admin-color-fresh .ui-datepicker td .ui-state-active,.wp-customizer .ui-datepicker td .ui-state-active{color:black !important;font-weight:700 !important;background:white !important}.admin-color-fresh .redux-container-switch .cb-disable.selected,.wp-customizer .redux-container-switch .cb-disable.selected{background-color:#646464 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#929292), to(#646464)) !important;background-image:-moz-linear-gradient(top, #929292, #646464) !important;background-image:-ms-linear-gradient(top, #929292, #646464) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #929292), color-stop(100%, #646464)) !important;background-image:-webkit-linear-gradient(top, #929292, #646464) !important;background-image:-o-linear-gradient(top, #929292, #646464) !important;background-image:-linear-gradient(top, #929292, #646464) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#929292', endColorstr='#646464', GradientType=0) !important;border-color:#767676 !important}.admin-color-fresh .redux-container-switch .cb-enable.selected,.admin-color-fresh .redux-field-container .ui-buttonset .ui-state-active,.wp-customizer .redux-container-switch .cb-enable.selected,.wp-customizer .redux-field-container .ui-buttonset .ui-state-active{background-color:#0073aa !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#008bce), to(#0073aa)) !important;background-image:-moz-linear-gradient(top, #008bce, #0073aa) !important;background-image:-ms-linear-gradient(top, #008bce, #0073aa) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #008bce), color-stop(100%, #0073aa)) !important;background-image:-webkit-linear-gradient(top, #008bce, #0073aa) !important;background-image:-o-linear-gradient(top, #008bce, #0073aa) !important;background-image:-linear-gradient(top, #008bce, #0073aa) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#008bce', endColorstr='#0073aa', GradientType=0) !important;border-color:#003f5d !important;border-color:#005077 !important;-webkit-box-shadow:inset 0 1px 0 #00a7f6,0 1px 0 rgba(0,0,0,0.15) !important;box-shadow:inset 0 1px 0 #00a7f6,0 1px 0 rgba(0,0,0,0.15) !important}.admin-color-fresh #redux-header,.wp-customizer #redux-header{background:#23282d;border-color:#0073aa}.admin-color-fresh #redux-header .display_header span,.wp-customizer #redux-header .display_header span{color:#a0a5aa}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections a,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections a{position:relative}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections a:after,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:after,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:after{border:0 none !important;content:"\0020" !important}.admin-color-fresh .redux-sidebar .redux-group-menu li.hasSubSections .redux-menu-error,.wp-customizer .redux-sidebar .redux-group-menu li.hasSubSections .redux-menu-error{display:none;margin-right:5px}.admin-color-fresh .redux-sidebar .redux-group-menu li.hasSubSections a.hasError .extraIconSubsections,.wp-customizer .redux-sidebar .redux-group-menu li.hasSubSections a.hasError .extraIconSubsections{background-color:#b94a48;color:#f2dede}.admin-color-fresh .redux-sidebar .redux-group-menu li.hasSubSections a .extraIconSubsections,.wp-customizer .redux-sidebar .redux-group-menu li.hasSubSections a .extraIconSubsections{border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;border:0 solid transparent;font-size:9px;height:9px;line-height:9px;margin-right:5px;padding:6px 7px 4px 7px;width:5px}.admin-color-fresh .redux-sidebar .redux-group-menu li.active a .extraIconSubsections,.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild a .extraIconSubsections,.wp-customizer .redux-sidebar .redux-group-menu li.active a .extraIconSubsections,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild a .extraIconSubsections{display:none}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections .redux-menu-error,.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .redux-menu-error,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections .redux-menu-error,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .redux-menu-error{display:block}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections .subsection .redux-menu-error,.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .subsection .redux-menu-error,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections .subsection .redux-menu-error,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .subsection .redux-menu-error{margin-right:2px}.admin-color-fresh .redux-sidebar .redux-group-menu li.active,.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild,.wp-customizer .redux-sidebar .redux-group-menu li.active,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild{border-left:0 none}.admin-color-fresh .redux-sidebar .redux-group-menu li.active a,.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild a,.wp-customizer .redux-sidebar .redux-group-menu li.active a,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild a{color:#23282d}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections .active a:after,.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .active a:after,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections .active a:after,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .active a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections a,.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections a,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{-webkit-transition:all 0.2s;-moz-transition:all 0.2s;transition:all 0.2s;color:#fff;width:auto;border-bottom:0}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li,.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li{border-top:0 none !important}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.active a:hover,.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a:hover,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.active a:hover,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a:hover{color:#fff}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a,.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{width:auto;border-top:0 !important;padding:7px;color:#fff;padding-left:15px;-webkit-transition:all 0.2;-moz-transition:all 0.2;-ms-transition:all 0.2;-o-transition:all 0.2;transition:all 0.2}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:hover,.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a:hover,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:hover,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a:hover{color:#1e8cbe;background:#0d0e10}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a span.group_title,.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a span.group_title,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a span.group_title,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a span.group_title{padding-left:5px !important}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a,.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a{padding-left:14px}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a span.group_title,.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a span.group_title,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a span.group_title,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a span.group_title{padding-left:30px !important}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections a,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections a{background:#0073aa}.admin-color-fresh .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a,.wp-customizer .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a{background:#23282d}.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{background:#a0a5aa;text-shadow:1px 1px #54595d}.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{background:#23282d;text-shadow:none}.admin-color-fresh .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a,.wp-customizer .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a{background:#0073aa;text-shadow:1px 1px #002e44}.admin-color-fresh .redux-container-image_select .redux-image-select-selected img,.wp-customizer .redux-container-image_select .redux-image-select-selected img{border-color:#0073aa}.admin-color-fresh #redux-footer #redux-share a,.wp-customizer #redux-footer #redux-share a{color:#0073aa}.admin-color-fresh #redux-footer #redux-share a:hover,.wp-customizer #redux-footer #redux-share a:hover{color:#002e44}.admin-color-fresh .select2-results .select2-highlighted,.wp-customizer .select2-results .select2-highlighted{background:#0073aa}.admin-color-fresh .select2-drop-active,.admin-color-fresh .select2-container-multi.select2-container-active .select2-choices,.admin-color-fresh .select2-drop.select2-drop-above.select2-drop-active,.admin-color-fresh .select2-container-active .select2-choice,.admin-color-fresh .select2-container-active .select2-choices,.admin-color-fresh .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-fresh .select2-dropdown-open.select2-drop-above .select2-choices,.wp-customizer .select2-drop-active,.wp-customizer .select2-container-multi.select2-container-active .select2-choices,.wp-customizer .select2-drop.select2-drop-above.select2-drop-active,.wp-customizer .select2-container-active .select2-choice,.wp-customizer .select2-container-active .select2-choices,.wp-customizer .select2-dropdown-open.select2-drop-above .select2-choice,.wp-customizer .select2-dropdown-open.select2-drop-above .select2-choices{border-color:#0073aa}.admin-color-fresh .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-fresh .select2-dropdown-open.select2-drop-above .select2-choices,.wp-customizer .select2-dropdown-open.select2-drop-above .select2-choice,.wp-customizer .select2-dropdown-open.select2-drop-above .select2-choices{border-top:inherit}.admin-color-fresh .noUi-connect,.wp-customizer .noUi-connect{background-color:#007db9 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#0095dd), to(#007db9)) !important;background-image:-moz-linear-gradient(top, #0095dd, #007db9) !important;background-image:-ms-linear-gradient(top, #0095dd, #007db9) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #0095dd), color-stop(100%, #007db9)) !important;background-image:-webkit-linear-gradient(top, #0095dd, #007db9) !important;background-image:-o-linear-gradient(top, #0095dd, #007db9) !important;background-image:-linear-gradient(top, #0095dd, #007db9) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0095dd', endColorstr='#007db9', GradientType=0) !important}.admin-color-light .button.ui-datepicker-current,.admin-color-light button.ui-datepicker-close{background-color:#04b0db !important}.admin-color-light .ui-datepicker-buttonpane button.ui-datepicker-current{background:#0384a4 !important;color:white !important;border:1px solid #013340 !important}.admin-color-light .ui-datepicker-header .ui-icon{background-image:url(data:image/png;base64,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) !important}.admin-color-light .ui-datepicker-header{background-color:#888 !important;color:white !important}.admin-color-light .ui-datepicker td .ui-state-active{background-color:#04b0db !important;color:white !important}.admin-color-light .ui-datepicker td .ui-state-hover{color:#04b0db !important}.admin-color-light .ui-datepicker td .ui-state-highlight{background:#04a4cc !important;border:1px solid #888 !important;color:white !important}.admin-color-light .redux-container-switch .cb-disable,.admin-color-light .redux-container-switch .cb-enable,.admin-color-light .ui-state-default,.admin-color-light .ui-widget-content .ui-state-default,.admin-color-light .ui-widget-header .ui-state-default{background-color:#f5f5f5 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#f8f8f8), to(#f5f5f5)) !important;background-image:-moz-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-ms-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #f8f8f8), color-stop(100%, #f5f5f5)) !important;background-image:-webkit-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-o-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-linear-gradient(top, #f8f8f8, #f5f5f5) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8', endColorstr='#f5f5f5', GradientType=0) !important;border-color:#ccc !important}.admin-color-light .ui-datepicker td .ui-state-active{color:black !important;font-weight:700 !important;background:white !important}.admin-color-light .redux-container-switch .cb-disable.selected{background-color:#646464 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#929292), to(#646464)) !important;background-image:-moz-linear-gradient(top, #929292, #646464) !important;background-image:-ms-linear-gradient(top, #929292, #646464) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #929292), color-stop(100%, #646464)) !important;background-image:-webkit-linear-gradient(top, #929292, #646464) !important;background-image:-o-linear-gradient(top, #929292, #646464) !important;background-image:-linear-gradient(top, #929292, #646464) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#929292', endColorstr='#646464', GradientType=0) !important;border-color:#767676 !important}.admin-color-light .redux-container-switch .cb-enable.selected,.admin-color-light .redux-field-container .ui-buttonset .ui-state-active{background-color:#04a4cc !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#05c0ef), to(#04a4cc)) !important;background-image:-moz-linear-gradient(top, #05c0ef, #04a4cc) !important;background-image:-ms-linear-gradient(top, #05c0ef, #04a4cc) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #05c0ef), color-stop(100%, #04a4cc)) !important;background-image:-webkit-linear-gradient(top, #05c0ef, #04a4cc) !important;background-image:-o-linear-gradient(top, #05c0ef, #04a4cc) !important;background-image:-linear-gradient(top, #05c0ef, #04a4cc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#05c0ef', endColorstr='#04a4cc', GradientType=0) !important;border-color:#036881 !important;border-color:#037c9a !important;-webkit-box-shadow:inset 0 1px 0 #22cffb,0 1px 0 rgba(0,0,0,0.15) !important;box-shadow:inset 0 1px 0 #22cffb,0 1px 0 rgba(0,0,0,0.15) !important}.admin-color-light #redux-header{background:#888;border-color:#04a4cc}.admin-color-light #redux-header .display_header span{color:#e6e6e6}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections a{position:relative}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:after{border:0 none !important;content:"\0020" !important}.admin-color-light .redux-sidebar .redux-group-menu li.hasSubSections .redux-menu-error{display:none;margin-right:5px}.admin-color-light .redux-sidebar .redux-group-menu li.hasSubSections a.hasError .extraIconSubsections{background-color:#b94a48;color:#f2dede}.admin-color-light .redux-sidebar .redux-group-menu li.hasSubSections a .extraIconSubsections{border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;border:0 solid transparent;font-size:9px;height:9px;line-height:9px;margin-right:5px;padding:6px 7px 4px 7px;width:5px}.admin-color-light .redux-sidebar .redux-group-menu li.active a .extraIconSubsections,.admin-color-light .redux-sidebar .redux-group-menu li.activeChild a .extraIconSubsections{display:none}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections .redux-menu-error,.admin-color-light .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .redux-menu-error{display:block}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections .subsection .redux-menu-error,.admin-color-light .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .subsection .redux-menu-error{margin-right:2px}.admin-color-light .redux-sidebar .redux-group-menu li.active,.admin-color-light .redux-sidebar .redux-group-menu li.activeChild{border-left:0 none}.admin-color-light .redux-sidebar .redux-group-menu li.active a,.admin-color-light .redux-sidebar .redux-group-menu li.activeChild a{color:#888}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections .active a:after,.admin-color-light .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .active a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections a,.admin-color-light .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{-webkit-transition:all 0.2s;-moz-transition:all 0.2s;transition:all 0.2s;color:#fff;width:auto;border-bottom:0}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li,.admin-color-light .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li{border-top:0 none !important}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.active a:hover,.admin-color-light .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a:hover{color:#fff}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a,.admin-color-light .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{width:auto;border-top:0 !important;padding:7px;color:#fff;padding-left:15px;-webkit-transition:all 0.2;-moz-transition:all 0.2;-ms-transition:all 0.2;-o-transition:all 0.2;transition:all 0.2}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:hover,.admin-color-light .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a:hover{color:#0384a4;background:#6f6f6f}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a span.group_title,.admin-color-light .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a span.group_title{padding-left:5px !important}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a,.admin-color-light .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a{padding-left:14px}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a span.group_title,.admin-color-light .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a span.group_title{padding-left:30px !important}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections a{background:#04a4cc}.admin-color-light .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a{background:#888}.admin-color-light .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{background:#e6e6e6;text-shadow:1px 1px #9a9a9a}.admin-color-light .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{background:#888;text-shadow:none}.admin-color-light .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a{background:#04a4cc;text-shadow:1px 1px #025468}.admin-color-light .redux-container-image_select .redux-image-select-selected img{border-color:#04a4cc}.admin-color-light #redux-footer #redux-share a{color:#04a4cc}.admin-color-light #redux-footer #redux-share a:hover{color:#025468}.admin-color-light .select2-results .select2-highlighted{background:#04a4cc}.admin-color-light .select2-drop-active,.admin-color-light .select2-container-multi.select2-container-active .select2-choices,.admin-color-light .select2-drop.select2-drop-above.select2-drop-active,.admin-color-light .select2-container-active .select2-choice,.admin-color-light .select2-container-active .select2-choices,.admin-color-light .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-light .select2-dropdown-open.select2-drop-above .select2-choices{border-color:#04a4cc}.admin-color-light .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-light .select2-dropdown-open.select2-drop-above .select2-choices{border-top:inherit}.admin-color-light .noUi-connect{background-color:#04b0db !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#09cafa), to(#04b0db)) !important;background-image:-moz-linear-gradient(top, #09cafa, #04b0db) !important;background-image:-ms-linear-gradient(top, #09cafa, #04b0db) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #09cafa), color-stop(100%, #04b0db)) !important;background-image:-webkit-linear-gradient(top, #09cafa, #04b0db) !important;background-image:-o-linear-gradient(top, #09cafa, #04b0db) !important;background-image:-linear-gradient(top, #09cafa, #04b0db) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#09cafa', endColorstr='#04b0db', GradientType=0) !important}.admin-color-blue .button.ui-datepicker-current,.admin-color-blue button.ui-datepicker-close{background-color:#509dba !important}.admin-color-blue .ui-datepicker-buttonpane button.ui-datepicker-current{background:#db9825 !important;color:white !important;border:1px solid #845c16 !important}.admin-color-blue .ui-datepicker-header .ui-icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEX8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vywC3+8AAAATnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWNqa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxahZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7PoCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhysIPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8PEANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSPGvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqwHaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/kNR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTzqymwVAPxfJ5PnIUUQOUKT04tEdWZyv3JCQSn96WS4pD97QfyW25A7NhSAbyhmVj0FEltA4vdiygBibXhoUYgykCUP7HwPTDeEqAIcHVMkZg7Zx4k0uFANs63hPQXCoRLAwdgGsr9Az7Qv7sgQGgg1aPl/BJLExBWgG4RFRLFImGmIquPC/klEGyCG0AuAXaJJC+B8FVe9NYQDEcXB8g6AQcjYJ1goJIggHWCrFR0S6kRHN5+4BzFi8NaoN35NRxUvL+JJdZr7PV4wK6fj8nIyMjIyNhr3OxdXAYq7FHZwB6bDSzSh4sF0utChqo0NAvaT1hLzXwFinmCzmeDucEQK18TTaQoFgP7bNC+RZ4OT4T6gQogDFYk+1QxQlj19QGSAWKiLYp8P0Ag1Gbz1ULfWHLg9iUnQNK5QQJcukm04blKLH2GgEJCY+HzXAZWCvHKco3Bp6MIaCjSXXRJyOxeqhnzEaF93MfFGW/O16ZvDL5TM4MJIjujz/cHypkQuuzRwWJ93BKdIt+wCRAPl9kpe2Ikkb2mFgGlxh/i40d3EHfdvoyMjIyMu43ylt/IAmGHnN5iIt7wKfbv01RAcJqFRl9lcjYQSnbQqKgC4fYOwSJt6N6trE0twZ9kN/PqNpTQeICvr4TLsDYC06U7BMjshS+v1/aT7IwQYD5LcgRQXMT2FrBfBLjZ6151jDElk9tPFfpUgk2yregusX25BJbwAFEfM+YI6vGAti4bTtizB+TjfQCrERyhKb2X8D6A9wX75P4t4neBYJeP6pdhg/gQl8MWvytzeSTjgOQBynQdh/iXKdxOrGJ/RkZGRsb9QmXihGr5+g8GGg9uTh+KoVZuNIzV+CwRucFBEyr1mVjx4irOxwM1BhirB6Q+2eNQi4eqR+aF6mELtoMzCR7V9RAFe/ZvQogNiyY8FPSUTFsLp8TeTmMui5mtw7bcaT0Yw2AA4wFRQIlkgq+1DQrNhkmoxS5Jq+u6bMAIGRECEANgXHTgWzwgBOhDH2l0oTQ4D8D5NMktBgNywAEMjo8rwATMZrPY7JGxBoJCkIBDQiAY09EGTUiBCWkUpISfGPR5AAwBfZiG2z7Ayc1yeKTxid39xBNwfHr4O0LA48ePFTvhYrF1r4tyAoz9n2MCqEuBtp/6GDR0oAYfG/R6wJExHYZHfhygsv7fEWCOj4bYmsP5A+pL4MkTfAnMlD4F+r3bobKvTyTA2P/w7PN+Agq2QW8piqMCpTBwenoKvX0AHGkGtP2YAPvTEWA7QUTAudn7/NxtOG46wWNmDtpBEkBzN7rBEvAFHp+YTB/q97qPAN4gHFqgBi8uLsC7qPCA6mg41G/+ErByPwEXDdoNxRhOx+M5jPEzQugS0ht+b1/Y3gEnYMAIAOIBE29/hIDucE8tmMsNOgK4B1RHFu4UCRlMHzv0xzcajcfdXWDs2h8TArBCkoDUJYDLmz6w7ip3BFS0ve5wTRwAn6keMA9I3QYbfSZ0DKbyt+7OXjGI1idPcfNyAyfAMlCrzaGqphYrxHocLHRJVycnfGUcbtT+jIyMjIw9x7Nn8fJSzG0TmFtO8rZT+XT3S3ub+tKJbbLd5diTVp50+zahyeHSslJ/YPrU0fuazrZO2CZ92/ZCCVXlGRiZKPJyPPRxyIFWeXLQBXJBKiq/3divEAN6ZwM200Qjm7EJBZeWm/PRWVCbYK7s7u2l4XaCz+lzgOfMfhMonXr7TWzeZb98dbgIzBT8Ub8eYYUqfZ4rVJ/MDbIDgPqTulJ/xvntWAtjIisqnwxOkGz0n077FARoY79GdA6HPE4rOy196NiMWHTZlSSApcOgXpy/fHV2joaNKu3ffsAnRcBf4K/6NcIG6tIxk3HyoXPjASqfUgXbYN5PzpL2njkR9QMjeDTVHDTCgRuxOegjoO0FvKzP/t/gmVdI24+G7NIe8JX6Wv3dDyldMA+4YB5wwTygtd+dwRqaTqrLb1l73zTSN52CNpnHuQOYPsDblybgxfkXh/oVtr+N1DEBJdhRJyd/Bd/q1z+cbNrD17iVKyajcnv9arhOkRPgsruuD6DmNPwpDNrLw2CoTgHni4yALr0L29+tiKAEIPn868ejx//8rpWP3OEOl5On9OwpcQm0MhafP/ey8f1uvDNIgGLQG8z4YO99ENgg95etwv4uYJYY8fUGHYH6j6fscHFZMftlAl9i+9XL73X3N/n+ZStOzfVfRvYXhrbdKOpEgVQTg/wsDuDD3kwOfQNMTJ5y+/ltUDWLunyxnRF46IqlBzGMY4X7inggREFioIyMjIyMHWCIB6ZNKAcXseo3vLTQTkVE7348dlwJJSz0+wLfmi8BhZqfw3D4ww/wHVLnEd5/fgYvXsDZ3MlsvYUbbnDjDZ3MN3TJG4+bxjAaDl8TBri9qxEw1ccao2wTNAMLHo2f+sjrXwb/9qHoYqgPMBXJTVfOpmrZH23y6uvo0LHSyY6fHGwKfHJlAuMFvObjDYrIqxBgQi20h7Hd/nYVLmno+eaNUm/eeH2GCuopntnhBJAlI2AHo9CCh1I1QxUdAbqqGY9BBLwyc3W4wYVhvY8A4BoIc1l5M7vnPWphZW9/Ses3n37y9a0uGqFwFQZsQQbd386DogpgEk+dzynsAZMJXq8+ns9NeukJ0PYrNATGGefJQlhkLo7DTXr+y3bNiOsDvrXTz/C2q1DXZH84iRNwrP88Nj+u2DjYEE6RBxD9Knj16ujVHC67A7422o02RwD3gB+t7EblWvu9geOFxSnd3ROmT+nJyQkhoPlsxVONc/3TEdBos+jtA+ZzcwHgTvD1cDjaYCcItA8w9i88A8b+mqSjc6Pvqd998QguEQPmQMeo23ODN86+p0/bn1buBkT6+oBhNZ/PYY4ZAHYb3PRd4LkZmPX68NRtMZn4ASvdA+qf0jMA5MP9eeg28Nug9QiLnj5A33U1MAES6xHAUNpz/9zFAYE1gqQDMT3G6xI9pwdw/aIgKoHCS1YGlRnSq9yCjdXjgN3j+N27YyROHxmuNAeNKPpYuXIyIyMjYy0M8eros59MF/PT2c602T7eA7zvhJ9dr/vzDjXaLp4Yc5+0wllzxzHv3gdmMMM7/CcQzKgVBqYTmFn+Z+mKm8J7k0A5F/jgCfjQ1WBhQyiOqD0lYuqBb+AyzMw9Ha2G3m6c8qQx+AlqnIceQp+Sb6i9UyQWbhr54+AjnZ0VzW2TAN0DmBT6PWmc6jDBE2PK2u+nF43dyP7Q0t1pOcX2fdRvH0mF2Q4JqN35rnHjVIeaXfIAVyUuw/aHCCiJy9iF5l1621zweI8KZrPZ9iJdb7DXJ3US0OSrtZ10imt7wHY7QesAzUMz1oZ3noB3qFJ/H18j97FYuw8QDN4oeKf30osvcSW2ExLo+VcbuAuo/sUIm8fMG9xocO3Ea19J9gFYivnHJ2KnyfovZlgW3v6ySx32abQiIyMjIyPjhlFDTLxpwIgFMnTp6A3g4IDKNY+stkwAMAoIAbasxBXqUWneSAWTMjt50lTqT29rFjvXohjsDNm2YPXDFlICmrJOZ3t6tHm8AiEAl0sCeLIIorIRt+cFbew/QRsoAXb4o1XSfoywzm0FTMAoYBNvLyFu8v8HpLBtD1iKgC17wHb7AI6d9wFbvguAIGTHd4E9wG7jgIyMjIyM+434c2R3HeV/Ffx6jtZu6ijl8h59T655jhR+rdHzDOP6beABCheb8O8/WFXeOyzgf5oAhVYnKxP7CwaAf1afJu8bSrhS6tdaXeGnrRenOqOlz9d6QwYnA/3TLd+GE7qe3chA5YF5DfY0vK3adfOX/gyNp2BW25MHdxAB9qvRiiP3/XpQQFGYDU4+Mi///XumXG8pjvaUAOsBGlf4jJt+YYEzeEzAdw06F19R3juM7D1wita86GR0CKfDHgLuXCc4Bri6vMLdfjMc4VNSUNsdodo2xu/1+Xl/K5+az8jIyMhYG/z5gJTMF1GtKq/a3rpyCvz5gJTMl9GtKq/a3rpyCmfQ4WwZmS+kXFVetb115ST48wEf/AGcfG1iw+tWbpbS2vJ3nQxcVr3lH3z5h972FUTLzYpOVk7l5hD+eYcYwDcAnewOotrZ4OtrPDucqi/LRX0/RR4qx7Nn4U8g+qjffvuN6Gf+nC85vwauHjaYyubqvWYKY4VEfSUMitdnBCT1Ue63R5439m+OgCn6DroAAaHPVQxKth/wkJgHmG8bmQMsT0D6EjDfvhVRKO3ywOQUgRA7nmL1uawZmHf1k+DPBwQ6NdcJ+k6Md1LA5f5ONdhJ8vZ5J0vLHT99srkGOjmJbd/G1r2Nriqnse1AZt1AalU5jW2HsuuG0qvKGRkZGRkZGRG0gcONyXsP9v8D0/IdJADiBNiXl3327WRGgOL/9HC/0XwlIURkRhC4tz6Z/fu7fUf2gHvfB9z3u0BGRkZGRkbGplHcnkgguQoSqtUXuhbs/wPtMwqV0HUJAvj5vk32b8IDuL23yn7qAXZ5u32hbRX7d3o82Df1FZXvbh9QOfhyxldr/+3xgXU9oKmvsHyr7F/XA269/eveBXrsv7N9QALe/tvjA0kPWAXGbvebkbHn+D/J5nMcHzx1UAAAAABJRU5ErkJggg==) !important}.admin-color-blue .ui-datepicker-header{background-color:#096484 !important;color:white !important}.admin-color-blue .ui-datepicker td .ui-state-active{background-color:#509dba !important;color:white !important}.admin-color-blue .ui-datepicker td .ui-state-hover{color:#509dba !important}.admin-color-blue .ui-datepicker td .ui-state-highlight{background:#4796b3 !important;border:1px solid #096484 !important;color:white !important}.admin-color-blue .redux-container-switch .cb-disable,.admin-color-blue .redux-container-switch .cb-enable,.admin-color-blue .ui-state-default,.admin-color-blue .ui-widget-content .ui-state-default,.admin-color-blue .ui-widget-header .ui-state-default{background-color:#f5f5f5 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#f8f8f8), to(#f5f5f5)) !important;background-image:-moz-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-ms-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #f8f8f8), color-stop(100%, #f5f5f5)) !important;background-image:-webkit-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-o-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-linear-gradient(top, #f8f8f8, #f5f5f5) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8', endColorstr='#f5f5f5', GradientType=0) !important;border-color:#ccc !important}.admin-color-blue .ui-datepicker td .ui-state-active{color:black !important;font-weight:700 !important;background:white !important}.admin-color-blue .redux-container-switch .cb-disable.selected{background-color:#646464 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#929292), to(#646464)) !important;background-image:-moz-linear-gradient(top, #929292, #646464) !important;background-image:-ms-linear-gradient(top, #929292, #646464) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #929292), color-stop(100%, #646464)) !important;background-image:-webkit-linear-gradient(top, #929292, #646464) !important;background-image:-o-linear-gradient(top, #929292, #646464) !important;background-image:-linear-gradient(top, #929292, #646464) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#929292', endColorstr='#646464', GradientType=0) !important;border-color:#767676 !important}.admin-color-blue .redux-container-switch .cb-enable.selected,.admin-color-blue .redux-field-container .ui-buttonset .ui-state-active{background-color:#4796b3 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#5ea5bf), to(#4796b3)) !important;background-image:-moz-linear-gradient(top, #5ea5bf, #4796b3) !important;background-image:-ms-linear-gradient(top, #5ea5bf, #4796b3) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #5ea5bf), color-stop(100%, #4796b3)) !important;background-image:-webkit-linear-gradient(top, #5ea5bf, #4796b3) !important;background-image:-o-linear-gradient(top, #5ea5bf, #4796b3) !important;background-image:-linear-gradient(top, #5ea5bf, #4796b3) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5ea5bf', endColorstr='#4796b3', GradientType=0) !important;border-color:#31687c !important;border-color:#39778e !important;-webkit-box-shadow:inset 0 1px 0 #7cb6cb,0 1px 0 rgba(0,0,0,0.15) !important;box-shadow:inset 0 1px 0 #7cb6cb,0 1px 0 rgba(0,0,0,0.15) !important}.admin-color-blue #redux-header{background:#096484;border-color:#4796b3}.admin-color-blue #redux-header .display_header span{color:#e2ecf1}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections a{position:relative}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:after{border:0 none !important;content:"\0020" !important}.admin-color-blue .redux-sidebar .redux-group-menu li.hasSubSections .redux-menu-error{display:none;margin-right:5px}.admin-color-blue .redux-sidebar .redux-group-menu li.hasSubSections a.hasError .extraIconSubsections{background-color:#b94a48;color:#f2dede}.admin-color-blue .redux-sidebar .redux-group-menu li.hasSubSections a .extraIconSubsections{border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;border:0 solid transparent;font-size:9px;height:9px;line-height:9px;margin-right:5px;padding:6px 7px 4px 7px;width:5px}.admin-color-blue .redux-sidebar .redux-group-menu li.active a .extraIconSubsections,.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild a .extraIconSubsections{display:none}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections .redux-menu-error,.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .redux-menu-error{display:block}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections .subsection .redux-menu-error,.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .subsection .redux-menu-error{margin-right:2px}.admin-color-blue .redux-sidebar .redux-group-menu li.active,.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild{border-left:0 none}.admin-color-blue .redux-sidebar .redux-group-menu li.active a,.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild a{color:#096484}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections .active a:after,.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .active a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections a,.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{-webkit-transition:all 0.2s;-moz-transition:all 0.2s;transition:all 0.2s;color:#fff;width:auto;border-bottom:0}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li,.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li{border-top:0 none !important}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.active a:hover,.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a:hover{color:#fff}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a,.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{width:auto;border-top:0 !important;padding:7px;color:#fff;padding-left:15px;-webkit-transition:all 0.2;-moz-transition:all 0.2;-ms-transition:all 0.2;-o-transition:all 0.2;transition:all 0.2}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:hover,.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a:hover{color:#db9825;background:#064054}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a span.group_title,.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a span.group_title{padding-left:5px !important}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a,.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a{padding-left:14px}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a span.group_title,.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a span.group_title{padding-left:30px !important}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections a{background:#4796b3}.admin-color-blue .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a{background:#096484}.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{background:#e2ecf1;text-shadow:1px 1px #7ba8bf}.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{background:#096484;text-shadow:none}.admin-color-blue .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a{background:#4796b3;text-shadow:1px 1px #2a596a}.admin-color-blue .redux-container-image_select .redux-image-select-selected img{border-color:#4796b3}.admin-color-blue #redux-footer #redux-share a{color:#4796b3}.admin-color-blue #redux-footer #redux-share a:hover{color:#2a596a}.admin-color-blue .select2-results .select2-highlighted{background:#4796b3}.admin-color-blue .select2-drop-active,.admin-color-blue .select2-container-multi.select2-container-active .select2-choices,.admin-color-blue .select2-drop.select2-drop-above.select2-drop-active,.admin-color-blue .select2-container-active .select2-choice,.admin-color-blue .select2-container-active .select2-choices,.admin-color-blue .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-blue .select2-dropdown-open.select2-drop-above .select2-choices{border-color:#4796b3}.admin-color-blue .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-blue .select2-dropdown-open.select2-drop-above .select2-choices{border-top:inherit}.admin-color-blue .noUi-connect{background-color:#509dba !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#69abc4), to(#509dba)) !important;background-image:-moz-linear-gradient(top, #69abc4, #509dba) !important;background-image:-ms-linear-gradient(top, #69abc4, #509dba) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #69abc4), color-stop(100%, #509dba)) !important;background-image:-webkit-linear-gradient(top, #69abc4, #509dba) !important;background-image:-o-linear-gradient(top, #69abc4, #509dba) !important;background-image:-linear-gradient(top, #69abc4, #509dba) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#69abc4', endColorstr='#509dba', GradientType=0) !important}.admin-color-coffee .button.ui-datepicker-current,.admin-color-coffee button.ui-datepicker-close{background-color:#ccad93 !important}.admin-color-coffee .ui-datepicker-buttonpane button.ui-datepicker-current{background:#ba906d !important;color:white !important;border:1px solid #835d3e !important}.admin-color-coffee .ui-datepicker-header .ui-icon{background-image:url(data:image/png;base64,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) !important}.admin-color-coffee .ui-datepicker-header{background-color:#46403c !important;color:white !important}.admin-color-coffee .ui-datepicker td .ui-state-active{background-color:#ccad93 !important;color:white !important}.admin-color-coffee .ui-datepicker td .ui-state-hover{color:#ccad93 !important}.admin-color-coffee .ui-datepicker td .ui-state-highlight{background:#c7a589 !important;border:1px solid #46403c !important;color:white !important}.admin-color-coffee .redux-container-switch .cb-disable,.admin-color-coffee .redux-container-switch .cb-enable,.admin-color-coffee .ui-state-default,.admin-color-coffee .ui-widget-content .ui-state-default,.admin-color-coffee .ui-widget-header .ui-state-default{background-color:#f5f5f5 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#f8f8f8), to(#f5f5f5)) !important;background-image:-moz-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-ms-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #f8f8f8), color-stop(100%, #f5f5f5)) !important;background-image:-webkit-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-o-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-linear-gradient(top, #f8f8f8, #f5f5f5) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8', endColorstr='#f5f5f5', GradientType=0) !important;border-color:#ccc !important}.admin-color-coffee .ui-datepicker td .ui-state-active{color:black !important;font-weight:700 !important;background:white !important}.admin-color-coffee .redux-container-switch .cb-disable.selected{background-color:#646464 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#929292), to(#646464)) !important;background-image:-moz-linear-gradient(top, #929292, #646464) !important;background-image:-ms-linear-gradient(top, #929292, #646464) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #929292), color-stop(100%, #646464)) !important;background-image:-webkit-linear-gradient(top, #929292, #646464) !important;background-image:-o-linear-gradient(top, #929292, #646464) !important;background-image:-linear-gradient(top, #929292, #646464) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#929292', endColorstr='#646464', GradientType=0) !important;border-color:#767676 !important}.admin-color-coffee .redux-container-switch .cb-enable.selected,.admin-color-coffee .redux-field-container .ui-buttonset .ui-state-active{background-color:#c7a589 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#d2b7a1), to(#c7a589)) !important;background-image:-moz-linear-gradient(top, #d2b7a1, #c7a589) !important;background-image:-ms-linear-gradient(top, #d2b7a1, #c7a589) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #d2b7a1), color-stop(100%, #c7a589)) !important;background-image:-webkit-linear-gradient(top, #d2b7a1, #c7a589) !important;background-image:-o-linear-gradient(top, #d2b7a1, #c7a589) !important;background-image:-linear-gradient(top, #d2b7a1, #c7a589) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d2b7a1', endColorstr='#c7a589', GradientType=0) !important;border-color:#ae7d55 !important;border-color:#b78b66 !important;-webkit-box-shadow:inset 0 1px 0 #e0cdbd,0 1px 0 rgba(0,0,0,0.15) !important;box-shadow:inset 0 1px 0 #e0cdbd,0 1px 0 rgba(0,0,0,0.15) !important}.admin-color-coffee #redux-header{background:#46403c;border-color:#c7a589}.admin-color-coffee #redux-header .display_header span{color:#cdcbc9}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections a{position:relative}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:after{border:0 none !important;content:"\0020" !important}.admin-color-coffee .redux-sidebar .redux-group-menu li.hasSubSections .redux-menu-error{display:none;margin-right:5px}.admin-color-coffee .redux-sidebar .redux-group-menu li.hasSubSections a.hasError .extraIconSubsections{background-color:#b94a48;color:#f2dede}.admin-color-coffee .redux-sidebar .redux-group-menu li.hasSubSections a .extraIconSubsections{border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;border:0 solid transparent;font-size:9px;height:9px;line-height:9px;margin-right:5px;padding:6px 7px 4px 7px;width:5px}.admin-color-coffee .redux-sidebar .redux-group-menu li.active a .extraIconSubsections,.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild a .extraIconSubsections{display:none}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections .redux-menu-error,.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .redux-menu-error{display:block}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections .subsection .redux-menu-error,.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .subsection .redux-menu-error{margin-right:2px}.admin-color-coffee .redux-sidebar .redux-group-menu li.active,.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild{border-left:0 none}.admin-color-coffee .redux-sidebar .redux-group-menu li.active a,.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild a{color:#46403c}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections .active a:after,.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .active a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections a,.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{-webkit-transition:all 0.2s;-moz-transition:all 0.2s;transition:all 0.2s;color:#fff;width:auto;border-bottom:0}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li,.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li{border-top:0 none !important}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.active a:hover,.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a:hover{color:#fff}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a,.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{width:auto;border-top:0 !important;padding:7px;color:#fff;padding-left:15px;-webkit-transition:all 0.2;-moz-transition:all 0.2;-ms-transition:all 0.2;-o-transition:all 0.2;transition:all 0.2}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:hover,.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a:hover{color:#ba906d;background:#2b2724}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a span.group_title,.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a span.group_title{padding-left:5px !important}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a,.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a{padding-left:14px}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a span.group_title,.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a span.group_title{padding-left:30px !important}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections a{background:#c7a589}.admin-color-coffee .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a{background:#46403c}.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{background:#cdcbc9;text-shadow:1px 1px #837e7a}.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{background:#46403c;text-shadow:none}.admin-color-coffee .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a{background:#c7a589;text-shadow:1px 1px #9f714b}.admin-color-coffee .redux-container-image_select .redux-image-select-selected img{border-color:#c7a589}.admin-color-coffee #redux-footer #redux-share a{color:#c7a589}.admin-color-coffee #redux-footer #redux-share a:hover{color:#9f714b}.admin-color-coffee .select2-results .select2-highlighted{background:#c7a589}.admin-color-coffee .select2-drop-active,.admin-color-coffee .select2-container-multi.select2-container-active .select2-choices,.admin-color-coffee .select2-drop.select2-drop-above.select2-drop-active,.admin-color-coffee .select2-container-active .select2-choice,.admin-color-coffee .select2-container-active .select2-choices,.admin-color-coffee .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-coffee .select2-dropdown-open.select2-drop-above .select2-choices{border-color:#c7a589}.admin-color-coffee .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-coffee .select2-dropdown-open.select2-drop-above .select2-choices{border-top:inherit}.admin-color-coffee .noUi-connect{background-color:#ccad93 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#d7bfac), to(#ccad93)) !important;background-image:-moz-linear-gradient(top, #d7bfac, #ccad93) !important;background-image:-ms-linear-gradient(top, #d7bfac, #ccad93) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #d7bfac), color-stop(100%, #ccad93)) !important;background-image:-webkit-linear-gradient(top, #d7bfac, #ccad93) !important;background-image:-o-linear-gradient(top, #d7bfac, #ccad93) !important;background-image:-linear-gradient(top, #d7bfac, #ccad93) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d7bfac', endColorstr='#ccad93', GradientType=0) !important}.admin-color-ectoplasm .button.ui-datepicker-current,.admin-color-ectoplasm button.ui-datepicker-close{background-color:#a9bd4f !important}.admin-color-ectoplasm .ui-datepicker-buttonpane button.ui-datepicker-current{background:#89993a !important;color:white !important;border:1px solid #474f1e !important}.admin-color-ectoplasm .ui-datepicker-header .ui-icon{background-image:url(data:image/png;base64,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) !important}.admin-color-ectoplasm .ui-datepicker-header{background-color:#413256 !important;color:white !important}.admin-color-ectoplasm .ui-datepicker td .ui-state-active{background-color:#a9bd4f !important;color:white !important}.admin-color-ectoplasm .ui-datepicker td .ui-state-hover{color:#a9bd4f !important}.admin-color-ectoplasm .ui-datepicker td .ui-state-highlight{background:#a3b745 !important;border:1px solid #413256 !important;color:white !important}.admin-color-ectoplasm .redux-container-switch .cb-disable,.admin-color-ectoplasm .redux-container-switch .cb-enable,.admin-color-ectoplasm .ui-state-default,.admin-color-ectoplasm .ui-widget-content .ui-state-default,.admin-color-ectoplasm .ui-widget-header .ui-state-default{background-color:#f5f5f5 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#f8f8f8), to(#f5f5f5)) !important;background-image:-moz-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-ms-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #f8f8f8), color-stop(100%, #f5f5f5)) !important;background-image:-webkit-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-o-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-linear-gradient(top, #f8f8f8, #f5f5f5) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8', endColorstr='#f5f5f5', GradientType=0) !important;border-color:#ccc !important}.admin-color-ectoplasm .ui-datepicker td .ui-state-active{color:black !important;font-weight:700 !important;background:white !important}.admin-color-ectoplasm .redux-container-switch .cb-disable.selected{background-color:#646464 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#929292), to(#646464)) !important;background-image:-moz-linear-gradient(top, #929292, #646464) !important;background-image:-ms-linear-gradient(top, #929292, #646464) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #929292), color-stop(100%, #646464)) !important;background-image:-webkit-linear-gradient(top, #929292, #646464) !important;background-image:-o-linear-gradient(top, #929292, #646464) !important;background-image:-linear-gradient(top, #929292, #646464) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#929292', endColorstr='#646464', GradientType=0) !important;border-color:#767676 !important}.admin-color-ectoplasm .redux-container-switch .cb-enable.selected,.admin-color-ectoplasm .redux-field-container .ui-buttonset .ui-state-active{background-color:#a3b745 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#b0c25e), to(#a3b745)) !important;background-image:-moz-linear-gradient(top, #b0c25e, #a3b745) !important;background-image:-ms-linear-gradient(top, #b0c25e, #a3b745) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #b0c25e), color-stop(100%, #a3b745)) !important;background-image:-webkit-linear-gradient(top, #b0c25e, #a3b745) !important;background-image:-o-linear-gradient(top, #b0c25e, #a3b745) !important;background-image:-linear-gradient(top, #b0c25e, #a3b745) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b0c25e', endColorstr='#a3b745', GradientType=0) !important;border-color:#727f30 !important;border-color:#829237 !important;-webkit-box-shadow:inset 0 1px 0 #bfcd7b,0 1px 0 rgba(0,0,0,0.15) !important;box-shadow:inset 0 1px 0 #bfcd7b,0 1px 0 rgba(0,0,0,0.15) !important}.admin-color-ectoplasm #redux-header{background:#413256;border-color:#a3b745}.admin-color-ectoplasm #redux-header .display_header span{color:#cbc5d3}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections a{position:relative}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:after{border:0 none !important;content:"\0020" !important}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.hasSubSections .redux-menu-error{display:none;margin-right:5px}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.hasSubSections a.hasError .extraIconSubsections{background-color:#b94a48;color:#f2dede}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.hasSubSections a .extraIconSubsections{border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;border:0 solid transparent;font-size:9px;height:9px;line-height:9px;margin-right:5px;padding:6px 7px 4px 7px;width:5px}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active a .extraIconSubsections,.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild a .extraIconSubsections{display:none}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections .redux-menu-error,.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .redux-menu-error{display:block}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections .subsection .redux-menu-error,.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .subsection .redux-menu-error{margin-right:2px}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active,.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild{border-left:0 none}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active a,.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild a{color:#413256}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections .active a:after,.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .active a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections a,.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{-webkit-transition:all 0.2s;-moz-transition:all 0.2s;transition:all 0.2s;color:#fff;width:auto;border-bottom:0}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li,.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li{border-top:0 none !important}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.active a:hover,.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a:hover{color:#fff}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a,.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{width:auto;border-top:0 !important;padding:7px;color:#fff;padding-left:15px;-webkit-transition:all 0.2;-moz-transition:all 0.2;-ms-transition:all 0.2;-o-transition:all 0.2;transition:all 0.2}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:hover,.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a:hover{color:#89993a;background:#291f36}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a span.group_title,.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a span.group_title{padding-left:5px !important}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a,.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a{padding-left:14px}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a span.group_title,.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a span.group_title{padding-left:30px !important}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections a{background:#a3b745}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a{background:#413256}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{background:#cbc5d3;text-shadow:1px 1px #7d6e91}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{background:#413256;text-shadow:none}.admin-color-ectoplasm .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a{background:#a3b745;text-shadow:1px 1px #616d29}.admin-color-ectoplasm .redux-container-image_select .redux-image-select-selected img{border-color:#a3b745}.admin-color-ectoplasm #redux-footer #redux-share a{color:#a3b745}.admin-color-ectoplasm #redux-footer #redux-share a:hover{color:#616d29}.admin-color-ectoplasm .select2-results .select2-highlighted{background:#a3b745}.admin-color-ectoplasm .select2-drop-active,.admin-color-ectoplasm .select2-container-multi.select2-container-active .select2-choices,.admin-color-ectoplasm .select2-drop.select2-drop-above.select2-drop-active,.admin-color-ectoplasm .select2-container-active .select2-choice,.admin-color-ectoplasm .select2-container-active .select2-choices,.admin-color-ectoplasm .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-ectoplasm .select2-dropdown-open.select2-drop-above .select2-choices{border-color:#a3b745}.admin-color-ectoplasm .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-ectoplasm .select2-dropdown-open.select2-drop-above .select2-choices{border-top:inherit}.admin-color-ectoplasm .noUi-connect{background-color:#a9bd4f !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#b6c669), to(#a9bd4f)) !important;background-image:-moz-linear-gradient(top, #b6c669, #a9bd4f) !important;background-image:-ms-linear-gradient(top, #b6c669, #a9bd4f) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #b6c669), color-stop(100%, #a9bd4f)) !important;background-image:-webkit-linear-gradient(top, #b6c669, #a9bd4f) !important;background-image:-o-linear-gradient(top, #b6c669, #a9bd4f) !important;background-image:-linear-gradient(top, #b6c669, #a9bd4f) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b6c669', endColorstr='#a9bd4f', GradientType=0) !important}.admin-color-midnight .button.ui-datepicker-current,.admin-color-midnight button.ui-datepicker-close{background-color:#e35950 !important}.admin-color-midnight .ui-datepicker-buttonpane button.ui-datepicker-current{background:#d92c23 !important;color:white !important;border:1px solid #811a15 !important}.admin-color-midnight .ui-datepicker-header .ui-icon{background-image:url(data:image/png;base64,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) !important}.admin-color-midnight .ui-datepicker-header{background-color:#363b3f !important;color:white !important}.admin-color-midnight .ui-datepicker td .ui-state-active{background-color:#e35950 !important;color:white !important}.admin-color-midnight .ui-datepicker td .ui-state-hover{color:#e35950 !important}.admin-color-midnight .ui-datepicker td .ui-state-highlight{background:#e14d43 !important;border:1px solid #363b3f !important;color:white !important}.admin-color-midnight .redux-container-switch .cb-disable,.admin-color-midnight .redux-container-switch .cb-enable,.admin-color-midnight .ui-state-default,.admin-color-midnight .ui-widget-content .ui-state-default,.admin-color-midnight .ui-widget-header .ui-state-default{background-color:#f5f5f5 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#f8f8f8), to(#f5f5f5)) !important;background-image:-moz-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-ms-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #f8f8f8), color-stop(100%, #f5f5f5)) !important;background-image:-webkit-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-o-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-linear-gradient(top, #f8f8f8, #f5f5f5) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8', endColorstr='#f5f5f5', GradientType=0) !important;border-color:#ccc !important}.admin-color-midnight .ui-datepicker td .ui-state-active{color:black !important;font-weight:700 !important;background:white !important}.admin-color-midnight .redux-container-switch .cb-disable.selected{background-color:#646464 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#929292), to(#646464)) !important;background-image:-moz-linear-gradient(top, #929292, #646464) !important;background-image:-ms-linear-gradient(top, #929292, #646464) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #929292), color-stop(100%, #646464)) !important;background-image:-webkit-linear-gradient(top, #929292, #646464) !important;background-image:-o-linear-gradient(top, #929292, #646464) !important;background-image:-linear-gradient(top, #929292, #646464) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#929292', endColorstr='#646464', GradientType=0) !important;border-color:#767676 !important}.admin-color-midnight .redux-container-switch .cb-enable.selected,.admin-color-midnight .redux-field-container .ui-buttonset .ui-state-active{background-color:#e14d43 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#e66a62), to(#e14d43)) !important;background-image:-moz-linear-gradient(top, #e66a62, #e14d43) !important;background-image:-ms-linear-gradient(top, #e66a62, #e14d43) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #e66a62), color-stop(100%, #e14d43)) !important;background-image:-webkit-linear-gradient(top, #e66a62, #e14d43) !important;background-image:-o-linear-gradient(top, #e66a62, #e14d43) !important;background-image:-linear-gradient(top, #e66a62, #e14d43) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e66a62', endColorstr='#e14d43', GradientType=0) !important;border-color:#ba281e !important;border-color:#d02c21 !important;-webkit-box-shadow:inset 0 1px 0 #ec8b85,0 1px 0 rgba(0,0,0,0.15) !important;box-shadow:inset 0 1px 0 #ec8b85,0 1px 0 rgba(0,0,0,0.15) !important}.admin-color-midnight #redux-header{background:#363b3f;border-color:#e14d43}.admin-color-midnight #redux-header .display_header span{color:#c2c4c5}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections a{position:relative}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:after{border:0 none !important;content:"\0020" !important}.admin-color-midnight .redux-sidebar .redux-group-menu li.hasSubSections .redux-menu-error{display:none;margin-right:5px}.admin-color-midnight .redux-sidebar .redux-group-menu li.hasSubSections a.hasError .extraIconSubsections{background-color:#b94a48;color:#f2dede}.admin-color-midnight .redux-sidebar .redux-group-menu li.hasSubSections a .extraIconSubsections{border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;border:0 solid transparent;font-size:9px;height:9px;line-height:9px;margin-right:5px;padding:6px 7px 4px 7px;width:5px}.admin-color-midnight .redux-sidebar .redux-group-menu li.active a .extraIconSubsections,.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild a .extraIconSubsections{display:none}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections .redux-menu-error,.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .redux-menu-error{display:block}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections .subsection .redux-menu-error,.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .subsection .redux-menu-error{margin-right:2px}.admin-color-midnight .redux-sidebar .redux-group-menu li.active,.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild{border-left:0 none}.admin-color-midnight .redux-sidebar .redux-group-menu li.active a,.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild a{color:#363b3f}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections .active a:after,.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .active a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections a,.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{-webkit-transition:all 0.2s;-moz-transition:all 0.2s;transition:all 0.2s;color:#fff;width:auto;border-bottom:0}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li,.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li{border-top:0 none !important}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.active a:hover,.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a:hover{color:#fff}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a,.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{width:auto;border-top:0 !important;padding:7px;color:#fff;padding-left:15px;-webkit-transition:all 0.2;-moz-transition:all 0.2;-ms-transition:all 0.2;-o-transition:all 0.2;transition:all 0.2}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:hover,.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a:hover{color:#d92c23;background:#1e2124}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a span.group_title,.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a span.group_title{padding-left:5px !important}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a,.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a{padding-left:14px}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a span.group_title,.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a span.group_title{padding-left:30px !important}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections a{background:#e14d43}.admin-color-midnight .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a{background:#363b3f}.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{background:#c2c4c5;text-shadow:1px 1px #74787a}.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{background:#363b3f;text-shadow:none}.admin-color-midnight .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a{background:#e14d43;text-shadow:1px 1px #a4231a}.admin-color-midnight .redux-container-image_select .redux-image-select-selected img{border-color:#e14d43}.admin-color-midnight #redux-footer #redux-share a{color:#e14d43}.admin-color-midnight #redux-footer #redux-share a:hover{color:#a4231a}.admin-color-midnight .select2-results .select2-highlighted{background:#e14d43}.admin-color-midnight .select2-drop-active,.admin-color-midnight .select2-container-multi.select2-container-active .select2-choices,.admin-color-midnight .select2-drop.select2-drop-above.select2-drop-active,.admin-color-midnight .select2-container-active .select2-choice,.admin-color-midnight .select2-container-active .select2-choices,.admin-color-midnight .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-midnight .select2-dropdown-open.select2-drop-above .select2-choices{border-color:#e14d43}.admin-color-midnight .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-midnight .select2-dropdown-open.select2-drop-above .select2-choices{border-top:inherit}.admin-color-midnight .noUi-connect{background-color:#e35950 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#e8776f), to(#e35950)) !important;background-image:-moz-linear-gradient(top, #e8776f, #e35950) !important;background-image:-ms-linear-gradient(top, #e8776f, #e35950) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #e8776f), color-stop(100%, #e35950)) !important;background-image:-webkit-linear-gradient(top, #e8776f, #e35950) !important;background-image:-o-linear-gradient(top, #e8776f, #e35950) !important;background-image:-linear-gradient(top, #e8776f, #e35950) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e8776f', endColorstr='#e35950', GradientType=0) !important}.admin-color-ocean .button.ui-datepicker-current,.admin-color-ocean button.ui-datepicker-close{background-color:#a7c0a9 !important}.admin-color-ocean .ui-datepicker-buttonpane button.ui-datepicker-current{background:#86a988 !important;color:white !important;border:1px solid #547555 !important}.admin-color-ocean .ui-datepicker-header .ui-icon{background-image:url(data:image/png;base64,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) !important}.admin-color-ocean .ui-datepicker-header{background-color:#627c83 !important;color:white !important}.admin-color-ocean .ui-datepicker td .ui-state-active{background-color:#a7c0a9 !important;color:white !important}.admin-color-ocean .ui-datepicker td .ui-state-hover{color:#a7c0a9 !important}.admin-color-ocean .ui-datepicker td .ui-state-highlight{background:#9ebaa0 !important;border:1px solid #627c83 !important;color:white !important}.admin-color-ocean .redux-container-switch .cb-disable,.admin-color-ocean .redux-container-switch .cb-enable,.admin-color-ocean .ui-state-default,.admin-color-ocean .ui-widget-content .ui-state-default,.admin-color-ocean .ui-widget-header .ui-state-default{background-color:#f5f5f5 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#f8f8f8), to(#f5f5f5)) !important;background-image:-moz-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-ms-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #f8f8f8), color-stop(100%, #f5f5f5)) !important;background-image:-webkit-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-o-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-linear-gradient(top, #f8f8f8, #f5f5f5) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8', endColorstr='#f5f5f5', GradientType=0) !important;border-color:#ccc !important}.admin-color-ocean .ui-datepicker td .ui-state-active{color:black !important;font-weight:700 !important;background:white !important}.admin-color-ocean .redux-container-switch .cb-disable.selected{background-color:#646464 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#929292), to(#646464)) !important;background-image:-moz-linear-gradient(top, #929292, #646464) !important;background-image:-ms-linear-gradient(top, #929292, #646464) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #929292), color-stop(100%, #646464)) !important;background-image:-webkit-linear-gradient(top, #929292, #646464) !important;background-image:-o-linear-gradient(top, #929292, #646464) !important;background-image:-linear-gradient(top, #929292, #646464) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#929292', endColorstr='#646464', GradientType=0) !important;border-color:#767676 !important}.admin-color-ocean .redux-container-switch .cb-enable.selected,.admin-color-ocean .redux-field-container .ui-buttonset .ui-state-active{background-color:#9ebaa0 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#b3c9b4), to(#9ebaa0)) !important;background-image:-moz-linear-gradient(top, #b3c9b4, #9ebaa0) !important;background-image:-ms-linear-gradient(top, #b3c9b4, #9ebaa0) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #b3c9b4), color-stop(100%, #9ebaa0)) !important;background-image:-webkit-linear-gradient(top, #b3c9b4, #9ebaa0) !important;background-image:-o-linear-gradient(top, #b3c9b4, #9ebaa0) !important;background-image:-linear-gradient(top, #b3c9b4, #9ebaa0) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3c9b4', endColorstr='#9ebaa0', GradientType=0) !important;border-color:#719a74 !important;border-color:#80a583 !important;-webkit-box-shadow:inset 0 1px 0 #cbdacc,0 1px 0 rgba(0,0,0,0.15) !important;box-shadow:inset 0 1px 0 #cbdacc,0 1px 0 rgba(0,0,0,0.15) !important}.admin-color-ocean #redux-header{background:#627c83;border-color:#9ebaa0}.admin-color-ocean #redux-header .display_header span{color:#d5dddf}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections a{position:relative}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:after{border:0 none !important;content:"\0020" !important}.admin-color-ocean .redux-sidebar .redux-group-menu li.hasSubSections .redux-menu-error{display:none;margin-right:5px}.admin-color-ocean .redux-sidebar .redux-group-menu li.hasSubSections a.hasError .extraIconSubsections{background-color:#b94a48;color:#f2dede}.admin-color-ocean .redux-sidebar .redux-group-menu li.hasSubSections a .extraIconSubsections{border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;border:0 solid transparent;font-size:9px;height:9px;line-height:9px;margin-right:5px;padding:6px 7px 4px 7px;width:5px}.admin-color-ocean .redux-sidebar .redux-group-menu li.active a .extraIconSubsections,.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild a .extraIconSubsections{display:none}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections .redux-menu-error,.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .redux-menu-error{display:block}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections .subsection .redux-menu-error,.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .subsection .redux-menu-error{margin-right:2px}.admin-color-ocean .redux-sidebar .redux-group-menu li.active,.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild{border-left:0 none}.admin-color-ocean .redux-sidebar .redux-group-menu li.active a,.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild a{color:#627c83}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections .active a:after,.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .active a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections a,.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{-webkit-transition:all 0.2s;-moz-transition:all 0.2s;transition:all 0.2s;color:#fff;width:auto;border-bottom:0}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li,.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li{border-top:0 none !important}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.active a:hover,.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a:hover{color:#fff}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a,.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{width:auto;border-top:0 !important;padding:7px;color:#fff;padding-left:15px;-webkit-transition:all 0.2;-moz-transition:all 0.2;-ms-transition:all 0.2;-o-transition:all 0.2;transition:all 0.2}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:hover,.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a:hover{color:#86a988;background:#4c6066}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a span.group_title,.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a span.group_title{padding-left:5px !important}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a,.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a{padding-left:14px}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a span.group_title,.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a span.group_title{padding-left:30px !important}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections a{background:#9ebaa0}.admin-color-ocean .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a{background:#627c83}.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{background:#d5dddf;text-shadow:1px 1px #7e979d}.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{background:#627c83;text-shadow:none}.admin-color-ocean .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a{background:#9ebaa0;text-shadow:1px 1px #658d68}.admin-color-ocean .redux-container-image_select .redux-image-select-selected img{border-color:#9ebaa0}.admin-color-ocean #redux-footer #redux-share a{color:#9ebaa0}.admin-color-ocean #redux-footer #redux-share a:hover{color:#658d68}.admin-color-ocean .select2-results .select2-highlighted{background:#9ebaa0}.admin-color-ocean .select2-drop-active,.admin-color-ocean .select2-container-multi.select2-container-active .select2-choices,.admin-color-ocean .select2-drop.select2-drop-above.select2-drop-active,.admin-color-ocean .select2-container-active .select2-choice,.admin-color-ocean .select2-container-active .select2-choices,.admin-color-ocean .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-ocean .select2-dropdown-open.select2-drop-above .select2-choices{border-color:#9ebaa0}.admin-color-ocean .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-ocean .select2-dropdown-open.select2-drop-above .select2-choices{border-top:inherit}.admin-color-ocean .noUi-connect{background-color:#a7c0a9 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#bccfbd), to(#a7c0a9)) !important;background-image:-moz-linear-gradient(top, #bccfbd, #a7c0a9) !important;background-image:-ms-linear-gradient(top, #bccfbd, #a7c0a9) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #bccfbd), color-stop(100%, #a7c0a9)) !important;background-image:-webkit-linear-gradient(top, #bccfbd, #a7c0a9) !important;background-image:-o-linear-gradient(top, #bccfbd, #a7c0a9) !important;background-image:-linear-gradient(top, #bccfbd, #a7c0a9) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bccfbd', endColorstr='#a7c0a9', GradientType=0) !important}.admin-color-sunrise .button.ui-datepicker-current,.admin-color-sunrise button.ui-datepicker-close{background-color:#df8a48 !important}.admin-color-sunrise .ui-datepicker-buttonpane button.ui-datepicker-current{background:#cc6c23 !important;color:white !important;border:1px solid #753e14 !important}.admin-color-sunrise .ui-datepicker-header .ui-icon{background-image:url(data:image/png;base64,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) !important}.admin-color-sunrise .ui-datepicker-header{background-color:#b43c38 !important;color:white !important}.admin-color-sunrise .ui-datepicker td .ui-state-active{background-color:#df8a48 !important;color:white !important}.admin-color-sunrise .ui-datepicker td .ui-state-hover{color:#df8a48 !important}.admin-color-sunrise .ui-datepicker td .ui-state-highlight{background:#dd823b !important;border:1px solid #b43c38 !important;color:white !important}.admin-color-sunrise .redux-container-switch .cb-disable,.admin-color-sunrise .redux-container-switch .cb-enable,.admin-color-sunrise .ui-state-default,.admin-color-sunrise .ui-widget-content .ui-state-default,.admin-color-sunrise .ui-widget-header .ui-state-default{background-color:#f5f5f5 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#f8f8f8), to(#f5f5f5)) !important;background-image:-moz-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-ms-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #f8f8f8), color-stop(100%, #f5f5f5)) !important;background-image:-webkit-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-o-linear-gradient(top, #f8f8f8, #f5f5f5) !important;background-image:-linear-gradient(top, #f8f8f8, #f5f5f5) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8', endColorstr='#f5f5f5', GradientType=0) !important;border-color:#ccc !important}.admin-color-sunrise .ui-datepicker td .ui-state-active{color:black !important;font-weight:700 !important;background:white !important}.admin-color-sunrise .redux-container-switch .cb-disable.selected{background-color:#646464 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#929292), to(#646464)) !important;background-image:-moz-linear-gradient(top, #929292, #646464) !important;background-image:-ms-linear-gradient(top, #929292, #646464) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #929292), color-stop(100%, #646464)) !important;background-image:-webkit-linear-gradient(top, #929292, #646464) !important;background-image:-o-linear-gradient(top, #929292, #646464) !important;background-image:-linear-gradient(top, #929292, #646464) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#929292', endColorstr='#646464', GradientType=0) !important;border-color:#767676 !important}.admin-color-sunrise .redux-container-switch .cb-enable.selected,.admin-color-sunrise .redux-field-container .ui-buttonset .ui-state-active{background-color:#dd823b !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#e29559), to(#dd823b)) !important;background-image:-moz-linear-gradient(top, #e29559, #dd823b) !important;background-image:-ms-linear-gradient(top, #e29559, #dd823b) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #e29559), color-stop(100%, #dd823b)) !important;background-image:-webkit-linear-gradient(top, #e29559, #dd823b) !important;background-image:-o-linear-gradient(top, #e29559, #dd823b) !important;background-image:-linear-gradient(top, #e29559, #dd823b) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e29559', endColorstr='#dd823b', GradientType=0) !important;border-color:#ad5d1e !important;border-color:#c36922 !important;-webkit-box-shadow:inset 0 1px 0 #e8ac7c,0 1px 0 rgba(0,0,0,0.15) !important;box-shadow:inset 0 1px 0 #e8ac7c,0 1px 0 rgba(0,0,0,0.15) !important}.admin-color-sunrise #redux-header{background:#b43c38;border-color:#dd823b}.admin-color-sunrise #redux-header .display_header span{color:#f0c8c6}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections a{position:relative}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:after{border:0 none !important;content:"\0020" !important}.admin-color-sunrise .redux-sidebar .redux-group-menu li.hasSubSections .redux-menu-error{display:none;margin-right:5px}.admin-color-sunrise .redux-sidebar .redux-group-menu li.hasSubSections a.hasError .extraIconSubsections{background-color:#b94a48;color:#f2dede}.admin-color-sunrise .redux-sidebar .redux-group-menu li.hasSubSections a .extraIconSubsections{border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;border:0 solid transparent;font-size:9px;height:9px;line-height:9px;margin-right:5px;padding:6px 7px 4px 7px;width:5px}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active a .extraIconSubsections,.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild a .extraIconSubsections{display:none}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections .redux-menu-error,.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .redux-menu-error{display:block}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections .subsection .redux-menu-error,.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .subsection .redux-menu-error{margin-right:2px}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active,.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild{border-left:0 none}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active a,.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild a{color:#b43c38}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections .active a:after,.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild.hasSubSections .active a:after{right:0;border:solid 8px transparent;content:"\0020";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections a,.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{-webkit-transition:all 0.2s;-moz-transition:all 0.2s;transition:all 0.2s;color:#fff;width:auto;border-bottom:0}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li,.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li{border-top:0 none !important}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.active a:hover,.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a:hover{color:#fff}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a,.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{width:auto;border-top:0 !important;padding:7px;color:#fff;padding-left:15px;-webkit-transition:all 0.2;-moz-transition:all 0.2;-ms-transition:all 0.2;-o-transition:all 0.2;transition:all 0.2}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a:hover,.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a:hover{color:#cc6c23;background:#8d2f2c}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a span.group_title,.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a span.group_title{padding-left:5px !important}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a,.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a{padding-left:14px}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li.hasIcon a span.group_title,.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.hasIcon a span.group_title{padding-left:30px !important}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections a{background:#dd823b}.admin-color-sunrise .redux-sidebar .redux-group-menu li.active.hasSubSections ul.subsection li a{background:#b43c38}.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild.hasSubSections a{background:#f0c8c6;text-shadow:1px 1px #d0534d}.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li a{background:#b43c38;text-shadow:none}.admin-color-sunrise .redux-sidebar .redux-group-menu li.activeChild.hasSubSections ul.subsection li.active a{background:#dd823b;text-shadow:1px 1px #98511a}.admin-color-sunrise .redux-container-image_select .redux-image-select-selected img{border-color:#dd823b}.admin-color-sunrise #redux-footer #redux-share a{color:#dd823b}.admin-color-sunrise #redux-footer #redux-share a:hover{color:#98511a}.admin-color-sunrise .select2-results .select2-highlighted{background:#dd823b}.admin-color-sunrise .select2-drop-active,.admin-color-sunrise .select2-container-multi.select2-container-active .select2-choices,.admin-color-sunrise .select2-drop.select2-drop-above.select2-drop-active,.admin-color-sunrise .select2-container-active .select2-choice,.admin-color-sunrise .select2-container-active .select2-choices,.admin-color-sunrise .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-sunrise .select2-dropdown-open.select2-drop-above .select2-choices{border-color:#dd823b}.admin-color-sunrise .select2-dropdown-open.select2-drop-above .select2-choice,.admin-color-sunrise .select2-dropdown-open.select2-drop-above .select2-choices{border-top:inherit}.admin-color-sunrise .noUi-connect{background-color:#df8a48 !important;background-image:-khtml-gradient(linear, left top, left bottom, from(#e59e66), to(#df8a48)) !important;background-image:-moz-linear-gradient(top, #e59e66, #df8a48) !important;background-image:-ms-linear-gradient(top, #e59e66, #df8a48) !important;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #e59e66), color-stop(100%, #df8a48)) !important;background-image:-webkit-linear-gradient(top, #e59e66, #df8a48) !important;background-image:-o-linear-gradient(top, #e59e66, #df8a48) !important;background-image:-linear-gradient(top, #e59e66, #df8a48) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e59e66', endColorstr='#df8a48', GradientType=0) !important}@media screen and (max-width: 600px){.redux-group-tab-link-a{min-height:15px}.redux-group-tab-link-a span{padding:11px 12px;color:#555;-webkit-transition:all 0.3s;-moz-transition:all 0.3s;transition:all 0.3s;text-shadow:none !important}.redux-group-tab-link-a span:hover{background:#e5e5e5}}@media screen and (max-width: 782px){#redux-footer #redux-share{line-height:38px;font-size:18px}.sticky-save-warn .redux-save-warn{right:13px;top:46px}.redux-container .expand_options{margin-top:5px}.redux-action_bar input{margin-bottom:0 !important}}@media screen and (max-width: 600px){#redux-footer #redux-share,.redux-hint-qtip{display:none}.redux-container .redux-action_bar{float:none}}.redux-sidebar .icon-large,.redux-main .icon-large{background-image:inherit !important;width:inherit;height:inherit}.redux-main dd,.redux-main li,.redux-sidebar li{margin-bottom:0 !important}.fully-expanded .redux-sidebar{margin-left:-500px}.fully-expanded .redux-main{margin-left:0}.fully-expanded .redux-group-tab{display:block}@media screen and (max-width: 640px){#redux-defaults-section{display:none}}@media screen and (max-width: 730px){#redux-share{display:none}}@media screen and (max-width: 730px){#redux-defaults-section2{display:none}#redux-share{display:none}}@media screen and (max-width: 600px){.form-table>tbody>tr>th{padding-bottom:0 !important}.redux_field_th{padding-top:0;padding-bottom:0}.redux-main .redux-field-container{padding-top:0;padding-bottom:0}.redux-main .subsection a{min-height:15px}}@media screen and (min-width: 601px) and (max-width: 782px){.redux-container .sticky-save-warn .redux-save-warn{top:47px !important;right:13px !important}}@media screen and (max-width: 782px){.redux-main .form-table-section-indented input[type=text]{width:95% !important}.redux-main .redux-container-sortable input[type=text]{width:80%;display:initial}.redux-main .redux-typography-container .input_wrapper input.mini{font-size:16px !important;height:40px !important;padding:7px 10px !important;line-height:24px !important}.redux-main .redux-typography-container .picker-wrapper label{margin-top:16px !important}.redux-main .input-append{height:50px !important}.redux-main .input-append .add-on{font-size:16px;line-height:24px !important;padding:7px;height:32px !important;float:right;margin-top:-40px}.redux-main .redux-hint-qtip{float:left !important}.redux-main .redux-action_bar .button{margin-top:-1px}}@media screen and (max-width: 600px){.sticky-save-warn .redux-save-warn{top:0 !important;right:14px !important}}@media screen and (max-width: 570px){.redux-main .redux-container-sortable .checkbox-container{width:85%;padding-bottom:5px}.redux-main .redux-container-sortable .checkbox-container label{display:initial}}#redux-header{position:relative}.redux-main{position:relative}.redux-main #redux-sticky{min-height:32px;margin-left:-20px;margin-right:-20px;margin-top:-10px;margin-bottom:8px}.redux-main #redux-sticky #info_bar{height:32px}.redux-main #redux-sticky #info_bar .expand_options{margin-top:4px}.redux-main .redux_field_search{top:50px;right:5px}.redux-main #redux-footer-sticky{margin-left:-20px;margin-right:-20px;margin-bottom:-10px}.redux-qtip{z-index:999999 !important}.redux-main pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-admin.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-admin.scss deleted file mode 100755 index 9cba6ae2..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-admin.scss +++ /dev/null @@ -1,1516 +0,0 @@ -.spinner { - visibility: hidden; - display: block; -} -.spinner.is-active{ - visibility: visible; -} - -.redux-main .description { - margin-top: 7px; -} - -.form-table > tbody > tr > th { - width: 30% -} - -.redux-container { - //font-family: "Open Sans","Lucida Grande", Sans-serif; - background-color: #f5f5f5; /* Old browsers */ - background-repeat: repeat-x; /* Repeat the gradient */ - background-image: -moz-linear-gradient(top, #f2f2f2 0%, #f5f5f5 100%); /* FF3.6+ */ - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f2f2f2), color-stop(100%, #f5f5f5)); /* Chrome,Safari4+ */ - background-image: -webkit-linear-gradient(top, #f2f2f2 0%, #f5f5f5 100%); /* Chrome 10+,Safari 5.1+ */ - background-image: -ms-linear-gradient(top, #f2f2f2 0%, #f5f5f5 100%); /* IE10+ */ - background-image: -o-linear-gradient(top, #f2f2f2 0%, #f5f5f5 100%); /* Opera 11.10+ */ - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#eeeeee', GradientType=0); /* IE6-9 */ - background-image: -linear-gradient(top, #f2f2f2 0%, #f5f5f5 100%); /* W3C */ - border: 1px solid #dedede; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .04); - box-shadow: 0 1px 1px rgba(0, 0, 0, .04); - -moz-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.4); - margin-top: 5px; - overflow: hidden; - - a { - &:focus { - box-shadow: none; - } - } - - #redux-header, - #redux-footer { - text-align: right; - padding: 6px 10px; - } - - #redux-header { - background: #f1f1f1; - border-bottom: 3px solid blue; - - .display_header { - float: left; - margin: 20px 10px; - - h2 { - display: inline-block; - font-style: normal; - padding-right: 5px; - } - - .redux-dev-mode-notice-container { - position: absolute; - top: 67px; - left: 20px; - bottom: auto; - width: auto; - } - - span { - color: #888; - - &.redux-dev-mode-notice { - //position: absolute; - background-color: #f0ad4e; - display: inline; - padding: .2em .5em .2em; - font-weight: 700; - line-height: 1; - color: #fff !important; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; - } - } - } - - .icon32 { - float: right; - margin: 16px 16px 0; - } - } - - #redux-footer { - border-top: 1px solid #E7E7E7; - z-index: 999; - - #redux-share { - float: left; - line-height: 28px; - font-size: 15px; - - a { - text-decoration: none; - margin-right: 10px; - - img { - margin-bottom: -3px; - } - } - } - } - - .notice-green { - margin: 0; - border-bottom: 1px solid #E7E7E7; - background-color: #DFF0D8; - color: #468847; - padding: 8px 35px 8px 14px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - } - - .notice-blue { - margin: 0; - border-bottom: 1px solid #BCE8F1; - background-color: #D9EDF7; - color: #3A87AD; - padding: 8px 35px 8px 14px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - } - - .notice-yellow { - margin: 0; - border-bottom: 1px solid #E7E7E7; - background-color: #FCF8E3; - color: #C09853; - padding: 8px 35px 8px 14px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - } - - .notice-red, - .redux-field-errors { - margin: 0; - border-bottom: 1px solid #E7E7E7; - background-color: #F2DEDE; - color: #B94A48; - padding: 8px 35px 8px 14px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - } - - .redux-field-error { - input, textarea, checkbox { - background-color: #FFF6F6; - color: #A00; - } - - } - .redux-field-warning { - input, textarea, checkbox { - background-color: #fcf8e3; - color: #444; - } - } - - .redux-field-errors, - .redux-field-warnings, - .redux-save-warn { - display: none; - } - - .sticky-save-warn { - min-height: 76px; - - .redux-save-warn { - position: fixed; - top: 32px; - right: 21px; - left: 183px; - opacity: 1; - z-index: 9999; - } - } - - #info_bar { - background: #f3f3f3; - border-bottom: 1px solid #dedede; - padding: 6px 10px 6px 6px; - text-align: right; - -moz-box-shadow: inset 0 1px 0 #fcfcfc; - -webkit-box-shadow: inset 0 1px 0 #fcfcfc; - box-shadow: inset 0 1px 0 #fcfcfc; - } - - .redux-group-tab { - display: none; - margin-bottom: 15px; - - .redux-theme-data { - padding: 20px 0; - border-top: 1px solid #E7E7E7; - - &.theme-description { - padding: 10px 0; - border-width: 0; - } - - &.theme-uri, - &.theme-author, - &.theme-version { - padding: 0; - border-width: 0; - } - } - - h3 { - margin-top: 0; - line-height: 2em; - border-bottom: 1px solid #E7E7E7; - } - - .redux-section-desc { - margin-bottom: 15px; - color: #666; - } - } - - .redux-action_bar { - float: right; - .spinner { - float: left; - margin-top: 4px; - } - } - - .redux-ajax-loading { - display: none; - background: red url(data:image/gif;base64,R0lGODlhEAAQAPUAAIiIiIqKio2NjZSUlJqamp6enqKioqSkpK+vr7i4uL+/v8PDw8XFxcnJyc/Pz9HR0dTU1NjY2Nzc3OLi4ubm5unp6ezs7PPz88vLy83NzdDQ0NXV1d3d3eHh4bu7u8zMzOvr6+3t7ZiYmNbW1sDAwMTExNra2s7OztPT09vb2+Xl5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/i1NYWRlIGJ5IEtyYXNpbWlyYSBOZWpjaGV2YSAod3d3LmxvYWRpbmZvLm5ldCkAIfkEAAoA/wAsAAAAABAAEAAABXDgJY6XZZEoOTnOlI5WdUFNA5UnSR3FJNUSieFAIUUEgcdl4noEBBGSZaHIiSqKhTX2GhVFiQGjuxgkSoYAoosAGE6RhKQrUURHlS+pItMVCHMjEgQ9JBJISg+JT3ciFg4NFkcCNw0OViiDgF0oTC8hACH5BAAKAP8ALAAAAAAQABAAAAVx4CWOZGle1qJYp2hV1xYE29V1JXUYHWUcnQgGwyFFBAENiqUZ1kapFamTyeBcsNOLMkoMGC3GIIEyBBAtRMDAiiSKp04iQqpwc9kRpUCAizgEBVciEQNJFxpKGgECdFAYYBsCAjUMGS0XgAODmDacIyEAIfkEAAoA/wAsAAAAABAAEAAABnbAi3BILBovIMUidBSGQJdNIKBBMomUg6FDMRgoHcOBQowIqNaLJiCIEEMLxdWpnIfITRAHnxgwjiEfDR8UIQYBCEcgDYwdUR6ORxEfG3MgeFiFRB0FBBxEHAQFkUJmaBofamxuRB9/GwICGxeMTRehnrabpERBACH5BAAKAP8ALAAAAAAQABAAAAZ9wItwSCwaL5aFwnIUWiqXUSAwulSYRMrB0KEYDJSO4UAhRgQBDZLpCAgixOSSWFEssEho81IWJgYMTQwDCUgGAQhNCAEGTCMJHU0dCXBDFX1DFhwdeHwFIhxmGBihQxEDaRcOGhYao1WZGIFnAiMUDg6YRR0ioE57Fx2RRkEAIfkEAAoA/wAsAAAAABAAEAAABXLgJY5kaV7WolinaLGQEEBXxZLUUUyUYVATw4FCisg0NZYmIIiQUosKqaJY3FDS1oUoSgwYrcUggTIAEC1EwMCKJCatSYI2qnBx2dGkQOCQOAQFdxdGARoVGhCITE4kGBgWEI8QFgwYWhGTWiMWERFXIyEAIfkEAAoA/wAsAAAAABAAEAAABn/Ai3BILBovloXCchRaKpdRIDC6VJhEysHQoRgMlI7hQCFGBAENkukICCLE5JJYUSywSGjzUhYmBgxNDAMJSAYBCE0IAAZMEQkdTRwKVUMcHHhCFXpDERgYcJYEBZFDI58aFhoOFxpuoUIUGhoUZwJVGA6ZaxccBAQce0QdpUVBACH5BAAKAP8ALAAAAAAQABAAAAZ8wItwSCwaLyEFKXQUhioXSCAAuVSYRMrB0KEYDJSO4UAhmgQBDZKpCQhMxFBJgRVWlFkOtElhUj4NH3VEJQMJFx0NintFCAEGISEQH3BHHR5VThVlRRSMQh0FBBxEHAQFnEJnaRcfHxdtb0WKIWcCVSUNTYgEo7tEHR1HQQAh+QQACgD/ACwAAAAAEAAQAAAGdcCLcEgsGi8hhSJ0FHY6l1EgMLqAmEROo5HqGAwqL5g42qKsoAsqIEgRVacTdAhSLLBI1bWpwiYGDE0MAwlIBgEITQgBBkwjCRxNHQlVdCpGekUqBQSRQxwEBZdDKQIBZ3FqbG5EDYEjpikhW3hFoJ1NRU9HQQA7) no-repeat; - width: 16px; - height: 16px; - margin: 3px 4px 0; - float: right; - } - - #redux-intro-text { - background: #f3f3f3; - border-bottom: 1px solid #dedede; - -moz-box-shadow: inset 0 1px 0 #fcfcfc; - -webkit-box-shadow: inset 0 1px 0 #fcfcfc; - box-shadow: inset 0 1px 0 #fcfcfc; - padding: 3px; - padding: 10px 10px; - - p { - margin: 0; - font-family: "Lucida Grande", Sans-serif; - color: #888; - } - } - - .expand_options { - cursor: pointer; - display: block; - height: 22px; - width: 21px; - float: left; - font-size: 0; - text-indent: -9999px; - margin: 1px 0 0 5px; - border: 1px solid #bbb; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAyCAIAAAAm4OfBAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQhJREFUeNrslT0KhDAQhTeLR7ATT6IXSKGFYO0lciFrO1N4AU8TLNXKv0CaJbLJRAZxl1hYyJuXN+PoR/Z9fyFdBNNr27Zf8Oq6bhgGSGUYhpTSzyeBNi8hRFVVEK+6rrXaQFOs6yrvTdOYjcqyVEpTLqXI89yaSypBudq2xckF2TipOSvfmmhZFuAGnJV6Licvey5gj7fnwpwXvEfLfqnT0jQ1OBJCQLnUBvZ9b85VFAV076UU8g1ZckVRxBiDzD6OY62WzPOM9i+cpunvvcZxfCQfPWs9a91Ym2UZ5xyHtd/e8hXWng+/zlrD9jmz1tDj7bkw5wXv0Y210itJEs9az9oHsPYQYACveK0/IuB51AAAAABJRU5ErkJggg==) no-repeat -2px -26px; - - &.expanded { - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAyCAIAAAAm4OfBAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQhJREFUeNrslT0KhDAQhTeLR7ATT6IXSKGFYO0lciFrO1N4AU8TLNXKv0CaJbLJRAZxl1hYyJuXN+PoR/Z9fyFdBNNr27Zf8Oq6bhgGSGUYhpTSzyeBNi8hRFVVEK+6rrXaQFOs6yrvTdOYjcqyVEpTLqXI89yaSypBudq2xckF2TipOSvfmmhZFuAGnJV6Licvey5gj7fnwpwXvEfLfqnT0jQ1OBJCQLnUBvZ9b85VFAV076UU8g1ZckVRxBiDzD6OY62WzPOM9i+cpunvvcZxfCQfPWs9a91Ym2UZ5xyHtd/e8hXWng+/zlrD9jmz1tDj7bkw5wXv0Y210itJEs9az9oHsPYQYACveK0/IuB51AAAAABJRU5ErkJggg==) no-repeat -2px -1px - } - - &:hover { - border-color: #888; - } - } - - .sticky-footer-fixed { - background: #f3f3f3; - border-top: 1px solid #dedede !important; - -moz-box-shadow: inset 0 1px 0 #fcfcfc; - -webkit-box-shadow: inset 0 1px 0 #fcfcfc; - box-shadow: inset 0 1px 0 #fcfcfc; - } - - .redux-sidebar, - .redux-main { - min-height: 300px; - - } -} - -/* redux-container */ - -.no-js { - border: 1px solid #ffbaba; - margin: 0; - border-bottom: 1px solid #E7E7E7; - background-color: #F2DEDE; - color: #B94A48; - padding: 8px 35px 8px 14px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} - -.redux-main { - background: #FCFCFC; - margin-left: 201px; - border-left: 1px solid #D8D8D8; - padding: 10px 20px; - -moz-box-shadow: inset 0 1px 0 #fff; - -webkit-box-shadow: inset 0 1px 0 #FFF; - box-shadow: inset 0 1px 0 #FFF; - position: relative; - #redux_ajax_overlay { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - -moz-opacity: 0.10; - -khtml-opacity: 0.10; - opacity: 0.10; - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=10); - filter: alpha(opacity=10); - background: #000; - z-index: 200; - display: none; - } - .form-table.no-border { - border-top: none; - } - .form-table tr { - border-bottom: 1px solid #E7E7E7; - &:last-child { - border-bottom: none !important; - } - th, - td { - color: #333; - } - } - - .form-table tr td { - table.mceLayout, - table.mceLayout tr, - table.mceLayout tr td { - padding: 0; - border-width: 0; - } - - .redux-th-warning { - font-size: 1em; - color: #C09853; - font-weight: normal; - display: block; - margin-top: 10px; - } - - .redux-field-warning { - border-color: #C09853; - margin-top: 10px; - } - - .redux-th-error { - font-size: 1em; - color: #B94A48; - font-weight: normal; - display: block; - margin-top: 10px; - } - } - - input.large-text { - width: 100%; - } - - .hide { - display: none; - } - - .redux-field-container { - padding: 20px 0; - } - - .mini, - input[type=text].mini { - width: 60px; - text-align: center; - } - - input { - line-height: 19px; - } - - img { - max-width: 100%; - height: auto; - width: auto !important; - } - - .select2-default { - width: auto !important; - } - - .showDefaults { - display: block; - font-weight: normal; - font-size: .8em; - color: #888; - } - - span.description { - display: block; - font-style: normal; - font-weight: 400; - } - - #redux-system-info textarea { - min-height: 730px; - width: 100%; - } - - .field-desc { - clear: both; - font-size: 13px; - } - - .data-full li { - width: 100%; - } - - .data-half li { - width: 50%; - float: left; - } - - .data-third li { - width: 33.3%; - float: left; - } - - .data-quarter li { - width: 25%; - float: left; - } - - .ui-helper-hidden-accessible { - top: inherit; - } - - .form-table:first-child > tr th, .redux-main .form-table:first-child > tr td { - //padding-top: 0 !important; - } - - .form-table { - clear: none; - margin-top: 0px !important; - - &:first-child tr th, - &:first-child tr td { - // padding-top: 0 !important; - } - - tr:first-child th, - tr:first-child td { - padding-top: 0; - } - } - - .input-append input { - border-right: 0; - margin-bottom: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - margin-right: 0; - float: left; - margin-top: 0; - display: block; - } - .input-append .add-on { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - margin-left: -2px; - padding-top: 4px !important; - padding-bottom: 2px !important; - //float: left; - } - .input-prepend input { - border-left: 0; - margin-bottom: 0; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - margin-left: 0; - padding-top: 2px; - padding-bottom: 5px; - float: left; - margin-top: 0; - display: block; - } - .input-prepend .add-on { - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; - float: left; - } - - .input-append { - margin-right: 10px; - font-size: 0; - white-space: nowrap; - float: left; - display: inline-block; - margin-bottom: 6px; - } - .input-append .add-on, .input-prepend .add-on { - width: auto; - display: inline-block; - min-width: 16px; - padding: 3px 4px; - font-size: 12px; - font-weight: 400; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - background-color: #eeeeee; - border: 1px solid #cccccc; - } - .input-prepend { - font-size: 0; - white-space: nowrap; - float: left; - display: inline-block; - margin-bottom: 6px; - } -} - -/* main */ - -.redux-sidebar { - width: 202px; - float: left; - - .redux-group-menu { - margin-top: 0 !important; - li { - margin-top: 0; - - &.active a, - &.active a:hover, - &.activeChild a, - &.activeChild a:hover { - background: #FCFCFC; - color: #269ad6; - width: 184px; - opacity: 1; - //margin-right:-2px; - } - - &.active a li a { - background: #333; - padding-left: 5px; - } - - &.divide { - padding: 0; - border-width: 1px 0; - border-style: solid; - border-bottom-color: #E7E7E7; - border-top-color: #F9F9F9; - } - a:first-child { - border-top: none; - } - a { - display: block; - padding: 10px 4px 10px 14px; - background: #e0e0e0; - background: transparent; - border-width: 1px 0; - border-style: solid; - border-bottom-color: #E7E7E7; - border-top-color: #F9F9F9; - opacity: 0.7; - color: #555; - font-weight: 600; - text-decoration: none; - -webkit-transition: none; - transition: none; - &.custom-tab { - background: #f6f6f6; - } - img { - width: 16px; - height: 16px; - // vertical-align:middle; - // margin-bottom:-3px; - // margin-right: 3px; - position: absolute; - left: 15px; - } - &:hover { - background: #e5e5e5; - //width: 184px - color: #777; - //margin-right: -2px; - opacity: 1; - } - } - } - } - - .redux-menu-warning, - .redux-menu-error, - .hasSubSections .extraIconSubsections { - display: inline-block; - float: right; - padding: 6px 7px 4px 7px; - margin-left: 4px; - font-family: sans-serif; - font-size: 9px; - font-weight: 600; - line-height: 9px; - border-radius: 10px; - -moz-border-radius: 10px; - -webkit-border-radius: 10px; - border: 0 solid transparent; - //margin-right: 5px; - - i { - margin-left: -3px; - margin-top: -3px; - } - } - .redux-menu-error { - background-color: rgb(185, 74, 72); - color: rgb(242, 222, 222); - } - .redux-menu-warning { - background-color: #C09853; - color: #FCF8E3; - } - - ul { - .subsection { - display: none; - } - } - - .redux-group-tab-link-a { - position: relative; - outline: 0; - i { - vertical-align: middle; - font-size: 1.35em; - position: absolute; - } - span { - display: block; - &.group_title { - padding-left: 30px; - } - } - } - - .redux-group-tab-link-li a.hasError span.group_title { - padding-right: 25px; - } - - #redux-header { - text-align: center; - - .display_header { - float: none; - } - } -} - -/* sidebar */ - -.form-table th, -.form-table td { - margin: 0; - padding: 0; - width: auto; -} - -.redux_field_th { - font-weight: 600; - // width: 30%; - padding: 20px 10px 20px 0px; - display: block; - span:first-child { - font-weight: normal; - display: block; - color: #666; - } -} - -/* - * - * NHP_Options_color - * - */ -.farb-popup-wrapper { - position: relative; - display: block; -} - -.farb-popup { - position: absolute; - left: 40px; - top: 40px; - background-color: white; - border: 1px solid #222; - padding: 5px; - z-index: 100; -} - -#ui-datepicker-div { - display: none; -} - -.mp6 { - .icon-themes { - display: none; - } - - .redux-container { - #info_bar { - padding: 6px 10px 6px 6px; - - a { - margin-top: 2px; - } - } - } -} - -.redux-timer { - text-align: center; - font-size: 10px; - color: #888; -} - -.wrap { - margin-top: 0; -} - -@media screen and (max-width: 600px) { - .redux-sidebar { - width: 44px; - - .extraIconSubsections { - display: none !important; - } - - .redux-group-menu li a, - .redux-group-menu li a:hover, - .redux-group-menu li.active a, - .redux-group-menu li.active a:hover, - .redux-group-menu li.activeChild a, - .redux-group-menu li.activeChild a:hover { - width: auto; - } - - .redux-group-tab-link-a { - position: relative; - - i { - position: inherit; - } - - span { - display: none; - position: absolute; - top: 0; - left: 44px; - padding: 12px; - width: 200px; - background: #eeeeee; - border: 1px solid #ccc; - -webkit-box-shadow: 2px 2px 8px rgba(0, 0, 0, .2); - -moz-box-shadow: 2px 2px 8px rgba(0, 0, 0, .2); - box-shadow: 2px 2px 8px rgba(0, 0, 0, .2); - border-width: 1px 1px 1px 0px; - z-index: 3; - } - - &:hover > span { - display: block; - } - } - } - - .redux-main { - margin-left: 43px; - width: auto; - max-width: 100%; - } - - table.form-table, - .form-table > thead, - .form-table > tbody, - .form-table > tbody > tr > th, - .form-table > tbody > tr > td, - .form-table > tbody > tr { - display: block; - width: 100% !important; - padding: 0px !important; - } - - .form-table > tbody > tr > th, .form-table > tbody > tr > td { - padding: 10px !important; - } - - .form-table > tbody > tr > th, .form-table > tbody > tr > td { - padding: 10px !important; - } -} - -//mp6 fixes -@media screen and (max-width: 782px) { - .form-table>tbody>tr>th { - width: 100%; - } - .redux_field_th { - padding-bottom:0; - } - .mp6 { - .redux-container { - #info_bar { - height: auto; - padding-bottom: 1px; - - a { - margin-top: 5px; - } - } - } - } - .redux-container-switch label { - padding: 5px 10px !important; - - } - .redux-container-button_set label { - padding: 12px 10px; - } - .redux-container #redux-footer #redux-share { - line-height: 34px; - } - -} - -pre { - overflow: hidden; -} - -/* Default admin theme */ -#redux-header h2 { - color: #fff; -} - -@mixin backgroundGradient($to: darken($to, 5%), $from: lighten($to, 7%)) { - background-color: $to !important; - background-image: -khtml-gradient(linear, left top, left bottom, from($from), to($to)) !important; - background-image: -moz-linear-gradient(top, $from, $to) !important; - background-image: -ms-linear-gradient(top, $from, $to) !important; - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, $from), color-stop(100%, $to)) !important; - background-image: -webkit-linear-gradient(top, $from, $to) !important; - background-image: -o-linear-gradient(top, $from, $to) !important; - background-image: -linear-gradient(top, $from, $to) !important; - - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{$from}', endColorstr='#{$to}', GradientType=0) !important; -} - -@mixin adminThemeColorOverrides($darkColor, $accentColor, $secondaryColor, $buttonPrimary) { - - .button.ui-datepicker-current, - button.ui-datepicker-close { - background-color: lighten($accentColor, 3%) !important; - } - - .ui-datepicker-buttonpane button.ui-datepicker-current { - background: $buttonPrimary !important; - color: white !important; - border: 1px solid darken($buttonPrimary, 20%) !important; - - } - - .ui-datepicker-header .ui-icon { - background-image: url(data:image/png;base64,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) !important; - } - - .ui-datepicker-header { - background-color: $secondaryColor !important; - color: white !important; - } - - .ui-datepicker td .ui-state-active { - background-color: lighten($accentColor, 3%) !important; - color: white !important; - } - - .ui-datepicker td .ui-state-hover { - color: lighten($accentColor, 3%) !important; - } - - .ui-datepicker td .ui-state-highlight { - background: $accentColor !important; - border: 1px solid $secondaryColor !important; - color: white !important; - } - - .redux-container-switch .cb-disable, - .redux-container-switch .cb-enable, - .ui-state-default, - .ui-widget-content .ui-state-default, - .ui-widget-header .ui-state-default { - @include backgroundGradient(#f5f5f5, #f8f8f8); - border-color: #ccc !important; - } - - .ui-datepicker td .ui-state-active { - color: black !important; - font-weight: 700 !important; - background: white !important; - } - - .redux-container-switch .cb-disable.selected { - @include backgroundGradient(#646464, #929292); - border-color: #767676 !important; - } - .redux-container-switch .cb-enable.selected, - .redux-field-container .ui-buttonset .ui-state-active { - @include backgroundGradient($accentColor); - border-color: darken($accentColor, 15%) !important; - border-color: darken($accentColor, 10%) !important; - -webkit-box-shadow: inset 0 1px 0 lighten($accentColor, 15%), 0 1px 0 rgba(0, 0, 0, .15) !important; - box-shadow: inset 0 1px 0 lighten($accentColor, 15%), 0 1px 0 rgba(0, 0, 0, .15) !important; - - } - - #redux-header { - background: $secondaryColor; - border-color: $accentColor; - - .display_header span { - color: $darkColor; - } - } - - .redux-sidebar .redux-group-menu li.active { - &.hasSubSections { - - a { - position: relative; - &:after { - right: 0; - border: solid 8px transparent; - content: "\0020"; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - border-right-color: #fff; - top: 50%; - margin-top: -8px; - } - - } - ul.subsection li a:after { - border: 0 none !important; - content: "\0020" !important; - } - } - } - .redux-sidebar .redux-group-menu li { - &.hasSubSections { - .redux-menu-error { - display: none; - margin-right: 5px; - } - - a { - &.hasError { - .extraIconSubsections { - background-color: rgb(185, 74, 72); - color: rgb(242, 222, 222); - } - } - .extraIconSubsections { - border-radius: 10px; - -moz-border-radius: 10px; - -webkit-border-radius: 10px; - border: 0 solid transparent; - font-size: 9px; - height: 9px; - line-height: 9px; - margin-right: 5px; - padding: 6px 7px 4px 7px; - width: 5px; - } - - &:hover .extraIconSubsections { - //right: 2px; - } - - } - } - &.active, - &.activeChild { - a .extraIconSubsections { - display: none; - } - &.hasSubSections { - .redux-menu-error { - display: block; - } - .subsection { - .redux-menu-error { - margin-right: 2px; - } - } - } - } - } - - .redux-sidebar .redux-group-menu { - li.active, - li.activeChild { - border-left: 0 none; - a { - color: $secondaryColor; - } - &.hasSubSections { - .active { - a { - &:after { - right: 0; - border: solid 8px transparent; - content: "\0020"; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - border-right-color: #fff; - top: 50%; - margin-top: -8px; - } - } - } - a { - -webkit-transition: all 0.2s; - -moz-transition: all 0.2s; - transition: all 0.2s; - color: #fff; - width: auto; - border-bottom: 0; - } - ul.subsection li { - border-top: 0 none !important; - &.active a:hover { - color: #fff; - } - a { - width: auto; - border-top: 0 !important; - // border-top-color: lighten(@secondaryColor, 15); - padding: 7px; - color: #fff; - padding-left: 15px; - -webkit-transition: all 0.2; - -moz-transition: all 0.2; - -ms-transition: all 0.2; - -o-transition: all 0.2; - transition: all 0.2; - &:hover { - color: $buttonPrimary; - background: darken($secondaryColor, 10%); - } - span.group_title { - padding-left: 5px !important; - } - } - &.hasIcon { - a { - padding-left: 14px; - span.group_title { - padding-left: 30px !important; - } - - } - } - } - } - } - li.active { - &.hasSubSections { - a { - background: $accentColor; - } - ul.subsection li a { - background: $secondaryColor; - } - } - } - li.activeChild { - &.hasSubSections { - a { - background: $darkColor; - text-shadow: 1px 1px darken($darkColor, 30%); - } - ul.subsection li { - a { - background: $secondaryColor; - text-shadow: none; - } - &.active { - a { - background: $accentColor; - text-shadow: 1px 1px darken($accentColor, 20%); - } - } - } - } - } - } - - .redux-container-image_select .redux-image-select-selected img { - border-color: $accentColor; - } - #redux-footer #redux-share a { - color: $accentColor; - &:hover { - color: darken($accentColor, 20%); - } - } - .select2-results .select2-highlighted { - background: $accentColor; - } - .select2-drop-active, - .select2-container-multi.select2-container-active .select2-choices, - .select2-drop.select2-drop-above.select2-drop-active, - .select2-container-active .select2-choice, - .select2-container-active .select2-choices, - .select2-dropdown-open.select2-drop-above .select2-choice, - .select2-dropdown-open.select2-drop-above .select2-choices { - border-color: $accentColor; - } - .select2-dropdown-open.select2-drop-above .select2-choice, - .select2-dropdown-open.select2-drop-above .select2-choices { - border-top: inherit; - } - .noUi-connect { - @include backgroundGradient(lighten($accentColor, 3%)); - } -} - -/* Light fresh theme */ -.admin-color-fresh, .wp-customizer { - @include adminThemeColorOverrides(#a0a5aa, #0073aa, #23282d, #1e8cbe); -} - -/* Light admin theme */ -.admin-color-light { - @include adminThemeColorOverrides(#e6e6e6, #04a4cc, #888888, #0384a4); -} - -/* Blue admin theme */ -.admin-color-blue { - @include adminThemeColorOverrides(#e2ecf1, #4796b3, #096484, #db9825); -} - -/* Coffee admin theme */ -.admin-color-coffee { - @include adminThemeColorOverrides(#cdcbc9, #c7a589, #46403c, #ba906d); -} - -/* Ectoplasm admin theme */ -.admin-color-ectoplasm { - @include adminThemeColorOverrides(#cbc5d3, #a3b745, #413256, #89993a); -} - -/* Midnight admin theme */ -.admin-color-midnight { - @include adminThemeColorOverrides(#c2c4c5, #e14d43, #363b3f, #d92c23); -} - -/* Ocean admin theme */ -.admin-color-ocean { - @include adminThemeColorOverrides(#d5dddf, #9ebaa0, #627c83, #86a988); -} - -/* Sunrise admin theme */ -.admin-color-sunrise { - @include adminThemeColorOverrides(#f0c8c6, #dd823b, #b43c38, #cc6c23); -} - -@media screen and (max-width: 600px) { - // .redux-group-tab-link-a span { margin-top: -2px; } - .redux-group-tab-link-a { - min-height: 15px; - span { - //background: #222; - //color: white; - padding: 11px 12px; - color: #555; - -webkit-transition: all 0.3s; - -moz-transition: all 0.3s; - transition: all 0.3s; - &:hover { - //color: #2ea2cc; - //background: black; - background: #e5e5e5; - } - text-shadow: none !important; - } - } - - .redux-sidebar a { - - } -} - -@media screen and (max-width: 782px) { - #redux-footer #redux-share { - line-height: 38px; - font-size: 18px; - } - - .sticky-save-warn .redux-save-warn { - right: 13px; - top: 46px; - } - - .redux-container .expand_options { - margin-top: 5px; - } - - .redux-action_bar input { - margin-bottom: 0 !important; - } - -} - -@media screen and (max-width: 600px) { - #redux-footer #redux-share, - .redux-hint-qtip { - display: none; - } - - .redux-container .redux-action_bar { - float: none; - } -} - -// WP Engine CSS fix -.redux-sidebar .icon-large, -.redux-main .icon-large { - background-image: inherit !important; - width: inherit; - height: inherit; -} - -.redux-main dd, .redux-main li, .redux-sidebar li { - margin-bottom: 0 !important; -} - -.fully-expanded { - .redux-sidebar { - margin-left: -500px; - } - .redux-main { - margin-left: 0; - } - .redux-group-tab { - display: block; - } -} -@media screen and (max-width: 640px) { - #redux-defaults-section { - display: none; - } -} -@media screen and (max-width: 730px) { - #redux-share { - display:none; - } -} -@media screen and (max-width: 730px) { - #redux-defaults-section2 { - display: none; - } - #redux-share { - display:none; - } -} - -@media screen and (max-width: 600px) { - .form-table > tbody > tr > th { - padding-bottom: 0 !important; - } - - .redux_field_th { - padding-top: 0; - padding-bottom: 0; - } - - .redux-main { - .redux-field-container { - padding-top: 0; - padding-bottom: 0; - } - .subsection a { - min-height: 15px; - } - } -} - -@media screen and (min-width: 601px) and (max-width: 782px) { - .redux-container { - .sticky-save-warn .redux-save-warn { - top: 47px !important; - right: 13px !important; - } - } -} - -@media screen and (max-width: 782px) { - - .redux-main { - .form-table-section-indented { - input[type=text] { - width: 95% !important; - } - } - - .redux-container-sortable { - input[type=text] { - width: 80%; - display: initial; - } - } - - .redux-typography-container { - .input_wrapper input.mini { - font-size: 16px !important; - height: 40px !important; - padding: 7px 10px !important; - line-height: 24px !important; - } - .picker-wrapper label { - margin-top: 16px !important; - } - } - - .input-append { - height: 50px !important; - - .add-on { - font-size: 16px; - line-height: 24px !important; - padding: 7px; - height: 32px !important; - float: right; - margin-top: -40px; - } - } - - .redux-hint-qtip { - float: left !important; - } - .redux-action_bar .button { - margin-top: -1px; - } - } -} - -@media screen and (max-width: 600px) { - .sticky-save-warn .redux-save-warn { - top: 0 !important; - right: 14px !important; - } -} - -@media screen and (max-width: 570px) { - .redux-main { - .redux-container-sortable { - .checkbox-container { - width: 85%; - padding-bottom: 5px; - - label { - display: initial; - } - } - } - } -} - -#redux-header { - position: relative; -} - -/* Leftovers? */ - -/*.shadow1 { - position: relative; - - &:before, - &:after { - z-index: -1; - position: absolute; - content: ""; - bottom: 15px; - left: 10px; - width: 50%; - top: 80%; - max-width: 300px; - background: #777; - -webkit-box-shadow: 0 15px 10px rgba(0,0,0,0.4); - -moz-box-shadow: 0 15px 10px rgba(0,0,0,0.4); - box-shadow: 0 15px 10px rgba(0,0,0,0.4); - -webkit-transform: rotate(-3deg); - -moz-transform: rotate(-3deg); - -o-transform: rotate(-3deg); - -ms-transform: rotate(-3deg); - transform: rotate(-3deg); - } - - &:after { - -webkit-transform: rotate(3deg); - -moz-transform: rotate(3deg); - -o-transform: rotate(3deg); - -ms-transform: rotate(3deg); - transform: rotate(3deg); - right: 10px; - left: auto; - } -}*/ - -/*.redux-menu-warning { - background-color: #C09853; - color: #FCF8E3; -} -.redux-menu-error { - background-color: #B94A48; - color: #F2DEDE; -}*/ - -/*.redux-screenshot { - max-width: 300px; - display: block; -}*/ - -/*.redux-container { - .ajax-loading-img-top { - margin: 5px 4px 0; - float: left; - } - - .ajax-loading { - margin: 3px 4px 0; - float: right; - } - - .ajax-reset-loading-img { - display: block; - margin-left: 100px; - } -}*/ - -// Modern Theme - -.redux-main { - position: relative; - #redux-sticky { - min-height: 32px; - margin-left: -20px; - margin-right: -20px; - margin-top: -10px; - margin-bottom: 8px; - #info_bar { - height: 32px; - .expand_options { - margin-top: 4px; - } - } - } - .redux_field_search { - top: 50px; - right: 5px; - } - #redux-footer-sticky { - margin-left: -20px; - margin-right: -20px; - margin-bottom: -10px; - } -} -.redux-qtip { - z-index: 999999 !important; - -} - -.redux-main pre { - white-space: pre-wrap; /* css-3 */ - white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ - white-space: -pre-wrap; /* Opera 4-6 */ - white-space: -o-pre-wrap; /* Opera 7 */ - word-wrap: break-word; /* Internet Explorer 5.5+ */ -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-fields.css b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-fields.css deleted file mode 100755 index c8dc0e85..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-fields.css +++ /dev/null @@ -1 +0,0 @@ -.redux-container-ace_editor .ace-wrapper{position:static}.redux-container-ace_editor .ace_editor{height:200px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.redux-container-ace_editor .ace_gutter{z-index:1!important}.redux-main .redux-container-background .redux-background-attachment,.redux-main .redux-container-background .redux-background-attachment select,.redux-main .redux-container-background .redux-background-clip,.redux-main .redux-container-background .redux-background-clip select,.redux-main .redux-container-background .redux-background-origin,.redux-main .redux-container-background .redux-background-origin select,.redux-main .redux-container-background .redux-background-position,.redux-main .redux-container-background .redux-background-position select,.redux-main .redux-container-background .redux-background-repeat,.redux-main .redux-container-background .redux-background-repeat select,.redux-main .redux-container-background .redux-background-size,.redux-main .redux-container-background .redux-background-size select{width:200px!important;margin-right:10px;margin-bottom:7px}.redux-main .redux-container-background .background-preview{display:block;width:100%;margin:5px 0 10px;border:1px dotted #d3d3d3}.redux-main .redux-container-background .select2-container{margin-right:10px;margin-bottom:10px}.redux-main .redux-container-background .wp-picker-container{margin-bottom:10px}.redux-main .redux-container-background .upload{width:100%;margin-bottom:8px}.redux-main .redux-container-select li.ui-state-highlight{height:20px;margin-top:2px;margin-left:5px;width:64px;margin-bottom:0}.wp-customizer .redux-container-background .redux-background-attachment,.wp-customizer .redux-container-background .redux-background-attachment select,.wp-customizer .redux-container-background .redux-background-clip,.wp-customizer .redux-container-background .redux-background-clip select,.wp-customizer .redux-container-background .redux-background-origin,.wp-customizer .redux-container-background .redux-background-origin select,.wp-customizer .redux-container-background .redux-background-position,.wp-customizer .redux-container-background .redux-background-position select,.wp-customizer .redux-container-background .redux-background-repeat,.wp-customizer .redux-container-background .redux-background-repeat select,.wp-customizer .redux-container-background .redux-background-size,.wp-customizer .redux-container-background .redux-background-size select{width:100%!important}.redux-container-border .select2-container{float:left;display:block;margin-right:10px}.redux-container-border .select_wrapper{float:left;width:inherit}.redux-container-border .select_wrapper select{width:80px;float:left}.redux-container-border .field-border-input{margin-right:10px;margin-bottom:7px}.redux-container-border .wp-picker-container{margin-top:2px}@media screen and (max-width:782px){.redux-container-border .field-border-input input{display:inline-block!important;width:100px!important}.redux-container-border .field-border-input .add-on{padding:7px 4px;font-size:16px;line-height:1.5}.redux-container-border .select_wrapper{margin-top:6px}}.redux-container-checkbox label{vertical-align:top;width:100%}.redux-container-checkbox label .field-desc{margin-top:0;float:left;width:93%;clear:none}.redux-container-color_gradient .colorGradient{display:inline-block}.redux-container-color_gradient .toLabel{padding-left:18px}@media screen and (max-width:660px){.redux-container-color_gradient .colorGradient{display:block;text-align:center!important}}.sp-container,.sp-replacer{color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);vertical-align:top}.sp-replacer.focus,.sp-replacer.hover,.sp-replacer:focus,.sp-replacer:hover{background:#fafafa;border-color:#999;color:#222}.sp-replacer.focus,.sp-replacer:focus{-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.sp-replacer.active:focus{-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5),0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5),0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.sp-replacer.active,.sp-replacer.active:hover,.sp-replacer:active{background:#eee;border-color:#999;color:#333;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}#ui-datepicker-div{z-index:15!important}.ui-datepicker-header{background-color:#00abef}.redux-dimensions-container .select_wrapper,.redux-dimensions-container select{width:65px!important;float:left}.redux-dimensions-container .field-dimensions-input{margin-right:10px;margin-bottom:7px}@media screen and (max-width:782px){.redux-dimensions-container .field-dimensions-input input{display:inline-block!important;width:100px!important}.redux-dimensions-container .field-dimensions-input .add-on{padding:7px 4px;font-size:16px;line-height:1.5}.redux-dimensions-container .select_wrapper{margin-top:6px}}.redux-main .divide{float:none;border-color:#E7E7E7;display:block;width:100%;height:35px!important;line-height:35px!important;position:relative;margin:15px 0 10px}.redux-main .divide .inner,.redux-main .divide .inner span{background-color:#FCFCFC;border-color:#E7E7E7;position:absolute}.redux-main .divide .inner{width:42%!important;left:40%!important;margin-left:-6%;height:1px;top:50%;margin-top:-1px;border-top-width:1px;border-top-style:solid}.redux-main .divide .inner span{height:5px;width:5px;border-width:2px;border-style:solid;display:block;left:50%;margin-left:-5px;margin-top:-5px}.wp-customizer .redux-container-divide .divide .inner{width:82%!important;left:18%!important;margin-left:-8%}.redux-container-editor .mceLayout td{border-width:1px;margin:0;padding:1px}.redux-container-editor input,.redux-container-editor textarea{margin:inherit}.redux-container-editor textarea{border:0}.redux-container-editor .wp-editor-container{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.redux-container-editor .wp-editor-container textarea{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border-style:inherit}.redux-container-editor .quicktags-toolbar input{margin:2px 1px 4px;line-height:18px;display:inline-block;min-width:26px;padding:2px 4px;font:12px/18px Arial,Helvetica,sans-serif normal;color:#464646;border:1px solid #c3c3c3;-webkit-border-radius:3px;border-radius:3px;background:#eee;background-image:-webkit-gradient(linear,left bottom,left top,from(#e3e3e3),to(#fff));background-image:-webkit-linear-gradient(bottom,#e3e3e3,#fff);background-image:-moz-linear-gradient(bottom,#e3e3e3,#fff);background-image:-o-linear-gradient(bottom,#e3e3e3,#fff);background-image:linear-gradient(to top,#e3e3e3,#fff)}.redux-container-image_select .redux-table-container{display:table;table-layout:fixed;width:100%}.redux-container-image_select .redux-image-select{margin:0!important}.redux-container-image_select .redux-image-select .tiles{display:block;background-color:#FFF;background-repeat:repeat;width:40px;height:40px}.redux-container-image_select .redux-image-select .tiles,.redux-container-image_select .redux-image-select img{border-color:#d9d9d9}.redux-container-image_select .redux-image-select li:last-child{margin-bottom:0}.redux-container-image_select .redux-image-select input[type=radio]{display:none}.redux-container-image_select .redux-image-select-presets img{width:100%}.redux-container-image_select ul.redux-image-select li{margin:0 10px 3px;display:inline-block;padding:2px 2px 2px 0}.redux-container-image_select .redux-image-select-selected{background-color:#f9f9f9}.redux-container-image_select .redux-image-select .tiles,.redux-container-image_select .redux-image-select img,.redux-container-image_select .redux-image-select-selected .tiles,.redux-container-image_select .redux-image-select-selected img{border-width:4px;border-style:solid}.redux-container-image_select .redux-image-select-selected .tiles{border-color:#7a7a7a}.redux-info-field .redux-info-icon i,.redux-notice-field .redux-info-icon i{font-size:2em}.redux-info-field .redux-info-desc,.redux-notice-field .redux-info-desc{display:inline-block;vertical-align:top}.redux-info-field{min-height:20px;padding:8px 19px;margin:10px 0;border-radius:4px;border:1px solid;position:relative}.redux-info-field h1,.redux-info-field h2,.redux-info-field h3,.redux-info-field h4,.redux-info-field h5,.redux-info-field h6{border-bottom:0!important}.redux-info-field h3{color:#777}.redux-info-field .redux-info-icon{display:inline-block;margin-right:15px}.redux-info-field.redux-normal{background-color:#eee;border-color:#ccc;color:#666}.redux-info-field.redux-normal i{color:#c5c5c5}.redux-info-field.redux-warning{background-color:#fbeba4;border-color:#d7c281;color:#958234}.redux-info-field.redux-warning i{color:#dcca81}.redux-info-field.redux-success{background-color:#c4ee91;border-color:#71af5d;color:#4d7615}.redux-info-field.redux-success i{color:#a0ca6c}.redux-info-field.redux-critical{background-color:#fba1a3;border-color:#b84f5b;color:#981225}.redux-info-field.redux-critical i{color:#dd767d}.redux-info-field.redux-info{background-color:#d3e4f4;border-color:#a9b6c2;color:#5c80a1}.redux-info-field.redux-info i{color:#afc6da}.redux-notice-field{margin:15px 0 0;background-color:#fff;border:0;border-left:4px solid #f3f3f3;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1);padding:1px 12px}.redux-notice-field h1,.redux-notice-field h2,.redux-notice-field h3,.redux-notice-field h4,.redux-notice-field h5,.redux-notice-field h6{border-bottom:0!important}.redux-notice-field p{margin:.5em 0;padding:2px}.redux-notice-field .redux-info-icon{display:inline-block;margin-right:15px}.redux-notice-field.redux-info{border-left:4px solid #0099d5}.redux-notice-field.redux-success{border-left:4px solid #7ad03a}.redux-notice-field.redux-warning{border-left:4px solid #fbeba4}.redux-notice-field.redux-critical{border-left:4px solid #dd3d36}.redux-main .redux-field-container.redux-container-info{padding:0}.wp-customizer .hasIcon.redux-info-field .redux-info-desc,.wp-customizer .hasIcon.redux-notice-field .redux-info-desc{display:block;margin-left:43px}.wp-customizer .hasIcon.redux-info-field .redux-info-icon,.wp-customizer .hasIcon.redux-notice-field .redux-info-icon{float:left}.wp-customizer .redux-main .customize-control.customize-control-redux-info{border-bottom:0}.redux-container-link_color .linkColor{display:inline-block;padding-right:10px;padding-bottom:7px}.redux-main .button.remove-image,.redux-main .removeCSS{margin-left:10px;color:#ef521d}.redux-main .button.remove-image:hover,.redux-main .removeCSS:hover{color:red}.redux-main .upload_button_div{margin-bottom:5px}.redux-main .upload-error{float:left;color:#666;font-size:10px;font-weight:700;text-decoration:none;text-shadow:1px 1px 0 #FFF;margin:0 10px 0 0;padding:3px 10px;background:#FFDFEC;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.redux-main .reset-button{font-family:Arial,Verdana,sans-serif;float:left;margin:0;color:#ef521d;border-color:#bbb}.redux-main .redux-option-image{max-height:340px;max-width:340px;padding:5px;margin-bottom:0;margin-top:10px;margin-right:15px;border:1px solid #e3e3e3;background:#f7f7f7;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.redux-main .redux-main .upload{width:80%!important}.redux-main .button{margin-top:2px}.redux-container-multi_text ul.redux-multi-text{margin:0;padding:0}.redux-container-multi_text .redux-multi-text-add{clear:both;margin:5px 0}.redux-container-multi_text a.redux-multi-text-remove.deletion{color:red;padding:2px 4px;margin-left:5px}.redux-container-multi_text a.redux-multi-text-remove.deletion:hover{background:red;color:#fff;text-decoration:none}@media screen and (max-width:782px){.redux-container-multi_text input{clear:both}.redux-container-multi_text .redux-multi-text-remove{margin:0;float:right}}.wp-customizer .redux-container-multi_text .button{float:right}.wp-customizer .redux-container-multi_text .redux-multi-text-remove{float:right;margin-bottom:5px}.wp-customizer .redux-container-multi_text ul.redux-multi-text input{width:100%!important}.redux-container-palette label{border:3px solid transparent;border-color:transparent!important;border-radius:0;width:100%!important;display:block}.redux-container-palette label.ui-button.ui-widget{width:95%;background:0 0;padding:0}.redux-container-palette label.ui-button.ui-widget .ui-button-text{display:flex}.redux-container-palette label.ui-button.ui-widget .ui-button-text span{padding:10px;flex-grow:1;font-size:0;line-height:10px;color:transparent;-webkit-transition:all 200ms ease-in-out;-moz-transition:all 200ms ease-in-out;-ms-transition:all 200ms ease-in-out;-o-transition:all 200ms ease-in-out;transition:all 200ms ease-in-out;text-shadow:0}.redux-container-palette label.ui-button.ui-widget .ui-button-text span:hover{flex-grow:3;font-weight:700;min-width:60px;font-size:12px;line-height:10px;color:#333;text-shadow:0 0 8px #fff,0 0 8px #fff}.redux-container-palette label.ui-state-active{border:3px solid #333!important}.wp-customizer .redux-main .redux-container-palette label{margin-bottom:3px}.redux-main .form-table-section-indented{width:95%;margin-left:5%}.redux-main .form-table-section tr:first-of-type th:first-of-type{padding:0!important}.redux-main h3{margin-top:10px}.redux-main .form-table-section-indented>tbody>tr:first-child{display:none}.redux-main .form-table-section-indented>tbody>tr:nth-last-child(2){border-bottom:0}.redux-container-select li.ui-state-highlight{height:20px;margin-top:2px;margin-left:5px;width:64px;margin-bottom:0}.redux-container-select_image{margin-top:2px;margin-left:5px;width:100%;margin-bottom:0}.redux-preview-image{max-height:250px;max-width:250px;padding:5px;margin-top:10px;border:1px solid #e3e3e3;background:#f7f7f7;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.redux-container-slider .redux-slider-container{margin-left:25px;margin-right:25px;width:200px;display:inline-block;vertical-align:middle}.redux-container-slider .redux-slider-input,.redux-container-slider .redux-slider-select-one,.redux-container-slider .redux-slider-select-two{width:100px!important;text-align:center}.redux-container-slider .redux-slider-label{position:absolute;margin-left:-5px}.redux-container-slider .redux-slider-label-one{position:absolute;margin-left:-22px}.redux-container-slider .redux-slider-label-two{position:absolute;margin-top:-21px;margin-left:245px}@media screen and (max-width:782px){.redux-container-slider input{display:inline-block!important}}@media screen and (max-width:570px){.redux-container-slider{text-align:center}.redux-container-slider .redux-slider-label,.redux-container-slider .select2-container,.redux-container-slider input,.redux-container-slider select{display:block!important;position:inherit;margin:10px auto}.redux-container-slider .redux-slider-container{margin-top:3px;width:80%}}.wp-customizer .redux-container-slider .redux-slider-label{float:left;position:inherit;width:25%;text-align:center;margin-left:0}.wp-customizer .redux-container-slider .redux-slider-input,.wp-customizer .redux-container-slider .redux-slider-select-one,.wp-customizer .redux-container-slider .redux-slider-select-two{width:25%!important}.wp-customizer .redux-container-slider .redux-slider-container{width:70%;margin-right:0;margin-left:5%}.noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-user-select:none;-ms-touch-action:none;-ms-user-select:none;-moz-user-select:none;-moz-box-sizing:border-box;box-sizing:border-box}.noUi-base{width:100%;height:100%;position:relative}.noUi-origin{position:absolute;right:0;top:0;left:0;bottom:0;border-radius:2px}.noUi-handle{position:relative;z-index:1}.noUi-stacking .noUi-handle{z-index:10}.noUi-state-tap .noUi-origin{-webkit-transition:left .3s,top .3s;transition:left .3s,top .3s}.noUi-state-drag *{cursor:inherit!important}.noUi-horizontal{height:18px}.noUi-horizontal .noUi-handle{width:34px;height:28px;left:-17px;top:-6px}.noUi-horizontal.noUi-extended{padding:0 15px}.noUi-horizontal.noUi-extended .noUi-origin{right:-15px}.noUi-vertical{width:18px}.noUi-vertical .noUi-handle{width:28px;height:34px;left:-6px;top:-17px}.noUi-vertical.noUi-extended{padding:15px 0}.noUi-vertical.noUi-extended .noUi-origin{bottom:-15px}.noUi-background{background:#FAFAFA;box-shadow:inset 0 1px 1px #f0f0f0}.noUi-connect{background:#3FB8AF;box-shadow:inset 0 0 3px rgba(51,51,51,.45);-webkit-transition:background 450ms;transition:background 450ms}.noUi-target{border-radius:4px;border:1px solid #D3D3D3;box-shadow:inset 0 1px 1px #F0F0F0,0 3px 6px -5px #BBB}.noUi-target.noUi-connect{box-shadow:inset 0 0 3px rgba(51,51,51,.45),0 3px 6px -5px #BBB}.noUi-dragable{cursor:w-resize}.noUi-vertical .noUi-dragable{cursor:n-resize}.noUi-handle{border:1px solid #D9D9D9;border-radius:3px;background:#FFF;cursor:default;box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #EBEBEB,0 3px 6px -3px #BBB}.noUi-active{box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #DDD,0 3px 6px -3px #BBB}.noUi-handle:after,.noUi-handle:before{content:"";display:block;position:absolute;height:14px;width:1px;background:#E8E7E6;left:14px;top:6px}.noUi-handle:after{left:17px}.noUi-vertical .noUi-handle:after,.noUi-vertical .noUi-handle:before{width:14px;height:1px;left:6px;top:14px}.noUi-vertical .noUi-handle:after{top:17px}[disabled] .noUi-connect,[disabled].noUi-connect{background:#B8B8B8}[disabled] .noUi-handle{cursor:not-allowed}.noUi-state-blocked .noUi-connect,.noUi-state-blocked.noUi-connect{background:#4FDACF}.redux-container-slides .redux-slides-list .select2-container{margin-bottom:10px;width:100%}.redux-container-slides .ui-accordion-header{margin-bottom:0}.redux-container-slides .full-text,.redux-container-slides .large-text{width:100%}.redux-container-slides .redux-slides-accordion-group{border:1px solid #dfdfdf!important;border-radius:3px!important;margin-top:0!important;margin-bottom:10px;background:#f9f9f9;padding:5px}.redux-container-slides .redux-slides-accordion-group h3{border:1px solid #dfdfdf;cursor:move!important;font-weight:700;padding:0 10px!important;height:40px;line-height:40px!important;background-color:#f1f1f1;background-image:-ms-linear-gradient(top,#f9f9f9,#ececec);background-image:-moz-linear-gradient(top,#f9f9f9,#ececec);background-image:-o-linear-gradient(top,#f9f9f9,#ececec);background-image:-webkit-gradient(linear,left top,left bottom,from(#f9f9f9),to(#ececec));background-image:-webkit-linear-gradient(top,#f9f9f9,#ececec);background-image:linear-gradient(top,#f9f9f9,#ececec);overflow:hidden;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;text-align:center}.redux-container-slides #redux-slides-accordion .redux-slides-image{height:250px;padding:5px;margin-top:10px;margin-bottom:10px;border:1px solid #e3e3e3;background:#f7f7f7;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.redux-container-slides .redux-slides-add{float:right;margin-right:10%;display:block;margin-bottom:10px}.redux-container-slides .redux-slides-remove{color:#ef521d!important;float:right;margin-top:5px}.redux-container-slides .redux-slides-header{font-weight:700}.redux-container-slides .redux_slides_add_remove{margin-bottom:10px}.redux-container-slides input{width:100%!important}.wp-customizer .redux-container-slides .ui-accordion .ui-accordion-content{padding:10px}.redux-container-sortable i.el{cursor:move}.redux-container-sortable label{margin-right:10px;width:300px}.redux-container-sortable label.bugger{margin-bottom:0!important;font-size:12px!important;color:#999}.redux-container-sortable input{margin-right:10px}.redux-container-sortable .checkbox-container{width:364px}.redux-container-sortable .checkbox-container .drag{float:right;margin-left:10px}.redux-container-sortable ul.labeled li{line-height:1.4em!important}.redux-container-sortable li{line-height:30px!important}.redux-container-sortable li.ui-state-highlight{height:30px;width:364px;margin-bottom:13px}.redux-container-sortable li.placeholder{height:30px;margin:10px 0}.wp-customizer .redux-sortable input[type=text]{width:92%}.wp-customizer .redux-sortable i.el{margin-left:5px}.wp-customizer .redux-container-sortable .checkbox-container{width:inherit}.wp-customizer .redux-container-sortable .ui-draggable-handle{margin-left:3%}.redux-container-sorter{margin-right:-20px}.redux-container-sorter ul{background:#F9F9F9;border:1px solid #E3E3E3;min-height:40px;padding:10px 10px 0;width:145px;float:left;margin:0 15px 0 0}.redux-container-sorter ul.filled{opacity:.7;filter:alpha(opacity=70);background:#efecec}.redux-container-sorter ul li{border:1px solid #DFDFDF;cursor:move;font-weight:700;margin-bottom:10px!important;padding:0 10px;height:40px;line-height:40px!important;background-color:#F1F1F1;background-image:-ms-linear-gradient(top,#f9f9f9,#ececec);background-image:-moz-linear-gradient(top,#f9f9f9,#ececec);background-image:-o-linear-gradient(top,#f9f9f9,#ececec);background-image:-webkit-gradient(linear,left top,left bottom,from(#f9f9f9),to(#ececec));background-image:-webkit-linear-gradient(top,#f9f9f9,#ececec);background-image:linear-gradient(top,#f9f9f9,#ececec);overflow:hidden;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;text-align:center}.redux-container-sorter ul li h3{margin:0 0 10px;text-align:center;color:#777;text-transform:capitalize;word-wrap:break-word}.redux-container-sorter ul li.placeholder{height:40px}.wp-customizer .redux-container-sorter ul{width:85%;margin:0 0 5px}.redux-container-spacing .select_wrapper,.redux-container-spacing select{width:80px!important;float:left}.redux-container-spacing .field-spacing-input{margin-right:10px;margin-bottom:7px}@media screen and (max-width:782px){.redux-container-spacing .field-spacing-input input{display:inline-block!important;width:70px!important}.redux-container-spacing .field-spacing-input .add-on{padding:7px 4px;font-size:16px;line-height:1.5}.redux-container-spacing .select_wrapper{margin-top:6px}}.redux-container-spinner .spinner-wrpr{position:relative;display:block;height:30px;overflow:hidden}.redux-container-spinner .spinner-wrpr .spinner-input{position:relative!important;z-index:1;width:45px!important;height:30px!important;background:#e7e7e7!important;border:1px solid #bfbfbf!important;border-right:0!important;border-left:0!important;-webkit-border-radius:0!important;-moz-border-radius:0!important;border-radius:0!important}.redux-container-spinner .ui-spinner{position:static;display:inline}.redux-container-spinner .ui-spinner-buttons{position:absolute;padding:0}.redux-container-spinner .ui-widget .ui-spinner-button{position:absolute;top:0;padding:0 0 30px;overflow:hidden;cursor:pointer;background:-moz-linear-gradient(#fff,#f3f3f3);background:-o-linear-gradient(#fff,#f3f3f3);background:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f3f3f3));background:linear-gradient(#fff,#f3f3f3);background-color:#fff;border:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.redux-container-spinner .ui-spinner-button:hover,.redux-container-spinner .ui-state-hover{background:-moz-linear-gradient(#f3f3f3,#fff);background:-o-linear-gradient(#f3f3f3,#fff);background:-webkit-gradient(linear,left top,left bottom,from(#f3f3f3),to(#fff));background:linear-gradient(#f3f3f3,#fff);background-color:#f3f3f3}.redux-container-spinner .ui-corner-tr,.redux-container-spinner .ui-spinner-button .ui-icon-triangle-1-n{-webkit-border-radius:0 5px 5px 0;-moz-border-radius:0 5px 5px 0;border-radius:0 5px 5px 0}.redux-container-spinner .ui-corner-br,.redux-container-spinner .ui-spinner-button .ui-icon-triangle-1-s{-webkit-border-radius:5px 0 0 5px;-moz-border-radius:5px 0 0 5px;border-radius:5px 0 0 5px}.redux-container-spinner .ui-spinner-button .ui-icon{top:0;display:block;width:28px;height:28px;margin:0;border:1px solid #b7b7b7}.redux-container-spinner .ui-spinner-button .ui-icon-triangle-1-n{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAKCAYAAACXDi8zAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADxJREFUeNpsjwsKADAIQu3u3tsRY6M5gz7w0AqSQFLdZ3ZRgmf44JQ/EOZ9oYOsiDviVemP2oYoWCwBBgDpO6VXVo3RyQAAAABJRU5ErkJggg==) 10px 10px no-repeat!important}.redux-container-spinner .ui-spinner-button .ui-icon-triangle-1-s{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAKCAYAAACXDi8zAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADhJREFUeNpi+P//PwM6bmlpwS4IorEKokggC8Il0AVhEv9x6sAmiaz9P05XIUsygmVRAUiAESDAAFHcpVdWtdj/AAAAAElFTkSuQmCC) 10px 10px no-repeat!important}.redux-container-switch .cb-disable.selected,.redux-container-switch .cb-enable.selected{color:#fff}.redux-container-switch .switch-options{min-height:30px;margin-right:10px}.redux-container-switch .switch-options label{cursor:pointer}.redux-container-switch .switch-options input{display:none}.redux-container-switch .cb-disable,.redux-container-switch .cb-enable{padding:0 10px;border-width:1px;border-style:solid;-webkit-appearance:none;white-space:nowrap;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.redux-container-switch .cb-disable span,.redux-container-switch .cb-enable span{line-height:30px;font-weight:700;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-o-user-select:none;-ms-user-select:none;user-select:none}.redux-container-switch .cb-disable,.redux-container-switch .cb-disable span,.redux-container-switch .cb-enable,.redux-container-switch .cb-enable span{display:block;float:left}.redux-container-switch .cb-enable{border-right:0;border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;-webkit-border-radius:3px 0 0 3px}.redux-container-switch .cb-disable{border-left:0;border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;-webkit-border-radius:0 3px 3px 0}.redux-container-text label{display:block;position:relative;font-size:12px!important;text-align:left;color:#999;margin:4px 0 2px!important;cursor:default;top:5px;width:100px}.redux-container-text input{clear:left}.redux-container-text .input_wrapper{display:block;position:relative;padding:0;width:23%;max-width:23%;min-width:70px;float:left;clear:left;height:57px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;vertical-align:baseline}.wp-customizer .redux-container-text .input_wrapper{width:100%;max-width:100%;height:auto}.redux-main .redux-typography-container{display:block;position:relative;margin:0;padding:0;width:100%;max-width:660px}.redux-main .redux-typography-container .clearfix{clear:both}.redux-main .redux-typography-container .clearfix:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.redux-main .redux-typography-container .redux-typography-color,.redux-main .redux-typography-container input.wp-picker-default{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;height:24px;padding:0 14px!important;margin-top:0;margin-bottom:0;margin-left:4px!important;font-size:12px!important}.redux-main .redux-typography-container .select_wrapper{display:block;position:relative;float:left;clear:none;margin:0 10px 0 0;width:48%!important;min-width:210px!important;max-width:324px!important;height:57px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box}.redux-main .redux-typography-container .select_wrapper:nth-child(even),.redux-main .redux-typography-container .select_wrapper:nth-child(odd){margin-right:10px!important}.redux-main .redux-typography-container .select_wrapper.typography-family .select2-container{width:100%}.redux-main .redux-typography-container .select_wrapper .redux-typography{font-size:14px!important;display:block;float:left;height:28px!important;line-height:50px!important;padding:0!important;width:100%!important;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box}.redux-main .redux-typography-container .wp-picker-container{float:left;clear:left;margin-bottom:12px;padding:3px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.redux-main .redux-typography-container .input_wrapper{display:block;position:relative;margin:0 4px 0 5px;padding:0;width:23%;max-width:23%;min-width:70px;float:left;clear:none;height:57px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;vertical-align:baseline}.redux-main .redux-typography-container .input_wrapper.font-size{margin-left:0}.redux-main .redux-typography-container .input_wrapper input.mini{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;width:78%;text-align:center;margin:0;height:28px;top:3px;padding:0 2px 0 5px;text-decoration:none;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.redux-main .redux-typography-container .picker-wrapper{display:block;position:relative;margin:0;padding:0;width:23%;width:100%;max-width:23%;min-width:70px;min-width:100%;clear:none;height:57px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;vertical-align:baseline}.redux-main .redux-typography-container label{display:block;position:relative;font-size:12px!important;text-align:left;color:#999;margin:4px 0 2px!important;cursor:default}.redux-main .redux-typography-container .typography-preview{display:none;width:100%;border:1px dotted #d3d3d3;max-width:850px;padding:10px;font-size:10pt;height:auto;margin:5px 0 10px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.redux-main .redux-typography-container .typography-color{border:0;margin:0}.redux-main .redux-typography-container ::-webkit-input-placeholder{line-height:19px}@media screen and (max-width:540px){.redux-main .redux-main .redux-typography-container{max-width:230px;margin:0 auto}.redux-main .redux-main .redux-typography-container .select_wrapper{max-width:210px;min-width:210px;width:210px;margin-left:0!important;margin-right:0!important}.redux-main .redux-main .redux-typography-container .input_wrapper{max-width:101px;min-width:101px;width:101px;margin-left:0!important;margin-right:5px!important}.redux-main .redux-main .redux-typography-container .input_wrapper input.mini{width:73%}.redux-main .redux-main .redux-typography-container .input-append .add-on{width:30%;padding:5px!important}.redux-main .redux-main .redux-main .wp-picker-container .wp-picker-input-wrap{margin-top:7px}}@media screen and (max-width:360px){.redux-main .redux-typography-container .iris-picker .iris-square{margin-right:3%}}.wp-customizer .redux-typography-container .input_wrapper{width:40%;max-width:40%;min-width:20%}.wp-customizer .redux-typography-container .input_wrapper input.mini{width:70%}.wp-customizer .redux-typography-container .select_wrapper{width:100%!important}.redux-main input.redux-color{float:left;width:70px;margin-left:5px}.redux-main input.color-transparency{margin-left:10px;margin-right:3px}.redux-main input.wp-color-picker{width:80px!important}.redux-main .section-color .controls{width:345px}.redux-main .section-color .explain{width:225px}.redux-main .iris-picker .iris-strip .ui-slider-handle{position:absolute;background:0 0!important;right:-3px;left:-3px;border:4px solid #aaa!important;border-width:4px 3px;width:auto;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.2);opacity:.9;z-index:5;cursor:ns-resize}.redux-main .iris-picker .iris-slider-offset{position:absolute;top:2px;left:0;right:0;bottom:4px;width:28px;background:0 0!important;border:0!important;height:auto}.redux-main .wp-picker-container input{margin-bottom:inherit;margin-top:inherit;padding:3px 5px}.redux-main .wp-picker-container .wp-color-result{outline:0;margin:0}.redux-main .wp-picker-container .wp-picker-default{padding:0 10px 1px}.redux-main .redux-color-gradient{line-height:24px}.redux-main .color-transparency-check{line-height:1;margin-top:0!important}.redux-main .wp-picker-clear{margin-top:0!important}.wp-customizer .redux-main .redux-typography-container .redux-typography-color,.wp-customizer .redux-main .redux-typography-container input.wp-picker-default,.wp-customizer .redux-main input.wp-picker-default{padding:0 4px!important}.wp-customizer .redux-main input.wp-color-picker{width:65px!important;margin-left:5px!important}.redux-main .button.remove-image,.redux-main .removeCSS{margin-left:10px;color:#ef521d}.redux-main .button.remove-image:hover,.redux-main .removeCSS:hover{color:red}.redux-main .upload_button_div{margin-bottom:5px}.redux-main .upload-error{float:left;color:#666;font-size:10px;font-weight:700;text-decoration:none;text-shadow:1px 1px 0 #FFF;margin:0 10px 0 0;padding:3px 10px;background:#FFDFEC;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.redux-main .reset-button{font-family:Arial,Verdana,sans-serif;float:left;margin:0;color:#ef521d;border-color:#bbb}.redux-main .redux-option-image{max-height:340px;max-width:340px;padding:5px;margin-bottom:0;margin-top:10px;margin-right:15px;border:1px solid #e3e3e3;background:#f7f7f7;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.redux-main .redux-main .upload{width:80%!important}.redux-main .button{margin-top:2px} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-vendor.css b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-vendor.css deleted file mode 100755 index f0e99d1a..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/redux-vendor.css +++ /dev/null @@ -1 +0,0 @@ -.qtip{position:absolute;left:-28000px;top:-28000px;display:none;max-width:280px;min-width:50px;font-size:10.5px;line-height:12px;direction:ltr;box-shadow:none;padding:0}.qtip-content{position:relative;padding:5px 9px;overflow:hidden;text-align:left;word-wrap:break-word}.qtip-titlebar{position:relative;padding:5px 35px 5px 10px;overflow:hidden;border-width:0 0 1px;font-weight:700}.qtip-titlebar+.qtip-content{border-top-width:0!important}.qtip-close{position:absolute;right:-9px;top:-9px;cursor:pointer;outline:0;border-width:1px;border-style:solid;border-color:transparent}.qtip-titlebar .qtip-close{right:4px;top:50%;margin-top:-9px}* html .qtip-titlebar .qtip-close{top:16px}.qtip-icon .ui-icon,.qtip-titlebar .ui-icon{display:block;text-indent:-1000em;direction:ltr}.qtip-icon,.qtip-icon .ui-icon{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;text-decoration:none}.qtip-icon .ui-icon{width:18px;height:14px;line-height:14px;text-align:center;text-indent:0;font:normal bold 10px/13px Tahoma,sans-serif;color:inherit;background:-100em -100em no-repeat}.qtip-default{border-width:1px;border-style:solid;border-color:#F1D031;background-color:#FFFFA3;color:#555}.qtip-default .qtip-titlebar{background-color:#FFEF93}.qtip-default .qtip-icon{border-color:#CCC;background:#F1F1F1;color:#777}.qtip-default .qtip-titlebar .qtip-close{border-color:#AAA;color:#111}/*! Light tooltip style */.qtip-light{background-color:#fff;border-color:#E2E2E2;color:#454545}.qtip-light .qtip-titlebar{background-color:#f1f1f1}/*! Dark tooltip style */.qtip-dark{background-color:#505050;border-color:#303030;color:#f3f3f3}.qtip-dark .qtip-titlebar{background-color:#404040}.qtip-dark .qtip-icon{border-color:#444}.qtip-dark .qtip-titlebar .ui-state-hover{border-color:#303030}/*! Cream tooltip style */.qtip-cream{background-color:#FBF7AA;border-color:#F9E98E;color:#A27D35}.qtip-cream .qtip-titlebar{background-color:#F0DE7D}.qtip-cream .qtip-close .qtip-icon{background-position:-82px 0}/*! Red tooltip style */.qtip-red{background-color:#F78B83;border-color:#D95252;color:#912323}.qtip-red .qtip-titlebar{background-color:#F06D65}.qtip-red .qtip-close .qtip-icon{background-position:-102px 0}.qtip-red .qtip-icon,.qtip-red .qtip-titlebar .ui-state-hover{border-color:#D95252}/*! Green tooltip style */.qtip-green{background-color:#CAED9E;border-color:#90D93F;color:#3F6219}.qtip-green .qtip-titlebar{background-color:#B0DE78}.qtip-green .qtip-close .qtip-icon{background-position:-42px 0}/*! Blue tooltip style */.qtip-blue{background-color:#E5F6FE;border-color:#ADD9ED;color:#5E99BD}.qtip-blue .qtip-titlebar{background-color:#D0E9F5}.qtip-blue .qtip-close .qtip-icon{background-position:-2px 0}.qtip-shadow{-webkit-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);-moz-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);box-shadow:1px 1px 3px 1px rgba(0,0,0,.15)}.qtip-bootstrap,.qtip-rounded,.qtip-tipsy{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.qtip-rounded .qtip-titlebar{-moz-border-radius:4px 4px 0 0;-webkit-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.qtip-youtube{-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 3px #333;-moz-box-shadow:0 0 3px #333;box-shadow:0 0 3px #333;color:#fff;border-width:0;background:#4A4A4A;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#4A4A4A),color-stop(100%,#000));background-image:-webkit-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-moz-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-ms-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-o-linear-gradient(top,#4A4A4A 0,#000 100%)}.qtip-youtube .qtip-titlebar{background-color:transparent}.qtip-youtube .qtip-content{padding:.75em;font:12px arial,sans-serif;filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#4a4a4a, EndColorStr=#000000);-ms-filter:"progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#4a4a4a,EndColorStr=#000000);"}.qtip-youtube .qtip-icon{border-color:#222}.qtip-youtube .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-jtools{background:#232323;background:rgba(0,0,0,.7);background-image:-webkit-gradient(linear,left top,left bottom,from(#717171),to(#232323));background-image:-moz-linear-gradient(top,#717171,#232323);background-image:-webkit-linear-gradient(top,#717171,#232323);background-image:-ms-linear-gradient(top,#717171,#232323);background-image:-o-linear-gradient(top,#717171,#232323);border:2px solid #ddd;border:2px solid rgba(241,241,241,1);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 12px #333;-moz-box-shadow:0 0 12px #333;box-shadow:0 0 12px #333}.qtip-jtools .qtip-titlebar{background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171, endColorstr=#4A4A4A);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A)"}.qtip-jtools .qtip-content{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A, endColorstr=#232323);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323)"}.qtip-jtools .qtip-content,.qtip-jtools .qtip-titlebar{background:0 0;color:#fff;border:0 dashed transparent}.qtip-jtools .qtip-icon{border-color:#555}.qtip-jtools .qtip-titlebar .ui-state-hover{border-color:#333}.qtip-cluetip{-webkit-box-shadow:4px 4px 5px rgba(0,0,0,.4);-moz-box-shadow:4px 4px 5px rgba(0,0,0,.4);box-shadow:4px 4px 5px rgba(0,0,0,.4);background-color:#D9D9C2;color:#111;border:0 dashed transparent}.qtip-cluetip .qtip-titlebar{background-color:#87876A;color:#fff;border:0 dashed transparent}.qtip-cluetip .qtip-icon{border-color:#808064}.qtip-cluetip .qtip-titlebar .ui-state-hover{border-color:#696952;color:#696952}.qtip-tipsy{background:#000;background:rgba(0,0,0,.87);color:#fff;border:0 solid transparent;font-size:11px;font-family:'Lucida Grande',sans-serif;font-weight:700;line-height:16px;text-shadow:0 1px #000}.qtip-tipsy .qtip-titlebar{padding:6px 35px 0 10px;background-color:transparent}.qtip-tipsy .qtip-content{padding:6px 10px}.qtip-tipsy .qtip-icon{border-color:#222;text-shadow:none}.qtip-tipsy .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-tipped{border:3px solid #959FA9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-color:#F9F9F9;color:#454545;font-weight:400;font-family:serif}.qtip-tipped .qtip-titlebar{border-bottom-width:0;color:#fff;background:#3A79B8;background-image:-webkit-gradient(linear,left top,left bottom,from(#3A79B8),to(#2E629D));background-image:-webkit-linear-gradient(top,#3A79B8,#2E629D);background-image:-moz-linear-gradient(top,#3A79B8,#2E629D);background-image:-ms-linear-gradient(top,#3A79B8,#2E629D);background-image:-o-linear-gradient(top,#3A79B8,#2E629D);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8, endColorstr=#2E629D);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D)"}.qtip-tipped .qtip-icon{border:2px solid #285589;background:#285589}.qtip-tipped .qtip-icon .ui-icon{background-color:#FBFBFB;color:#555}.qtip-bootstrap{font-size:14px;line-height:20px;color:#333;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.qtip-bootstrap .qtip-titlebar{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.qtip-bootstrap .qtip-titlebar .qtip-close{right:11px;top:45%;border-style:none}.qtip-bootstrap .qtip-content{padding:9px 14px}.qtip-bootstrap .qtip-icon{background:0 0}.qtip-bootstrap .qtip-icon .ui-icon{width:auto;height:auto;float:right;font-size:20px;font-weight:700;line-height:18px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.qtip-bootstrap .qtip-icon .ui-icon:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}.qtip:not(.ie9haxors) div.qtip-content,.qtip:not(.ie9haxors) div.qtip-titlebar{filter:none;-ms-filter:none}.qtip .qtip-tip{margin:0 auto;overflow:hidden;z-index:10}.qtip .qtip-tip,x:-o-prefocus{visibility:hidden}.qtip .qtip-tip,.qtip .qtip-tip .qtip-vml,.qtip .qtip-tip canvas{position:absolute;color:#123456;background:0 0;border:0 dashed transparent}.qtip .qtip-tip canvas{top:0;left:0}.qtip .qtip-tip .qtip-vml{behavior:url(#default#VML);display:inline-block;visibility:visible}#qtip-overlay{position:fixed;left:0;top:0;width:100%;height:100%}#qtip-overlay.blurs{cursor:pointer}#qtip-overlay div{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#000;opacity:.7;filter:alpha(opacity=70);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"}.qtipmodal-ie6fix{position:absolute!important}.sp-container{position:absolute;top:0;left:0;display:inline-block;z-index:9999994;overflow:hidden}.sp-container.sp-flat{position:relative}.sp-container,.sp-container *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.sp-top{position:relative;width:100%;display:inline-block}.sp-top-inner{position:absolute;top:0;left:0;bottom:0;right:0}.sp-color{position:absolute;top:0;left:0;bottom:0;right:20%}.sp-hue{position:absolute;top:0;right:0;bottom:0;left:84%;height:100%}.sp-clear-enabled .sp-hue{top:33px;height:77.5%}.sp-fill{padding-top:80%}.sp-sat,.sp-val{position:absolute;top:0;left:0;right:0;bottom:0}.sp-alpha-enabled .sp-top{margin-bottom:18px}.sp-alpha-enabled .sp-alpha{display:block}.sp-alpha-handle{position:absolute;top:-4px;bottom:-4px;width:6px;left:50%;cursor:pointer;border:1px solid #000;background:#fff;opacity:.8}.sp-alpha{display:none;bottom:-14px;right:0;left:0;height:8px}.sp-alpha-inner{border:1px solid #333}.sp-clear{display:none}.sp-clear.sp-clear-display{background-position:center}.sp-clear-enabled .sp-clear{display:block;position:absolute;top:0;right:0;bottom:0;left:84%;height:28px}.sp-alpha,.sp-alpha-handle,.sp-clear,.sp-container,.sp-container button,.sp-container.sp-dragging .sp-input,.sp-dragger,.sp-preview,.sp-replacer,.sp-slider{-webkit-user-select:none;-moz-user-select:-moz-none;-o-user-select:none;user-select:none}.sp-container.sp-buttons-disabled .sp-button-container,.sp-container.sp-input-disabled .sp-input-container,.sp-container.sp-palette-buttons-disabled .sp-palette-button-container,.sp-initial-disabled .sp-initial,.sp-palette-disabled .sp-palette-container,.sp-palette-only .sp-picker-container{display:none}.sp-sat{background-image:-webkit-gradient(linear,0 0,100% 0,from(#FFF),to(rgba(204,154,129,0)));background-image:-webkit-linear-gradient(left,#FFF,rgba(204,154,129,0));background-image:-moz-linear-gradient(left,#fff,rgba(204,154,129,0));background-image:-o-linear-gradient(left,#fff,rgba(204,154,129,0));background-image:-ms-linear-gradient(left,#fff,rgba(204,154,129,0));background-image:linear-gradient(to right,#fff,rgba(204,154,129,0));-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)";filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81')}.sp-val{background-image:-webkit-gradient(linear,0 100%,0 0,from(#000),to(rgba(204,154,129,0)));background-image:-webkit-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:-moz-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:-o-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:-ms-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:linear-gradient(to top,#000,rgba(204,154,129,0));-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000')}.sp-hue{background:-moz-linear-gradient(top,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);background:-ms-linear-gradient(top,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);background:-o-linear-gradient(top,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);background:-webkit-gradient(linear,left top,left bottom,from(red),color-stop(.17,#ff0),color-stop(.33,#0f0),color-stop(.5,#0ff),color-stop(.67,#00f),color-stop(.83,#f0f),to(red));background:-webkit-linear-gradient(top,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);background:linear-gradient(to bottom,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.sp-1{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00')}.sp-2{height:16%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00')}.sp-3{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff')}.sp-4{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff')}.sp-5{height:16%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff')}.sp-6{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000')}.sp-hidden{display:none!important}.sp-cf:after,.sp-cf:before{content:"";display:table}.sp-cf:after{clear:both}@media (max-device-width:480px){.sp-color{right:40%}.sp-hue{left:63%}.sp-fill{padding-top:60%}}.sp-dragger{border-radius:5px;height:5px;width:5px;border:1px solid #fff;background:#000;cursor:pointer;position:absolute;top:0;left:0}.sp-slider{position:absolute;top:0;cursor:pointer;height:3px;left:-1px;right:-1px;border:1px solid #000;background:#fff;opacity:.8}.sp-container{border-radius:0;background-color:#ECECEC;border:1px solid #f0c49B;padding:0}.sp-clear,.sp-color,.sp-container,.sp-container button,.sp-container input,.sp-hue{font:400 12px "Lucida Grande","Lucida Sans Unicode","Lucida Sans",Geneva,Verdana,sans-serif;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.sp-top{margin-bottom:3px}.sp-clear,.sp-color,.sp-hue{border:1px solid #666}.sp-input-container{float:right;width:100px;margin-bottom:4px}.sp-initial-disabled .sp-input-container{width:100%}.sp-input{font-size:12px!important;border:1px inset;padding:4px 5px;margin:0;width:100%;background:0 0;border-radius:3px;color:#222}.sp-input:focus{border:1px solid orange}.sp-input.sp-validation-error{border:1px solid red;background:#fdd}.sp-palette-container,.sp-picker-container{float:left;position:relative;padding:10px 10px 300px;margin-bottom:-290px}.sp-picker-container{width:172px;border-left:solid 1px #fff}.sp-palette-container{border-right:solid 1px #ccc}.sp-palette-only .sp-palette-container{border:0}.sp-palette .sp-thumb-el{display:block;position:relative;float:left;cursor:pointer}.sp-palette .sp-thumb-el.sp-thumb-active,.sp-palette .sp-thumb-el:hover{border-color:orange}.sp-initial{float:left;border:1px solid #333}.sp-initial span{width:30px;height:25px;border:none;display:block;float:left;margin:0}.sp-initial .sp-clear-display{background-position:center}.sp-button-container,.sp-palette-button-container{float:right}.sp-replacer{margin:0;overflow:hidden;cursor:pointer;padding:4px;display:inline-block;border:1px solid #91765d;background:#eee;color:#333;vertical-align:middle}.sp-replacer.sp-active,.sp-replacer:hover{border-color:#F0C49B;color:#111}.sp-replacer.sp-disabled{cursor:default;border-color:silver;color:silver}.sp-dd{padding:2px 0;height:16px;line-height:16px;float:left;font-size:10px}.sp-preview{width:25px;height:20px;border:1px solid #222;margin-right:5px;float:left;z-index:0}.sp-palette{max-width:220px}.sp-palette .sp-thumb-el{width:16px;height:16px;margin:2px 1px;border:1px solid #d0d0d0}.sp-container{padding-bottom:0}.sp-container button{background-color:#eee;background-image:-webkit-linear-gradient(top,#eee,#ccc);background-image:-moz-linear-gradient(top,#eee,#ccc);background-image:-ms-linear-gradient(top,#eee,#ccc);background-image:-o-linear-gradient(top,#eee,#ccc);background-image:linear-gradient(to bottom,#eee,#ccc);border:1px solid #ccc;border-bottom:1px solid #bbb;border-radius:3px;color:#333;font-size:14px;line-height:1;padding:5px 4px;text-align:center;text-shadow:0 1px 0 #eee;vertical-align:middle}.sp-container button:hover{background-color:#ddd;background-image:-webkit-linear-gradient(top,#ddd,#bbb);background-image:-moz-linear-gradient(top,#ddd,#bbb);background-image:-ms-linear-gradient(top,#ddd,#bbb);background-image:-o-linear-gradient(top,#ddd,#bbb);background-image:linear-gradient(to bottom,#ddd,#bbb);border:1px solid #bbb;border-bottom:1px solid #999;cursor:pointer;text-shadow:0 1px 0 #ddd}.sp-container button:active{border:1px solid #aaa;border-bottom:1px solid #888;-webkit-box-shadow:inset 0 0 5px 2px #aaa,0 1px 0 0 #eee;-moz-box-shadow:inset 0 0 5px 2px #aaa,0 1px 0 0 #eee;-ms-box-shadow:inset 0 0 5px 2px #aaa,0 1px 0 0 #eee;-o-box-shadow:inset 0 0 5px 2px #aaa,0 1px 0 0 #eee;box-shadow:inset 0 0 5px 2px #aaa,0 1px 0 0 #eee}.sp-cancel{font-size:11px;color:#d93f3f!important;margin:0 5px 0 0;padding:2px;vertical-align:middle;text-decoration:none}.sp-cancel:hover{color:#d93f3f!important;text-decoration:underline}.sp-palette span.sp-thumb-active,.sp-palette span:hover{border-color:#000}.sp-alpha,.sp-preview,.sp-thumb-el{position:relative;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.sp-alpha-inner,.sp-preview-inner,.sp-thumb-inner{display:block;position:absolute;top:0;left:0;bottom:0;right:0}.sp-palette .sp-thumb-inner{background-position:50% 50%;background-repeat:no-repeat}.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=)}.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=)}.sp-clear-display{background-repeat:no-repeat;background-position:center;background-image:url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==)}.select2-container{margin:0;position:relative;display:inline-block;zoom:1;vertical-align:middle}.select2-container,.select2-drop,.select2-search,.select2-search input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.select2-container .select2-choice{display:block;height:26px;padding:0 0 0 8px;overflow:hidden;position:relative;border:1px solid #aaa;white-space:nowrap;line-height:26px;color:#444;text-decoration:none;border-radius:4px;background-clip:padding-box;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#eee),color-stop(.5,#fff));background-image:-webkit-linear-gradient(center bottom,#eee 0,#fff 50%);background-image:-moz-linear-gradient(center bottom,#eee 0,#fff 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);background-image:linear-gradient(to top,#eee 0,#fff 50%)}html[dir=rtl] .select2-container .select2-choice{padding:0 8px 0 0}.select2-container.select2-drop-above .select2-choice{border-bottom-color:#aaa;border-radius:0 0 4px 4px;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#eee),color-stop(.9,#fff));background-image:-webkit-linear-gradient(center bottom,#eee 0,#fff 90%);background-image:-moz-linear-gradient(center bottom,#eee 0,#fff 90%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);background-image:linear-gradient(to bottom,#eee 0,#fff 90%)}.select2-container.select2-allowclear .select2-choice .select2-chosen{margin-right:42px}.select2-container .select2-choice>.select2-chosen{margin-right:26px;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;float:none;width:auto}html[dir=rtl] .select2-container .select2-choice>.select2-chosen{margin-left:26px;margin-right:0}.select2-container .select2-choice abbr{display:none;width:12px;height:12px;position:absolute;right:24px;top:8px;font-size:1px;text-decoration:none;border:0;background:url(select2.png) right top no-repeat;cursor:pointer;outline:0}.select2-container.select2-allowclear .select2-choice abbr{display:inline-block}.select2-container .select2-choice abbr:hover{background-position:right -11px;cursor:pointer}.select2-drop-mask{border:0;margin:0;padding:0;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:9998;background-color:#fff;filter:alpha(opacity=0)}.select2-drop{width:100%;margin-top:-1px;position:absolute;z-index:9999;top:100%;background:#fff;color:#000;border:1px solid #aaa;border-top:0;border-radius:0 0 4px 4px;-webkit-box-shadow:0 4px 5px rgba(0,0,0,.15);box-shadow:0 4px 5px rgba(0,0,0,.15)}.select2-drop.select2-drop-above{margin-top:1px;border-top:1px solid #aaa;border-bottom:0;border-radius:4px 4px 0 0;-webkit-box-shadow:0 -4px 5px rgba(0,0,0,.15);box-shadow:0 -4px 5px rgba(0,0,0,.15)}.select2-drop-active{border:1px solid #5897fb;border-top:none}.select2-drop.select2-drop-above.select2-drop-active{border-top:1px solid #5897fb}.select2-drop-auto-width{border-top:1px solid #aaa;width:auto}.select2-drop-auto-width .select2-search{padding-top:4px}.select2-container .select2-choice .select2-arrow{display:inline-block;width:18px;height:100%;position:absolute;right:0;top:0;border-left:1px solid #aaa;border-radius:0 4px 4px 0;background:#ccc;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#ccc),color-stop(.6,#eee)) #ccc;background:-webkit-linear-gradient(center bottom,#ccc 0,#eee 60%) #ccc;background:-moz-linear-gradient(center bottom,#ccc 0,#eee 60%) #ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#cccccc', GradientType=0);background:linear-gradient(to top,#ccc 0,#eee 60%) #ccc}html[dir=rtl] .select2-container .select2-choice .select2-arrow{left:0;right:auto;border-left:none;border-right:1px solid #aaa;border-radius:4px 0 0 4px}.select2-container .select2-choice .select2-arrow b{display:block;width:100%;height:100%;background:url(select2.png) 0 1px no-repeat}html[dir=rtl] .select2-container .select2-choice .select2-arrow b{background-position:2px 1px}.select2-search{display:inline-block;width:100%;min-height:26px;margin:0;padding-left:4px;padding-right:4px;position:relative;z-index:10000;white-space:nowrap}.select2-search input{width:100%;height:auto!important;min-height:26px;padding:4px 20px 4px 5px;margin:0;outline:0;font-family:sans-serif;font-size:1em;border:1px solid #aaa;border-radius:0;-webkit-box-shadow:none;box-shadow:none;background:url(select2.png) 100% -22px no-repeat #fff;background:url(select2.png) 100% -22px no-repeat,linear-gradient(to bottom,#fff 85%,#eee 99%)}html[dir=rtl] .select2-search input{padding:4px 5px 4px 20px;background:url(select2.png) -37px -22px no-repeat #fff;background:url(select2.png) -37px -22px no-repeat,linear-gradient(to bottom,#fff 85%,#eee 99%)}.select2-drop.select2-drop-above .select2-search input{margin-top:4px}.select2-search input.select2-active{background:url(select2-spinner.gif) 100% no-repeat #fff;background:url(select2-spinner.gif) 100% no-repeat,linear-gradient(to bottom,#fff 85%,#eee 99%)}.select2-container-active .select2-choice,.select2-container-active .select2-choices{border:1px solid #5897fb;outline:0;-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3)}.select2-dropdown-open .select2-choice{border-bottom-color:transparent;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;border-bottom-left-radius:0;border-bottom-right-radius:0;background-color:#eee;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#fff),color-stop(.5,#eee));background-image:-webkit-linear-gradient(center bottom,#fff 0,#eee 50%);background-image:-moz-linear-gradient(center bottom,#fff 0,#eee 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);background-image:linear-gradient(to top,#fff 0,#eee 50%)}.select2-dropdown-open.select2-drop-above .select2-choice,.select2-dropdown-open.select2-drop-above .select2-choices{border:1px solid #5897fb;border-top-color:transparent;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(.5,#eee));background-image:-webkit-linear-gradient(center top,#fff 0,#eee 50%);background-image:-moz-linear-gradient(center top,#fff 0,#eee 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);background-image:linear-gradient(to bottom,#fff 0,#eee 50%)}.select2-dropdown-open .select2-choice .select2-arrow{background:0 0;border-left:none;filter:none}html[dir=rtl] .select2-dropdown-open .select2-choice .select2-arrow{border-right:none}.select2-dropdown-open .select2-choice .select2-arrow b{background-position:-18px 1px}html[dir=rtl] .select2-dropdown-open .select2-choice .select2-arrow b{background-position:-16px 1px}.select2-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.select2-results{max-height:200px;padding:0 0 0 4px;margin:4px 4px 4px 0;position:relative;overflow-x:hidden;overflow-y:auto;-webkit-tap-highlight-color:transparent}html[dir=rtl] .select2-results{padding:0 4px 0 0;margin:4px 0 4px 4px}.select2-results ul.select2-result-sub{margin:0;padding-left:0}.select2-results li{list-style:none;display:list-item;background-image:none}.select2-results li.select2-result-with-children>.select2-result-label{font-weight:700}.select2-results .select2-result-label{padding:3px 7px 4px;margin:0;cursor:pointer;min-height:1em;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select2-results-dept-1 .select2-result-label{padding-left:20px}.select2-results-dept-2 .select2-result-label{padding-left:40px}.select2-results-dept-3 .select2-result-label{padding-left:60px}.select2-results-dept-4 .select2-result-label{padding-left:80px}.select2-results-dept-5 .select2-result-label{padding-left:100px}.select2-results-dept-6 .select2-result-label{padding-left:110px}.select2-results-dept-7 .select2-result-label{padding-left:120px}.select2-results .select2-highlighted{background:#3875d7;color:#fff}.select2-results li em{background:#feffde;font-style:normal}.select2-results .select2-highlighted em{background:0 0}.select2-results .select2-highlighted ul{background:#fff;color:#000}.select2-results .select2-ajax-error,.select2-results .select2-no-results,.select2-results .select2-searching,.select2-results .select2-selection-limit{background:#f4f4f4;display:list-item;padding-left:5px}.select2-results .select2-disabled.select2-highlighted{color:#666;background:#f4f4f4;display:list-item;cursor:default}.select2-results .select2-disabled{background:#f4f4f4;display:list-item;cursor:default}.select2-results .select2-selected{display:none}.select2-more-results.select2-active{background:url(select2-spinner.gif) 100% no-repeat #f4f4f4}.select2-results .select2-ajax-error{background:rgba(255,50,50,.2)}.select2-more-results{background:#f4f4f4;display:list-item}.select2-container.select2-container-disabled .select2-choice{background-color:#f4f4f4;background-image:none;border:1px solid #ddd;cursor:default}.select2-container.select2-container-disabled .select2-choice .select2-arrow{background-color:#f4f4f4;background-image:none;border-left:0}.select2-container.select2-container-disabled .select2-choice abbr{display:none}.select2-container-multi .select2-choices{height:auto!important;height:1%;margin:0;padding:0 5px 0 0;position:relative;border:1px solid #aaa;cursor:text;overflow:hidden;background-color:#fff;background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(1%,#eee),color-stop(15%,#fff));background-image:-webkit-linear-gradient(top,#eee 1%,#fff 15%);background-image:-moz-linear-gradient(top,#eee 1%,#fff 15%);background-image:linear-gradient(to bottom,#eee 1%,#fff 15%)}html[dir=rtl] .select2-container-multi .select2-choices{padding:0 0 0 5px}.select2-locked{padding:3px 5px!important}.select2-container-multi .select2-choices{min-height:26px}.select2-container-multi.select2-container-active .select2-choices{border:1px solid #5897fb;outline:0;-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3)}.select2-container-multi .select2-choices li{float:left;list-style:none}html[dir=rtl] .select2-container-multi .select2-choices li{float:right}.select2-container-multi .select2-choices .select2-search-field{margin:0;padding:0;white-space:nowrap}.select2-container-multi .select2-choices .select2-search-field input{padding:5px;margin:1px 0;font-family:sans-serif;font-size:100%;color:#666;outline:0;border:0;-webkit-box-shadow:none;box-shadow:none;background:0 0!important}.select2-container-multi .select2-choices .select2-search-field input.select2-active{background:url(select2-spinner.gif) 100% no-repeat #fff!important}.select2-default{color:#999!important}.select2-container-multi .select2-choices .select2-search-choice{padding:3px 5px 3px 18px;margin:3px 0 3px 5px;position:relative;line-height:13px;color:#333;cursor:default;border:1px solid #aaa;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);background-clip:padding-box;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#e4e4e4;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(to bottom,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%)}html[dir=rtl] .select2-container-multi .select2-choices .select2-search-choice{margin:3px 5px 3px 0;padding:3px 18px 3px 5px}.select2-container-multi .select2-choices .select2-search-choice .select2-chosen{cursor:default}.select2-container-multi .select2-choices .select2-search-choice-focus{background:#d4d4d4}.select2-search-choice-close{display:block;width:12px;height:13px;position:absolute;right:3px;top:4px;font-size:1px;outline:0;background:url(select2.png) right top no-repeat}html[dir=rtl] .select2-search-choice-close{right:auto;left:3px}.select2-container-multi .select2-search-choice-close{left:3px}html[dir=rtl] .select2-container-multi .select2-search-choice-close{left:auto;right:2px}.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover,.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close{background-position:right -11px}.select2-container-multi.select2-container-disabled .select2-choices{background-color:#f4f4f4;background-image:none;border:1px solid #ddd;cursor:default}.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice{padding:3px 5px;border:1px solid #ddd;background-image:none;background-color:#f4f4f4}.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close{display:none;background:0 0}.select2-result-selectable .select2-match,.select2-result-unselectable .select2-match{text-decoration:underline}.select2-offscreen,.select2-offscreen:focus{clip:rect(0 0 0 0)!important;width:1px!important;height:1px!important;border:0!important;margin:0!important;padding:0!important;overflow:hidden!important;position:absolute!important;outline:0!important;left:0!important;top:0!important}.select2-display-none{display:none}.select2-measure-scrollbar{position:absolute;top:-10000px;left:-10000px;width:100px;height:100px;overflow:scroll}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-resolution:2dppx){.select2-container .select2-choice .select2-arrow b,.select2-container .select2-choice abbr,.select2-search input,.select2-search-choice-close{background-image:url(select2x2.png)!important;background-repeat:no-repeat!important;background-size:60px 40px!important}.select2-search input{background-position:100% -21px!important}} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/rtl.css b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/rtl.css deleted file mode 100755 index 4fbb2d7f..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/rtl.css +++ /dev/null @@ -1 +0,0 @@ -.redux-container .redux-action_bar{float:left}.redux-container #expand_options,.redux-sidebar,.cb-enable,.cb-disable,.cb-enable span,.cb-disable span,#redux-footer #redux-share{float:right}.redux-main{border-left:0px;margin-left:0px;border-right:1px solid #d8d8d8;margin-right:201px}.redux-group-tab-link-a{padding-left:0px;padding-right:30px}.redux-group-tab-link-a i{padding-left:10px;padding-right:5px}.redux-group-tab-link-a span.group_title{padding-left:0px;padding-right:30px}.redux-container .expand_options,.redux-sidebar,.cb-enable,.cb-disable,.cb-enable span,.cb-disable span,#redux-footer #redux-share{float:right}.redux_slider{margin-left:0px;margin-right:15px}.redux-action_bar{float:left !important}.expand_options{float:right !important;border:1px solid #f00}.redux_field_th{padding:20px 0 20px 10px !important}.field-desc{text-align:right}.redux-container-ace_editor,.redux-container-border,.redux-container-spacing,.redux-container-dimensions{direction:ltr !important}.redux-container-border .field-border-input,.redux-container-border .redux-color-init,.redux-container-border .redux-border-style,.redux-container-sorter,.redux-container-border,.redux-container-spacing,.redux-container-spacing .field-spacing-input,.redux-container-dimensions .redux-dimensions-container,.redux-container-text label,.redux-container-checkbox input,.typography-font-bar,.typography-style-bar,.redux-color.redux-typography-color,.redux-typography-subsets{float:right !important}.input-append{margin-right:10px;direction:ltr !important}.redux-container-slider,.redux-container-spinner,.redux-container-switch{direction:ltr !important;float:right;margin:0}.redux-main .redux-typography-container .typography-preview{text-align:center !important;direction:ltr !important}.redux-info-field .redux-info-icon{margin-left:15px}#redux-share{float:right !important}.redux-sidebar .redux-menu-warning,.redux-sidebar .redux-menu-error,.redux-sidebar .hasSubSections .extraIconSubsections{float:left} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/rtl.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/rtl.scss deleted file mode 100755 index 2a9ca045..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/rtl.scss +++ /dev/null @@ -1,126 +0,0 @@ -.redux-container { - .redux-action_bar { - float: left; - } -} - -.redux-container #expand_options, -.redux-sidebar, -.cb-enable, -.cb-disable, -.cb-enable span, -.cb-disable span, -#redux-footer #redux-share { - float: right; -} - -.redux-main { - border-left: 0px; - margin-left: 0px; - border-right: 1px solid #d8d8d8; - margin-right: 201px; -} - -.redux-group-tab-link-a { - padding-left: 0px; - padding-right: 30px; - - i { - padding-left: 10px; - padding-right: 5px; - } - - span.group_title { - padding-left: 0px; - padding-right: 30px; - } -} - -.redux-container .expand_options, -.redux-sidebar, -.cb-enable, -.cb-disable, -.cb-enable span, -.cb-disable span, -#redux-footer #redux-share{ - float:right; -} - -.redux_slider { - margin-left: 0px; - margin-right: 15px; -} - -.redux-action_bar { - float: left !important; -} - -.expand_options { - float: right !important; - border:1px solid #f00; -} - -.redux_field_th{ - padding:20px 0 20px 10px !important; -} - -.field-desc { - text-align: right; -} - -.redux-container-ace_editor, -.redux-container-border, -.redux-container-spacing, -.redux-container-dimensions { - direction: ltr !important; -} - -.redux-container-border .field-border-input, -.redux-container-border .redux-color-init, -.redux-container-border .redux-border-style, -.redux-container-sorter, -.redux-container-border, -.redux-container-spacing, -.redux-container-spacing .field-spacing-input, -.redux-container-dimensions .redux-dimensions-container, -.redux-container-text label, -.redux-container-checkbox input, -.typography-font-bar, -.typography-style-bar, -.redux-color.redux-typography-color, -.redux-typography-subsets { - float:right !important; -} - -.input-append{ - margin-right:10px; direction:ltr !important; -} - -.redux-container-slider, -.redux-container-spinner, -.redux-container-switch { - direction:ltr !important; - float:right; - margin:0; -} - -.redux-main .redux-typography-container .typography-preview { - text-align: center !important; - direction: ltr !important; -} - -.redux-info-field .redux-info-icon { - margin-left: 15px; -} - -#redux-share { - float:right !important; -} - -.redux-sidebar { - .redux-menu-warning, - .redux-menu-error, - .hasSubSections .extraIconSubsections { - float: left; - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/elusive-icons.css b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/elusive-icons.css deleted file mode 100755 index 7c203980..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/elusive-icons.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Elusive Icons 2.0.0 by @ReduxFramework - http://elusiveicons.com - @reduxframework - * License - http://elusiveicons.com/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'Elusive-Icons';src:url("fonts/elusiveicons-webfont.eot?v=2.0.0");src:url("fonts/elusiveicons-webfont.eot?#iefix&v=2.0.0") format("embedded-opentype"),url("fonts/elusiveicons-webfont.woff?v=2.0.0") format("woff"),url("fonts/elusiveicons-webfont.ttf?v=2.0.0") format("truetype"),url("fonts/elusiveicons-webfont.svg?v=2.0.0#elusiveiconsregular") format("svg");font-weight:normal;font-style:normal}.el{display:inline-block;font:normal normal normal 14px/1 "Elusive-Icons";font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.el-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.el-2x{font-size:2em}.el-3x{font-size:3em}.el-4x{font-size:4em}.el-5x{font-size:5em}.el-fw{width:1.28571em;text-align:center}.el-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.el-ul>li{position:relative}.el-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.el-li.el-lg{left:-1.85714em}.el-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.el.pull-left{margin-right:.3em}.el.pull-right{margin-left:.3em}.el-spin{-webkit-animation:el-spin 2s infinite linear;animation:el-spin 2s infinite linear}.el-pulse{-webkit-animation:el-spin 1s infinite steps(8);animation:el-spin 1s infinite steps(8)}@-webkit-keyframes el-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes el-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.el-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.el-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.el-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.el-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.el-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .el-rotate-90,:root .el-rotate-180,:root .el-rotate-270,:root .el-flip-horizontal,:root .el-flip-vertical{filter:none}.el-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.el-stack-1x,.el-stack-2x{position:absolute;left:0;width:100%;text-align:center}.el-stack-1x{line-height:inherit}.el-stack-2x{font-size:2em}.el-inverse{color:#fff}.el-icon-address-book-alt:before,.el-address-book-alt:before{content:""}.el-icon-address-book:before,.el-address-book:before{content:""}.el-icon-adjust-alt:before,.el-adjust-alt:before{content:""}.el-icon-adjust:before,.el-adjust:before{content:""}.el-icon-adult:before,.el-adult:before{content:""}.el-icon-align-center:before,.el-align-center:before{content:""}.el-icon-align-justify:before,.el-align-justify:before{content:""}.el-icon-align-left:before,.el-align-left:before{content:""}.el-icon-align-right:before,.el-align-right:before{content:""}.el-icon-arrow-down:before,.el-arrow-down:before{content:""}.el-icon-arrow-left:before,.el-arrow-left:before{content:""}.el-icon-arrow-right:before,.el-arrow-right:before{content:""}.el-icon-arrow-up:before,.el-arrow-up:before{content:""}.el-icon-asl:before,.el-asl:before{content:""}.el-icon-asterisk:before,.el-asterisk:before{content:""}.el-icon-backward:before,.el-backward:before{content:""}.el-icon-ban-circle:before,.el-ban-circle:before{content:""}.el-icon-barcode:before,.el-barcode:before{content:""}.el-icon-behance:before,.el-behance:before{content:""}.el-icon-bell:before,.el-bell:before{content:""}.el-icon-blind:before,.el-blind:before{content:""}.el-icon-blogger:before,.el-blogger:before{content:""}.el-icon-bold:before,.el-bold:before{content:""}.el-icon-book:before,.el-book:before{content:""}.el-icon-bookmark-empty:before,.el-bookmark-empty:before{content:""}.el-icon-bookmark:before,.el-bookmark:before{content:""}.el-icon-brackets:before,.el-brackets:before{content:""}.el-icon-braille:before,.el-braille:before{content:""}.el-icon-briefcase:before,.el-briefcase:before{content:""}.el-icon-broom:before,.el-broom:before{content:""}.el-icon-brush:before,.el-brush:before{content:""}.el-icon-bulb:before,.el-bulb:before{content:""}.el-icon-bullhorn:before,.el-bullhorn:before{content:""}.el-icon-calendar-sign:before,.el-calendar-sign:before{content:""}.el-icon-calendar:before,.el-calendar:before{content:""}.el-icon-camera:before,.el-camera:before{content:""}.el-icon-car:before,.el-car:before{content:""}.el-icon-caret-down:before,.el-caret-down:before{content:""}.el-icon-caret-left:before,.el-caret-left:before{content:""}.el-icon-caret-right:before,.el-caret-right:before{content:""}.el-icon-caret-up:before,.el-caret-up:before{content:""}.el-icon-cc:before,.el-cc:before{content:""}.el-icon-certificate:before,.el-certificate:before{content:""}.el-icon-check-empty:before,.el-check-empty:before{content:""}.el-icon-check:before,.el-check:before{content:""}.el-icon-chevron-down:before,.el-chevron-down:before{content:""}.el-icon-chevron-left:before,.el-chevron-left:before{content:""}.el-icon-chevron-right:before,.el-chevron-right:before{content:""}.el-icon-chevron-up:before,.el-chevron-up:before{content:""}.el-icon-child:before,.el-child:before{content:""}.el-icon-circle-arrow-down:before,.el-circle-arrow-down:before{content:""}.el-icon-circle-arrow-left:before,.el-circle-arrow-left:before{content:""}.el-icon-circle-arrow-right:before,.el-circle-arrow-right:before{content:""}.el-icon-circle-arrow-up:before,.el-circle-arrow-up:before{content:""}.el-icon-cloud-alt:before,.el-cloud-alt:before{content:""}.el-icon-cloud:before,.el-cloud:before{content:""}.el-icon-cog-alt:before,.el-cog-alt:before{content:""}.el-icon-cog:before,.el-cog:before{content:""}.el-icon-cogs:before,.el-cogs:before{content:""}.el-icon-comment-alt:before,.el-comment-alt:before{content:""}.el-icon-comment:before,.el-comment:before{content:""}.el-icon-compass-alt:before,.el-compass-alt:before{content:""}.el-icon-compass:before,.el-compass:before{content:""}.el-icon-credit-card:before,.el-credit-card:before{content:""}.el-icon-css:before,.el-css:before{content:""}.el-icon-dashboard:before,.el-dashboard:before{content:""}.el-icon-delicious:before,.el-delicious:before{content:""}.el-icon-deviantart:before,.el-deviantart:before{content:""}.el-icon-digg:before,.el-digg:before{content:""}.el-icon-download-alt:before,.el-download-alt:before{content:""}.el-icon-download:before,.el-download:before{content:""}.el-icon-dribbble:before,.el-dribbble:before{content:""}.el-icon-edit:before,.el-edit:before{content:""}.el-icon-eject:before,.el-eject:before{content:""}.el-icon-envelope-alt:before,.el-envelope-alt:before{content:""}.el-icon-envelope:before,.el-envelope:before{content:""}.el-icon-error-alt:before,.el-error-alt:before{content:""}.el-icon-error:before,.el-error:before{content:""}.el-icon-eur:before,.el-eur:before{content:""}.el-icon-exclamation-sign:before,.el-exclamation-sign:before{content:""}.el-icon-eye-close:before,.el-eye-close:before{content:""}.el-icon-eye-open:before,.el-eye-open:before{content:""}.el-icon-facebook:before,.el-facebook:before{content:""}.el-icon-facetime-video:before,.el-facetime-video:before{content:""}.el-icon-fast-backward:before,.el-fast-backward:before{content:""}.el-icon-fast-forward:before,.el-fast-forward:before{content:""}.el-icon-female:before,.el-female:before{content:""}.el-icon-file-alt:before,.el-file-alt:before{content:""}.el-icon-file-edit-alt:before,.el-file-edit-alt:before{content:""}.el-icon-file-edit:before,.el-file-edit:before{content:""}.el-icon-file-new-alt:before,.el-file-new-alt:before{content:""}.el-icon-file-new:before,.el-file-new:before{content:""}.el-icon-file:before,.el-file:before{content:""}.el-icon-film:before,.el-film:before{content:""}.el-icon-filter:before,.el-filter:before{content:""}.el-icon-fire:before,.el-fire:before{content:""}.el-icon-flag-alt:before,.el-flag-alt:before{content:""}.el-icon-flag:before,.el-flag:before{content:""}.el-icon-flickr:before,.el-flickr:before{content:""}.el-icon-folder-close:before,.el-folder-close:before{content:""}.el-icon-folder-open:before,.el-folder-open:before{content:""}.el-icon-folder-sign:before,.el-folder-sign:before{content:""}.el-icon-folder:before,.el-folder:before{content:""}.el-icon-font:before,.el-font:before{content:""}.el-icon-fontsize:before,.el-fontsize:before{content:""}.el-icon-fork:before,.el-fork:before{content:""}.el-icon-forward-alt:before,.el-forward-alt:before{content:""}.el-icon-forward:before,.el-forward:before{content:""}.el-icon-foursquare:before,.el-foursquare:before{content:""}.el-icon-friendfeed-rect:before,.el-friendfeed-rect:before{content:""}.el-icon-friendfeed:before,.el-friendfeed:before{content:""}.el-icon-fullscreen:before,.el-fullscreen:before{content:""}.el-icon-gallery:before,.el-gallery:before{content:""}.el-icon-gbp:before,.el-gbp:before{content:""}.el-icon-gift:before,.el-gift:before{content:""}.el-icon-github-text:before,.el-github-text:before{content:""}.el-icon-github:before,.el-github:before{content:""}.el-icon-glass:before,.el-glass:before{content:""}.el-icon-glasses:before,.el-glasses:before{content:""}.el-icon-globe-alt:before,.el-globe-alt:before{content:""}.el-icon-globe:before,.el-globe:before{content:""}.el-icon-googleplus:before,.el-googleplus:before{content:""}.el-icon-graph-alt:before,.el-graph-alt:before{content:""}.el-icon-graph:before,.el-graph:before{content:""}.el-icon-group-alt:before,.el-group-alt:before{content:""}.el-icon-group:before,.el-group:before{content:""}.el-icon-guidedog:before,.el-guidedog:before{content:""}.el-icon-hand-down:before,.el-hand-down:before{content:""}.el-icon-hand-left:before,.el-hand-left:before{content:""}.el-icon-hand-right:before,.el-hand-right:before{content:""}.el-icon-hand-up:before,.el-hand-up:before{content:""}.el-icon-hdd:before,.el-hdd:before{content:""}.el-icon-headphones:before,.el-headphones:before{content:""}.el-icon-hearing-impaired:before,.el-hearing-impaired:before{content:""}.el-icon-heart-alt:before,.el-heart-alt:before{content:""}.el-icon-heart-empty:before,.el-heart-empty:before{content:""}.el-icon-heart:before,.el-heart:before{content:""}.el-icon-home-alt:before,.el-home-alt:before{content:""}.el-icon-home:before,.el-home:before{content:""}.el-icon-hourglass:before,.el-hourglass:before{content:""}.el-icon-idea-alt:before,.el-idea-alt:before{content:""}.el-icon-idea:before,.el-idea:before{content:""}.el-icon-inbox-alt:before,.el-inbox-alt:before{content:""}.el-icon-inbox-box:before,.el-inbox-box:before{content:""}.el-icon-inbox:before,.el-inbox:before{content:""}.el-icon-indent-left:before,.el-indent-left:before{content:""}.el-icon-indent-right:before,.el-indent-right:before{content:""}.el-icon-info-circle:before,.el-info-circle:before{content:""}.el-icon-instagram:before,.el-instagram:before{content:""}.el-icon-iphone-home:before,.el-iphone-home:before{content:""}.el-icon-italic:before,.el-italic:before{content:""}.el-icon-key:before,.el-key:before{content:""}.el-icon-laptop-alt:before,.el-laptop-alt:before{content:""}.el-icon-laptop:before,.el-laptop:before{content:""}.el-icon-lastfm:before,.el-lastfm:before{content:""}.el-icon-leaf:before,.el-leaf:before{content:""}.el-icon-lines:before,.el-lines:before{content:""}.el-icon-link:before,.el-link:before{content:""}.el-icon-linkedin:before,.el-linkedin:before{content:""}.el-icon-list-alt:before,.el-list-alt:before{content:""}.el-icon-list:before,.el-list:before{content:""}.el-icon-livejournal:before,.el-livejournal:before{content:""}.el-icon-lock-alt:before,.el-lock-alt:before{content:""}.el-icon-lock:before,.el-lock:before{content:""}.el-icon-magic:before,.el-magic:before{content:""}.el-icon-magnet:before,.el-magnet:before{content:""}.el-icon-male:before,.el-male:before{content:""}.el-icon-map-marker-alt:before,.el-map-marker-alt:before{content:""}.el-icon-map-marker:before,.el-map-marker:before{content:""}.el-icon-mic-alt:before,.el-mic-alt:before{content:""}.el-icon-mic:before,.el-mic:before{content:""}.el-icon-minus-sign:before,.el-minus-sign:before{content:""}.el-icon-minus:before,.el-minus:before{content:""}.el-icon-move:before,.el-move:before{content:""}.el-icon-music:before,.el-music:before{content:""}.el-icon-myspace:before,.el-myspace:before{content:""}.el-icon-network:before,.el-network:before{content:""}.el-icon-off:before,.el-off:before{content:""}.el-icon-ok-circle:before,.el-ok-circle:before{content:""}.el-icon-ok-sign:before,.el-ok-sign:before{content:""}.el-icon-ok:before,.el-ok:before{content:""}.el-icon-opensource:before,.el-opensource:before{content:""}.el-icon-paper-clip-alt:before,.el-paper-clip-alt:before{content:""}.el-icon-paper-clip:before,.el-paper-clip:before{content:""}.el-icon-path:before,.el-path:before{content:""}.el-icon-pause-alt:before,.el-pause-alt:before{content:""}.el-icon-pause:before,.el-pause:before{content:""}.el-icon-pencil-alt:before,.el-pencil-alt:before{content:""}.el-icon-pencil:before,.el-pencil:before{content:""}.el-icon-person:before,.el-person:before{content:""}.el-icon-phone-alt:before,.el-phone-alt:before{content:""}.el-icon-phone:before,.el-phone:before{content:""}.el-icon-photo-alt:before,.el-photo-alt:before{content:""}.el-icon-photo:before,.el-photo:before{content:""}.el-icon-picasa:before,.el-picasa:before{content:""}.el-icon-picture:before,.el-picture:before{content:""}.el-icon-plane:before,.el-plane:before{content:""}.el-icon-play-alt:before,.el-play-alt:before{content:""}.el-icon-play-circle:before,.el-play-circle:before{content:""}.el-icon-play:before,.el-play:before{content:""}.el-icon-plurk-alt:before,.el-plurk-alt:before{content:""}.el-icon-plurk:before,.el-plurk:before{content:""}.el-icon-plus-sign:before,.el-plus-sign:before{content:""}.el-icon-plus:before,.el-plus:before{content:""}.el-icon-podcast:before,.el-podcast:before{content:""}.el-icon-print:before,.el-print:before{content:""}.el-icon-puzzle:before,.el-puzzle:before{content:""}.el-icon-qrcode:before,.el-qrcode:before{content:""}.el-icon-question-sign:before,.el-question-sign:before{content:""}.el-icon-question:before,.el-question:before{content:""}.el-icon-quote-alt:before,.el-quote-alt:before{content:""}.el-icon-quote-right-alt:before,.el-quote-right-alt:before{content:""}.el-icon-quote-right:before,.el-quote-right:before{content:""}.el-icon-quotes:before,.el-quotes:before{content:""}.el-icon-random:before,.el-random:before{content:""}.el-icon-record:before,.el-record:before{content:""}.el-icon-reddit:before,.el-reddit:before{content:""}.el-icon-redux:before,.el-redux:before{content:""}.el-icon-refresh:before,.el-refresh:before{content:""}.el-icon-remove-circle:before,.el-remove-circle:before{content:""}.el-icon-remove-sign:before,.el-remove-sign:before{content:""}.el-icon-remove:before,.el-remove:before{content:""}.el-icon-repeat-alt:before,.el-repeat-alt:before{content:""}.el-icon-repeat:before,.el-repeat:before{content:""}.el-icon-resize-full:before,.el-resize-full:before{content:""}.el-icon-resize-horizontal:before,.el-resize-horizontal:before{content:""}.el-icon-resize-small:before,.el-resize-small:before{content:""}.el-icon-resize-vertical:before,.el-resize-vertical:before{content:""}.el-icon-return-key:before,.el-return-key:before{content:""}.el-icon-retweet:before,.el-retweet:before{content:""}.el-icon-reverse-alt:before,.el-reverse-alt:before{content:""}.el-icon-road:before,.el-road:before{content:""}.el-icon-rss:before,.el-rss:before{content:""}.el-icon-scissors:before,.el-scissors:before{content:""}.el-icon-screen-alt:before,.el-screen-alt:before{content:""}.el-icon-screen:before,.el-screen:before{content:""}.el-icon-screenshot:before,.el-screenshot:before{content:""}.el-icon-search-alt:before,.el-search-alt:before{content:""}.el-icon-search:before,.el-search:before{content:""}.el-icon-share-alt:before,.el-share-alt:before{content:""}.el-icon-share:before,.el-share:before{content:""}.el-icon-shopping-cart-sign:before,.el-shopping-cart-sign:before{content:""}.el-icon-shopping-cart:before,.el-shopping-cart:before{content:""}.el-icon-shortcode:before,.el-shortcode:before{content:""}.el-icon-signal:before,.el-signal:before{content:""}.el-icon-skype:before,.el-skype:before{content:""}.el-icon-slideshare:before,.el-slideshare:before{content:""}.el-icon-smiley-alt:before,.el-smiley-alt:before{content:""}.el-icon-smiley:before,.el-smiley:before{content:""}.el-icon-soundcloud:before,.el-soundcloud:before{content:""}.el-icon-speaker:before,.el-speaker:before{content:""}.el-icon-spotify:before,.el-spotify:before{content:""}.el-icon-stackoverflow:before,.el-stackoverflow:before{content:""}.el-icon-star-alt:before,.el-star-alt:before{content:""}.el-icon-star-empty:before,.el-star-empty:before{content:""}.el-icon-star:before,.el-star:before{content:""}.el-icon-step-backward:before,.el-step-backward:before{content:""}.el-icon-step-forward:before,.el-step-forward:before{content:""}.el-icon-stop-alt:before,.el-stop-alt:before{content:""}.el-icon-stop:before,.el-stop:before{content:""}.el-icon-stumbleupon:before,.el-stumbleupon:before{content:""}.el-icon-tag:before,.el-tag:before{content:""}.el-icon-tags:before,.el-tags:before{content:""}.el-icon-tasks:before,.el-tasks:before{content:""}.el-icon-text-height:before,.el-text-height:before{content:""}.el-icon-text-width:before,.el-text-width:before{content:""}.el-icon-th-large:before,.el-th-large:before{content:""}.el-icon-th-list:before,.el-th-list:before{content:""}.el-icon-th:before,.el-th:before{content:""}.el-icon-thumbs-down:before,.el-thumbs-down:before{content:""}.el-icon-thumbs-up:before,.el-thumbs-up:before{content:""}.el-icon-time-alt:before,.el-time-alt:before{content:""}.el-icon-time:before,.el-time:before{content:""}.el-icon-tint:before,.el-tint:before{content:""}.el-icon-torso:before,.el-torso:before{content:""}.el-icon-trash-alt:before,.el-trash-alt:before{content:""}.el-icon-trash:before,.el-trash:before{content:""}.el-icon-tumblr:before,.el-tumblr:before{content:""}.el-icon-twitter:before,.el-twitter:before{content:""}.el-icon-universal-access:before,.el-universal-access:before{content:""}.el-icon-unlock-alt:before,.el-unlock-alt:before{content:""}.el-icon-unlock:before,.el-unlock:before{content:""}.el-icon-upload:before,.el-upload:before{content:""}.el-icon-usd:before,.el-usd:before{content:""}.el-icon-user:before,.el-user:before{content:""}.el-icon-viadeo:before,.el-viadeo:before{content:""}.el-icon-video-alt:before,.el-video-alt:before{content:""}.el-icon-video-chat:before,.el-video-chat:before{content:""}.el-icon-video:before,.el-video:before{content:""}.el-icon-view-mode:before,.el-view-mode:before{content:""}.el-icon-vimeo:before,.el-vimeo:before{content:""}.el-icon-vkontakte:before,.el-vkontakte:before{content:""}.el-icon-volume-down:before,.el-volume-down:before{content:""}.el-icon-volume-off:before,.el-volume-off:before{content:""}.el-icon-volume-up:before,.el-volume-up:before{content:""}.el-icon-w3c:before,.el-w3c:before{content:""}.el-icon-warning-sign:before,.el-warning-sign:before{content:""}.el-icon-website-alt:before,.el-website-alt:before{content:""}.el-icon-website:before,.el-website:before{content:""}.el-icon-wheelchair:before,.el-wheelchair:before{content:""}.el-icon-wordpress:before,.el-wordpress:before{content:""}.el-icon-wrench-alt:before,.el-wrench-alt:before{content:""}.el-icon-wrench:before,.el-wrench:before{content:""}.el-icon-youtube:before,.el-youtube:before{content:""}.el-icon-zoom-in:before,.el-zoom-in:before{content:""}.el-icon-zoom-out:before,.el-zoom-out:before{content:""} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/fonts/elusiveicons-webfont.eot b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/fonts/elusiveicons-webfont.eot deleted file mode 100755 index 0fc2bdf4e7c94bf0d9b85f634a5a4bac5b39ae19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80440 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 msd74c!gL7xEwQ8HpqNmETtH3%U`P3X7) diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/fonts/elusiveicons-webfont.svg b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/fonts/elusiveicons-webfont.svg deleted file mode 100755 index cf60ed2b..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/fonts/elusiveicons-webfont.svg +++ /dev/null @@ -1,934 +0,0 @@ - - - - -Created by FontForge 20120731 at Tue Feb 24 11:41:15 2015 - By Dovy - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/fonts/elusiveicons-webfont.ttf b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/fonts/elusiveicons-webfont.ttf deleted file mode 100755 index 7065ca1d64f2c4c733b478cda54a23543384da1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80248 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 diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_animated.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_animated.scss deleted file mode 100755 index 7661bb0e..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_animated.scss +++ /dev/null @@ -1,34 +0,0 @@ -// Spinning Icons -// -------------------------- - -.#{$el-css-prefix}-spin { - -webkit-animation: el-spin 2s infinite linear; - animation: el-spin 2s infinite linear; -} - -.#{$el-css-prefix}-pulse { - -webkit-animation: el-spin 1s infinite steps(8); - animation: el-spin 1s infinite steps(8); -} - -@-webkit-keyframes el-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} - -@keyframes el-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_bordered-pulled.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_bordered-pulled.scss deleted file mode 100755 index c5a0858c..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_bordered-pulled.scss +++ /dev/null @@ -1,16 +0,0 @@ -// Bordered & Pulled -// ------------------------- - -.#{$el-css-prefix}-border { - padding: .2em .25em .15em; - border: solid .08em $el-border-color; - border-radius: .1em; -} - -.pull-right { float: right; } -.pull-left { float: left; } - -.#{$el-css-prefix} { - &.pull-left { margin-right: .3em; } - &.pull-right { margin-left: .3em; } -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_core.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_core.scss deleted file mode 100755 index e987377a..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_core.scss +++ /dev/null @@ -1,13 +0,0 @@ -// Base Class Definition -// ------------------------- - -.#{$el-css-prefix} { - display: inline-block; - font: normal normal normal #{$el-font-size-base}/1 'Elusive-Icons'; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - transform: translate(0, 0); // ensures no half-pixel rendering in firefox - -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_fixed-width.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_fixed-width.scss deleted file mode 100755 index 04587534..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_fixed-width.scss +++ /dev/null @@ -1,6 +0,0 @@ -// Fixed Width Icons -// ------------------------- -.#{$el-css-prefix}-fw { - width: (18em / 14); - text-align: center; -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_icons.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_icons.scss deleted file mode 100755 index 6479042e..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_icons.scss +++ /dev/null @@ -1,615 +0,0 @@ -/* Elusive Icons uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ - -.#{$el-css-prefix}-icon-address-book-alt:before, -.#{$el-css-prefix}-address-book-alt:before { content: $el-var-address-book-alt; } -.#{$el-css-prefix}-icon-address-book:before, -.#{$el-css-prefix}-address-book:before { content: $el-var-address-book; } -.#{$el-css-prefix}-icon-adjust-alt:before, -.#{$el-css-prefix}-adjust-alt:before { content: $el-var-adjust-alt; } -.#{$el-css-prefix}-icon-adjust:before, -.#{$el-css-prefix}-adjust:before { content: $el-var-adjust; } -.#{$el-css-prefix}-icon-adult:before, -.#{$el-css-prefix}-adult:before { content: $el-var-adult; } -.#{$el-css-prefix}-icon-align-center:before, -.#{$el-css-prefix}-align-center:before { content: $el-var-align-center; } -.#{$el-css-prefix}-icon-align-justify:before, -.#{$el-css-prefix}-align-justify:before { content: $el-var-align-justify; } -.#{$el-css-prefix}-icon-align-left:before, -.#{$el-css-prefix}-align-left:before { content: $el-var-align-left; } -.#{$el-css-prefix}-icon-align-right:before, -.#{$el-css-prefix}-align-right:before { content: $el-var-align-right; } -.#{$el-css-prefix}-icon-arrow-down:before, -.#{$el-css-prefix}-arrow-down:before { content: $el-var-arrow-down; } -.#{$el-css-prefix}-icon-arrow-left:before, -.#{$el-css-prefix}-arrow-left:before { content: $el-var-arrow-left; } -.#{$el-css-prefix}-icon-arrow-right:before, -.#{$el-css-prefix}-arrow-right:before { content: $el-var-arrow-right; } -.#{$el-css-prefix}-icon-arrow-up:before, -.#{$el-css-prefix}-arrow-up:before { content: $el-var-arrow-up; } -.#{$el-css-prefix}-icon-asl:before, -.#{$el-css-prefix}-asl:before { content: $el-var-asl; } -.#{$el-css-prefix}-icon-asterisk:before, -.#{$el-css-prefix}-asterisk:before { content: $el-var-asterisk; } -.#{$el-css-prefix}-icon-backward:before, -.#{$el-css-prefix}-backward:before { content: $el-var-backward; } -.#{$el-css-prefix}-icon-ban-circle:before, -.#{$el-css-prefix}-ban-circle:before { content: $el-var-ban-circle; } -.#{$el-css-prefix}-icon-barcode:before, -.#{$el-css-prefix}-barcode:before { content: $el-var-barcode; } -.#{$el-css-prefix}-icon-behance:before, -.#{$el-css-prefix}-behance:before { content: $el-var-behance; } -.#{$el-css-prefix}-icon-bell:before, -.#{$el-css-prefix}-bell:before { content: $el-var-bell; } -.#{$el-css-prefix}-icon-blind:before, -.#{$el-css-prefix}-blind:before { content: $el-var-blind; } -.#{$el-css-prefix}-icon-blogger:before, -.#{$el-css-prefix}-blogger:before { content: $el-var-blogger; } -.#{$el-css-prefix}-icon-bold:before, -.#{$el-css-prefix}-bold:before { content: $el-var-bold; } -.#{$el-css-prefix}-icon-book:before, -.#{$el-css-prefix}-book:before { content: $el-var-book; } -.#{$el-css-prefix}-icon-bookmark-empty:before, -.#{$el-css-prefix}-bookmark-empty:before { content: $el-var-bookmark-empty; } -.#{$el-css-prefix}-icon-bookmark:before, -.#{$el-css-prefix}-bookmark:before { content: $el-var-bookmark; } -.#{$el-css-prefix}-icon-brackets:before, -.#{$el-css-prefix}-brackets:before { content: $el-var-brackets; } -.#{$el-css-prefix}-icon-braille:before, -.#{$el-css-prefix}-braille:before { content: $el-var-braille; } -.#{$el-css-prefix}-icon-briefcase:before, -.#{$el-css-prefix}-briefcase:before { content: $el-var-briefcase; } -.#{$el-css-prefix}-icon-broom:before, -.#{$el-css-prefix}-broom:before { content: $el-var-broom; } -.#{$el-css-prefix}-icon-brush:before, -.#{$el-css-prefix}-brush:before { content: $el-var-brush; } -.#{$el-css-prefix}-icon-bulb:before, -.#{$el-css-prefix}-bulb:before { content: $el-var-bulb; } -.#{$el-css-prefix}-icon-bullhorn:before, -.#{$el-css-prefix}-bullhorn:before { content: $el-var-bullhorn; } -.#{$el-css-prefix}-icon-calendar-sign:before, -.#{$el-css-prefix}-calendar-sign:before { content: $el-var-calendar-sign; } -.#{$el-css-prefix}-icon-calendar:before, -.#{$el-css-prefix}-calendar:before { content: $el-var-calendar; } -.#{$el-css-prefix}-icon-camera:before, -.#{$el-css-prefix}-camera:before { content: $el-var-camera; } -.#{$el-css-prefix}-icon-car:before, -.#{$el-css-prefix}-car:before { content: $el-var-car; } -.#{$el-css-prefix}-icon-caret-down:before, -.#{$el-css-prefix}-caret-down:before { content: $el-var-caret-down; } -.#{$el-css-prefix}-icon-caret-left:before, -.#{$el-css-prefix}-caret-left:before { content: $el-var-caret-left; } -.#{$el-css-prefix}-icon-caret-right:before, -.#{$el-css-prefix}-caret-right:before { content: $el-var-caret-right; } -.#{$el-css-prefix}-icon-caret-up:before, -.#{$el-css-prefix}-caret-up:before { content: $el-var-caret-up; } -.#{$el-css-prefix}-icon-cc:before, -.#{$el-css-prefix}-cc:before { content: $el-var-cc; } -.#{$el-css-prefix}-icon-certificate:before, -.#{$el-css-prefix}-certificate:before { content: $el-var-certificate; } -.#{$el-css-prefix}-icon-check-empty:before, -.#{$el-css-prefix}-check-empty:before { content: $el-var-check-empty; } -.#{$el-css-prefix}-icon-check:before, -.#{$el-css-prefix}-check:before { content: $el-var-check; } -.#{$el-css-prefix}-icon-chevron-down:before, -.#{$el-css-prefix}-chevron-down:before { content: $el-var-chevron-down; } -.#{$el-css-prefix}-icon-chevron-left:before, -.#{$el-css-prefix}-chevron-left:before { content: $el-var-chevron-left; } -.#{$el-css-prefix}-icon-chevron-right:before, -.#{$el-css-prefix}-chevron-right:before { content: $el-var-chevron-right; } -.#{$el-css-prefix}-icon-chevron-up:before, -.#{$el-css-prefix}-chevron-up:before { content: $el-var-chevron-up; } -.#{$el-css-prefix}-icon-child:before, -.#{$el-css-prefix}-child:before { content: $el-var-child; } -.#{$el-css-prefix}-icon-circle-arrow-down:before, -.#{$el-css-prefix}-circle-arrow-down:before { content: $el-var-circle-arrow-down; } -.#{$el-css-prefix}-icon-circle-arrow-left:before, -.#{$el-css-prefix}-circle-arrow-left:before { content: $el-var-circle-arrow-left; } -.#{$el-css-prefix}-icon-circle-arrow-right:before, -.#{$el-css-prefix}-circle-arrow-right:before { content: $el-var-circle-arrow-right; } -.#{$el-css-prefix}-icon-circle-arrow-up:before, -.#{$el-css-prefix}-circle-arrow-up:before { content: $el-var-circle-arrow-up; } -.#{$el-css-prefix}-icon-cloud-alt:before, -.#{$el-css-prefix}-cloud-alt:before { content: $el-var-cloud-alt; } -.#{$el-css-prefix}-icon-cloud:before, -.#{$el-css-prefix}-cloud:before { content: $el-var-cloud; } -.#{$el-css-prefix}-icon-cog-alt:before, -.#{$el-css-prefix}-cog-alt:before { content: $el-var-cog-alt; } -.#{$el-css-prefix}-icon-cog:before, -.#{$el-css-prefix}-cog:before { content: $el-var-cog; } -.#{$el-css-prefix}-icon-cogs:before, -.#{$el-css-prefix}-cogs:before { content: $el-var-cogs; } -.#{$el-css-prefix}-icon-comment-alt:before, -.#{$el-css-prefix}-comment-alt:before { content: $el-var-comment-alt; } -.#{$el-css-prefix}-icon-comment:before, -.#{$el-css-prefix}-comment:before { content: $el-var-comment; } -.#{$el-css-prefix}-icon-compass-alt:before, -.#{$el-css-prefix}-compass-alt:before { content: $el-var-compass-alt; } -.#{$el-css-prefix}-icon-compass:before, -.#{$el-css-prefix}-compass:before { content: $el-var-compass; } -.#{$el-css-prefix}-icon-credit-card:before, -.#{$el-css-prefix}-credit-card:before { content: $el-var-credit-card; } -.#{$el-css-prefix}-icon-css:before, -.#{$el-css-prefix}-css:before { content: $el-var-css; } -.#{$el-css-prefix}-icon-dashboard:before, -.#{$el-css-prefix}-dashboard:before { content: $el-var-dashboard; } -.#{$el-css-prefix}-icon-delicious:before, -.#{$el-css-prefix}-delicious:before { content: $el-var-delicious; } -.#{$el-css-prefix}-icon-deviantart:before, -.#{$el-css-prefix}-deviantart:before { content: $el-var-deviantart; } -.#{$el-css-prefix}-icon-digg:before, -.#{$el-css-prefix}-digg:before { content: $el-var-digg; } -.#{$el-css-prefix}-icon-download-alt:before, -.#{$el-css-prefix}-download-alt:before { content: $el-var-download-alt; } -.#{$el-css-prefix}-icon-download:before, -.#{$el-css-prefix}-download:before { content: $el-var-download; } -.#{$el-css-prefix}-icon-dribbble:before, -.#{$el-css-prefix}-dribbble:before { content: $el-var-dribbble; } -.#{$el-css-prefix}-icon-edit:before, -.#{$el-css-prefix}-edit:before { content: $el-var-edit; } -.#{$el-css-prefix}-icon-eject:before, -.#{$el-css-prefix}-eject:before { content: $el-var-eject; } -.#{$el-css-prefix}-icon-envelope-alt:before, -.#{$el-css-prefix}-envelope-alt:before { content: $el-var-envelope-alt; } -.#{$el-css-prefix}-icon-envelope:before, -.#{$el-css-prefix}-envelope:before { content: $el-var-envelope; } -.#{$el-css-prefix}-icon-error-alt:before, -.#{$el-css-prefix}-error-alt:before { content: $el-var-error-alt; } -.#{$el-css-prefix}-icon-error:before, -.#{$el-css-prefix}-error:before { content: $el-var-error; } -.#{$el-css-prefix}-icon-eur:before, -.#{$el-css-prefix}-eur:before { content: $el-var-eur; } -.#{$el-css-prefix}-icon-exclamation-sign:before, -.#{$el-css-prefix}-exclamation-sign:before { content: $el-var-exclamation-sign; } -.#{$el-css-prefix}-icon-eye-close:before, -.#{$el-css-prefix}-eye-close:before { content: $el-var-eye-close; } -.#{$el-css-prefix}-icon-eye-open:before, -.#{$el-css-prefix}-eye-open:before { content: $el-var-eye-open; } -.#{$el-css-prefix}-icon-facebook:before, -.#{$el-css-prefix}-facebook:before { content: $el-var-facebook; } -.#{$el-css-prefix}-icon-facetime-video:before, -.#{$el-css-prefix}-facetime-video:before { content: $el-var-facetime-video; } -.#{$el-css-prefix}-icon-fast-backward:before, -.#{$el-css-prefix}-fast-backward:before { content: $el-var-fast-backward; } -.#{$el-css-prefix}-icon-fast-forward:before, -.#{$el-css-prefix}-fast-forward:before { content: $el-var-fast-forward; } -.#{$el-css-prefix}-icon-female:before, -.#{$el-css-prefix}-female:before { content: $el-var-female; } -.#{$el-css-prefix}-icon-file-alt:before, -.#{$el-css-prefix}-file-alt:before { content: $el-var-file-alt; } -.#{$el-css-prefix}-icon-file-edit-alt:before, -.#{$el-css-prefix}-file-edit-alt:before { content: $el-var-file-edit-alt; } -.#{$el-css-prefix}-icon-file-edit:before, -.#{$el-css-prefix}-file-edit:before { content: $el-var-file-edit; } -.#{$el-css-prefix}-icon-file-new-alt:before, -.#{$el-css-prefix}-file-new-alt:before { content: $el-var-file-new-alt; } -.#{$el-css-prefix}-icon-file-new:before, -.#{$el-css-prefix}-file-new:before { content: $el-var-file-new; } -.#{$el-css-prefix}-icon-file:before, -.#{$el-css-prefix}-file:before { content: $el-var-file; } -.#{$el-css-prefix}-icon-film:before, -.#{$el-css-prefix}-film:before { content: $el-var-film; } -.#{$el-css-prefix}-icon-filter:before, -.#{$el-css-prefix}-filter:before { content: $el-var-filter; } -.#{$el-css-prefix}-icon-fire:before, -.#{$el-css-prefix}-fire:before { content: $el-var-fire; } -.#{$el-css-prefix}-icon-flag-alt:before, -.#{$el-css-prefix}-flag-alt:before { content: $el-var-flag-alt; } -.#{$el-css-prefix}-icon-flag:before, -.#{$el-css-prefix}-flag:before { content: $el-var-flag; } -.#{$el-css-prefix}-icon-flickr:before, -.#{$el-css-prefix}-flickr:before { content: $el-var-flickr; } -.#{$el-css-prefix}-icon-folder-close:before, -.#{$el-css-prefix}-folder-close:before { content: $el-var-folder-close; } -.#{$el-css-prefix}-icon-folder-open:before, -.#{$el-css-prefix}-folder-open:before { content: $el-var-folder-open; } -.#{$el-css-prefix}-icon-folder-sign:before, -.#{$el-css-prefix}-folder-sign:before { content: $el-var-folder-sign; } -.#{$el-css-prefix}-icon-folder:before, -.#{$el-css-prefix}-folder:before { content: $el-var-folder; } -.#{$el-css-prefix}-icon-font:before, -.#{$el-css-prefix}-font:before { content: $el-var-font; } -.#{$el-css-prefix}-icon-fontsize:before, -.#{$el-css-prefix}-fontsize:before { content: $el-var-fontsize; } -.#{$el-css-prefix}-icon-fork:before, -.#{$el-css-prefix}-fork:before { content: $el-var-fork; } -.#{$el-css-prefix}-icon-forward-alt:before, -.#{$el-css-prefix}-forward-alt:before { content: $el-var-forward-alt; } -.#{$el-css-prefix}-icon-forward:before, -.#{$el-css-prefix}-forward:before { content: $el-var-forward; } -.#{$el-css-prefix}-icon-foursquare:before, -.#{$el-css-prefix}-foursquare:before { content: $el-var-foursquare; } -.#{$el-css-prefix}-icon-friendfeed-rect:before, -.#{$el-css-prefix}-friendfeed-rect:before { content: $el-var-friendfeed-rect; } -.#{$el-css-prefix}-icon-friendfeed:before, -.#{$el-css-prefix}-friendfeed:before { content: $el-var-friendfeed; } -.#{$el-css-prefix}-icon-fullscreen:before, -.#{$el-css-prefix}-fullscreen:before { content: $el-var-fullscreen; } -.#{$el-css-prefix}-icon-gallery:before, -.#{$el-css-prefix}-gallery:before { content: $el-var-gallery; } -.#{$el-css-prefix}-icon-gbp:before, -.#{$el-css-prefix}-gbp:before { content: $el-var-gbp; } -.#{$el-css-prefix}-icon-gift:before, -.#{$el-css-prefix}-gift:before { content: $el-var-gift; } -.#{$el-css-prefix}-icon-github-text:before, -.#{$el-css-prefix}-github-text:before { content: $el-var-github-text; } -.#{$el-css-prefix}-icon-github:before, -.#{$el-css-prefix}-github:before { content: $el-var-github; } -.#{$el-css-prefix}-icon-glass:before, -.#{$el-css-prefix}-glass:before { content: $el-var-glass; } -.#{$el-css-prefix}-icon-glasses:before, -.#{$el-css-prefix}-glasses:before { content: $el-var-glasses; } -.#{$el-css-prefix}-icon-globe-alt:before, -.#{$el-css-prefix}-globe-alt:before { content: $el-var-globe-alt; } -.#{$el-css-prefix}-icon-globe:before, -.#{$el-css-prefix}-globe:before { content: $el-var-globe; } -.#{$el-css-prefix}-icon-googleplus:before, -.#{$el-css-prefix}-googleplus:before { content: $el-var-googleplus; } -.#{$el-css-prefix}-icon-graph-alt:before, -.#{$el-css-prefix}-graph-alt:before { content: $el-var-graph-alt; } -.#{$el-css-prefix}-icon-graph:before, -.#{$el-css-prefix}-graph:before { content: $el-var-graph; } -.#{$el-css-prefix}-icon-group-alt:before, -.#{$el-css-prefix}-group-alt:before { content: $el-var-group-alt; } -.#{$el-css-prefix}-icon-group:before, -.#{$el-css-prefix}-group:before { content: $el-var-group; } -.#{$el-css-prefix}-icon-guidedog:before, -.#{$el-css-prefix}-guidedog:before { content: $el-var-guidedog; } -.#{$el-css-prefix}-icon-hand-down:before, -.#{$el-css-prefix}-hand-down:before { content: $el-var-hand-down; } -.#{$el-css-prefix}-icon-hand-left:before, -.#{$el-css-prefix}-hand-left:before { content: $el-var-hand-left; } -.#{$el-css-prefix}-icon-hand-right:before, -.#{$el-css-prefix}-hand-right:before { content: $el-var-hand-right; } -.#{$el-css-prefix}-icon-hand-up:before, -.#{$el-css-prefix}-hand-up:before { content: $el-var-hand-up; } -.#{$el-css-prefix}-icon-hdd:before, -.#{$el-css-prefix}-hdd:before { content: $el-var-hdd; } -.#{$el-css-prefix}-icon-headphones:before, -.#{$el-css-prefix}-headphones:before { content: $el-var-headphones; } -.#{$el-css-prefix}-icon-hearing-impaired:before, -.#{$el-css-prefix}-hearing-impaired:before { content: $el-var-hearing-impaired; } -.#{$el-css-prefix}-icon-heart-alt:before, -.#{$el-css-prefix}-heart-alt:before { content: $el-var-heart-alt; } -.#{$el-css-prefix}-icon-heart-empty:before, -.#{$el-css-prefix}-heart-empty:before { content: $el-var-heart-empty; } -.#{$el-css-prefix}-icon-heart:before, -.#{$el-css-prefix}-heart:before { content: $el-var-heart; } -.#{$el-css-prefix}-icon-home-alt:before, -.#{$el-css-prefix}-home-alt:before { content: $el-var-home-alt; } -.#{$el-css-prefix}-icon-home:before, -.#{$el-css-prefix}-home:before { content: $el-var-home; } -.#{$el-css-prefix}-icon-hourglass:before, -.#{$el-css-prefix}-hourglass:before { content: $el-var-hourglass; } -.#{$el-css-prefix}-icon-idea-alt:before, -.#{$el-css-prefix}-idea-alt:before { content: $el-var-idea-alt; } -.#{$el-css-prefix}-icon-idea:before, -.#{$el-css-prefix}-idea:before { content: $el-var-idea; } -.#{$el-css-prefix}-icon-inbox-alt:before, -.#{$el-css-prefix}-inbox-alt:before { content: $el-var-inbox-alt; } -.#{$el-css-prefix}-icon-inbox-box:before, -.#{$el-css-prefix}-inbox-box:before { content: $el-var-inbox-box; } -.#{$el-css-prefix}-icon-inbox:before, -.#{$el-css-prefix}-inbox:before { content: $el-var-inbox; } -.#{$el-css-prefix}-icon-indent-left:before, -.#{$el-css-prefix}-indent-left:before { content: $el-var-indent-left; } -.#{$el-css-prefix}-icon-indent-right:before, -.#{$el-css-prefix}-indent-right:before { content: $el-var-indent-right; } -.#{$el-css-prefix}-icon-info-circle:before, -.#{$el-css-prefix}-info-circle:before { content: $el-var-info-circle; } -.#{$el-css-prefix}-icon-instagram:before, -.#{$el-css-prefix}-instagram:before { content: $el-var-instagram; } -.#{$el-css-prefix}-icon-iphone-home:before, -.#{$el-css-prefix}-iphone-home:before { content: $el-var-iphone-home; } -.#{$el-css-prefix}-icon-italic:before, -.#{$el-css-prefix}-italic:before { content: $el-var-italic; } -.#{$el-css-prefix}-icon-key:before, -.#{$el-css-prefix}-key:before { content: $el-var-key; } -.#{$el-css-prefix}-icon-laptop-alt:before, -.#{$el-css-prefix}-laptop-alt:before { content: $el-var-laptop-alt; } -.#{$el-css-prefix}-icon-laptop:before, -.#{$el-css-prefix}-laptop:before { content: $el-var-laptop; } -.#{$el-css-prefix}-icon-lastfm:before, -.#{$el-css-prefix}-lastfm:before { content: $el-var-lastfm; } -.#{$el-css-prefix}-icon-leaf:before, -.#{$el-css-prefix}-leaf:before { content: $el-var-leaf; } -.#{$el-css-prefix}-icon-lines:before, -.#{$el-css-prefix}-lines:before { content: $el-var-lines; } -.#{$el-css-prefix}-icon-link:before, -.#{$el-css-prefix}-link:before { content: $el-var-link; } -.#{$el-css-prefix}-icon-linkedin:before, -.#{$el-css-prefix}-linkedin:before { content: $el-var-linkedin; } -.#{$el-css-prefix}-icon-list-alt:before, -.#{$el-css-prefix}-list-alt:before { content: $el-var-list-alt; } -.#{$el-css-prefix}-icon-list:before, -.#{$el-css-prefix}-list:before { content: $el-var-list; } -.#{$el-css-prefix}-icon-livejournal:before, -.#{$el-css-prefix}-livejournal:before { content: $el-var-livejournal; } -.#{$el-css-prefix}-icon-lock-alt:before, -.#{$el-css-prefix}-lock-alt:before { content: $el-var-lock-alt; } -.#{$el-css-prefix}-icon-lock:before, -.#{$el-css-prefix}-lock:before { content: $el-var-lock; } -.#{$el-css-prefix}-icon-magic:before, -.#{$el-css-prefix}-magic:before { content: $el-var-magic; } -.#{$el-css-prefix}-icon-magnet:before, -.#{$el-css-prefix}-magnet:before { content: $el-var-magnet; } -.#{$el-css-prefix}-icon-male:before, -.#{$el-css-prefix}-male:before { content: $el-var-male; } -.#{$el-css-prefix}-icon-map-marker-alt:before, -.#{$el-css-prefix}-map-marker-alt:before { content: $el-var-map-marker-alt; } -.#{$el-css-prefix}-icon-map-marker:before, -.#{$el-css-prefix}-map-marker:before { content: $el-var-map-marker; } -.#{$el-css-prefix}-icon-mic-alt:before, -.#{$el-css-prefix}-mic-alt:before { content: $el-var-mic-alt; } -.#{$el-css-prefix}-icon-mic:before, -.#{$el-css-prefix}-mic:before { content: $el-var-mic; } -.#{$el-css-prefix}-icon-minus-sign:before, -.#{$el-css-prefix}-minus-sign:before { content: $el-var-minus-sign; } -.#{$el-css-prefix}-icon-minus:before, -.#{$el-css-prefix}-minus:before { content: $el-var-minus; } -.#{$el-css-prefix}-icon-move:before, -.#{$el-css-prefix}-move:before { content: $el-var-move; } -.#{$el-css-prefix}-icon-music:before, -.#{$el-css-prefix}-music:before { content: $el-var-music; } -.#{$el-css-prefix}-icon-myspace:before, -.#{$el-css-prefix}-myspace:before { content: $el-var-myspace; } -.#{$el-css-prefix}-icon-network:before, -.#{$el-css-prefix}-network:before { content: $el-var-network; } -.#{$el-css-prefix}-icon-off:before, -.#{$el-css-prefix}-off:before { content: $el-var-off; } -.#{$el-css-prefix}-icon-ok-circle:before, -.#{$el-css-prefix}-ok-circle:before { content: $el-var-ok-circle; } -.#{$el-css-prefix}-icon-ok-sign:before, -.#{$el-css-prefix}-ok-sign:before { content: $el-var-ok-sign; } -.#{$el-css-prefix}-icon-ok:before, -.#{$el-css-prefix}-ok:before { content: $el-var-ok; } -.#{$el-css-prefix}-icon-opensource:before, -.#{$el-css-prefix}-opensource:before { content: $el-var-opensource; } -.#{$el-css-prefix}-icon-paper-clip-alt:before, -.#{$el-css-prefix}-paper-clip-alt:before { content: $el-var-paper-clip-alt; } -.#{$el-css-prefix}-icon-paper-clip:before, -.#{$el-css-prefix}-paper-clip:before { content: $el-var-paper-clip; } -.#{$el-css-prefix}-icon-path:before, -.#{$el-css-prefix}-path:before { content: $el-var-path; } -.#{$el-css-prefix}-icon-pause-alt:before, -.#{$el-css-prefix}-pause-alt:before { content: $el-var-pause-alt; } -.#{$el-css-prefix}-icon-pause:before, -.#{$el-css-prefix}-pause:before { content: $el-var-pause; } -.#{$el-css-prefix}-icon-pencil-alt:before, -.#{$el-css-prefix}-pencil-alt:before { content: $el-var-pencil-alt; } -.#{$el-css-prefix}-icon-pencil:before, -.#{$el-css-prefix}-pencil:before { content: $el-var-pencil; } -.#{$el-css-prefix}-icon-person:before, -.#{$el-css-prefix}-person:before { content: $el-var-person; } -.#{$el-css-prefix}-icon-phone-alt:before, -.#{$el-css-prefix}-phone-alt:before { content: $el-var-phone-alt; } -.#{$el-css-prefix}-icon-phone:before, -.#{$el-css-prefix}-phone:before { content: $el-var-phone; } -.#{$el-css-prefix}-icon-photo-alt:before, -.#{$el-css-prefix}-photo-alt:before { content: $el-var-photo-alt; } -.#{$el-css-prefix}-icon-photo:before, -.#{$el-css-prefix}-photo:before { content: $el-var-photo; } -.#{$el-css-prefix}-icon-picasa:before, -.#{$el-css-prefix}-picasa:before { content: $el-var-picasa; } -.#{$el-css-prefix}-icon-picture:before, -.#{$el-css-prefix}-picture:before { content: $el-var-picture; } -.#{$el-css-prefix}-icon-plane:before, -.#{$el-css-prefix}-plane:before { content: $el-var-plane; } -.#{$el-css-prefix}-icon-play-alt:before, -.#{$el-css-prefix}-play-alt:before { content: $el-var-play-alt; } -.#{$el-css-prefix}-icon-play-circle:before, -.#{$el-css-prefix}-play-circle:before { content: $el-var-play-circle; } -.#{$el-css-prefix}-icon-play:before, -.#{$el-css-prefix}-play:before { content: $el-var-play; } -.#{$el-css-prefix}-icon-plurk-alt:before, -.#{$el-css-prefix}-plurk-alt:before { content: $el-var-plurk-alt; } -.#{$el-css-prefix}-icon-plurk:before, -.#{$el-css-prefix}-plurk:before { content: $el-var-plurk; } -.#{$el-css-prefix}-icon-plus-sign:before, -.#{$el-css-prefix}-plus-sign:before { content: $el-var-plus-sign; } -.#{$el-css-prefix}-icon-plus:before, -.#{$el-css-prefix}-plus:before { content: $el-var-plus; } -.#{$el-css-prefix}-icon-podcast:before, -.#{$el-css-prefix}-podcast:before { content: $el-var-podcast; } -.#{$el-css-prefix}-icon-print:before, -.#{$el-css-prefix}-print:before { content: $el-var-print; } -.#{$el-css-prefix}-icon-puzzle:before, -.#{$el-css-prefix}-puzzle:before { content: $el-var-puzzle; } -.#{$el-css-prefix}-icon-qrcode:before, -.#{$el-css-prefix}-qrcode:before { content: $el-var-qrcode; } -.#{$el-css-prefix}-icon-question-sign:before, -.#{$el-css-prefix}-question-sign:before { content: $el-var-question-sign; } -.#{$el-css-prefix}-icon-question:before, -.#{$el-css-prefix}-question:before { content: $el-var-question; } -.#{$el-css-prefix}-icon-quote-alt:before, -.#{$el-css-prefix}-quote-alt:before { content: $el-var-quote-alt; } -.#{$el-css-prefix}-icon-quote-right-alt:before, -.#{$el-css-prefix}-quote-right-alt:before { content: $el-var-quote-right-alt; } -.#{$el-css-prefix}-icon-quote-right:before, -.#{$el-css-prefix}-quote-right:before { content: $el-var-quote-right; } -.#{$el-css-prefix}-icon-quotes:before, -.#{$el-css-prefix}-quotes:before { content: $el-var-quotes; } -.#{$el-css-prefix}-icon-random:before, -.#{$el-css-prefix}-random:before { content: $el-var-random; } -.#{$el-css-prefix}-icon-record:before, -.#{$el-css-prefix}-record:before { content: $el-var-record; } -.#{$el-css-prefix}-icon-reddit:before, -.#{$el-css-prefix}-reddit:before { content: $el-var-reddit; } -.#{$el-css-prefix}-icon-redux:before, -.#{$el-css-prefix}-redux:before { content: $el-var-redux; } -.#{$el-css-prefix}-icon-refresh:before, -.#{$el-css-prefix}-refresh:before { content: $el-var-refresh; } -.#{$el-css-prefix}-icon-remove-circle:before, -.#{$el-css-prefix}-remove-circle:before { content: $el-var-remove-circle; } -.#{$el-css-prefix}-icon-remove-sign:before, -.#{$el-css-prefix}-remove-sign:before { content: $el-var-remove-sign; } -.#{$el-css-prefix}-icon-remove:before, -.#{$el-css-prefix}-remove:before { content: $el-var-remove; } -.#{$el-css-prefix}-icon-repeat-alt:before, -.#{$el-css-prefix}-repeat-alt:before { content: $el-var-repeat-alt; } -.#{$el-css-prefix}-icon-repeat:before, -.#{$el-css-prefix}-repeat:before { content: $el-var-repeat; } -.#{$el-css-prefix}-icon-resize-full:before, -.#{$el-css-prefix}-resize-full:before { content: $el-var-resize-full; } -.#{$el-css-prefix}-icon-resize-horizontal:before, -.#{$el-css-prefix}-resize-horizontal:before { content: $el-var-resize-horizontal; } -.#{$el-css-prefix}-icon-resize-small:before, -.#{$el-css-prefix}-resize-small:before { content: $el-var-resize-small; } -.#{$el-css-prefix}-icon-resize-vertical:before, -.#{$el-css-prefix}-resize-vertical:before { content: $el-var-resize-vertical; } -.#{$el-css-prefix}-icon-return-key:before, -.#{$el-css-prefix}-return-key:before { content: $el-var-return-key; } -.#{$el-css-prefix}-icon-retweet:before, -.#{$el-css-prefix}-retweet:before { content: $el-var-retweet; } -.#{$el-css-prefix}-icon-reverse-alt:before, -.#{$el-css-prefix}-reverse-alt:before { content: $el-var-reverse-alt; } -.#{$el-css-prefix}-icon-road:before, -.#{$el-css-prefix}-road:before { content: $el-var-road; } -.#{$el-css-prefix}-icon-rss:before, -.#{$el-css-prefix}-rss:before { content: $el-var-rss; } -.#{$el-css-prefix}-icon-scissors:before, -.#{$el-css-prefix}-scissors:before { content: $el-var-scissors; } -.#{$el-css-prefix}-icon-screen-alt:before, -.#{$el-css-prefix}-screen-alt:before { content: $el-var-screen-alt; } -.#{$el-css-prefix}-icon-screen:before, -.#{$el-css-prefix}-screen:before { content: $el-var-screen; } -.#{$el-css-prefix}-icon-screenshot:before, -.#{$el-css-prefix}-screenshot:before { content: $el-var-screenshot; } -.#{$el-css-prefix}-icon-search-alt:before, -.#{$el-css-prefix}-search-alt:before { content: $el-var-search-alt; } -.#{$el-css-prefix}-icon-search:before, -.#{$el-css-prefix}-search:before { content: $el-var-search; } -.#{$el-css-prefix}-icon-share-alt:before, -.#{$el-css-prefix}-share-alt:before { content: $el-var-share-alt; } -.#{$el-css-prefix}-icon-share:before, -.#{$el-css-prefix}-share:before { content: $el-var-share; } -.#{$el-css-prefix}-icon-shopping-cart-sign:before, -.#{$el-css-prefix}-shopping-cart-sign:before { content: $el-var-shopping-cart-sign; } -.#{$el-css-prefix}-icon-shopping-cart:before, -.#{$el-css-prefix}-shopping-cart:before { content: $el-var-shopping-cart; } -.#{$el-css-prefix}-icon-shortcode:before, -.#{$el-css-prefix}-shortcode:before { content: $el-var-shortcode; } -.#{$el-css-prefix}-icon-signal:before, -.#{$el-css-prefix}-signal:before { content: $el-var-signal; } -.#{$el-css-prefix}-icon-skype:before, -.#{$el-css-prefix}-skype:before { content: $el-var-skype; } -.#{$el-css-prefix}-icon-slideshare:before, -.#{$el-css-prefix}-slideshare:before { content: $el-var-slideshare; } -.#{$el-css-prefix}-icon-smiley-alt:before, -.#{$el-css-prefix}-smiley-alt:before { content: $el-var-smiley-alt; } -.#{$el-css-prefix}-icon-smiley:before, -.#{$el-css-prefix}-smiley:before { content: $el-var-smiley; } -.#{$el-css-prefix}-icon-soundcloud:before, -.#{$el-css-prefix}-soundcloud:before { content: $el-var-soundcloud; } -.#{$el-css-prefix}-icon-speaker:before, -.#{$el-css-prefix}-speaker:before { content: $el-var-speaker; } -.#{$el-css-prefix}-icon-spotify:before, -.#{$el-css-prefix}-spotify:before { content: $el-var-spotify; } -.#{$el-css-prefix}-icon-stackoverflow:before, -.#{$el-css-prefix}-stackoverflow:before { content: $el-var-stackoverflow; } -.#{$el-css-prefix}-icon-star-alt:before, -.#{$el-css-prefix}-star-alt:before { content: $el-var-star-alt; } -.#{$el-css-prefix}-icon-star-empty:before, -.#{$el-css-prefix}-star-empty:before { content: $el-var-star-empty; } -.#{$el-css-prefix}-icon-star:before, -.#{$el-css-prefix}-star:before { content: $el-var-star; } -.#{$el-css-prefix}-icon-step-backward:before, -.#{$el-css-prefix}-step-backward:before { content: $el-var-step-backward; } -.#{$el-css-prefix}-icon-step-forward:before, -.#{$el-css-prefix}-step-forward:before { content: $el-var-step-forward; } -.#{$el-css-prefix}-icon-stop-alt:before, -.#{$el-css-prefix}-stop-alt:before { content: $el-var-stop-alt; } -.#{$el-css-prefix}-icon-stop:before, -.#{$el-css-prefix}-stop:before { content: $el-var-stop; } -.#{$el-css-prefix}-icon-stumbleupon:before, -.#{$el-css-prefix}-stumbleupon:before { content: $el-var-stumbleupon; } -.#{$el-css-prefix}-icon-tag:before, -.#{$el-css-prefix}-tag:before { content: $el-var-tag; } -.#{$el-css-prefix}-icon-tags:before, -.#{$el-css-prefix}-tags:before { content: $el-var-tags; } -.#{$el-css-prefix}-icon-tasks:before, -.#{$el-css-prefix}-tasks:before { content: $el-var-tasks; } -.#{$el-css-prefix}-icon-text-height:before, -.#{$el-css-prefix}-text-height:before { content: $el-var-text-height; } -.#{$el-css-prefix}-icon-text-width:before, -.#{$el-css-prefix}-text-width:before { content: $el-var-text-width; } -.#{$el-css-prefix}-icon-th-large:before, -.#{$el-css-prefix}-th-large:before { content: $el-var-th-large; } -.#{$el-css-prefix}-icon-th-list:before, -.#{$el-css-prefix}-th-list:before { content: $el-var-th-list; } -.#{$el-css-prefix}-icon-th:before, -.#{$el-css-prefix}-th:before { content: $el-var-th; } -.#{$el-css-prefix}-icon-thumbs-down:before, -.#{$el-css-prefix}-thumbs-down:before { content: $el-var-thumbs-down; } -.#{$el-css-prefix}-icon-thumbs-up:before, -.#{$el-css-prefix}-thumbs-up:before { content: $el-var-thumbs-up; } -.#{$el-css-prefix}-icon-time-alt:before, -.#{$el-css-prefix}-time-alt:before { content: $el-var-time-alt; } -.#{$el-css-prefix}-icon-time:before, -.#{$el-css-prefix}-time:before { content: $el-var-time; } -.#{$el-css-prefix}-icon-tint:before, -.#{$el-css-prefix}-tint:before { content: $el-var-tint; } -.#{$el-css-prefix}-icon-torso:before, -.#{$el-css-prefix}-torso:before { content: $el-var-torso; } -.#{$el-css-prefix}-icon-trash-alt:before, -.#{$el-css-prefix}-trash-alt:before { content: $el-var-trash-alt; } -.#{$el-css-prefix}-icon-trash:before, -.#{$el-css-prefix}-trash:before { content: $el-var-trash; } -.#{$el-css-prefix}-icon-tumblr:before, -.#{$el-css-prefix}-tumblr:before { content: $el-var-tumblr; } -.#{$el-css-prefix}-icon-twitter:before, -.#{$el-css-prefix}-twitter:before { content: $el-var-twitter; } -.#{$el-css-prefix}-icon-universal-access:before, -.#{$el-css-prefix}-universal-access:before { content: $el-var-universal-access; } -.#{$el-css-prefix}-icon-unlock-alt:before, -.#{$el-css-prefix}-unlock-alt:before { content: $el-var-unlock-alt; } -.#{$el-css-prefix}-icon-unlock:before, -.#{$el-css-prefix}-unlock:before { content: $el-var-unlock; } -.#{$el-css-prefix}-icon-upload:before, -.#{$el-css-prefix}-upload:before { content: $el-var-upload; } -.#{$el-css-prefix}-icon-usd:before, -.#{$el-css-prefix}-usd:before { content: $el-var-usd; } -.#{$el-css-prefix}-icon-user:before, -.#{$el-css-prefix}-user:before { content: $el-var-user; } -.#{$el-css-prefix}-icon-viadeo:before, -.#{$el-css-prefix}-viadeo:before { content: $el-var-viadeo; } -.#{$el-css-prefix}-icon-video-alt:before, -.#{$el-css-prefix}-video-alt:before { content: $el-var-video-alt; } -.#{$el-css-prefix}-icon-video-chat:before, -.#{$el-css-prefix}-video-chat:before { content: $el-var-video-chat; } -.#{$el-css-prefix}-icon-video:before, -.#{$el-css-prefix}-video:before { content: $el-var-video; } -.#{$el-css-prefix}-icon-view-mode:before, -.#{$el-css-prefix}-view-mode:before { content: $el-var-view-mode; } -.#{$el-css-prefix}-icon-vimeo:before, -.#{$el-css-prefix}-vimeo:before { content: $el-var-vimeo; } -.#{$el-css-prefix}-icon-vkontakte:before, -.#{$el-css-prefix}-vkontakte:before { content: $el-var-vkontakte; } -.#{$el-css-prefix}-icon-volume-down:before, -.#{$el-css-prefix}-volume-down:before { content: $el-var-volume-down; } -.#{$el-css-prefix}-icon-volume-off:before, -.#{$el-css-prefix}-volume-off:before { content: $el-var-volume-off; } -.#{$el-css-prefix}-icon-volume-up:before, -.#{$el-css-prefix}-volume-up:before { content: $el-var-volume-up; } -.#{$el-css-prefix}-icon-w3c:before, -.#{$el-css-prefix}-w3c:before { content: $el-var-w3c; } -.#{$el-css-prefix}-icon-warning-sign:before, -.#{$el-css-prefix}-warning-sign:before { content: $el-var-warning-sign; } -.#{$el-css-prefix}-icon-website-alt:before, -.#{$el-css-prefix}-website-alt:before { content: $el-var-website-alt; } -.#{$el-css-prefix}-icon-website:before, -.#{$el-css-prefix}-website:before { content: $el-var-website; } -.#{$el-css-prefix}-icon-wheelchair:before, -.#{$el-css-prefix}-wheelchair:before { content: $el-var-wheelchair; } -.#{$el-css-prefix}-icon-wordpress:before, -.#{$el-css-prefix}-wordpress:before { content: $el-var-wordpress; } -.#{$el-css-prefix}-icon-wrench-alt:before, -.#{$el-css-prefix}-wrench-alt:before { content: $el-var-wrench-alt; } -.#{$el-css-prefix}-icon-wrench:before, -.#{$el-css-prefix}-wrench:before { content: $el-var-wrench; } -.#{$el-css-prefix}-icon-youtube:before, -.#{$el-css-prefix}-youtube:before { content: $el-var-youtube; } -.#{$el-css-prefix}-icon-zoom-in:before, -.#{$el-css-prefix}-zoom-in:before { content: $el-var-zoom-in; } -.#{$el-css-prefix}-icon-zoom-out:before, -.#{$el-css-prefix}-zoom-out:before { content: $el-var-zoom-out; } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_larger.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_larger.scss deleted file mode 100755 index f76eab77..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_larger.scss +++ /dev/null @@ -1,13 +0,0 @@ -// Icon Sizes -// ------------------------- - -/* makes the font 33% larger relative to the icon container */ -.#{$el-css-prefix}-lg { - font-size: (4em / 3); - line-height: (3em / 4); - vertical-align: -15%; -} -.#{$el-css-prefix}-2x { font-size: 2em; } -.#{$el-css-prefix}-3x { font-size: 3em; } -.#{$el-css-prefix}-4x { font-size: 4em; } -.#{$el-css-prefix}-5x { font-size: 5em; } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_list.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_list.scss deleted file mode 100755 index fefec82a..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_list.scss +++ /dev/null @@ -1,19 +0,0 @@ -// List Icons -// ------------------------- - -.#{$el-css-prefix}-ul { - padding-left: 0; - margin-left: $el-li-width; - list-style-type: none; - > li { position: relative; } -} -.#{$el-css-prefix}-li { - position: absolute; - left: -$el-li-width; - width: $el-li-width; - top: (2em / 14); - text-align: center; - &.#{$el-css-prefix}-lg { - left: -$el-li-width + (4em / 14); - } -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_mixins.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_mixins.scss deleted file mode 100755 index b443823f..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_mixins.scss +++ /dev/null @@ -1,27 +0,0 @@ -// Mixins -// -------------------------- - -@mixin el-icon() { - display: inline-block; - font: normal normal normal #{$el-font-size-base}/1 'Elusive-Icons'; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - transform: translate(0, 0); // ensures no half-pixel rendering in firefox - -} - -@mixin el-icon-rotate($degrees, $rotation) { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); - -webkit-transform: rotate($degrees); - -ms-transform: rotate($degrees); - transform: rotate($degrees); -} - -@mixin el-icon-flip($horiz, $vert, $rotation) { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); - -webkit-transform: scale($horiz, $vert); - -ms-transform: scale($horiz, $vert); - transform: scale($horiz, $vert); -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_path.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_path.scss deleted file mode 100755 index 4989ef2d..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_path.scss +++ /dev/null @@ -1,14 +0,0 @@ -/* FONT PATH - * -------------------------- */ - -@font-face { - font-family: 'Elusive-Icons'; - src: url('#{$el-font-path}/elusiveicons-webfont.eot?v=#{$el-version}'); - src: url('#{$el-font-path}/elusiveicons-webfont.eot?#iefix&v=#{$el-version}') format('embedded-opentype'), - //url('#{$el-font-path}/elusiveicons-webfont.woff2?v=#{$el-version}') format('woff2'), - url('#{$el-font-path}/elusiveicons-webfont.woff?v=#{$el-version}') format('woff'), - url('#{$el-font-path}/elusiveicons-webfont.ttf?v=#{$el-version}') format('truetype'), - url('#{$el-font-path}/elusiveicons-webfont.svg?v=#{$el-version}#elusiveiconsregular') format('svg'); - font-weight: normal; - font-style: normal; -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_rotated-flipped.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_rotated-flipped.scss deleted file mode 100755 index 82481611..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_rotated-flipped.scss +++ /dev/null @@ -1,20 +0,0 @@ -// Rotated & Flipped Icons -// ------------------------- - -.#{$el-css-prefix}-rotate-90 { @include el-icon-rotate(90deg, 1); } -.#{$el-css-prefix}-rotate-180 { @include el-icon-rotate(180deg, 2); } -.#{$el-css-prefix}-rotate-270 { @include el-icon-rotate(270deg, 3); } - -.#{$el-css-prefix}-flip-horizontal { @include el-icon-flip(-1, 1, 0); } -.#{$el-css-prefix}-flip-vertical { @include el-icon-flip(1, -1, 2); } - -// Hook for IE8-9 -// ------------------------- - -:root .#{$el-css-prefix}-rotate-90, -:root .#{$el-css-prefix}-rotate-180, -:root .#{$el-css-prefix}-rotate-270, -:root .#{$el-css-prefix}-flip-horizontal, -:root .#{$el-css-prefix}-flip-vertical { - filter: none; -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_stacked.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_stacked.scss deleted file mode 100755 index 68d84bb6..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_stacked.scss +++ /dev/null @@ -1,20 +0,0 @@ -// Stacked Icons -// ------------------------- - -.#{$el-css-prefix}-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.#{$el-css-prefix}-stack-1x, .#{$el-css-prefix}-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.#{$el-css-prefix}-stack-1x { line-height: inherit; } -.#{$el-css-prefix}-stack-2x { font-size: 2em; } -.#{$el-css-prefix}-inverse { color: $el-inverse; } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_variables.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_variables.scss deleted file mode 100755 index b5ddf72a..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/_variables.scss +++ /dev/null @@ -1,318 +0,0 @@ -// Variables -// -------------------------- - -$el-font-path: "fonts" !default; -$el-font-size-base: 14px !default; -$el-css-prefix: el !default; -$el-version: "2.0.0" !default; -$el-border-color: #eee !default; -$el-inverse: #fff !default; -$el-li-width: (30em / 14) !default; - -$el-var-address-book: "\f102"; -$el-var-address-book-alt: "\f101"; -$el-var-adjust: "\f104"; -$el-var-adjust-alt: "\f103"; -$el-var-adult: "\f105"; -$el-var-align-center: "\f106"; -$el-var-align-justify: "\f107"; -$el-var-align-left: "\f108"; -$el-var-align-right: "\f109"; -$el-var-arrow-down: "\f10a"; -$el-var-arrow-left: "\f10b"; -$el-var-arrow-right: "\f10c"; -$el-var-arrow-up: "\f10d"; -$el-var-asl: "\f10e"; -$el-var-asterisk: "\f10f"; -$el-var-backward: "\f110"; -$el-var-ban-circle: "\f111"; -$el-var-barcode: "\f112"; -$el-var-behance: "\f113"; -$el-var-bell: "\f114"; -$el-var-blind: "\f115"; -$el-var-blogger: "\f116"; -$el-var-bold: "\f117"; -$el-var-book: "\f118"; -$el-var-bookmark: "\f11a"; -$el-var-bookmark-empty: "\f119"; -$el-var-brackets: "\f11b"; -$el-var-braille: "\f11c"; -$el-var-briefcase: "\f11d"; -$el-var-broom: "\f11e"; -$el-var-brush: "\f11f"; -$el-var-bulb: "\f120"; -$el-var-bullhorn: "\f121"; -$el-var-calendar: "\f123"; -$el-var-calendar-sign: "\f122"; -$el-var-camera: "\f124"; -$el-var-car: "\f125"; -$el-var-caret-down: "\f126"; -$el-var-caret-left: "\f127"; -$el-var-caret-right: "\f128"; -$el-var-caret-up: "\f129"; -$el-var-cc: "\f12a"; -$el-var-certificate: "\f12b"; -$el-var-check: "\f12d"; -$el-var-check-empty: "\f12c"; -$el-var-chevron-down: "\f12e"; -$el-var-chevron-left: "\f12f"; -$el-var-chevron-right: "\f130"; -$el-var-chevron-up: "\f131"; -$el-var-child: "\f132"; -$el-var-circle-arrow-down: "\f133"; -$el-var-circle-arrow-left: "\f134"; -$el-var-circle-arrow-right: "\f135"; -$el-var-circle-arrow-up: "\f136"; -$el-var-cloud: "\f138"; -$el-var-cloud-alt: "\f137"; -$el-var-cog: "\f13a"; -$el-var-cog-alt: "\f139"; -$el-var-cogs: "\f13b"; -$el-var-comment: "\f13d"; -$el-var-comment-alt: "\f13c"; -$el-var-compass: "\f13f"; -$el-var-compass-alt: "\f13e"; -$el-var-credit-card: "\f140"; -$el-var-css: "\f141"; -$el-var-dashboard: "\f142"; -$el-var-delicious: "\f143"; -$el-var-deviantart: "\f144"; -$el-var-digg: "\f145"; -$el-var-download: "\f147"; -$el-var-download-alt: "\f146"; -$el-var-dribbble: "\f148"; -$el-var-edit: "\f149"; -$el-var-eject: "\f14a"; -$el-var-envelope: "\f14c"; -$el-var-envelope-alt: "\f14b"; -$el-var-error: "\f14e"; -$el-var-error-alt: "\f14d"; -$el-var-eur: "\f14f"; -$el-var-exclamation-sign: "\f150"; -$el-var-eye-close: "\f151"; -$el-var-eye-open: "\f152"; -$el-var-facebook: "\f153"; -$el-var-facetime-video: "\f154"; -$el-var-fast-backward: "\f155"; -$el-var-fast-forward: "\f156"; -$el-var-female: "\f157"; -$el-var-file: "\f15d"; -$el-var-file-alt: "\f158"; -$el-var-file-edit: "\f15a"; -$el-var-file-edit-alt: "\f159"; -$el-var-file-new: "\f15c"; -$el-var-file-new-alt: "\f15b"; -$el-var-film: "\f15e"; -$el-var-filter: "\f15f"; -$el-var-fire: "\f160"; -$el-var-flag: "\f162"; -$el-var-flag-alt: "\f161"; -$el-var-flickr: "\f163"; -$el-var-folder: "\f167"; -$el-var-folder-close: "\f164"; -$el-var-folder-open: "\f165"; -$el-var-folder-sign: "\f166"; -$el-var-font: "\f168"; -$el-var-fontsize: "\f169"; -$el-var-fork: "\f16a"; -$el-var-forward: "\f16c"; -$el-var-forward-alt: "\f16b"; -$el-var-foursquare: "\f16d"; -$el-var-friendfeed: "\f16f"; -$el-var-friendfeed-rect: "\f16e"; -$el-var-fullscreen: "\f170"; -$el-var-gallery: "\f171"; -$el-var-gbp: "\f172"; -$el-var-gift: "\f173"; -$el-var-github: "\f175"; -$el-var-github-text: "\f174"; -$el-var-glass: "\f176"; -$el-var-glasses: "\f177"; -$el-var-globe: "\f179"; -$el-var-globe-alt: "\f178"; -$el-var-googleplus: "\f17a"; -$el-var-graph: "\f17c"; -$el-var-graph-alt: "\f17b"; -$el-var-group: "\f17e"; -$el-var-group-alt: "\f17d"; -$el-var-guidedog: "\f17f"; -$el-var-hand-down: "\f180"; -$el-var-hand-left: "\f181"; -$el-var-hand-right: "\f182"; -$el-var-hand-up: "\f183"; -$el-var-hdd: "\f184"; -$el-var-headphones: "\f185"; -$el-var-hearing-impaired: "\f186"; -$el-var-heart: "\f189"; -$el-var-heart-alt: "\f187"; -$el-var-heart-empty: "\f188"; -$el-var-home: "\f18b"; -$el-var-home-alt: "\f18a"; -$el-var-hourglass: "\f18c"; -$el-var-idea: "\f18e"; -$el-var-idea-alt: "\f18d"; -$el-var-inbox: "\f191"; -$el-var-inbox-alt: "\f18f"; -$el-var-inbox-box: "\f190"; -$el-var-indent-left: "\f192"; -$el-var-indent-right: "\f193"; -$el-var-info-circle: "\f194"; -$el-var-instagram: "\f195"; -$el-var-iphone-home: "\f196"; -$el-var-italic: "\f197"; -$el-var-key: "\f198"; -$el-var-laptop: "\f19a"; -$el-var-laptop-alt: "\f199"; -$el-var-lastfm: "\f19b"; -$el-var-leaf: "\f19c"; -$el-var-lines: "\f19d"; -$el-var-link: "\f19e"; -$el-var-linkedin: "\f19f"; -$el-var-list: "\f1a1"; -$el-var-list-alt: "\f1a0"; -$el-var-livejournal: "\f1a2"; -$el-var-lock: "\f1a4"; -$el-var-lock-alt: "\f1a3"; -$el-var-magic: "\f1a5"; -$el-var-magnet: "\f1a6"; -$el-var-male: "\f1a7"; -$el-var-map-marker: "\f1a9"; -$el-var-map-marker-alt: "\f1a8"; -$el-var-mic: "\f1ab"; -$el-var-mic-alt: "\f1aa"; -$el-var-minus: "\f1ad"; -$el-var-minus-sign: "\f1ac"; -$el-var-move: "\f1ae"; -$el-var-music: "\f1af"; -$el-var-myspace: "\f1b0"; -$el-var-network: "\f1b1"; -$el-var-off: "\f1b2"; -$el-var-ok: "\f1b5"; -$el-var-ok-circle: "\f1b3"; -$el-var-ok-sign: "\f1b4"; -$el-var-opensource: "\f1b6"; -$el-var-paper-clip: "\f1b8"; -$el-var-paper-clip-alt: "\f1b7"; -$el-var-path: "\f1b9"; -$el-var-pause: "\f1bb"; -$el-var-pause-alt: "\f1ba"; -$el-var-pencil: "\f1bd"; -$el-var-pencil-alt: "\f1bc"; -$el-var-person: "\f1be"; -$el-var-phone: "\f1c0"; -$el-var-phone-alt: "\f1bf"; -$el-var-photo: "\f1c2"; -$el-var-photo-alt: "\f1c1"; -$el-var-picasa: "\f1c3"; -$el-var-picture: "\f1c4"; -$el-var-plane: "\f1c5"; -$el-var-play: "\f1c8"; -$el-var-play-alt: "\f1c6"; -$el-var-play-circle: "\f1c7"; -$el-var-plurk: "\f1ca"; -$el-var-plurk-alt: "\f1c9"; -$el-var-plus: "\f1cc"; -$el-var-plus-sign: "\f1cb"; -$el-var-podcast: "\f1cd"; -$el-var-print: "\f1ce"; -$el-var-puzzle: "\f1cf"; -$el-var-qrcode: "\f1d0"; -$el-var-question: "\f1d2"; -$el-var-question-sign: "\f1d1"; -$el-var-quote-alt: "\f1d3"; -$el-var-quote-right: "\f1d5"; -$el-var-quote-right-alt: "\f1d4"; -$el-var-quotes: "\f1d6"; -$el-var-random: "\f1d7"; -$el-var-record: "\f1d8"; -$el-var-reddit: "\f1d9"; -$el-var-redux: "\f1da"; -$el-var-refresh: "\f1db"; -$el-var-remove: "\f1de"; -$el-var-remove-circle: "\f1dc"; -$el-var-remove-sign: "\f1dd"; -$el-var-repeat: "\f1e0"; -$el-var-repeat-alt: "\f1df"; -$el-var-resize-full: "\f1e1"; -$el-var-resize-horizontal: "\f1e2"; -$el-var-resize-small: "\f1e3"; -$el-var-resize-vertical: "\f1e4"; -$el-var-return-key: "\f1e5"; -$el-var-retweet: "\f1e6"; -$el-var-reverse-alt: "\f1e7"; -$el-var-road: "\f1e8"; -$el-var-rss: "\f1e9"; -$el-var-scissors: "\f1ea"; -$el-var-screen: "\f1ec"; -$el-var-screen-alt: "\f1eb"; -$el-var-screenshot: "\f1ed"; -$el-var-search: "\f1ef"; -$el-var-search-alt: "\f1ee"; -$el-var-share: "\f1f1"; -$el-var-share-alt: "\f1f0"; -$el-var-shopping-cart: "\f1f3"; -$el-var-shopping-cart-sign: "\f1f2"; -$el-var-shortcode: "\f1f4"; -$el-var-signal: "\f1f5"; -$el-var-skype: "\f1f6"; -$el-var-slideshare: "\f1f7"; -$el-var-smiley: "\f1f9"; -$el-var-smiley-alt: "\f1f8"; -$el-var-soundcloud: "\f1fa"; -$el-var-speaker: "\f1fb"; -$el-var-spotify: "\f1fc"; -$el-var-stackoverflow: "\f1fd"; -$el-var-star: "\f200"; -$el-var-star-alt: "\f1fe"; -$el-var-star-empty: "\f1ff"; -$el-var-step-backward: "\f201"; -$el-var-step-forward: "\f202"; -$el-var-stop: "\f204"; -$el-var-stop-alt: "\f203"; -$el-var-stumbleupon: "\f205"; -$el-var-tag: "\f206"; -$el-var-tags: "\f207"; -$el-var-tasks: "\f208"; -$el-var-text-height: "\f209"; -$el-var-text-width: "\f20a"; -$el-var-th: "\f20d"; -$el-var-th-large: "\f20b"; -$el-var-th-list: "\f20c"; -$el-var-thumbs-down: "\f20e"; -$el-var-thumbs-up: "\f20f"; -$el-var-time: "\f211"; -$el-var-time-alt: "\f210"; -$el-var-tint: "\f212"; -$el-var-torso: "\f213"; -$el-var-trash: "\f215"; -$el-var-trash-alt: "\f214"; -$el-var-tumblr: "\f216"; -$el-var-twitter: "\f217"; -$el-var-universal-access: "\f218"; -$el-var-unlock: "\f21a"; -$el-var-unlock-alt: "\f219"; -$el-var-upload: "\f21b"; -$el-var-usd: "\f21c"; -$el-var-user: "\f21d"; -$el-var-viadeo: "\f21e"; -$el-var-video: "\f221"; -$el-var-video-alt: "\f21f"; -$el-var-video-chat: "\f220"; -$el-var-view-mode: "\f222"; -$el-var-vimeo: "\f223"; -$el-var-vkontakte: "\f224"; -$el-var-volume-down: "\f225"; -$el-var-volume-off: "\f226"; -$el-var-volume-up: "\f227"; -$el-var-w3c: "\f228"; -$el-var-warning-sign: "\f229"; -$el-var-website: "\f22b"; -$el-var-website-alt: "\f22a"; -$el-var-wheelchair: "\f22c"; -$el-var-wordpress: "\f22d"; -$el-var-wrench: "\f22f"; -$el-var-wrench-alt: "\f22e"; -$el-var-youtube: "\f230"; -$el-var-zoom-in: "\f231"; -$el-var-zoom-out: "\f232"; - diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/elusive-icons.css b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/elusive-icons.css deleted file mode 100755 index 7c203980..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/elusive-icons.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Elusive Icons 2.0.0 by @ReduxFramework - http://elusiveicons.com - @reduxframework - * License - http://elusiveicons.com/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'Elusive-Icons';src:url("fonts/elusiveicons-webfont.eot?v=2.0.0");src:url("fonts/elusiveicons-webfont.eot?#iefix&v=2.0.0") format("embedded-opentype"),url("fonts/elusiveicons-webfont.woff?v=2.0.0") format("woff"),url("fonts/elusiveicons-webfont.ttf?v=2.0.0") format("truetype"),url("fonts/elusiveicons-webfont.svg?v=2.0.0#elusiveiconsregular") format("svg");font-weight:normal;font-style:normal}.el{display:inline-block;font:normal normal normal 14px/1 "Elusive-Icons";font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.el-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.el-2x{font-size:2em}.el-3x{font-size:3em}.el-4x{font-size:4em}.el-5x{font-size:5em}.el-fw{width:1.28571em;text-align:center}.el-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.el-ul>li{position:relative}.el-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.el-li.el-lg{left:-1.85714em}.el-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.el.pull-left{margin-right:.3em}.el.pull-right{margin-left:.3em}.el-spin{-webkit-animation:el-spin 2s infinite linear;animation:el-spin 2s infinite linear}.el-pulse{-webkit-animation:el-spin 1s infinite steps(8);animation:el-spin 1s infinite steps(8)}@-webkit-keyframes el-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes el-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.el-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.el-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.el-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.el-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.el-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .el-rotate-90,:root .el-rotate-180,:root .el-rotate-270,:root .el-flip-horizontal,:root .el-flip-vertical{filter:none}.el-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.el-stack-1x,.el-stack-2x{position:absolute;left:0;width:100%;text-align:center}.el-stack-1x{line-height:inherit}.el-stack-2x{font-size:2em}.el-inverse{color:#fff}.el-icon-address-book-alt:before,.el-address-book-alt:before{content:""}.el-icon-address-book:before,.el-address-book:before{content:""}.el-icon-adjust-alt:before,.el-adjust-alt:before{content:""}.el-icon-adjust:before,.el-adjust:before{content:""}.el-icon-adult:before,.el-adult:before{content:""}.el-icon-align-center:before,.el-align-center:before{content:""}.el-icon-align-justify:before,.el-align-justify:before{content:""}.el-icon-align-left:before,.el-align-left:before{content:""}.el-icon-align-right:before,.el-align-right:before{content:""}.el-icon-arrow-down:before,.el-arrow-down:before{content:""}.el-icon-arrow-left:before,.el-arrow-left:before{content:""}.el-icon-arrow-right:before,.el-arrow-right:before{content:""}.el-icon-arrow-up:before,.el-arrow-up:before{content:""}.el-icon-asl:before,.el-asl:before{content:""}.el-icon-asterisk:before,.el-asterisk:before{content:""}.el-icon-backward:before,.el-backward:before{content:""}.el-icon-ban-circle:before,.el-ban-circle:before{content:""}.el-icon-barcode:before,.el-barcode:before{content:""}.el-icon-behance:before,.el-behance:before{content:""}.el-icon-bell:before,.el-bell:before{content:""}.el-icon-blind:before,.el-blind:before{content:""}.el-icon-blogger:before,.el-blogger:before{content:""}.el-icon-bold:before,.el-bold:before{content:""}.el-icon-book:before,.el-book:before{content:""}.el-icon-bookmark-empty:before,.el-bookmark-empty:before{content:""}.el-icon-bookmark:before,.el-bookmark:before{content:""}.el-icon-brackets:before,.el-brackets:before{content:""}.el-icon-braille:before,.el-braille:before{content:""}.el-icon-briefcase:before,.el-briefcase:before{content:""}.el-icon-broom:before,.el-broom:before{content:""}.el-icon-brush:before,.el-brush:before{content:""}.el-icon-bulb:before,.el-bulb:before{content:""}.el-icon-bullhorn:before,.el-bullhorn:before{content:""}.el-icon-calendar-sign:before,.el-calendar-sign:before{content:""}.el-icon-calendar:before,.el-calendar:before{content:""}.el-icon-camera:before,.el-camera:before{content:""}.el-icon-car:before,.el-car:before{content:""}.el-icon-caret-down:before,.el-caret-down:before{content:""}.el-icon-caret-left:before,.el-caret-left:before{content:""}.el-icon-caret-right:before,.el-caret-right:before{content:""}.el-icon-caret-up:before,.el-caret-up:before{content:""}.el-icon-cc:before,.el-cc:before{content:""}.el-icon-certificate:before,.el-certificate:before{content:""}.el-icon-check-empty:before,.el-check-empty:before{content:""}.el-icon-check:before,.el-check:before{content:""}.el-icon-chevron-down:before,.el-chevron-down:before{content:""}.el-icon-chevron-left:before,.el-chevron-left:before{content:""}.el-icon-chevron-right:before,.el-chevron-right:before{content:""}.el-icon-chevron-up:before,.el-chevron-up:before{content:""}.el-icon-child:before,.el-child:before{content:""}.el-icon-circle-arrow-down:before,.el-circle-arrow-down:before{content:""}.el-icon-circle-arrow-left:before,.el-circle-arrow-left:before{content:""}.el-icon-circle-arrow-right:before,.el-circle-arrow-right:before{content:""}.el-icon-circle-arrow-up:before,.el-circle-arrow-up:before{content:""}.el-icon-cloud-alt:before,.el-cloud-alt:before{content:""}.el-icon-cloud:before,.el-cloud:before{content:""}.el-icon-cog-alt:before,.el-cog-alt:before{content:""}.el-icon-cog:before,.el-cog:before{content:""}.el-icon-cogs:before,.el-cogs:before{content:""}.el-icon-comment-alt:before,.el-comment-alt:before{content:""}.el-icon-comment:before,.el-comment:before{content:""}.el-icon-compass-alt:before,.el-compass-alt:before{content:""}.el-icon-compass:before,.el-compass:before{content:""}.el-icon-credit-card:before,.el-credit-card:before{content:""}.el-icon-css:before,.el-css:before{content:""}.el-icon-dashboard:before,.el-dashboard:before{content:""}.el-icon-delicious:before,.el-delicious:before{content:""}.el-icon-deviantart:before,.el-deviantart:before{content:""}.el-icon-digg:before,.el-digg:before{content:""}.el-icon-download-alt:before,.el-download-alt:before{content:""}.el-icon-download:before,.el-download:before{content:""}.el-icon-dribbble:before,.el-dribbble:before{content:""}.el-icon-edit:before,.el-edit:before{content:""}.el-icon-eject:before,.el-eject:before{content:""}.el-icon-envelope-alt:before,.el-envelope-alt:before{content:""}.el-icon-envelope:before,.el-envelope:before{content:""}.el-icon-error-alt:before,.el-error-alt:before{content:""}.el-icon-error:before,.el-error:before{content:""}.el-icon-eur:before,.el-eur:before{content:""}.el-icon-exclamation-sign:before,.el-exclamation-sign:before{content:""}.el-icon-eye-close:before,.el-eye-close:before{content:""}.el-icon-eye-open:before,.el-eye-open:before{content:""}.el-icon-facebook:before,.el-facebook:before{content:""}.el-icon-facetime-video:before,.el-facetime-video:before{content:""}.el-icon-fast-backward:before,.el-fast-backward:before{content:""}.el-icon-fast-forward:before,.el-fast-forward:before{content:""}.el-icon-female:before,.el-female:before{content:""}.el-icon-file-alt:before,.el-file-alt:before{content:""}.el-icon-file-edit-alt:before,.el-file-edit-alt:before{content:""}.el-icon-file-edit:before,.el-file-edit:before{content:""}.el-icon-file-new-alt:before,.el-file-new-alt:before{content:""}.el-icon-file-new:before,.el-file-new:before{content:""}.el-icon-file:before,.el-file:before{content:""}.el-icon-film:before,.el-film:before{content:""}.el-icon-filter:before,.el-filter:before{content:""}.el-icon-fire:before,.el-fire:before{content:""}.el-icon-flag-alt:before,.el-flag-alt:before{content:""}.el-icon-flag:before,.el-flag:before{content:""}.el-icon-flickr:before,.el-flickr:before{content:""}.el-icon-folder-close:before,.el-folder-close:before{content:""}.el-icon-folder-open:before,.el-folder-open:before{content:""}.el-icon-folder-sign:before,.el-folder-sign:before{content:""}.el-icon-folder:before,.el-folder:before{content:""}.el-icon-font:before,.el-font:before{content:""}.el-icon-fontsize:before,.el-fontsize:before{content:""}.el-icon-fork:before,.el-fork:before{content:""}.el-icon-forward-alt:before,.el-forward-alt:before{content:""}.el-icon-forward:before,.el-forward:before{content:""}.el-icon-foursquare:before,.el-foursquare:before{content:""}.el-icon-friendfeed-rect:before,.el-friendfeed-rect:before{content:""}.el-icon-friendfeed:before,.el-friendfeed:before{content:""}.el-icon-fullscreen:before,.el-fullscreen:before{content:""}.el-icon-gallery:before,.el-gallery:before{content:""}.el-icon-gbp:before,.el-gbp:before{content:""}.el-icon-gift:before,.el-gift:before{content:""}.el-icon-github-text:before,.el-github-text:before{content:""}.el-icon-github:before,.el-github:before{content:""}.el-icon-glass:before,.el-glass:before{content:""}.el-icon-glasses:before,.el-glasses:before{content:""}.el-icon-globe-alt:before,.el-globe-alt:before{content:""}.el-icon-globe:before,.el-globe:before{content:""}.el-icon-googleplus:before,.el-googleplus:before{content:""}.el-icon-graph-alt:before,.el-graph-alt:before{content:""}.el-icon-graph:before,.el-graph:before{content:""}.el-icon-group-alt:before,.el-group-alt:before{content:""}.el-icon-group:before,.el-group:before{content:""}.el-icon-guidedog:before,.el-guidedog:before{content:""}.el-icon-hand-down:before,.el-hand-down:before{content:""}.el-icon-hand-left:before,.el-hand-left:before{content:""}.el-icon-hand-right:before,.el-hand-right:before{content:""}.el-icon-hand-up:before,.el-hand-up:before{content:""}.el-icon-hdd:before,.el-hdd:before{content:""}.el-icon-headphones:before,.el-headphones:before{content:""}.el-icon-hearing-impaired:before,.el-hearing-impaired:before{content:""}.el-icon-heart-alt:before,.el-heart-alt:before{content:""}.el-icon-heart-empty:before,.el-heart-empty:before{content:""}.el-icon-heart:before,.el-heart:before{content:""}.el-icon-home-alt:before,.el-home-alt:before{content:""}.el-icon-home:before,.el-home:before{content:""}.el-icon-hourglass:before,.el-hourglass:before{content:""}.el-icon-idea-alt:before,.el-idea-alt:before{content:""}.el-icon-idea:before,.el-idea:before{content:""}.el-icon-inbox-alt:before,.el-inbox-alt:before{content:""}.el-icon-inbox-box:before,.el-inbox-box:before{content:""}.el-icon-inbox:before,.el-inbox:before{content:""}.el-icon-indent-left:before,.el-indent-left:before{content:""}.el-icon-indent-right:before,.el-indent-right:before{content:""}.el-icon-info-circle:before,.el-info-circle:before{content:""}.el-icon-instagram:before,.el-instagram:before{content:""}.el-icon-iphone-home:before,.el-iphone-home:before{content:""}.el-icon-italic:before,.el-italic:before{content:""}.el-icon-key:before,.el-key:before{content:""}.el-icon-laptop-alt:before,.el-laptop-alt:before{content:""}.el-icon-laptop:before,.el-laptop:before{content:""}.el-icon-lastfm:before,.el-lastfm:before{content:""}.el-icon-leaf:before,.el-leaf:before{content:""}.el-icon-lines:before,.el-lines:before{content:""}.el-icon-link:before,.el-link:before{content:""}.el-icon-linkedin:before,.el-linkedin:before{content:""}.el-icon-list-alt:before,.el-list-alt:before{content:""}.el-icon-list:before,.el-list:before{content:""}.el-icon-livejournal:before,.el-livejournal:before{content:""}.el-icon-lock-alt:before,.el-lock-alt:before{content:""}.el-icon-lock:before,.el-lock:before{content:""}.el-icon-magic:before,.el-magic:before{content:""}.el-icon-magnet:before,.el-magnet:before{content:""}.el-icon-male:before,.el-male:before{content:""}.el-icon-map-marker-alt:before,.el-map-marker-alt:before{content:""}.el-icon-map-marker:before,.el-map-marker:before{content:""}.el-icon-mic-alt:before,.el-mic-alt:before{content:""}.el-icon-mic:before,.el-mic:before{content:""}.el-icon-minus-sign:before,.el-minus-sign:before{content:""}.el-icon-minus:before,.el-minus:before{content:""}.el-icon-move:before,.el-move:before{content:""}.el-icon-music:before,.el-music:before{content:""}.el-icon-myspace:before,.el-myspace:before{content:""}.el-icon-network:before,.el-network:before{content:""}.el-icon-off:before,.el-off:before{content:""}.el-icon-ok-circle:before,.el-ok-circle:before{content:""}.el-icon-ok-sign:before,.el-ok-sign:before{content:""}.el-icon-ok:before,.el-ok:before{content:""}.el-icon-opensource:before,.el-opensource:before{content:""}.el-icon-paper-clip-alt:before,.el-paper-clip-alt:before{content:""}.el-icon-paper-clip:before,.el-paper-clip:before{content:""}.el-icon-path:before,.el-path:before{content:""}.el-icon-pause-alt:before,.el-pause-alt:before{content:""}.el-icon-pause:before,.el-pause:before{content:""}.el-icon-pencil-alt:before,.el-pencil-alt:before{content:""}.el-icon-pencil:before,.el-pencil:before{content:""}.el-icon-person:before,.el-person:before{content:""}.el-icon-phone-alt:before,.el-phone-alt:before{content:""}.el-icon-phone:before,.el-phone:before{content:""}.el-icon-photo-alt:before,.el-photo-alt:before{content:""}.el-icon-photo:before,.el-photo:before{content:""}.el-icon-picasa:before,.el-picasa:before{content:""}.el-icon-picture:before,.el-picture:before{content:""}.el-icon-plane:before,.el-plane:before{content:""}.el-icon-play-alt:before,.el-play-alt:before{content:""}.el-icon-play-circle:before,.el-play-circle:before{content:""}.el-icon-play:before,.el-play:before{content:""}.el-icon-plurk-alt:before,.el-plurk-alt:before{content:""}.el-icon-plurk:before,.el-plurk:before{content:""}.el-icon-plus-sign:before,.el-plus-sign:before{content:""}.el-icon-plus:before,.el-plus:before{content:""}.el-icon-podcast:before,.el-podcast:before{content:""}.el-icon-print:before,.el-print:before{content:""}.el-icon-puzzle:before,.el-puzzle:before{content:""}.el-icon-qrcode:before,.el-qrcode:before{content:""}.el-icon-question-sign:before,.el-question-sign:before{content:""}.el-icon-question:before,.el-question:before{content:""}.el-icon-quote-alt:before,.el-quote-alt:before{content:""}.el-icon-quote-right-alt:before,.el-quote-right-alt:before{content:""}.el-icon-quote-right:before,.el-quote-right:before{content:""}.el-icon-quotes:before,.el-quotes:before{content:""}.el-icon-random:before,.el-random:before{content:""}.el-icon-record:before,.el-record:before{content:""}.el-icon-reddit:before,.el-reddit:before{content:""}.el-icon-redux:before,.el-redux:before{content:""}.el-icon-refresh:before,.el-refresh:before{content:""}.el-icon-remove-circle:before,.el-remove-circle:before{content:""}.el-icon-remove-sign:before,.el-remove-sign:before{content:""}.el-icon-remove:before,.el-remove:before{content:""}.el-icon-repeat-alt:before,.el-repeat-alt:before{content:""}.el-icon-repeat:before,.el-repeat:before{content:""}.el-icon-resize-full:before,.el-resize-full:before{content:""}.el-icon-resize-horizontal:before,.el-resize-horizontal:before{content:""}.el-icon-resize-small:before,.el-resize-small:before{content:""}.el-icon-resize-vertical:before,.el-resize-vertical:before{content:""}.el-icon-return-key:before,.el-return-key:before{content:""}.el-icon-retweet:before,.el-retweet:before{content:""}.el-icon-reverse-alt:before,.el-reverse-alt:before{content:""}.el-icon-road:before,.el-road:before{content:""}.el-icon-rss:before,.el-rss:before{content:""}.el-icon-scissors:before,.el-scissors:before{content:""}.el-icon-screen-alt:before,.el-screen-alt:before{content:""}.el-icon-screen:before,.el-screen:before{content:""}.el-icon-screenshot:before,.el-screenshot:before{content:""}.el-icon-search-alt:before,.el-search-alt:before{content:""}.el-icon-search:before,.el-search:before{content:""}.el-icon-share-alt:before,.el-share-alt:before{content:""}.el-icon-share:before,.el-share:before{content:""}.el-icon-shopping-cart-sign:before,.el-shopping-cart-sign:before{content:""}.el-icon-shopping-cart:before,.el-shopping-cart:before{content:""}.el-icon-shortcode:before,.el-shortcode:before{content:""}.el-icon-signal:before,.el-signal:before{content:""}.el-icon-skype:before,.el-skype:before{content:""}.el-icon-slideshare:before,.el-slideshare:before{content:""}.el-icon-smiley-alt:before,.el-smiley-alt:before{content:""}.el-icon-smiley:before,.el-smiley:before{content:""}.el-icon-soundcloud:before,.el-soundcloud:before{content:""}.el-icon-speaker:before,.el-speaker:before{content:""}.el-icon-spotify:before,.el-spotify:before{content:""}.el-icon-stackoverflow:before,.el-stackoverflow:before{content:""}.el-icon-star-alt:before,.el-star-alt:before{content:""}.el-icon-star-empty:before,.el-star-empty:before{content:""}.el-icon-star:before,.el-star:before{content:""}.el-icon-step-backward:before,.el-step-backward:before{content:""}.el-icon-step-forward:before,.el-step-forward:before{content:""}.el-icon-stop-alt:before,.el-stop-alt:before{content:""}.el-icon-stop:before,.el-stop:before{content:""}.el-icon-stumbleupon:before,.el-stumbleupon:before{content:""}.el-icon-tag:before,.el-tag:before{content:""}.el-icon-tags:before,.el-tags:before{content:""}.el-icon-tasks:before,.el-tasks:before{content:""}.el-icon-text-height:before,.el-text-height:before{content:""}.el-icon-text-width:before,.el-text-width:before{content:""}.el-icon-th-large:before,.el-th-large:before{content:""}.el-icon-th-list:before,.el-th-list:before{content:""}.el-icon-th:before,.el-th:before{content:""}.el-icon-thumbs-down:before,.el-thumbs-down:before{content:""}.el-icon-thumbs-up:before,.el-thumbs-up:before{content:""}.el-icon-time-alt:before,.el-time-alt:before{content:""}.el-icon-time:before,.el-time:before{content:""}.el-icon-tint:before,.el-tint:before{content:""}.el-icon-torso:before,.el-torso:before{content:""}.el-icon-trash-alt:before,.el-trash-alt:before{content:""}.el-icon-trash:before,.el-trash:before{content:""}.el-icon-tumblr:before,.el-tumblr:before{content:""}.el-icon-twitter:before,.el-twitter:before{content:""}.el-icon-universal-access:before,.el-universal-access:before{content:""}.el-icon-unlock-alt:before,.el-unlock-alt:before{content:""}.el-icon-unlock:before,.el-unlock:before{content:""}.el-icon-upload:before,.el-upload:before{content:""}.el-icon-usd:before,.el-usd:before{content:""}.el-icon-user:before,.el-user:before{content:""}.el-icon-viadeo:before,.el-viadeo:before{content:""}.el-icon-video-alt:before,.el-video-alt:before{content:""}.el-icon-video-chat:before,.el-video-chat:before{content:""}.el-icon-video:before,.el-video:before{content:""}.el-icon-view-mode:before,.el-view-mode:before{content:""}.el-icon-vimeo:before,.el-vimeo:before{content:""}.el-icon-vkontakte:before,.el-vkontakte:before{content:""}.el-icon-volume-down:before,.el-volume-down:before{content:""}.el-icon-volume-off:before,.el-volume-off:before{content:""}.el-icon-volume-up:before,.el-volume-up:before{content:""}.el-icon-w3c:before,.el-w3c:before{content:""}.el-icon-warning-sign:before,.el-warning-sign:before{content:""}.el-icon-website-alt:before,.el-website-alt:before{content:""}.el-icon-website:before,.el-website:before{content:""}.el-icon-wheelchair:before,.el-wheelchair:before{content:""}.el-icon-wordpress:before,.el-wordpress:before{content:""}.el-icon-wrench-alt:before,.el-wrench-alt:before{content:""}.el-icon-wrench:before,.el-wrench:before{content:""}.el-icon-youtube:before,.el-youtube:before{content:""}.el-icon-zoom-in:before,.el-zoom-in:before{content:""}.el-icon-zoom-out:before,.el-zoom-out:before{content:""} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/elusive-icons.css.map b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/elusive-icons.css.map deleted file mode 100755 index c576afb4..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/elusive-icons.css.map +++ /dev/null @@ -1,7 +0,0 @@ -{ -"version": 3, -"mappings": ";;;;;;;AAGA,UAUC;EATC,WAAW,EAAE,eAAe;EAC5B,GAAG,EAAE,6CAAiE;EACtE,GAAG,EAAE,kSAAoG;EAKzG,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;ACTpB,GAAmB;EACjB,OAAO,EAAE,YAAY;EACrB,IAAI,EAAE,2CAA4D;EAClE,SAAS,EAAE,OAAO;EAClB,cAAc,EAAE,IAAI;EACpB,sBAAsB,EAAE,WAAW;EACnC,uBAAuB,EAAE,SAAS;EAClC,SAAS,EAAE,eAAe;;;ACN5B,MAAsB;EACpB,SAAS,EAAE,SAAS;EACpB,WAAW,EAAE,MAAS;EACtB,cAAc,EAAE,IAAI;;AAEtB,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;ACVtC,MAAsB;EACpB,KAAK,EAAE,SAAW;EAClB,UAAU,EAAE,MAAM;;ACDpB,MAAsB;EACpB,YAAY,EAAE,CAAC;EACf,WAAW,ECIU,SAAS;EDH9B,eAAe,EAAE,IAAI;EACrB,WAAK;IAAE,QAAQ,EAAE,QAAQ;;AAE3B,MAAsB;EACpB,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,UAAa;EACnB,KAAK,ECHgB,SAAS;EDI9B,GAAG,EAAE,SAAU;EACf,UAAU,EAAE,MAAM;EAClB,YAAuB;IACrB,IAAI,EAAE,UAA0B;;AEbpC,UAA0B;EACxB,OAAO,EAAE,gBAAgB;EACzB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,IAAI;;AAGrB,WAAY;EAAE,KAAK,EAAE,KAAK;;AAC1B,UAAW;EAAE,KAAK,EAAE,IAAI;;AAGtB,aAAY;EAAE,YAAY,EAAE,IAAI;AAChC,cAAa;EAAE,WAAW,EAAE,IAAI;;ACXlC,QAAwB;EACtB,iBAAiB,EAAE,0BAA0B;EACrC,SAAS,EAAE,0BAA0B;;AAG/C,SAAyB;EACvB,iBAAiB,EAAE,4BAA4B;EACvC,SAAS,EAAE,4BAA4B;;AAGjD,0BASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;AAIrC,kBASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;AC5BrC,aAA8B;ECY5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,aAAgB;EAC/B,aAAa,EAAE,aAAgB;EAC3B,SAAS,EAAE,aAAgB;;ADdrC,cAA8B;ECW5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;ADbrC,cAA8B;ECU5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;ADXrC,mBAAmC;ECejC,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;ADjBzC,iBAAmC;ECcjC,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;ADZzC;;;;uBAIuC;EACrC,MAAM,EAAE,IAAI;;AEfd,SAAyB;EACvB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,GAAG;EACX,WAAW,EAAE,GAAG;EAChB,cAAc,EAAE,MAAM;;AAExB,0BAAyD;EACvD,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;;AAEpB,YAA4B;EAAE,WAAW,EAAE,OAAO;;AAClD,YAA4B;EAAE,SAAS,EAAE,GAAG;;AAC5C,WAA2B;EAAE,KAAK,ELXZ,IAAI;;;;AML1B;2BAC2C;EAAE,OAAO,ENQ1B,GAAO;;AMPjC;uBACuC;EAAE,OAAO,ENK1B,GAAO;;AMJ7B;qBACqC;EAAE,OAAO,ENM1B,GAAO;;AML3B;iBACiC;EAAE,OAAO,ENG1B,GAAO;;AMFvB;gBACgC;EAAE,OAAO,ENG1B,GAAO;;AMFtB;uBACuC;EAAE,OAAO,ENE1B,GAAO;;AMD7B;wBACwC;EAAE,OAAO,ENC1B,GAAO;;AMA9B;qBACqC;EAAE,OAAO,ENA1B,GAAO;;AMC3B;sBACsC;EAAE,OAAO,END1B,GAAO;;AME5B;qBACqC;EAAE,OAAO,ENF1B,GAAO;;AMG3B;qBACqC;EAAE,OAAO,ENH1B,GAAO;;AMI3B;sBACsC;EAAE,OAAO,ENJ1B,GAAO;;AMK5B;mBACmC;EAAE,OAAO,ENL1B,GAAO;;AMMzB;cAC8B;EAAE,OAAO,ENN1B,GAAO;;AMOpB;mBACmC;EAAE,OAAO,ENP1B,GAAO;;AMQzB;mBACmC;EAAE,OAAO,ENR1B,GAAO;;AMSzB;qBACqC;EAAE,OAAO,ENT1B,GAAO;;AMU3B;kBACkC;EAAE,OAAO,ENV1B,GAAO;;AMWxB;kBACkC;EAAE,OAAO,ENX1B,GAAO;;AMYxB;eAC+B;EAAE,OAAO,ENZ1B,GAAO;;AMarB;gBACgC;EAAE,OAAO,ENb1B,GAAO;;AMctB;kBACkC;EAAE,OAAO,ENd1B,GAAO;;AMexB;eAC+B;EAAE,OAAO,ENf1B,GAAO;;AMgBrB;eAC+B;EAAE,OAAO,ENhB1B,GAAO;;AMiBrB;yBACyC;EAAE,OAAO,ENhB1B,GAAO;;AMiB/B;mBACmC;EAAE,OAAO,ENnB1B,GAAO;;AMoBzB;mBACmC;EAAE,OAAO,ENnB1B,GAAO;;AMoBzB;kBACkC;EAAE,OAAO,ENpB1B,GAAO;;AMqBxB;oBACoC;EAAE,OAAO,ENrB1B,GAAO;;AMsB1B;gBACgC;EAAE,OAAO,ENtB1B,GAAO;;AMuBtB;gBACgC;EAAE,OAAO,ENvB1B,GAAO;;AMwBtB;eAC+B;EAAE,OAAO,ENxB1B,GAAO;;AMyBrB;mBACmC;EAAE,OAAO,ENzB1B,GAAO;;AM0BzB;wBACwC;EAAE,OAAO,ENzB1B,GAAO;;AM0B9B;mBACmC;EAAE,OAAO,EN5B1B,GAAO;;AM6BzB;iBACiC;EAAE,OAAO,EN5B1B,GAAO;;AM6BvB;cAC8B;EAAE,OAAO,EN7B1B,GAAO;;AM8BpB;qBACqC;EAAE,OAAO,EN9B1B,GAAO;;AM+B3B;qBACqC;EAAE,OAAO,EN/B1B,GAAO;;AMgC3B;sBACsC;EAAE,OAAO,ENhC1B,GAAO;;AMiC5B;mBACmC;EAAE,OAAO,ENjC1B,GAAO;;AMkCzB;aAC6B;EAAE,OAAO,ENlC1B,GAAO;;AMmCnB;sBACsC;EAAE,OAAO,ENnC1B,GAAO;;AMoC5B;sBACsC;EAAE,OAAO,ENnC1B,GAAO;;AMoC5B;gBACgC;EAAE,OAAO,ENtC1B,GAAO;;AMuCtB;uBACuC;EAAE,OAAO,ENtC1B,GAAO;;AMuC7B;uBACuC;EAAE,OAAO,ENvC1B,GAAO;;AMwC7B;wBACwC;EAAE,OAAO,ENxC1B,GAAO;;AMyC9B;qBACqC;EAAE,OAAO,ENzC1B,GAAO;;AM0C3B;gBACgC;EAAE,OAAO,EN1C1B,GAAO;;AM2CtB;4BAC4C;EAAE,OAAO,EN3C1B,GAAO;;AM4ClC;4BAC4C;EAAE,OAAO,EN5C1B,GAAO;;AM6ClC;6BAC6C;EAAE,OAAO,EN7C1B,GAAO;;AM8CnC;0BAC0C;EAAE,OAAO,EN9C1B,GAAO;;AM+ChC;oBACoC;EAAE,OAAO,EN9C1B,GAAO;;AM+C1B;gBACgC;EAAE,OAAO,ENjD1B,GAAO;;AMkDtB;kBACkC;EAAE,OAAO,ENhD1B,GAAO;;AMiDxB;cAC8B;EAAE,OAAO,ENnD1B,GAAO;;AMoDpB;eAC+B;EAAE,OAAO,ENnD1B,GAAO;;AMoDrB;sBACsC;EAAE,OAAO,ENnD1B,GAAO;;AMoD5B;kBACkC;EAAE,OAAO,ENtD1B,GAAO;;AMuDxB;sBACsC;EAAE,OAAO,ENrD1B,GAAO;;AMsD5B;kBACkC;EAAE,OAAO,ENxD1B,GAAO;;AMyDxB;sBACsC;EAAE,OAAO,ENxD1B,GAAO;;AMyD5B;cAC8B;EAAE,OAAO,ENzD1B,GAAO;;AM0DpB;oBACoC;EAAE,OAAO,EN1D1B,GAAO;;AM2D1B;oBACoC;EAAE,OAAO,EN3D1B,GAAO;;AM4D1B;qBACqC;EAAE,OAAO,EN5D1B,GAAO;;AM6D3B;eAC+B;EAAE,OAAO,EN7D1B,GAAO;;AM8DrB;uBACuC;EAAE,OAAO,EN7D1B,GAAO;;AM8D7B;mBACmC;EAAE,OAAO,ENhE1B,GAAO;;AMiEzB;mBACmC;EAAE,OAAO,ENhE1B,GAAO;;AMiEzB;eAC+B;EAAE,OAAO,ENjE1B,GAAO;;AMkErB;gBACgC;EAAE,OAAO,ENlE1B,GAAO;;AMmEtB;uBACuC;EAAE,OAAO,ENlE1B,GAAO;;AMmE7B;mBACmC;EAAE,OAAO,ENrE1B,GAAO;;AMsEzB;oBACoC;EAAE,OAAO,ENpE1B,GAAO;;AMqE1B;gBACgC;EAAE,OAAO,ENvE1B,GAAO;;AMwEtB;cAC8B;EAAE,OAAO,ENvE1B,GAAO;;AMwEpB;2BAC2C;EAAE,OAAO,ENxE1B,GAAO;;AMyEjC;oBACoC;EAAE,OAAO,ENzE1B,GAAO;;AM0E1B;mBACmC;EAAE,OAAO,EN1E1B,GAAO;;AM2EzB;mBACmC;EAAE,OAAO,EN3E1B,GAAO;;AM4EzB;yBACyC;EAAE,OAAO,EN5E1B,GAAO;;AM6E/B;wBACwC;EAAE,OAAO,EN7E1B,GAAO;;AM8E9B;uBACuC;EAAE,OAAO,EN9E1B,GAAO;;AM+E7B;iBACiC;EAAE,OAAO,EN/E1B,GAAO;;AMgFvB;mBACmC;EAAE,OAAO,EN/E1B,GAAO;;AMgFzB;wBACwC;EAAE,OAAO,EN/E1B,GAAO;;AMgF9B;oBACoC;EAAE,OAAO,ENlF1B,GAAO;;AMmF1B;uBACuC;EAAE,OAAO,ENjF1B,GAAO;;AMkF7B;mBACmC;EAAE,OAAO,ENpF1B,GAAO;;AMqFzB;eAC+B;EAAE,OAAO,EN1F1B,GAAO;;AM2FrB;eAC+B;EAAE,OAAO,ENtF1B,GAAO;;AMuFrB;iBACiC;EAAE,OAAO,ENvF1B,GAAO;;AMwFvB;eAC+B;EAAE,OAAO,ENxF1B,GAAO;;AMyFrB;mBACmC;EAAE,OAAO,ENxF1B,GAAO;;AMyFzB;eAC+B;EAAE,OAAO,EN3F1B,GAAO;;AM4FrB;iBACiC;EAAE,OAAO,EN3F1B,GAAO;;AM4FvB;uBACuC;EAAE,OAAO,EN3F1B,GAAO;;AM4F7B;sBACsC;EAAE,OAAO,EN5F1B,GAAO;;AM6F5B;sBACsC;EAAE,OAAO,EN7F1B,GAAO;;AM8F5B;iBACiC;EAAE,OAAO,ENlG1B,GAAO;;AMmGvB;eAC+B;EAAE,OAAO,ENhG1B,GAAO;;AMiGrB;mBACmC;EAAE,OAAO,ENjG1B,GAAO;;AMkGzB;eAC+B;EAAE,OAAO,ENlG1B,GAAO;;AMmGrB;sBACsC;EAAE,OAAO,ENlG1B,GAAO;;AMmG5B;kBACkC;EAAE,OAAO,ENrG1B,GAAO;;AMsGxB;qBACqC;EAAE,OAAO,ENrG1B,GAAO;;AMsG3B;0BAC0C;EAAE,OAAO,ENrG1B,GAAO;;AMsGhC;qBACqC;EAAE,OAAO,ENxG1B,GAAO;;AMyG3B;qBACqC;EAAE,OAAO,ENxG1B,GAAO;;AMyG3B;kBACkC;EAAE,OAAO,ENzG1B,GAAO;;AM0GxB;cAC8B;EAAE,OAAO,EN1G1B,GAAO;;AM2GpB;eAC+B;EAAE,OAAO,EN3G1B,GAAO;;AM4GrB;sBACsC;EAAE,OAAO,EN3G1B,GAAO;;AM4G5B;iBACiC;EAAE,OAAO,EN9G1B,GAAO;;AM+GvB;gBACgC;EAAE,OAAO,EN9G1B,GAAO;;AM+GtB;kBACkC;EAAE,OAAO,EN/G1B,GAAO;;AMgHxB;oBACoC;EAAE,OAAO,EN/G1B,GAAO;;AMgH1B;gBACgC;EAAE,OAAO,ENlH1B,GAAO;;AMmHtB;qBACqC;EAAE,OAAO,ENlH1B,GAAO;;AMmH3B;oBACoC;EAAE,OAAO,ENlH1B,GAAO;;AMmH1B;gBACgC;EAAE,OAAO,ENrH1B,GAAO;;AMsHtB;oBACoC;EAAE,OAAO,ENpH1B,GAAO;;AMqH1B;gBACgC;EAAE,OAAO,ENvH1B,GAAO;;AMwHtB;mBACmC;EAAE,OAAO,ENvH1B,GAAO;;AMwHzB;oBACoC;EAAE,OAAO,ENxH1B,GAAO;;AMyH1B;oBACoC;EAAE,OAAO,ENzH1B,GAAO;;AM0H1B;qBACqC;EAAE,OAAO,EN1H1B,GAAO;;AM2H3B;kBACkC;EAAE,OAAO,EN3H1B,GAAO;;AM4HxB;cAC8B;EAAE,OAAO,EN5H1B,GAAO;;AM6HpB;qBACqC;EAAE,OAAO,EN7H1B,GAAO;;AM8H3B;2BAC2C;EAAE,OAAO,EN9H1B,GAAO;;AM+HjC;oBACoC;EAAE,OAAO,EN9H1B,GAAO;;AM+H1B;sBACsC;EAAE,OAAO,EN/H1B,GAAO;;AMgI5B;gBACgC;EAAE,OAAO,ENnI1B,GAAO;;AMoItB;mBACmC;EAAE,OAAO,ENjI1B,GAAO;;AMkIzB;eAC+B;EAAE,OAAO,ENpI1B,GAAO;;AMqIrB;oBACoC;EAAE,OAAO,ENpI1B,GAAO;;AMqI1B;mBACmC;EAAE,OAAO,ENpI1B,GAAO;;AMqIzB;eAC+B;EAAE,OAAO,ENvI1B,GAAO;;AMwIrB;oBACoC;EAAE,OAAO,ENtI1B,GAAO;;AMuI1B;oBACoC;EAAE,OAAO,ENvI1B,GAAO;;AMwI1B;gBACgC;EAAE,OAAO,EN3I1B,GAAO;;AM4ItB;sBACsC;EAAE,OAAO,EN1I1B,GAAO;;AM2I5B;uBACuC;EAAE,OAAO,EN3I1B,GAAO;;AM4I7B;sBACsC;EAAE,OAAO,EN5I1B,GAAO;;AM6I5B;oBACoC;EAAE,OAAO,EN7I1B,GAAO;;AM8I1B;sBACsC;EAAE,OAAO,EN9I1B,GAAO;;AM+I5B;iBACiC;EAAE,OAAO,EN/I1B,GAAO;;AMgJvB;cAC8B;EAAE,OAAO,ENhJ1B,GAAO;;AMiJpB;qBACqC;EAAE,OAAO,ENhJ1B,GAAO;;AMiJ3B;iBACiC;EAAE,OAAO,ENnJ1B,GAAO;;AMoJvB;iBACiC;EAAE,OAAO,ENnJ1B,GAAO;;AMoJvB;eAC+B;EAAE,OAAO,ENpJ1B,GAAO;;AMqJrB;gBACgC;EAAE,OAAO,ENrJ1B,GAAO;;AMsJtB;eAC+B;EAAE,OAAO,ENtJ1B,GAAO;;AMuJrB;mBACmC;EAAE,OAAO,ENvJ1B,GAAO;;AMwJzB;mBACmC;EAAE,OAAO,ENvJ1B,GAAO;;AMwJzB;eAC+B;EAAE,OAAO,EN1J1B,GAAO;;AM2JrB;sBACsC;EAAE,OAAO,EN1J1B,GAAO;;AM2J5B;mBACmC;EAAE,OAAO,EN1J1B,GAAO;;AM2JzB;eAC+B;EAAE,OAAO,EN7J1B,GAAO;;AM8JrB;gBACgC;EAAE,OAAO,EN7J1B,GAAO;;AM8JtB;iBACiC;EAAE,OAAO,EN9J1B,GAAO;;AM+JvB;eAC+B;EAAE,OAAO,EN/J1B,GAAO;;AMgKrB;yBACyC;EAAE,OAAO,EN/J1B,GAAO;;AMgK/B;qBACqC;EAAE,OAAO,ENlK1B,GAAO;;AMmK3B;kBACkC;EAAE,OAAO,ENjK1B,GAAO;;AMkKxB;cAC8B;EAAE,OAAO,ENpK1B,GAAO;;AMqKpB;qBACqC;EAAE,OAAO,ENnK1B,GAAO;;AMoK3B;gBACgC;EAAE,OAAO,ENtK1B,GAAO;;AMuKtB;eAC+B;EAAE,OAAO,ENtK1B,GAAO;;AMuKrB;gBACgC;EAAE,OAAO,ENvK1B,GAAO;;AMwKtB;kBACkC;EAAE,OAAO,ENxK1B,GAAO;;AMyKxB;kBACkC;EAAE,OAAO,ENzK1B,GAAO;;AM0KxB;cAC8B;EAAE,OAAO,EN1K1B,GAAO;;AM2KpB;oBACoC;EAAE,OAAO,EN1K1B,GAAO;;AM2K1B;kBACkC;EAAE,OAAO,EN3K1B,GAAO;;AM4KxB;aAC6B;EAAE,OAAO,EN/K1B,GAAO;;AMgLnB;qBACqC;EAAE,OAAO,EN9K1B,GAAO;;AM+K3B;yBACyC;EAAE,OAAO,EN9K1B,GAAO;;AM+K/B;qBACqC;EAAE,OAAO,ENjL1B,GAAO;;AMkL3B;eAC+B;EAAE,OAAO,ENjL1B,GAAO;;AMkLrB;oBACoC;EAAE,OAAO,ENjL1B,GAAO;;AMkL1B;gBACgC;EAAE,OAAO,ENpL1B,GAAO;;AMqLtB;qBACqC;EAAE,OAAO,ENnL1B,GAAO;;AMoL3B;iBACiC;EAAE,OAAO,ENtL1B,GAAO;;AMuLvB;iBACiC;EAAE,OAAO,ENtL1B,GAAO;;AMuLvB;oBACoC;EAAE,OAAO,ENtL1B,GAAO;;AMuL1B;gBACgC;EAAE,OAAO,ENzL1B,GAAO;;AM0LtB;oBACoC;EAAE,OAAO,ENxL1B,GAAO;;AMyL1B;gBACgC;EAAE,OAAO,EN3L1B,GAAO;;AM4LtB;iBACiC;EAAE,OAAO,EN3L1B,GAAO;;AM4LvB;kBACkC;EAAE,OAAO,EN5L1B,GAAO;;AM6LxB;gBACgC;EAAE,OAAO,EN7L1B,GAAO;;AM8LtB;mBACmC;EAAE,OAAO,EN7L1B,GAAO;;AM8LzB;sBACsC;EAAE,OAAO,EN9L1B,GAAO;;AM+L5B;eAC+B;EAAE,OAAO,ENlM1B,GAAO;;AMmMrB;oBACoC;EAAE,OAAO,ENhM1B,GAAO;;AMiM1B;gBACgC;EAAE,OAAO,ENnM1B,GAAO;;AMoMtB;oBACoC;EAAE,OAAO,ENlM1B,GAAO;;AMmM1B;eAC+B;EAAE,OAAO,ENrM1B,GAAO;;AMsMrB;kBACkC;EAAE,OAAO,ENrM1B,GAAO;;AMsMxB;gBACgC;EAAE,OAAO,ENtM1B,GAAO;;AMuMtB;iBACiC;EAAE,OAAO,ENvM1B,GAAO;;AMwMvB;iBACiC;EAAE,OAAO,ENxM1B,GAAO;;AMyMvB;wBACwC;EAAE,OAAO,ENxM1B,GAAO;;AMyM9B;mBACmC;EAAE,OAAO,EN3M1B,GAAO;;AM4MzB;oBACoC;EAAE,OAAO,EN3M1B,GAAO;;AM4M1B;0BAC0C;EAAE,OAAO,EN3M1B,GAAO;;AM4MhC;sBACsC;EAAE,OAAO,EN9M1B,GAAO;;AM+M5B;iBACiC;EAAE,OAAO,EN9M1B,GAAO;;AM+MvB;iBACiC;EAAE,OAAO,EN/M1B,GAAO;;AMgNvB;iBACiC;EAAE,OAAO,ENhN1B,GAAO;;AMiNvB;iBACiC;EAAE,OAAO,ENjN1B,GAAO;;AMkNvB;gBACgC;EAAE,OAAO,ENlN1B,GAAO;;AMmNtB;kBACkC;EAAE,OAAO,ENnN1B,GAAO;;AMoNxB;wBACwC;EAAE,OAAO,ENnN1B,GAAO;;AMoN9B;sBACsC;EAAE,OAAO,ENpN1B,GAAO;;AMqN5B;iBACiC;EAAE,OAAO,ENxN1B,GAAO;;AMyNvB;qBACqC;EAAE,OAAO,ENtN1B,GAAO;;AMuN3B;iBACiC;EAAE,OAAO,ENzN1B,GAAO;;AM0NvB;sBACsC;EAAE,OAAO,ENzN1B,GAAO;;AM0N5B;4BAC4C;EAAE,OAAO,EN1N1B,GAAO;;AM2NlC;uBACuC;EAAE,OAAO,EN3N1B,GAAO;;AM4N7B;0BAC0C;EAAE,OAAO,EN5N1B,GAAO;;AM6NhC;qBACqC;EAAE,OAAO,EN7N1B,GAAO;;AM8N3B;kBACkC;EAAE,OAAO,EN9N1B,GAAO;;AM+NxB;sBACsC;EAAE,OAAO,EN/N1B,GAAO;;AMgO5B;eAC+B;EAAE,OAAO,ENhO1B,GAAO;;AMiOrB;cAC8B;EAAE,OAAO,ENjO1B,GAAO;;AMkOpB;mBACmC;EAAE,OAAO,ENlO1B,GAAO;;AMmOzB;qBACqC;EAAE,OAAO,ENlO1B,GAAO;;AMmO3B;iBACiC;EAAE,OAAO,ENrO1B,GAAO;;AMsOvB;qBACqC;EAAE,OAAO,ENrO1B,GAAO;;AMsO3B;qBACqC;EAAE,OAAO,ENrO1B,GAAO;;AMsO3B;iBACiC;EAAE,OAAO,ENxO1B,GAAO;;AMyOvB;oBACoC;EAAE,OAAO,ENvO1B,GAAO;;AMwO1B;gBACgC;EAAE,OAAO,EN1O1B,GAAO;;AM2OtB;6BAC6C;EAAE,OAAO,ENzO1B,GAAO;;AM0OnC;wBACwC;EAAE,OAAO,EN5O1B,GAAO;;AM6O9B;oBACoC;EAAE,OAAO,EN5O1B,GAAO;;AM6O1B;iBACiC;EAAE,OAAO,EN7O1B,GAAO;;AM8OvB;gBACgC;EAAE,OAAO,EN9O1B,GAAO;;AM+OtB;qBACqC;EAAE,OAAO,EN/O1B,GAAO;;AMgP3B;qBACqC;EAAE,OAAO,EN/O1B,GAAO;;AMgP3B;iBACiC;EAAE,OAAO,ENlP1B,GAAO;;AMmPvB;qBACqC;EAAE,OAAO,ENlP1B,GAAO;;AMmP3B;kBACkC;EAAE,OAAO,ENnP1B,GAAO;;AMoPxB;kBACkC;EAAE,OAAO,ENpP1B,GAAO;;AMqPxB;wBACwC;EAAE,OAAO,ENrP1B,GAAO;;AMsP9B;mBACmC;EAAE,OAAO,ENrP1B,GAAO;;AMsPzB;qBACqC;EAAE,OAAO,ENtP1B,GAAO;;AMuP3B;eAC+B;EAAE,OAAO,EN1P1B,GAAO;;AM2PrB;wBACwC;EAAE,OAAO,ENzP1B,GAAO;;AM0P9B;uBACuC;EAAE,OAAO,EN1P1B,GAAO;;AM2P7B;mBACmC;EAAE,OAAO,EN1P1B,GAAO;;AM2PzB;eAC+B;EAAE,OAAO,EN7P1B,GAAO;;AM8PrB;sBACsC;EAAE,OAAO,EN7P1B,GAAO;;AM8P5B;cAC8B;EAAE,OAAO,EN9P1B,GAAO;;AM+PpB;eAC+B;EAAE,OAAO,EN/P1B,GAAO;;AMgQrB;gBACgC;EAAE,OAAO,ENhQ1B,GAAO;;AMiQtB;sBACsC;EAAE,OAAO,ENjQ1B,GAAO;;AMkQ5B;qBACqC;EAAE,OAAO,ENlQ1B,GAAO;;AMmQ3B;mBACmC;EAAE,OAAO,ENlQ1B,GAAO;;AMmQzB;kBACkC;EAAE,OAAO,ENnQ1B,GAAO;;AMoQxB;aAC6B;EAAE,OAAO,ENvQ1B,GAAO;;AMwQnB;sBACsC;EAAE,OAAO,ENtQ1B,GAAO;;AMuQ5B;oBACoC;EAAE,OAAO,ENvQ1B,GAAO;;AMwQ1B;mBACmC;EAAE,OAAO,ENvQ1B,GAAO;;AMwQzB;eAC+B;EAAE,OAAO,EN1Q1B,GAAO;;AM2QrB;eAC+B;EAAE,OAAO,EN1Q1B,GAAO;;AM2QrB;gBACgC;EAAE,OAAO,EN3Q1B,GAAO;;AM4QtB;oBACoC;EAAE,OAAO,EN3Q1B,GAAO;;AM4Q1B;gBACgC;EAAE,OAAO,EN9Q1B,GAAO;;AM+QtB;iBACiC;EAAE,OAAO,EN9Q1B,GAAO;;AM+QvB;kBACkC;EAAE,OAAO,EN/Q1B,GAAO;;AMgRxB;2BAC2C;EAAE,OAAO,ENhR1B,GAAO;;AMiRjC;qBACqC;EAAE,OAAO,ENhR1B,GAAO;;AMiR3B;iBACiC;EAAE,OAAO,ENnR1B,GAAO;;AMoRvB;iBACiC;EAAE,OAAO,ENnR1B,GAAO;;AMoRvB;cAC8B;EAAE,OAAO,ENpR1B,GAAO;;AMqRpB;eAC+B;EAAE,OAAO,ENrR1B,GAAO;;AMsRrB;iBACiC;EAAE,OAAO,ENtR1B,GAAO;;AMuRvB;oBACoC;EAAE,OAAO,ENtR1B,GAAO;;AMuR1B;qBACqC;EAAE,OAAO,ENvR1B,GAAO;;AMwR3B;gBACgC;EAAE,OAAO,EN3R1B,GAAO;;AM4RtB;oBACoC;EAAE,OAAO,EN1R1B,GAAO;;AM2R1B;gBACgC;EAAE,OAAO,EN3R1B,GAAO;;AM4RtB;oBACoC;EAAE,OAAO,EN5R1B,GAAO;;AM6R1B;sBACsC;EAAE,OAAO,EN7R1B,GAAO;;AM8R5B;qBACqC;EAAE,OAAO,EN9R1B,GAAO;;AM+R3B;oBACoC;EAAE,OAAO,EN/R1B,GAAO;;AMgS1B;cAC8B;EAAE,OAAO,ENhS1B,GAAO;;AMiSpB;uBACuC;EAAE,OAAO,ENjS1B,GAAO;;AMkS7B;sBACsC;EAAE,OAAO,ENjS1B,GAAO;;AMkS5B;kBACkC;EAAE,OAAO,ENpS1B,GAAO;;AMqSxB;qBACqC;EAAE,OAAO,ENpS1B,GAAO;;AMqS3B;oBACoC;EAAE,OAAO,ENrS1B,GAAO;;AMsS1B;qBACqC;EAAE,OAAO,ENrS1B,GAAO;;AMsS3B;iBACiC;EAAE,OAAO,ENxS1B,GAAO;;AMySvB;kBACkC;EAAE,OAAO,ENxS1B,GAAO;;AMySxB;kBACkC;EAAE,OAAO,ENzS1B,GAAO;;AM0SxB;mBACmC;EAAE,OAAO,EN1S1B,GAAO", -"sources": ["_path.scss","_core.scss","_larger.scss","_fixed-width.scss","_list.scss","_variables.scss","_bordered-pulled.scss","_animated.scss","_rotated-flipped.scss","_mixins.scss","_stacked.scss","_icons.scss"], -"names": [], -"file": "elusive-icons.css" -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/elusive-icons.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/elusive-icons.scss deleted file mode 100755 index c3bb7ba3..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/elusive-icons/scss/elusive-icons.scss +++ /dev/null @@ -1,17 +0,0 @@ -/*! - * Elusive Icons 2.0.0 by @ReduxFramework - http://elusiveicons.com - @reduxframework - * License - http://elusiveicons.com/license (Font: SIL OFL 1.1, CSS: MIT License) - */ - -@import "variables"; -@import "mixins"; -@import "path"; -@import "core"; -@import "larger"; -@import "fixed-width"; -@import "list"; -@import "bordered-pulled"; -@import "animated"; -@import "rotated-flipped"; -@import "stacked"; -@import "icons"; diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_flat_0_aaaaaa_40x100.png b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_flat_0_aaaaaa_40x100.png deleted file mode 100755 index 5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_glass_55_fbf9ee_1x400.png b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_glass_55_fbf9ee_1x400.png deleted file mode 100755 index ad3d6346e00f246102f72f2e026ed0491988b394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hLi978O6-<~(*I$*%ybaDOn z{W;e!B}_MSUQoPXhYd^Y6RUoS1yepnPx`2Kz)7OXQG!!=-jY=F+d2OOy?#DnJ32>z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_glass_65_ffffff_1x400.png b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_glass_65_ffffff_1x400.png deleted file mode 100755 index 42ccba269b6e91bef12ad0fa18be651b5ef0ee68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_glass_75_dadada_1x400.png b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-bg_glass_75_dadada_1x400.png deleted file mode 100755 index 5a46b47cb16631068aee9e0bd61269fc4e95e5cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uPMaW978O6-<~?i$)F&>d~nX+ z>vO)oJQ&&FVaKefeOt$qOR>f~^ebnN_=~%qdHEaS{Ou}E*`%9 zKPdOkfrN+ZlHSt7(uY{3{#;wiJb&Ugx1>W4qtrSDm(4hFaaY-$3p3x|sIU3`%J?Qj YcLn#R=pC)AfTl5cy85}Sb4q9e0MP_2(*OVf diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_222222_256x240.png b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_222222_256x240.png deleted file mode 100755 index b273ff111d219c9b9a8b96d57683d0075fb7871a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_2e83ff_256x240.png b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_2e83ff_256x240.png deleted file mode 100755 index 09d1cdc856c292c4ab6dd818c7543ac0828bd616..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 zcmd^?`8O2)_s3@pGmLE*`#M>&Z`mr_kcu#tBo!IbqU=l7VaSrbQrTh%5m}S08Obh0 zGL{*mi8RK}U~J#s@6Y%1S9~7lb?$xLU+y{go_o*h`AW1wUF3v{Kmh;%r@5J_9RL9Q zdj+hqg8o{9`K7(TZrR4t{=9O`!T-(~c=yEWZ{eswJJe->5bP8)t4;f(Y*i_HU*sLM z2=7-8guZ}@*(HhVC)Mqgr$3T8?#a(hu& z?Kzuw!O%PM>AicSW`_U(cbvJYv3{HfpIP~Q>@$^c588E$vv)V2c|Mr% zuFO$+I~Hg@u}wPm17n%}j1Y+Pbu!bt?iPkjGAo7>9eRN0FZz3X2_QZj+V!}+*8oBQ z_=iI^_TCA;Ea2tPmRNOeX3+VM>KL;o1(h`c@`6Ah`vdH<&+$yTg)jGWW72T}6J`kUAv?2CgyV zrs0y@Fpvpj@kWVE0TzL@Cy#qHn~kgensb{hIm6J&I8hkoNHOz6o1QQ3QM4NZyu?;= zLd>`wPT*uGr+6vAxYv3k8{gMDR>tO}UavDKzzyi6hvbuP=XQ4Y|A)r4#B$U(q7{1Z z0iLeSjo3;T*diS*me%4|!s23l@>R}rn@#Zc{<%CFt;?gd5S<)b=8Yz32U zBBLprntW3RE3f|uNX5Aw|I(IlJjW-Byd?QFFRk%hLU}O*YyYQel}WcXilLMJp9cB4 z)E?D+*Y4zai&XY!>niMfTW-2pp-^KFT93%Leig@uoQGPYRCva-`w#orm`is`p8b4s zxD462;f*^XO$=3by=VzN9i@xxr<1w=pcxl!$!fjWt|fYmq1@@badT?v`d zIi$|e$Ji}FXsiVYf)?pN1R0LBw;+)B5aUJj2fP+=m;=_Eho84g%Jq#@MLPSQEX*@T z6sZb)m?)zby>{j1)(;rRML|gKSs+9jorf-XhQJ2Jyt5Cqc*`S3iX@A5C3jvgAns|4 z*|)YQ%Kmsj+YZ53;nMqh|AFvehUV-9R;1ZZ;w5r9l}8hjSw@#k;>)$P*r%)=Extyu zB!$Kd-F?*50aJ2;TNTR-fc8B{KAq3!vW{g$LlGPfGW+%#CXU zJDcMsvyT2`x~v>>w8@yssoA`KuIZ98CLU{Ia%*nW3G4t}@ApsbC@o^WCqL>OXx>Y^ zSuVWEQ;3=A=@RxCnt0>G@#(VWBQ`0$qTwA#e>SX{_N~JWGsBxFHCw|5|?CzDi>92F-^=b*8sMXnhUJdb!>yGD2nhN@{582 zRPcxuDzs&;8De)>_J19z{0xppXQop#T_5ejGCKv@l>$O#DA-@X{y_1B-AsiU)H}DR z3xDZ8G`amV_WmA&8!W=@jgm|%bnwH%qkg(@J$hLaSV zC-rXIFMM%y<|Gb)o?j zpe-`dJ*N5tC-iH)d0CgLdBsw*C!ST9hY1EkI|Y(&=p&dH&q;a&7HXa5#_wtMsenQL zcpyhwx)Ppw@XmVz?P)DI#^ee1oC!i`>>Jq1ESk-OuQ(Pbv=s{A0AjM@rw#FaU;RUh z*At0{U*NtGVY_-JcuG$?zuuf%ZBTWxKU2yf?iN#-MRWs>A*2;p0G1Tp3d29u5RbnY zDOON-G|PidOOGeybnbzu7UVv71l!b=w7eU5l*{EdKuoKu`#LZ}|fnUr-+lSST9(MTT`0tqOG z#+Q_=lXe-=;rE4u8s~;%i~~ z8v&&+VPeXG=2zw9B5sR$e?R(n%nf?p-(BCZ8}x!_-9T+LT;2=Zu?Wv)j3#>35$6dR z4*7xmI)#06qjh#sXvX(%`#D1mD8fn1G~I;l%Dk{pw)}>_{+3^Fv_q)>2#de5qGCId zPz?ix-3954nM&u@vaw{o%-#HU%_bLJMO#@enR^&B{3ihWdoU6%pBJ`o>im+b-c6r-;c{vd0Z_)`75$jApy2?!9G4_FGa)iZ~9`6VELiYM+n!-mUfvfm{jt zC?!1=%pxJhF>vyQ47Q}R;O48pxgMs)rz$SbM&jkp<6X$r4DHWg>ZnGB-$r2o1*nL# zW0^*itcRY_^Uv^XgQP>W#>KQgM~l{;S(GkVW@&vld^AhWzG^m|9#0#USbM>^en{k2 za8~DTL`(Q~=ofsL&Fc`!L6r~qTnnGo8r98<(aG*<0%aNEr!!BIyY>VV82kxhR%d>V(lN&#BId#urK_i~Pe6?>C~J!pU_lRon#&S_cXoQv;poG8FK4atc

N)npz1~X%p6x{M(Gw!!H=!}lmO0Xr*8ewyH(Q+>oy`fxQkxJ zzzB$)%*xM4s_2(O>)T-QXhwP|&DZam#{O+47q|WKfz_ZL-MypRN~o{fE*I#6@eM?I zs%f-6{Lz6j7rB#U$%O$~TIT!j?|Ip1CpSmb=JA9qCY3-mQf|fVCxswPjok|VofUEP zW5^pTd5B;wRkyW%1a;nYHB$ef6Pv8^);`m0jv6p72iNJl+sVBqZugsq6cq_pyNREi z>GN!h6ZQ6`aOMr_2KI@j=XR@$aJj(2jcpY?>f=2kMV@di5W7Swj?ug10zRe}F1nR* ztMm6+T^)LJe^SzGgSxahQajq0h7#|8oMV0>D~*N}jl?9_X`ka42R4@rryDc3o(c$R?1*!1O9zleSOczw zYPS3~xbJ$~C(3+D7Zkrfjs_lneY^zv^kHmxt)aqZ!aeGABHZ`gvA&K`72z}ihI$Ht z9V&)wQy0g@R9irwbf!{uE&_J2l9jXz^Vj#=qA77*3Pd9OjrE_tKDHADd!AjFQv(ji zct-BMUt9()1Ox!dsI_h1(^F_U)_QJrx|%+y`zWWlD4=Nd?JQ=URh0*{fb1!o4tS(H z^r_T(8t1SAHf1oduG+X^*EC_kL(!QnXL6Hp);449yO&1xE>MXGqT)t10lzvALllX;;Q)RiJX$dm zlR8ep5-GdHmRm9?N#QCjNUA);vC03Gw6yds6^?c4;(MH>;O5xmQ2nGK3Dmk8i*v5t z-{jJsQq30%z}0`g7SN-yN`l-`@6rkJ|V|>18`MV zwUeH}DxWw&h+A+Dn|4|YNr&EfKS`Hz_NkeW3*sI5Rq-J&FzG=!{-K`n65#7O%^&f> z`PkqxyC_K)>781~7H${^Nj{`>XEa&OPqqQhySR5%w2{5+sEakXXHazJp6~LP2QKDx zpkvZrkDOa+A4BbqqX6ls&O)5-Q7`qkZ_?6~c-wQ9tseNtET;nhEOL^`*naKwcMX;R zbto&a;oTR0s;vjfj3wigUg)Sj)!OHQfZoJwAsWYI1A4ntz>X=W4s|y?tUk1r=>#Ct zf+?hq^>rQ3$KNboG$UhCdEmp{qAR13DK$f0ES7kAG~7q+g!jfVq`1b5+c62N^0%~o zKw91o@Wv;0EW*7fINAX3O~L-V{`;xB0q()#^HKZOlLrXVL*Dtw-$SUp8*_J{r( zW`6r`cz0yZQ#f0#*y+m64{bs7GP|2V$phf42rswJB?s@9qf;Bfc^pm-ZS#^5dkG{u zzv;l&B$NYcegSqAnjnPN1?17VUQbPummcWry((85IFB(pFQNGN{hhN$Fv?~l_fr?| z9=%dK(+;kZ(8=mwptjwC-ikBD$Z{l2++~*8wq5ynF<+PNlZI7ba5V#fg~L}kE;UH5 zJ;{P(`G{tNl&z5rUiH~e{I>GT8~9&*(J;Myx9z5P!db!F8RTII^I7c)HU=ss*bYB` zgwiIMZ_q>KEC$4lFm+Afvu6^$X1jm1rB*4H)-EIO5Rvz_p24?OkJ zovD4{-1KA6*oL?a;3qR7GZRB!cE5oAdA#M@{w+fGgsJ-lSmQ^-?8E&Q%tbmjd=@gZ z(}Mg*jsDf6Z)|7s%@9pc-tuw5W&zqUXjv2bVkC%-X?O3F72W4EsIl#1e>Mdz=X4k*_>VxCu_2?jjg16N*5fwC-36OW&;Sz}@jMn}hgJdEd pO;bST+>R{W-aENZYk%(=^(_R5N$LmL{Qc?!%+I4tt4z=_{|902Wu5>4 diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_454545_256x240.png b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_454545_256x240.png deleted file mode 100755 index 59bd45b907c4fd965697774ce8c5fc6b2fd9c105..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 oBo%DI*Kv;w;*%(i9W@f3_WCF#rGn diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_cd0a0a_256x240.png b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_cd0a0a_256x240.png deleted file mode 100755 index 2ab019b73ec11a485fa09378f3a0e155194f6a5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 Y`xtn(*dR-}!vwf$a^1Mm&@<(K0cnc1rT_o{ diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_ffffff_256x240.png b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/images/ui-icons_ffffff_256x240.png deleted file mode 100755 index 42f8f992c727ddaa617da224a522e463df690387..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/jquery-ui-1.10.0.custom.css b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/jquery-ui-1.10.0.custom.css deleted file mode 100755 index 2ba22205..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/jquery-ui-1.10.0.custom.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * jQuery UI Bootstrap (0.5) - * http://addyosmani.github.com/jquery-ui-bootstrap - * - * Copyright 2012 - 2013, Addy Osmani - * Dual licensed under the MIT or GPL Version 2 licenses. - * - * Portions copyright jQuery UI & Twitter Bootstrap - */.redux-container .ui-state-disabled,.control-section-redux .ui-state-disabled,.control-panel-redux .ui-state-disabled,.redux-metabox .ui-state-disabled{cursor:default !important}.redux-container .ui-icon,.control-section-redux .ui-icon,.control-panel-redux .ui-icon,.redux-metabox .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.redux-container .ui-widget-content,.control-section-redux .ui-widget-content,.control-panel-redux .ui-widget-content,.redux-metabox .ui-widget-content{border:1px solid #aaaaaa;background:#fff url(images/ui-bg_glass_75_ffffff_1x400.png) 50% 50% repeat-x;color:#404040}.redux-container .ui-widget-header,.control-section-redux .ui-widget-header,.control-panel-redux .ui-widget-header,.redux-metabox .ui-widget-header{font-weight:bold;border-color:#0064cd #0064cd #003f81;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border:1px solid #666}.redux-container .ui-widget-header a,.control-section-redux .ui-widget-header a,.control-panel-redux .ui-widget-header a,.redux-metabox .ui-widget-header a{color:#222222}.redux-container .ui-state-default,.redux-container .ui-widget-content .ui-state-default,.redux-container .ui-widget-header .ui-state-default,.control-section-redux .ui-state-default,.control-section-redux .ui-widget-content .ui-state-default,.control-section-redux .ui-widget-header .ui-state-default,.control-panel-redux .ui-state-default,.control-panel-redux .ui-widget-content .ui-state-default,.control-panel-redux .ui-widget-header .ui-state-default,.redux-metabox .ui-state-default,.redux-metabox .ui-widget-content .ui-state-default,.redux-metabox .ui-widget-header .ui-state-default{background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), color-stop(25%, #fff), to(#e6e6e6));background-image:-webkit-linear-gradient(#fff, #fff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #fff, #fff 25%, #e6e6e6);background-image:-ms-linear-gradient(#fff, #fff 25%, #e6e6e6);background-image:-o-linear-gradient(#fff, #fff 25%, #e6e6e6);background-image:linear-gradient(#fff, #fff 25%, #e6e6e6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);text-shadow:0 1px 1px rgba(255,255,255,0.75);color:#333;font-size:13px;line-height:normal;border:1px solid #ccc;border-bottom-color:#bbb;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-webkit-transition:0.1s linear background-image;-moz-transition:0.1s linear background-image;-ms-transition:0.1s linear background-image;-o-transition:0.1s linear background-image;transition:0.1s linear background-image;overflow:visible}.redux-container .ui-state-default a,.redux-container .ui-state-default a:link,.redux-container .ui-state-default a:visited,.control-section-redux .ui-state-default a,.control-section-redux .ui-state-default a:link,.control-section-redux .ui-state-default a:visited,.control-panel-redux .ui-state-default a,.control-panel-redux .ui-state-default a:link,.control-panel-redux .ui-state-default a:visited,.redux-metabox .ui-state-default a,.redux-metabox .ui-state-default a:link,.redux-metabox .ui-state-default a:visited{color:#555555;text-decoration:none}.redux-container .ui-state-hover,.redux-container .ui-widget-content .ui-state-hover,.redux-container .ui-widget-header .ui-state-hover,.redux-container .ui-state-focus,.redux-container .ui-widget-content .ui-state-focus,.redux-container .ui-widget-header .ui-state-focus,.control-section-redux .ui-state-hover,.control-section-redux .ui-widget-content .ui-state-hover,.control-section-redux .ui-widget-header .ui-state-hover,.control-section-redux .ui-state-focus,.control-section-redux .ui-widget-content .ui-state-focus,.control-section-redux .ui-widget-header .ui-state-focus,.control-panel-redux .ui-state-hover,.control-panel-redux .ui-widget-content .ui-state-hover,.control-panel-redux .ui-widget-header .ui-state-hover,.control-panel-redux .ui-state-focus,.control-panel-redux .ui-widget-content .ui-state-focus,.control-panel-redux .ui-widget-header .ui-state-focus,.redux-metabox .ui-state-hover,.redux-metabox .ui-widget-content .ui-state-hover,.redux-metabox .ui-widget-header .ui-state-hover,.redux-metabox .ui-state-focus,.redux-metabox .ui-widget-content .ui-state-focus,.redux-metabox .ui-widget-header .ui-state-focus{background-position:0 -15px;color:#333;text-decoration:none}.redux-container .ui-state-hover a,.redux-container .ui-state-hover a:hover,.redux-container .ui-state-hover a:link,.redux-container .ui-state-hover a:visited,.control-section-redux .ui-state-hover a,.control-section-redux .ui-state-hover a:hover,.control-section-redux .ui-state-hover a:link,.control-section-redux .ui-state-hover a:visited,.control-panel-redux .ui-state-hover a,.control-panel-redux .ui-state-hover a:hover,.control-panel-redux .ui-state-hover a:link,.control-panel-redux .ui-state-hover a:visited,.redux-metabox .ui-state-hover a,.redux-metabox .ui-state-hover a:hover,.redux-metabox .ui-state-hover a:link,.redux-metabox .ui-state-hover a:visited{color:#212121;text-decoration:none}.redux-container .ui-state-active,.redux-container .ui-widget-content .ui-state-active,.redux-container .ui-widget-header .ui-state-active,.control-section-redux .ui-state-active,.control-section-redux .ui-widget-content .ui-state-active,.control-section-redux .ui-widget-header .ui-state-active,.control-panel-redux .ui-state-active,.control-panel-redux .ui-widget-content .ui-state-active,.control-panel-redux .ui-widget-header .ui-state-active,.redux-metabox .ui-state-active,.redux-metabox .ui-widget-content .ui-state-active,.redux-metabox .ui-widget-header .ui-state-active{border:1px solid #aaaaaa;font-weight:normal;color:#212121}.redux-container .ui-state-active a,.redux-container .ui-state-active a:link,.redux-container .ui-state-active a:visited,.control-section-redux .ui-state-active a,.control-section-redux .ui-state-active a:link,.control-section-redux .ui-state-active a:visited,.control-panel-redux .ui-state-active a,.control-panel-redux .ui-state-active a:link,.control-panel-redux .ui-state-active a:visited,.redux-metabox .ui-state-active a,.redux-metabox .ui-state-active a:link,.redux-metabox .ui-state-active a:visited{color:#212121;text-decoration:none}.redux-container .ui-widget :active,.control-section-redux .ui-widget :active,.control-panel-redux .ui-widget :active,.redux-metabox .ui-widget :active{outline:none}.redux-container .ui-state-highlight p,.redux-container .ui-state-error p,.redux-container .ui-state-default p,.control-section-redux .ui-state-highlight p,.control-section-redux .ui-state-error p,.control-section-redux .ui-state-default p,.control-panel-redux .ui-state-highlight p,.control-panel-redux .ui-state-error p,.control-panel-redux .ui-state-default p,.redux-metabox .ui-state-highlight p,.redux-metabox .ui-state-error p,.redux-metabox .ui-state-default p{font-size:13px;font-weight:normal;line-height:18px;margin:7px 15px}.redux-container .ui-state-highlight,.redux-container .ui-widget-content .ui-state-highlight,.redux-container .ui-widget-header .ui-state-highlight,.control-section-redux .ui-state-highlight,.control-section-redux .ui-widget-content .ui-state-highlight,.control-section-redux .ui-widget-header .ui-state-highlight,.control-panel-redux .ui-state-highlight,.control-panel-redux .ui-widget-content .ui-state-highlight,.control-panel-redux .ui-widget-header .ui-state-highlight,.redux-metabox .ui-state-highlight,.redux-metabox .ui-widget-content .ui-state-highlight,.redux-metabox .ui-widget-header .ui-state-highlight{position:relative;margin-bottom:18px;color:#404040;background-color:#eedc94;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));background-image:-moz-linear-gradient(top, #fceec1, #eedc94);background-image:-ms-linear-gradient(top, #fceec1, #eedc94);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));background-image:-webkit-linear-gradient(top, #fceec1, #eedc94);background-image:-o-linear-gradient(top, #fceec1, #eedc94);background-image:linear-gradient(top, #fceec1, #eedc94);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0);text-shadow:0 -1px 0 rgba(0,0,0,0.25);border-color:#eedc94 #eedc94 #e4c652;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);text-shadow:0 1px 0 rgba(255,255,255,0.5);border-width:1px;border-style:solid;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25)}.redux-container .ui-state-highlight a,.redux-container .ui-widget-content .ui-state-highlight a,.redux-container .ui-widget-header .ui-state-highlight a,.control-section-redux .ui-state-highlight a,.control-section-redux .ui-widget-content .ui-state-highlight a,.control-section-redux .ui-widget-header .ui-state-highlight a,.control-panel-redux .ui-state-highlight a,.control-panel-redux .ui-widget-content .ui-state-highlight a,.control-panel-redux .ui-widget-header .ui-state-highlight a,.redux-metabox .ui-state-highlight a,.redux-metabox .ui-widget-content .ui-state-highlight a,.redux-metabox .ui-widget-header .ui-state-highlight a{color:#363636}.redux-container .ui-state-error,.redux-container .ui-widget-content .ui-state-error,.redux-container .ui-widget-header .ui-state-error,.control-section-redux .ui-state-error,.control-section-redux .ui-widget-content .ui-state-error,.control-section-redux .ui-widget-header .ui-state-error,.control-panel-redux .ui-state-error,.control-panel-redux .ui-widget-content .ui-state-error,.control-panel-redux .ui-widget-header .ui-state-error,.redux-metabox .ui-state-error,.redux-metabox .ui-widget-content .ui-state-error,.redux-metabox .ui-widget-header .ui-state-error{position:relative;margin-bottom:18px;color:#ffffff;border-width:1px;border-style:solid;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25);background-color:#c43c35;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);text-shadow:0 -1px 0 rgba(0,0,0,0.25);border-color:#c43c35 #c43c35 #882a25;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25)}.redux-container .ui-state-error a,.redux-container .ui-widget-content .ui-state-error a,.redux-container .ui-widget-header .ui-state-error a,.control-section-redux .ui-state-error a,.control-section-redux .ui-widget-content .ui-state-error a,.control-section-redux .ui-widget-header .ui-state-error a,.control-panel-redux .ui-state-error a,.control-panel-redux .ui-widget-content .ui-state-error a,.control-panel-redux .ui-widget-header .ui-state-error a,.redux-metabox .ui-state-error a,.redux-metabox .ui-widget-content .ui-state-error a,.redux-metabox .ui-widget-header .ui-state-error a{color:#cd0a0a}.redux-container .ui-state-error-text,.redux-container .ui-widget-content .ui-state-error-text,.redux-container .ui-widget-header .ui-state-error-text,.control-section-redux .ui-state-error-text,.control-section-redux .ui-widget-content .ui-state-error-text,.control-section-redux .ui-widget-header .ui-state-error-text,.control-panel-redux .ui-state-error-text,.control-panel-redux .ui-widget-content .ui-state-error-text,.control-panel-redux .ui-widget-header .ui-state-error-text,.redux-metabox .ui-state-error-text,.redux-metabox .ui-widget-content .ui-state-error-text,.redux-metabox .ui-widget-header .ui-state-error-text{color:#cd0a0a}.redux-container .ui-priority-primary,.redux-container .ui-widget-content .ui-priority-primary,.redux-container .ui-widget-header .ui-priority-primary,.control-section-redux .ui-priority-primary,.control-section-redux .ui-widget-content .ui-priority-primary,.control-section-redux .ui-widget-header .ui-priority-primary,.control-panel-redux .ui-priority-primary,.control-panel-redux .ui-widget-content .ui-priority-primary,.control-panel-redux .ui-widget-header .ui-priority-primary,.redux-metabox .ui-priority-primary,.redux-metabox .ui-widget-content .ui-priority-primary,.redux-metabox .ui-widget-header .ui-priority-primary{font-weight:bold}.redux-container .ui-priority-secondary,.redux-container .ui-widget-content .ui-priority-secondary,.redux-container .ui-widget-header .ui-priority-secondary,.control-section-redux .ui-priority-secondary,.control-section-redux .ui-widget-content .ui-priority-secondary,.control-section-redux .ui-widget-header .ui-priority-secondary,.control-panel-redux .ui-priority-secondary,.control-panel-redux .ui-widget-content .ui-priority-secondary,.control-panel-redux .ui-widget-header .ui-priority-secondary,.redux-metabox .ui-priority-secondary,.redux-metabox .ui-widget-content .ui-priority-secondary,.redux-metabox .ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.redux-container .ui-state-disabled,.redux-container .ui-widget-content .ui-state-disabled,.redux-container .ui-widget-header .ui-state-disabled,.control-section-redux .ui-state-disabled,.control-section-redux .ui-widget-content .ui-state-disabled,.control-section-redux .ui-widget-header .ui-state-disabled,.control-panel-redux .ui-state-disabled,.control-panel-redux .ui-widget-content .ui-state-disabled,.control-panel-redux .ui-widget-header .ui-state-disabled,.redux-metabox .ui-state-disabled,.redux-metabox .ui-widget-content .ui-state-disabled,.redux-metabox .ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.redux-container .ui-state-disabled .ui-icon,.control-section-redux .ui-state-disabled .ui-icon,.control-panel-redux .ui-state-disabled .ui-icon,.redux-metabox .ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.redux-container .ui-icon,.control-section-redux .ui-icon,.control-panel-redux .ui-icon,.redux-metabox .ui-icon{width:16px;height:16px;background-image:url(images/ui-icons_222222_256x240.png)}.redux-container .ui-widget-content .ui-icon,.control-section-redux .ui-widget-content .ui-icon,.control-panel-redux .ui-widget-content .ui-icon,.redux-metabox .ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.redux-container .ui-widget-header .ui-icon,.control-section-redux .ui-widget-header .ui-icon,.control-panel-redux .ui-widget-header .ui-icon,.redux-metabox .ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.redux-container .ui-state-default .ui-icon,.control-section-redux .ui-state-default .ui-icon,.control-panel-redux .ui-state-default .ui-icon,.redux-metabox .ui-state-default .ui-icon{background-image:url(images/ui-icons_888888_256x240.png)}.redux-container .ui-state-hover .ui-icon,.redux-container .ui-state-focus .ui-icon,.control-section-redux .ui-state-hover .ui-icon,.control-section-redux .ui-state-focus .ui-icon,.control-panel-redux .ui-state-hover .ui-icon,.control-panel-redux .ui-state-focus .ui-icon,.redux-metabox .ui-state-hover .ui-icon,.redux-metabox .ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.redux-container .ui-state-active .ui-icon,.control-section-redux .ui-state-active .ui-icon,.control-panel-redux .ui-state-active .ui-icon,.redux-metabox .ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.redux-container .ui-state-highlight .ui-icon,.control-section-redux .ui-state-highlight .ui-icon,.control-panel-redux .ui-state-highlight .ui-icon,.redux-metabox .ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png)}.redux-container .ui-state-error .ui-icon,.redux-container .ui-state-error-text .ui-icon,.control-section-redux .ui-state-error .ui-icon,.control-section-redux .ui-state-error-text .ui-icon,.control-panel-redux .ui-state-error .ui-icon,.control-panel-redux .ui-state-error-text .ui-icon,.redux-metabox .ui-state-error .ui-icon,.redux-metabox .ui-state-error-text .ui-icon{background-image:url(images/ui-icons_f6cf3b_256x240.png)}.redux-container .ui-icon-carat-1-n,.control-section-redux .ui-icon-carat-1-n,.control-panel-redux .ui-icon-carat-1-n,.redux-metabox .ui-icon-carat-1-n{background-position:0 0}.redux-container .ui-icon-carat-1-ne,.control-section-redux .ui-icon-carat-1-ne,.control-panel-redux .ui-icon-carat-1-ne,.redux-metabox .ui-icon-carat-1-ne{background-position:-16px 0}.redux-container .ui-icon-carat-1-e,.control-section-redux .ui-icon-carat-1-e,.control-panel-redux .ui-icon-carat-1-e,.redux-metabox .ui-icon-carat-1-e{background-position:-32px 0}.redux-container .ui-icon-carat-1-se,.control-section-redux .ui-icon-carat-1-se,.control-panel-redux .ui-icon-carat-1-se,.redux-metabox .ui-icon-carat-1-se{background-position:-48px 0}.redux-container .ui-icon-carat-1-s,.control-section-redux .ui-icon-carat-1-s,.control-panel-redux .ui-icon-carat-1-s,.redux-metabox .ui-icon-carat-1-s{background-position:-64px 0}.redux-container .ui-icon-carat-1-sw,.control-section-redux .ui-icon-carat-1-sw,.control-panel-redux .ui-icon-carat-1-sw,.redux-metabox .ui-icon-carat-1-sw{background-position:-80px 0}.redux-container .ui-icon-carat-1-w,.control-section-redux .ui-icon-carat-1-w,.control-panel-redux .ui-icon-carat-1-w,.redux-metabox .ui-icon-carat-1-w{background-position:-96px 0}.redux-container .ui-icon-carat-1-nw,.control-section-redux .ui-icon-carat-1-nw,.control-panel-redux .ui-icon-carat-1-nw,.redux-metabox .ui-icon-carat-1-nw{background-position:-112px 0}.redux-container .ui-icon-carat-2-n-s,.control-section-redux .ui-icon-carat-2-n-s,.control-panel-redux .ui-icon-carat-2-n-s,.redux-metabox .ui-icon-carat-2-n-s{background-position:-128px 0}.redux-container .ui-icon-carat-2-e-w,.control-section-redux .ui-icon-carat-2-e-w,.control-panel-redux .ui-icon-carat-2-e-w,.redux-metabox .ui-icon-carat-2-e-w{background-position:-144px 0}.redux-container .ui-icon-triangle-1-n,.control-section-redux .ui-icon-triangle-1-n,.control-panel-redux .ui-icon-triangle-1-n,.redux-metabox .ui-icon-triangle-1-n{background-position:0 -16px}.redux-container .ui-icon-triangle-1-ne,.control-section-redux .ui-icon-triangle-1-ne,.control-panel-redux .ui-icon-triangle-1-ne,.redux-metabox .ui-icon-triangle-1-ne{background-position:-16px -16px}.redux-container .ui-icon-triangle-1-e,.control-section-redux .ui-icon-triangle-1-e,.control-panel-redux .ui-icon-triangle-1-e,.redux-metabox .ui-icon-triangle-1-e{background-position:-32px -16px}.redux-container .ui-icon-triangle-1-se,.control-section-redux .ui-icon-triangle-1-se,.control-panel-redux .ui-icon-triangle-1-se,.redux-metabox .ui-icon-triangle-1-se{background-position:-48px -16px}.redux-container .ui-icon-triangle-1-s,.control-section-redux .ui-icon-triangle-1-s,.control-panel-redux .ui-icon-triangle-1-s,.redux-metabox .ui-icon-triangle-1-s{background-position:-64px -16px}.redux-container .ui-icon-triangle-1-sw,.control-section-redux .ui-icon-triangle-1-sw,.control-panel-redux .ui-icon-triangle-1-sw,.redux-metabox .ui-icon-triangle-1-sw{background-position:-80px -16px}.redux-container .ui-icon-triangle-1-w,.control-section-redux .ui-icon-triangle-1-w,.control-panel-redux .ui-icon-triangle-1-w,.redux-metabox .ui-icon-triangle-1-w{background-position:-96px -16px}.redux-container .ui-icon-triangle-1-nw,.control-section-redux .ui-icon-triangle-1-nw,.control-panel-redux .ui-icon-triangle-1-nw,.redux-metabox .ui-icon-triangle-1-nw{background-position:-112px -16px}.redux-container .ui-icon-triangle-2-n-s,.control-section-redux .ui-icon-triangle-2-n-s,.control-panel-redux .ui-icon-triangle-2-n-s,.redux-metabox .ui-icon-triangle-2-n-s{background-position:-128px -16px}.redux-container .ui-icon-triangle-2-e-w,.control-section-redux .ui-icon-triangle-2-e-w,.control-panel-redux .ui-icon-triangle-2-e-w,.redux-metabox .ui-icon-triangle-2-e-w{background-position:-144px -16px}.redux-container .ui-icon-arrow-1-n,.control-section-redux .ui-icon-arrow-1-n,.control-panel-redux .ui-icon-arrow-1-n,.redux-metabox .ui-icon-arrow-1-n{background-position:0 -32px}.redux-container .ui-icon-arrow-1-ne,.control-section-redux .ui-icon-arrow-1-ne,.control-panel-redux .ui-icon-arrow-1-ne,.redux-metabox .ui-icon-arrow-1-ne{background-position:-16px -32px}.redux-container .ui-icon-arrow-1-e,.control-section-redux .ui-icon-arrow-1-e,.control-panel-redux .ui-icon-arrow-1-e,.redux-metabox .ui-icon-arrow-1-e{background-position:-32px -32px}.redux-container .ui-icon-arrow-1-se,.control-section-redux .ui-icon-arrow-1-se,.control-panel-redux .ui-icon-arrow-1-se,.redux-metabox .ui-icon-arrow-1-se{background-position:-48px -32px}.redux-container .ui-icon-arrow-1-s,.control-section-redux .ui-icon-arrow-1-s,.control-panel-redux .ui-icon-arrow-1-s,.redux-metabox .ui-icon-arrow-1-s{background-position:-64px -32px}.redux-container .ui-icon-arrow-1-sw,.control-section-redux .ui-icon-arrow-1-sw,.control-panel-redux .ui-icon-arrow-1-sw,.redux-metabox .ui-icon-arrow-1-sw{background-position:-80px -32px}.redux-container .ui-icon-arrow-1-w,.control-section-redux .ui-icon-arrow-1-w,.control-panel-redux .ui-icon-arrow-1-w,.redux-metabox .ui-icon-arrow-1-w{background-position:-96px -32px}.redux-container .ui-icon-arrow-1-nw,.control-section-redux .ui-icon-arrow-1-nw,.control-panel-redux .ui-icon-arrow-1-nw,.redux-metabox .ui-icon-arrow-1-nw{background-position:-112px -32px}.redux-container .ui-icon-arrow-2-n-s,.control-section-redux .ui-icon-arrow-2-n-s,.control-panel-redux .ui-icon-arrow-2-n-s,.redux-metabox .ui-icon-arrow-2-n-s{background-position:-128px -32px}.redux-container .ui-icon-arrow-2-ne-sw,.control-section-redux .ui-icon-arrow-2-ne-sw,.control-panel-redux .ui-icon-arrow-2-ne-sw,.redux-metabox .ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.redux-container .ui-icon-arrow-2-e-w,.control-section-redux .ui-icon-arrow-2-e-w,.control-panel-redux .ui-icon-arrow-2-e-w,.redux-metabox .ui-icon-arrow-2-e-w{background-position:-160px -32px}.redux-container .ui-icon-arrow-2-se-nw,.control-section-redux .ui-icon-arrow-2-se-nw,.control-panel-redux .ui-icon-arrow-2-se-nw,.redux-metabox .ui-icon-arrow-2-se-nw{background-position:-176px -32px}.redux-container .ui-icon-arrowstop-1-n,.control-section-redux .ui-icon-arrowstop-1-n,.control-panel-redux .ui-icon-arrowstop-1-n,.redux-metabox .ui-icon-arrowstop-1-n{background-position:-192px -32px}.redux-container .ui-icon-arrowstop-1-e,.control-section-redux .ui-icon-arrowstop-1-e,.control-panel-redux .ui-icon-arrowstop-1-e,.redux-metabox .ui-icon-arrowstop-1-e{background-position:-208px -32px}.redux-container .ui-icon-arrowstop-1-s,.control-section-redux .ui-icon-arrowstop-1-s,.control-panel-redux .ui-icon-arrowstop-1-s,.redux-metabox .ui-icon-arrowstop-1-s{background-position:-224px -32px}.redux-container .ui-icon-arrowstop-1-w,.control-section-redux .ui-icon-arrowstop-1-w,.control-panel-redux .ui-icon-arrowstop-1-w,.redux-metabox .ui-icon-arrowstop-1-w{background-position:-240px -32px}.redux-container .ui-icon-arrowthick-1-n,.control-section-redux .ui-icon-arrowthick-1-n,.control-panel-redux .ui-icon-arrowthick-1-n,.redux-metabox .ui-icon-arrowthick-1-n{background-position:0 -48px}.redux-container .ui-icon-arrowthick-1-ne,.control-section-redux .ui-icon-arrowthick-1-ne,.control-panel-redux .ui-icon-arrowthick-1-ne,.redux-metabox .ui-icon-arrowthick-1-ne{background-position:-16px -48px}.redux-container .ui-icon-arrowthick-1-e,.control-section-redux .ui-icon-arrowthick-1-e,.control-panel-redux .ui-icon-arrowthick-1-e,.redux-metabox .ui-icon-arrowthick-1-e{background-position:-32px -48px}.redux-container .ui-icon-arrowthick-1-se,.control-section-redux .ui-icon-arrowthick-1-se,.control-panel-redux .ui-icon-arrowthick-1-se,.redux-metabox .ui-icon-arrowthick-1-se{background-position:-48px -48px}.redux-container .ui-icon-arrowthick-1-s,.control-section-redux .ui-icon-arrowthick-1-s,.control-panel-redux .ui-icon-arrowthick-1-s,.redux-metabox .ui-icon-arrowthick-1-s{background-position:-64px -48px}.redux-container .ui-icon-arrowthick-1-sw,.control-section-redux .ui-icon-arrowthick-1-sw,.control-panel-redux .ui-icon-arrowthick-1-sw,.redux-metabox .ui-icon-arrowthick-1-sw{background-position:-80px -48px}.redux-container .ui-icon-arrowthick-1-w,.control-section-redux .ui-icon-arrowthick-1-w,.control-panel-redux .ui-icon-arrowthick-1-w,.redux-metabox .ui-icon-arrowthick-1-w{background-position:-96px -48px}.redux-container .ui-icon-arrowthick-1-nw,.control-section-redux .ui-icon-arrowthick-1-nw,.control-panel-redux .ui-icon-arrowthick-1-nw,.redux-metabox .ui-icon-arrowthick-1-nw{background-position:-112px -48px}.redux-container .ui-icon-arrowthick-2-n-s,.control-section-redux .ui-icon-arrowthick-2-n-s,.control-panel-redux .ui-icon-arrowthick-2-n-s,.redux-metabox .ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.redux-container .ui-icon-arrowthick-2-ne-sw,.control-section-redux .ui-icon-arrowthick-2-ne-sw,.control-panel-redux .ui-icon-arrowthick-2-ne-sw,.redux-metabox .ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.redux-container .ui-icon-arrowthick-2-e-w,.control-section-redux .ui-icon-arrowthick-2-e-w,.control-panel-redux .ui-icon-arrowthick-2-e-w,.redux-metabox .ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.redux-container .ui-icon-arrowthick-2-se-nw,.control-section-redux .ui-icon-arrowthick-2-se-nw,.control-panel-redux .ui-icon-arrowthick-2-se-nw,.redux-metabox .ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.redux-container .ui-icon-arrowthickstop-1-n,.control-section-redux .ui-icon-arrowthickstop-1-n,.control-panel-redux .ui-icon-arrowthickstop-1-n,.redux-metabox .ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.redux-container .ui-icon-arrowthickstop-1-e,.control-section-redux .ui-icon-arrowthickstop-1-e,.control-panel-redux .ui-icon-arrowthickstop-1-e,.redux-metabox .ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.redux-container .ui-icon-arrowthickstop-1-s,.control-section-redux .ui-icon-arrowthickstop-1-s,.control-panel-redux .ui-icon-arrowthickstop-1-s,.redux-metabox .ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.redux-container .ui-icon-arrowthickstop-1-w,.control-section-redux .ui-icon-arrowthickstop-1-w,.control-panel-redux .ui-icon-arrowthickstop-1-w,.redux-metabox .ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.redux-container .ui-icon-arrowreturnthick-1-w,.control-section-redux .ui-icon-arrowreturnthick-1-w,.control-panel-redux .ui-icon-arrowreturnthick-1-w,.redux-metabox .ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.redux-container .ui-icon-arrowreturnthick-1-n,.control-section-redux .ui-icon-arrowreturnthick-1-n,.control-panel-redux .ui-icon-arrowreturnthick-1-n,.redux-metabox .ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.redux-container .ui-icon-arrowreturnthick-1-e,.control-section-redux .ui-icon-arrowreturnthick-1-e,.control-panel-redux .ui-icon-arrowreturnthick-1-e,.redux-metabox .ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.redux-container .ui-icon-arrowreturnthick-1-s,.control-section-redux .ui-icon-arrowreturnthick-1-s,.control-panel-redux .ui-icon-arrowreturnthick-1-s,.redux-metabox .ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.redux-container .ui-icon-arrowreturn-1-w,.control-section-redux .ui-icon-arrowreturn-1-w,.control-panel-redux .ui-icon-arrowreturn-1-w,.redux-metabox .ui-icon-arrowreturn-1-w{background-position:-64px -64px}.redux-container .ui-icon-arrowreturn-1-n,.control-section-redux .ui-icon-arrowreturn-1-n,.control-panel-redux .ui-icon-arrowreturn-1-n,.redux-metabox .ui-icon-arrowreturn-1-n{background-position:-80px -64px}.redux-container .ui-icon-arrowreturn-1-e,.control-section-redux .ui-icon-arrowreturn-1-e,.control-panel-redux .ui-icon-arrowreturn-1-e,.redux-metabox .ui-icon-arrowreturn-1-e{background-position:-96px -64px}.redux-container .ui-icon-arrowreturn-1-s,.control-section-redux .ui-icon-arrowreturn-1-s,.control-panel-redux .ui-icon-arrowreturn-1-s,.redux-metabox .ui-icon-arrowreturn-1-s{background-position:-112px -64px}.redux-container .ui-icon-arrowrefresh-1-w,.control-section-redux .ui-icon-arrowrefresh-1-w,.control-panel-redux .ui-icon-arrowrefresh-1-w,.redux-metabox .ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.redux-container .ui-icon-arrowrefresh-1-n,.control-section-redux .ui-icon-arrowrefresh-1-n,.control-panel-redux .ui-icon-arrowrefresh-1-n,.redux-metabox .ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.redux-container .ui-icon-arrowrefresh-1-e,.control-section-redux .ui-icon-arrowrefresh-1-e,.control-panel-redux .ui-icon-arrowrefresh-1-e,.redux-metabox .ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.redux-container .ui-icon-arrowrefresh-1-s,.control-section-redux .ui-icon-arrowrefresh-1-s,.control-panel-redux .ui-icon-arrowrefresh-1-s,.redux-metabox .ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.redux-container .ui-icon-arrow-4,.control-section-redux .ui-icon-arrow-4,.control-panel-redux .ui-icon-arrow-4,.redux-metabox .ui-icon-arrow-4{background-position:0 -80px}.redux-container .ui-icon-arrow-4-diag,.control-section-redux .ui-icon-arrow-4-diag,.control-panel-redux .ui-icon-arrow-4-diag,.redux-metabox .ui-icon-arrow-4-diag{background-position:-16px -80px}.redux-container .ui-icon-extlink,.control-section-redux .ui-icon-extlink,.control-panel-redux .ui-icon-extlink,.redux-metabox .ui-icon-extlink{background-position:-32px -80px}.redux-container .ui-icon-newwin,.control-section-redux .ui-icon-newwin,.control-panel-redux .ui-icon-newwin,.redux-metabox .ui-icon-newwin{background-position:-48px -80px}.redux-container .ui-icon-refresh,.control-section-redux .ui-icon-refresh,.control-panel-redux .ui-icon-refresh,.redux-metabox .ui-icon-refresh{background-position:-64px -80px}.redux-container .ui-icon-shuffle,.control-section-redux .ui-icon-shuffle,.control-panel-redux .ui-icon-shuffle,.redux-metabox .ui-icon-shuffle{background-position:-80px -80px}.redux-container .ui-icon-transfer-e-w,.control-section-redux .ui-icon-transfer-e-w,.control-panel-redux .ui-icon-transfer-e-w,.redux-metabox .ui-icon-transfer-e-w{background-position:-96px -80px}.redux-container .ui-icon-transferthick-e-w,.control-section-redux .ui-icon-transferthick-e-w,.control-panel-redux .ui-icon-transferthick-e-w,.redux-metabox .ui-icon-transferthick-e-w{background-position:-112px -80px}.redux-container .ui-icon-folder-collapsed,.control-section-redux .ui-icon-folder-collapsed,.control-panel-redux .ui-icon-folder-collapsed,.redux-metabox .ui-icon-folder-collapsed{background-position:0 -96px}.redux-container .ui-icon-folder-open,.control-section-redux .ui-icon-folder-open,.control-panel-redux .ui-icon-folder-open,.redux-metabox .ui-icon-folder-open{background-position:-16px -96px}.redux-container .ui-icon-document,.control-section-redux .ui-icon-document,.control-panel-redux .ui-icon-document,.redux-metabox .ui-icon-document{background-position:-32px -96px}.redux-container .ui-icon-document-b,.control-section-redux .ui-icon-document-b,.control-panel-redux .ui-icon-document-b,.redux-metabox .ui-icon-document-b{background-position:-48px -96px}.redux-container .ui-icon-note,.control-section-redux .ui-icon-note,.control-panel-redux .ui-icon-note,.redux-metabox .ui-icon-note{background-position:-64px -96px}.redux-container .ui-icon-mail-closed,.control-section-redux .ui-icon-mail-closed,.control-panel-redux .ui-icon-mail-closed,.redux-metabox .ui-icon-mail-closed{background-position:-80px -96px}.redux-container .ui-icon-mail-open,.control-section-redux .ui-icon-mail-open,.control-panel-redux .ui-icon-mail-open,.redux-metabox .ui-icon-mail-open{background-position:-96px -96px}.redux-container .ui-icon-suitcase,.control-section-redux .ui-icon-suitcase,.control-panel-redux .ui-icon-suitcase,.redux-metabox .ui-icon-suitcase{background-position:-112px -96px}.redux-container .ui-icon-comment,.control-section-redux .ui-icon-comment,.control-panel-redux .ui-icon-comment,.redux-metabox .ui-icon-comment{background-position:-128px -96px}.redux-container .ui-icon-person,.control-section-redux .ui-icon-person,.control-panel-redux .ui-icon-person,.redux-metabox .ui-icon-person{background-position:-144px -96px}.redux-container .ui-icon-print,.control-section-redux .ui-icon-print,.control-panel-redux .ui-icon-print,.redux-metabox .ui-icon-print{background-position:-160px -96px}.redux-container .ui-icon-trash,.control-section-redux .ui-icon-trash,.control-panel-redux .ui-icon-trash,.redux-metabox .ui-icon-trash{background-position:-176px -96px}.redux-container .ui-icon-locked,.control-section-redux .ui-icon-locked,.control-panel-redux .ui-icon-locked,.redux-metabox .ui-icon-locked{background-position:-192px -96px}.redux-container .ui-icon-unlocked,.control-section-redux .ui-icon-unlocked,.control-panel-redux .ui-icon-unlocked,.redux-metabox .ui-icon-unlocked{background-position:-208px -96px}.redux-container .ui-icon-bookmark,.control-section-redux .ui-icon-bookmark,.control-panel-redux .ui-icon-bookmark,.redux-metabox .ui-icon-bookmark{background-position:-224px -96px}.redux-container .ui-icon-tag,.control-section-redux .ui-icon-tag,.control-panel-redux .ui-icon-tag,.redux-metabox .ui-icon-tag{background-position:-240px -96px}.redux-container .ui-icon-home,.control-section-redux .ui-icon-home,.control-panel-redux .ui-icon-home,.redux-metabox .ui-icon-home{background-position:0 -112px}.redux-container .ui-icon-flag,.control-section-redux .ui-icon-flag,.control-panel-redux .ui-icon-flag,.redux-metabox .ui-icon-flag{background-position:-16px -112px}.redux-container .ui-icon-calendar,.control-section-redux .ui-icon-calendar,.control-panel-redux .ui-icon-calendar,.redux-metabox .ui-icon-calendar{background-position:-32px -112px}.redux-container .ui-icon-cart,.control-section-redux .ui-icon-cart,.control-panel-redux .ui-icon-cart,.redux-metabox .ui-icon-cart{background-position:-48px -112px}.redux-container .ui-icon-pencil,.control-section-redux .ui-icon-pencil,.control-panel-redux .ui-icon-pencil,.redux-metabox .ui-icon-pencil{background-position:-64px -112px}.redux-container .ui-icon-clock,.control-section-redux .ui-icon-clock,.control-panel-redux .ui-icon-clock,.redux-metabox .ui-icon-clock{background-position:-80px -112px}.redux-container .ui-icon-disk,.control-section-redux .ui-icon-disk,.control-panel-redux .ui-icon-disk,.redux-metabox .ui-icon-disk{background-position:-96px -112px}.redux-container .ui-icon-calculator,.control-section-redux .ui-icon-calculator,.control-panel-redux .ui-icon-calculator,.redux-metabox .ui-icon-calculator{background-position:-112px -112px}.redux-container .ui-icon-zoomin,.control-section-redux .ui-icon-zoomin,.control-panel-redux .ui-icon-zoomin,.redux-metabox .ui-icon-zoomin{background-position:-128px -112px}.redux-container .ui-icon-zoomout,.control-section-redux .ui-icon-zoomout,.control-panel-redux .ui-icon-zoomout,.redux-metabox .ui-icon-zoomout{background-position:-144px -112px}.redux-container .ui-icon-search,.control-section-redux .ui-icon-search,.control-panel-redux .ui-icon-search,.redux-metabox .ui-icon-search{background-position:-160px -112px}.redux-container .ui-icon-wrench,.control-section-redux .ui-icon-wrench,.control-panel-redux .ui-icon-wrench,.redux-metabox .ui-icon-wrench{background-position:-176px -112px}.redux-container .ui-icon-gear,.control-section-redux .ui-icon-gear,.control-panel-redux .ui-icon-gear,.redux-metabox .ui-icon-gear{background-position:-192px -112px}.redux-container .ui-icon-heart,.control-section-redux .ui-icon-heart,.control-panel-redux .ui-icon-heart,.redux-metabox .ui-icon-heart{background-position:-208px -112px}.redux-container .ui-icon-star,.control-section-redux .ui-icon-star,.control-panel-redux .ui-icon-star,.redux-metabox .ui-icon-star{background-position:-224px -112px}.redux-container .ui-icon-link,.control-section-redux .ui-icon-link,.control-panel-redux .ui-icon-link,.redux-metabox .ui-icon-link{background-position:-240px -112px}.redux-container .ui-icon-cancel,.control-section-redux .ui-icon-cancel,.control-panel-redux .ui-icon-cancel,.redux-metabox .ui-icon-cancel{background-position:0 -128px}.redux-container .ui-icon-plus,.control-section-redux .ui-icon-plus,.control-panel-redux .ui-icon-plus,.redux-metabox .ui-icon-plus{background-position:-16px -128px}.redux-container .ui-icon-plusthick,.control-section-redux .ui-icon-plusthick,.control-panel-redux .ui-icon-plusthick,.redux-metabox .ui-icon-plusthick{background-position:-32px -128px}.redux-container .ui-icon-minus,.control-section-redux .ui-icon-minus,.control-panel-redux .ui-icon-minus,.redux-metabox .ui-icon-minus{background-position:-48px -128px}.redux-container .ui-icon-minusthick,.control-section-redux .ui-icon-minusthick,.control-panel-redux .ui-icon-minusthick,.redux-metabox .ui-icon-minusthick{background-position:-64px -128px}.redux-container .ui-icon-close,.control-section-redux .ui-icon-close,.control-panel-redux .ui-icon-close,.redux-metabox .ui-icon-close{background-position:-80px -128px}.redux-container .ui-icon-closethick,.control-section-redux .ui-icon-closethick,.control-panel-redux .ui-icon-closethick,.redux-metabox .ui-icon-closethick{background-position:-96px -128px}.redux-container .ui-icon-key,.control-section-redux .ui-icon-key,.control-panel-redux .ui-icon-key,.redux-metabox .ui-icon-key{background-position:-112px -128px}.redux-container .ui-icon-lightbulb,.control-section-redux .ui-icon-lightbulb,.control-panel-redux .ui-icon-lightbulb,.redux-metabox .ui-icon-lightbulb{background-position:-128px -128px}.redux-container .ui-icon-scissors,.control-section-redux .ui-icon-scissors,.control-panel-redux .ui-icon-scissors,.redux-metabox .ui-icon-scissors{background-position:-144px -128px}.redux-container .ui-icon-clipboard,.control-section-redux .ui-icon-clipboard,.control-panel-redux .ui-icon-clipboard,.redux-metabox .ui-icon-clipboard{background-position:-160px -128px}.redux-container .ui-icon-copy,.control-section-redux .ui-icon-copy,.control-panel-redux .ui-icon-copy,.redux-metabox .ui-icon-copy{background-position:-176px -128px}.redux-container .ui-icon-contact,.control-section-redux .ui-icon-contact,.control-panel-redux .ui-icon-contact,.redux-metabox .ui-icon-contact{background-position:-192px -128px}.redux-container .ui-icon-image,.control-section-redux .ui-icon-image,.control-panel-redux .ui-icon-image,.redux-metabox .ui-icon-image{background-position:-208px -128px}.redux-container .ui-icon-video,.control-section-redux .ui-icon-video,.control-panel-redux .ui-icon-video,.redux-metabox .ui-icon-video{background-position:-224px -128px}.redux-container .ui-icon-script,.control-section-redux .ui-icon-script,.control-panel-redux .ui-icon-script,.redux-metabox .ui-icon-script{background-position:-240px -128px}.redux-container .ui-icon-alert,.control-section-redux .ui-icon-alert,.control-panel-redux .ui-icon-alert,.redux-metabox .ui-icon-alert{background-position:0 -144px}.redux-container .ui-icon-info,.control-section-redux .ui-icon-info,.control-panel-redux .ui-icon-info,.redux-metabox .ui-icon-info{background-position:-16px -144px}.redux-container .ui-icon-notice,.control-section-redux .ui-icon-notice,.control-panel-redux .ui-icon-notice,.redux-metabox .ui-icon-notice{background-position:-32px -144px}.redux-container .ui-icon-help,.control-section-redux .ui-icon-help,.control-panel-redux .ui-icon-help,.redux-metabox .ui-icon-help{background-position:-48px -144px}.redux-container .ui-icon-check,.control-section-redux .ui-icon-check,.control-panel-redux .ui-icon-check,.redux-metabox .ui-icon-check{background-position:-64px -144px}.redux-container .ui-icon-bullet,.control-section-redux .ui-icon-bullet,.control-panel-redux .ui-icon-bullet,.redux-metabox .ui-icon-bullet{background-position:-80px -144px}.redux-container .ui-icon-radio-off,.control-section-redux .ui-icon-radio-off,.control-panel-redux .ui-icon-radio-off,.redux-metabox .ui-icon-radio-off{background-position:-96px -144px}.redux-container .ui-icon-radio-on,.control-section-redux .ui-icon-radio-on,.control-panel-redux .ui-icon-radio-on,.redux-metabox .ui-icon-radio-on{background-position:-112px -144px}.redux-container .ui-icon-pin-w,.control-section-redux .ui-icon-pin-w,.control-panel-redux .ui-icon-pin-w,.redux-metabox .ui-icon-pin-w{background-position:-128px -144px}.redux-container .ui-icon-pin-s,.control-section-redux .ui-icon-pin-s,.control-panel-redux .ui-icon-pin-s,.redux-metabox .ui-icon-pin-s{background-position:-144px -144px}.redux-container .ui-icon-play,.control-section-redux .ui-icon-play,.control-panel-redux .ui-icon-play,.redux-metabox .ui-icon-play{background-position:0 -160px}.redux-container .ui-icon-pause,.control-section-redux .ui-icon-pause,.control-panel-redux .ui-icon-pause,.redux-metabox .ui-icon-pause{background-position:-16px -160px}.redux-container .ui-icon-seek-next,.control-section-redux .ui-icon-seek-next,.control-panel-redux .ui-icon-seek-next,.redux-metabox .ui-icon-seek-next{background-position:-32px -160px}.redux-container .ui-icon-seek-prev,.control-section-redux .ui-icon-seek-prev,.control-panel-redux .ui-icon-seek-prev,.redux-metabox .ui-icon-seek-prev{background-position:-48px -160px}.redux-container .ui-icon-seek-end,.control-section-redux .ui-icon-seek-end,.control-panel-redux .ui-icon-seek-end,.redux-metabox .ui-icon-seek-end{background-position:-64px -160px}.redux-container .ui-icon-seek-start,.control-section-redux .ui-icon-seek-start,.control-panel-redux .ui-icon-seek-start,.redux-metabox .ui-icon-seek-start{background-position:-80px -160px}.redux-container .ui-icon-seek-first,.control-section-redux .ui-icon-seek-first,.control-panel-redux .ui-icon-seek-first,.redux-metabox .ui-icon-seek-first{background-position:-80px -160px}.redux-container .ui-icon-stop,.control-section-redux .ui-icon-stop,.control-panel-redux .ui-icon-stop,.redux-metabox .ui-icon-stop{background-position:-96px -160px}.redux-container .ui-icon-eject,.control-section-redux .ui-icon-eject,.control-panel-redux .ui-icon-eject,.redux-metabox .ui-icon-eject{background-position:-112px -160px}.redux-container .ui-icon-volume-off,.control-section-redux .ui-icon-volume-off,.control-panel-redux .ui-icon-volume-off,.redux-metabox .ui-icon-volume-off{background-position:-128px -160px}.redux-container .ui-icon-volume-on,.control-section-redux .ui-icon-volume-on,.control-panel-redux .ui-icon-volume-on,.redux-metabox .ui-icon-volume-on{background-position:-144px -160px}.redux-container .ui-icon-power,.control-section-redux .ui-icon-power,.control-panel-redux .ui-icon-power,.redux-metabox .ui-icon-power{background-position:0 -176px}.redux-container .ui-icon-signal-diag,.control-section-redux .ui-icon-signal-diag,.control-panel-redux .ui-icon-signal-diag,.redux-metabox .ui-icon-signal-diag{background-position:-16px -176px}.redux-container .ui-icon-signal,.control-section-redux .ui-icon-signal,.control-panel-redux .ui-icon-signal,.redux-metabox .ui-icon-signal{background-position:-32px -176px}.redux-container .ui-icon-battery-0,.control-section-redux .ui-icon-battery-0,.control-panel-redux .ui-icon-battery-0,.redux-metabox .ui-icon-battery-0{background-position:-48px -176px}.redux-container .ui-icon-battery-1,.control-section-redux .ui-icon-battery-1,.control-panel-redux .ui-icon-battery-1,.redux-metabox .ui-icon-battery-1{background-position:-64px -176px}.redux-container .ui-icon-battery-2,.control-section-redux .ui-icon-battery-2,.control-panel-redux .ui-icon-battery-2,.redux-metabox .ui-icon-battery-2{background-position:-80px -176px}.redux-container .ui-icon-battery-3,.control-section-redux .ui-icon-battery-3,.control-panel-redux .ui-icon-battery-3,.redux-metabox .ui-icon-battery-3{background-position:-96px -176px}.redux-container .ui-icon-circle-plus,.control-section-redux .ui-icon-circle-plus,.control-panel-redux .ui-icon-circle-plus,.redux-metabox .ui-icon-circle-plus{background-position:0 -192px}.redux-container .ui-icon-circle-minus,.control-section-redux .ui-icon-circle-minus,.control-panel-redux .ui-icon-circle-minus,.redux-metabox .ui-icon-circle-minus{background-position:-16px -192px}.redux-container .ui-icon-circle-close,.control-section-redux .ui-icon-circle-close,.control-panel-redux .ui-icon-circle-close,.redux-metabox .ui-icon-circle-close{background-position:-32px -192px}.redux-container .ui-icon-circle-triangle-e,.control-section-redux .ui-icon-circle-triangle-e,.control-panel-redux .ui-icon-circle-triangle-e,.redux-metabox .ui-icon-circle-triangle-e{background-position:-48px -192px}.redux-container .ui-icon-circle-triangle-s,.control-section-redux .ui-icon-circle-triangle-s,.control-panel-redux .ui-icon-circle-triangle-s,.redux-metabox .ui-icon-circle-triangle-s{background-position:-64px -192px}.redux-container .ui-icon-circle-triangle-w,.control-section-redux .ui-icon-circle-triangle-w,.control-panel-redux .ui-icon-circle-triangle-w,.redux-metabox .ui-icon-circle-triangle-w{background-position:-80px -192px}.redux-container .ui-icon-circle-triangle-n,.control-section-redux .ui-icon-circle-triangle-n,.control-panel-redux .ui-icon-circle-triangle-n,.redux-metabox .ui-icon-circle-triangle-n{background-position:-96px -192px}.redux-container .ui-icon-circle-arrow-e,.control-section-redux .ui-icon-circle-arrow-e,.control-panel-redux .ui-icon-circle-arrow-e,.redux-metabox .ui-icon-circle-arrow-e{background-position:-112px -192px}.redux-container .ui-icon-circle-arrow-s,.control-section-redux .ui-icon-circle-arrow-s,.control-panel-redux .ui-icon-circle-arrow-s,.redux-metabox .ui-icon-circle-arrow-s{background-position:-128px -192px}.redux-container .ui-icon-circle-arrow-w,.control-section-redux .ui-icon-circle-arrow-w,.control-panel-redux .ui-icon-circle-arrow-w,.redux-metabox .ui-icon-circle-arrow-w{background-position:-144px -192px}.redux-container .ui-icon-circle-arrow-n,.control-section-redux .ui-icon-circle-arrow-n,.control-panel-redux .ui-icon-circle-arrow-n,.redux-metabox .ui-icon-circle-arrow-n{background-position:-160px -192px}.redux-container .ui-icon-circle-zoomin,.control-section-redux .ui-icon-circle-zoomin,.control-panel-redux .ui-icon-circle-zoomin,.redux-metabox .ui-icon-circle-zoomin{background-position:-176px -192px}.redux-container .ui-icon-circle-zoomout,.control-section-redux .ui-icon-circle-zoomout,.control-panel-redux .ui-icon-circle-zoomout,.redux-metabox .ui-icon-circle-zoomout{background-position:-192px -192px}.redux-container .ui-icon-circle-check,.control-section-redux .ui-icon-circle-check,.control-panel-redux .ui-icon-circle-check,.redux-metabox .ui-icon-circle-check{background-position:-208px -192px}.redux-container .ui-icon-circlesmall-plus,.control-section-redux .ui-icon-circlesmall-plus,.control-panel-redux .ui-icon-circlesmall-plus,.redux-metabox .ui-icon-circlesmall-plus{background-position:0 -208px}.redux-container .ui-icon-circlesmall-minus,.control-section-redux .ui-icon-circlesmall-minus,.control-panel-redux .ui-icon-circlesmall-minus,.redux-metabox .ui-icon-circlesmall-minus{background-position:-16px -208px}.redux-container .ui-icon-circlesmall-close,.control-section-redux .ui-icon-circlesmall-close,.control-panel-redux .ui-icon-circlesmall-close,.redux-metabox .ui-icon-circlesmall-close{background-position:-32px -208px}.redux-container .ui-icon-squaresmall-plus,.control-section-redux .ui-icon-squaresmall-plus,.control-panel-redux .ui-icon-squaresmall-plus,.redux-metabox .ui-icon-squaresmall-plus{background-position:-48px -208px}.redux-container .ui-icon-squaresmall-minus,.control-section-redux .ui-icon-squaresmall-minus,.control-panel-redux .ui-icon-squaresmall-minus,.redux-metabox .ui-icon-squaresmall-minus{background-position:-64px -208px}.redux-container .ui-icon-squaresmall-close,.control-section-redux .ui-icon-squaresmall-close,.control-panel-redux .ui-icon-squaresmall-close,.redux-metabox .ui-icon-squaresmall-close{background-position:-80px -208px}.redux-container .ui-icon-grip-dotted-vertical,.control-section-redux .ui-icon-grip-dotted-vertical,.control-panel-redux .ui-icon-grip-dotted-vertical,.redux-metabox .ui-icon-grip-dotted-vertical{background-position:0 -224px}.redux-container .ui-icon-grip-dotted-horizontal,.control-section-redux .ui-icon-grip-dotted-horizontal,.control-panel-redux .ui-icon-grip-dotted-horizontal,.redux-metabox .ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.redux-container .ui-icon-grip-solid-vertical,.control-section-redux .ui-icon-grip-solid-vertical,.control-panel-redux .ui-icon-grip-solid-vertical,.redux-metabox .ui-icon-grip-solid-vertical{background-position:-32px -224px}.redux-container .ui-icon-grip-solid-horizontal,.control-section-redux .ui-icon-grip-solid-horizontal,.control-panel-redux .ui-icon-grip-solid-horizontal,.redux-metabox .ui-icon-grip-solid-horizontal{background-position:-48px -224px}.redux-container .ui-icon-gripsmall-diagonal-se,.control-section-redux .ui-icon-gripsmall-diagonal-se,.control-panel-redux .ui-icon-gripsmall-diagonal-se,.redux-metabox .ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.redux-container .ui-icon-grip-diagonal-se,.control-section-redux .ui-icon-grip-diagonal-se,.control-panel-redux .ui-icon-grip-diagonal-se,.redux-metabox .ui-icon-grip-diagonal-se{background-position:-80px -224px}.redux-container .ui-corner-all,.redux-container .ui-corner-top,.redux-container .ui-corner-left,.redux-container .ui-corner-tl,.control-section-redux .ui-corner-all,.control-section-redux .ui-corner-top,.control-section-redux .ui-corner-left,.control-section-redux .ui-corner-tl,.control-panel-redux .ui-corner-all,.control-panel-redux .ui-corner-top,.control-panel-redux .ui-corner-left,.control-panel-redux .ui-corner-tl,.redux-metabox .ui-corner-all,.redux-metabox .ui-corner-top,.redux-metabox .ui-corner-left,.redux-metabox .ui-corner-tl{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px}.redux-container .ui-corner-all,.redux-container .ui-corner-top,.redux-container .ui-corner-right,.redux-container .ui-corner-tr,.control-section-redux .ui-corner-all,.control-section-redux .ui-corner-top,.control-section-redux .ui-corner-right,.control-section-redux .ui-corner-tr,.control-panel-redux .ui-corner-all,.control-panel-redux .ui-corner-top,.control-panel-redux .ui-corner-right,.control-panel-redux .ui-corner-tr,.redux-metabox .ui-corner-all,.redux-metabox .ui-corner-top,.redux-metabox .ui-corner-right,.redux-metabox .ui-corner-tr{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px}.redux-container .ui-corner-all,.redux-container .ui-corner-bottom,.redux-container .ui-corner-left,.redux-container .ui-corner-bl,.control-section-redux .ui-corner-all,.control-section-redux .ui-corner-bottom,.control-section-redux .ui-corner-left,.control-section-redux .ui-corner-bl,.control-panel-redux .ui-corner-all,.control-panel-redux .ui-corner-bottom,.control-panel-redux .ui-corner-left,.control-panel-redux .ui-corner-bl,.redux-metabox .ui-corner-all,.redux-metabox .ui-corner-bottom,.redux-metabox .ui-corner-left,.redux-metabox .ui-corner-bl{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.redux-container .ui-corner-all,.redux-container .ui-corner-bottom,.redux-container .ui-corner-right,.redux-container .ui-corner-br,.control-section-redux .ui-corner-all,.control-section-redux .ui-corner-bottom,.control-section-redux .ui-corner-right,.control-section-redux .ui-corner-br,.control-panel-redux .ui-corner-all,.control-panel-redux .ui-corner-bottom,.control-panel-redux .ui-corner-right,.control-panel-redux .ui-corner-br,.redux-metabox .ui-corner-all,.redux-metabox .ui-corner-bottom,.redux-metabox .ui-corner-right,.redux-metabox .ui-corner-br{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.redux-container .ui-widget-overlay,.control-section-redux .ui-widget-overlay,.control-panel-redux .ui-widget-overlay,.redux-metabox .ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.30;filter:Alpha(Opacity=30)}.redux-container .ui-widget-shadow,.control-section-redux .ui-widget-shadow,.control-panel-redux .ui-widget-shadow,.redux-metabox .ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.30;filter:Alpha(Opacity=30);-moz-border-radius:8px;-khtml-border-radius:8px;-webkit-border-radius:8px;border-radius:8px}.redux-container .ui-accordion,.control-section-redux .ui-accordion,.control-panel-redux .ui-accordion,.redux-metabox .ui-accordion{width:100%}.redux-container .ui-accordion .ui-accordion-header,.control-section-redux .ui-accordion .ui-accordion-header,.control-panel-redux .ui-accordion .ui-accordion-header,.redux-metabox .ui-accordion .ui-accordion-header{cursor:pointer;position:relative;margin-top:1px;zoom:1;font-weight:bold}.redux-container .ui-accordion .ui-accordion-li-fix,.control-section-redux .ui-accordion .ui-accordion-li-fix,.control-panel-redux .ui-accordion .ui-accordion-li-fix,.redux-metabox .ui-accordion .ui-accordion-li-fix{display:inline}.redux-container .ui-accordion .ui-accordion-header-active,.control-section-redux .ui-accordion .ui-accordion-header-active,.control-panel-redux .ui-accordion .ui-accordion-header-active,.redux-metabox .ui-accordion .ui-accordion-header-active{border-bottom:0 !important}.redux-container .ui-accordion .ui-accordion-header a,.control-section-redux .ui-accordion .ui-accordion-header a,.control-panel-redux .ui-accordion .ui-accordion-header a,.redux-metabox .ui-accordion .ui-accordion-header a{display:block;font-size:1em;padding:.5em .5em .5em 1.7em}.redux-container .ui-accordion-icons .ui-accordion-header a,.control-section-redux .ui-accordion-icons .ui-accordion-header a,.control-panel-redux .ui-accordion-icons .ui-accordion-header a,.redux-metabox .ui-accordion-icons .ui-accordion-header a{padding-left:2.2em}.redux-container .ui-accordion .ui-accordion-header .ui-icon,.control-section-redux .ui-accordion .ui-accordion-header .ui-icon,.control-panel-redux .ui-accordion .ui-accordion-header .ui-icon,.redux-metabox .ui-accordion .ui-accordion-header .ui-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.redux-container .ui-accordion .ui-accordion-content,.control-section-redux .ui-accordion .ui-accordion-content,.control-panel-redux .ui-accordion .ui-accordion-content,.redux-metabox .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}.redux-container .ui-accordion .ui-accordion-content-active,.control-section-redux .ui-accordion .ui-accordion-content-active,.control-panel-redux .ui-accordion .ui-accordion-content-active,.redux-metabox .ui-accordion .ui-accordion-content-active{display:block}.redux-container .ui-button,.control-section-redux .ui-button,.control-panel-redux .ui-button,.redux-metabox .ui-button{cursor:pointer;display:inline-block;background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), color-stop(25%, #fff), to(#e6e6e6));background-image:-webkit-linear-gradient(#fff, #fff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #fff, #fff 25%, #e6e6e6);background-image:-ms-linear-gradient(#fff, #fff 25%, #e6e6e6);background-image:-o-linear-gradient(#fff, #fff 25%, #e6e6e6);background-image:linear-gradient(#fff, #fff 25%, #e6e6e6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);padding:5px 14px 6px;margin:0;text-shadow:0 1px 1px rgba(255,255,255,0.75);color:#333;font-size:13px;line-height:normal;border:1px solid #ccc;border-bottom-color:#bbb;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-webkit-transition:0.1s linear background-image;-moz-transition:0.1s linear background-image;-ms-transition:0.1s linear background-image;-o-transition:0.1s linear background-image;transition:0.1s linear background-image;overflow:visible}.redux-container .ui-button-primary,.control-section-redux .ui-button-primary,.control-panel-redux .ui-button-primary,.redux-metabox .ui-button-primary{color:#ffffff;background-color:#0064cd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));background-image:-moz-linear-gradient(top, #049cdb, #0064cd);background-image:-ms-linear-gradient(top, #049cdb, #0064cd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));background-image:-webkit-linear-gradient(top, #049cdb, #0064cd);background-image:-o-linear-gradient(top, #049cdb, #0064cd);background-image:linear-gradient(top, #049cdb, #0064cd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);text-shadow:0 -1px 0 rgba(0,0,0,0.25);border-color:#0064cd #0064cd #003f81;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25)}.redux-container .ui-button-success,.control-section-redux .ui-button-success,.control-panel-redux .ui-button-success,.redux-metabox .ui-button-success{color:#ffffff;background-color:#57a957;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);text-shadow:0 -1px 0 rgba(0,0,0,0.25);border-color:#57a957 #57a957 #3d773d;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25)}.redux-container .ui-button-error,.control-section-redux .ui-button-error,.control-panel-redux .ui-button-error,.redux-metabox .ui-button-error{color:#ffffff;background-color:#c43c35;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);text-shadow:0 -1px 0 rgba(0,0,0,0.25);border-color:#c43c35 #c43c35 #882a25;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25)}.redux-container .ui-button-icon-only,.control-section-redux .ui-button-icon-only,.control-panel-redux .ui-button-icon-only,.redux-metabox .ui-button-icon-only{width:2.2em}.redux-container .ui-button-icons-only,.control-section-redux .ui-button-icons-only,.control-panel-redux .ui-button-icons-only,.redux-metabox .ui-button-icons-only{width:3.4em}.redux-container button.ui-button-icons-only,.control-section-redux button.ui-button-icons-only,.control-panel-redux button.ui-button-icons-only,.redux-metabox button.ui-button-icons-only{width:3.7em}.redux-container .ui-button .ui-button-text,.control-section-redux .ui-button .ui-button-text,.control-panel-redux .ui-button .ui-button-text,.redux-metabox .ui-button .ui-button-text{display:block}.redux-container .ui-button-icon-only .ui-button-text,.redux-container .ui-button-icons-only .ui-button-text,.control-section-redux .ui-button-icon-only .ui-button-text,.control-section-redux .ui-button-icons-only .ui-button-text,.control-panel-redux .ui-button-icon-only .ui-button-text,.control-panel-redux .ui-button-icons-only .ui-button-text,.redux-metabox .ui-button-icon-only .ui-button-text,.redux-metabox .ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px;display:none}.redux-container .ui-button-text-icon-primary .ui-button-text,.redux-container .ui-button-text-icons .ui-button-text,.control-section-redux .ui-button-text-icon-primary .ui-button-text,.control-section-redux .ui-button-text-icons .ui-button-text,.control-panel-redux .ui-button-text-icon-primary .ui-button-text,.control-panel-redux .ui-button-text-icons .ui-button-text,.redux-metabox .ui-button-text-icon-primary .ui-button-text,.redux-metabox .ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.redux-container .ui-button-text-icon-secondary .ui-button-text,.redux-container .ui-button-text-icons .ui-button-text,.control-section-redux .ui-button-text-icon-secondary .ui-button-text,.control-section-redux .ui-button-text-icons .ui-button-text,.control-panel-redux .ui-button-text-icon-secondary .ui-button-text,.control-panel-redux .ui-button-text-icons .ui-button-text,.redux-metabox .ui-button-text-icon-secondary .ui-button-text,.redux-metabox .ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.redux-container .ui-button-text-icons .ui-button-text,.control-section-redux .ui-button-text-icons .ui-button-text,.control-panel-redux .ui-button-text-icons .ui-button-text,.redux-metabox .ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}.redux-container .ui-button-icon-only .ui-icon,.redux-container .ui-button-text-icon-primary .ui-icon,.redux-container .ui-button-text-icon-secondary .ui-icon,.redux-container .ui-button-text-icons .ui-icon,.redux-container .ui-button-icons-only .ui-icon,.control-section-redux .ui-button-icon-only .ui-icon,.control-section-redux .ui-button-text-icon-primary .ui-icon,.control-section-redux .ui-button-text-icon-secondary .ui-icon,.control-section-redux .ui-button-text-icons .ui-icon,.control-section-redux .ui-button-icons-only .ui-icon,.control-panel-redux .ui-button-icon-only .ui-icon,.control-panel-redux .ui-button-text-icon-primary .ui-icon,.control-panel-redux .ui-button-text-icon-secondary .ui-icon,.control-panel-redux .ui-button-text-icons .ui-icon,.control-panel-redux .ui-button-icons-only .ui-icon,.redux-metabox .ui-button-icon-only .ui-icon,.redux-metabox .ui-button-text-icon-primary .ui-icon,.redux-metabox .ui-button-text-icon-secondary .ui-icon,.redux-metabox .ui-button-text-icons .ui-icon,.redux-metabox .ui-button-icons-only .ui-icon{top:50%;margin-top:-3px;margin-bottom:3px}.redux-container .ui-button-icon-only .ui-icon,.control-section-redux .ui-button-icon-only .ui-icon,.control-panel-redux .ui-button-icon-only .ui-icon,.redux-metabox .ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.redux-container .ui-button-text-icon-primary .ui-button-icon-primary,.redux-container .ui-button-text-icons .ui-button-icon-primary,.redux-container .ui-button-icons-only .ui-button-icon-primary,.control-section-redux .ui-button-text-icon-primary .ui-button-icon-primary,.control-section-redux .ui-button-text-icons .ui-button-icon-primary,.control-section-redux .ui-button-icons-only .ui-button-icon-primary,.control-panel-redux .ui-button-text-icon-primary .ui-button-icon-primary,.control-panel-redux .ui-button-text-icons .ui-button-icon-primary,.control-panel-redux .ui-button-icons-only .ui-button-icon-primary,.redux-metabox .ui-button-text-icon-primary .ui-button-icon-primary,.redux-metabox .ui-button-text-icons .ui-button-icon-primary,.redux-metabox .ui-button-icons-only .ui-button-icon-primary{left:.5em}.redux-container .ui-button-text-icon-secondary .ui-button-icon-secondary,.redux-container .ui-button-text-icons .ui-button-icon-secondary,.redux-container .ui-button-icons-only .ui-button-icon-secondary,.control-section-redux .ui-button-text-icon-secondary .ui-button-icon-secondary,.control-section-redux .ui-button-text-icons .ui-button-icon-secondary,.control-section-redux .ui-button-icons-only .ui-button-icon-secondary,.control-panel-redux .ui-button-text-icon-secondary .ui-button-icon-secondary,.control-panel-redux .ui-button-text-icons .ui-button-icon-secondary,.control-panel-redux .ui-button-icons-only .ui-button-icon-secondary,.redux-metabox .ui-button-text-icon-secondary .ui-button-icon-secondary,.redux-metabox .ui-button-text-icons .ui-button-icon-secondary,.redux-metabox .ui-button-icons-only .ui-button-icon-secondary{right:.5em}.redux-container .ui-button-text-icons .ui-button-icon-secondary,.redux-container .ui-button-icons-only .ui-button-icon-secondary,.control-section-redux .ui-button-text-icons .ui-button-icon-secondary,.control-section-redux .ui-button-icons-only .ui-button-icon-secondary,.control-panel-redux .ui-button-text-icons .ui-button-icon-secondary,.control-panel-redux .ui-button-icons-only .ui-button-icon-secondary,.redux-metabox .ui-button-text-icons .ui-button-icon-secondary,.redux-metabox .ui-button-icons-only .ui-button-icon-secondary{right:.5em}.redux-container .ui-buttonset,.control-section-redux .ui-buttonset,.control-panel-redux .ui-buttonset,.redux-metabox .ui-buttonset{margin-right:7px}.redux-container .ui-buttonset .ui-state-active,.control-section-redux .ui-buttonset .ui-state-active,.control-panel-redux .ui-buttonset .ui-state-active,.redux-metabox .ui-buttonset .ui-state-active{color:#ffffff;background-color:#0064cd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));background-image:-moz-linear-gradient(top, #049cdb, #0064cd);background-image:-ms-linear-gradient(top, #049cdb, #0064cd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));background-image:-webkit-linear-gradient(top, #049cdb, #0064cd);background-image:-o-linear-gradient(top, #049cdb, #0064cd);background-image:linear-gradient(top, #049cdb, #0064cd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);text-shadow:0 -1px 0 rgba(0,0,0,0.25);border-color:#0064cd #0064cd #003f81;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25)}.redux-container .ui-buttonset .ui-button,.control-section-redux .ui-buttonset .ui-button,.control-panel-redux .ui-buttonset .ui-button,.redux-metabox .ui-buttonset .ui-button{margin-left:0;margin-right:0}.redux-container button.ui-button::-moz-focus-inner,.control-section-redux button.ui-button::-moz-focus-inner,.control-panel-redux button.ui-button::-moz-focus-inner,.redux-metabox button.ui-button::-moz-focus-inner{border:0;padding:0}.redux-container .ui-datepicker,.control-section-redux .ui-datepicker,.control-panel-redux .ui-datepicker,.redux-metabox .ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.redux-container .ui-datepicker .ui-datepicker-header,.control-section-redux .ui-datepicker .ui-datepicker-header,.control-panel-redux .ui-datepicker .ui-datepicker-header,.redux-metabox .ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0;border:0px;font-weight:bold;width:100%;padding:4px 0;background-color:#f5f5f5;color:#808080}.redux-container .ui-datepicker .ui-datepicker-prev,.redux-container .ui-datepicker .ui-datepicker-next,.control-section-redux .ui-datepicker .ui-datepicker-prev,.control-section-redux .ui-datepicker .ui-datepicker-next,.control-panel-redux .ui-datepicker .ui-datepicker-prev,.control-panel-redux .ui-datepicker .ui-datepicker-next,.redux-metabox .ui-datepicker .ui-datepicker-prev,.redux-metabox .ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.redux-container .ui-datepicker .ui-datepicker-prev,.control-section-redux .ui-datepicker .ui-datepicker-prev,.control-panel-redux .ui-datepicker .ui-datepicker-prev,.redux-metabox .ui-datepicker .ui-datepicker-prev{left:2px}.redux-container .ui-datepicker .ui-datepicker-next,.control-section-redux .ui-datepicker .ui-datepicker-next,.control-panel-redux .ui-datepicker .ui-datepicker-next,.redux-metabox .ui-datepicker .ui-datepicker-next{right:2px}.redux-container .ui-datepicker .ui-datepicker-prev span,.redux-container .ui-datepicker .ui-datepicker-next span,.control-section-redux .ui-datepicker .ui-datepicker-prev span,.control-section-redux .ui-datepicker .ui-datepicker-next span,.control-panel-redux .ui-datepicker .ui-datepicker-prev span,.control-panel-redux .ui-datepicker .ui-datepicker-next span,.redux-metabox .ui-datepicker .ui-datepicker-prev span,.redux-metabox .ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.redux-container .ui-datepicker .ui-datepicker-title,.control-section-redux .ui-datepicker .ui-datepicker-title,.control-panel-redux .ui-datepicker .ui-datepicker-title,.redux-metabox .ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.redux-container .ui-datepicker .ui-datepicker-title select,.control-section-redux .ui-datepicker .ui-datepicker-title select,.control-panel-redux .ui-datepicker .ui-datepicker-title select,.redux-metabox .ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.redux-container .ui-datepicker select.ui-datepicker-month-year,.control-section-redux .ui-datepicker select.ui-datepicker-month-year,.control-panel-redux .ui-datepicker select.ui-datepicker-month-year,.redux-metabox .ui-datepicker select.ui-datepicker-month-year{width:100%}.redux-container .ui-datepicker select.ui-datepicker-month,.redux-container .ui-datepicker select.ui-datepicker-year,.control-section-redux .ui-datepicker select.ui-datepicker-month,.control-section-redux .ui-datepicker select.ui-datepicker-year,.control-panel-redux .ui-datepicker select.ui-datepicker-month,.control-panel-redux .ui-datepicker select.ui-datepicker-year,.redux-metabox .ui-datepicker select.ui-datepicker-month,.redux-metabox .ui-datepicker select.ui-datepicker-year{width:49%}.redux-container .ui-datepicker table,.control-section-redux .ui-datepicker table,.control-panel-redux .ui-datepicker table,.redux-metabox .ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.redux-container .ui-datepicker th,.control-section-redux .ui-datepicker th,.control-panel-redux .ui-datepicker th,.redux-metabox .ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.redux-container .ui-datepicker td,.control-section-redux .ui-datepicker td,.control-panel-redux .ui-datepicker td,.redux-metabox .ui-datepicker td{border:0;padding:1px}.redux-container .ui-datepicker td span,.redux-container .ui-datepicker td a,.control-section-redux .ui-datepicker td span,.control-section-redux .ui-datepicker td a,.control-panel-redux .ui-datepicker td span,.control-panel-redux .ui-datepicker td a,.redux-metabox .ui-datepicker td span,.redux-metabox .ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.redux-container .ui-datepicker .ui-datepicker-buttonpane,.control-section-redux .ui-datepicker .ui-datepicker-buttonpane,.control-panel-redux .ui-datepicker .ui-datepicker-buttonpane,.redux-metabox .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}.redux-container .ui-datepicker .ui-datepicker-buttonpane button,.control-section-redux .ui-datepicker .ui-datepicker-buttonpane button,.control-panel-redux .ui-datepicker .ui-datepicker-buttonpane button,.redux-metabox .ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.redux-container .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current,.control-section-redux .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current,.control-panel-redux .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current,.redux-metabox .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.redux-container .ui-datepicker.ui-datepicker-multi,.control-section-redux .ui-datepicker.ui-datepicker-multi,.control-panel-redux .ui-datepicker.ui-datepicker-multi,.redux-metabox .ui-datepicker.ui-datepicker-multi{width:auto}.redux-container .ui-datepicker-multi .ui-datepicker-group,.control-section-redux .ui-datepicker-multi .ui-datepicker-group,.control-panel-redux .ui-datepicker-multi .ui-datepicker-group,.redux-metabox .ui-datepicker-multi .ui-datepicker-group{float:left}.redux-container .ui-datepicker-multi .ui-datepicker-group table,.control-section-redux .ui-datepicker-multi .ui-datepicker-group table,.control-panel-redux .ui-datepicker-multi .ui-datepicker-group table,.redux-metabox .ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.redux-container .ui-datepicker-multi-2 .ui-datepicker-group,.control-section-redux .ui-datepicker-multi-2 .ui-datepicker-group,.control-panel-redux .ui-datepicker-multi-2 .ui-datepicker-group,.redux-metabox .ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.redux-container .ui-datepicker-multi-3 .ui-datepicker-group,.control-section-redux .ui-datepicker-multi-3 .ui-datepicker-group,.control-panel-redux .ui-datepicker-multi-3 .ui-datepicker-group,.redux-metabox .ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.redux-container .ui-datepicker-multi-4 .ui-datepicker-group,.control-section-redux .ui-datepicker-multi-4 .ui-datepicker-group,.control-panel-redux .ui-datepicker-multi-4 .ui-datepicker-group,.redux-metabox .ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.redux-container .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.control-section-redux .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.control-panel-redux .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.redux-metabox .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header{border-left-width:0}.redux-container .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header,.control-section-redux .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header,.control-panel-redux .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header,.redux-metabox .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.redux-container .ui-datepicker-multi .ui-datepicker-buttonpane,.control-section-redux .ui-datepicker-multi .ui-datepicker-buttonpane,.control-panel-redux .ui-datepicker-multi .ui-datepicker-buttonpane,.redux-metabox .ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.redux-container .ui-datepicker-row-break,.control-section-redux .ui-datepicker-row-break,.control-panel-redux .ui-datepicker-row-break,.redux-metabox .ui-datepicker-row-break{clear:both;width:100%;font-size:0em}.redux-container .ui-datepicker-rtl,.control-section-redux .ui-datepicker-rtl,.control-panel-redux .ui-datepicker-rtl,.redux-metabox .ui-datepicker-rtl{direction:rtl}.redux-container .ui-datepicker-rtl .ui-datepicker-prev,.control-section-redux .ui-datepicker-rtl .ui-datepicker-prev,.control-panel-redux .ui-datepicker-rtl .ui-datepicker-prev,.redux-metabox .ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.redux-container .ui-datepicker-rtl .ui-datepicker-next,.control-section-redux .ui-datepicker-rtl .ui-datepicker-next,.control-panel-redux .ui-datepicker-rtl .ui-datepicker-next,.redux-metabox .ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.redux-container .ui-datepicker-rtl .ui-datepicker-prev:hover,.control-section-redux .ui-datepicker-rtl .ui-datepicker-prev:hover,.control-panel-redux .ui-datepicker-rtl .ui-datepicker-prev:hover,.redux-metabox .ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.redux-container .ui-datepicker-rtl .ui-datepicker-next:hover,.control-section-redux .ui-datepicker-rtl .ui-datepicker-next:hover,.control-panel-redux .ui-datepicker-rtl .ui-datepicker-next:hover,.redux-metabox .ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.redux-container .ui-datepicker-rtl .ui-datepicker-buttonpane,.control-section-redux .ui-datepicker-rtl .ui-datepicker-buttonpane,.control-panel-redux .ui-datepicker-rtl .ui-datepicker-buttonpane,.redux-metabox .ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.redux-container .ui-datepicker-rtl .ui-datepicker-buttonpane button,.control-section-redux .ui-datepicker-rtl .ui-datepicker-buttonpane button,.control-panel-redux .ui-datepicker-rtl .ui-datepicker-buttonpane button,.redux-metabox .ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.redux-container .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.control-section-redux .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.control-panel-redux .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.redux-metabox .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current{float:right}.redux-container .ui-datepicker-rtl .ui-datepicker-group,.control-section-redux .ui-datepicker-rtl .ui-datepicker-group,.control-panel-redux .ui-datepicker-rtl .ui-datepicker-group,.redux-metabox .ui-datepicker-rtl .ui-datepicker-group{float:right}.redux-container .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.control-section-redux .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.control-panel-redux .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.redux-metabox .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header{border-right-width:0;border-left-width:1px}.redux-container .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header,.control-section-redux .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header,.control-panel-redux .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header,.redux-metabox .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.redux-container .ui-datepicker-cover,.control-section-redux .ui-datepicker-cover,.control-panel-redux .ui-datepicker-cover,.redux-metabox .ui-datepicker-cover{display:none;display:block;position:absolute;z-index:-1;filter:mask();top:-4px;left:-4px;width:200px;height:200px}.redux-container .ui-datepicker th,.control-section-redux .ui-datepicker th,.control-panel-redux .ui-datepicker th,.redux-metabox .ui-datepicker th{font-weight:bold;color:gray}.redux-container .ui-datepicker-today a:hover,.control-section-redux .ui-datepicker-today a:hover,.control-panel-redux .ui-datepicker-today a:hover,.redux-metabox .ui-datepicker-today a:hover{background-color:#808080;color:#ffffff}.redux-container .ui-datepicker-today a,.control-section-redux .ui-datepicker-today a,.control-panel-redux .ui-datepicker-today a,.redux-metabox .ui-datepicker-today a{background-color:#BFBFBF;cursor:pointer;padding:0 4px;margin-bottom:0px}.redux-container .ui-datepicker td a,.control-section-redux .ui-datepicker td a,.control-panel-redux .ui-datepicker td a,.redux-metabox .ui-datepicker td a{margin-bottom:0px;border:0px}.redux-container .ui-datepicker td:hover,.control-section-redux .ui-datepicker td:hover,.control-panel-redux .ui-datepicker td:hover,.redux-metabox .ui-datepicker td:hover{color:#ffffff}.redux-container .ui-datepicker td .ui-state-default,.control-section-redux .ui-datepicker td .ui-state-default,.control-panel-redux .ui-datepicker td .ui-state-default,.redux-metabox .ui-datepicker td .ui-state-default{border:0px;background:none;margin-bottom:0px;padding:5px;color:gray;text-align:center;filter:none}.redux-container .ui-datepicker td .ui-state-active,.control-section-redux .ui-datepicker td .ui-state-active,.control-panel-redux .ui-datepicker td .ui-state-active,.redux-metabox .ui-datepicker td .ui-state-active{background:#BFBFBF;margin-bottom:0px;font-size:normal;text-shadow:0px;color:#ffffff;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.redux-container .ui-datepicker td .ui-state-hover,.control-section-redux .ui-datepicker td .ui-state-hover,.control-panel-redux .ui-datepicker td .ui-state-hover,.redux-metabox .ui-datepicker td .ui-state-hover{color:#ffffff;background:#0064cd;background-color:#0064cd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));background-image:-moz-linear-gradient(top, #049cdb, #0064cd);background-image:-ms-linear-gradient(top, #049cdb, #0064cd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));background-image:-webkit-linear-gradient(top, #049cdb, #0064cd);background-image:-o-linear-gradient(top, #049cdb, #0064cd);background-image:linear-gradient(top, #049cdb, #0064cd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);text-shadow:0 -1px 0 rgba(0,0,0,0.25);border-color:#0064cd #0064cd #003f81;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);-webkit-border-radius:4px;-moz-border-radius:4px;-khtml-border-radius:4px;border-radius:4px}.redux-container .ui-widget-content,.control-section-redux .ui-widget-content,.control-panel-redux .ui-widget-content,.redux-metabox .ui-widget-content{border:1px solid #dfdfdf}.redux-container .ui-datepicker table,.control-section-redux .ui-datepicker table,.control-panel-redux .ui-datepicker table,.redux-metabox .ui-datepicker table{background:#fff}.redux-container .placeholder,.control-section-redux .placeholder,.control-panel-redux .placeholder,.redux-metabox .placeholder{background:#f9f9f9 !important;border:1px dashed #bbb !important}.wp-customizer #ui-datepicker-div{z-index:999999 !important} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/jquery-ui-1.10.0.custom.less b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/jquery-ui-1.10.0.custom.less deleted file mode 100755 index c49bc414..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/jquery-ui-1.10.0.custom.less +++ /dev/null @@ -1,793 +0,0 @@ -/*! - * jQuery UI Bootstrap (0.5) - * http://addyosmani.github.com/jquery-ui-bootstrap - * - * Copyright 2012 - 2013, Addy Osmani - * Dual licensed under the MIT or GPL Version 2 licenses. - * - * Portions copyright jQuery UI & Twitter Bootstrap - */ - -.redux-main { - /* 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 - ----------------------------------*/ - - - /* - * jQuery UI CSS Framework 1.10.0 - * - * Copyright 2013, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * - * - * To view and modify this theme, visit http://jqueryui.com/themeroller/ - */ - - /* Component containers - ----------------------------------*/ - .ui-widget { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size:13px; } - .ui-widget .ui-widget { font-size: 1em; } - .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 1em; } - .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_75_ffffff_1x400.png) 50% 50% repeat-x; color: #404040; } - .ui-widget-content a { color: #404040; } - .ui-widget-header { - font-weight:bold; - border-color: #0064cd #0064cd #003f81; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border:1px solid #666; - } - .ui-widget-header a { color: #222222; } - - /* Interaction states - ----------------------------------*/ - .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { - - background-color: #e6e6e6; - background-repeat: no-repeat; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); - background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); - - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - - color: #333; - font-size: 13px; - line-height: normal; - border: 1px solid #ccc; - border-bottom-color: #bbb; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -webkit-transition: 0.1s linear background-image; - -moz-transition: 0.1s linear background-image; - -ms-transition: 0.1s linear background-image; - -o-transition: 0.1s linear background-image; - transition: 0.1s linear background-image; - overflow: visible; - - } - - - .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-position: 0 -15px; - color: #333; - text-decoration: none; - } - - .ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited { color: #212121; text-decoration: none; } - .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; font-weight: normal; color: #212121; } - .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } - .ui-widget :active { outline: none; } - - /* Interaction Cues - ----------------------------------*/ - - - .ui-state-highlight p, .ui-state-error p, .ui-state-default p{ - font-size: 13px; - font-weight: normal; - line-height: 18px; - margin:7px 15px; - } - .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { - - - position: relative; - margin-bottom: 18px; - color: #404040; - background-color: #eedc94; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94)); - background-image: -moz-linear-gradient(top, #fceec1, #eedc94); - background-image: -ms-linear-gradient(top, #fceec1, #eedc94); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94)); - background-image: -webkit-linear-gradient(top, #fceec1, #eedc94); - background-image: -o-linear-gradient(top, #fceec1, #eedc94); - background-image: linear-gradient(top, #fceec1, #eedc94); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #eedc94 #eedc94 #e4c652; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - border-width: 1px; - border-style: solid; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - - - } - .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 { - - - position: relative; - margin-bottom: 18px; - color: #ffffff; - border-width: 1px; - border-style: solid; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - background-color: #c43c35; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35)); - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(top, #ee5f5b, #c43c35); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #c43c35 #c43c35 #882a25; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - - - } - .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; } - .ui-state-disabled .ui-icon { filter:Alpha(Opacity=35); } /* For IE8 - See #6059 */ - - - /* Icons - ----------------------------------*/ - - /* states and images */ - .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } - .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } - .ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } - .ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } - .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } - .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } - .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } - .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_f6cf3b_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 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; - -webkit-border-top-left-radius: 4px; - -khtml-border-top-left-radius: 4px; - border-top-left-radius: 4px; - } - .ui-corner-all, - .ui-corner-top, - .ui-corner-right, - .ui-corner-tr { - -moz-border-radius-topright: 4px; - -webkit-border-top-right-radius: 4px; - -khtml-border-top-right-radius: 4px; - border-top-right-radius: 4px; - } - .ui-corner-all, - .ui-corner-bottom, - .ui-corner-left, - .ui-corner-bl { - -moz-border-radius-bottomleft: 4px; - -webkit-border-bottom-left-radius: 4px; - -khtml-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - } - .ui-corner-all, - .ui-corner-bottom, - .ui-corner-right, - .ui-corner-br { - -moz-border-radius-bottomright: 4px; - -webkit-border-bottom-right-radius: 4px; - -khtml-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - } - - - /* Overlays */ - - .ui-widget-overlay { - background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; - opacity: .30; - filter:Alpha(Opacity=30); - } - - .ui-widget-shadow { - margin: -8px 0 0 -8px; - padding: 8px; - background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; - opacity: .30;filter:Alpha(Opacity=30); - -moz-border-radius: 8px; - -khtml-border-radius: 8px; - -webkit-border-radius: 8px; - border-radius: 8px; - } - - /* - * jQuery UI Accordion 1.10.0 - * - * Copyright 2013, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://jqueryui.com/accordion/ - */ - - /* IE/Win - Fix animation bug - #4615 */ - - .ui-accordion { - width: 100%; - } - .ui-accordion .ui-accordion-header { - cursor: pointer; - position: relative; - margin-top: 1px; - zoom: 1; - font-weight:bold; - } - .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 1.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 Button 1.10.0 - * - * Copyright 2013, 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 { - - cursor: pointer; - display: inline-block; - background-color: #e6e6e6; - background-repeat: no-repeat; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); - background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); - padding: 5px 14px 6px; - margin: 0; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - color: #333; - font-size: 13px; - line-height: normal; - border: 1px solid #ccc; - border-bottom-color: #bbb; - - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -webkit-transition: 0.1s linear background-image; - -moz-transition: 0.1s linear background-image; - -ms-transition: 0.1s linear background-image; - -o-transition: 0.1s linear background-image; - transition: 0.1s linear background-image; - overflow: visible; - } /* the overflow property removes extra width in IE */ - - .ui-button-primary { - color: #ffffff; - background-color: #0064cd; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd)); - background-image: -moz-linear-gradient(top, #049cdb, #0064cd); - background-image: -ms-linear-gradient(top, #049cdb, #0064cd); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd)); - background-image: -webkit-linear-gradient(top, #049cdb, #0064cd); - background-image: -o-linear-gradient(top, #049cdb, #0064cd); - background-image: linear-gradient(top, #049cdb, #0064cd); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #0064cd #0064cd #003f81; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - } - - - .ui-button-success{ - color:#ffffff; - background-color: #57a957; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957)); - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -ms-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(top, #62c462, #57a957); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #57a957 #57a957 #3d773d; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - } - - .ui-button-error{ - color:#ffffff; - background-color: #c43c35; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35)); - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(top, #ee5f5b, #c43c35); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #c43c35 #c43c35 #882a25; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - } - - .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 { } /* 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; } - .ui-button-text-only .ui-button-text { } - .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; /*tempfix*/ display:none;} - .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 { top: 50%; margin-top:-3px; margin-bottom:3px; } - .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-state-active { - color: #ffffff; - background-color: #0064cd; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd)); - background-image: -moz-linear-gradient(top, #049cdb, #0064cd); - background-image: -ms-linear-gradient(top, #049cdb, #0064cd); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd)); - background-image: -webkit-linear-gradient(top, #049cdb, #0064cd); - background-image: -o-linear-gradient(top, #049cdb, #0064cd); - background-image: linear-gradient(top, #049cdb, #0064cd); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #0064cd #0064cd #003f81; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - } - .ui-buttonset .ui-button { margin-left: 0; margin-right: 0; } - - /* workarounds */ - button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ - - /* - * jQuery UI Datepicker 1.9.0 - * - * Copyright 2012-10-11, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://jqueryui.com/datepicker/ - */ - .ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } - .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; border:0px; font-weight: bold; width: 100%; padding: 4px 0; background-color: #f5f5f5; color: #808080; } - .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*/ - } - - .ui-datepicker th{ - font-weight: bold; - color: gray; - } - - .ui-datepicker-today a:hover{ - background-color: #808080; - color: #ffffff; - - } - .ui-datepicker-today a{ - background-color: #BFBFBF; - cursor: pointer; - padding: 0 4px; - margin-bottom:0px; - - } - - - .ui-datepicker td a{ - margin-bottom:0px; - border:0px; - } - - .ui-datepicker td:hover{ - color: #ffffff; - } - - .ui-datepicker td .ui-state-default { - border:0px; - background:none; - margin-bottom:0px; - padding:5px; - color:gray; - text-align: center; - filter:none; - } - - - .ui-datepicker td .ui-state-active{ - background:#BFBFBF; - margin-bottom:0px; - font-size:normal; - text-shadow: 0px; - color: #ffffff; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - - .ui-datepicker td .ui-state-hover { - color: #ffffff; - background: #0064cd; - background-color: #0064cd; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd)); - background-image: -moz-linear-gradient(top, #049cdb, #0064cd); - background-image: -ms-linear-gradient(top, #049cdb, #0064cd); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd)); - background-image: -webkit-linear-gradient(top, #049cdb, #0064cd); - background-image: -o-linear-gradient(top, #049cdb, #0064cd); - background-image: linear-gradient(top, #049cdb, #0064cd); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #0064cd #0064cd #003f81; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - } - - .ui-widget-content { - border: 1px solid #dfdfdf; - } - .ui-datepicker table { background: #fff; } - - .placeholder { - background:#f9f9f9 !important; - border: 1px dashed #bbb !important; - } - -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/jquery-ui-1.10.0.custom.scss b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/jquery-ui-1.10.0.custom.scss deleted file mode 100755 index 1b81be8b..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/jquery-ui-bootstrap/jquery-ui-1.10.0.custom.scss +++ /dev/null @@ -1,799 +0,0 @@ -/*! - * jQuery UI Bootstrap (0.5) - * http://addyosmani.github.com/jquery-ui-bootstrap - * - * Copyright 2012 - 2013, Addy Osmani - * Dual licensed under the MIT or GPL Version 2 licenses. - * - * Portions copyright jQuery UI & Twitter Bootstrap - */ - -.redux-container, .control-section-redux, .control-panel-redux, .redux-metabox { - /* 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 - ----------------------------------*/ - - - /* - * jQuery UI CSS Framework 1.10.0 - * - * Copyright 2013, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * - * - * To view and modify this theme, visit http://jqueryui.com/themeroller/ - */ - - /* Component containers - ----------------------------------*/ - //.ui-widget { font-size:13px; } - //.ui-widget .ui-widget { font-size: 1em; } - //.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-size: 1em; } - .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_75_ffffff_1x400.png) 50% 50% repeat-x; color: #404040; } - //.ui-widget-content a { color: #404040; } - .ui-widget-header { - font-weight:bold; - border-color: #0064cd #0064cd #003f81; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border:1px solid #666; - } - .ui-widget-header a { color: #222222; } - - /* Interaction states - ----------------------------------*/ - .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { - - background-color: #e6e6e6; - background-repeat: no-repeat; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); - background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); - - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - - color: #333; - font-size: 13px; - line-height: normal; - border: 1px solid #ccc; - border-bottom-color: #bbb; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -webkit-transition: 0.1s linear background-image; - -moz-transition: 0.1s linear background-image; - -ms-transition: 0.1s linear background-image; - -o-transition: 0.1s linear background-image; - transition: 0.1s linear background-image; - overflow: visible; - - } - - - .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-position: 0 -15px; - color: #333; - text-decoration: none; - } - - .ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited { color: #212121; text-decoration: none; } - .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; font-weight: normal; color: #212121; } - .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } - .ui-widget :active { outline: none; } - - /* Interaction Cues - ----------------------------------*/ - - - .ui-state-highlight p, .ui-state-error p, .ui-state-default p{ - font-size: 13px; - font-weight: normal; - line-height: 18px; - margin:7px 15px; - } - .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { - - - position: relative; - margin-bottom: 18px; - color: #404040; - background-color: #eedc94; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94)); - background-image: -moz-linear-gradient(top, #fceec1, #eedc94); - background-image: -ms-linear-gradient(top, #fceec1, #eedc94); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94)); - background-image: -webkit-linear-gradient(top, #fceec1, #eedc94); - background-image: -o-linear-gradient(top, #fceec1, #eedc94); - background-image: linear-gradient(top, #fceec1, #eedc94); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #eedc94 #eedc94 #e4c652; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - border-width: 1px; - border-style: solid; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - - - } - .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 { - - - position: relative; - margin-bottom: 18px; - color: #ffffff; - border-width: 1px; - border-style: solid; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - background-color: #c43c35; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35)); - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(top, #ee5f5b, #c43c35); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #c43c35 #c43c35 #882a25; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - - - } - .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; } - .ui-state-disabled .ui-icon { filter:Alpha(Opacity=35); } /* For IE8 - See #6059 */ - - - /* Icons - ----------------------------------*/ - - /* states and images */ - .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } - .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } - .ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } - .ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } - .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } - .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } - .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } - .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_f6cf3b_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 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; - -webkit-border-top-left-radius: 4px; - -khtml-border-top-left-radius: 4px; - border-top-left-radius: 4px; - } - .ui-corner-all, - .ui-corner-top, - .ui-corner-right, - .ui-corner-tr { - -moz-border-radius-topright: 4px; - -webkit-border-top-right-radius: 4px; - -khtml-border-top-right-radius: 4px; - border-top-right-radius: 4px; - } - .ui-corner-all, - .ui-corner-bottom, - .ui-corner-left, - .ui-corner-bl { - -moz-border-radius-bottomleft: 4px; - -webkit-border-bottom-left-radius: 4px; - -khtml-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - } - .ui-corner-all, - .ui-corner-bottom, - .ui-corner-right, - .ui-corner-br { - -moz-border-radius-bottomright: 4px; - -webkit-border-bottom-right-radius: 4px; - -khtml-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - } - - - /* Overlays */ - - .ui-widget-overlay { - background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; - opacity: .30; - filter:Alpha(Opacity=30); - } - - .ui-widget-shadow { - margin: -8px 0 0 -8px; - padding: 8px; - background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; - opacity: .30;filter:Alpha(Opacity=30); - -moz-border-radius: 8px; - -khtml-border-radius: 8px; - -webkit-border-radius: 8px; - border-radius: 8px; - } - - /* - * jQuery UI Accordion 1.10.0 - * - * Copyright 2013, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://jqueryui.com/accordion/ - */ - - /* IE/Win - Fix animation bug - #4615 */ - - .ui-accordion { - width: 100%; - } - .ui-accordion .ui-accordion-header { - cursor: pointer; - position: relative; - margin-top: 1px; - zoom: 1; - font-weight:bold; - } - .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 1.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 Button 1.10.0 - * - * Copyright 2013, 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 { - - cursor: pointer; - display: inline-block; - background-color: #e6e6e6; - background-repeat: no-repeat; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); - background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); - padding: 5px 14px 6px; - margin: 0; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - color: #333; - font-size: 13px; - line-height: normal; - border: 1px solid #ccc; - border-bottom-color: #bbb; - - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -webkit-transition: 0.1s linear background-image; - -moz-transition: 0.1s linear background-image; - -ms-transition: 0.1s linear background-image; - -o-transition: 0.1s linear background-image; - transition: 0.1s linear background-image; - overflow: visible; - } /* the overflow property removes extra width in IE */ - - .ui-button-primary { - color: #ffffff; - background-color: #0064cd; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd)); - background-image: -moz-linear-gradient(top, #049cdb, #0064cd); - background-image: -ms-linear-gradient(top, #049cdb, #0064cd); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd)); - background-image: -webkit-linear-gradient(top, #049cdb, #0064cd); - background-image: -o-linear-gradient(top, #049cdb, #0064cd); - background-image: linear-gradient(top, #049cdb, #0064cd); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #0064cd #0064cd #003f81; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - } - - - .ui-button-success{ - color:#ffffff; - background-color: #57a957; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957)); - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -ms-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(top, #62c462, #57a957); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #57a957 #57a957 #3d773d; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - } - - .ui-button-error{ - color:#ffffff; - background-color: #c43c35; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35)); - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(top, #ee5f5b, #c43c35); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #c43c35 #c43c35 #882a25; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - } - - .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 { } /* 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; } - .ui-button-text-only .ui-button-text { } - .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; /*tempfix*/ display:none;} - .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 { top: 50%; margin-top:-3px; margin-bottom:3px; } - .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-state-active { - color: #ffffff; - background-color: #0064cd; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd)); - background-image: -moz-linear-gradient(top, #049cdb, #0064cd); - background-image: -ms-linear-gradient(top, #049cdb, #0064cd); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd)); - background-image: -webkit-linear-gradient(top, #049cdb, #0064cd); - background-image: -o-linear-gradient(top, #049cdb, #0064cd); - background-image: linear-gradient(top, #049cdb, #0064cd); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #0064cd #0064cd #003f81; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - } - .ui-buttonset .ui-button { margin-left: 0; margin-right: 0; } - - /* workarounds */ - button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ - - /* - * jQuery UI Datepicker 1.9.0 - * - * Copyright 2012-10-11, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://jqueryui.com/datepicker/ - */ - .ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } - .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; border:0px; font-weight: bold; width: 100%; padding: 4px 0; background-color: #f5f5f5; color: #808080; } - .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*/ - } - - .ui-datepicker th{ - font-weight: bold; - color: gray; - } - - .ui-datepicker-today a:hover{ - background-color: #808080; - color: #ffffff; - - } - .ui-datepicker-today a{ - background-color: #BFBFBF; - cursor: pointer; - padding: 0 4px; - margin-bottom:0px; - - } - - - .ui-datepicker td a{ - margin-bottom:0px; - border:0px; - } - - .ui-datepicker td:hover{ - color: #ffffff; - } - - .ui-datepicker td .ui-state-default { - border:0px; - background:none; - margin-bottom:0px; - padding:5px; - color:gray; - text-align: center; - filter:none; - } - - - .ui-datepicker td .ui-state-active{ - background:#BFBFBF; - margin-bottom:0px; - font-size:normal; - text-shadow: 0px; - color: #ffffff; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - - .ui-datepicker td .ui-state-hover { - color: #ffffff; - background: #0064cd; - background-color: #0064cd; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd)); - background-image: -moz-linear-gradient(top, #049cdb, #0064cd); - background-image: -ms-linear-gradient(top, #049cdb, #0064cd); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd)); - background-image: -webkit-linear-gradient(top, #049cdb, #0064cd); - background-image: -o-linear-gradient(top, #049cdb, #0064cd); - background-image: linear-gradient(top, #049cdb, #0064cd); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #0064cd #0064cd #003f81; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - } - - .ui-widget-content { - border: 1px solid #dfdfdf; - } - .ui-datepicker table { background: #fff; } - - .placeholder { - background:#f9f9f9 !important; - border: 1px dashed #bbb !important; - } - -} - -.wp-customizer { - #ui-datepicker-div { - z-index: 999999 !important; - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/qtip/jquery.qtip.css b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/qtip/jquery.qtip.css deleted file mode 100755 index 272f185b..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/qtip/jquery.qtip.css +++ /dev/null @@ -1,617 +0,0 @@ -/* - * qTip2 - Pretty powerful tooltips - v2.2.1 - * http://qtip2.com - * - * Copyright (c) 2014 - * Released under the MIT licenses - * http://jquery.org/license - * - * Date: Sat Sep 6 2014 11:12 GMT+0100+0100 - * Plugins: tips modal viewport svg imagemap ie6 - * Styles: core basic css3 - */ -.qtip{ - position: absolute; - left: -28000px; - top: -28000px; - display: none; - - max-width: 280px; - min-width: 50px; - - font-size: 10.5px; - line-height: 12px; - - direction: ltr; - - box-shadow: none; - padding: 0; -} - -.qtip-content{ - position: relative; - padding: 5px 9px; - overflow: hidden; - - text-align: left; - word-wrap: break-word; -} - -.qtip-titlebar{ - position: relative; - padding: 5px 35px 5px 10px; - overflow: hidden; - - border-width: 0 0 1px; - font-weight: bold; -} - -.qtip-titlebar + .qtip-content{ border-top-width: 0 !important; } - -/* Default close button class */ -.qtip-close{ - position: absolute; - right: -9px; top: -9px; - z-index: 11; /* Overlap .qtip-tip */ - - cursor: pointer; - outline: medium none; - - border: 1px solid transparent; -} - -.qtip-titlebar .qtip-close{ - right: 4px; top: 50%; - margin-top: -9px; -} - -* html .qtip-titlebar .qtip-close{ top: 16px; } /* IE fix */ - -.qtip-titlebar .ui-icon, -.qtip-icon .ui-icon{ - display: block; - text-indent: -1000em; - direction: ltr; -} - -.qtip-icon, .qtip-icon .ui-icon{ - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - text-decoration: none; -} - -.qtip-icon .ui-icon{ - width: 18px; - height: 14px; - - line-height: 14px; - text-align: center; - text-indent: 0; - font: normal bold 10px/13px Tahoma,sans-serif; - - color: inherit; - background: transparent none no-repeat -100em -100em; -} - -/* Applied to 'focused' tooltips e.g. most recently displayed/interacted with */ -.qtip-focus{} - -/* Applied on hover of tooltips i.e. added/removed on mouseenter/mouseleave respectively */ -.qtip-hover{} - -/* Default tooltip style */ -.qtip-default{ - border: 1px solid #F1D031; - - background-color: #FFFFA3; - color: #555; -} - -.qtip-default .qtip-titlebar{ - background-color: #FFEF93; -} - -.qtip-default .qtip-icon{ - border-color: #CCC; - background: #F1F1F1; - color: #777; -} - -.qtip-default .qtip-titlebar .qtip-close{ - border-color: #AAA; - color: #111; -} - - -/*! Light tooltip style */ -.qtip-light{ - background-color: white; - border-color: #E2E2E2; - color: #454545; -} - -.qtip-light .qtip-titlebar{ - background-color: #f1f1f1; -} - - -/*! Dark tooltip style */ -.qtip-dark{ - background-color: #505050; - border-color: #303030; - color: #f3f3f3; -} - -.qtip-dark .qtip-titlebar{ - background-color: #404040; -} - -.qtip-dark .qtip-icon{ - border-color: #444; -} - -.qtip-dark .qtip-titlebar .ui-state-hover{ - border-color: #303030; -} - - -/*! Cream tooltip style */ -.qtip-cream{ - background-color: #FBF7AA; - border-color: #F9E98E; - color: #A27D35; -} - -.qtip-cream .qtip-titlebar{ - background-color: #F0DE7D; -} - -.qtip-cream .qtip-close .qtip-icon{ - background-position: -82px 0; -} - - -/*! Red tooltip style */ -.qtip-red{ - background-color: #F78B83; - border-color: #D95252; - color: #912323; -} - -.qtip-red .qtip-titlebar{ - background-color: #F06D65; -} - -.qtip-red .qtip-close .qtip-icon{ - background-position: -102px 0; -} - -.qtip-red .qtip-icon{ - border-color: #D95252; -} - -.qtip-red .qtip-titlebar .ui-state-hover{ - border-color: #D95252; -} - - -/*! Green tooltip style */ -.qtip-green{ - background-color: #CAED9E; - border-color: #90D93F; - color: #3F6219; -} - -.qtip-green .qtip-titlebar{ - background-color: #B0DE78; -} - -.qtip-green .qtip-close .qtip-icon{ - background-position: -42px 0; -} - - -/*! Blue tooltip style */ -.qtip-blue{ - background-color: #E5F6FE; - border-color: #ADD9ED; - color: #5E99BD; -} - -.qtip-blue .qtip-titlebar{ - background-color: #D0E9F5; -} - -.qtip-blue .qtip-close .qtip-icon{ - background-position: -2px 0; -} - - -.qtip-shadow{ - -webkit-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15); - box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15); -} - -/* Add rounded corners to your tooltips in: FF3+, Chrome 2+, Opera 10.6+, IE9+, Safari 2+ */ -.qtip-rounded, -.qtip-tipsy, -.qtip-bootstrap{ - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; -} - -.qtip-rounded .qtip-titlebar{ - -moz-border-radius: 4px 4px 0 0; - -webkit-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -/* Youtube tooltip style */ -.qtip-youtube{ - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - - -webkit-box-shadow: 0 0 3px #333; - -moz-box-shadow: 0 0 3px #333; - box-shadow: 0 0 3px #333; - - color: white; - border: 0 solid transparent; - - background: #4A4A4A; - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0,#4A4A4A),color-stop(100%,black)); - background-image: -webkit-linear-gradient(top,#4A4A4A 0,black 100%); - background-image: -moz-linear-gradient(top,#4A4A4A 0,black 100%); - background-image: -ms-linear-gradient(top,#4A4A4A 0,black 100%); - background-image: -o-linear-gradient(top,#4A4A4A 0,black 100%); -} - -.qtip-youtube .qtip-titlebar{ - background-color: #4A4A4A; - background-color: rgba(0,0,0,0); -} - -.qtip-youtube .qtip-content{ - padding: .75em; - font: 12px arial,sans-serif; - - filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#4a4a4a,EndColorStr=#000000); - -ms-filter: "progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#4a4a4a,EndColorStr=#000000);"; -} - -.qtip-youtube .qtip-icon{ - border-color: #222; -} - -.qtip-youtube .qtip-titlebar .ui-state-hover{ - border-color: #303030; -} - - -/* jQuery TOOLS Tooltip style */ -.qtip-jtools{ - background: #232323; - background: rgba(0, 0, 0, 0.7); - background-image: -webkit-gradient(linear, left top, left bottom, from(#717171), to(#232323)); - background-image: -moz-linear-gradient(top, #717171, #232323); - background-image: -webkit-linear-gradient(top, #717171, #232323); - background-image: -ms-linear-gradient(top, #717171, #232323); - background-image: -o-linear-gradient(top, #717171, #232323); - - border: 2px solid #ddd; - border: 2px solid rgba(241,241,241,1); - - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - - -webkit-box-shadow: 0 0 12px #333; - -moz-box-shadow: 0 0 12px #333; - box-shadow: 0 0 12px #333; -} - -/* IE Specific */ -.qtip-jtools .qtip-titlebar{ - background-color: transparent; - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A)"; -} -.qtip-jtools .qtip-content{ - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323)"; -} - -.qtip-jtools .qtip-titlebar, -.qtip-jtools .qtip-content{ - background: transparent; - color: white; - border: 0 dashed transparent; -} - -.qtip-jtools .qtip-icon{ - border-color: #555; -} - -.qtip-jtools .qtip-titlebar .ui-state-hover{ - border-color: #333; -} - - -/* Cluetip style */ -.qtip-cluetip{ - -webkit-box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4); - -moz-box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4); - box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4); - - background-color: #D9D9C2; - color: #111; - border: 0 dashed transparent; -} - -.qtip-cluetip .qtip-titlebar{ - background-color: #87876A; - color: white; - border: 0 dashed transparent; -} - -.qtip-cluetip .qtip-icon{ - border-color: #808064; -} - -.qtip-cluetip .qtip-titlebar .ui-state-hover{ - border-color: #696952; - color: #696952; -} - - -/* Tipsy style */ -.qtip-tipsy{ - background: black; - background: rgba(0, 0, 0, .87); - - color: white; - border: 0 solid transparent; - - font-size: 11px; - font-family: 'Lucida Grande', sans-serif; - font-weight: bold; - line-height: 16px; - text-shadow: 0 1px black; -} - -.qtip-tipsy .qtip-titlebar{ - padding: 6px 35px 0 10px; - background-color: transparent; -} - -.qtip-tipsy .qtip-content{ - padding: 6px 10px; -} - -.qtip-tipsy .qtip-icon{ - border-color: #222; - text-shadow: none; -} - -.qtip-tipsy .qtip-titlebar .ui-state-hover{ - border-color: #303030; -} - - -/* Tipped style */ -.qtip-tipped{ - border: 3px solid #959FA9; - - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - - background-color: #F9F9F9; - color: #454545; - - font-weight: normal; - font-family: serif; -} - -.qtip-tipped .qtip-titlebar{ - border-bottom-width: 0; - - color: white; - background: #3A79B8; - background-image: -webkit-gradient(linear, left top, left bottom, from(#3A79B8), to(#2E629D)); - background-image: -webkit-linear-gradient(top, #3A79B8, #2E629D); - background-image: -moz-linear-gradient(top, #3A79B8, #2E629D); - background-image: -ms-linear-gradient(top, #3A79B8, #2E629D); - background-image: -o-linear-gradient(top, #3A79B8, #2E629D); - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D)"; -} - -.qtip-tipped .qtip-icon{ - border: 2px solid #285589; - background: #285589; -} - -.qtip-tipped .qtip-icon .ui-icon{ - background-color: #FBFBFB; - color: #555; -} - - -/** - * Twitter Bootstrap style. - * - * Tested with IE 8, IE 9, Chrome 18, Firefox 9, Opera 11. - * Does not work with IE 7. - */ -.qtip-bootstrap{ - /** Taken from Bootstrap body */ - font-size: 14px; - line-height: 20px; - color: #333333; - - /** Taken from Bootstrap .popover */ - padding: 1px; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.qtip-bootstrap .qtip-titlebar{ - /** Taken from Bootstrap .popover-title */ - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} - -.qtip-bootstrap .qtip-titlebar .qtip-close{ - /** - * Overrides qTip2: - * .qtip-titlebar .qtip-close{ - * [...] - * right: 4px; - * top: 50%; - * [...] - * border-style: solid; - * } - */ - right: 11px; - top: 45%; - border-style: none; -} - -.qtip-bootstrap .qtip-content{ - /** Taken from Bootstrap .popover-content */ - padding: 9px 14px; -} - -.qtip-bootstrap .qtip-icon{ - /** - * Overrides qTip2: - * .qtip-default .qtip-icon { - * border-color: #CCC; - * background: #F1F1F1; - * color: #777; - * } - */ - background: transparent; -} - -.qtip-bootstrap .qtip-icon .ui-icon{ - /** - * Overrides qTip2: - * .qtip-icon .ui-icon{ - * width: 18px; - * height: 14px; - * } - */ - width: auto; - height: auto; - - /* Taken from Bootstrap .close */ - float: right; - font-size: 20px; - font-weight: bold; - line-height: 18px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.qtip-bootstrap .qtip-icon .ui-icon:hover{ - /* Taken from Bootstrap .close:hover */ - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} - - -/* IE9 fix - removes all filters */ -.qtip:not(.ie9haxors) div.qtip-content, -.qtip:not(.ie9haxors) div.qtip-titlebar{ - filter: none; - -ms-filter: none; -} - - -.qtip .qtip-tip{ - margin: 0 auto; - overflow: hidden; - z-index: 10; - -} - -/* Opera bug #357 - Incorrect tip position -https://github.com/Craga89/qTip2/issues/367 */ -x:-o-prefocus, .qtip .qtip-tip{ - visibility: hidden; -} - -.qtip .qtip-tip, -.qtip .qtip-tip .qtip-vml, -.qtip .qtip-tip canvas{ - position: absolute; - - color: #123456; - background: transparent; - border: 0 dashed transparent; -} - -.qtip .qtip-tip canvas{ top: 0; left: 0; } - -.qtip .qtip-tip .qtip-vml{ - behavior: url(#default#VML); - display: inline-block; - visibility: visible; -} - - -#qtip-overlay{ - position: fixed; - left: 0; top: 0; - width: 100%; height: 100%; -} - -/* Applied to modals with show.modal.blur set to true */ -#qtip-overlay.blurs{ cursor: pointer; } - -/* Change opacity of overlay here */ -#qtip-overlay div{ - position: absolute; - left: 0; top: 0; - width: 100%; height: 100%; - - background-color: black; - - opacity: 0.7; - filter:alpha(opacity=70); - -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; -} - - -.qtipmodal-ie6fix{ - position: absolute !important; -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/qtip/jquery.qtip.min.css b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/qtip/jquery.qtip.min.css deleted file mode 100755 index 27b97296..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/qtip/jquery.qtip.min.css +++ /dev/null @@ -1,3 +0,0 @@ -/* qTip2 v2.2.1 | Plugins: tips modal viewport svg imagemap ie6 | Styles: core basic css3 | qtip2.com | Licensed MIT | Sat Sep 06 2014 23:12:07 */ - -.qtip{position:absolute;left:-28000px;top:-28000px;display:none;max-width:280px;min-width:50px;font-size:10.5px;line-height:12px;direction:ltr;box-shadow:none;padding:0}.qtip-content{position:relative;padding:5px 9px;overflow:hidden;text-align:left;word-wrap:break-word}.qtip-titlebar{position:relative;padding:5px 35px 5px 10px;overflow:hidden;border-width:0 0 1px;font-weight:700}.qtip-titlebar+.qtip-content{border-top-width:0!important}.qtip-close{position:absolute;right:-9px;top:-9px;z-index:11;cursor:pointer;outline:0;border:1px solid transparent}.qtip-titlebar .qtip-close{right:4px;top:50%;margin-top:-9px}* html .qtip-titlebar .qtip-close{top:16px}.qtip-icon .ui-icon,.qtip-titlebar .ui-icon{display:block;text-indent:-1000em;direction:ltr}.qtip-icon,.qtip-icon .ui-icon{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;text-decoration:none}.qtip-icon .ui-icon{width:18px;height:14px;line-height:14px;text-align:center;text-indent:0;font:400 bold 10px/13px Tahoma,sans-serif;color:inherit;background:-100em -100em no-repeat}.qtip-default{border:1px solid #F1D031;background-color:#FFFFA3;color:#555}.qtip-default .qtip-titlebar{background-color:#FFEF93}.qtip-default .qtip-icon{border-color:#CCC;background:#F1F1F1;color:#777}.qtip-default .qtip-titlebar .qtip-close{border-color:#AAA;color:#111}.qtip-light{background-color:#fff;border-color:#E2E2E2;color:#454545}.qtip-light .qtip-titlebar{background-color:#f1f1f1}.qtip-dark{background-color:#505050;border-color:#303030;color:#f3f3f3}.qtip-dark .qtip-titlebar{background-color:#404040}.qtip-dark .qtip-icon{border-color:#444}.qtip-dark .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-cream{background-color:#FBF7AA;border-color:#F9E98E;color:#A27D35}.qtip-cream .qtip-titlebar{background-color:#F0DE7D}.qtip-cream .qtip-close .qtip-icon{background-position:-82px 0}.qtip-red{background-color:#F78B83;border-color:#D95252;color:#912323}.qtip-red .qtip-titlebar{background-color:#F06D65}.qtip-red .qtip-close .qtip-icon{background-position:-102px 0}.qtip-red .qtip-icon,.qtip-red .qtip-titlebar .ui-state-hover{border-color:#D95252}.qtip-green{background-color:#CAED9E;border-color:#90D93F;color:#3F6219}.qtip-green .qtip-titlebar{background-color:#B0DE78}.qtip-green .qtip-close .qtip-icon{background-position:-42px 0}.qtip-blue{background-color:#E5F6FE;border-color:#ADD9ED;color:#5E99BD}.qtip-blue .qtip-titlebar{background-color:#D0E9F5}.qtip-blue .qtip-close .qtip-icon{background-position:-2px 0}.qtip-shadow{-webkit-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);-moz-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);box-shadow:1px 1px 3px 1px rgba(0,0,0,.15)}.qtip-bootstrap,.qtip-rounded,.qtip-tipsy{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.qtip-rounded .qtip-titlebar{-moz-border-radius:4px 4px 0 0;-webkit-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.qtip-youtube{-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 3px #333;-moz-box-shadow:0 0 3px #333;box-shadow:0 0 3px #333;color:#fff;border:0 solid transparent;background:#4A4A4A;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#4A4A4A),color-stop(100%,#000));background-image:-webkit-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-moz-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-ms-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-o-linear-gradient(top,#4A4A4A 0,#000 100%)}.qtip-youtube .qtip-titlebar{background-color:transparent}.qtip-youtube .qtip-content{padding:.75em;font:12px arial,sans-serif;filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#4a4a4a, EndColorStr=#000000);-ms-filter:"progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#4a4a4a,EndColorStr=#000000);"}.qtip-youtube .qtip-icon{border-color:#222}.qtip-youtube .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-jtools{background:#232323;background:rgba(0,0,0,.7);background-image:-webkit-gradient(linear,left top,left bottom,from(#717171),to(#232323));background-image:-moz-linear-gradient(top,#717171,#232323);background-image:-webkit-linear-gradient(top,#717171,#232323);background-image:-ms-linear-gradient(top,#717171,#232323);background-image:-o-linear-gradient(top,#717171,#232323);border:2px solid #ddd;border:2px solid rgba(241,241,241,1);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 12px #333;-moz-box-shadow:0 0 12px #333;box-shadow:0 0 12px #333}.qtip-jtools .qtip-titlebar{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171, endColorstr=#4A4A4A);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A)"}.qtip-jtools .qtip-content{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A, endColorstr=#232323);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323)"}.qtip-jtools .qtip-content,.qtip-jtools .qtip-titlebar{background:0 0;color:#fff;border:0 dashed transparent}.qtip-jtools .qtip-icon{border-color:#555}.qtip-jtools .qtip-titlebar .ui-state-hover{border-color:#333}.qtip-cluetip{-webkit-box-shadow:4px 4px 5px rgba(0,0,0,.4);-moz-box-shadow:4px 4px 5px rgba(0,0,0,.4);box-shadow:4px 4px 5px rgba(0,0,0,.4);background-color:#D9D9C2;color:#111;border:0 dashed transparent}.qtip-cluetip .qtip-titlebar{background-color:#87876A;color:#fff;border:0 dashed transparent}.qtip-cluetip .qtip-icon{border-color:#808064}.qtip-cluetip .qtip-titlebar .ui-state-hover{border-color:#696952;color:#696952}.qtip-tipsy{background:#000;background:rgba(0,0,0,.87);color:#fff;border:0 solid transparent;font-size:11px;font-family:'Lucida Grande',sans-serif;font-weight:700;line-height:16px;text-shadow:0 1px #000}.qtip-tipsy .qtip-titlebar{padding:6px 35px 0 10px;background-color:transparent}.qtip-tipsy .qtip-content{padding:6px 10px}.qtip-tipsy .qtip-icon{border-color:#222;text-shadow:none}.qtip-tipsy .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-tipped{border:3px solid #959FA9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-color:#F9F9F9;color:#454545;font-weight:400;font-family:serif}.qtip-tipped .qtip-titlebar{border-bottom-width:0;color:#fff;background:#3A79B8;background-image:-webkit-gradient(linear,left top,left bottom,from(#3A79B8),to(#2E629D));background-image:-webkit-linear-gradient(top,#3A79B8,#2E629D);background-image:-moz-linear-gradient(top,#3A79B8,#2E629D);background-image:-ms-linear-gradient(top,#3A79B8,#2E629D);background-image:-o-linear-gradient(top,#3A79B8,#2E629D);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8, endColorstr=#2E629D);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D)"}.qtip-tipped .qtip-icon{border:2px solid #285589;background:#285589}.qtip-tipped .qtip-icon .ui-icon{background-color:#FBFBFB;color:#555}.qtip-bootstrap{font-size:14px;line-height:20px;color:#333;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.qtip-bootstrap .qtip-titlebar{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.qtip-bootstrap .qtip-titlebar .qtip-close{right:11px;top:45%;border-style:none}.qtip-bootstrap .qtip-content{padding:9px 14px}.qtip-bootstrap .qtip-icon{background:0 0}.qtip-bootstrap .qtip-icon .ui-icon{width:auto;height:auto;float:right;font-size:20px;font-weight:700;line-height:18px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.qtip-bootstrap .qtip-icon .ui-icon:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}.qtip:not(.ie9haxors) div.qtip-content,.qtip:not(.ie9haxors) div.qtip-titlebar{filter:none;-ms-filter:none}.qtip .qtip-tip{margin:0 auto;overflow:hidden;z-index:10}.qtip .qtip-tip,x:-o-prefocus{visibility:hidden}.qtip .qtip-tip,.qtip .qtip-tip .qtip-vml,.qtip .qtip-tip canvas{position:absolute;color:#123456;background:0 0;border:0 dashed transparent}.qtip .qtip-tip canvas{top:0;left:0}.qtip .qtip-tip .qtip-vml{behavior:url(#default#VML);display:inline-block;visibility:visible}#qtip-overlay{position:fixed;left:0;top:0;width:100%;height:100%}#qtip-overlay.blurs{cursor:pointer}#qtip-overlay div{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#000;opacity:.7;filter:alpha(opacity=70);-ms-filter:"alpha(Opacity=70)"}.qtipmodal-ie6fix{position:absolute!important} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/spectrum/redux-spectrum.css b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/spectrum/redux-spectrum.css deleted file mode 100755 index 876c486b..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/spectrum/redux-spectrum.css +++ /dev/null @@ -1,507 +0,0 @@ -/*** -Spectrum Colorpicker v1.5.1 -https://github.com/bgrins/spectrum -Author: Brian Grinstead -License: MIT -***/ - -.sp-container { - position:absolute; - top:0; - left:0; - display:inline-block; - *display: inline; - *zoom: 1; - /* https://github.com/bgrins/spectrum/issues/40 */ - z-index: 9999994; - overflow: hidden; -} -.sp-container.sp-flat { - position: relative; -} - -/* Fix for * { box-sizing: border-box; } */ -.sp-container, -.sp-container * { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -/* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */ -.sp-top { - position:relative; - width: 100%; - display:inline-block; -} -.sp-top-inner { - position:absolute; - top:0; - left:0; - bottom:0; - right:0; -} -.sp-color { - position: absolute; - top:0; - left:0; - bottom:0; - right:20%; -} -.sp-hue { - position: absolute; - top:0; - right:0; - bottom:0; - left:84%; - height: 100%; -} - -.sp-clear-enabled .sp-hue { - top:33px; - height: 77.5%; -} - -.sp-fill { - padding-top: 80%; -} -.sp-sat, .sp-val { - position: absolute; - top:0; - left:0; - right:0; - bottom:0; -} - -.sp-alpha-enabled .sp-top { - margin-bottom: 18px; -} -.sp-alpha-enabled .sp-alpha { - display: block; -} -.sp-alpha-handle { - position:absolute; - top:-4px; - bottom: -4px; - width: 6px; - left: 50%; - cursor: pointer; - border: 1px solid black; - background: white; - opacity: .8; -} -.sp-alpha { - display: none; - position: absolute; - bottom: -14px; - right: 0; - left: 0; - height: 8px; -} -.sp-alpha-inner { - border: solid 1px #333; -} - -.sp-clear { - display: none; -} - -.sp-clear.sp-clear-display { - background-position: center; -} - -.sp-clear-enabled .sp-clear { - display: block; - position:absolute; - top:0px; - right:0; - bottom:0; - left:84%; - height: 28px; -} - -/* Don't allow text selection */ -.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-clear, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button { - -webkit-user-select:none; - -moz-user-select: -moz-none; - -o-user-select:none; - user-select: none; -} - -.sp-container.sp-input-disabled .sp-input-container { - display: none; -} -.sp-container.sp-buttons-disabled .sp-button-container { - display: none; -} -.sp-container.sp-palette-buttons-disabled .sp-palette-button-container { - display: none; -} -.sp-palette-only .sp-picker-container { - display: none; -} -.sp-palette-disabled .sp-palette-container { - display: none; -} - -.sp-initial-disabled .sp-initial { - display: none; -} - - -/* Gradients for hue, saturation and value instead of images. Not pretty... but it works */ -.sp-sat { - background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0))); - background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0)); - background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); - background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); - background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); - background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)"; - filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81'); -} -.sp-val { - background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0))); - background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0)); - background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); - background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); - background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); - background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)"; - filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000'); -} - -.sp-hue { - background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000)); - background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: linear-gradient(to bottom, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); -} - -/* IE filters do not support multiple color stops. - Generate 6 divs, line them up, and do two color gradients for each. - Yes, really. - */ -.sp-1 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00'); -} -.sp-2 { - height:16%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00'); -} -.sp-3 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff'); -} -.sp-4 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff'); -} -.sp-5 { - height:16%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff'); -} -.sp-6 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000'); -} - -.sp-hidden { - display: none !important; -} - -/* Clearfix hack */ -.sp-cf:before, .sp-cf:after { content: ""; display: table; } -.sp-cf:after { clear: both; } -.sp-cf { *zoom: 1; } - -/* Mobile devices, make hue slider bigger so it is easier to slide */ -@media (max-device-width: 480px) { - .sp-color { right: 40%; } - .sp-hue { left: 63%; } - .sp-fill { padding-top: 60%; } -} -.sp-dragger { - border-radius: 5px; - height: 5px; - width: 5px; - border: 1px solid #fff; - background: #000; - cursor: pointer; - position:absolute; - top:0; - left: 0; -} -.sp-slider { - position: absolute; - top:0; - cursor:pointer; - height: 3px; - left: -1px; - right: -1px; - border: 1px solid #000; - background: white; - opacity: .8; -} - -/* -Theme authors: -Here are the basic themeable display options (colors, fonts, global widths). -See http://bgrins.github.io/spectrum/themes/ for instructions. -*/ - -.sp-container { - border-radius: 0; - background-color: #ECECEC; - border: solid 1px #f0c49B; - padding: 0; -} -.sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue, .sp-clear { - font: normal 12px "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -.sp-top { - margin-bottom: 3px; -} -.sp-color, .sp-hue, .sp-clear { - border: solid 1px #666; -} - -/* Input */ -.sp-input-container { - float:right; - width: 100px; - margin-bottom: 4px; -} -.sp-initial-disabled .sp-input-container { - width: 100%; -} -.sp-input { - font-size: 12px !important; - border: 1px inset; - padding: 4px 5px; - margin: 0; - width: 100%; - background:transparent; - border-radius: 3px; - color: #222; -} -.sp-input:focus { - border: 1px solid orange; -} -.sp-input.sp-validation-error { - border: 1px solid red; - background: #fdd; -} -.sp-picker-container , .sp-palette-container { - float:left; - position: relative; - padding: 10px; - padding-bottom: 300px; - margin-bottom: -290px; -} -.sp-picker-container { - width: 172px; - border-left: solid 1px #fff; -} - -/* Palettes */ -.sp-palette-container { - border-right: solid 1px #ccc; -} - -.sp-palette-only .sp-palette-container { - border: 0; -} - -.sp-palette .sp-thumb-el { - display: block; - position:relative; - float:left; - width: 24px; - height: 15px; - margin: 3px; - cursor: pointer; - border:solid 2px transparent; -} -.sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active { - border-color: orange; -} -.sp-thumb-el { - position:relative; -} - -/* Initial */ -.sp-initial { - float: left; - border: solid 1px #333; -} -.sp-initial span { - width: 30px; - height: 25px; - border:none; - display:block; - float:left; - margin:0; -} - -.sp-initial .sp-clear-display { - background-position: center; -} - -/* Buttons */ -.sp-palette-button-container, -.sp-button-container { - float: right; -} - -/* Replacer (the little preview div that shows up instead of the ) */ -.sp-replacer { - margin:0; - overflow:hidden; - cursor:pointer; - padding: 4px; - display:inline-block; - *zoom: 1; - *display: inline; - border: solid 1px #91765d; - background: #eee; - color: #333; - vertical-align: middle; -} -.sp-replacer:hover, .sp-replacer.sp-active { - border-color: #F0C49B; - color: #111; -} -.sp-replacer.sp-disabled { - cursor:default; - border-color: silver; - color: silver; -} -.sp-dd { - padding: 2px 0; - height: 16px; - line-height: 16px; - float:left; - font-size:10px; -} -.sp-preview { - position:relative; - width:25px; - height: 20px; - border: solid 1px #222; - margin-right: 5px; - float:left; - z-index: 0; -} - -.sp-palette { - *width: 220px; - max-width: 220px; -} -.sp-palette .sp-thumb-el { - width:16px; - height: 16px; - margin:2px 1px; - border: solid 1px #d0d0d0; -} - -.sp-container { - padding-bottom:0; -} - - -/* Buttons: http://hellohappy.org/css3-buttons/ */ -.sp-container button { - background-color: #eeeeee; - background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc); - background-image: -moz-linear-gradient(top, #eeeeee, #cccccc); - background-image: -ms-linear-gradient(top, #eeeeee, #cccccc); - background-image: -o-linear-gradient(top, #eeeeee, #cccccc); - background-image: linear-gradient(to bottom, #eeeeee, #cccccc); - border: 1px solid #ccc; - border-bottom: 1px solid #bbb; - border-radius: 3px; - color: #333; - font-size: 14px; - line-height: 1; - padding: 5px 4px; - text-align: center; - text-shadow: 0 1px 0 #eee; - vertical-align: middle; -} -.sp-container button:hover { - background-color: #dddddd; - background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -o-linear-gradient(top, #dddddd, #bbbbbb); - background-image: linear-gradient(to bottom, #dddddd, #bbbbbb); - border: 1px solid #bbb; - border-bottom: 1px solid #999; - cursor: pointer; - text-shadow: 0 1px 0 #ddd; -} -.sp-container button:active { - border: 1px solid #aaa; - border-bottom: 1px solid #888; - -webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; -} -.sp-cancel { - font-size: 11px; - color: #d93f3f !important; - margin:0; - padding:2px; - margin-right: 5px; - vertical-align: middle; - text-decoration:none; - -} -.sp-cancel:hover { - color: #d93f3f !important; - text-decoration: underline; -} - - -.sp-palette span:hover, .sp-palette span.sp-thumb-active { - border-color: #000; -} - -.sp-preview, .sp-alpha, .sp-thumb-el { - position:relative; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==); -} -.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner { - display:block; - position:absolute; - top:0;left:0;bottom:0;right:0; -} - -.sp-palette .sp-thumb-inner { - background-position: 50% 50%; - background-repeat: no-repeat; -} - -.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=); -} - -.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=); -} - -.sp-clear-display { - background-repeat:no-repeat; - background-position: center; - background-image: url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==); -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/spectrum/redux-spectrum.min.css b/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/spectrum/redux-spectrum.min.css deleted file mode 100755 index a9fd168a..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/css/vendor/spectrum/redux-spectrum.min.css +++ /dev/null @@ -1 +0,0 @@ -.sp-container{position:absolute;top:0;left:0;display:inline-block;*display:inline;*zoom:1;z-index:9999994;overflow:hidden}.sp-container.sp-flat{position:relative}.sp-container,.sp-container *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.sp-top{position:relative;width:100%;display:inline-block}.sp-top-inner{position:absolute;top:0;left:0;bottom:0;right:0}.sp-color{position:absolute;top:0;left:0;bottom:0;right:20%}.sp-hue{position:absolute;top:0;right:0;bottom:0;left:84%;height:100%}.sp-clear-enabled .sp-hue{top:33px;height:77.5%}.sp-fill{padding-top:80%}.sp-sat,.sp-val{position:absolute;top:0;left:0;right:0;bottom:0}.sp-alpha-enabled .sp-top{margin-bottom:18px}.sp-alpha-enabled .sp-alpha{display:block}.sp-alpha-handle{position:absolute;top:-4px;bottom:-4px;width:6px;left:50%;cursor:pointer;border:1px solid black;background:white;opacity:.8}.sp-alpha{display:none;position:absolute;bottom:-14px;right:0;left:0;height:8px}.sp-alpha-inner{border:solid 1px #333}.sp-clear{display:none}.sp-clear.sp-clear-display{background-position:center}.sp-clear-enabled .sp-clear{display:block;position:absolute;top:0;right:0;bottom:0;left:84%;height:28px}.sp-container,.sp-replacer,.sp-preview,.sp-dragger,.sp-slider,.sp-alpha,.sp-clear,.sp-alpha-handle,.sp-container.sp-dragging .sp-input,.sp-container button{-webkit-user-select:none;-moz-user-select:-moz-none;-o-user-select:none;user-select:none}.sp-container.sp-input-disabled .sp-input-container{display:none}.sp-container.sp-buttons-disabled .sp-button-container{display:none}.sp-container.sp-palette-buttons-disabled .sp-palette-button-container{display:none}.sp-palette-only .sp-picker-container{display:none}.sp-palette-disabled .sp-palette-container{display:none}.sp-initial-disabled .sp-initial{display:none}.sp-sat{background-image:-webkit-gradient(linear,0 0,100% 0,from(#FFF),to(rgba(204,154,129,0)));background-image:-webkit-linear-gradient(left,#FFF,rgba(204,154,129,0));background-image:-moz-linear-gradient(left,#fff,rgba(204,154,129,0));background-image:-o-linear-gradient(left,#fff,rgba(204,154,129,0));background-image:-ms-linear-gradient(left,#fff,rgba(204,154,129,0));background-image:linear-gradient(to right,#fff,rgba(204,154,129,0));-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)";filter:progid:DXImageTransform.Microsoft.gradient(GradientType = 1,startColorstr='#FFFFFFFF',endColorstr='#00CC9A81')}.sp-val{background-image:-webkit-gradient(linear,0 100%,0 0,from(#000),to(rgba(204,154,129,0)));background-image:-webkit-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:-moz-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:-o-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:-ms-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:linear-gradient(to top,#000,rgba(204,154,129,0));-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81',endColorstr='#FF000000')}.sp-hue{background:-moz-linear-gradient(top,#f00 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%);background:-ms-linear-gradient(top,#f00 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%);background:-o-linear-gradient(top,#f00 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%);background:-webkit-gradient(linear,left top,left bottom,from(#f00),color-stop(0.17,#ff0),color-stop(0.33,#0f0),color-stop(0.5,#0ff),color-stop(0.67,#00f),color-stop(0.83,#f0f),to(#f00));background:-webkit-linear-gradient(top,#f00 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%);background:linear-gradient(to bottom,#f00 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%)}.sp-1{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000',endColorstr='#ffff00')}.sp-2{height:16%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00',endColorstr='#00ff00')}.sp-3{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00',endColorstr='#00ffff')}.sp-4{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff',endColorstr='#0000ff')}.sp-5{height:16%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff',endColorstr='#ff00ff')}.sp-6{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff',endColorstr='#ff0000')}.sp-hidden{display:none!important}.sp-cf:before,.sp-cf:after{content:"";display:table}.sp-cf:after{clear:both}.sp-cf{*zoom:1}@media(max-device-width:480px){.sp-color{right:40%}.sp-hue{left:63%}.sp-fill{padding-top:60%}}.sp-dragger{border-radius:5px;height:5px;width:5px;border:1px solid #fff;background:#000;cursor:pointer;position:absolute;top:0;left:0}.sp-slider{position:absolute;top:0;cursor:pointer;height:3px;left:-1px;right:-1px;border:1px solid #000;background:white;opacity:.8}.sp-container{border-radius:0;background-color:#ececec;border:solid 1px #f0c49b;padding:0}.sp-container,.sp-container button,.sp-container input,.sp-color,.sp-hue,.sp-clear{font:normal 12px "Lucida Grande","Lucida Sans Unicode","Lucida Sans",Geneva,Verdana,sans-serif;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.sp-top{margin-bottom:3px}.sp-color,.sp-hue,.sp-clear{border:solid 1px #666}.sp-input-container{float:right;width:100px;margin-bottom:4px}.sp-initial-disabled .sp-input-container{width:100%}.sp-input{font-size:12px!important;border:1px inset;padding:4px 5px;margin:0;width:100%;background:transparent;border-radius:3px;color:#222}.sp-input:focus{border:1px solid orange}.sp-input.sp-validation-error{border:1px solid red;background:#fdd}.sp-picker-container,.sp-palette-container{float:left;position:relative;padding:10px;padding-bottom:300px;margin-bottom:-290px}.sp-picker-container{width:172px;border-left:solid 1px #fff}.sp-palette-container{border-right:solid 1px #ccc}.sp-palette-only .sp-palette-container{border:0}.sp-palette .sp-thumb-el{display:block;position:relative;float:left;width:24px;height:15px;margin:3px;cursor:pointer;border:solid 2px transparent}.sp-palette .sp-thumb-el:hover,.sp-palette .sp-thumb-el.sp-thumb-active{border-color:orange}.sp-thumb-el{position:relative}.sp-initial{float:left;border:solid 1px #333}.sp-initial span{width:30px;height:25px;border:0;display:block;float:left;margin:0}.sp-initial .sp-clear-display{background-position:center}.sp-palette-button-container,.sp-button-container{float:right}.sp-replacer{margin:0;overflow:hidden;cursor:pointer;padding:4px;display:inline-block;*zoom:1;*display:inline;border:solid 1px #91765d;background:#eee;color:#333;vertical-align:middle}.sp-replacer:hover,.sp-replacer.sp-active{border-color:#f0c49b;color:#111}.sp-replacer.sp-disabled{cursor:default;border-color:silver;color:silver}.sp-dd{padding:2px 0;height:16px;line-height:16px;float:left;font-size:10px}.sp-preview{position:relative;width:25px;height:20px;border:solid 1px #222;margin-right:5px;float:left;z-index:0}.sp-palette{*width:220px;max-width:220px}.sp-palette .sp-thumb-el{width:16px;height:16px;margin:2px 1px;border:solid 1px #d0d0d0}.sp-container{padding-bottom:0}.sp-container button{background-color:#eee;background-image:-webkit-linear-gradient(top,#eee,#ccc);background-image:-moz-linear-gradient(top,#eee,#ccc);background-image:-ms-linear-gradient(top,#eee,#ccc);background-image:-o-linear-gradient(top,#eee,#ccc);background-image:linear-gradient(to bottom,#eee,#ccc);border:1px solid #ccc;border-bottom:1px solid #bbb;border-radius:3px;color:#333;font-size:14px;line-height:1;padding:5px 4px;text-align:center;text-shadow:0 1px 0 #eee;vertical-align:middle}.sp-container button:hover{background-color:#ddd;background-image:-webkit-linear-gradient(top,#ddd,#bbb);background-image:-moz-linear-gradient(top,#ddd,#bbb);background-image:-ms-linear-gradient(top,#ddd,#bbb);background-image:-o-linear-gradient(top,#ddd,#bbb);background-image:linear-gradient(to bottom,#ddd,#bbb);border:1px solid #bbb;border-bottom:1px solid #999;cursor:pointer;text-shadow:0 1px 0 #ddd}.sp-container button:active{border:1px solid #aaa;border-bottom:1px solid #888;-webkit-box-shadow:inset 0 0 5px 2px #aaa,0 1px 0 0 #eee;-moz-box-shadow:inset 0 0 5px 2px #aaa,0 1px 0 0 #eee;-ms-box-shadow:inset 0 0 5px 2px #aaa,0 1px 0 0 #eee;-o-box-shadow:inset 0 0 5px 2px #aaa,0 1px 0 0 #eee;box-shadow:inset 0 0 5px 2px #aaa,0 1px 0 0 #eee}.sp-cancel{font-size:11px;color:#d93f3f!important;margin:0;padding:2px;margin-right:5px;vertical-align:middle;text-decoration:none}.sp-cancel:hover{color:#d93f3f!important;text-decoration:underline}.sp-palette span:hover,.sp-palette span.sp-thumb-active{border-color:#000}.sp-preview,.sp-alpha,.sp-thumb-el{position:relative;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.sp-preview-inner,.sp-alpha-inner,.sp-thumb-inner{display:block;position:absolute;top:0;left:0;bottom:0;right:0}.sp-palette .sp-thumb-inner{background-position:50% 50%;background-repeat:no-repeat}.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=)}.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=)}.sp-clear-display{background-repeat:no-repeat;background-position:center;background-image:url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==)} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/img/1c.png b/admin/core/lib/ReduxFramework/ReduxCore/assets/img/1c.png deleted file mode 100755 index 6bbb1c31cf4ef4c37c7ca49650f000ce1a66f023..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^xfMzo7TnbtqtD0mjCIu WuhZ_cvep9)XYh3Ob6Mw<&;$Sh&ocx7 diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/img/1col.png b/admin/core/lib/ReduxFramework/ReduxCore/assets/img/1col.png deleted file mode 100755 index 1664aa73d377af97c9b69dd5cca218e388648eb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2895 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 diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/img/2-col-portfolio.png b/admin/core/lib/ReduxFramework/ReduxCore/assets/img/2-col-portfolio.png deleted file mode 100755 index be72cb13673e03725be2aa1e524b595999986264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1045 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 fcmMzZ|NjF33acqw!4Vg2@5 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 diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/img/ajax.gif b/admin/core/lib/ReduxFramework/ReduxCore/assets/img/ajax.gif deleted file mode 100755 index e1469616717a8051a4373bc4cb887436c4eba76a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1392 zcmb`F>rYz+7>7^W(^{adEo*zu4n6B>3ka2)L?&o7&?{iu0j_{}iB$@8Zcy$BTSi4@ zX#s(C&>>^A6tRm7Gf{)`fjX#yjGNHPxFkS?1c6UP6TdhQh9w&NP2WG@&6DT(DKiww zDLN*=1bzhov)OF1SlZg!Y&KhOZ*PBpztib-xm+V7Bcr3EQu| zAm$k5*b6{5Zbr2C=sTlQQs!*!xz%ZE(v7DwP;a;|v}G$*AO}s~>$mGckkzGkOtpwD z%}Ku@9C-_2a10L5yaqU}0Icc!!1Z*tOnD>TEnMPID@CE;i{YW^nNPNys}*t?bgq*4 z9G#IH)ztV#lqy~j2%;Q^C^Wq3cjgb5Xn*2@Yrg7;Y8ch?Zc!-{I0S)i89MD(xH<0Y z)0?l~Te2o*(%{(dFjFGPjFovjmT=3kMku*stbE8CN^P_zgXBCRiK2abFN{z>AOpih0F|V+SeJ!;|jSZwFw%D2+(r4f(biyQQrGDzS zMq*~BG{oz3_kB2}W3p_;LZB)!dMlcJrd`S6hgD*A`OPwv4Dw_=klZOL zDna-cE|$vpS8ObKWld;oAiVOtZD) zWfZuSu01MMIQer|es;{g^pc|-ZX|`KrjdfuaTGO`Kv9W;P&FE4lya^}xjeM)GFiwg zf?7ZbHGvjqgSbrDMR?|BTgp9LpUneFM)u`H!9IHS`9}pXSYfokEc&kY=HQD=u(;7 zBEXp<=xQ@KI3`0;Wk8_n$3V^akZYd*Ydwv2nP#x_7nmlFw4Tx04R}-Ro!pfR1`mnZ(O7nKcKOW4i$^9Ra0BJ8yc;~21%2p=|UR0&DbiW z$#rfTQ`a`O(`{9s_5yDV_yd5l2Of}kLK+Oj_Ok5(v`JGz71bo9J#^YYXp{DWs&KBa zQ@dTpxRI}aIp=pi@6k0t$5)!;m`NF6-tt{FpOKHBn3g+MAqmexC-gw4rh87hTrL7G z#)U`L!(So6-Zux@>;H3gR;i~0B%VTSS3P|m@o9jRsXML@Al^p#@G0Lx-0?i(9WEw_ zSYddU<1E8793KxjQ|c&UmW!mTC>k>?{om1c9S zUx<6_jj_!T&^M{wWM#>IBbOSf*xP<^F{$j$aOQ5Y{cT zROCL1M7^NKKL z&(yA}mSw#iM0^;IB{ZO5!wl{^Sg-*ysE~&Yz8!E;Qv(A`lu*=Clo*MpVGd>OdF6n^ zam1Jntk;<}MrqIC5$=Q>n{*R}?8oOIDUw5En2dl--Xw34!z7E+5pr-OgyQ-soSab)C%saskMla`aQLVzg0+MZf20tJU&K{hZoBrUc+U4e9&3o zw|KmGEe4#xz17wBu{f`SS_4i66?j31EjY7n{zGfhONK~c+td!TS#B}JoR}5UAd7p& z5phTyXSkK0xCeD3xaYP^o&J~#Xp9xFb0C;HHml5fA<%h1eR|qw7wxF+oNL9T1Aits?sKNIwvGaN)^WO$I^cUV)HzL_| z1K?{9p!>B*)`xfEv!4N6IG{J&h49W#Bz^(#YWw%`e_a{8n{G9m5AeR~_yl0%<7V@p zVvS6LpPwD*I*vvnG>*WexCskltledsjJ)FB;noRvmufCKc_9 zhU>mG++)Ai_nw?1ioI*5n|S=S`_ z6mOa!ud)X+8xb+y&EswchnO~x=nAWp0}D)ApMO!1@c=4J=fwa3002ovPDHLkV1gSk By?y`y diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/img/toggle_tabs.png b/admin/core/lib/ReduxFramework/ReduxCore/assets/img/toggle_tabs.png deleted file mode 100755 index ff435fb3068fe20963edcb5b86d70e36021dbad1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmV-s0h#`ZP)P001%w0ssI2CgA760000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz2uVaiRCwC#l|2fCFc5_|i$|~%Poft{ zp@m@WC2}EaJ5zW8PZKQF%D+IGC9=sx262~ISjd}~H{<9>_I-aLT?Er>+qPfu>bhatm`W8P1Bf-%Cb~SQ!b^*^W2(CDnYs0w#CT> z**K{=E8m)ESr*_1oRxYmCog+0V2`)w!kibpN6UVx)6z6GI1)lYxzq;seQ(ZH6a{qe zr4;fFS#m{D#2ACjK8|Cpmdx{v_Ai{K>F>S9aeO2nJ!?H{-B_Dt8Rr~_wcp@r2qf` diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/media/media.js b/admin/core/lib/ReduxFramework/ReduxCore/assets/js/media/media.js deleted file mode 100755 index 0c0f3491..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/media/media.js +++ /dev/null @@ -1,220 +0,0 @@ -/*global redux_change, wp, redux, libFilter */ - -/** - * Media Uploader - * Dependencies : jquery, wp media uploader - * Feature added by : Smartik - http://smartik.ws/ - * Date : 05.28.2013 - */ - -(function($){ - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.media = redux.field_objects.media || {}; - - var isFiltered; - - $( document ).ready( - function() { - - } - ); - - redux.field_objects.media.init = function( selector ) { - if ( !selector ) { - selector = $( document ).find( ".redux-group-tab:visible" ).find( '.redux-container-media:visible' ); - } - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - - isFiltered = false; - - // Remove the image button - el.find( '.remove-image, .remove-file' ).unbind( 'click' ).on( - 'click', function() { - redux.field_objects.media.removeFile( $( this ).parents( 'fieldset.redux-field:first' ) ); - } - ); - // Upload media button - el.find( '.media_upload_button' ).unbind().on( - 'click', function( event ) { - redux.field_objects.media.addFile( event, $( this ).parents( 'fieldset.redux-field:first' ) ); - } - ); - } - ); - }; - - // Add a file via the wp.media function - redux.field_objects.media.addFile = function( event, selector ) { - event.preventDefault(); - - var frame; - var jQueryel = $( this ); - var libFilter; - - // If the media frame already exists, reopen it. - if ( frame ) { - frame.open(); - return; - } - - // Get library filter data - var filter = $( selector ).find('.library-filter').data('lib-filter'); - - // Must exist to do decoding - if (filter !== undefined) { - if (filter !== ''){ - libFilter = []; - isFiltered = true; - filter = decodeURIComponent(filter); - filter = JSON.parse(filter); - - $.each(filter, function(index, value) { - libFilter.push(value); - }); - } - } - - // Create the media frame. - frame = wp.media( - { - multiple: false, - library: { - type: libFilter //Only allow images - }, - - // Set the title of the modal. - title: jQueryel.data( 'choose' ), - - // Customize the submit button. - button: { - // Set the text of the button. - text: jQueryel.data( 'update' ) - // Tell the button not to close the modal, since we're - // going to refresh the page when the image is selected. - } - } - ); - - // When an image is selected, run a callback. - frame.on( - 'select', function() { - - // Grab the selected attachment. - var attachment = frame.state().get( 'selection' ).first(); - frame.close(); - - var data = $( selector ).find('.data').data(); - - if ( typeof redux.field_objects.media === 'undefined' || typeof redux.field_objects.media === undefined ) { - redux.field_objects.media = {}; - } - - if ( data === undefined || data.mode === 'undefined' ) { - data = {}; - data.mode = "image"; - } - - if (isFiltered === true) { - data.mode = 0; - } - - if (data.mode === 0) { - - } else { - if ( data.mode !== false) { - if (attachment.attributes.type !== data.mode) { - if (attachment.attributes.subtype !== data.mode ) { - return; - } - } - } - } - - selector.find( '.upload' ).val( attachment.attributes.url ); - selector.find( '.upload-id' ).val( attachment.attributes.id ); - selector.find( '.upload-height' ).val( attachment.attributes.height ); - selector.find( '.upload-width' ).val( attachment.attributes.width ); - - redux_change( $( selector ).find( '.upload-id' ) ); - - var thumbSrc = attachment.attributes.url; - if ( typeof attachment.attributes.sizes !== 'undefined' && typeof attachment.attributes.sizes.thumbnail !== 'undefined' ) { - thumbSrc = attachment.attributes.sizes.thumbnail.url; - } else if ( typeof attachment.attributes.sizes !== 'undefined' ) { - var height = attachment.attributes.height; - - for ( var key in attachment.attributes.sizes ) { - var object = attachment.attributes.sizes[key]; - - if ( object.height < height ) { - height = object.height; - thumbSrc = object.url; - } - } - } else { - thumbSrc = attachment.attributes.icon; - } - - selector.find( '.upload-thumbnail' ).val( thumbSrc ); - if ( !selector.find( '.upload' ).hasClass( 'noPreview' ) ) { - selector.find( '.screenshot' ).empty().hide().append( '' ).slideDown( 'fast' ); - } - - //selector.find('.media_upload_button').unbind(); - selector.find( '.remove-image' ).removeClass( 'hide' );//show "Remove" button - selector.find( '.redux-background-properties' ).slideDown(); - } - ); - - // Finally, open the modal. - frame.open(); - }; - - // Function to remove the image on click. Still requires a save - redux.field_objects.media.removeFile = function( selector ) { - - // This shouldn't have been run... - if ( !selector.find( '.remove-image' ).addClass( 'hide' ) ) { - return; - } - - selector.find( '.remove-image' ).addClass( 'hide' );//hide "Remove" button - selector.find( '.upload' ).val( '' ); - selector.find( '.upload-id' ).val( '' ); - selector.find( '.upload-height' ).val( '' ); - selector.find( '.upload-width' ).val( '' ); - selector.find( '.upload-thumbnail' ).val( '' ); - redux_change( $( selector ).find( '.upload-id' ) ); - selector.find( '.redux-background-properties' ).hide(); - - var screenshot = selector.find( '.screenshot' ); - - // Hide the screenshot - screenshot.slideUp(); - - selector.find( '.remove-file' ).unbind(); - - // We don't display the upload button if .upload-notice is present - // This means the user doesn't have the WordPress 3.5 Media Library Support - if ( selector.find( '.section-upload .upload-notice' ).length > 0 ) { - selector.find( '.media_upload_button' ).remove(); - } - }; -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/media/media.min.js b/admin/core/lib/ReduxFramework/ReduxCore/assets/js/media/media.min.js deleted file mode 100755 index 8c7bb839..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/media/media.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.media=redux.field_objects.media||{};var b;a(document).ready(function(){}),redux.field_objects.media.init=function(c){c||(c=a(document).find(".redux-group-tab:visible").find(".redux-container-media:visible")),a(c).each(function(){var c=a(this),d=c;c.hasClass("redux-field-container")||(d=c.parents(".redux-field-container:first")),d.is(":hidden")||d.hasClass("redux-field-init")&&(d.removeClass("redux-field-init"),b=!1,c.find(".remove-image, .remove-file").unbind("click").on("click",function(){redux.field_objects.media.removeFile(a(this).parents("fieldset.redux-field:first"))}),c.find(".media_upload_button").unbind().on("click",function(b){redux.field_objects.media.addFile(b,a(this).parents("fieldset.redux-field:first"))}))})},redux.field_objects.media.addFile=function(c,d){c.preventDefault();var e,f,g=a(this);if(e)return void e.open();var h=a(d).find(".library-filter").data("lib-filter");void 0!==h&&""!==h&&(f=[],b=!0,h=decodeURIComponent(h),h=JSON.parse(h),a.each(h,function(a,b){f.push(b)})),e=wp.media({multiple:!1,library:{type:f},title:g.data("choose"),button:{text:g.data("update")}}),e.on("select",function(){var c=e.state().get("selection").first();e.close();var f=a(d).find(".data").data();if(("undefined"==typeof redux.field_objects.media||void 0===typeof redux.field_objects.media)&&(redux.field_objects.media={}),(void 0===f||"undefined"===f.mode)&&(f={},f.mode="image"),b===!0&&(f.mode=0),0===f.mode);else if(f.mode!==!1&&c.attributes.type!==f.mode&&c.attributes.subtype!==f.mode)return;d.find(".upload").val(c.attributes.url),d.find(".upload-id").val(c.attributes.id),d.find(".upload-height").val(c.attributes.height),d.find(".upload-width").val(c.attributes.width),redux_change(a(d).find(".upload-id"));var g=c.attributes.url;if("undefined"!=typeof c.attributes.sizes&&"undefined"!=typeof c.attributes.sizes.thumbnail)g=c.attributes.sizes.thumbnail.url;else if("undefined"!=typeof c.attributes.sizes){var h=c.attributes.height;for(var i in c.attributes.sizes){var j=c.attributes.sizes[i];j.height').slideDown("fast"),d.find(".remove-image").removeClass("hide"),d.find(".redux-background-properties").slideDown()}),e.open()},redux.field_objects.media.removeFile=function(b){if(b.find(".remove-image").addClass("hide")){b.find(".remove-image").addClass("hide"),b.find(".upload").val(""),b.find(".upload-id").val(""),b.find(".upload-height").val(""),b.find(".upload-width").val(""),b.find(".upload-thumbnail").val(""),redux_change(a(b).find(".upload-id")),b.find(".redux-background-properties").hide();var c=b.find(".screenshot");c.slideUp(),b.find(".remove-file").unbind(),b.find(".section-upload .upload-notice").length>0&&b.find(".media_upload_button").remove()}}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/redux.js b/admin/core/lib/ReduxFramework/ReduxCore/assets/js/redux.js deleted file mode 100755 index a9feac4e..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/redux.js +++ /dev/null @@ -1,1818 +0,0 @@ -/* global redux, confirm, relid:true, jsonView */ - -(function( $ ) { - 'use strict'; - - $.redux = $.redux || {}; - - $( document ).ready( - function() { - $.fn.isOnScreen = function() { - if ( !window ) { - return; - } - - var win = $( window ); - var viewport = { - top: win.scrollTop(), - }; - - viewport.right = viewport.left + win.width(); - viewport.bottom = viewport.top + win.height(); - - var bounds = this.offset(); - - bounds.right = bounds.left + this.outerWidth(); - bounds.bottom = bounds.top + this.outerHeight(); - - return (!(viewport.right < bounds.left || viewport.left > bounds.right || viewport.bottom < bounds.top || viewport.top > bounds.bottom)); - }; - - $.redux.hideFields(); - $.redux.checkRequired(); - $.redux.initEvents(); - $.redux.initQtip(); - $.redux.tabCheck(); - $.redux.notices(); - $.redux.tabControl(); - } - ); - - $.redux.ajax_save = function( button ) { - - var overlay = $( document.getElementById( 'redux_ajax_overlay' ) ); - overlay.fadeIn(); - - // Add the loading mechanism - jQuery( '.redux-action_bar .spinner' ).addClass( 'is-active' ); - - jQuery( '.redux-action_bar input' ).attr( 'disabled', 'disabled' ); - var $notification_bar = jQuery( document.getElementById( 'redux_notification_bar' ) ); - $notification_bar.slideUp(); - jQuery( '.redux-save-warn' ).slideUp(); - jQuery( '.redux_ajax_save_error' ).slideUp( - 'medium', function() { - jQuery( this ).remove(); - } - ); - - var $parent = jQuery( document.getElementById( "redux-form-wrapper" ) ); - - // Editor field doesn't auto save. Have to call it. Boo. - if ( redux.fields.hasOwnProperty( "editor" ) ) { - $.each( - redux.fields.editor, function( $key, $index ) { - if ( typeof(tinyMCE) !== 'undefined' ) { - var editor = tinyMCE.get( $key ); - if ( editor ) { - editor.save(); - } - } - } - ); - } - - var $data = $parent.serialize(); - // add values for checked and unchecked checkboxes fields - $parent.find( 'input[type=checkbox]' ).each( - function() { - if ( typeof $( this ).attr( 'name' ) !== "undefined" ) { - var chkVal = $( this ).is( ':checked' ) ? $( this ).val() : "0"; - $data += "&" + $( this ).attr( 'name' ) + "=" + chkVal; - } - } - ); - - - if ( button.attr( 'name' ) != "redux_save" ) { - $data += "&" + button.attr( 'name' ) + "=" + button.val(); - } - - var $nonce = $parent.attr( "data-nonce" ); - - jQuery.ajax( - { - type: "post", - dataType: "json", - url: ajaxurl, - data: { - action: redux.args.opt_name + "_ajax_save", - nonce: $nonce, - 'opt_name': redux.args.opt_name, - data: $data - }, - error: function( response ) { - if ( !window.console ) console = {}; - console.log = console.log || function( name, data ) { - }; - console.log( redux.ajax.console ); - console.log( response.responseText ); - jQuery( '.redux-action_bar input' ).removeAttr( 'disabled' ); - overlay.fadeOut( 'fast' ); - jQuery( '.redux-action_bar .spinner' ).removeClass( 'is-active' ); - alert( redux.ajax.alert ); - }, - success: function( response ) { - if ( response.action && response.action == "reload" ) { - location.reload( true ); - } else if ( response.status == "success" ) { - jQuery( '.redux-action_bar input' ).removeAttr( 'disabled' ); - overlay.fadeOut( 'fast' ); - jQuery( '.redux-action_bar .spinner' ).removeClass( 'is-active' ); - redux.options = response.options; - //redux.defaults = response.defaults; - redux.errors = response.errors; - redux.warnings = response.warnings; - - $notification_bar.html( response.notification_bar ).slideDown( 'fast' ); - if ( response.errors !== null || response.warnings !== null ) { - $.redux.notices(); - } - var $save_notice = $( document.getElementById( 'redux_notification_bar' ) ).find( '.saved_notice' ); - $save_notice.slideDown(); - $save_notice.delay( 4000 ).slideUp(); - } else { - jQuery( '.redux-action_bar input' ).removeAttr( 'disabled' ); - jQuery( '.redux-action_bar .spinner' ).removeClass( 'is-active' ); - overlay.fadeOut( 'fast' ); - jQuery( '.wrap h2:first' ).parent().append( '

' ); - jQuery( '.redux_ajax_save_error' ).slideDown(); - jQuery( "html, body" ).animate( {scrollTop: 0}, "slow" ); - } - } - } - ); - return false; - }; - - $.redux.initEvents = function() { - $( '.redux-presets-bar' ).on( - 'click', function() { - window.onbeforeunload = null; - } - ); - - - $( '#toplevel_page_' + redux.args.slug + ' .wp-submenu a, #wp-admin-bar-' + redux.args.slug + ' a.ab-item' ).click( - function( e ) { - - if ( ( $( '#toplevel_page_' + redux.args.slug ).hasClass( 'wp-menu-open' ) || $( this ).hasClass( 'ab-item' ) ) && !$( this ).parents( 'ul.ab-submenu:first' ).hasClass( 'ab-sub-secondary' ) && $( this ).attr( 'href' ).toLowerCase().indexOf( redux.args.slug + "&tab=" ) >= 0 ) { - e.preventDefault(); - var url = $( this ).attr( 'href' ).split( '&tab=' ); - $( '#' + url[1] + '_section_group_li_a' ).click(); - $( this ).parents( 'ul:first' ).find( '.current' ).removeClass( 'current' ); - $( this ).addClass( 'current' ); - $( this ).parent().addClass( 'current' ); - return false; - } - } - ); - - // Save button clicked - $( '.redux-action_bar input' ).on( - 'click', function( e ) { - if ( $( this ).attr( 'name' ) == redux.args.opt_name + '[defaults]' ) { - // Defaults button clicked - if ( !confirm( redux.args.reset_confirm ) ) { - return false; - } - } else if ( $( this ).attr( 'name' ) == redux.args.opt_name + '[defaults-section]' ) { - // Default section clicked - if ( !confirm( redux.args.reset_section_confirm ) ) { - return false; - } - } - - window.onbeforeunload = null; - - if ( redux.args.ajax_save === true ) { - $.redux.ajax_save( $( this ) ); - e.preventDefault(); - } - } - ); - // - //// Default button clicked - //$( 'input[name="' + redux.args.opt_name + '[defaults]"]' ).click( - // function() { - // if ( !confirm( redux.args.reset_confirm ) ) { - // return false; - // } - // window.onbeforeunload = null; - // } - //); - - - //$( 'input[name="' + redux.args.opt_name + '[defaults-section]"]' ).click( - // function() { - // if ( !confirm( redux.args.reset_section_confirm ) ) { - // return false; - // } - // - // window.onbeforeunload = null; - // } - //); - //$( '.redux-save' ).click( - // function() { - // window.onbeforeunload = null; - // } - //); - - $( '.expand_options' ).click( - function( e ) { - - e.preventDefault(); - - var container = $( '.redux-container' ); - if ( $( container ).hasClass( 'fully-expanded' ) ) { - $( container ).removeClass( 'fully-expanded' ); - - var tab = $.cookie( "redux_current_tab" ); - - $( '.redux-container:first' ).find( '#' + tab + '_section_group' ).fadeIn( - 200, function() { - if ( $( '.redux-container:first' ).find( '#redux-footer' ).length !== 0 ) { - $.redux.stickyInfo(); // race condition fix - } - $.redux.initFields(); - } - ); - } - - $.redux.expandOptions( $( this ).parents( '.redux-container:first' ) ); - - return false; - } - ); - - if ( $( '.saved_notice' ).is( ':visible' ) ) { - $( '.saved_notice' ).slideDown(); - } - - $( document.body ).on( - 'change', '.redux-field input, .redux-field textarea, .redux-field select', function() { - if ( !$( this ).hasClass( 'noUpdate' ) ) { - redux_change( $( this ) ); - } - } - ); - - var stickyHeight = $( '#redux-footer' ).height(); - - $( '#redux-sticky-padder' ).css( - { - height: stickyHeight - } - ); - $( '#redux-footer-sticky' ).removeClass( 'hide' ); - - if ( $( '#redux-footer' ).length !== 0 ) { - $( window ).scroll( - function() { - $.redux.stickyInfo(); - } - ); - - $( window ).resize( - function() { - $.redux.stickyInfo(); - } - ); - } - - $( '.saved_notice' ).delay( 4000 ).slideUp(); - - - }; - - $.redux.hideFields = function() { - $( "label[for='redux_hide_field']" ).each( - function( idx, val ) { - var tr = $( this ).parent().parent(); - $( tr ).addClass( 'hidden' ); - } - ); - }; - - $.redux.checkRequired = function() { - $.redux.required(); - - $( "body" ).on( - 'change', - '.redux-main select, .redux-main radio, .redux-main input[type=checkbox], .redux-main input[type=hidden]', - function( e ) { - $.redux.check_dependencies( this ); - } - ); - - $( "body" ).on( - 'check_dependencies', function( e, variable ) { - $.redux.check_dependencies( variable ); - } - ); - - $( 'td > fieldset:empty,td > div:empty' ).parent().parent().hide(); - }; - - $.redux.initQtip = function() { - if ( $().qtip ) { - // Shadow - var shadow = ''; - var tip_shadow = redux.args.hints.tip_style.shadow; - - if ( tip_shadow === true ) { - shadow = 'qtip-shadow'; - } - - // Color - var color = ''; - var tip_color = redux.args.hints.tip_style.color; - - if ( tip_color !== '' ) { - color = 'qtip-' + tip_color; - } - - // Rounded - var rounded = ''; - var tip_rounded = redux.args.hints.tip_style.rounded; - - if ( tip_rounded === true ) { - rounded = 'qtip-rounded'; - } - - // Tip style - var style = ''; - var tip_style = redux.args.hints.tip_style.style; - - if ( tip_style !== '' ) { - style = 'qtip-' + tip_style; - } - - var classes = shadow + ',' + color + ',' + rounded + ',' + style + ',redux-qtip'; - classes = classes.replace( /,/g, ' ' ); - - // Get position data - var myPos = redux.args.hints.tip_position.my; - var atPos = redux.args.hints.tip_position.at; - - // Gotta be lowercase, and in proper format - myPos = $.redux.verifyPos( myPos.toLowerCase(), true ); - atPos = $.redux.verifyPos( atPos.toLowerCase(), false ); - - // Tooltip trigger action - var showEvent = redux.args.hints.tip_effect.show.event; - var hideEvent = redux.args.hints.tip_effect.hide.event; - - // Tip show effect - var tipShowEffect = redux.args.hints.tip_effect.show.effect; - var tipShowDuration = redux.args.hints.tip_effect.show.duration; - - // Tip hide effect - var tipHideEffect = redux.args.hints.tip_effect.hide.effect; - var tipHideDuration = redux.args.hints.tip_effect.hide.duration; - - $( 'div.redux-dev-qtip' ).each( - function() { - $( this ).qtip( - { - content: { - text: $( this ).attr( 'qtip-content' ), - title: $( this ).attr( 'qtip-title' ) - }, - show: { - effect: function() { - $( this ).slideDown( 500 ); - }, - event: 'mouseover', - }, - hide: { - effect: function() { - $( this ).slideUp( 500 ); - }, - event: 'mouseleave', - }, - style: { - classes: 'qtip-shadow qtip-light', - }, - position: { - my: 'top center', - at: 'bottom center', - }, - } - ); - } - ); - - $( 'div.redux-hint-qtip' ).each( - function() { - $( this ).qtip( - { - content: { - text: $( this ).attr( 'qtip-content' ), - title: $( this ).attr( 'qtip-title' ) - }, - show: { - effect: function() { - switch ( tipShowEffect ) { - case 'slide': - $( this ).slideDown( tipShowDuration ); - break; - case 'fade': - $( this ).fadeIn( tipShowDuration ); - break; - default: - $( this ).show(); - break; - } - }, - event: showEvent, - }, - hide: { - effect: function() { - switch ( tipHideEffect ) { - case 'slide': - $( this ).slideUp( tipHideDuration ); - break; - case 'fade': - $( this ).fadeOut( tipHideDuration ); - break; - default: - $( this ).hide( tipHideDuration ); - break; - } - }, - event: hideEvent, - }, - style: { - classes: classes, - }, - position: { - my: myPos, - at: atPos, - }, - } - ); - } - ); - // }); - - $( 'input[qtip-content]' ).each( - function() { - $( this ).qtip( - { - content: { - text: $( this ).attr( 'qtip-content' ), - title: $( this ).attr( 'qtip-title' ) - }, - show: 'focus', - hide: 'blur', - style: classes, - position: { - my: myPos, - at: atPos, - }, - } - ); - } - ); - } - }; - - $.redux.tabCheck = function() { - $( '.redux-group-tab-link-a' ).click( - function() { - var link = $( this ); - if ( link.parent().hasClass( 'empty_section' ) && link.parent().hasClass( 'hasSubSections' ) ) { - var elements = $( this ).closest( 'ul' ).find( '.redux-group-tab-link-a' ); - var index = elements.index( this ); - link = elements.slice( index + 1, index + 2 ); - } - var el = link.parents( '.redux-container:first' ); - var relid = link.data( 'rel' ); // The group ID of interest - var oldid = el.find( '.redux-group-tab-link-li.active:first .redux-group-tab-link-a' ).data( 'rel' ); - - //console.log('id: '+relid+' oldid: '+oldid); - - if ( oldid === relid ) { - return; - } - - $( '#currentSection' ).val( relid ); - if ( !link.parents( '.postbox-container:first' ).length ) { - // Set the proper page cookie - $.cookie( - 'redux_current_tab', relid, { - expires: 7, - path: '/' - } - ); - } - - if ( el.find( '#' + relid + '_section_group_li' ).parents( '.redux-group-tab-link-li' ).length ) { - var parentID = el.find( '#' + relid + '_section_group_li' ).parents( '.redux-group-tab-link-li' ).attr( 'id' ).split( '_' ); - parentID = parentID[0]; - } - - el.find( '#toplevel_page_' + redux.args.slug + ' .wp-submenu a.current' ).removeClass( 'current' ); - el.find( '#toplevel_page_' + redux.args.slug + ' .wp-submenu li.current' ).removeClass( 'current' ); - - el.find( '#toplevel_page_' + redux.args.slug + ' .wp-submenu a' ).each( - function() { - var url = $( this ).attr( 'href' ).split( '&tab=' ); - if ( url[1] == relid || url[1] == parentID ) { - $( this ).addClass( 'current' ); - $( this ).parent().addClass( 'current' ); - } - } - ); - - if ( el.find( '#' + oldid + '_section_group_li' ).find( '#' + oldid + '_section_group_li' ).length ) { - //console.log('RELID is child of oldid'); - el.find( '#' + oldid + '_section_group_li' ).addClass( 'activeChild' ); - el.find( '#' + relid + '_section_group_li' ).addClass( 'active' ).removeClass( 'activeChild' ); - } else if ( el.find( '#' + relid + '_section_group_li' ).parents( '#' + oldid + '_section_group_li' ).length || el.find( '#' + oldid + '_section_group_li' ).parents( 'ul.subsection' ).find( '#' + relid + '_section_group_li' ).length ) { - //console.log('RELID is sibling or child of OLDID'); - if ( el.find( '#' + relid + '_section_group_li' ).parents( '#' + oldid + '_section_group_li' ).length ) { - //console.log('child of oldid'); - el.find( '#' + oldid + '_section_group_li' ).addClass( 'activeChild' ).removeClass( 'active' ); - } else { - //console.log('sibling'); - el.find( '#' + relid + '_section_group_li' ).addClass( 'active' ); - el.find( '#' + oldid + '_section_group_li' ).removeClass( 'active' ); - } - el.find( '#' + relid + '_section_group_li' ).removeClass( 'activeChild' ).addClass( 'active' ); - } else { - el.find( '#' + relid + '_section_group_li' ).addClass( 'active' ).removeClass( 'activeChild' ).find( 'ul.subsection' ).slideDown(); - - if ( el.find( '#' + oldid + '_section_group_li' ).find( 'ul.subsection' ).length ) { - //console.log('oldid is parent'); - //console.log('#' + relid + '_section_group_li'); - - el.find( '#' + oldid + '_section_group_li' ).find( 'ul.subsection' ).slideUp( - 'fast', function() { - el.find( '#' + oldid + '_section_group_li' ).removeClass( 'active' ).removeClass( 'activeChild' ); - } - ); - var newParent = el.find( '#' + relid + '_section_group_li' ).parents( '.hasSubSections:first' ); - - if ( newParent.length > 0 ) { - el.find( '#' + relid + '_section_group_li' ).removeClass( 'active' ); - relid = newParent.find( '.redux-group-tab-link-a:first' ).data( 'rel' ); - //console.log(relid); - if ( newParent.hasClass( 'empty_section' ) ) { - newParent.find( '.subsection li:first' ).addClass( 'active' ); - el.find( '#' + relid + '_section_group_li' ).removeClass( 'active' ).addClass( 'activeChild' ).find( 'ul.subsection' ).slideDown(); - newParent = newParent.find( '.subsection li:first' ); - relid = newParent.find( '.redux-group-tab-link-a:first' ).data( 'rel' ); - //console.log('Empty section, do the next one?'); - } else { - el.find( '#' + relid + '_section_group_li' ).addClass( 'active' ).removeClass( 'activeChild' ).find( 'ul.subsection' ).slideDown(); - } - } - } else if ( el.find( '#' + oldid + '_section_group_li' ).parents( 'ul.subsection' ).length ) { - //console.log('oldid is a child'); - if ( !el.find( '#' + oldid + '_section_group_li' ).parents( '#' + relid + '_section_group_li' ).length ) { - //console.log('oldid is child, but not of relid'); - el.find( '#' + oldid + '_section_group_li' ).parents( 'ul.subsection' ).slideUp( - 'fast', function() { - el.find( '#' + oldid + '_section_group_li' ).removeClass( 'active' ); - el.find( '#' + oldid + '_section_group_li' ).parents( '.redux-group-tab-link-li' ).removeClass( 'active' ).removeClass( 'activeChild' ); - el.find( '#' + relid + '_section_group_li' ).parents( '.redux-group-tab-link-li' ).addClass( 'activeChild' ).find( 'ul.subsection' ).slideDown(); - el.find( '#' + relid + '_section_group_li' ).addClass( 'active' ); - } - ); - } else { - //console.log('oldid is child, but not of relid2'); - el.find( '#' + oldid + '_section_group_li' ).removeClass( 'active' ); - } - } else { - //console.log('Normal remove active from child'); - el.find( '#' + oldid + '_section_group_li' ).removeClass( 'active' ); - if ( el.find( '#' + relid + '_section_group_li' ).parents( '.redux-group-tab-link-li' ).length ) { - //console.log('here'); - el.find( '#' + relid + '_section_group_li' ).parents( '.redux-group-tab-link-li' ).addClass( 'activeChild' ).find( 'ul.subsection' ).slideDown(); - el.find( '#' + relid + '_section_group_li' ).addClass( 'active' ); - } - } - } - - // Show the group - el.find( '#' + oldid + '_section_group' ).hide(); - - el.find( '#' + relid + '_section_group' ).fadeIn( - 200, function() { - if ( el.find( '#redux-footer' ).length !== 0 ) { - $.redux.stickyInfo(); // race condition fix - } - $.redux.initFields(); - } - ); - $( '#toplevel_page_' + redux.args.slug ).find( '.current' ).removeClass( 'current' ); - - } - ); - - if ( redux.last_tab !== undefined ) { - $( '#' + redux.last_tab + '_section_group_li_a' ).click(); - return; - } - - var tab = decodeURI( (new RegExp( 'tab' + '=' + '(.+?)(&|$)' ).exec( location.search ) || [, ''])[1] ); - - if ( tab !== "" ) { - if ( $.cookie( "redux_current_tab_get" ) !== tab ) { - $.cookie( - 'redux_current_tab', tab, { - expires: 7, - path: '/' - } - ); - $.cookie( - 'redux_current_tab_get', tab, { - expires: 7, - path: '/' - } - ); - - $( '#' + tab + '_section_group_li' ).click(); - } - } else if ( $.cookie( 'redux_current_tab_get' ) !== "" ) { - $.removeCookie( 'redux_current_tab_get' ); - } - - var sTab = $( '#' + $.cookie( "redux_current_tab" ) + '_section_group_li_a' ); - - // Tab the first item or the saved one - if ( $.cookie( "redux_current_tab" ) === null || typeof ($.cookie( "redux_current_tab" )) === "undefined" || sTab.length === 0 ) { - $( '.redux-container' ).find( '.redux-group-tab-link-a:first' ).click(); - } else { - sTab.click(); - } - - }; - - $.redux.initFields = function() { - $( ".redux-group-tab:visible" ).find( ".redux-field-init:visible" ).each( - function() { - - var type = $( this ).attr( 'data-type' ); - //console.log(type); - if ( typeof redux.field_objects != 'undefined' && redux.field_objects[type] && redux.field_objects[type] ) { - redux.field_objects[type].init(); - } - if ( !redux.customizer && $( this ).hasClass( 'redux_remove_th' ) ) { - - var tr = $( this ).parents( 'tr:first' ); - var th = tr.find( 'th:first' ); - if ( th.html() && th.html().length > 0 ) { - $( this ).prepend( th.html() ); - $( this ).find( '.redux_field_th' ).css( 'padding', '0 0 10px 0' ); - } - $( this ).parent().attr( 'colspan', '2' ); - th.remove(); - } - } - ); - }; - - $.redux.notices = function() { - if ( redux.errors && redux.errors.errors ) { - $.each( - redux.errors.errors, function( sectionID, sectionArray ) { - $.each( - sectionArray.errors, function( key, value ) { - $( "#" + redux.args.opt_name + '-' + value.id ).addClass( "redux-field-error" ); - if ( $( "#" + redux.args.opt_name + '-' + value.id ).parent().find( '.redux-th-error' ).length === 0 ) { - $( "#" + redux.args.opt_name + '-' + value.id ).append( '
' + value.msg + '
' ); - } else { - $( "#" + redux.args.opt_name + '-' + value.id ).parent().find( '.redux-th-error' ).html( value.msg ).css( - 'display', 'block' - ); - } - } - ); - } - ); - $( '.redux-container' ).each( - function() { - var container = $( this ); - // Ajax cleanup - container.find( '.redux-menu-error' ).remove(); - var totalErrors = container.find( '.redux-field-error' ).length; - if ( totalErrors > 0 ) { - container.find( ".redux-field-errors span" ).text( totalErrors ); - container.find( ".redux-field-errors" ).slideDown(); - container.find( '.redux-group-tab' ).each( - function() { - var total = $( this ).find( '.redux-field-error' ).length; - if ( total > 0 ) { - var sectionID = $( this ).attr( 'id' ).split( '_' ); - sectionID = sectionID[0]; - container.find( '.redux-group-tab-link-a[data-key="' + sectionID + '"]' ).prepend( '' + total + '' ); - container.find( '.redux-group-tab-link-a[data-key="' + sectionID + '"]' ).addClass( "hasError" ); - var subParent = container.find( '.redux-group-tab-link-a[data-key="' + sectionID + '"]' ).parents( '.hasSubSections:first' ); - if ( subParent ) { - subParent.find( '.redux-group-tab-link-a:first' ).addClass( 'hasError' ); - } - } - } - ); - } - } - ); - } - if ( redux.warnings && redux.warnings.warnings ) { - $.each( - redux.warnings.warnings, function( sectionID, sectionArray ) { - $.each( - sectionArray.warnings, function( key, value ) { - $( "#" + redux.args.opt_name + '-' + value.id ).addClass( "redux-field-warning" ); - if ( $( "#" + redux.args.opt_name + '-' + value.id ).parent().find( '.redux-th-warning' ).length === 0 ) { - $( "#" + redux.args.opt_name + '-' + value.id ).append( '
' + value.msg + '
' ); - } else { - $( "#" + redux.args.opt_name + '-' + value.id ).parent().find( '.redux-th-warning' ).html( value.msg ).css( - 'display', 'block' - ); - } - } - ); - } - ); - $( '.redux-container' ).each( - function() { - var container = $( this ); - // Ajax cleanup - container.find( '.redux-menu-warning' ).remove(); - var totalWarnings = container.find( '.redux-field-warning' ).length; - if ( totalWarnings > 0 ) { - container.find( ".redux-field-warnings span" ).text( totalWarnings ); - container.find( ".redux-field-warnings" ).slideDown(); - container.find( '.redux-group-tab' ).each( - function() { - var total = $( this ).find( '.redux-field-warning' ).length; - if ( total > 0 ) { - var sectionID = $( this ).attr( 'id' ).split( '_' ); - sectionID = sectionID[0]; - container.find( '.redux-group-tab-link-a[data-key="' + sectionID + '"]' ).prepend( '' + total + '' ); - container.find( '.redux-group-tab-link-a[data-key="' + sectionID + '"]' ).addClass( "hasWarning" ); - var subParent = container.find( '.redux-group-tab-link-a[data-key="' + sectionID + '"]' ).parents( '.hasSubSections:first' ); - if ( subParent ) { - subParent.find( '.redux-group-tab-link-a:first' ).addClass( 'hasWarning' ); - } - } - } - ); - } - } - ); - } - }; - - $.redux.tabControl = function() { - $( '.redux-section-tabs div' ).hide(); - $( '.redux-section-tabs div:first' ).show(); - $( '.redux-section-tabs ul li:first' ).addClass( 'active' ); - - $( '.redux-section-tabs ul li a' ).click( - function() { - $( '.redux-section-tabs ul li' ).removeClass( 'active' ); - $( this ).parent().addClass( 'active' ); - - var currentTab = $( this ).attr( 'href' ); - - $( '.redux-section-tabs div' ).hide(); - $( currentTab ).fadeIn( - 'medium', function() { - $.redux.initFields(); - } - ); - - return false; - } - ); - }; - - $.redux.required = function() { - - // Hide the fold elements on load , - // It's better to do this by PHP but there is no filter in tr tag , so is not possible - // we going to move each attributes we may need for folding to tr tag - $.each( - redux.folds, function( i, v ) { - var fieldset = $( '#' + redux.args.opt_name + '-' + i ); - - fieldset.parents( 'tr:first' ).addClass( 'fold' ); - - if ( v == "hide" ) { - fieldset.parents( 'tr:first' ).addClass( 'hide' ); - - if ( fieldset.hasClass( 'redux-container-section' ) ) { - var div = $( '#section-' + i ); - - if ( div.hasClass( 'redux-section-indent-start' ) ) { - $( '#section-table-' + i ).hide().addClass( 'hide' ); - div.hide().addClass( 'hide' ); - } - } - - if ( fieldset.hasClass( 'redux-container-info' ) ) { - $( '#info-' + i ).hide().addClass( 'hide' ); - } - - if ( fieldset.hasClass( 'redux-container-divide' ) ) { - $( '#divide-' + i ).hide().addClass( 'hide' ); - } - - if ( fieldset.hasClass( 'redux-container-raw' ) ) { - var rawTable = fieldset.parents().find( 'table#' + redux.args.opt_name + '-' + i ); - rawTable.hide().addClass( 'hide' ); - } - } - } - ); - }; - - $.redux.get_container_value = function( id ) { - var value = $( '#' + redux.args.opt_name + '-' + id ).serializeForm(); - - if ( value !== null && typeof value === 'object' && value.hasOwnProperty( redux.args.opt_name ) ) { - value = value[redux.args.opt_name][id]; - } - if ( $( '#' + redux.args.opt_name + '-' + id ).hasClass( 'redux-container-media' ) ) { - value = value.url; - } - return value; - }; - - $.redux.check_dependencies = function( variable ) { - if ( redux.required === null ) { - return; - } - - var current = $( variable ), - id = current.parents( '.redux-field:first' ).data( 'id' ); - - if ( !redux.required.hasOwnProperty( id ) ) { - return; - } - - var container = current.parents( '.redux-field-container:first' ), - is_hidden = container.parents( 'tr:first' ).hasClass( '.hide' ); - - if ( !container.parents( 'tr:first' ).length ) { - is_hidden = container.parents( '.customize-control:first' ).hasClass( '.hide' ); - } - - $.each( - redux.required[id], function( child, dependents ) { - - var current = $( this ), - show = false, - childFieldset = $( '#' + redux.args.opt_name + '-' + child ), - tr = childFieldset.parents( 'tr:first' ); - - if ( !is_hidden ) { - show = $.redux.check_parents_dependencies( child ); - } - - if ( show === true ) { - // Shim for sections - if ( childFieldset.hasClass( 'redux-container-section' ) ) { - var div = $( '#section-' + child ); - - if ( div.hasClass( 'redux-section-indent-start' ) && div.hasClass( 'hide' ) ) { - $( '#section-table-' + child ).fadeIn( 300 ).removeClass( 'hide' ); - div.fadeIn( 300 ).removeClass( 'hide' ); - } - } - - if ( childFieldset.hasClass( 'redux-container-info' ) ) { - $( '#info-' + child ).fadeIn( 300 ).removeClass( 'hide' ); - } - - if ( childFieldset.hasClass( 'redux-container-divide' ) ) { - $( '#divide-' + child ).fadeIn( 300 ).removeClass( 'hide' ); - } - - if ( childFieldset.hasClass( 'redux-container-raw' ) ) { - var rawTable = childFieldset.parents().find( 'table#' + redux.args.opt_name + '-' + child ); - rawTable.fadeIn( 300 ).removeClass( 'hide' ); - } - - tr.fadeIn( - 300, function() { - $( this ).removeClass( 'hide' ); - if ( redux.required.hasOwnProperty( child ) ) { - $.redux.check_dependencies( $( '#' + redux.args.opt_name + '-' + child ).children().first() ); - } - $.redux.initFields(); - } - ); - if ( childFieldset.hasClass( 'redux-container-section' ) || childFieldset.hasClass( 'redux-container-info' ) ) { - tr.css( {display: 'none'} ); - } - } else if ( show === false ) { - tr.fadeOut( - 100, function() { - $( this ).addClass( 'hide' ); - if ( redux.required.hasOwnProperty( child ) ) { - //console.log('Now check, reverse: '+child); - $.redux.required_recursive_hide( child ); - } - } - ); - } - - current.find( 'select, radio, input[type=checkbox]' ).trigger( 'change' ); - } - ); - }; - - $.redux.required_recursive_hide = function( id ) { - var toFade = $( '#' + redux.args.opt_name + '-' + id ).parents( 'tr:first' ); - - toFade.fadeOut( - 50, function() { - $( this ).addClass( 'hide' ); - - if ( $( '#' + redux.args.opt_name + '-' + id ).hasClass( 'redux-container-section' ) ) { - var div = $( '#section-' + id ); - if ( div.hasClass( 'redux-section-indent-start' ) ) { - $( '#section-table-' + id ).fadeOut( 50 ).addClass( 'hide' ); - div.fadeOut( 50 ).addClass( 'hide' ); - } - } - - if ( $( '#' + redux.args.opt_name + '-' + id ).hasClass( 'redux-container-info' ) ) { - $( '#info-' + id ).fadeOut( 50 ).addClass( 'hide' ); - } - - if ( $( '#' + redux.args.opt_name + '-' + id ).hasClass( 'redux-container-divide' ) ) { - $( '#divide-' + id ).fadeOut( 50 ).addClass( 'hide' ); - } - - if ( $( '#' + redux.args.opt_name + '-' + id ).hasClass( 'redux-container-raw' ) ) { - var rawTable = $( '#' + redux.args.opt_name + '-' + id ).parents().find( 'table#' + redux.args.opt_name + '-' + id ); - rawTable.fadeOut( 50 ).addClass( 'hide' ); - } - - if ( redux.required.hasOwnProperty( id ) ) { - $.each( - redux.required[id], function( child ) { - $.redux.required_recursive_hide( child ); - } - ); - } - } - ); - }; - - $.redux.check_parents_dependencies = function( id ) { - var show = ""; - - if ( redux.required_child.hasOwnProperty( id ) ) { - $.each( - redux.required_child[id], function( i, parentData ) { - if ( $( '#' + redux.args.opt_name + '-' + parentData.parent ).parents( 'tr:first' ).hasClass( '.hide' ) ) { - show = false; - } else { - if ( show !== false ) { - var parentValue = $.redux.get_container_value( parentData.parent ); - show = $.redux.check_dependencies_visibility( parentValue, parentData ); - } - } - } - ); - } else { - show = true; - } - return show; - }; - - $.redux.check_dependencies_visibility = function( parentValue, data ) { - var show = false, - checkValue_array, - checkValue = data.checkValue, - operation = data.operation, - arr; - - switch ( operation ) { - case '=': - case 'equals': - // if ($.isPlainObject(parentValue)) { - // var arr = Object.keys(parentValue).map(function (key) {return parentValue[key]}); - // parentValue = arr; - // } - - if ( $.isArray( parentValue ) ) { - $( parentValue[0] ).each( - function( idx, val ) { - if ( $.isArray( checkValue ) ) { - $( checkValue ).each( - function( i, v ) { - if ( val == v ) { - show = true; - return true; - } - } - ); - } else { - if ( val == checkValue ) { - show = true; - return true; - } - } - } - ); - } else { - if ( $.isArray( checkValue ) ) { - $( checkValue ).each( - function( i, v ) { - if ( parentValue == v ) { - show = true; - } - } - ); - } else { - if ( parentValue == checkValue ) { - show = true; - } - } - } - break; - - case '!=': - case 'not': - if ( $.isArray( parentValue ) ) { - $( parentValue ).each( - function( idx, val ) { - if ( $.isArray( checkValue ) ) { - $( checkValue ).each( - function( i, v ) { - if ( val != v ) { - show = true; - return true; - } - } - ); - } else { - if ( val != checkValue ) { - show = true; - return true; - } - } - } - ); - } else { - if ( $.isArray( checkValue ) ) { - $( checkValue ).each( - function( i, v ) { - if ( parentValue != v ) { - show = true; - } - } - ); - } else { - if ( parentValue != checkValue ) { - show = true; - } - } - } - break; - - case '>': - case 'greater': - case 'is_larger': - if ( parseFloat( parentValue ) > parseFloat( checkValue ) ) { - show = true; - } - break; - - case '>=': - case 'greater_equal': - case 'is_larger_equal': - if ( parseFloat( parentValue ) >= parseFloat( checkValue ) ) { - show = true; - } - break; - - case '<': - case 'less': - case 'is_smaller': - if ( parseFloat( parentValue ) < parseFloat( checkValue ) ) { - show = true; - } - break; - - case '<=': - case 'less_equal': - case 'is_smaller_equal': - if ( parseFloat( parentValue ) <= parseFloat( checkValue ) ) { - show = true; - } - break; - - case 'contains': - if ( $.isPlainObject( parentValue ) ) { - parentValue = Object.keys( parentValue ).map( - function( key ) { - return [key, parentValue[key]]; - } - ); - } - - if ( $.isPlainObject( checkValue ) ) { - checkValue = Object.keys( checkValue ).map( - function( key ) { - return [key, checkValue[key]]; - } - ); - } - - if ( $.isArray( checkValue ) ) { - $( checkValue ).each( - function( idx, val ) { - var breakMe = false; - var toFind = val[0]; - var findVal = val[1]; - - $( parentValue ).each( - function( i, v ) { - var toMatch = v[0]; - var matchVal = v[1]; - - if ( toFind === toMatch ) { - if ( findVal == matchVal ) { - show = true; - breakMe = true; - - return false; - } - } - } - ); - - if ( breakMe === true ) { - return false; - } - } - ); - } else { - if ( parentValue.toString().indexOf( checkValue ) !== -1 ) { - show = true; - } - } - break; - - case 'doesnt_contain': - case 'not_contain': - if ( $.isPlainObject( parentValue ) ) { - arr = Object.keys( parentValue ).map( - function( key ) { - return parentValue[key]; - } - ); - parentValue = arr; - } - - if ( $.isPlainObject( checkValue ) ) { - arr = Object.keys( checkValue ).map( - function( key ) { - return checkValue[key]; - } - ); - checkValue = arr; - } - - if ( $.isArray( checkValue ) ) { - $( checkValue ).each( - function( idx, val ) { - if ( parentValue.toString().indexOf( val ) === -1 ) { - show = true; - } - } - ); - } else { - if ( parentValue.toString().indexOf( checkValue ) === -1 ) { - show = true; - } - } - break; - - case 'is_empty_or': - if ( parentValue === "" || parentValue == checkValue ) { - show = true; - } - break; - - case 'not_empty_and': - if ( parentValue !== "" && parentValue != checkValue ) { - show = true; - } - break; - - case 'is_empty': - case 'empty': - case '!isset': - if ( !parentValue || parentValue === "" || parentValue === null ) { - show = true; - } - break; - - case 'not_empty': - case '!empty': - case 'isset': - if ( parentValue && parentValue !== "" && parentValue !== null ) { - show = true; - } - break; - } - return show; - - }; - - $.redux.verifyPos = function( s, b ) { - - // trim off spaces - s = s.replace( /^\s+|\s+$/gm, '' ); - - // position value is blank, set the default - if ( s === '' || s.search( ' ' ) == -1 ) { - if ( b === true ) { - return 'top left'; - } else { - return 'bottom right'; - } - } - - // split string into array - var split = s.split( ' ' ); - - // Evaluate first string. Must be top, center, or bottom - var paramOne = b ? 'top' : 'bottom'; - if ( split[0] == 'top' || split[0] == 'center' || split[0] == 'bottom' ) { - paramOne = split[0]; - } - - // Evaluate second string. Must be left, center, or right. - var paramTwo = b ? 'left' : 'right'; - if ( split[1] == 'left' || split[1] == 'center' || split[1] == 'right' ) { - paramTwo = split[1]; - } - - return paramOne + ' ' + paramTwo; - }; - - $.redux.stickyInfo = function() { - var stickyWidth = $( '.redux-main' ).innerWidth() - 20; - - if ( !$( '#info_bar' ).isOnScreen() && !$( '#redux-footer-sticky' ).isOnScreen() ) { - $( '#redux-footer' ).css( - { - position: 'fixed', - bottom: '0', - width: stickyWidth, - right: 21 - } - ); - $( '#redux-footer' ).addClass( 'sticky-footer-fixed' ); - $( '.redux-save-warn' ).css( 'left', $( '#redux-sticky' ).offset().left ); - $( '#redux-sticky-padder' ).show(); - } else { - $( '#redux-footer' ).css( - { - background: '#eee', - position: 'inherit', - bottom: 'inherit', - width: 'inherit' - } - ); - $( '#redux-sticky-padder' ).hide(); - $( '#redux-footer' ).removeClass( 'sticky-footer-fixed' ); - } - if ( !$( '#info_bar' ).isOnScreen() ) { - $( '#redux-sticky' ).addClass( 'sticky-save-warn' ); - } else { - $( '#redux-sticky' ).removeClass( 'sticky-save-warn' ); - } - }; - - $.redux.expandOptions = function( parent ) { - var trigger = parent.find( '.expand_options' ); - var width = parent.find( '.redux-sidebar' ).width() - 1; - var id = $( '.redux-group-menu .active a' ).data( 'rel' ) + '_section_group'; - - if ( trigger.hasClass( 'expanded' ) ) { - trigger.removeClass( 'expanded' ); - parent.find( '.redux-main' ).removeClass( 'expand' ); - - parent.find( '.redux-sidebar' ).stop().animate( - { - 'margin-left': '0px' - }, 500 - ); - - parent.find( '.redux-main' ).stop().animate( - { - 'margin-left': width - }, 500, function() { - parent.find( '.redux-main' ).attr( 'style', '' ); - } - ); - - parent.find( '.redux-group-tab' ).each( - function() { - if ( $( this ).attr( 'id' ) !== id ) { - $( this ).fadeOut( 'fast' ); - } - } - ); - // Show the only active one - } else { - trigger.addClass( 'expanded' ); - parent.find( '.redux-main' ).addClass( 'expand' ); - - parent.find( '.redux-sidebar' ).stop().animate( - { - 'margin-left': -width - 113 - }, 500 - ); - - parent.find( '.redux-main' ).stop().animate( - { - 'margin-left': '-1px' - }, 500 - ); - - parent.find( '.redux-group-tab' ).fadeIn( - 'medium', function() { - $.redux.initFields(); - } - ); - } - return false; - }; - - - $.redux.scaleToRatio = function( el, maxHeight, maxWidth ) { - var ratio = 0; // Used for aspect ratio - - var width = el.attr( 'data-width' ); - if ( !width ) { - width = el.width(); - el.attr( 'data-width', width ); - } - var height = el.attr( 'data-height' ); - var eHeight = el.height(); - if ( !height || eHeight > height ) { - height = eHeight; - el.attr( 'data-height', height ); - el.css( "width", 'auto' ); - el.attr( 'data-width', el.width() ); - width = el.width(); - } - - - // Check if the current width is larger than the max - if ( width > maxWidth ) { - ratio = maxWidth / width; // get ratio for scaling image - el.css( "width", maxWidth ); // Set new width - el.css( "height", height * ratio ); // Scale height based on ratio - height = height * ratio; // Reset height to match scaled image - width = width * ratio; // Reset width to match scaled image - - } else { - el.css( "width", 'auto' ); // Set new height - - } - - // Check if current height is larger than max - if ( height > maxHeight ) { - ratio = maxHeight / height; // get ratio for scaling image - el.css( "height", maxHeight ); // Set new height - el.css( "width", width * ratio ); // Scale width based on ratio - width = width * ratio; // Reset width to match scaled image - height = height * ratio; // Reset height to match scaled image - - - } else { - el.css( "height", 'auto' ); // Set new height - - } - - var test = ($( document.getElementById( 'redux-header' ) ).height() - el.height()) / 2; - if ( test > 0 ) { - el.css( "margin-top", test ); - } else { - el.css( "margin-top", 0 ); - } - - if ( $( '#redux-header .redux_field_search' ) ) { - $( '#redux-header .redux_field_search' ).css( 'right', ($( el ).width() + 20) ); - } - - - }; - $.redux.resizeAds = function() { - var el = $( '#redux-header' ); - var maxWidth; - if ( el.length ) { - maxWidth = el.width() - el.find( '.display_header' ).width() - 30; - } else { - el = $( '#customize-info' ); - maxWidth = el.width(); - } - - var maxHeight = el.height(); - var rAds = el.find( '.rAds' ); - - $( rAds ).find( 'video' ).each( - function() { - $.redux.scaleToRatio( $( this ), maxHeight, maxWidth ); - } - ); - $( rAds ).find( 'img' ).each( - function() { - $.redux.scaleToRatio( $( this ), maxHeight, maxWidth ); - } - ); - $( rAds ).find( 'div' ).each( - function() { - $.redux.scaleToRatio( $( this ), maxHeight, maxWidth ); - } - ); - - if ( rAds.css( 'left' ) == "-99999px" ) { - rAds.css( 'display', 'none' ).css( 'left', 'auto' ); - } - rAds.fadeIn( 'slow' ); - }; - $( document ).ready( - function() { - if ( redux.rAds ) { - setTimeout( - function() { - var el; - if ( $( '#redux-header' ).length > 0 ) { - $( '#redux-header' ).append( '
' ); - el = $( '#redux-header' ); - } else { - $( '#customize-theme-controls ul' ).first().prepend( '
  • ' ); - el = $( '#redux_rAds' ); - } - - el.css( 'position', 'relative' ); - - el.find( '.rAds' ).attr( - 'style', - 'position:absolute; top: 6px; right: 6px; display:block !important;overflow:hidden;' - ).css( 'left', '-99999px' ); - el.find( '.rAds' ).html( redux.rAds.replace( //, '' ) ); - var rAds = el.find( '.rAds' ); - - var maxHeight = el.height(); - var maxWidth = el.width() - el.find( '.display_header' ).width() - 30; - - rAds.find( 'a' ).css( 'float', 'right' ).css( 'line-height', el.height() + 'px' ).css( - 'margin-left', '5px' - ); - - $( document ).ajaxComplete( - function() { - rAds.find( 'a' ).hide(); - setTimeout( - function() { - $.redux.resizeAds(); - rAds.find( 'a' ).fadeIn(); - }, 1400 - ); - setTimeout( - function() { - $.redux.resizeAds(); - - }, 1500 - ); - $( document ).unbind( 'ajaxComplete' ); - } - ); - - $( window ).resize( - function() { - $.redux.resizeAds(); - } - ); - }, 400 - ); - - } - } - ); -})( jQuery ); - -jQuery.noConflict(); - -var confirmOnPageExit = function( e ) { - //return; // ONLY FOR DEBUGGING - // If we haven't been passed the event get the window.event - e = e || window.event; - - var message = redux.args.save_pending; - - // For IE6-8 and Firefox prior to version 4 - if ( e ) { - e.returnValue = message; - } - - window.onbeforeunload = null; - - // For Chrome, Safari, IE8+ and Opera 12+ - return message; -}; - -function redux_change( variable ) { - - jQuery( 'body' ).trigger( 'check_dependencies', variable ); - - if ( variable.hasClass( 'compiler' ) ) { - jQuery( '#redux-compiler-hook' ).val( 1 ); - } - -// var test = jQuery( variable ).parents( '.redux-field-container:first' ); -// if ( test.hasClass( 'redux-container-typography' ) && redux.field_objects.typography ) { -// redux.field_objects.typography.change( test ); -// } - - var rContainer = jQuery( variable ).parents( '.redux-container:first' ); - - var parentID = jQuery( variable ).closest( '.redux-group-tab' ).attr( 'id' ); - - // Let's count down the errors now. Fancy. ;) - var id = parentID.split( '_' ); - id = id[0]; - - var th = rContainer.find( '.redux-group-tab-link-a[data-key="' + id + '"]' ).parents( '.redux-group-tab-link-li:first' ); - var subParent = jQuery( '#' + parentID + '_li' ).parents( '.hasSubSections:first' ); - - if ( jQuery( variable ).parents( 'fieldset.redux-field:first' ).hasClass( 'redux-field-error' ) ) { - jQuery( variable ).parents( 'fieldset.redux-field:first' ).removeClass( 'redux-field-error' ); - jQuery( variable ).parent().find( '.redux-th-error' ).slideUp(); - - var errorCount = (parseInt( rContainer.find( '.redux-field-errors span' ).text() ) - 1); - - if ( errorCount <= 0 ) { - //console.log('HERE'); - jQuery( '#' + parentID + '_li .redux-menu-error' ).fadeOut( 'fast' ).remove(); - jQuery( '#' + parentID + '_li .redux-group-tab-link-a' ).removeClass( 'hasError' ); - - jQuery( '#' + parentID + '_li' ).parents( '.inside:first' ).find( '.redux-field-errors' ).slideUp(); - jQuery( variable ).parents( '.redux-container:first' ).find( '.redux-field-errors' ).slideUp(); - jQuery( '#redux_metaboxes_errors' ).slideUp(); - } else { - - var errorsLeft = (parseInt( th.find( '.redux-menu-error:first' ).text() ) - 1); - if ( errorsLeft <= 0 ) { - th.find( '.redux-menu-error:first' ).fadeOut().remove(); - } else { - th.find( '.redux-menu-error:first' ).text( errorsLeft ); - } - - rContainer.find( '.redux-field-errors span' ).text( errorCount ); - } - - if ( subParent.length !== 0 ) { - if ( subParent.find( '.redux-menu-error' ).length === 0 ) { - subParent.find( '.hasError' ).removeClass( 'hasError' ); - } - } - } - if ( jQuery( variable ).parents( 'fieldset.redux-field:first' ).hasClass( 'redux-field-warning' ) ) { - jQuery( variable ).parents( 'fieldset.redux-field:first' ).removeClass( 'redux-field-warning' ); - jQuery( variable ).parent().find( '.redux-th-warning' ).slideUp(); - - var warningCount = (parseInt( rContainer.find( '.redux-field-warnings span' ).text() ) - 1); - - if ( warningCount <= 0 ) { - //console.log('HERE'); - jQuery( '#' + parentID + '_li .redux-menu-warning' ).fadeOut( 'fast' ).remove(); - jQuery( '#' + parentID + '_li .redux-group-tab-link-a' ).removeClass( 'hasWarning' ); - - jQuery( '#' + parentID + '_li' ).parents( '.inside:first' ).find( '.redux-field-warnings' ).slideUp(); - jQuery( variable ).parents( '.redux-container:first' ).find( '.redux-field-warnings' ).slideUp(); - jQuery( '#redux_metaboxes_warnings' ).slideUp(); - } else { - // Let's count down the warnings now. Fancy. ;) - - var warningsLeft = (parseInt( th.find( '.redux-menu-warning:first' ).text() ) - 1); - if ( warningsLeft <= 0 ) { - th.find( '.redux-menu-warning:first' ).fadeOut().remove(); - } else { - th.find( '.redux-menu-warning:first' ).text( warningsLeft ); - } - - rContainer.find( '.redux-field-warning span' ).text( warningCount ); - - } - if ( subParent.length !== 0 ) { - if ( subParent.find( '.redux-menu-warning' ).length === 0 ) { - subParent.find( '.hasWarning' ).removeClass( 'hasWarning' ); - } - } - } - // Don't show the changed value notice while save_notice is visible. - if ( rContainer.find( '.saved_notice:visible' ).length > 0 ) { - return; - } - - - if ( redux.customizer ) { - redux.customizer.save( variable, rContainer, parentID ); - return; - } - - if ( !redux.args.disable_save_warn ) { - rContainer.find( '.redux-save-warn' ).slideDown(); - window.onbeforeunload = confirmOnPageExit; - } -} - -function colorValidate( field ) { - var value = jQuery( field ).val(); - - var hex = colorNameToHex( value ); - if ( hex !== value.replace( '#', '' ) ) { - return hex; - } - - return value; -} - -function colorNameToHex( colour ) { - var tcolour = colour.replace( /^\s\s*/, '' ).replace( /\s\s*$/, '' ).replace( "#", "" ); - - var colours = { - "aliceblue": "#f0f8ff", - "antiquewhite": "#faebd7", - "aqua": "#00ffff", - "aquamarine": "#7fffd4", - "azure": "#f0ffff", - "beige": "#f5f5dc", - "bisque": "#ffe4c4", - "black": "#000000", - "blanchedalmond": "#ffebcd", - "blue": "#0000ff", - "blueviolet": "#8a2be2", - "brown": "#a52a2a", - "burlywood": "#deb887", - "cadetblue": "#5f9ea0", - "chartreuse": "#7fff00", - "chocolate": "#d2691e", - "coral": "#ff7f50", - "cornflowerblue": "#6495ed", - "cornsilk": "#fff8dc", - "crimson": "#dc143c", - "cyan": "#00ffff", - "darkblue": "#00008b", - "darkcyan": "#008b8b", - "darkgoldenrod": "#b8860b", - "darkgray": "#a9a9a9", - "darkgreen": "#006400", - "darkkhaki": "#bdb76b", - "darkmagenta": "#8b008b", - "darkolivegreen": "#556b2f", - "darkorange": "#ff8c00", - "darkorchid": "#9932cc", - "darkred": "#8b0000", - "darksalmon": "#e9967a", - "darkseagreen": "#8fbc8f", - "darkslateblue": "#483d8b", - "darkslategray": "#2f4f4f", - "darkturquoise": "#00ced1", - "darkviolet": "#9400d3", - "deeppink": "#ff1493", - "deepskyblue": "#00bfff", - "dimgray": "#696969", - "dodgerblue": "#1e90ff", - "firebrick": "#b22222", - "floralwhite": "#fffaf0", - "forestgreen": "#228b22", - "fuchsia": "#ff00ff", - "gainsboro": "#dcdcdc", - "ghostwhite": "#f8f8ff", - "gold": "#ffd700", - "goldenrod": "#daa520", - "gray": "#808080", - "green": "#008000", - "greenyellow": "#adff2f", - "honeydew": "#f0fff0", - "hotpink": "#ff69b4", - "indianred ": "#cd5c5c", - "indigo ": "#4b0082", - "ivory": "#fffff0", - "khaki": "#f0e68c", - "lavender": "#e6e6fa", - "lavenderblush": "#fff0f5", - "lawngreen": "#7cfc00", - "lemonchiffon": "#fffacd", - "lightblue": "#add8e6", - "lightcoral": "#f08080", - "lightcyan": "#e0ffff", - "lightgoldenrodyellow": "#fafad2", - "lightgrey": "#d3d3d3", - "lightgreen": "#90ee90", - "lightpink": "#ffb6c1", - "lightsalmon": "#ffa07a", - "lightseagreen": "#20b2aa", - "lightskyblue": "#87cefa", - "lightslategray": "#778899", - "lightsteelblue": "#b0c4de", - "lightyellow": "#ffffe0", - "lime": "#00ff00", - "limegreen": "#32cd32", - "linen": "#faf0e6", - "magenta": "#ff00ff", - "maroon": "#800000", - "mediumaquamarine": "#66cdaa", - "mediumblue": "#0000cd", - "mediumorchid": "#ba55d3", - "mediumpurple": "#9370d8", - "mediumseagreen": "#3cb371", - "mediumslateblue": "#7b68ee", - "mediumspringgreen": "#00fa9a", - "mediumturquoise": "#48d1cc", - "mediumvioletred": "#c71585", - "midnightblue": "#191970", - "mintcream": "#f5fffa", - "mistyrose": "#ffe4e1", - "moccasin": "#ffe4b5", - "navajowhite": "#ffdead", - "navy": "#000080", - "oldlace": "#fdf5e6", - "olive": "#808000", - "olivedrab": "#6b8e23", - "orange": "#ffa500", - "orangered": "#ff4500", - "orchid": "#da70d6", - "palegoldenrod": "#eee8aa", - "palegreen": "#98fb98", - "paleturquoise": "#afeeee", - "palevioletred": "#d87093", - "papayawhip": "#ffefd5", - "peachpuff": "#ffdab9", - "peru": "#cd853f", - "pink": "#ffc0cb", - "plum": "#dda0dd", - "powderblue": "#b0e0e6", - "purple": "#800080", - "red": "#ff0000", - "redux": "#01a3e3", - "rosybrown": "#bc8f8f", - "royalblue": "#4169e1", - "saddlebrown": "#8b4513", - "salmon": "#fa8072", - "sandybrown": "#f4a460", - "seagreen": "#2e8b57", - "seashell": "#fff5ee", - "sienna": "#a0522d", - "silver": "#c0c0c0", - "skyblue": "#87ceeb", - "slateblue": "#6a5acd", - "slategray": "#708090", - "snow": "#fffafa", - "springgreen": "#00ff7f", - "steelblue": "#4682b4", - "tan": "#d2b48c", - "teal": "#008080", - "thistle": "#d8bfd8", - "tomato": "#ff6347", - "turquoise": "#40e0d0", - "violet": "#ee82ee", - "wheat": "#f5deb3", - "white": "#ffffff", - "whitesmoke": "#f5f5f5", - "yellow": "#ffff00", - "yellowgreen": "#9acd32" - }; - - if ( colours[tcolour.toLowerCase()] !== 'undefined' ) { - return colours[tcolour.toLowerCase()]; - } - - return colour; -} - -function redux_hook( object, functionName, callback, before ) { - (function( originalFunction ) { - object[functionName] = function() { - - if ( before === true ) { - callback.apply( this, [returnValue, originalFunction, arguments] ); - } - var returnValue = originalFunction.apply( this, arguments ); - if ( before !== true ) { - callback.apply( this, [returnValue, originalFunction, arguments] ); - } - - return returnValue; - }; - }( object[functionName] )); -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/redux.min.js b/admin/core/lib/ReduxFramework/ReduxCore/assets/js/redux.min.js deleted file mode 100755 index 78bbb959..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/redux.min.js +++ /dev/null @@ -1,2 +0,0 @@ -function redux_change(a){jQuery("body").trigger("check_dependencies",a),a.hasClass("compiler")&&jQuery("#redux-compiler-hook").val(1);var b=jQuery(a).parents(".redux-container:first"),c=jQuery(a).closest(".redux-group-tab").attr("id"),d=c.split("_");d=d[0];var e=b.find('.redux-group-tab-link-a[data-key="'+d+'"]').parents(".redux-group-tab-link-li:first"),f=jQuery("#"+c+"_li").parents(".hasSubSections:first");if(jQuery(a).parents("fieldset.redux-field:first").hasClass("redux-field-error")){jQuery(a).parents("fieldset.redux-field:first").removeClass("redux-field-error"),jQuery(a).parent().find(".redux-th-error").slideUp();var g=parseInt(b.find(".redux-field-errors span").text())-1;if(0>=g)jQuery("#"+c+"_li .redux-menu-error").fadeOut("fast").remove(),jQuery("#"+c+"_li .redux-group-tab-link-a").removeClass("hasError"),jQuery("#"+c+"_li").parents(".inside:first").find(".redux-field-errors").slideUp(),jQuery(a).parents(".redux-container:first").find(".redux-field-errors").slideUp(),jQuery("#redux_metaboxes_errors").slideUp();else{var h=parseInt(e.find(".redux-menu-error:first").text())-1;0>=h?e.find(".redux-menu-error:first").fadeOut().remove():e.find(".redux-menu-error:first").text(h),b.find(".redux-field-errors span").text(g)}0!==f.length&&0===f.find(".redux-menu-error").length&&f.find(".hasError").removeClass("hasError")}if(jQuery(a).parents("fieldset.redux-field:first").hasClass("redux-field-warning")){jQuery(a).parents("fieldset.redux-field:first").removeClass("redux-field-warning"),jQuery(a).parent().find(".redux-th-warning").slideUp();var i=parseInt(b.find(".redux-field-warnings span").text())-1;if(0>=i)jQuery("#"+c+"_li .redux-menu-warning").fadeOut("fast").remove(),jQuery("#"+c+"_li .redux-group-tab-link-a").removeClass("hasWarning"),jQuery("#"+c+"_li").parents(".inside:first").find(".redux-field-warnings").slideUp(),jQuery(a).parents(".redux-container:first").find(".redux-field-warnings").slideUp(),jQuery("#redux_metaboxes_warnings").slideUp();else{var j=parseInt(e.find(".redux-menu-warning:first").text())-1;0>=j?e.find(".redux-menu-warning:first").fadeOut().remove():e.find(".redux-menu-warning:first").text(j),b.find(".redux-field-warning span").text(i)}0!==f.length&&0===f.find(".redux-menu-warning").length&&f.find(".hasWarning").removeClass("hasWarning")}return b.find(".saved_notice:visible").length>0?void 0:redux.customizer?void redux.customizer.save(a,b,c):void(redux.args.disable_save_warn||(b.find(".redux-save-warn").slideDown(),window.onbeforeunload=confirmOnPageExit))}function colorValidate(a){var b=jQuery(a).val(),c=colorNameToHex(b);return c!==b.replace("#","")?c:b}function colorNameToHex(a){var b=a.replace(/^\s\s*/,"").replace(/\s\s*$/,"").replace("#",""),c={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4","indianred ":"#cd5c5c","indigo ":"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",redux:"#01a3e3",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};return"undefined"!==c[b.toLowerCase()]?c[b.toLowerCase()]:a}function redux_hook(a,b,c,d){!function(e){a[b]=function(){d===!0&&c.apply(this,[a,e,arguments]);var a=e.apply(this,arguments);return d!==!0&&c.apply(this,[a,e,arguments]),a}}(a[b])}!function(a){"function"==typeof define&&define.amd?jQueryCookie.define(["jquery"],a):a(jQuery)}(function(a){function b(a){return a}function c(a){return decodeURIComponent(a.replace(e," "))}function d(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return f.json?JSON.parse(a):a}catch(b){}}var e=/\+/g,f=a.cookie=function(e,g,h){if(void 0!==g){if(h=a.extend({},f.defaults,h),"number"==typeof h.expires){var i=h.expires,j=h.expires=new Date;j.setDate(j.getDate()+i)}return g=f.json?JSON.stringify(g):String(g),document.cookie=[f.raw?e:encodeURIComponent(e),"=",f.raw?g:encodeURIComponent(g),h.expires?"; expires="+h.expires.toUTCString():"",h.path?"; path="+h.path:"",h.domain?"; domain="+h.domain:"",h.secure?"; secure":""].join("")}for(var k=f.raw?b:c,l=document.cookie.split("; "),m=e?void 0:{},n=0,o=l.length;o>n;n++){var p=l[n].split("="),q=k(p.shift()),r=k(p.join("="));if(e&&e===q){m=d(r);break}e||(m[q]=d(r))}return m};f.defaults={},a.removeCookie=function(b,c){return void 0!==a.cookie(b)?(a.cookie(b,"",a.extend({},c,{expires:-1})),!0):!1}}),function(a){a.fn.typeWatch=function(b){function c(b,c){var d=a(b.el).val();(d.length>=f.captureLength&&d.toUpperCase()!=b.text||c&&d.length>=f.captureLength)&&(b.text=d.toUpperCase(),b.cb.call(b.el,d))}function d(b){var d=b.type.toUpperCase();if(a.inArray(d,f.inputTypes)>=0){var e={timer:null,text:a(b).val().toUpperCase(),cb:f.callback,el:b,wait:f.wait};f.highlight&&a(b).focus(function(){this.select()});var g=function(b){var d=e.wait,g=!1,h=this.type.toUpperCase();"undefined"!=typeof b.keyCode&&13==b.keyCode&&"TEXTAREA"!=h&&a.inArray(h,f.inputTypes)>=0&&(d=1,g=!0);var i=function(){c(e,g)};clearTimeout(e.timer),e.timer=setTimeout(i,d)};a(b).on("keydown paste cut input",g)}}var e=["TEXT","TEXTAREA","PASSWORD","TEL","SEARCH","URL","EMAIL","DATETIME","DATE","MONTH","WEEK","TIME","DATETIME-LOCAL","NUMBER","RANGE"],f=a.extend({wait:750,callback:function(){},highlight:!0,captureLength:2,inputTypes:e},b);return this.each(function(){d(this)})}}(jQuery),function(a){a.fn.serializeForm=function(){if(this.length<1)return!1;var b={},c=b,d=':input[type!="checkbox"][type!="radio"], input:checked',e=function(){if(!this.disabled){var d=this.name.replace(/\[([^\]]+)?\]/g,",$1").split(","),e=d.length-1,f=a(this);if(d[0]){for(var g=0;e>g;g++)c=c[d[g]]=c[d[g]]||(""===d[g+1]||"0"===d[g+1]?[]:{});void 0!==c.length?c.push(f.val()):c[d[e]]=f.val(),c=b}}};return this.filter(d).each(e),this.find(d).each(e),b}}(jQuery),function(a){function b(){var a="!@#$%^&*()+=[]\\';,/{}|\":<>?~`.-_";return a+=" "}function c(){var a="¬€£¦";return a}function d(b,c,d){b.each(function(){var b=a(this);b.bind("keyup change paste",function(a){var e="";a.originalEvent&&a.originalEvent.clipboardData&&a.originalEvent.clipboardData.getData&&(e=a.originalEvent.clipboardData.getData("text/plain")),setTimeout(function(){h(b,c,d,e)},0)}),b.bind("keypress",function(a){var e=a.charCode?a.charCode:a.which;if(!(g(e)||a.ctrlKey||a.metaKey)){var f=String.fromCharCode(e),h=b.selection(),i=h.start,j=h.end,k=b.val(),l=k.substring(0,i)+f+k.substring(j),m=c(l,d);m!=l&&a.preventDefault()}})})}function e(b,c){var d=parseFloat(a(b).val()),e=a(b);return isNaN(d)?void e.val(""):(f(c.min)&&dc.max&&e.val("")))}function f(a){return!isNaN(a)}function g(a){return a>=32?!1:10==a?!1:13==a?!1:!0}function h(a,b,c,d){var e=a.val();""==e&&d.length>0&&(e=d);var f=b(e,c);if(e!=f){var g=a.alphanum_caret();a.val(f),e.length==f.length+1?a.alphanum_caret(g-1):a.alphanum_caret(g)}}function i(b,c){"undefined"==typeof c&&(c=D);var d,e={};return d="string"==typeof b?F[b]:"undefined"==typeof b?{}:b,a.extend(e,c,d),"undefined"==typeof e.blacklist&&(e.blacklistSet=x(e.allow,e.disallow)),e}function j(b){var c,d={};return c="string"==typeof b?G[b]:"undefined"==typeof b?{}:b,a.extend(d,E,c),d}function k(a,b,c){return c.maxLength&&a.length>=c.maxLength?!1:c.allow.indexOf(b)>=0?!0:c.allowSpace&&" "==b?!0:c.blacklistSet.contains(b)?!1:!c.allowNumeric&&K[b]?!1:!c.allowUpper&&u(b)?!1:!c.allowLower&&v(b)?!1:!c.allowCaseless&&w(b)?!1:!c.allowLatin&&L.contains(b)?!1:c.allowOtherCharSets?!0:K[b]||L.contains(b)?!0:!1}function l(a,b,c){if(K[b])return n(a,c)?!1:p(a,c)?!1:o(a,c)?!1:q(a+b,c)?!1:r(a+b,c)?!1:!0;if(c.allowPlus&&"+"==b&&""==a)return!0;if(c.allowMinus&&"-"==b&&""==a)return!0;if(b==I&&c.allowThouSep&&A(a,b))return!0;if(b==J){if(a.indexOf(J)>=0)return!1;if(c.allowDecSep)return!0}return!1}function m(a){return a+="",a.replace(/[^0-9]/g,"").length}function n(a,b){var c=b.maxDigits;if(""==c||isNaN(c))return!1;var d=m(a);return d>=c?!0:!1}function o(a,b){var c=b.maxDecimalPlaces;if(""==c||isNaN(c))return!1;var d=a.indexOf(J);if(-1==d)return!1;var e=a.substring(d),f=m(e);return f>=c?!0:!1}function p(a,b){var c=b.maxPreDecimalPlaces;if(""==c||isNaN(c))return!1;var d=a.indexOf(J);if(d>=0)return!1;var e=m(a);return e>=c?!0:!1}function q(a,b){if(!b.max||b.max<0)return!1;var c=parseFloat(a);return c>b.max?!0:!1}function r(a,b){if(!b.min||b.min>0)return!1;var c=parseFloat(a);return c=0)return!1;var d=a.indexOf(I);if(0>d)return!0;var e=a.lastIndexOf(I),f=a.length-e-1;if(3>f)return!1;var g=m(a.substring(d));return g%3>0?!1:!0}function B(a){"string"==typeof a?this.map=C(a):this.map={}}function C(a){var b,c={},d=a.split(""),e=0;for(e=0;e=0?endPos=e.toString().length:endPos=startPos+d.toString().length,{start:startPos,end:endPos}):null},d=function(d){var e=b(d);if(void 0!==d.selectionStart)return document.activeElement&&document.activeElement!=d&&d.selectionStart==d.selectionEnd&&0==d.selectionStart?{start:d.value.length,end:d.value.length}:{start:d.selectionStart,end:d.selectionEnd};if(e.getSelection)return c(d,e);try{if("input"==d.nodeName.toLowerCase()){var f=b(d).document.selection.createRange(),g=d.createTextRange();g.setEndPoint("EndToStart",f);var h=g.text.length;return{start:h,end:h+f.text.length}}var i=c(d,e);if(!i)return i;var j=a.Range.current().clone(),k=j.clone().collapse().range,l=j.clone().collapse(!1).range;return k.moveStart("character",-1),l.moveStart("character",-1),0!=i.startPos&&""==k.text&&(i.startPos+=2),0!=i.endPos&&""==l.text&&(i.endPos+=2),i}catch(m){return{start:d.value.length,end:d.value.length}}},e=function(a,c,d){var e=b(a);if(a.setSelectionRange)void 0===d?(a.focus(),a.setSelectionRange(c,c)):(a.select(),a.selectionStart=c,a.selectionEnd=d);else if(a.createTextRange){var f=a.createTextRange();f.moveStart("character",c),d=d||c,f.moveEnd("character",d-a.value.length),f.select()}else if(e.getSelection){var h=e.document,i=e.getSelection(),j=h.createRange(),k=[c,void 0!==d?d:c];g([a],k),j.setStart(k[0].el,k[0].count),j.setEnd(k[1].el,k[1].count),i.removeAllRanges(),i.addRange(j)}else if(e.document.body.createTextRange){var j=document.body.createTextRange();j.moveToElementText(a),j.collapse(),j.moveStart("character",c),j.moveEnd("character",void 0!==d?d:c),j.select()}},f=function(a,b,c,d){"number"==typeof c[0]&&c[0]d.right||c.bottomd.bottom)}},a.redux.hideFields(),a.redux.checkRequired(),a.redux.initEvents(),a.redux.initQtip(),a.redux.tabCheck(),a.redux.notices(),a.redux.tabControl()}),a.redux.ajax_save=function(b){var c=a(document.getElementById("redux_ajax_overlay"));c.fadeIn(),jQuery(".redux-action_bar .spinner").addClass("is-active"),jQuery(".redux-action_bar input").attr("disabled","disabled");var d=jQuery(document.getElementById("redux_notification_bar"));d.slideUp(),jQuery(".redux-save-warn").slideUp(),jQuery(".redux_ajax_save_error").slideUp("medium",function(){jQuery(this).remove()});var e=jQuery(document.getElementById("redux-form-wrapper"));redux.fields.hasOwnProperty("editor")&&a.each(redux.fields.editor,function(a,b){if("undefined"!=typeof tinyMCE){var c=tinyMCE.get(a);c&&c.save()}});var f=e.serialize();e.find("input[type=checkbox]").each(function(){if("undefined"!=typeof a(this).attr("name")){var b=a(this).is(":checked")?a(this).val():"0";f+="&"+a(this).attr("name")+"="+b}}),"redux_save"!=b.attr("name")&&(f+="&"+b.attr("name")+"="+b.val());var g=e.attr("data-nonce");return jQuery.ajax({type:"post",dataType:"json",url:ajaxurl,data:{action:redux.args.opt_name+"_ajax_save",nonce:g,opt_name:redux.args.opt_name,data:f},error:function(a){window.console||(console={}),console.log=console.log||function(a,b){},console.log(redux.ajax.console),console.log(a.responseText),jQuery(".redux-action_bar input").removeAttr("disabled"),c.fadeOut("fast"),jQuery(".redux-action_bar .spinner").removeClass("is-active"),alert(redux.ajax.alert)},success:function(b){if(b.action&&"reload"==b.action)location.reload(!0);else if("success"==b.status){jQuery(".redux-action_bar input").removeAttr("disabled"),c.fadeOut("fast"),jQuery(".redux-action_bar .spinner").removeClass("is-active"),redux.options=b.options,redux.errors=b.errors,redux.warnings=b.warnings,d.html(b.notification_bar).slideDown("fast"),(null!==b.errors||null!==b.warnings)&&a.redux.notices();var e=a(document.getElementById("redux_notification_bar")).find(".saved_notice");e.slideDown(),e.delay(4e3).slideUp()}else jQuery(".redux-action_bar input").removeAttr("disabled"),jQuery(".redux-action_bar .spinner").removeClass("is-active"),c.fadeOut("fast"),jQuery(".wrap h2:first").parent().append('"),jQuery(".redux_ajax_save_error").slideDown(),jQuery("html, body").animate({scrollTop:0},"slow")}}),!1},a.redux.initEvents=function(){a(".redux-presets-bar").on("click",function(){window.onbeforeunload=null}),a("#toplevel_page_"+redux.args.slug+" .wp-submenu a, #wp-admin-bar-"+redux.args.slug+" a.ab-item").click(function(b){if((a("#toplevel_page_"+redux.args.slug).hasClass("wp-menu-open")||a(this).hasClass("ab-item"))&&!a(this).parents("ul.ab-submenu:first").hasClass("ab-sub-secondary")&&a(this).attr("href").toLowerCase().indexOf(redux.args.slug+"&tab=")>=0){b.preventDefault();var c=a(this).attr("href").split("&tab=");return a("#"+c[1]+"_section_group_li_a").click(),a(this).parents("ul:first").find(".current").removeClass("current"),a(this).addClass("current"),a(this).parent().addClass("current"),!1}}),a(".redux-action_bar input").on("click",function(b){if(a(this).attr("name")==redux.args.opt_name+"[defaults]"){if(!confirm(redux.args.reset_confirm))return!1}else if(a(this).attr("name")==redux.args.opt_name+"[defaults-section]"&&!confirm(redux.args.reset_section_confirm))return!1;window.onbeforeunload=null,redux.args.ajax_save===!0&&(a.redux.ajax_save(a(this)),b.preventDefault())}),a(".expand_options").click(function(b){b.preventDefault();var c=a(".redux-container");if(a(c).hasClass("fully-expanded")){a(c).removeClass("fully-expanded");var d=a.cookie("redux_current_tab");a(".redux-container:first").find("#"+d+"_section_group").fadeIn(200,function(){0!==a(".redux-container:first").find("#redux-footer").length&&a.redux.stickyInfo(),a.redux.initFields()})}return a.redux.expandOptions(a(this).parents(".redux-container:first")),!1}),a(".saved_notice").is(":visible")&&a(".saved_notice").slideDown(),a(document.body).on("change",".redux-field input, .redux-field textarea, .redux-field select",function(){a(this).hasClass("noUpdate")||redux_change(a(this))});var b=a("#redux-footer").height();a("#redux-sticky-padder").css({height:b}),a("#redux-footer-sticky").removeClass("hide"),0!==a("#redux-footer").length&&(a(window).scroll(function(){a.redux.stickyInfo()}),a(window).resize(function(){a.redux.stickyInfo()})),a(".saved_notice").delay(4e3).slideUp()},a.redux.hideFields=function(){a("label[for='redux_hide_field']").each(function(b,c){var d=a(this).parent().parent();a(d).addClass("hidden")})},a.redux.checkRequired=function(){a.redux.required(),a("body").on("change",".redux-main select, .redux-main radio, .redux-main input[type=checkbox], .redux-main input[type=hidden]",function(b){a.redux.check_dependencies(this)}),a("body").on("check_dependencies",function(b,c){a.redux.check_dependencies(c)}),a("td > fieldset:empty,td > div:empty").parent().parent().hide()},a.redux.initQtip=function(){if(a().qtip){var b="",c=redux.args.hints.tip_style.shadow;c===!0&&(b="qtip-shadow");var d="",e=redux.args.hints.tip_style.color;""!==e&&(d="qtip-"+e);var f="",g=redux.args.hints.tip_style.rounded;g===!0&&(f="qtip-rounded");var h="",i=redux.args.hints.tip_style.style;""!==i&&(h="qtip-"+i);var j=b+","+d+","+f+","+h+",redux-qtip";j=j.replace(/,/g," ");var k=redux.args.hints.tip_position.my,l=redux.args.hints.tip_position.at;k=a.redux.verifyPos(k.toLowerCase(),!0),l=a.redux.verifyPos(l.toLowerCase(),!1);var m=redux.args.hints.tip_effect.show.event,n=redux.args.hints.tip_effect.hide.event,o=redux.args.hints.tip_effect.show.effect,p=redux.args.hints.tip_effect.show.duration,q=redux.args.hints.tip_effect.hide.effect,r=redux.args.hints.tip_effect.hide.duration;a("div.redux-dev-qtip").each(function(){a(this).qtip({content:{text:a(this).attr("qtip-content"),title:a(this).attr("qtip-title")},show:{effect:function(){a(this).slideDown(500)},event:"mouseover"},hide:{effect:function(){a(this).slideUp(500)},event:"mouseleave"},style:{classes:"qtip-shadow qtip-light"},position:{my:"top center",at:"bottom center"}})}),a("div.redux-hint-qtip").each(function(){a(this).qtip({content:{text:a(this).attr("qtip-content"),title:a(this).attr("qtip-title")},show:{effect:function(){switch(o){case"slide":a(this).slideDown(p);break;case"fade":a(this).fadeIn(p);break;default:a(this).show()}},event:m},hide:{effect:function(){switch(q){case"slide":a(this).slideUp(r);break;case"fade":a(this).fadeOut(r);break;default:a(this).hide(r)}},event:n},style:{classes:j},position:{my:k,at:l}})}),a("input[qtip-content]").each(function(){a(this).qtip({content:{text:a(this).attr("qtip-content"),title:a(this).attr("qtip-title")},show:"focus",hide:"blur",style:j,position:{my:k,at:l}})})}},a.redux.tabCheck=function(){if(a(".redux-group-tab-link-a").click(function(){var b=a(this);if(b.parent().hasClass("empty_section")&&b.parent().hasClass("hasSubSections")){var c=a(this).closest("ul").find(".redux-group-tab-link-a"),d=c.index(this);b=c.slice(d+1,d+2)}var e=b.parents(".redux-container:first"),f=b.data("rel"),g=e.find(".redux-group-tab-link-li.active:first .redux-group-tab-link-a").data("rel");if(g!==f){if(a("#currentSection").val(f),b.parents(".postbox-container:first").length||a.cookie("redux_current_tab",f,{expires:7,path:"/"}),e.find("#"+f+"_section_group_li").parents(".redux-group-tab-link-li").length){var h=e.find("#"+f+"_section_group_li").parents(".redux-group-tab-link-li").attr("id").split("_");h=h[0]}if(e.find("#toplevel_page_"+redux.args.slug+" .wp-submenu a.current").removeClass("current"),e.find("#toplevel_page_"+redux.args.slug+" .wp-submenu li.current").removeClass("current"),e.find("#toplevel_page_"+redux.args.slug+" .wp-submenu a").each(function(){var b=a(this).attr("href").split("&tab=");(b[1]==f||b[1]==h)&&(a(this).addClass("current"),a(this).parent().addClass("current"))}),e.find("#"+g+"_section_group_li").find("#"+g+"_section_group_li").length)e.find("#"+g+"_section_group_li").addClass("activeChild"),e.find("#"+f+"_section_group_li").addClass("active").removeClass("activeChild");else if(e.find("#"+f+"_section_group_li").parents("#"+g+"_section_group_li").length||e.find("#"+g+"_section_group_li").parents("ul.subsection").find("#"+f+"_section_group_li").length)e.find("#"+f+"_section_group_li").parents("#"+g+"_section_group_li").length?e.find("#"+g+"_section_group_li").addClass("activeChild").removeClass("active"):(e.find("#"+f+"_section_group_li").addClass("active"),e.find("#"+g+"_section_group_li").removeClass("active")),e.find("#"+f+"_section_group_li").removeClass("activeChild").addClass("active");else if(e.find("#"+f+"_section_group_li").addClass("active").removeClass("activeChild").find("ul.subsection").slideDown(),e.find("#"+g+"_section_group_li").find("ul.subsection").length){e.find("#"+g+"_section_group_li").find("ul.subsection").slideUp("fast",function(){e.find("#"+g+"_section_group_li").removeClass("active").removeClass("activeChild")});var i=e.find("#"+f+"_section_group_li").parents(".hasSubSections:first");i.length>0&&(e.find("#"+f+"_section_group_li").removeClass("active"),f=i.find(".redux-group-tab-link-a:first").data("rel"),i.hasClass("empty_section")?(i.find(".subsection li:first").addClass("active"),e.find("#"+f+"_section_group_li").removeClass("active").addClass("activeChild").find("ul.subsection").slideDown(),i=i.find(".subsection li:first"),f=i.find(".redux-group-tab-link-a:first").data("rel")):e.find("#"+f+"_section_group_li").addClass("active").removeClass("activeChild").find("ul.subsection").slideDown())}else e.find("#"+g+"_section_group_li").parents("ul.subsection").length?e.find("#"+g+"_section_group_li").parents("#"+f+"_section_group_li").length?e.find("#"+g+"_section_group_li").removeClass("active"):e.find("#"+g+"_section_group_li").parents("ul.subsection").slideUp("fast",function(){e.find("#"+g+"_section_group_li").removeClass("active"),e.find("#"+g+"_section_group_li").parents(".redux-group-tab-link-li").removeClass("active").removeClass("activeChild"),e.find("#"+f+"_section_group_li").parents(".redux-group-tab-link-li").addClass("activeChild").find("ul.subsection").slideDown(),e.find("#"+f+"_section_group_li").addClass("active")}):(e.find("#"+g+"_section_group_li").removeClass("active"),e.find("#"+f+"_section_group_li").parents(".redux-group-tab-link-li").length&&(e.find("#"+f+"_section_group_li").parents(".redux-group-tab-link-li").addClass("activeChild").find("ul.subsection").slideDown(),e.find("#"+f+"_section_group_li").addClass("active")));e.find("#"+g+"_section_group").hide(),e.find("#"+f+"_section_group").fadeIn(200,function(){0!==e.find("#redux-footer").length&&a.redux.stickyInfo(),a.redux.initFields()}),a("#toplevel_page_"+redux.args.slug).find(".current").removeClass("current")}}),void 0!==redux.last_tab)return void a("#"+redux.last_tab+"_section_group_li_a").click();var b=decodeURI((new RegExp("tab=(.+?)(&|$)").exec(location.search)||[,""])[1]);""!==b?a.cookie("redux_current_tab_get")!==b&&(a.cookie("redux_current_tab",b,{expires:7,path:"/"}),a.cookie("redux_current_tab_get",b,{expires:7,path:"/"}),a("#"+b+"_section_group_li").click()):""!==a.cookie("redux_current_tab_get")&&a.removeCookie("redux_current_tab_get");var c=a("#"+a.cookie("redux_current_tab")+"_section_group_li_a");null===a.cookie("redux_current_tab")||"undefined"==typeof a.cookie("redux_current_tab")||0===c.length?a(".redux-container").find(".redux-group-tab-link-a:first").click():c.click()},a.redux.initFields=function(){a(".redux-group-tab:visible").find(".redux-field-init:visible").each(function(){var b=a(this).attr("data-type");if("undefined"!=typeof redux.field_objects&&redux.field_objects[b]&&redux.field_objects[b]&&redux.field_objects[b].init(),!redux.customizer&&a(this).hasClass("redux_remove_th")){var c=a(this).parents("tr:first"),d=c.find("th:first");d.html()&&d.html().length>0&&(a(this).prepend(d.html()),a(this).find(".redux_field_th").css("padding","0 0 10px 0")),a(this).parent().attr("colspan","2"),d.remove()}})},a.redux.notices=function(){redux.errors&&redux.errors.errors&&(a.each(redux.errors.errors,function(b,c){a.each(c.errors,function(b,c){a("#"+redux.args.opt_name+"-"+c.id).addClass("redux-field-error"),0===a("#"+redux.args.opt_name+"-"+c.id).parent().find(".redux-th-error").length?a("#"+redux.args.opt_name+"-"+c.id).append('
    '+c.msg+"
    "):a("#"+redux.args.opt_name+"-"+c.id).parent().find(".redux-th-error").html(c.msg).css("display","block")})}),a(".redux-container").each(function(){var b=a(this);b.find(".redux-menu-error").remove();var c=b.find(".redux-field-error").length;c>0&&(b.find(".redux-field-errors span").text(c),b.find(".redux-field-errors").slideDown(),b.find(".redux-group-tab").each(function(){var c=a(this).find(".redux-field-error").length;if(c>0){var d=a(this).attr("id").split("_");d=d[0],b.find('.redux-group-tab-link-a[data-key="'+d+'"]').prepend(''+c+""),b.find('.redux-group-tab-link-a[data-key="'+d+'"]').addClass("hasError");var e=b.find('.redux-group-tab-link-a[data-key="'+d+'"]').parents(".hasSubSections:first");e&&e.find(".redux-group-tab-link-a:first").addClass("hasError")}}))})),redux.warnings&&redux.warnings.warnings&&(a.each(redux.warnings.warnings,function(b,c){a.each(c.warnings,function(b,c){a("#"+redux.args.opt_name+"-"+c.id).addClass("redux-field-warning"),0===a("#"+redux.args.opt_name+"-"+c.id).parent().find(".redux-th-warning").length?a("#"+redux.args.opt_name+"-"+c.id).append('
    '+c.msg+"
    "):a("#"+redux.args.opt_name+"-"+c.id).parent().find(".redux-th-warning").html(c.msg).css("display","block")})}),a(".redux-container").each(function(){var b=a(this);b.find(".redux-menu-warning").remove();var c=b.find(".redux-field-warning").length;c>0&&(b.find(".redux-field-warnings span").text(c),b.find(".redux-field-warnings").slideDown(),b.find(".redux-group-tab").each(function(){var c=a(this).find(".redux-field-warning").length;if(c>0){var d=a(this).attr("id").split("_");d=d[0],b.find('.redux-group-tab-link-a[data-key="'+d+'"]').prepend(''+c+""),b.find('.redux-group-tab-link-a[data-key="'+d+'"]').addClass("hasWarning");var e=b.find('.redux-group-tab-link-a[data-key="'+d+'"]').parents(".hasSubSections:first");e&&e.find(".redux-group-tab-link-a:first").addClass("hasWarning")}}))}))},a.redux.tabControl=function(){a(".redux-section-tabs div").hide(),a(".redux-section-tabs div:first").show(),a(".redux-section-tabs ul li:first").addClass("active"),a(".redux-section-tabs ul li a").click(function(){a(".redux-section-tabs ul li").removeClass("active"),a(this).parent().addClass("active");var b=a(this).attr("href");return a(".redux-section-tabs div").hide(),a(b).fadeIn("medium",function(){a.redux.initFields()}),!1})},a.redux.required=function(){a.each(redux.folds,function(b,c){var d=a("#"+redux.args.opt_name+"-"+b);if(d.parents("tr:first").addClass("fold"), -"hide"==c){if(d.parents("tr:first").addClass("hide"),d.hasClass("redux-container-section")){var e=a("#section-"+b);e.hasClass("redux-section-indent-start")&&(a("#section-table-"+b).hide().addClass("hide"),e.hide().addClass("hide"))}if(d.hasClass("redux-container-info")&&a("#info-"+b).hide().addClass("hide"),d.hasClass("redux-container-divide")&&a("#divide-"+b).hide().addClass("hide"),d.hasClass("redux-container-raw")){var f=d.parents().find("table#"+redux.args.opt_name+"-"+b);f.hide().addClass("hide")}}})},a.redux.get_container_value=function(b){var c=a("#"+redux.args.opt_name+"-"+b).serializeForm();return null!==c&&"object"==typeof c&&c.hasOwnProperty(redux.args.opt_name)&&(c=c[redux.args.opt_name][b]),a("#"+redux.args.opt_name+"-"+b).hasClass("redux-container-media")&&(c=c.url),c},a.redux.check_dependencies=function(b){if(null!==redux.required){var c=a(b),d=c.parents(".redux-field:first").data("id");if(redux.required.hasOwnProperty(d)){var e=c.parents(".redux-field-container:first"),f=e.parents("tr:first").hasClass(".hide");e.parents("tr:first").length||(f=e.parents(".customize-control:first").hasClass(".hide")),a.each(redux.required[d],function(b,c){var d=a(this),e=!1,g=a("#"+redux.args.opt_name+"-"+b),h=g.parents("tr:first");if(f||(e=a.redux.check_parents_dependencies(b)),e===!0){if(g.hasClass("redux-container-section")){var i=a("#section-"+b);i.hasClass("redux-section-indent-start")&&i.hasClass("hide")&&(a("#section-table-"+b).fadeIn(300).removeClass("hide"),i.fadeIn(300).removeClass("hide"))}if(g.hasClass("redux-container-info")&&a("#info-"+b).fadeIn(300).removeClass("hide"),g.hasClass("redux-container-divide")&&a("#divide-"+b).fadeIn(300).removeClass("hide"),g.hasClass("redux-container-raw")){var j=g.parents().find("table#"+redux.args.opt_name+"-"+b);j.fadeIn(300).removeClass("hide")}h.fadeIn(300,function(){a(this).removeClass("hide"),redux.required.hasOwnProperty(b)&&a.redux.check_dependencies(a("#"+redux.args.opt_name+"-"+b).children().first()),a.redux.initFields()}),(g.hasClass("redux-container-section")||g.hasClass("redux-container-info"))&&h.css({display:"none"})}else e===!1&&h.fadeOut(100,function(){a(this).addClass("hide"),redux.required.hasOwnProperty(b)&&a.redux.required_recursive_hide(b)});d.find("select, radio, input[type=checkbox]").trigger("change")})}}},a.redux.required_recursive_hide=function(b){var c=a("#"+redux.args.opt_name+"-"+b).parents("tr:first");c.fadeOut(50,function(){if(a(this).addClass("hide"),a("#"+redux.args.opt_name+"-"+b).hasClass("redux-container-section")){var c=a("#section-"+b);c.hasClass("redux-section-indent-start")&&(a("#section-table-"+b).fadeOut(50).addClass("hide"),c.fadeOut(50).addClass("hide"))}if(a("#"+redux.args.opt_name+"-"+b).hasClass("redux-container-info")&&a("#info-"+b).fadeOut(50).addClass("hide"),a("#"+redux.args.opt_name+"-"+b).hasClass("redux-container-divide")&&a("#divide-"+b).fadeOut(50).addClass("hide"),a("#"+redux.args.opt_name+"-"+b).hasClass("redux-container-raw")){var d=a("#"+redux.args.opt_name+"-"+b).parents().find("table#"+redux.args.opt_name+"-"+b);d.fadeOut(50).addClass("hide")}redux.required.hasOwnProperty(b)&&a.each(redux.required[b],function(b){a.redux.required_recursive_hide(b)})})},a.redux.check_parents_dependencies=function(b){var c="";return redux.required_child.hasOwnProperty(b)?a.each(redux.required_child[b],function(b,d){if(a("#"+redux.args.opt_name+"-"+d.parent).parents("tr:first").hasClass(".hide"))c=!1;else if(c!==!1){var e=a.redux.get_container_value(d.parent);c=a.redux.check_dependencies_visibility(e,d)}}):c=!0,c},a.redux.check_dependencies_visibility=function(b,c){var d,e=!1,f=c.checkValue,g=c.operation;switch(g){case"=":case"equals":a.isArray(b)?a(b[0]).each(function(b,c){if(a.isArray(f))a(f).each(function(a,b){return c==b?(e=!0,!0):void 0});else if(c==f)return e=!0,!0}):a.isArray(f)?a(f).each(function(a,c){b==c&&(e=!0)}):b==f&&(e=!0);break;case"!=":case"not":a.isArray(b)?a(b).each(function(b,c){if(a.isArray(f))a(f).each(function(a,b){return c!=b?(e=!0,!0):void 0});else if(c!=f)return e=!0,!0}):a.isArray(f)?a(f).each(function(a,c){b!=c&&(e=!0)}):b!=f&&(e=!0);break;case">":case"greater":case"is_larger":parseFloat(b)>parseFloat(f)&&(e=!0);break;case">=":case"greater_equal":case"is_larger_equal":parseFloat(b)>=parseFloat(f)&&(e=!0);break;case"<":case"less":case"is_smaller":parseFloat(b)g)&&(g=h,b.attr("data-height",g),b.css("width","auto"),b.attr("data-width",b.width()),f=b.width()),f>d?(e=d/f,b.css("width",d),b.css("height",g*e),g*=e,f*=e):b.css("width","auto"),g>c?(e=c/g,b.css("height",c),b.css("width",f*e),f*=e,g*=e):b.css("height","auto");var i=(a(document.getElementById("redux-header")).height()-b.height())/2;i>0?b.css("margin-top",i):b.css("margin-top",0),a("#redux-header .redux_field_search")&&a("#redux-header .redux_field_search").css("right",a(b).width()+20)},a.redux.resizeAds=function(){var b,c=a("#redux-header");c.length?b=c.width()-c.find(".display_header").width()-30:(c=a("#customize-info"),b=c.width());var d=c.height(),e=c.find(".rAds");a(e).find("video").each(function(){a.redux.scaleToRatio(a(this),d,b)}),a(e).find("img").each(function(){a.redux.scaleToRatio(a(this),d,b)}),a(e).find("div").each(function(){a.redux.scaleToRatio(a(this),d,b)}),"-99999px"==e.css("left")&&e.css("display","none").css("left","auto"),e.fadeIn("slow")},a(document).ready(function(){redux.rAds&&setTimeout(function(){var b;a("#redux-header").length>0?(a("#redux-header").append('
    '),b=a("#redux-header")):(a("#customize-theme-controls ul").first().prepend('
  • '),b=a("#redux_rAds")),b.css("position","relative"),b.find(".rAds").attr("style","position:absolute; top: 6px; right: 6px; display:block !important;overflow:hidden;").css("left","-99999px"),b.find(".rAds").html(redux.rAds.replace(//,""));var c=b.find(".rAds");b.height(),b.width()-b.find(".display_header").width()-30;c.find("a").css("float","right").css("line-height",b.height()+"px").css("margin-left","5px"),a(document).ajaxComplete(function(){c.find("a").hide(),setTimeout(function(){a.redux.resizeAds(),c.find("a").fadeIn()},1400),setTimeout(function(){a.redux.resizeAds()},1500),a(document).unbind("ajaxComplete")}),a(window).resize(function(){a.redux.resizeAds()})},400)})}(jQuery),jQuery.noConflict();var confirmOnPageExit=function(a){a=a||window.event;var b=redux.args.save_pending;return a&&(a.returnValue=b),window.onbeforeunload=null,b}; \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor.min.js b/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor.min.js deleted file mode 100755 index fc3d8efb..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"function"==typeof define&&define.amd?jQueryCookie.define(["jquery"],a):a(jQuery)}(function(a){function b(a){return a}function c(a){return decodeURIComponent(a.replace(e," "))}function d(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return f.json?JSON.parse(a):a}catch(b){}}var e=/\+/g,f=a.cookie=function(e,g,h){if(void 0!==g){if(h=a.extend({},f.defaults,h),"number"==typeof h.expires){var i=h.expires,j=h.expires=new Date;j.setDate(j.getDate()+i)}return g=f.json?JSON.stringify(g):String(g),document.cookie=[f.raw?e:encodeURIComponent(e),"=",f.raw?g:encodeURIComponent(g),h.expires?"; expires="+h.expires.toUTCString():"",h.path?"; path="+h.path:"",h.domain?"; domain="+h.domain:"",h.secure?"; secure":""].join("")}for(var k=f.raw?b:c,l=document.cookie.split("; "),m=e?void 0:{},n=0,o=l.length;o>n;n++){var p=l[n].split("="),q=k(p.shift()),r=k(p.join("="));if(e&&e===q){m=d(r);break}e||(m[q]=d(r))}return m};f.defaults={},a.removeCookie=function(b,c){return void 0!==a.cookie(b)?(a.cookie(b,"",a.extend({},c,{expires:-1})),!0):!1}}),function(a){a.fn.serializeForm=function(){if(this.length<1)return!1;var b={},c=b,d=':input[type!="checkbox"][type!="radio"], input:checked',e=function(){if(!this.disabled){var d=this.name.replace(/\[([^\]]+)?\]/g,",$1").split(","),e=d.length-1,f=a(this);if(d[0]){for(var g=0;e>g;g++)c=c[d[g]]=c[d[g]]||(""===d[g+1]||"0"===d[g+1]?[]:{});void 0!==c.length?c.push(f.val()):c[d[e]]=f.val(),c=b}}};return this.filter(d).each(e),this.find(d).each(e),b}}(jQuery),function(a){a.fn.typeWatch=function(b){function c(b,c){var d=a(b.el).val();(d.length>=f.captureLength&&d.toUpperCase()!=b.text||c&&d.length>=f.captureLength)&&(b.text=d.toUpperCase(),b.cb.call(b.el,d))}function d(b){var d=b.type.toUpperCase();if(a.inArray(d,f.inputTypes)>=0){var e={timer:null,text:a(b).val().toUpperCase(),cb:f.callback,el:b,wait:f.wait};f.highlight&&a(b).focus(function(){this.select()});var g=function(b){var d=e.wait,g=!1,h=this.type.toUpperCase();"undefined"!=typeof b.keyCode&&13==b.keyCode&&"TEXTAREA"!=h&&a.inArray(h,f.inputTypes)>=0&&(d=1,g=!0);var i=function(){c(e,g)};clearTimeout(e.timer),e.timer=setTimeout(i,d)};a(b).on("keydown paste cut input",g)}}var e=["TEXT","TEXTAREA","PASSWORD","TEL","SEARCH","URL","EMAIL","DATETIME","DATE","MONTH","WEEK","TIME","DATETIME-LOCAL","NUMBER","RANGE"],f=a.extend({wait:750,callback:function(){},highlight:!0,captureLength:2,inputTypes:e},b);return this.each(function(){d(this)})}}(jQuery),function(a){function b(){var a="!@#$%^&*()+=[]\\';,/{}|\":<>?~`.-_";return a+=" "}function c(){var a="¬€£¦";return a}function d(b,c,d){b.each(function(){var b=a(this);b.bind("keyup change paste",function(a){var e="";a.originalEvent&&a.originalEvent.clipboardData&&a.originalEvent.clipboardData.getData&&(e=a.originalEvent.clipboardData.getData("text/plain")),setTimeout(function(){h(b,c,d,e)},0)}),b.bind("keypress",function(a){var e=a.charCode?a.charCode:a.which;if(!(g(e)||a.ctrlKey||a.metaKey)){var f=String.fromCharCode(e),h=b.selection(),i=h.start,j=h.end,k=b.val(),l=k.substring(0,i)+f+k.substring(j),m=c(l,d);m!=l&&a.preventDefault()}})})}function e(b,c){var d=parseFloat(a(b).val()),e=a(b);return isNaN(d)?void e.val(""):(f(c.min)&&dc.max&&e.val("")))}function f(a){return!isNaN(a)}function g(a){return a>=32?!1:10==a?!1:13==a?!1:!0}function h(a,b,c,d){var e=a.val();""==e&&d.length>0&&(e=d);var f=b(e,c);if(e!=f){var g=a.alphanum_caret();a.val(f),e.length==f.length+1?a.alphanum_caret(g-1):a.alphanum_caret(g)}}function i(b,c){"undefined"==typeof c&&(c=D);var d,e={};return d="string"==typeof b?F[b]:"undefined"==typeof b?{}:b,a.extend(e,c,d),"undefined"==typeof e.blacklist&&(e.blacklistSet=x(e.allow,e.disallow)),e}function j(b){var c,d={};return c="string"==typeof b?G[b]:"undefined"==typeof b?{}:b,a.extend(d,E,c),d}function k(a,b,c){return c.maxLength&&a.length>=c.maxLength?!1:c.allow.indexOf(b)>=0?!0:c.allowSpace&&" "==b?!0:c.blacklistSet.contains(b)?!1:!c.allowNumeric&&K[b]?!1:!c.allowUpper&&u(b)?!1:!c.allowLower&&v(b)?!1:!c.allowCaseless&&w(b)?!1:!c.allowLatin&&L.contains(b)?!1:c.allowOtherCharSets?!0:K[b]||L.contains(b)?!0:!1}function l(a,b,c){if(K[b])return n(a,c)?!1:p(a,c)?!1:o(a,c)?!1:q(a+b,c)?!1:r(a+b,c)?!1:!0;if(c.allowPlus&&"+"==b&&""==a)return!0;if(c.allowMinus&&"-"==b&&""==a)return!0;if(b==I&&c.allowThouSep&&A(a,b))return!0;if(b==J){if(a.indexOf(J)>=0)return!1;if(c.allowDecSep)return!0}return!1}function m(a){return a+="",a.replace(/[^0-9]/g,"").length}function n(a,b){var c=b.maxDigits;if(""==c||isNaN(c))return!1;var d=m(a);return d>=c?!0:!1}function o(a,b){var c=b.maxDecimalPlaces;if(""==c||isNaN(c))return!1;var d=a.indexOf(J);if(-1==d)return!1;var e=a.substring(d),f=m(e);return f>=c?!0:!1}function p(a,b){var c=b.maxPreDecimalPlaces;if(""==c||isNaN(c))return!1;var d=a.indexOf(J);if(d>=0)return!1;var e=m(a);return e>=c?!0:!1}function q(a,b){if(!b.max||b.max<0)return!1;var c=parseFloat(a);return c>b.max?!0:!1}function r(a,b){if(!b.min||b.min>0)return!1;var c=parseFloat(a);return c=0)return!1;var d=a.indexOf(I);if(0>d)return!0;var e=a.lastIndexOf(I),f=a.length-e-1;if(3>f)return!1;var g=m(a.substring(d));return g%3>0?!1:!0}function B(a){"string"==typeof a?this.map=C(a):this.map={}}function C(a){var b,c={},d=a.split(""),e=0;for(e=0;e=0?endPos=e.toString().length:endPos=startPos+d.toString().length,{start:startPos,end:endPos}):null},d=function(d){var e=b(d);if(void 0!==d.selectionStart)return document.activeElement&&document.activeElement!=d&&d.selectionStart==d.selectionEnd&&0==d.selectionStart?{start:d.value.length,end:d.value.length}:{start:d.selectionStart,end:d.selectionEnd};if(e.getSelection)return c(d,e);try{if("input"==d.nodeName.toLowerCase()){var f=b(d).document.selection.createRange(),g=d.createTextRange();g.setEndPoint("EndToStart",f);var h=g.text.length;return{start:h,end:h+f.text.length}}var i=c(d,e);if(!i)return i;var j=a.Range.current().clone(),k=j.clone().collapse().range,l=j.clone().collapse(!1).range;return k.moveStart("character",-1),l.moveStart("character",-1),0!=i.startPos&&""==k.text&&(i.startPos+=2),0!=i.endPos&&""==l.text&&(i.endPos+=2),i}catch(m){return{start:d.value.length,end:d.value.length}}},e=function(a,c,d){var e=b(a);if(a.setSelectionRange)void 0===d?(a.focus(),a.setSelectionRange(c,c)):(a.select(),a.selectionStart=c,a.selectionEnd=d);else if(a.createTextRange){var f=a.createTextRange();f.moveStart("character",c),d=d||c,f.moveEnd("character",d-a.value.length),f.select()}else if(e.getSelection){var h=e.document,i=e.getSelection(),j=h.createRange(),k=[c,void 0!==d?d:c];g([a],k),j.setStart(k[0].el,k[0].count),j.setEnd(k[1].el,k[1].count),i.removeAllRanges(),i.addRange(j)}else if(e.document.body.createTextRange){var j=document.body.createTextRange();j.moveToElementText(a),j.collapse(),j.moveStart("character",c),j.moveEnd("character",void 0!==d?d:c),j.select()}},f=function(a,b,c,d){"number"==typeof c[0]&&c[0]?~`.-_'; - blacklist += " "; // 'Space' is on the blacklist but can be enabled using the 'allowSpace' config entry - return blacklist; - } - - // Return the blacklisted special chars that are NOT encodable using 7-bit ascii - // We want this .js file to be encoded using 7-bit ascii so it can reach the widest possible audience - // Higher order chars must be escaped eg "\xAC" - // Not too worried about comments containing higher order characters for now (let's wait and see if it becomes a problem) - function getBlacklistNonAscii(){ - var blacklist = - "\xAC" // - + "\u20AC" // - + "\xA3" // - + "\xA6" // - ; - return blacklist; - } - - // End Settings //////////////////////////////////////////////////////// - - - // Implementation details go here //////////////////////////////////////////////////////// - - function setupEventHandlers($textboxes, trimFunction, settings) { - - $textboxes.each(function(){ - - var $textbox = $(this); - - $textbox.bind("keyup change paste", function(e){ - - var pastedText = ""; - - if(e.originalEvent && e.originalEvent.clipboardData && e.originalEvent.clipboardData.getData) - pastedText = e.originalEvent.clipboardData.getData("text/plain") - - // setTimeout is necessary for handling the 'paste' event - setTimeout(function(){ - trimTextbox($textbox, trimFunction, settings, pastedText); - }, 0); - }); - - $textbox.bind("keypress", function(e){ - - // Determine which key is pressed. - // If it's a control key, then allow the event's default action to occur eg backspace, tab - var charCode = !e.charCode ? e.which : e.charCode; - if(isControlKey(charCode) - || e.ctrlKey - || e.metaKey ) // cmd on MacOS - return; - - var newChar = String.fromCharCode(charCode); - - // Determine if some text was selected / highlighted when the key was pressed - var selectionObject = $textbox.selection(); - var start = selectionObject.start; - var end = selectionObject.end; - - var textBeforeKeypress = $textbox.val(); - - // The new char may be inserted: - // 1) At the start - // 2) In the middle - // 3) At the end - // 4) User highlights some text and then presses a key which would replace the highlighted text - // - // Here we build the string that would result after the keypress. - // If the resulting string is invalid, we cancel the event. - // Unfortunately, it isn't enough to just check if the new char is valid because some chars - // are position sensitive eg the decimal point '.'' or the minus sign '-'' are only valid in certain positions. - var potentialTextAfterKeypress = textBeforeKeypress.substring(0, start) + newChar + textBeforeKeypress.substring(end); - var validatedText = trimFunction(potentialTextAfterKeypress, settings); - - // If the keypress would cause the textbox to contain invalid characters, then cancel the keypress event - if(validatedText != potentialTextAfterKeypress) - e.preventDefault(); - }); - }); - - } - - // Ensure the text is a valid number when focus leaves the textbox - // This catches the case where a user enters '-' or '.' without entering any digits - function numericField_Blur(inputBox, settings) { - var fieldValueNumeric = parseFloat($(inputBox).val()); - var $inputBox = $(inputBox); - - if(isNaN(fieldValueNumeric)) { - $inputBox.val(""); - return; - } - - if(isNumeric(settings.min) && fieldValueNumeric < settings.min) - $inputBox.val(""); - - if(isNumeric(settings.max) && fieldValueNumeric > settings.max) - $inputBox.val(""); - } - - function isNumeric(value) { - return !isNaN(value); - } - - function isControlKey(charCode) { - - if(charCode >= 32) - return false; - if(charCode == 10) - return false; - if(charCode == 13) - return false; - - return true; - } - - // One way to prevent a character being entered is to cancel the keypress event. - // However, this gets messy when you have to deal with things like copy paste which isn't a keypress. - // Which event gets fired first, keypress or keyup? What about IE6 etc etc? - // Instead, it's easier to allow the 'bad' character to be entered and then to delete it immediately after. - - function trimTextbox($textBox, trimFunction, settings, pastedText){ - - var inputString = $textBox.val(); - - if(inputString == "" && pastedText.length > 0) - inputString = pastedText; - - var outputString = trimFunction(inputString, settings); - - if(inputString == outputString) - return; - - var caretPos = $textBox.alphanum_caret(); - - $textBox.val(outputString); - - //Reset the caret position - if(inputString.length ==(outputString.length + 1)) - $textBox.alphanum_caret(caretPos - 1); - else - $textBox.alphanum_caret(caretPos); - } - - function getCombinedSettingsAlphaNum(settings, defaultSettings){ - if(typeof defaultSettings == "undefined") - defaultSettings = DEFAULT_SETTINGS_ALPHANUM; - var userSettings, combinedSettings = {}; - if(typeof settings === "string") - userSettings = CONVENIENCE_SETTINGS_ALPHANUM[settings]; - else if(typeof settings == "undefined") - userSettings = {}; - else - userSettings = settings; - - $.extend(combinedSettings, defaultSettings, userSettings); - - if(typeof combinedSettings.blacklist == 'undefined') - combinedSettings.blacklistSet = getBlacklistSet(combinedSettings.allow, combinedSettings.disallow); - - return combinedSettings; - } - - function getCombinedSettingsNum(settings){ - var userSettings, combinedSettings = {}; - if(typeof settings === "string") - userSettings = CONVENIENCE_SETTINGS_NUMERIC[settings]; - else if(typeof settings == "undefined") - userSettings = {}; - else - userSettings = settings; - - $.extend(combinedSettings, DEFAULT_SETTINGS_NUM, userSettings); - - return combinedSettings; - } - - - // This is the heart of the algorithm - function alphanum_allowChar(validatedStringFragment, Char, settings){ - - if(settings.maxLength && validatedStringFragment.length >= settings.maxLength) - return false; - - if(settings.allow.indexOf(Char) >=0 ) - return true; - - if(settings.allowSpace && (Char == " ")) - return true; - - if(settings.blacklistSet.contains(Char)) - return false; - - if(!settings.allowNumeric && DIGITS[Char]) - return false; - - if(!settings.allowUpper && isUpper(Char)) - return false; - - if(!settings.allowLower && isLower(Char)) - return false; - - if(!settings.allowCaseless && isCaseless(Char)) - return false; - - if(!settings.allowLatin && LATIN_CHARS.contains(Char)) - return false; - - if(!settings.allowOtherCharSets){ - if(DIGITS[Char] || LATIN_CHARS.contains(Char)) - return true; - else - return false; - } - - return true; - } - - function numeric_allowChar(validatedStringFragment, Char, settings){ - - if(DIGITS[Char]) { - - if(isMaxDigitsReached(validatedStringFragment, settings)) - return false; - - if(isMaxPreDecimalsReached(validatedStringFragment, settings)) - return false; - - if(isMaxDecimalsReached(validatedStringFragment, settings)) - return false; - - if(isGreaterThanMax(validatedStringFragment + Char, settings)) - return false; - - if(isLessThanMin(validatedStringFragment + Char, settings)) - return false; - - return true; - } - - if(settings.allowPlus && Char == '+' && validatedStringFragment == '') - return true; - - if(settings.allowMinus && Char == '-' && validatedStringFragment == '') - return true; - - if(Char == THOU_SEP && settings.allowThouSep && allowThouSep(validatedStringFragment, Char)) - return true; - - if(Char == DEC_SEP) { - // Only one decimal separator allowed - if(validatedStringFragment.indexOf(DEC_SEP) >= 0) - return false; - if(settings.allowDecSep) - return true; - } - - return false; - } - - function countDigits(string) { - - // Error handling, nulls etc - string = string + ""; - - // Count the digits - return string.replace(/[^0-9]/g,"").length; - } - - function isMaxDigitsReached(string, settings) { - - var maxDigits = settings.maxDigits; - - if(maxDigits == "" || isNaN(maxDigits)) - return false; // In this case, there is no maximum - - var numDigits = countDigits(string); - - if(numDigits >= maxDigits) - return true; - - return false; - } - - function isMaxDecimalsReached(string, settings) { - - var maxDecimalPlaces = settings.maxDecimalPlaces; - - if(maxDecimalPlaces == "" || isNaN(maxDecimalPlaces)) - return false; // In this case, there is no maximum - - var indexOfDecimalPoint = string.indexOf(DEC_SEP); - - if(indexOfDecimalPoint == -1) - return false; - - var decimalSubstring = string.substring(indexOfDecimalPoint); - var numDecimals = countDigits(decimalSubstring); - - if(numDecimals >= maxDecimalPlaces) - return true; - - return false; - } - - function isMaxPreDecimalsReached(string, settings) { - - var maxPreDecimalPlaces = settings.maxPreDecimalPlaces; - - if(maxPreDecimalPlaces == "" || isNaN(maxPreDecimalPlaces)) - return false; // In this case, there is no maximum - - var indexOfDecimalPoint = string.indexOf(DEC_SEP); - - if(indexOfDecimalPoint >= 0) - return false; - - var numPreDecimalDigits = countDigits(string); - - if(numPreDecimalDigits >= maxPreDecimalPlaces) - return true; - - return false; - } - - function isGreaterThanMax(numericString, settings) { - - if(!settings.max || settings.max < 0) - return false; - - var outputNumber = parseFloat(numericString); - if(outputNumber > settings.max) - return true; - - return false; - } - - function isLessThanMin(numericString, settings) { - - if(!settings.min || settings.min > 0) - return false; - - var outputNumber = parseFloat(numericString); - if(outputNumber < settings.min) - return true; - - return false; - } - - /******************************** - * Trims a string according to the settings provided - ********************************/ - function trimAlphaNum(inputString, settings){ - - if(typeof inputString != "string") - return inputString; - - var inChars = inputString.split(""); - var outChars = []; - var i = 0; - var Char; - - for(i=0; i= 0) - return false; - - var posOfFirstThouSep = currentString.indexOf(THOU_SEP); - - // Check if this is the first occurrence of a THOU_SEP - if(posOfFirstThouSep < 0) - return true; - - var posOfLastThouSep = currentString.lastIndexOf(THOU_SEP); - var charsSinceLastThouSep = currentString.length - posOfLastThouSep - 1; - - // Check if there has been 3 digits since the last THOU_SEP - if(charsSinceLastThouSep < 3) - return false; - - var digitsSinceFirstThouSep = countDigits(currentString.substring(posOfFirstThouSep)); - - // Check if there has been a multiple of 3 digits since the first THOU_SEP - if((digitsSinceFirstThouSep % 3) > 0) - return false; - - return true; - } - - //////////////////////////////////////////////////////////////////////////////////// - // Implementation of a Set - //////////////////////////////////////////////////////////////////////////////////// - function Set(elems){ - if(typeof elems == "string") - this.map = stringToMap(elems); - else - this.map = {}; - } - - Set.prototype.add = function(set){ - - var newSet = this.clone(); - - for(var key in set.map) - newSet.map[key] = true; - - return newSet; - } - - Set.prototype.subtract = function(set){ - - var newSet = this.clone(); - - for(var key in set.map) - delete newSet.map[key]; - - return newSet; - } - - Set.prototype.contains = function(key){ - if(this.map[key]) - return true; - else - return false; - } - - Set.prototype.clone = function(){ - var newSet = new Set(); - - for(var key in this.map) - newSet.map[key] = true; - - return newSet; - } - //////////////////////////////////////////////////////////////////////////////////// - - function stringToMap(string){ - var map = {}; - var array = string.split(""); - var i=0; - var Char; - - for(i=0; i=0){endPos=i.toString().length}else{endPos=startPos+r.toString().length}return{start:startPos,end:endPos}},s=function(t){var n=r(t);if(t.selectionStart!==undefined){if(document.activeElement&&document.activeElement!=t&&t.selectionStart==t.selectionEnd&&t.selectionStart==0){return{start:t.value.length,end:t.value.length}}return{start:t.selectionStart,end:t.selectionEnd}}else if(n.getSelection){return i(t,n)}else{try{if(t.nodeName.toLowerCase()=="input"){var s=r(t).document.selection.createRange(),o=t.createTextRange();o.setEndPoint("EndToStart",s);var u=o.text.length;return{start:u,end:u+s.text.length}}else{var a=i(t,n);if(!a){return a}var f=e.Range.current().clone(),l=f.clone().collapse().range,c=f.clone().collapse(false).range;l.moveStart("character",-1);c.moveStart("character",-1);if(a.startPos!=0&&l.text==""){a.startPos+=2}if(a.endPos!=0&&c.text==""){a.endPos+=2}return a}}catch(h){return{start:t.value.length,end:t.value.length}}}},o=function(e,t,n){var i=r(e);if(e.setSelectionRange){if(n===undefined){e.focus();e.setSelectionRange(t,t)}else{e.select();e.selectionStart=t;e.selectionEnd=n}}else if(e.createTextRange){var s=e.createTextRange();s.moveStart("character",t);n=n||t;s.moveEnd("character",n-e.value.length);s.select()}else if(i.getSelection){var o=i.document,u=i.getSelection(),f=o.createRange(),l=[t,n!==undefined?n:t];a([e],l);f.setStart(l[0].el,l[0].count);f.setEnd(l[1].el,l[1].count);u.removeAllRanges();u.addRange(f)}else if(i.document.body.createTextRange){var f=document.body.createTextRange();f.moveToElementText(e);f.collapse();f.moveStart("character",t);f.moveEnd("character",n!==undefined?n:t);f.select()}},u=function(e,t,n,r){if(typeof n[0]==="number"&&n[0]= options.captureLength AND text != saved text OR if override AND text >= options.captureLength - if ((value.length >= options.captureLength && value.toUpperCase() != timer.text) - || (override && value.length >= options.captureLength)) - { - timer.text = value.toUpperCase(); - timer.cb.call(timer.el, value); - } - }; - - function watchElement(elem) { - var elementType = elem.type.toUpperCase(); - if (jQuery.inArray(elementType, options.inputTypes) >= 0) { - - // Allocate timer element - var timer = { - timer: null, - text: jQuery(elem).val().toUpperCase(), - cb: options.callback, - el: elem, - wait: options.wait - }; - - // Set focus action (highlight) - if (options.highlight) { - jQuery(elem).focus( - function() { - this.select(); - }); - } - - // Key watcher / clear and reset the timer - var startWatch = function(evt) { - var timerWait = timer.wait; - var overrideBool = false; - var evtElementType = this.type.toUpperCase(); - - // If enter key is pressed and not a TEXTAREA and matched inputTypes - if (typeof evt.keyCode != 'undefined' && evt.keyCode == 13 && evtElementType != 'TEXTAREA' && jQuery.inArray(evtElementType, options.inputTypes) >= 0) { - timerWait = 1; - overrideBool = true; - } - - var timerCallbackFx = function() { - checkElement(timer, overrideBool) - } - - // Clear timer - clearTimeout(timer.timer); - timer.timer = setTimeout(timerCallbackFx, timerWait); - }; - - jQuery(elem).on('keydown paste cut input', startWatch); - } - }; - - // Watch Each Element - return this.each(function() { - watchElement(this); - }); - - }; -})(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/jsonview.js b/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/jsonview.js deleted file mode 100755 index 1afe0271..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/jsonview.js +++ /dev/null @@ -1,265 +0,0 @@ - -/* global console, jsonView */ -/* - * ViewJSON - * Version 1.0 - * A Google Chrome extension to display JSON in a user-friendly format - * - * This is a chromeified version of the JSONView Firefox extension by Ben Hollis: - * http://jsonview.com - * http://code.google.com/p/jsonview - * - * Also based on the XMLTree Chrome extension by Moonty & alan.stroop - * https://chrome.google.com/extensions/detail/gbammbheopgpmaagmckhpjbfgdfkpadb - * - * port by Jamie Wilkinson (@jamiew) | http://jamiedubs.com | http://github.com/jamiew - * MIT license / copyfree (f) F.A.T. Lab http://fffff.at - * Speed Project Approved: 2h - */ - -function collapse(evt) { - var collapser = evt.target; - var target = collapser.parentNode.getElementsByClassName('collapsible'); - if (!target.length) { - return; - } - target = target[0]; - if (target.style.display === 'none') { - var ellipsis = target.parentNode.getElementsByClassName('ellipsis')[0]; - target.parentNode.removeChild(ellipsis); - target.style.display = ''; - } else { - target.style.display = 'none'; - var ellipsis = document.createElement('span'); - ellipsis.className = 'ellipsis'; - ellipsis.innerHTML = ' … '; - target.parentNode.insertBefore(ellipsis, target); - } - collapser.innerHTML = (collapser.innerHTML === '-') ? '+' : '-'; -} - -function addCollapser(item) { - // This mainly filters out the root object (which shouldn't be collapsible) - if (item.nodeName !== 'LI') { - return; - } - var collapser = document.createElement('div'); - collapser.className = 'collapser'; - collapser.innerHTML = '-'; - collapser.addEventListener('click', collapse, false); - item.insertBefore(collapser, item.firstChild); -} - -function jsonView(id, target) { - this.debug = false; - if (id.indexOf("#") !== -1) { - this.idType = "id"; - this.id = id.replace('#', ''); - } else if (id.indexOf(".") !== -1) { - this.idType = "class"; - this.id = id.replace('.', ''); - } else { - if (this.debug) { console.log("Can't find that element"); } - return; - } - - this.data = document.getElementById(this.id).innerHTML; - if (typeof(target) !== undefined) { - if (target.indexOf("#") !== -1) { - this.targetType = "id"; - this.target = target.replace('#', ''); - } else if (id.indexOf(".") !== -1) { - this.targetType = "class"; - this.target = target.replace('.', ''); - } else { - if (this.debug) { console.log("Can't find the target element"); } - return; - } - } - // Note: now using "*.json*" URI matching rather than these page regexes -- save CPU cycles! - // var is_json = /^\s*(\{.*\})\s*$/.test(this.data); - // var is_jsonp = /^.*\(\s*(\{.*\})\s*\)$/.test(this.data); - // if(is_json || is_jsonp){ - // Our manifest specifies that we only do URLs matching '.json', so attempt to sanitize any HTML - // added by Chrome's "text/plain" or "text/html" handlers - if (/^\(.*)\<\/pre\>$/.test(this.data)) { - if (this.debug) { console.log("JSONView: data is wrapped in
    ...
    , stripping HTML..."); } - this.data = this.data.replace(/<(?:.|\s)*?>/g, ''); //Aggressively strip HTML. - } - // Test if what remains is JSON or JSONp - var json_regex = /^\s*([\[\{].*[\}\]])\s*$/; // Ghetto, but it works - var jsonp_regex = /^[\s\u200B\uFEFF]*([\w$\[\]\.]+)[\s\u200B\uFEFF]*\([\s\u200B\uFEFF]*([\[{][\s\S]*[\]}])[\s\u200B\uFEFF]*\);?[\s\u200B\uFEFF]*$/; - var jsonp_regex2 = /([\[\{][\s\S]*[\]\}])\)/; // more liberal support... this allows us to pass the jsonp.json & jsonp2.json tests - var is_json = json_regex.test(this.data); - var is_jsonp = jsonp_regex.test(this.data); - if (this.debug) { console.log("JSONView: is_json=" + is_json + " is_jsonp=" + is_jsonp); } - if (is_json || is_jsonp) { - if (this.debug) { console.log("JSONView: sexytime!"); } - // JSONFormatter json->HTML prototype straight from Firefox JSONView - // For reference: http://code.google.com/p/jsonview - - function JSONFormatter() { - // No magic required. - } - JSONFormatter.prototype = { - htmlEncode: function(t) { - return t != null ? t.toString().replace(/&/g, "&").replace(/"/g, """).replace(//g, ">") : ''; - }, - decorateWithSpan: function(value, className) { - return '' + this.htmlEncode(value) + ''; - }, - // Convert a basic JSON datatype (number, string, boolean, null, object, array) into an HTML fragment. - valueToHTML: function(value) { - var valueType = typeof value; - var output = ""; - if (value === null) { - output += this.decorateWithSpan('null', 'null'); - } else if (value && value.constructor === Array) { - output += this.arrayToHTML(value); - } else if (valueType === 'object') { - output += this.objectToHTML(value); - } else if (valueType === 'number') { - output += this.decorateWithSpan(value, 'num'); - } else if (valueType === 'string') { - if (/^(http|https):\/\/[^\s]+$/.test(value)) { - output += '
    ' + this.htmlEncode(value) + ''; - } else { - output += this.decorateWithSpan('"' + value + '"', 'string'); - } - } else if (valueType === 'boolean') { - output += this.decorateWithSpan(value, 'bool'); - } - return output; - }, - // Convert an array into an HTML fragment - arrayToHTML: function(json) { - var output = '[
      '; - var hasContents = false; - for (var prop in json) { - hasContents = true; - output += '
    • '; - output += this.valueToHTML(json[prop]); - output += '
    • '; - } - output += '
    ]'; - if (!hasContents) { - output = "[ ]"; - } - return output; - }, - // Convert a JSON object to an HTML fragment - objectToHTML: function(json) { - var output = '{
      '; - var hasContents = false; - for (var prop in json) { - hasContents = true; - output += '
    • '; - output += '' + this.htmlEncode(prop) + ': '; - output += this.valueToHTML(json[prop]); - output += '
    • '; - } - output += '
    }'; - if (!hasContents) { - output = "{ }"; - } - return output; - }, - // Convert a whole JSON object into a formatted HTML document. - jsonToHTML: function(json, callback, uri) { - var output = ''; - if (callback) { - output += '
    ' + callback + ' (
    '; - output += '
    '; - } else { - output += '
    '; - } - output += this.valueToHTML(json); - output += '
    '; - if (callback) { - output += '
    )
    '; - } - return this.toHTML(output, uri); - }, - // Produce an error document for when parsing fails. - errorPage: function(error, data, uri) { - // var output = '
    ' + this.stringbundle.GetStringFromName('errorParsing') + '
    '; - // output += '

    ' + this.stringbundle.GetStringFromName('docContents') + ':

    '; - var output = '
    Error parsing JSON: ' + error.message + '
    '; - output += '

    ' + error.stack + ':

    '; - output += '
    ' + this.htmlEncode(data) + '
    '; - return this.toHTML(output, uri + ' - Error'); - }, - // Wrap the HTML fragment in a full document. Used by jsonToHTML and errorPage. - toHTML: function(content) { - return content; - } - }; - // Sanitize & output -- all magic from JSONView Firefox - this.jsonFormatter = new JSONFormatter(); - // This regex attempts to match a JSONP structure: - // * Any amount of whitespace (including unicode nonbreaking spaces) between the start of the file and the callback name - // * Callback name (any valid JavaScript function name according to ECMA-262 Edition 3 spec) - // * Any amount of whitespace (including unicode nonbreaking spaces) - // * Open parentheses - // * Any amount of whitespace (including unicode nonbreaking spaces) - // * Either { or [, the only two valid characters to start a JSON string. - // * Any character, any number of times - // * Either } or ], the only two valid closing characters of a JSON string. - // * Any amount of whitespace (including unicode nonbreaking spaces) - // * A closing parenthesis, an optional semicolon, and any amount of whitespace (including unicode nonbreaking spaces) until the end of the file. - // This will miss anything that has comments, or more than one callback, or requires modification before use. - var outputDoc = ''; - // text = text.match(jsonp_regex)[1]; - var cleanData = '', - callback = ''; - var callback_results = jsonp_regex.exec(this.data); - if (callback_results && callback_results.length === 3) { - if (this.debug) { console.log("THIS IS JSONp"); } - callback = callback_results[1]; - cleanData = callback_results[2]; - } else { - if (this.debug) { console.log("Vanilla JSON"); } - cleanData = this.data; - } - if (this.debug) { console.log(cleanData); } - // Covert, and catch exceptions on failure - try { - // var jsonObj = this.nativeJSON.decode(cleanData); - var jsonObj = JSON.parse(cleanData); - if (jsonObj) { - outputDoc = this.jsonFormatter.jsonToHTML(jsonObj, callback); - } else { - throw "There was no object!"; - } - } catch (e) { - if (this.debug) { console.log(e); } - outputDoc = this.jsonFormatter.errorPage(e, this.data); - } - var links = ''; - if (this.targetType !== undefined) { - this.idType = this.targetType; - this.id = this.target; - } - var el; - if (this.idType === "class") { - el = document.getElementsByClassName(this.id); - if (el) { - el.className += el.className ? ' jsonViewOutput' : 'jsonViewOutput'; - el.innerHTML = links + outputDoc; - } - } else if (this.idType === "id") { - el = document.getElementById(this.id); - if (el) { - el.className += el.className ? ' jsonViewOutput' : 'jsonViewOutput'; - el.innerHTML = links + outputDoc; - } - el.innerHTML = links + outputDoc; - } - var items = document.getElementsByClassName('collapsible'); - for (var i = 0; i < items.length; i++) { - addCollapser(items[i].parentNode); - } - } else { - // console.log("JSONView: this is not json, not formatting."); - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/jsonview.min.js b/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/jsonview.min.js deleted file mode 100755 index b8c4f1bb..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/jsonview.min.js +++ /dev/null @@ -1,16 +0,0 @@ -/* global console, jsonView *//* - * ViewJSON - * Version 1.0 - * A Google Chrome extension to display JSON in a user-friendly format - * - * This is a chromeified version of the JSONView Firefox extension by Ben Hollis: - * http://jsonview.com - * http://code.google.com/p/jsonview - * - * Also based on the XMLTree Chrome extension by Moonty & alan.stroop - * https://chrome.google.com/extensions/detail/gbammbheopgpmaagmckhpjbfgdfkpadb - * - * port by Jamie Wilkinson (@jamiew) | http://jamiedubs.com | http://github.com/jamiew - * MIT license / copyfree (f) F.A.T. Lab http://fffff.at - * Speed Project Approved: 2h - */function collapse(e){var t=e.target,n=t.parentNode.getElementsByClassName("collapsible");if(!n.length)return;n=n[0];if(n.style.display==="none"){var r=n.parentNode.getElementsByClassName("ellipsis")[0];n.parentNode.removeChild(r),n.style.display=""}else{n.style.display="none";var r=document.createElement("span");r.className="ellipsis",r.innerHTML=" … ",n.parentNode.insertBefore(r,n)}t.innerHTML=t.innerHTML==="-"?"+":"-"}function addCollapser(e){if(e.nodeName!=="LI")return;var t=document.createElement("div");t.className="collapser",t.innerHTML="-",t.addEventListener("click",collapse,!1),e.insertBefore(t,e.firstChild)}function jsonView(e,t){this.debug=!1;if(e.indexOf("#")!==-1)this.idType="id",this.id=e.replace("#","");else{if(e.indexOf(".")===-1){this.debug&&console.log("Can't find that element");return}this.idType="class",this.id=e.replace(".","")}this.data=document.getElementById(this.id).innerHTML;if(typeof t!==undefined)if(t.indexOf("#")!==-1)this.targetType="id",this.target=t.replace("#","");else{if(e.indexOf(".")===-1){this.debug&&console.log("Can't find the target element");return}this.targetType="class",this.target=t.replace(".","")}/^\(.*)\<\/pre\>$/.test(this.data)&&(this.debug&&console.log("JSONView: data is wrapped in
    ...
    , stripping HTML..."),this.data=this.data.replace(/<(?:.|\s)*?>/g,""));var n=/^\s*([\[\{].*[\}\]])\s*$/,r=/^[\s\u200B\uFEFF]*([\w$\[\]\.]+)[\s\u200B\uFEFF]*\([\s\u200B\uFEFF]*([\[{][\s\S]*[\]}])[\s\u200B\uFEFF]*\);?[\s\u200B\uFEFF]*$/,i=/([\[\{][\s\S]*[\]\}])\)/,s=n.test(this.data),o=r.test(this.data);this.debug&&console.log("JSONView: is_json="+s+" is_jsonp="+o);if(s||o){this.debug&&console.log("JSONView: sexytime!");function u(){}u.prototype={htmlEncode:function(e){return e!=null?e.toString().replace(/&/g,"&").replace(/"/g,""").replace(//g,">"):""},decorateWithSpan:function(e,t){return''+this.htmlEncode(e)+""},valueToHTML:function(e){var t=typeof e,n="";return e===null?n+=this.decorateWithSpan("null","null"):e&&e.constructor===Array?n+=this.arrayToHTML(e):t==="object"?n+=this.objectToHTML(e):t==="number"?n+=this.decorateWithSpan(e,"num"):t==="string"?/^(http|https):\/\/[^\s]+$/.test(e)?n+=''+this.htmlEncode(e)+"":n+=this.decorateWithSpan('"'+e+'"',"string"):t==="boolean"&&(n+=this.decorateWithSpan(e,"bool")),n},arrayToHTML:function(e){var t='[
      ',n=!1;for(var r in e)n=!0,t+="
    • ",t+=this.valueToHTML(e[r]),t+="
    • ";return t+="
    ]",n||(t="[ ]"),t},objectToHTML:function(e){var t='{
      ',n=!1;for(var r in e)n=!0,t+="
    • ",t+=''+this.htmlEncode(r)+": ",t+=this.valueToHTML(e[r]),t+="
    • ";return t+="
    }",n||(t="{ }"),t},jsonToHTML:function(e,t,n){var r="";return t?(r+='
    '+t+" (
    ",r+='
    '):r+='
    ',r+=this.valueToHTML(e),r+="
    ",t&&(r+='
    )
    '),this.toHTML(r,n)},errorPage:function(e,t,n){var r='
    Error parsing JSON: '+e.message+"
    ";return r+="

    "+e.stack+":

    ",r+='
    '+this.htmlEncode(t)+"
    ",this.toHTML(r,n+" - Error")},toHTML:function(e){return e}},this.jsonFormatter=new u;var a="",f="",l="",c=r.exec(this.data);c&&c.length===3?(this.debug&&console.log("THIS IS JSONp"),l=c[1],f=c[2]):(this.debug&&console.log("Vanilla JSON"),f=this.data),this.debug&&console.log(f);try{var h=JSON.parse(f);if(!h)throw"There was no object!";a=this.jsonFormatter.jsonToHTML(h,l)}catch(p){this.debug&&console.log(p),a=this.jsonFormatter.errorPage(p,this.data)}var d="";this.targetType!==undefined&&(this.idType=this.targetType,this.id=this.target);var v;this.idType==="class"?(v=document.getElementsByClassName(this.id),v&&(v.className+=v.className?" jsonViewOutput":"jsonViewOutput",v.innerHTML=d+a)):this.idType==="id"&&(v=document.getElementById(this.id),v&&(v.className+=v.className?" jsonViewOutput":"jsonViewOutput",v.innerHTML=d+a),v.innerHTML=d+a);var m=document.getElementsByClassName("collapsible");for(var g=0;g' + entity + '' + html; - } - var icons = { - 'icon-move' : '', - 'icon-music' : '', - 'icon-network' : '', - 'icon-off' : '', - 'icon-ok' : '', - 'icon-ok-circle' : '', - 'icon-ok-sign' : '', - 'icon-paper-clip' : '', - 'icon-paper-clip-alt' : '', - 'icon-path' : '', - 'icon-plus-sign' : '', - 'icon-print' : '', - 'icon-qrcode' : '', - 'icon-question' : '', - 'icon-question-sign' : '', - 'icon-quotes' : '', - 'icon-quotes-alt' : '', - 'icon-random' : '', - 'icon-record' : '', - 'icon-reddit' : '', - 'icon-refresh' : '', - 'icon-screenshot' : '', - 'icon-search' : '', - 'icon-search-alt' : '', - 'icon-share' : '', - 'icon-share-alt' : '', - 'icon-shopping-cart' : '', - 'icon-shopping-cart-sign' : '', - 'icon-signal' : '', - 'icon-skype' : '', - 'icon-slideshare' : '', - 'icon-smiley' : '', - 'icon-th-large' : '', - 'icon-th-list' : '', - 'icon-thumbs-down' : '', - 'icon-thumbs-up' : '', - 'icon-time' : '', - 'icon-time-alt' : '', - 'icon-tint' : '', - 'icon-torso' : '', - 'icon-trash' : '', - 'icon-trash-alt' : '', - 'icon-tumblr' : '', - 'icon-w3c' : '', - 'icon-warning-sign' : '', - 'icon-website' : '', - 'icon-website-alt' : '', - 'icon-wheelchair' : '', - 'icon-wordpress' : '', - 'icon-wrench' : '', - 'icon-wrench-alt' : '', - 'icon-youtube' : '', - 'icon-zoom-in' : '', - 'icon-zoom-out' : '', - 'icon-pause-alt' : '', - 'icon-pencil' : '', - 'icon-pencil-alt' : '', - 'icon-person' : '', - 'icon-phone' : '', - 'icon-phone-alt' : '', - 'icon-photo' : '', - 'icon-photo-alt' : '', - 'icon-picasa' : '', - 'icon-picture' : '', - 'icon-pinterest' : '', - 'icon-plane' : '', - 'icon-play-alt' : '', - 'icon-play-circle' : '', - 'icon-plus' : '', - 'icon-remove' : '', - 'icon-remove-circle' : '', - 'icon-remove-sign' : '', - 'icon-repeat' : '', - 'icon-repeat-alt' : '', - 'icon-resize-full' : '', - 'icon-resize-horizontal' : '', - 'icon-resize-small' : '', - 'icon-resize-vertical' : '', - 'icon-retweet' : '', - 'icon-reverse-alt' : '', - 'icon-road' : '', - 'icon-rss' : '', - 'icon-screen' : '', - 'icon-screen-alt' : '', - 'icon-smiley-alt' : '', - 'icon-speaker' : '', - 'icon-stackoverflow' : '', - 'icon-star' : '', - 'icon-star-alt' : '', - 'icon-star-empty' : '', - 'icon-stop-alt' : '', - 'icon-stumbleupon' : '', - 'icon-tag' : '', - 'icon-tags' : '', - 'icon-tasks' : '', - 'icon-text-height' : '', - 'icon-text-width' : '', - 'icon-th' : '', - 'icon-twitter' : '', - 'icon-universal-access' : '', - 'icon-unlock' : '', - 'icon-unlock-alt' : '', - 'icon-upload' : '', - 'icon-user' : '', - 'icon-video' : '', - 'icon-video-alt' : '', - 'icon-video-chat' : '', - 'icon-view-mode' : '', - 'icon-vimeo' : '', - 'icon-vkontakte' : '', - 'icon-volume-down' : '', - 'icon-volume-off' : '', - 'icon-volume-up' : '', - 'icon-backward' : '', - 'icon-fast-backward' : '', - 'icon-fast-forward' : '', - 'icon-forward' : '', - 'icon-play' : '', - 'icon-step-backward' : '', - 'icon-step-forward' : '', - 'icon-briefcase' : '', - 'icon-bullhorn' : '', - 'icon-calendar' : '', - 'icon-calendar-sign' : '', - 'icon-address-book' : '', - 'icon-address-book-alt' : '', - 'icon-adjust' : '', - 'icon-adult' : '', - 'icon-align-center' : '', - 'icon-align-justify' : '', - 'icon-align-left' : '', - 'icon-align-right' : '', - 'icon-arrow-down' : '', - 'icon-arrow-left' : '', - 'icon-arrow-right' : '', - 'icon-arrow-up' : '', - 'icon-asl' : '', - 'icon-asterisk' : '', - 'icon-ban-circle' : '', - 'icon-barcode' : '', - 'icon-behance' : '', - 'icon-bell' : '', - 'icon-blind' : '', - 'icon-blogger' : '', - 'icon-bold' : '', - 'icon-book' : '', - 'icon-bookmark' : '', - 'icon-bookmark-empty' : '', - 'icon-braille' : '', - 'icon-camera' : '', - 'icon-cc' : '', - 'icon-certificate' : '', - 'icon-check' : '', - 'icon-check-empty' : '', - 'icon-chevron-down' : '', - 'icon-chevron-left' : '', - 'icon-chevron-right' : '', - 'icon-chevron-up' : '', - 'icon-child' : '', - 'icon-circle-arrow-down' : '', - 'icon-circle-arrow-left' : '', - 'icon-circle-arrow-right' : '', - 'icon-circle-arrow-up' : '', - 'icon-cloud' : '', - 'icon-cloud-alt' : '', - 'icon-cog' : '', - 'icon-cog-alt' : '', - 'icon-cogs' : '', - 'icon-comment' : '', - 'icon-comment-alt' : '', - 'icon-compass' : '', - 'icon-compass-alt' : '', - 'icon-credit-card' : '', - 'icon-css' : '', - 'icon-dashboard' : '', - 'icon-delicious' : '', - 'icon-deviantart' : '', - 'icon-digg' : '', - 'icon-download' : '', - 'icon-download-alt' : '', - 'icon-dribble' : '', - 'icon-edit' : '', - 'icon-eject' : '', - 'icon-envelope' : '', - 'icon-envelope-alt' : '', - 'icon-error' : '', - 'icon-error-alt' : '', - 'icon-exclamation-sign' : '', - 'icon-eye-close' : '', - 'icon-eye-open' : '', - 'icon-facebook' : '', - 'icon-facetime-video' : '', - 'icon-female' : '', - 'icon-file' : '', - 'icon-file-alt' : '', - 'icon-file-edit' : '', - 'icon-file-edit-alt' : '', - 'icon-file-new' : '', - 'icon-file-new-alt' : '', - 'icon-film' : '', - 'icon-filter' : '', - 'icon-fire' : '', - 'icon-flag' : '', - 'icon-flag-alt' : '', - 'icon-flickr' : '', - 'icon-folder' : '', - 'icon-folder-close' : '', - 'icon-folder-open' : '', - 'icon-folder-sign' : '', - 'icon-font' : '', - 'icon-fontsize' : '', - 'icon-forward-alt' : '', - 'icon-foursquare' : '', - 'icon-friendfeed' : '', - 'icon-friendfeed-rect' : '', - 'icon-fullscreen' : '', - 'icon-gift' : '', - 'icon-github' : '', - 'icon-github-text' : '', - 'icon-glass' : '', - 'icon-glasses' : '', - 'icon-globe' : '', - 'icon-globe-alt' : '', - 'icon-googleplus' : '', - 'icon-graph' : '', - 'icon-graph-alt' : '', - 'icon-group' : '', - 'icon-group-alt' : '', - 'icon-guidedog' : '', - 'icon-hand-down' : '', - 'icon-hand-left' : '', - 'icon-hand-right' : '', - 'icon-hand-up' : '', - 'icon-hdd' : '', - 'icon-headphones' : '', - 'icon-hearing-impaired' : '', - 'icon-heart' : '', - 'icon-heart-alt' : '', - 'icon-heart-empty' : '', - 'icon-home' : '', - 'icon-home-alt' : '', - 'icon-idea' : '', - 'icon-idea-alt' : '', - 'icon-inbox' : '', - 'icon-inbox-alt' : '', - 'icon-inbox-box' : '', - 'icon-indent-left' : '', - 'icon-indent-right' : '', - 'icon-info-sign' : '', - 'icon-instagram' : '', - 'icon-iphone-home' : '', - 'icon-italic' : '', - 'icon-key' : '', - 'icon-laptop' : '', - 'icon-laptop-alt' : '', - 'icon-leaf' : '', - 'icon-linkedin' : '', - 'icon-list' : '', - 'icon-list-alt' : '', - 'icon-lock' : '', - 'icon-lock-alt' : '', - 'icon-magnet' : '', - 'icon-male' : '', - 'icon-map-marker' : '', - 'icon-map-marker-alt' : '', - 'icon-mic' : '', - 'icon-mic-alt' : '', - 'icon-minus' : '', - 'icon-minus-sign' : '', - 'icon-pause' : '', - 'icon-fork' : '', - 'icon-broom' : '', - 'icon-return-key' : '', - 'icon-lastfm' : '', - 'icon-livejournal' : '', - 'icon-myspace' : '', - 'icon-soundcloud' : '', - 'icon-viadeo' : '', - 'icon-spotify' : '', - 'icon-caret-left' : '', - 'icon-caret-up' : '', - 'icon-caret-right' : '', - 'icon-caret-down' : '', - 'icon-stop' : '' - }, - els = document.getElementsByTagName('*'), - i, attr, html, c, el; - for (i = 0; ; i += 1) { - el = els[i]; - if(!el) { - break; - } - attr = el.getAttribute('data-icon'); - if (attr) { - addIcon(el, attr); - } - c = el.className; - c = c.match(/icon-[^\s'"]+/); - if (c && icons[c[0]]) { - addIcon(el, icons[c[0]]); - } - } -}; \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/qtip/jquery.qtip.js b/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/qtip/jquery.qtip.js deleted file mode 100755 index a2f47885..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/qtip/jquery.qtip.js +++ /dev/null @@ -1,3451 +0,0 @@ -/* - * qTip2 - Pretty powerful tooltips - v2.2.1 - * http://qtip2.com - * - * Copyright (c) 2014 - * Released under the MIT licenses - * http://jquery.org/license - * - * Date: Sat Sep 6 2014 11:12 GMT+0100+0100 - * Plugins: tips modal viewport svg imagemap ie6 - * Styles: core basic css3 - */ -/*global window: false, jQuery: false, console: false, define: false */ - -/* Cache window, document, undefined */ -(function( window, document, undefined ) { - - // Uses AMD or browser globals to create a jQuery plugin. - (function( factory ) { - "use strict"; - if(typeof define === 'function' && define.amd) { - define(['jquery'], factory); - } - else if(jQuery && !jQuery.fn.qtip) { - factory(jQuery); - } - } - (function($) { - "use strict"; // Enable ECMAScript "strict" operation for this function. See more: http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/ - ;// Munge the primitives - Paul Irish tip - var TRUE = true, - FALSE = false, - NULL = null, - - // Common variables - X = 'x', Y = 'y', - WIDTH = 'width', - HEIGHT = 'height', - - // Positioning sides - TOP = 'top', - LEFT = 'left', - BOTTOM = 'bottom', - RIGHT = 'right', - CENTER = 'center', - - // Position adjustment types - FLIP = 'flip', - FLIPINVERT = 'flipinvert', - SHIFT = 'shift', - - // Shortcut vars - QTIP, PROTOTYPE, CORNER, CHECKS, - PLUGINS = {}, - NAMESPACE = 'qtip', - ATTR_HAS = 'data-hasqtip', - ATTR_ID = 'data-qtip-id', - WIDGET = ['ui-widget', 'ui-tooltip'], - SELECTOR = '.'+NAMESPACE, - INACTIVE_EVENTS = 'click dblclick mousedown mouseup mousemove mouseleave mouseenter'.split(' '), - - CLASS_FIXED = NAMESPACE+'-fixed', - CLASS_DEFAULT = NAMESPACE + '-default', - CLASS_FOCUS = NAMESPACE + '-focus', - CLASS_HOVER = NAMESPACE + '-hover', - CLASS_DISABLED = NAMESPACE+'-disabled', - - replaceSuffix = '_replacedByqTip', - oldtitle = 'oldtitle', - trackingBound, - - // Browser detection - BROWSER = { - /* - * IE version detection - * - * Adapted from: http://ajaxian.com/archives/attack-of-the-ie-conditional-comment - * Credit to James Padolsey for the original implemntation! - */ - ie: (function(){ - for ( - var v = 4, i = document.createElement("div"); - (i.innerHTML = "") && i.getElementsByTagName("i")[0]; - v+=1 - ) {} - return v > 4 ? v : NaN; - }()), - - /* - * iOS version detection - */ - iOS: parseFloat( - ('' + (/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent) || [0,''])[1]) - .replace('undefined', '3_2').replace('_', '.').replace('_', '') - ) || FALSE - }; - ;function QTip(target, options, id, attr) { - // Elements and ID - this.id = id; - this.target = target; - this.tooltip = NULL; - this.elements = { target: target }; - - // Internal constructs - this._id = NAMESPACE + '-' + id; - this.timers = { img: {} }; - this.options = options; - this.plugins = {}; - - // Cache object - this.cache = { - event: {}, - target: $(), - disabled: FALSE, - attr: attr, - onTooltip: FALSE, - lastClass: '' - }; - - // Set the initial flags - this.rendered = this.destroyed = this.disabled = this.waiting = - this.hiddenDuringWait = this.positioning = this.triggering = FALSE; - } - PROTOTYPE = QTip.prototype; - - PROTOTYPE._when = function(deferreds) { - return $.when.apply($, deferreds); - }; - - PROTOTYPE.render = function(show) { - if(this.rendered || this.destroyed) { return this; } // If tooltip has already been rendered, exit - - var self = this, - options = this.options, - cache = this.cache, - elements = this.elements, - text = options.content.text, - title = options.content.title, - button = options.content.button, - posOptions = options.position, - namespace = '.'+this._id+' ', - deferreds = [], - tooltip; - - // Add ARIA attributes to target - $.attr(this.target[0], 'aria-describedby', this._id); - - // Create public position object that tracks current position corners - cache.posClass = this._createPosClass( - (this.position = { my: posOptions.my, at: posOptions.at }).my - ); - - // Create tooltip element - this.tooltip = elements.tooltip = tooltip = $('
    ', { - 'id': this._id, - 'class': [ NAMESPACE, CLASS_DEFAULT, options.style.classes, cache.posClass ].join(' '), - 'width': options.style.width || '', - 'height': options.style.height || '', - 'tracking': posOptions.target === 'mouse' && posOptions.adjust.mouse, - - /* ARIA specific attributes */ - 'role': 'alert', - 'aria-live': 'polite', - 'aria-atomic': FALSE, - 'aria-describedby': this._id + '-content', - 'aria-hidden': TRUE - }) - .toggleClass(CLASS_DISABLED, this.disabled) - .attr(ATTR_ID, this.id) - .data(NAMESPACE, this) - .appendTo(posOptions.container) - .append( - // Create content element - elements.content = $('
    ', { - 'class': NAMESPACE + '-content', - 'id': this._id + '-content', - 'aria-atomic': TRUE - }) - ); - - // Set rendered flag and prevent redundant reposition calls for now - this.rendered = -1; - this.positioning = TRUE; - - // Create title... - if(title) { - this._createTitle(); - - // Update title only if its not a callback (called in toggle if so) - if(!$.isFunction(title)) { - deferreds.push( this._updateTitle(title, FALSE) ); - } - } - - // Create button - if(button) { this._createButton(); } - - // Set proper rendered flag and update content if not a callback function (called in toggle) - if(!$.isFunction(text)) { - deferreds.push( this._updateContent(text, FALSE) ); - } - this.rendered = TRUE; - - // Setup widget classes - this._setWidget(); - - // Initialize 'render' plugins - $.each(PLUGINS, function(name) { - var instance; - if(this.initialize === 'render' && (instance = this(self))) { - self.plugins[name] = instance; - } - }); - - // Unassign initial events and assign proper events - this._unassignEvents(); - this._assignEvents(); - - // When deferreds have completed - this._when(deferreds).then(function() { - // tooltiprender event - self._trigger('render'); - - // Reset flags - self.positioning = FALSE; - - // Show tooltip if not hidden during wait period - if(!self.hiddenDuringWait && (options.show.ready || show)) { - self.toggle(TRUE, cache.event, FALSE); - } - self.hiddenDuringWait = FALSE; - }); - - // Expose API - QTIP.api[this.id] = this; - - return this; - }; - - PROTOTYPE.destroy = function(immediate) { - // Set flag the signify destroy is taking place to plugins - // and ensure it only gets destroyed once! - if(this.destroyed) { return this.target; } - - function process() { - if(this.destroyed) { return; } - this.destroyed = TRUE; - - var target = this.target, - title = target.attr(oldtitle), - timer; - - // Destroy tooltip if rendered - if(this.rendered) { - this.tooltip.stop(1,0).find('*').remove().end().remove(); - } - - // Destroy all plugins - $.each(this.plugins, function(name) { - this.destroy && this.destroy(); - }); - - // Clear timers - for(timer in this.timers) { - clearTimeout(this.timers[timer]); - } - - // Remove api object and ARIA attributes - target.removeData(NAMESPACE) - .removeAttr(ATTR_ID) - .removeAttr(ATTR_HAS) - .removeAttr('aria-describedby'); - - // Reset old title attribute if removed - if(this.options.suppress && title) { - target.attr('title', title).removeAttr(oldtitle); - } - - // Remove qTip events associated with this API - this._unassignEvents(); - - // Remove ID from used id objects, and delete object references - // for better garbage collection and leak protection - this.options = this.elements = this.cache = this.timers = - this.plugins = this.mouse = NULL; - - // Delete epoxsed API object - delete QTIP.api[this.id]; - } - - // If an immediate destory is needed - if((immediate !== TRUE || this.triggering === 'hide') && this.rendered) { - this.tooltip.one('tooltiphidden', $.proxy(process, this)); - !this.triggering && this.hide(); - } - - // If we're not in the process of hiding... process - else { process.call(this); } - - return this.target; - }; - ;function invalidOpt(a) { - return a === NULL || $.type(a) !== 'object'; - } - - function invalidContent(c) { - return !( $.isFunction(c) || (c && c.attr) || c.length || ($.type(c) === 'object' && (c.jquery || c.then) )); - } - - // Option object sanitizer - function sanitizeOptions(opts) { - var content, text, ajax, once; - - if(invalidOpt(opts)) { return FALSE; } - - if(invalidOpt(opts.metadata)) { - opts.metadata = { type: opts.metadata }; - } - - if('content' in opts) { - content = opts.content; - - if(invalidOpt(content) || content.jquery || content.done) { - content = opts.content = { - text: (text = invalidContent(content) ? FALSE : content) - }; - } - else { text = content.text; } - - // DEPRECATED - Old content.ajax plugin functionality - // Converts it into the proper Deferred syntax - if('ajax' in content) { - ajax = content.ajax; - once = ajax && ajax.once !== FALSE; - delete content.ajax; - - content.text = function(event, api) { - var loading = text || $(this).attr(api.options.content.attr) || 'Loading...', - - deferred = $.ajax( - $.extend({}, ajax, { context: api }) - ) - .then(ajax.success, NULL, ajax.error) - .then(function(content) { - if(content && once) { api.set('content.text', content); } - return content; - }, - function(xhr, status, error) { - if(api.destroyed || xhr.status === 0) { return; } - api.set('content.text', status + ': ' + error); - }); - - return !once ? (api.set('content.text', loading), deferred) : loading; - }; - } - - if('title' in content) { - if($.isPlainObject(content.title)) { - content.button = content.title.button; - content.title = content.title.text; - } - - if(invalidContent(content.title || FALSE)) { - content.title = FALSE; - } - } - } - - if('position' in opts && invalidOpt(opts.position)) { - opts.position = { my: opts.position, at: opts.position }; - } - - if('show' in opts && invalidOpt(opts.show)) { - opts.show = opts.show.jquery ? { target: opts.show } : - opts.show === TRUE ? { ready: TRUE } : { event: opts.show }; - } - - if('hide' in opts && invalidOpt(opts.hide)) { - opts.hide = opts.hide.jquery ? { target: opts.hide } : { event: opts.hide }; - } - - if('style' in opts && invalidOpt(opts.style)) { - opts.style = { classes: opts.style }; - } - - // Sanitize plugin options - $.each(PLUGINS, function() { - this.sanitize && this.sanitize(opts); - }); - - return opts; - } - - // Setup builtin .set() option checks - CHECKS = PROTOTYPE.checks = { - builtin: { - // Core checks - '^id$': function(obj, o, v, prev) { - var id = v === TRUE ? QTIP.nextid : v, - new_id = NAMESPACE + '-' + id; - - if(id !== FALSE && id.length > 0 && !$('#'+new_id).length) { - this._id = new_id; - - if(this.rendered) { - this.tooltip[0].id = this._id; - this.elements.content[0].id = this._id + '-content'; - this.elements.title[0].id = this._id + '-title'; - } - } - else { obj[o] = prev; } - }, - '^prerender': function(obj, o, v) { - v && !this.rendered && this.render(this.options.show.ready); - }, - - // Content checks - '^content.text$': function(obj, o, v) { - this._updateContent(v); - }, - '^content.attr$': function(obj, o, v, prev) { - if(this.options.content.text === this.target.attr(prev)) { - this._updateContent( this.target.attr(v) ); - } - }, - '^content.title$': function(obj, o, v) { - // Remove title if content is null - if(!v) { return this._removeTitle(); } - - // If title isn't already created, create it now and update - v && !this.elements.title && this._createTitle(); - this._updateTitle(v); - }, - '^content.button$': function(obj, o, v) { - this._updateButton(v); - }, - '^content.title.(text|button)$': function(obj, o, v) { - this.set('content.'+o, v); // Backwards title.text/button compat - }, - - // Position checks - '^position.(my|at)$': function(obj, o, v){ - 'string' === typeof v && (this.position[o] = obj[o] = new CORNER(v, o === 'at')); - }, - '^position.container$': function(obj, o, v){ - this.rendered && this.tooltip.appendTo(v); - }, - - // Show checks - '^show.ready$': function(obj, o, v) { - v && (!this.rendered && this.render(TRUE) || this.toggle(TRUE)); - }, - - // Style checks - '^style.classes$': function(obj, o, v, p) { - this.rendered && this.tooltip.removeClass(p).addClass(v); - }, - '^style.(width|height)': function(obj, o, v) { - this.rendered && this.tooltip.css(o, v); - }, - '^style.widget|content.title': function() { - this.rendered && this._setWidget(); - }, - '^style.def': function(obj, o, v) { - this.rendered && this.tooltip.toggleClass(CLASS_DEFAULT, !!v); - }, - - // Events check - '^events.(render|show|move|hide|focus|blur)$': function(obj, o, v) { - this.rendered && this.tooltip[($.isFunction(v) ? '' : 'un') + 'bind']('tooltip'+o, v); - }, - - // Properties which require event reassignment - '^(show|hide|position).(event|target|fixed|inactive|leave|distance|viewport|adjust)': function() { - if(!this.rendered) { return; } - - // Set tracking flag - var posOptions = this.options.position; - this.tooltip.attr('tracking', posOptions.target === 'mouse' && posOptions.adjust.mouse); - - // Reassign events - this._unassignEvents(); - this._assignEvents(); - } - } - }; - - // Dot notation converter - function convertNotation(options, notation) { - var i = 0, obj, option = options, - - // Split notation into array - levels = notation.split('.'); - - // Loop through - while( option = option[ levels[i++] ] ) { - if(i < levels.length) { obj = option; } - } - - return [obj || options, levels.pop()]; - } - - PROTOTYPE.get = function(notation) { - if(this.destroyed) { return this; } - - var o = convertNotation(this.options, notation.toLowerCase()), - result = o[0][ o[1] ]; - - return result.precedance ? result.string() : result; - }; - - function setCallback(notation, args) { - var category, rule, match; - - for(category in this.checks) { - for(rule in this.checks[category]) { - if(match = (new RegExp(rule, 'i')).exec(notation)) { - args.push(match); - - if(category === 'builtin' || this.plugins[category]) { - this.checks[category][rule].apply( - this.plugins[category] || this, args - ); - } - } - } - } - } - - var rmove = /^position\.(my|at|adjust|target|container|viewport)|style|content|show\.ready/i, - rrender = /^prerender|show\.ready/i; - - PROTOTYPE.set = function(option, value) { - if(this.destroyed) { return this; } - - var rendered = this.rendered, - reposition = FALSE, - options = this.options, - checks = this.checks, - name; - - // Convert singular option/value pair into object form - if('string' === typeof option) { - name = option; option = {}; option[name] = value; - } - else { option = $.extend({}, option); } - - // Set all of the defined options to their new values - $.each(option, function(notation, value) { - if(rendered && rrender.test(notation)) { - delete option[notation]; return; - } - - // Set new obj value - var obj = convertNotation(options, notation.toLowerCase()), previous; - previous = obj[0][ obj[1] ]; - obj[0][ obj[1] ] = value && value.nodeType ? $(value) : value; - - // Also check if we need to reposition - reposition = rmove.test(notation) || reposition; - - // Set the new params for the callback - option[notation] = [obj[0], obj[1], value, previous]; - }); - - // Re-sanitize options - sanitizeOptions(options); - - /* - * Execute any valid callbacks for the set options - * Also set positioning flag so we don't get loads of redundant repositioning calls. - */ - this.positioning = TRUE; - $.each(option, $.proxy(setCallback, this)); - this.positioning = FALSE; - - // Update position if needed - if(this.rendered && this.tooltip[0].offsetWidth > 0 && reposition) { - this.reposition( options.position.target === 'mouse' ? NULL : this.cache.event ); - } - - return this; - }; - ;PROTOTYPE._update = function(content, element, reposition) { - var self = this, - cache = this.cache; - - // Make sure tooltip is rendered and content is defined. If not return - if(!this.rendered || !content) { return FALSE; } - - // Use function to parse content - if($.isFunction(content)) { - content = content.call(this.elements.target, cache.event, this) || ''; - } - - // Handle deferred content - if($.isFunction(content.then)) { - cache.waiting = TRUE; - return content.then(function(c) { - cache.waiting = FALSE; - return self._update(c, element); - }, NULL, function(e) { - return self._update(e, element); - }); - } - - // If content is null... return false - if(content === FALSE || (!content && content !== '')) { return FALSE; } - - // Append new content if its a DOM array and show it if hidden - if(content.jquery && content.length > 0) { - element.empty().append( - content.css({ display: 'block', visibility: 'visible' }) - ); - } - - // Content is a regular string, insert the new content - else { element.html(content); } - - // Wait for content to be loaded, and reposition - return this._waitForContent(element).then(function(images) { - if(self.rendered && self.tooltip[0].offsetWidth > 0) { - self.reposition(cache.event, !images.length); - } - }); - }; - - PROTOTYPE._waitForContent = function(element) { - var cache = this.cache; - - // Set flag - cache.waiting = TRUE; - - // If imagesLoaded is included, ensure images have loaded and return promise - return ( $.fn.imagesLoaded ? element.imagesLoaded() : $.Deferred().resolve([]) ) - .done(function() { cache.waiting = FALSE; }) - .promise(); - }; - - PROTOTYPE._updateContent = function(content, reposition) { - this._update(content, this.elements.content, reposition); - }; - - PROTOTYPE._updateTitle = function(content, reposition) { - if(this._update(content, this.elements.title, reposition) === FALSE) { - this._removeTitle(FALSE); - } - }; - - PROTOTYPE._createTitle = function() - { - var elements = this.elements, - id = this._id+'-title'; - - // Destroy previous title element, if present - if(elements.titlebar) { this._removeTitle(); } - - // Create title bar and title elements - elements.titlebar = $('
    ', { - 'class': NAMESPACE + '-titlebar ' + (this.options.style.widget ? createWidgetClass('header') : '') - }) - .append( - elements.title = $('
    ', { - 'id': id, - 'class': NAMESPACE + '-title', - 'aria-atomic': TRUE - }) - ) - .insertBefore(elements.content) - - // Button-specific events - .delegate('.qtip-close', 'mousedown keydown mouseup keyup mouseout', function(event) { - $(this).toggleClass('ui-state-active ui-state-focus', event.type.substr(-4) === 'down'); - }) - .delegate('.qtip-close', 'mouseover mouseout', function(event){ - $(this).toggleClass('ui-state-hover', event.type === 'mouseover'); - }); - - // Create button if enabled - if(this.options.content.button) { this._createButton(); } - }; - - PROTOTYPE._removeTitle = function(reposition) - { - var elements = this.elements; - - if(elements.title) { - elements.titlebar.remove(); - elements.titlebar = elements.title = elements.button = NULL; - - // Reposition if enabled - if(reposition !== FALSE) { this.reposition(); } - } - }; - ;PROTOTYPE._createPosClass = function(my) { - return NAMESPACE + '-pos-' + (my || this.options.position.my).abbrev(); - }; - - PROTOTYPE.reposition = function(event, effect) { - if(!this.rendered || this.positioning || this.destroyed) { return this; } - - // Set positioning flag - this.positioning = TRUE; - - var cache = this.cache, - tooltip = this.tooltip, - posOptions = this.options.position, - target = posOptions.target, - my = posOptions.my, - at = posOptions.at, - viewport = posOptions.viewport, - container = posOptions.container, - adjust = posOptions.adjust, - method = adjust.method.split(' '), - tooltipWidth = tooltip.outerWidth(FALSE), - tooltipHeight = tooltip.outerHeight(FALSE), - targetWidth = 0, - targetHeight = 0, - type = tooltip.css('position'), - position = { left: 0, top: 0 }, - visible = tooltip[0].offsetWidth > 0, - isScroll = event && event.type === 'scroll', - win = $(window), - doc = container[0].ownerDocument, - mouse = this.mouse, - pluginCalculations, offset, adjusted, newClass; - - // Check if absolute position was passed - if($.isArray(target) && target.length === 2) { - // Force left top and set position - at = { x: LEFT, y: TOP }; - position = { left: target[0], top: target[1] }; - } - - // Check if mouse was the target - else if(target === 'mouse') { - // Force left top to allow flipping - at = { x: LEFT, y: TOP }; - - // Use the mouse origin that caused the show event, if distance hiding is enabled - if((!adjust.mouse || this.options.hide.distance) && cache.origin && cache.origin.pageX) { - event = cache.origin; - } - - // Use cached event for resize/scroll events - else if(!event || (event && (event.type === 'resize' || event.type === 'scroll'))) { - event = cache.event; - } - - // Otherwise, use the cached mouse coordinates if available - else if(mouse && mouse.pageX) { - event = mouse; - } - - // Calculate body and container offset and take them into account below - if(type !== 'static') { position = container.offset(); } - if(doc.body.offsetWidth !== (window.innerWidth || doc.documentElement.clientWidth)) { - offset = $(document.body).offset(); - } - - // Use event coordinates for position - position = { - left: event.pageX - position.left + (offset && offset.left || 0), - top: event.pageY - position.top + (offset && offset.top || 0) - }; - - // Scroll events are a pain, some browsers - if(adjust.mouse && isScroll && mouse) { - position.left -= (mouse.scrollX || 0) - win.scrollLeft(); - position.top -= (mouse.scrollY || 0) - win.scrollTop(); - } - } - - // Target wasn't mouse or absolute... - else { - // Check if event targetting is being used - if(target === 'event') { - if(event && event.target && event.type !== 'scroll' && event.type !== 'resize') { - cache.target = $(event.target); - } - else if(!event.target) { - cache.target = this.elements.target; - } - } - else if(target !== 'event'){ - cache.target = $(target.jquery ? target : this.elements.target); - } - target = cache.target; - - // Parse the target into a jQuery object and make sure there's an element present - target = $(target).eq(0); - if(target.length === 0) { return this; } - - // Check if window or document is the target - else if(target[0] === document || target[0] === window) { - targetWidth = BROWSER.iOS ? window.innerWidth : target.width(); - targetHeight = BROWSER.iOS ? window.innerHeight : target.height(); - - if(target[0] === window) { - position = { - top: (viewport || target).scrollTop(), - left: (viewport || target).scrollLeft() - }; - } - } - - // Check if the target is an element - else if(PLUGINS.imagemap && target.is('area')) { - pluginCalculations = PLUGINS.imagemap(this, target, at, PLUGINS.viewport ? method : FALSE); - } - - // Check if the target is an SVG element - else if(PLUGINS.svg && target && target[0].ownerSVGElement) { - pluginCalculations = PLUGINS.svg(this, target, at, PLUGINS.viewport ? method : FALSE); - } - - // Otherwise use regular jQuery methods - else { - targetWidth = target.outerWidth(FALSE); - targetHeight = target.outerHeight(FALSE); - position = target.offset(); - } - - // Parse returned plugin values into proper variables - if(pluginCalculations) { - targetWidth = pluginCalculations.width; - targetHeight = pluginCalculations.height; - offset = pluginCalculations.offset; - position = pluginCalculations.position; - } - - // Adjust position to take into account offset parents - position = this.reposition.offset(target, position, container); - - // Adjust for position.fixed tooltips (and also iOS scroll bug in v3.2-4.0 & v4.3-4.3.2) - if((BROWSER.iOS > 3.1 && BROWSER.iOS < 4.1) || - (BROWSER.iOS >= 4.3 && BROWSER.iOS < 4.33) || - (!BROWSER.iOS && type === 'fixed') - ){ - position.left -= win.scrollLeft(); - position.top -= win.scrollTop(); - } - - // Adjust position relative to target - if(!pluginCalculations || (pluginCalculations && pluginCalculations.adjustable !== FALSE)) { - position.left += at.x === RIGHT ? targetWidth : at.x === CENTER ? targetWidth / 2 : 0; - position.top += at.y === BOTTOM ? targetHeight : at.y === CENTER ? targetHeight / 2 : 0; - } - } - - // Adjust position relative to tooltip - position.left += adjust.x + (my.x === RIGHT ? -tooltipWidth : my.x === CENTER ? -tooltipWidth / 2 : 0); - position.top += adjust.y + (my.y === BOTTOM ? -tooltipHeight : my.y === CENTER ? -tooltipHeight / 2 : 0); - - // Use viewport adjustment plugin if enabled - if(PLUGINS.viewport) { - adjusted = position.adjusted = PLUGINS.viewport( - this, position, posOptions, targetWidth, targetHeight, tooltipWidth, tooltipHeight - ); - - // Apply offsets supplied by positioning plugin (if used) - if(offset && adjusted.left) { position.left += offset.left; } - if(offset && adjusted.top) { position.top += offset.top; } - - // Apply any new 'my' position - if(adjusted.my) { this.position.my = adjusted.my; } - } - - // Viewport adjustment is disabled, set values to zero - else { position.adjusted = { left: 0, top: 0 }; } - - // Set tooltip position class if it's changed - if(cache.posClass !== (newClass = this._createPosClass(this.position.my))) { - tooltip.removeClass(cache.posClass).addClass( (cache.posClass = newClass) ); - } - - // tooltipmove event - if(!this._trigger('move', [position, viewport.elem || viewport], event)) { return this; } - delete position.adjusted; - - // If effect is disabled, target it mouse, no animation is defined or positioning gives NaN out, set CSS directly - if(effect === FALSE || !visible || isNaN(position.left) || isNaN(position.top) || target === 'mouse' || !$.isFunction(posOptions.effect)) { - tooltip.css(position); - } - - // Use custom function if provided - else if($.isFunction(posOptions.effect)) { - posOptions.effect.call(tooltip, this, $.extend({}, position)); - tooltip.queue(function(next) { - // Reset attributes to avoid cross-browser rendering bugs - $(this).css({ opacity: '', height: '' }); - if(BROWSER.ie) { this.style.removeAttribute('filter'); } - - next(); - }); - } - - // Set positioning flag - this.positioning = FALSE; - - return this; - }; - - // Custom (more correct for qTip!) offset calculator - PROTOTYPE.reposition.offset = function(elem, pos, container) { - if(!container[0]) { return pos; } - - var ownerDocument = $(elem[0].ownerDocument), - quirks = !!BROWSER.ie && document.compatMode !== 'CSS1Compat', - parent = container[0], - scrolled, position, parentOffset, overflow; - - function scroll(e, i) { - pos.left += i * e.scrollLeft(); - pos.top += i * e.scrollTop(); - } - - // Compensate for non-static containers offset - do { - if((position = $.css(parent, 'position')) !== 'static') { - if(position === 'fixed') { - parentOffset = parent.getBoundingClientRect(); - scroll(ownerDocument, -1); - } - else { - parentOffset = $(parent).position(); - parentOffset.left += (parseFloat($.css(parent, 'borderLeftWidth')) || 0); - parentOffset.top += (parseFloat($.css(parent, 'borderTopWidth')) || 0); - } - - pos.left -= parentOffset.left + (parseFloat($.css(parent, 'marginLeft')) || 0); - pos.top -= parentOffset.top + (parseFloat($.css(parent, 'marginTop')) || 0); - - // If this is the first parent element with an overflow of "scroll" or "auto", store it - if(!scrolled && (overflow = $.css(parent, 'overflow')) !== 'hidden' && overflow !== 'visible') { scrolled = $(parent); } - } - } - while((parent = parent.offsetParent)); - - // Compensate for containers scroll if it also has an offsetParent (or in IE quirks mode) - if(scrolled && (scrolled[0] !== ownerDocument[0] || quirks)) { - scroll(scrolled, 1); - } - - return pos; - }; - - // Corner class - var C = (CORNER = PROTOTYPE.reposition.Corner = function(corner, forceY) { - corner = ('' + corner).replace(/([A-Z])/, ' $1').replace(/middle/gi, CENTER).toLowerCase(); - this.x = (corner.match(/left|right/i) || corner.match(/center/) || ['inherit'])[0].toLowerCase(); - this.y = (corner.match(/top|bottom|center/i) || ['inherit'])[0].toLowerCase(); - this.forceY = !!forceY; - - var f = corner.charAt(0); - this.precedance = (f === 't' || f === 'b' ? Y : X); - }).prototype; - - C.invert = function(z, center) { - this[z] = this[z] === LEFT ? RIGHT : this[z] === RIGHT ? LEFT : center || this[z]; - }; - - C.string = function(join) { - var x = this.x, y = this.y; - - var result = x !== y ? - (x === 'center' || y !== 'center' && (this.precedance === Y || this.forceY) ? - [y,x] : [x,y] - ) : - [x]; - - return join !== false ? result.join(' ') : result; - }; - - C.abbrev = function() { - var result = this.string(false); - return result[0].charAt(0) + (result[1] && result[1].charAt(0) || ''); - }; - - C.clone = function() { - return new CORNER( this.string(), this.forceY ); - }; - - ; - PROTOTYPE.toggle = function(state, event) { - var cache = this.cache, - options = this.options, - tooltip = this.tooltip; - - // Try to prevent flickering when tooltip overlaps show element - if(event) { - if((/over|enter/).test(event.type) && cache.event && (/out|leave/).test(cache.event.type) && - options.show.target.add(event.target).length === options.show.target.length && - tooltip.has(event.relatedTarget).length) { - return this; - } - - // Cache event - cache.event = $.event.fix(event); - } - - // If we're currently waiting and we've just hidden... stop it - this.waiting && !state && (this.hiddenDuringWait = TRUE); - - // Render the tooltip if showing and it isn't already - if(!this.rendered) { return state ? this.render(1) : this; } - else if(this.destroyed || this.disabled) { return this; } - - var type = state ? 'show' : 'hide', - opts = this.options[type], - otherOpts = this.options[ !state ? 'show' : 'hide' ], - posOptions = this.options.position, - contentOptions = this.options.content, - width = this.tooltip.css('width'), - visible = this.tooltip.is(':visible'), - animate = state || opts.target.length === 1, - sameTarget = !event || opts.target.length < 2 || cache.target[0] === event.target, - identicalState, allow, showEvent, delay, after; - - // Detect state if valid one isn't provided - if((typeof state).search('boolean|number')) { state = !visible; } - - // Check if the tooltip is in an identical state to the new would-be state - identicalState = !tooltip.is(':animated') && visible === state && sameTarget; - - // Fire tooltip(show/hide) event and check if destroyed - allow = !identicalState ? !!this._trigger(type, [90]) : NULL; - - // Check to make sure the tooltip wasn't destroyed in the callback - if(this.destroyed) { return this; } - - // If the user didn't stop the method prematurely and we're showing the tooltip, focus it - if(allow !== FALSE && state) { this.focus(event); } - - // If the state hasn't changed or the user stopped it, return early - if(!allow || identicalState) { return this; } - - // Set ARIA hidden attribute - $.attr(tooltip[0], 'aria-hidden', !!!state); - - // Execute state specific properties - if(state) { - // Store show origin coordinates - this.mouse && (cache.origin = $.event.fix(this.mouse)); - - // Update tooltip content & title if it's a dynamic function - if($.isFunction(contentOptions.text)) { this._updateContent(contentOptions.text, FALSE); } - if($.isFunction(contentOptions.title)) { this._updateTitle(contentOptions.title, FALSE); } - - // Cache mousemove events for positioning purposes (if not already tracking) - if(!trackingBound && posOptions.target === 'mouse' && posOptions.adjust.mouse) { - $(document).bind('mousemove.'+NAMESPACE, this._storeMouse); - trackingBound = TRUE; - } - - // Update the tooltip position (set width first to prevent viewport/max-width issues) - if(!width) { tooltip.css('width', tooltip.outerWidth(FALSE)); } - this.reposition(event, arguments[2]); - if(!width) { tooltip.css('width', ''); } - - // Hide other tooltips if tooltip is solo - if(!!opts.solo) { - (typeof opts.solo === 'string' ? $(opts.solo) : $(SELECTOR, opts.solo)) - .not(tooltip).not(opts.target).qtip('hide', $.Event('tooltipsolo')); - } - } - else { - // Clear show timer if we're hiding - clearTimeout(this.timers.show); - - // Remove cached origin on hide - delete cache.origin; - - // Remove mouse tracking event if not needed (all tracking qTips are hidden) - if(trackingBound && !$(SELECTOR+'[tracking="true"]:visible', opts.solo).not(tooltip).length) { - $(document).unbind('mousemove.'+NAMESPACE); - trackingBound = FALSE; - } - - // Blur the tooltip - this.blur(event); - } - - // Define post-animation, state specific properties - after = $.proxy(function() { - if(state) { - // Prevent antialias from disappearing in IE by removing filter - if(BROWSER.ie) { tooltip[0].style.removeAttribute('filter'); } - - // Remove overflow setting to prevent tip bugs - tooltip.css('overflow', ''); - - // Autofocus elements if enabled - if('string' === typeof opts.autofocus) { - $(this.options.show.autofocus, tooltip).focus(); - } - - // If set, hide tooltip when inactive for delay period - this.options.show.target.trigger('qtip-'+this.id+'-inactive'); - } - else { - // Reset CSS states - tooltip.css({ - display: '', - visibility: '', - opacity: '', - left: '', - top: '' - }); - } - - // tooltipvisible/tooltiphidden events - this._trigger(state ? 'visible' : 'hidden'); - }, this); - - // If no effect type is supplied, use a simple toggle - if(opts.effect === FALSE || animate === FALSE) { - tooltip[ type ](); - after(); - } - - // Use custom function if provided - else if($.isFunction(opts.effect)) { - tooltip.stop(1, 1); - opts.effect.call(tooltip, this); - tooltip.queue('fx', function(n) { - after(); n(); - }); - } - - // Use basic fade function by default - else { tooltip.fadeTo(90, state ? 1 : 0, after); } - - // If inactive hide method is set, active it - if(state) { opts.target.trigger('qtip-'+this.id+'-inactive'); } - - return this; - }; - - PROTOTYPE.show = function(event) { return this.toggle(TRUE, event); }; - - PROTOTYPE.hide = function(event) { return this.toggle(FALSE, event); }; - ;PROTOTYPE.focus = function(event) { - if(!this.rendered || this.destroyed) { return this; } - - var qtips = $(SELECTOR), - tooltip = this.tooltip, - curIndex = parseInt(tooltip[0].style.zIndex, 10), - newIndex = QTIP.zindex + qtips.length, - focusedElem; - - // Only update the z-index if it has changed and tooltip is not already focused - if(!tooltip.hasClass(CLASS_FOCUS)) { - // tooltipfocus event - if(this._trigger('focus', [newIndex], event)) { - // Only update z-index's if they've changed - if(curIndex !== newIndex) { - // Reduce our z-index's and keep them properly ordered - qtips.each(function() { - if(this.style.zIndex > curIndex) { - this.style.zIndex = this.style.zIndex - 1; - } - }); - - // Fire blur event for focused tooltip - qtips.filter('.' + CLASS_FOCUS).qtip('blur', event); - } - - // Set the new z-index - tooltip.addClass(CLASS_FOCUS)[0].style.zIndex = newIndex; - } - } - - return this; - }; - - PROTOTYPE.blur = function(event) { - if(!this.rendered || this.destroyed) { return this; } - - // Set focused status to FALSE - this.tooltip.removeClass(CLASS_FOCUS); - - // tooltipblur event - this._trigger('blur', [ this.tooltip.css('zIndex') ], event); - - return this; - }; - ;PROTOTYPE.disable = function(state) { - if(this.destroyed) { return this; } - - // If 'toggle' is passed, toggle the current state - if(state === 'toggle') { - state = !(this.rendered ? this.tooltip.hasClass(CLASS_DISABLED) : this.disabled); - } - - // Disable if no state passed - else if('boolean' !== typeof state) { - state = TRUE; - } - - if(this.rendered) { - this.tooltip.toggleClass(CLASS_DISABLED, state) - .attr('aria-disabled', state); - } - - this.disabled = !!state; - - return this; - }; - - PROTOTYPE.enable = function() { return this.disable(FALSE); }; - ;PROTOTYPE._createButton = function() - { - var self = this, - elements = this.elements, - tooltip = elements.tooltip, - button = this.options.content.button, - isString = typeof button === 'string', - close = isString ? button : 'Close tooltip'; - - if(elements.button) { elements.button.remove(); } - - // Use custom button if one was supplied by user, else use default - if(button.jquery) { - elements.button = button; - } - else { - elements.button = $('', { - 'class': 'qtip-close ' + (this.options.style.widget ? '' : NAMESPACE+'-icon'), - 'title': close, - 'aria-label': close - }) - .prepend( - $('', { - 'class': 'ui-icon ui-icon-close', - 'html': '×' - }) - ); - } - - // Create button and setup attributes - elements.button.appendTo(elements.titlebar || tooltip) - .attr('role', 'button') - .click(function(event) { - if(!tooltip.hasClass(CLASS_DISABLED)) { self.hide(event); } - return FALSE; - }); - }; - - PROTOTYPE._updateButton = function(button) - { - // Make sure tooltip is rendered and if not, return - if(!this.rendered) { return FALSE; } - - var elem = this.elements.button; - if(button) { this._createButton(); } - else { elem.remove(); } - }; - ;// Widget class creator - function createWidgetClass(cls) { - return WIDGET.concat('').join(cls ? '-'+cls+' ' : ' '); - } - - // Widget class setter method - PROTOTYPE._setWidget = function() - { - var on = this.options.style.widget, - elements = this.elements, - tooltip = elements.tooltip, - disabled = tooltip.hasClass(CLASS_DISABLED); - - tooltip.removeClass(CLASS_DISABLED); - CLASS_DISABLED = on ? 'ui-state-disabled' : 'qtip-disabled'; - tooltip.toggleClass(CLASS_DISABLED, disabled); - - tooltip.toggleClass('ui-helper-reset '+createWidgetClass(), on).toggleClass(CLASS_DEFAULT, this.options.style.def && !on); - - if(elements.content) { - elements.content.toggleClass( createWidgetClass('content'), on); - } - if(elements.titlebar) { - elements.titlebar.toggleClass( createWidgetClass('header'), on); - } - if(elements.button) { - elements.button.toggleClass(NAMESPACE+'-icon', !on); - } - }; - ;function delay(callback, duration) { - // If tooltip has displayed, start hide timer - if(duration > 0) { - return setTimeout( - $.proxy(callback, this), duration - ); - } - else{ callback.call(this); } - } - - function showMethod(event) { - if(this.tooltip.hasClass(CLASS_DISABLED)) { return; } - - // Clear hide timers - clearTimeout(this.timers.show); - clearTimeout(this.timers.hide); - - // Start show timer - this.timers.show = delay.call(this, - function() { this.toggle(TRUE, event); }, - this.options.show.delay - ); - } - - function hideMethod(event) { - if(this.tooltip.hasClass(CLASS_DISABLED) || this.destroyed) { return; } - - // Check if new target was actually the tooltip element - var relatedTarget = $(event.relatedTarget), - ontoTooltip = relatedTarget.closest(SELECTOR)[0] === this.tooltip[0], - ontoTarget = relatedTarget[0] === this.options.show.target[0]; - - // Clear timers and stop animation queue - clearTimeout(this.timers.show); - clearTimeout(this.timers.hide); - - // Prevent hiding if tooltip is fixed and event target is the tooltip. - // Or if mouse positioning is enabled and cursor momentarily overlaps - if(this !== relatedTarget[0] && - (this.options.position.target === 'mouse' && ontoTooltip) || - (this.options.hide.fixed && ( - (/mouse(out|leave|move)/).test(event.type) && (ontoTooltip || ontoTarget)) - )) - { - try { - event.preventDefault(); - event.stopImmediatePropagation(); - } catch(e) {} - - return; - } - - // If tooltip has displayed, start hide timer - this.timers.hide = delay.call(this, - function() { this.toggle(FALSE, event); }, - this.options.hide.delay, - this - ); - } - - function inactiveMethod(event) { - if(this.tooltip.hasClass(CLASS_DISABLED) || !this.options.hide.inactive) { return; } - - // Clear timer - clearTimeout(this.timers.inactive); - - this.timers.inactive = delay.call(this, - function(){ this.hide(event); }, - this.options.hide.inactive - ); - } - - function repositionMethod(event) { - if(this.rendered && this.tooltip[0].offsetWidth > 0) { this.reposition(event); } - } - - // Store mouse coordinates - PROTOTYPE._storeMouse = function(event) { - (this.mouse = $.event.fix(event)).type = 'mousemove'; - return this; - }; - - // Bind events - PROTOTYPE._bind = function(targets, events, method, suffix, context) { - if(!targets || !method || !events.length) { return; } - var ns = '.' + this._id + (suffix ? '-'+suffix : ''); - $(targets).bind( - (events.split ? events : events.join(ns + ' ')) + ns, - $.proxy(method, context || this) - ); - return this; - }; - PROTOTYPE._unbind = function(targets, suffix) { - targets && $(targets).unbind('.' + this._id + (suffix ? '-'+suffix : '')); - return this; - }; - - // Global delegation helper - function delegate(selector, events, method) { - $(document.body).delegate(selector, - (events.split ? events : events.join('.'+NAMESPACE + ' ')) + '.'+NAMESPACE, - function() { - var api = QTIP.api[ $.attr(this, ATTR_ID) ]; - api && !api.disabled && method.apply(api, arguments); - } - ); - } - // Event trigger - PROTOTYPE._trigger = function(type, args, event) { - var callback = $.Event('tooltip'+type); - callback.originalEvent = (event && $.extend({}, event)) || this.cache.event || NULL; - - this.triggering = type; - this.tooltip.trigger(callback, [this].concat(args || [])); - this.triggering = FALSE; - - return !callback.isDefaultPrevented(); - }; - - PROTOTYPE._bindEvents = function(showEvents, hideEvents, showTargets, hideTargets, showMethod, hideMethod) { - // Get tasrgets that lye within both - var similarTargets = showTargets.filter( hideTargets ).add( hideTargets.filter(showTargets) ), - toggleEvents = []; - - // If hide and show targets are the same... - if(similarTargets.length) { - - // Filter identical show/hide events - $.each(hideEvents, function(i, type) { - var showIndex = $.inArray(type, showEvents); - - // Both events are identical, remove from both hide and show events - // and append to toggleEvents - showIndex > -1 && toggleEvents.push( showEvents.splice( showIndex, 1 )[0] ); - }); - - // Toggle events are special case of identical show/hide events, which happen in sequence - if(toggleEvents.length) { - // Bind toggle events to the similar targets - this._bind(similarTargets, toggleEvents, function(event) { - var state = this.rendered ? this.tooltip[0].offsetWidth > 0 : false; - (state ? hideMethod : showMethod).call(this, event); - }); - - // Remove the similar targets from the regular show/hide bindings - showTargets = showTargets.not(similarTargets); - hideTargets = hideTargets.not(similarTargets); - } - } - - // Apply show/hide/toggle events - this._bind(showTargets, showEvents, showMethod); - this._bind(hideTargets, hideEvents, hideMethod); - }; - - PROTOTYPE._assignInitialEvents = function(event) { - var options = this.options, - showTarget = options.show.target, - hideTarget = options.hide.target, - showEvents = options.show.event ? $.trim('' + options.show.event).split(' ') : [], - hideEvents = options.hide.event ? $.trim('' + options.hide.event).split(' ') : []; - - // Catch remove/removeqtip events on target element to destroy redundant tooltips - this._bind(this.elements.target, ['remove', 'removeqtip'], function(event) { - this.destroy(true); - }, 'destroy'); - - /* - * Make sure hoverIntent functions properly by using mouseleave as a hide event if - * mouseenter/mouseout is used for show.event, even if it isn't in the users options. - */ - if(/mouse(over|enter)/i.test(options.show.event) && !/mouse(out|leave)/i.test(options.hide.event)) { - hideEvents.push('mouseleave'); - } - - /* - * Also make sure initial mouse targetting works correctly by caching mousemove coords - * on show targets before the tooltip has rendered. Also set onTarget when triggered to - * keep mouse tracking working. - */ - this._bind(showTarget, 'mousemove', function(event) { - this._storeMouse(event); - this.cache.onTarget = TRUE; - }); - - // Define hoverIntent function - function hoverIntent(event) { - // Only continue if tooltip isn't disabled - if(this.disabled || this.destroyed) { return FALSE; } - - // Cache the event data - this.cache.event = event && $.event.fix(event); - this.cache.target = event && $(event.target); - - // Start the event sequence - clearTimeout(this.timers.show); - this.timers.show = delay.call(this, - function() { this.render(typeof event === 'object' || options.show.ready); }, - options.prerender ? 0 : options.show.delay - ); - } - - // Filter and bind events - this._bindEvents(showEvents, hideEvents, showTarget, hideTarget, hoverIntent, function() { - if(!this.timers) { return FALSE; } - clearTimeout(this.timers.show); - }); - - // Prerendering is enabled, create tooltip now - if(options.show.ready || options.prerender) { hoverIntent.call(this, event); } - }; - - // Event assignment method - PROTOTYPE._assignEvents = function() { - var self = this, - options = this.options, - posOptions = options.position, - - tooltip = this.tooltip, - showTarget = options.show.target, - hideTarget = options.hide.target, - containerTarget = posOptions.container, - viewportTarget = posOptions.viewport, - documentTarget = $(document), - bodyTarget = $(document.body), - windowTarget = $(window), - - showEvents = options.show.event ? $.trim('' + options.show.event).split(' ') : [], - hideEvents = options.hide.event ? $.trim('' + options.hide.event).split(' ') : []; - - - // Assign passed event callbacks - $.each(options.events, function(name, callback) { - self._bind(tooltip, name === 'toggle' ? ['tooltipshow','tooltiphide'] : ['tooltip'+name], callback, null, tooltip); - }); - - // Hide tooltips when leaving current window/frame (but not select/option elements) - if(/mouse(out|leave)/i.test(options.hide.event) && options.hide.leave === 'window') { - this._bind(documentTarget, ['mouseout', 'blur'], function(event) { - if(!/select|option/.test(event.target.nodeName) && !event.relatedTarget) { - this.hide(event); - } - }); - } - - // Enable hide.fixed by adding appropriate class - if(options.hide.fixed) { - hideTarget = hideTarget.add( tooltip.addClass(CLASS_FIXED) ); - } - - /* - * Make sure hoverIntent functions properly by using mouseleave to clear show timer if - * mouseenter/mouseout is used for show.event, even if it isn't in the users options. - */ - else if(/mouse(over|enter)/i.test(options.show.event)) { - this._bind(hideTarget, 'mouseleave', function() { - clearTimeout(this.timers.show); - }); - } - - // Hide tooltip on document mousedown if unfocus events are enabled - if(('' + options.hide.event).indexOf('unfocus') > -1) { - this._bind(containerTarget.closest('html'), ['mousedown', 'touchstart'], function(event) { - var elem = $(event.target), - enabled = this.rendered && !this.tooltip.hasClass(CLASS_DISABLED) && this.tooltip[0].offsetWidth > 0, - isAncestor = elem.parents(SELECTOR).filter(this.tooltip[0]).length > 0; - - if(elem[0] !== this.target[0] && elem[0] !== this.tooltip[0] && !isAncestor && - !this.target.has(elem[0]).length && enabled - ) { - this.hide(event); - } - }); - } - - // Check if the tooltip hides when inactive - if('number' === typeof options.hide.inactive) { - // Bind inactive method to show target(s) as a custom event - this._bind(showTarget, 'qtip-'+this.id+'-inactive', inactiveMethod, 'inactive'); - - // Define events which reset the 'inactive' event handler - this._bind(hideTarget.add(tooltip), QTIP.inactiveEvents, inactiveMethod); - } - - // Filter and bind events - this._bindEvents(showEvents, hideEvents, showTarget, hideTarget, showMethod, hideMethod); - - // Mouse movement bindings - this._bind(showTarget.add(tooltip), 'mousemove', function(event) { - // Check if the tooltip hides when mouse is moved a certain distance - if('number' === typeof options.hide.distance) { - var origin = this.cache.origin || {}, - limit = this.options.hide.distance, - abs = Math.abs; - - // Check if the movement has gone beyond the limit, and hide it if so - if(abs(event.pageX - origin.pageX) >= limit || abs(event.pageY - origin.pageY) >= limit) { - this.hide(event); - } - } - - // Cache mousemove coords on show targets - this._storeMouse(event); - }); - - // Mouse positioning events - if(posOptions.target === 'mouse') { - // If mouse adjustment is on... - if(posOptions.adjust.mouse) { - // Apply a mouseleave event so we don't get problems with overlapping - if(options.hide.event) { - // Track if we're on the target or not - this._bind(showTarget, ['mouseenter', 'mouseleave'], function(event) { - if(!this.cache) {return FALSE; } - this.cache.onTarget = event.type === 'mouseenter'; - }); - } - - // Update tooltip position on mousemove - this._bind(documentTarget, 'mousemove', function(event) { - // Update the tooltip position only if the tooltip is visible and adjustment is enabled - if(this.rendered && this.cache.onTarget && !this.tooltip.hasClass(CLASS_DISABLED) && this.tooltip[0].offsetWidth > 0) { - this.reposition(event); - } - }); - } - } - - // Adjust positions of the tooltip on window resize if enabled - if(posOptions.adjust.resize || viewportTarget.length) { - this._bind( $.event.special.resize ? viewportTarget : windowTarget, 'resize', repositionMethod ); - } - - // Adjust tooltip position on scroll of the window or viewport element if present - if(posOptions.adjust.scroll) { - this._bind( windowTarget.add(posOptions.container), 'scroll', repositionMethod ); - } - }; - - // Un-assignment method - PROTOTYPE._unassignEvents = function() { - var options = this.options, - showTargets = options.show.target, - hideTargets = options.hide.target, - targets = $.grep([ - this.elements.target[0], - this.rendered && this.tooltip[0], - options.position.container[0], - options.position.viewport[0], - options.position.container.closest('html')[0], // unfocus - window, - document - ], function(i) { - return typeof i === 'object'; - }); - - // Add show and hide targets if they're valid - if(showTargets && showTargets.toArray) { - targets = targets.concat(showTargets.toArray()); - } - if(hideTargets && hideTargets.toArray) { - targets = targets.concat(hideTargets.toArray()); - } - - // Unbind the events - this._unbind(targets) - ._unbind(targets, 'destroy') - ._unbind(targets, 'inactive'); - }; - - // Apply common event handlers using delegate (avoids excessive .bind calls!) - $(function() { - delegate(SELECTOR, ['mouseenter', 'mouseleave'], function(event) { - var state = event.type === 'mouseenter', - tooltip = $(event.currentTarget), - target = $(event.relatedTarget || event.target), - options = this.options; - - // On mouseenter... - if(state) { - // Focus the tooltip on mouseenter (z-index stacking) - this.focus(event); - - // Clear hide timer on tooltip hover to prevent it from closing - tooltip.hasClass(CLASS_FIXED) && !tooltip.hasClass(CLASS_DISABLED) && clearTimeout(this.timers.hide); - } - - // On mouseleave... - else { - // When mouse tracking is enabled, hide when we leave the tooltip and not onto the show target (if a hide event is set) - if(options.position.target === 'mouse' && options.position.adjust.mouse && - options.hide.event && options.show.target && !target.closest(options.show.target[0]).length) { - this.hide(event); - } - } - - // Add hover class - tooltip.toggleClass(CLASS_HOVER, state); - }); - - // Define events which reset the 'inactive' event handler - delegate('['+ATTR_ID+']', INACTIVE_EVENTS, inactiveMethod); - }); - ;// Initialization method - function init(elem, id, opts) { - var obj, posOptions, attr, config, title, - - // Setup element references - docBody = $(document.body), - - // Use document body instead of document element if needed - newTarget = elem[0] === document ? docBody : elem, - - // Grab metadata from element if plugin is present - metadata = (elem.metadata) ? elem.metadata(opts.metadata) : NULL, - - // If metadata type if HTML5, grab 'name' from the object instead, or use the regular data object otherwise - metadata5 = opts.metadata.type === 'html5' && metadata ? metadata[opts.metadata.name] : NULL, - - // Grab data from metadata.name (or data-qtipopts as fallback) using .data() method, - html5 = elem.data(opts.metadata.name || 'qtipopts'); - - // If we don't get an object returned attempt to parse it manualyl without parseJSON - try { html5 = typeof html5 === 'string' ? $.parseJSON(html5) : html5; } catch(e) {} - - // Merge in and sanitize metadata - config = $.extend(TRUE, {}, QTIP.defaults, opts, - typeof html5 === 'object' ? sanitizeOptions(html5) : NULL, - sanitizeOptions(metadata5 || metadata)); - - // Re-grab our positioning options now we've merged our metadata and set id to passed value - posOptions = config.position; - config.id = id; - - // Setup missing content if none is detected - if('boolean' === typeof config.content.text) { - attr = elem.attr(config.content.attr); - - // Grab from supplied attribute if available - if(config.content.attr !== FALSE && attr) { config.content.text = attr; } - - // No valid content was found, abort render - else { return FALSE; } - } - - // Setup target options - if(!posOptions.container.length) { posOptions.container = docBody; } - if(posOptions.target === FALSE) { posOptions.target = newTarget; } - if(config.show.target === FALSE) { config.show.target = newTarget; } - if(config.show.solo === TRUE) { config.show.solo = posOptions.container.closest('body'); } - if(config.hide.target === FALSE) { config.hide.target = newTarget; } - if(config.position.viewport === TRUE) { config.position.viewport = posOptions.container; } - - // Ensure we only use a single container - posOptions.container = posOptions.container.eq(0); - - // Convert position corner values into x and y strings - posOptions.at = new CORNER(posOptions.at, TRUE); - posOptions.my = new CORNER(posOptions.my); - - // Destroy previous tooltip if overwrite is enabled, or skip element if not - if(elem.data(NAMESPACE)) { - if(config.overwrite) { - elem.qtip('destroy', true); - } - else if(config.overwrite === FALSE) { - return FALSE; - } - } - - // Add has-qtip attribute - elem.attr(ATTR_HAS, id); - - // Remove title attribute and store it if present - if(config.suppress && (title = elem.attr('title'))) { - // Final attr call fixes event delegatiom and IE default tooltip showing problem - elem.removeAttr('title').attr(oldtitle, title).attr('title', ''); - } - - // Initialize the tooltip and add API reference - obj = new QTip(elem, config, id, !!attr); - elem.data(NAMESPACE, obj); - - return obj; - } - - // jQuery $.fn extension method - QTIP = $.fn.qtip = function(options, notation, newValue) - { - var command = ('' + options).toLowerCase(), // Parse command - returned = NULL, - args = $.makeArray(arguments).slice(1), - event = args[args.length - 1], - opts = this[0] ? $.data(this[0], NAMESPACE) : NULL; - - // Check for API request - if((!arguments.length && opts) || command === 'api') { - return opts; - } - - // Execute API command if present - else if('string' === typeof options) { - this.each(function() { - var api = $.data(this, NAMESPACE); - if(!api) { return TRUE; } - - // Cache the event if possible - if(event && event.timeStamp) { api.cache.event = event; } - - // Check for specific API commands - if(notation && (command === 'option' || command === 'options')) { - if(newValue !== undefined || $.isPlainObject(notation)) { - api.set(notation, newValue); - } - else { - returned = api.get(notation); - return FALSE; - } - } - - // Execute API command - else if(api[command]) { - api[command].apply(api, args); - } - }); - - return returned !== NULL ? returned : this; - } - - // No API commands. validate provided options and setup qTips - else if('object' === typeof options || !arguments.length) { - // Sanitize options first - opts = sanitizeOptions($.extend(TRUE, {}, options)); - - return this.each(function(i) { - var api, id; - - // Find next available ID, or use custom ID if provided - id = $.isArray(opts.id) ? opts.id[i] : opts.id; - id = !id || id === FALSE || id.length < 1 || QTIP.api[id] ? QTIP.nextid++ : id; - - // Initialize the qTip and re-grab newly sanitized options - api = init($(this), id, opts); - if(api === FALSE) { return TRUE; } - else { QTIP.api[id] = api; } - - // Initialize plugins - $.each(PLUGINS, function() { - if(this.initialize === 'initialize') { this(api); } - }); - - // Assign initial pre-render events - api._assignInitialEvents(event); - }); - } - }; - - // Expose class - $.qtip = QTip; - - // Populated in render method - QTIP.api = {}; - ;$.each({ - /* Allow other plugins to successfully retrieve the title of an element with a qTip applied */ - attr: function(attr, val) { - if(this.length) { - var self = this[0], - title = 'title', - api = $.data(self, 'qtip'); - - if(attr === title && api && 'object' === typeof api && api.options.suppress) { - if(arguments.length < 2) { - return $.attr(self, oldtitle); - } - - // If qTip is rendered and title was originally used as content, update it - if(api && api.options.content.attr === title && api.cache.attr) { - api.set('content.text', val); - } - - // Use the regular attr method to set, then cache the result - return this.attr(oldtitle, val); - } - } - - return $.fn['attr'+replaceSuffix].apply(this, arguments); - }, - - /* Allow clone to correctly retrieve cached title attributes */ - clone: function(keepData) { - var titles = $([]), title = 'title', - - // Clone our element using the real clone method - elems = $.fn['clone'+replaceSuffix].apply(this, arguments); - - // Grab all elements with an oldtitle set, and change it to regular title attribute, if keepData is false - if(!keepData) { - elems.filter('['+oldtitle+']').attr('title', function() { - return $.attr(this, oldtitle); - }) - .removeAttr(oldtitle); - } - - return elems; - } - }, function(name, func) { - if(!func || $.fn[name+replaceSuffix]) { return TRUE; } - - var old = $.fn[name+replaceSuffix] = $.fn[name]; - $.fn[name] = function() { - return func.apply(this, arguments) || old.apply(this, arguments); - }; - }); - - /* Fire off 'removeqtip' handler in $.cleanData if jQuery UI not present (it already does similar). - * This snippet is taken directly from jQuery UI source code found here: - * http://code.jquery.com/ui/jquery-ui-git.js - */ - if(!$.ui) { - $['cleanData'+replaceSuffix] = $.cleanData; - $.cleanData = function( elems ) { - for(var i = 0, elem; (elem = $( elems[i] )).length; i++) { - if(elem.attr(ATTR_HAS)) { - try { elem.triggerHandler('removeqtip'); } - catch( e ) {} - } - } - $['cleanData'+replaceSuffix].apply(this, arguments); - }; - } - ;// qTip version - QTIP.version = '2.2.1'; - - // Base ID for all qTips - QTIP.nextid = 0; - - // Inactive events array - QTIP.inactiveEvents = INACTIVE_EVENTS; - - // Base z-index for all qTips - QTIP.zindex = 15000; - - // Define configuration defaults - QTIP.defaults = { - prerender: FALSE, - id: FALSE, - overwrite: TRUE, - suppress: TRUE, - content: { - text: TRUE, - attr: 'title', - title: FALSE, - button: FALSE - }, - position: { - my: 'top left', - at: 'bottom right', - target: FALSE, - container: FALSE, - viewport: FALSE, - adjust: { - x: 0, y: 0, - mouse: TRUE, - scroll: TRUE, - resize: TRUE, - method: 'flipinvert flipinvert' - }, - effect: function(api, pos, viewport) { - $(this).animate(pos, { - duration: 200, - queue: FALSE - }); - } - }, - show: { - target: FALSE, - event: 'mouseenter', - effect: TRUE, - delay: 90, - solo: FALSE, - ready: FALSE, - autofocus: FALSE - }, - hide: { - target: FALSE, - event: 'mouseleave', - effect: TRUE, - delay: 0, - fixed: FALSE, - inactive: FALSE, - leave: 'window', - distance: FALSE - }, - style: { - classes: '', - widget: FALSE, - width: FALSE, - height: FALSE, - def: TRUE - }, - events: { - render: NULL, - move: NULL, - show: NULL, - hide: NULL, - toggle: NULL, - visible: NULL, - hidden: NULL, - focus: NULL, - blur: NULL - } - }; - ;var TIP, - - // .bind()/.on() namespace - TIPNS = '.qtip-tip', - - // Common CSS strings - MARGIN = 'margin', - BORDER = 'border', - COLOR = 'color', - BG_COLOR = 'background-color', - TRANSPARENT = 'transparent', - IMPORTANT = ' !important', - - // Check if the browser supports elements - HASCANVAS = !!document.createElement('canvas').getContext, - - // Invalid colour values used in parseColours() - INVALID = /rgba?\(0, 0, 0(, 0)?\)|transparent|#123456/i; - - // Camel-case method, taken from jQuery source - // http://code.jquery.com/jquery-1.8.0.js - function camel(s) { return s.charAt(0).toUpperCase() + s.slice(1); } - - /* - * Modified from Modernizr's testPropsAll() - * http://modernizr.com/downloads/modernizr-latest.js - */ - var cssProps = {}, cssPrefixes = ["Webkit", "O", "Moz", "ms"]; - function vendorCss(elem, prop) { - var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1), - props = (prop + ' ' + cssPrefixes.join(ucProp + ' ') + ucProp).split(' '), - cur, val, i = 0; - - // If the property has already been mapped... - if(cssProps[prop]) { return elem.css(cssProps[prop]); } - - while((cur = props[i++])) { - if((val = elem.css(cur)) !== undefined) { - return cssProps[prop] = cur, val; - } - } - } - - // Parse a given elements CSS property into an int - function intCss(elem, prop) { - return Math.ceil(parseFloat(vendorCss(elem, prop))); - } - - - // VML creation (for IE only) - if(!HASCANVAS) { - var createVML = function(tag, props, style) { - return ''; - }; - } - - // Canvas only definitions - else { - var PIXEL_RATIO = window.devicePixelRatio || 1, - BACKING_STORE_RATIO = (function() { - var context = document.createElement('canvas').getContext('2d'); - return context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || - context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || 1; - }()), - SCALE = PIXEL_RATIO / BACKING_STORE_RATIO; - } - - - function Tip(qtip, options) { - this._ns = 'tip'; - this.options = options; - this.offset = options.offset; - this.size = [ options.width, options.height ]; - - // Initialize - this.init( (this.qtip = qtip) ); - } - - $.extend(Tip.prototype, { - init: function(qtip) { - var context, tip; - - // Create tip element and prepend to the tooltip - tip = this.element = qtip.elements.tip = $('
    ', { 'class': NAMESPACE+'-tip' }).prependTo(qtip.tooltip); - - // Create tip drawing element(s) - if(HASCANVAS) { - // save() as soon as we create the canvas element so FF2 doesn't bork on our first restore()! - context = $('').appendTo(this.element)[0].getContext('2d'); - - // Setup constant parameters - context.lineJoin = 'miter'; - context.miterLimit = 100000; - context.save(); - } - else { - context = createVML('shape', 'coordorigin="0,0"', 'position:absolute;'); - this.element.html(context + context); - - // Prevent mousing down on the tip since it causes problems with .live() handling in IE due to VML - qtip._bind( $('*', tip).add(tip), ['click', 'mousedown'], function(event) { event.stopPropagation(); }, this._ns); - } - - // Bind update events - qtip._bind(qtip.tooltip, 'tooltipmove', this.reposition, this._ns, this); - - // Create it - this.create(); - }, - - _swapDimensions: function() { - this.size[0] = this.options.height; - this.size[1] = this.options.width; - }, - _resetDimensions: function() { - this.size[0] = this.options.width; - this.size[1] = this.options.height; - }, - - _useTitle: function(corner) { - var titlebar = this.qtip.elements.titlebar; - return titlebar && ( - corner.y === TOP || (corner.y === CENTER && this.element.position().top + (this.size[1] / 2) + this.options.offset < titlebar.outerHeight(TRUE)) - ); - }, - - _parseCorner: function(corner) { - var my = this.qtip.options.position.my; - - // Detect corner and mimic properties - if(corner === FALSE || my === FALSE) { - corner = FALSE; - } - else if(corner === TRUE) { - corner = new CORNER( my.string() ); - } - else if(!corner.string) { - corner = new CORNER(corner); - corner.fixed = TRUE; - } - - return corner; - }, - - _parseWidth: function(corner, side, use) { - var elements = this.qtip.elements, - prop = BORDER + camel(side) + 'Width'; - - return (use ? intCss(use, prop) : ( - intCss(elements.content, prop) || - intCss(this._useTitle(corner) && elements.titlebar || elements.content, prop) || - intCss(elements.tooltip, prop) - )) || 0; - }, - - _parseRadius: function(corner) { - var elements = this.qtip.elements, - prop = BORDER + camel(corner.y) + camel(corner.x) + 'Radius'; - - return BROWSER.ie < 9 ? 0 : - intCss(this._useTitle(corner) && elements.titlebar || elements.content, prop) || - intCss(elements.tooltip, prop) || 0; - }, - - _invalidColour: function(elem, prop, compare) { - var val = elem.css(prop); - return !val || (compare && val === elem.css(compare)) || INVALID.test(val) ? FALSE : val; - }, - - _parseColours: function(corner) { - var elements = this.qtip.elements, - tip = this.element.css('cssText', ''), - borderSide = BORDER + camel(corner[ corner.precedance ]) + camel(COLOR), - colorElem = this._useTitle(corner) && elements.titlebar || elements.content, - css = this._invalidColour, color = []; - - // Attempt to detect the background colour from various elements, left-to-right precedance - color[0] = css(tip, BG_COLOR) || css(colorElem, BG_COLOR) || css(elements.content, BG_COLOR) || - css(elements.tooltip, BG_COLOR) || tip.css(BG_COLOR); - - // Attempt to detect the correct border side colour from various elements, left-to-right precedance - color[1] = css(tip, borderSide, COLOR) || css(colorElem, borderSide, COLOR) || - css(elements.content, borderSide, COLOR) || css(elements.tooltip, borderSide, COLOR) || elements.tooltip.css(borderSide); - - // Reset background and border colours - $('*', tip).add(tip).css('cssText', BG_COLOR+':'+TRANSPARENT+IMPORTANT+';'+BORDER+':0'+IMPORTANT+';'); - - return color; - }, - - _calculateSize: function(corner) { - var y = corner.precedance === Y, - width = this.options['width'], - height = this.options['height'], - isCenter = corner.abbrev() === 'c', - base = (y ? width: height) * (isCenter ? 0.5 : 1), - pow = Math.pow, - round = Math.round, - bigHyp, ratio, result, - - smallHyp = Math.sqrt( pow(base, 2) + pow(height, 2) ), - hyp = [ (this.border / base) * smallHyp, (this.border / height) * smallHyp ]; - - hyp[2] = Math.sqrt( pow(hyp[0], 2) - pow(this.border, 2) ); - hyp[3] = Math.sqrt( pow(hyp[1], 2) - pow(this.border, 2) ); - - bigHyp = smallHyp + hyp[2] + hyp[3] + (isCenter ? 0 : hyp[0]); - ratio = bigHyp / smallHyp; - - result = [ round(ratio * width), round(ratio * height) ]; - return y ? result : result.reverse(); - }, - - // Tip coordinates calculator - _calculateTip: function(corner, size, scale) { - scale = scale || 1; - size = size || this.size; - - var width = size[0] * scale, - height = size[1] * scale, - width2 = Math.ceil(width / 2), height2 = Math.ceil(height / 2), - - // Define tip coordinates in terms of height and width values - tips = { - br: [0,0, width,height, width,0], - bl: [0,0, width,0, 0,height], - tr: [0,height, width,0, width,height], - tl: [0,0, 0,height, width,height], - tc: [0,height, width2,0, width,height], - bc: [0,0, width,0, width2,height], - rc: [0,0, width,height2, 0,height], - lc: [width,0, width,height, 0,height2] - }; - - // Set common side shapes - tips.lt = tips.br; tips.rt = tips.bl; - tips.lb = tips.tr; tips.rb = tips.tl; - - return tips[ corner.abbrev() ]; - }, - - // Tip coordinates drawer (canvas) - _drawCoords: function(context, coords) { - context.beginPath(); - context.moveTo(coords[0], coords[1]); - context.lineTo(coords[2], coords[3]); - context.lineTo(coords[4], coords[5]); - context.closePath(); - }, - - create: function() { - // Determine tip corner - var c = this.corner = (HASCANVAS || BROWSER.ie) && this._parseCorner(this.options.corner); - - // If we have a tip corner... - if( (this.enabled = !!this.corner && this.corner.abbrev() !== 'c') ) { - // Cache it - this.qtip.cache.corner = c.clone(); - - // Create it - this.update(); - } - - // Toggle tip element - this.element.toggle(this.enabled); - - return this.corner; - }, - - update: function(corner, position) { - if(!this.enabled) { return this; } - - var elements = this.qtip.elements, - tip = this.element, - inner = tip.children(), - options = this.options, - curSize = this.size, - mimic = options.mimic, - round = Math.round, - color, precedance, context, - coords, bigCoords, translate, newSize, border, BACKING_STORE_RATIO; - - // Re-determine tip if not already set - if(!corner) { corner = this.qtip.cache.corner || this.corner; } - - // Use corner property if we detect an invalid mimic value - if(mimic === FALSE) { mimic = corner; } - - // Otherwise inherit mimic properties from the corner object as necessary - else { - mimic = new CORNER(mimic); - mimic.precedance = corner.precedance; - - if(mimic.x === 'inherit') { mimic.x = corner.x; } - else if(mimic.y === 'inherit') { mimic.y = corner.y; } - else if(mimic.x === mimic.y) { - mimic[ corner.precedance ] = corner[ corner.precedance ]; - } - } - precedance = mimic.precedance; - - // Ensure the tip width.height are relative to the tip position - if(corner.precedance === X) { this._swapDimensions(); } - else { this._resetDimensions(); } - - // Update our colours - color = this.color = this._parseColours(corner); - - // Detect border width, taking into account colours - if(color[1] !== TRANSPARENT) { - // Grab border width - border = this.border = this._parseWidth(corner, corner[corner.precedance]); - - // If border width isn't zero, use border color as fill if it's not invalid (1.0 style tips) - if(options.border && border < 1 && !INVALID.test(color[1])) { color[0] = color[1]; } - - // Set border width (use detected border width if options.border is true) - this.border = border = options.border !== TRUE ? options.border : border; - } - - // Border colour was invalid, set border to zero - else { this.border = border = 0; } - - // Determine tip size - newSize = this.size = this._calculateSize(corner); - tip.css({ - width: newSize[0], - height: newSize[1], - lineHeight: newSize[1]+'px' - }); - - // Calculate tip translation - if(corner.precedance === Y) { - translate = [ - round(mimic.x === LEFT ? border : mimic.x === RIGHT ? newSize[0] - curSize[0] - border : (newSize[0] - curSize[0]) / 2), - round(mimic.y === TOP ? newSize[1] - curSize[1] : 0) - ]; - } - else { - translate = [ - round(mimic.x === LEFT ? newSize[0] - curSize[0] : 0), - round(mimic.y === TOP ? border : mimic.y === BOTTOM ? newSize[1] - curSize[1] - border : (newSize[1] - curSize[1]) / 2) - ]; - } - - // Canvas drawing implementation - if(HASCANVAS) { - // Grab canvas context and clear/save it - context = inner[0].getContext('2d'); - context.restore(); context.save(); - context.clearRect(0,0,6000,6000); - - // Calculate coordinates - coords = this._calculateTip(mimic, curSize, SCALE); - bigCoords = this._calculateTip(mimic, this.size, SCALE); - - // Set the canvas size using calculated size - inner.attr(WIDTH, newSize[0] * SCALE).attr(HEIGHT, newSize[1] * SCALE); - inner.css(WIDTH, newSize[0]).css(HEIGHT, newSize[1]); - - // Draw the outer-stroke tip - this._drawCoords(context, bigCoords); - context.fillStyle = color[1]; - context.fill(); - - // Draw the actual tip - context.translate(translate[0] * SCALE, translate[1] * SCALE); - this._drawCoords(context, coords); - context.fillStyle = color[0]; - context.fill(); - } - - // VML (IE Proprietary implementation) - else { - // Calculate coordinates - coords = this._calculateTip(mimic); - - // Setup coordinates string - coords = 'm' + coords[0] + ',' + coords[1] + ' l' + coords[2] + - ',' + coords[3] + ' ' + coords[4] + ',' + coords[5] + ' xe'; - - // Setup VML-specific offset for pixel-perfection - translate[2] = border && /^(r|b)/i.test(corner.string()) ? - BROWSER.ie === 8 ? 2 : 1 : 0; - - // Set initial CSS - inner.css({ - coordsize: (newSize[0]+border) + ' ' + (newSize[1]+border), - antialias: ''+(mimic.string().indexOf(CENTER) > -1), - left: translate[0] - (translate[2] * Number(precedance === X)), - top: translate[1] - (translate[2] * Number(precedance === Y)), - width: newSize[0] + border, - height: newSize[1] + border - }) - .each(function(i) { - var $this = $(this); - - // Set shape specific attributes - $this[ $this.prop ? 'prop' : 'attr' ]({ - coordsize: (newSize[0]+border) + ' ' + (newSize[1]+border), - path: coords, - fillcolor: color[0], - filled: !!i, - stroked: !i - }) - .toggle(!!(border || i)); - - // Check if border is enabled and add stroke element - !i && $this.html( createVML( - 'stroke', 'weight="'+(border*2)+'px" color="'+color[1]+'" miterlimit="1000" joinstyle="miter"' - ) ); - }); - } - - // Opera bug #357 - Incorrect tip position - // https://github.com/Craga89/qTip2/issues/367 - window.opera && setTimeout(function() { - elements.tip.css({ - display: 'inline-block', - visibility: 'visible' - }); - }, 1); - - // Position if needed - if(position !== FALSE) { this.calculate(corner, newSize); } - }, - - calculate: function(corner, size) { - if(!this.enabled) { return FALSE; } - - var self = this, - elements = this.qtip.elements, - tip = this.element, - userOffset = this.options.offset, - isWidget = elements.tooltip.hasClass('ui-widget'), - position = { }, - precedance, corners; - - // Inherit corner if not provided - corner = corner || this.corner; - precedance = corner.precedance; - - // Determine which tip dimension to use for adjustment - size = size || this._calculateSize(corner); - - // Setup corners and offset array - corners = [ corner.x, corner.y ]; - if(precedance === X) { corners.reverse(); } - - // Calculate tip position - $.each(corners, function(i, side) { - var b, bc, br; - - if(side === CENTER) { - b = precedance === Y ? LEFT : TOP; - position[ b ] = '50%'; - position[MARGIN+'-' + b] = -Math.round(size[ precedance === Y ? 0 : 1 ] / 2) + userOffset; - } - else { - b = self._parseWidth(corner, side, elements.tooltip); - bc = self._parseWidth(corner, side, elements.content); - br = self._parseRadius(corner); - - position[ side ] = Math.max(-self.border, i ? bc : (userOffset + (br > b ? br : -b))); - } - }); - - // Adjust for tip size - position[ corner[precedance] ] -= size[ precedance === X ? 0 : 1 ]; - - // Set and return new position - tip.css({ margin: '', top: '', bottom: '', left: '', right: '' }).css(position); - return position; - }, - - reposition: function(event, api, pos, viewport) { - if(!this.enabled) { return; } - - var cache = api.cache, - newCorner = this.corner.clone(), - adjust = pos.adjusted, - method = api.options.position.adjust.method.split(' '), - horizontal = method[0], - vertical = method[1] || method[0], - shift = { left: FALSE, top: FALSE, x: 0, y: 0 }, - offset, css = {}, props; - - function shiftflip(direction, precedance, popposite, side, opposite) { - // Horizontal - Shift or flip method - if(direction === SHIFT && newCorner.precedance === precedance && adjust[side] && newCorner[popposite] !== CENTER) { - newCorner.precedance = newCorner.precedance === X ? Y : X; - } - else if(direction !== SHIFT && adjust[side]){ - newCorner[precedance] = newCorner[precedance] === CENTER ? - (adjust[side] > 0 ? side : opposite) : (newCorner[precedance] === side ? opposite : side); - } - } - - function shiftonly(xy, side, opposite) { - if(newCorner[xy] === CENTER) { - css[MARGIN+'-'+side] = shift[xy] = offset[MARGIN+'-'+side] - adjust[side]; - } - else { - props = offset[opposite] !== undefined ? - [ adjust[side], -offset[side] ] : [ -adjust[side], offset[side] ]; - - if( (shift[xy] = Math.max(props[0], props[1])) > props[0] ) { - pos[side] -= adjust[side]; - shift[side] = FALSE; - } - - css[ offset[opposite] !== undefined ? opposite : side ] = shift[xy]; - } - } - - // If our tip position isn't fixed e.g. doesn't adjust with viewport... - if(this.corner.fixed !== TRUE) { - // Perform shift/flip adjustments - shiftflip(horizontal, X, Y, LEFT, RIGHT); - shiftflip(vertical, Y, X, TOP, BOTTOM); - - // Update and redraw the tip if needed (check cached details of last drawn tip) - if(newCorner.string() !== cache.corner.string() || cache.cornerTop !== adjust.top || cache.cornerLeft !== adjust.left) { - this.update(newCorner, FALSE); - } - } - - // Setup tip offset properties - offset = this.calculate(newCorner); - - // Readjust offset object to make it left/top - if(offset.right !== undefined) { offset.left = -offset.right; } - if(offset.bottom !== undefined) { offset.top = -offset.bottom; } - offset.user = this.offset; - - // Perform shift adjustments - if(shift.left = (horizontal === SHIFT && !!adjust.left)) { shiftonly(X, LEFT, RIGHT); } - if(shift.top = (vertical === SHIFT && !!adjust.top)) { shiftonly(Y, TOP, BOTTOM); } - - /* - * If the tip is adjusted in both dimensions, or in a - * direction that would cause it to be anywhere but the - * outer border, hide it! - */ - this.element.css(css).toggle( - !((shift.x && shift.y) || (newCorner.x === CENTER && shift.y) || (newCorner.y === CENTER && shift.x)) - ); - - // Adjust position to accomodate tip dimensions - pos.left -= offset.left.charAt ? offset.user : - horizontal !== SHIFT || shift.top || !shift.left && !shift.top ? offset.left + this.border : 0; - pos.top -= offset.top.charAt ? offset.user : - vertical !== SHIFT || shift.left || !shift.left && !shift.top ? offset.top + this.border : 0; - - // Cache details - cache.cornerLeft = adjust.left; cache.cornerTop = adjust.top; - cache.corner = newCorner.clone(); - }, - - destroy: function() { - // Unbind events - this.qtip._unbind(this.qtip.tooltip, this._ns); - - // Remove the tip element(s) - if(this.qtip.elements.tip) { - this.qtip.elements.tip.find('*') - .remove().end().remove(); - } - } - }); - - TIP = PLUGINS.tip = function(api) { - return new Tip(api, api.options.style.tip); - }; - - // Initialize tip on render - TIP.initialize = 'render'; - - // Setup plugin sanitization options - TIP.sanitize = function(options) { - if(options.style && 'tip' in options.style) { - var opts = options.style.tip; - if(typeof opts !== 'object') { opts = options.style.tip = { corner: opts }; } - if(!(/string|boolean/i).test(typeof opts.corner)) { opts.corner = TRUE; } - } - }; - - // Add new option checks for the plugin - CHECKS.tip = { - '^position.my|style.tip.(corner|mimic|border)$': function() { - // Make sure a tip can be drawn - this.create(); - - // Reposition the tooltip - this.qtip.reposition(); - }, - '^style.tip.(height|width)$': function(obj) { - // Re-set dimensions and redraw the tip - this.size = [ obj.width, obj.height ]; - this.update(); - - // Reposition the tooltip - this.qtip.reposition(); - }, - '^content.title|style.(classes|widget)$': function() { - this.update(); - } - }; - - // Extend original qTip defaults - $.extend(TRUE, QTIP.defaults, { - style: { - tip: { - corner: TRUE, - mimic: FALSE, - width: 6, - height: 6, - border: TRUE, - offset: 0 - } - } - }); - ;var MODAL, OVERLAY, - MODALCLASS = 'qtip-modal', - MODALSELECTOR = '.'+MODALCLASS; - - OVERLAY = function() - { - var self = this, - focusableElems = {}, - current, onLast, - prevState, elem; - - // Modified code from jQuery UI 1.10.0 source - // http://code.jquery.com/ui/1.10.0/jquery-ui.js - function focusable(element) { - // Use the defined focusable checker when possible - if($.expr[':'].focusable) { return $.expr[':'].focusable; } - - var isTabIndexNotNaN = !isNaN($.attr(element, 'tabindex')), - nodeName = element.nodeName && element.nodeName.toLowerCase(), - map, mapName, img; - - if('area' === nodeName) { - map = element.parentNode; - mapName = map.name; - if(!element.href || !mapName || map.nodeName.toLowerCase() !== 'map') { - return false; - } - img = $('img[usemap=#' + mapName + ']')[0]; - return !!img && img.is(':visible'); - } - return (/input|select|textarea|button|object/.test( nodeName ) ? - !element.disabled : - 'a' === nodeName ? - element.href || isTabIndexNotNaN : - isTabIndexNotNaN - ); - } - - // Focus inputs using cached focusable elements (see update()) - function focusInputs(blurElems) { - // Blurring body element in IE causes window.open windows to unfocus! - if(focusableElems.length < 1 && blurElems.length) { blurElems.not('body').blur(); } - - // Focus the inputs - else { focusableElems.first().focus(); } - } - - // Steal focus from elements outside tooltip - function stealFocus(event) { - if(!elem.is(':visible')) { return; } - - var target = $(event.target), - tooltip = current.tooltip, - container = target.closest(SELECTOR), - targetOnTop; - - // Determine if input container target is above this - targetOnTop = container.length < 1 ? FALSE : - (parseInt(container[0].style.zIndex, 10) > parseInt(tooltip[0].style.zIndex, 10)); - - // If we're showing a modal, but focus has landed on an input below - // this modal, divert focus to the first visible input in this modal - // or if we can't find one... the tooltip itself - if(!targetOnTop && target.closest(SELECTOR)[0] !== tooltip[0]) { - focusInputs(target); - } - - // Detect when we leave the last focusable element... - onLast = event.target === focusableElems[focusableElems.length - 1]; - } - - $.extend(self, { - init: function() { - // Create document overlay - elem = self.elem = $('
    ', { - id: 'qtip-overlay', - html: '
    ', - mousedown: function() { return FALSE; } - }) - .hide(); - - // Make sure we can't focus anything outside the tooltip - $(document.body).bind('focusin'+MODALSELECTOR, stealFocus); - - // Apply keyboard "Escape key" close handler - $(document).bind('keydown'+MODALSELECTOR, function(event) { - if(current && current.options.show.modal.escape && event.keyCode === 27) { - current.hide(event); - } - }); - - // Apply click handler for blur option - elem.bind('click'+MODALSELECTOR, function(event) { - if(current && current.options.show.modal.blur) { - current.hide(event); - } - }); - - return self; - }, - - update: function(api) { - // Update current API reference - current = api; - - // Update focusable elements if enabled - if(api.options.show.modal.stealfocus !== FALSE) { - focusableElems = api.tooltip.find('*').filter(function() { - return focusable(this); - }); - } - else { focusableElems = []; } - }, - - toggle: function(api, state, duration) { - var docBody = $(document.body), - tooltip = api.tooltip, - options = api.options.show.modal, - effect = options.effect, - type = state ? 'show': 'hide', - visible = elem.is(':visible'), - visibleModals = $(MODALSELECTOR).filter(':visible:not(:animated)').not(tooltip), - zindex; - - // Set active tooltip API reference - self.update(api); - - // If the modal can steal the focus... - // Blur the current item and focus anything in the modal we an - if(state && options.stealfocus !== FALSE) { - focusInputs( $(':focus') ); - } - - // Toggle backdrop cursor style on show - elem.toggleClass('blurs', options.blur); - - // Append to body on show - if(state) { - elem.appendTo(document.body); - } - - // Prevent modal from conflicting with show.solo, and don't hide backdrop is other modals are visible - if((elem.is(':animated') && visible === state && prevState !== FALSE) || (!state && visibleModals.length)) { - return self; - } - - // Stop all animations - elem.stop(TRUE, FALSE); - - // Use custom function if provided - if($.isFunction(effect)) { - effect.call(elem, state); - } - - // If no effect type is supplied, use a simple toggle - else if(effect === FALSE) { - elem[ type ](); - } - - // Use basic fade function - else { - elem.fadeTo( parseInt(duration, 10) || 90, state ? 1 : 0, function() { - if(!state) { elem.hide(); } - }); - } - - // Reset position and detach from body on hide - if(!state) { - elem.queue(function(next) { - elem.css({ left: '', top: '' }); - if(!$(MODALSELECTOR).length) { elem.detach(); } - next(); - }); - } - - // Cache the state - prevState = state; - - // If the tooltip is destroyed, set reference to null - if(current.destroyed) { current = NULL; } - - return self; - } - }); - - self.init(); - }; - OVERLAY = new OVERLAY(); - - function Modal(api, options) { - this.options = options; - this._ns = '-modal'; - - this.init( (this.qtip = api) ); - } - - $.extend(Modal.prototype, { - init: function(qtip) { - var tooltip = qtip.tooltip; - - // If modal is disabled... return - if(!this.options.on) { return this; } - - // Set overlay reference - qtip.elements.overlay = OVERLAY.elem; - - // Add unique attribute so we can grab modal tooltips easily via a SELECTOR, and set z-index - tooltip.addClass(MODALCLASS).css('z-index', QTIP.modal_zindex + $(MODALSELECTOR).length); - - // Apply our show/hide/focus modal events - qtip._bind(tooltip, ['tooltipshow', 'tooltiphide'], function(event, api, duration) { - var oEvent = event.originalEvent; - - // Make sure mouseout doesn't trigger a hide when showing the modal and mousing onto backdrop - if(event.target === tooltip[0]) { - if(oEvent && event.type === 'tooltiphide' && /mouse(leave|enter)/.test(oEvent.type) && $(oEvent.relatedTarget).closest(OVERLAY.elem[0]).length) { - try { event.preventDefault(); } catch(e) {} - } - else if(!oEvent || (oEvent && oEvent.type !== 'tooltipsolo')) { - this.toggle(event, event.type === 'tooltipshow', duration); - } - } - }, this._ns, this); - - // Adjust modal z-index on tooltip focus - qtip._bind(tooltip, 'tooltipfocus', function(event, api) { - // If focus was cancelled before it reached us, don't do anything - if(event.isDefaultPrevented() || event.target !== tooltip[0]) { return; } - - var qtips = $(MODALSELECTOR), - - // Keep the modal's lower than other, regular qtips - newIndex = QTIP.modal_zindex + qtips.length, - curIndex = parseInt(tooltip[0].style.zIndex, 10); - - // Set overlay z-index - OVERLAY.elem[0].style.zIndex = newIndex - 1; - - // Reduce modal z-index's and keep them properly ordered - qtips.each(function() { - if(this.style.zIndex > curIndex) { - this.style.zIndex -= 1; - } - }); - - // Fire blur event for focused tooltip - qtips.filter('.' + CLASS_FOCUS).qtip('blur', event.originalEvent); - - // Set the new z-index - tooltip.addClass(CLASS_FOCUS)[0].style.zIndex = newIndex; - - // Set current - OVERLAY.update(api); - - // Prevent default handling - try { event.preventDefault(); } catch(e) {} - }, this._ns, this); - - // Focus any other visible modals when this one hides - qtip._bind(tooltip, 'tooltiphide', function(event) { - if(event.target === tooltip[0]) { - $(MODALSELECTOR).filter(':visible').not(tooltip).last().qtip('focus', event); - } - }, this._ns, this); - }, - - toggle: function(event, state, duration) { - // Make sure default event hasn't been prevented - if(event && event.isDefaultPrevented()) { return this; } - - // Toggle it - OVERLAY.toggle(this.qtip, !!state, duration); - }, - - destroy: function() { - // Remove modal class - this.qtip.tooltip.removeClass(MODALCLASS); - - // Remove bound events - this.qtip._unbind(this.qtip.tooltip, this._ns); - - // Delete element reference - OVERLAY.toggle(this.qtip, FALSE); - delete this.qtip.elements.overlay; - } - }); - - - MODAL = PLUGINS.modal = function(api) { - return new Modal(api, api.options.show.modal); - }; - - // Setup sanitiztion rules - MODAL.sanitize = function(opts) { - if(opts.show) { - if(typeof opts.show.modal !== 'object') { opts.show.modal = { on: !!opts.show.modal }; } - else if(typeof opts.show.modal.on === 'undefined') { opts.show.modal.on = TRUE; } - } - }; - - // Base z-index for all modal tooltips (use qTip core z-index as a base) - QTIP.modal_zindex = QTIP.zindex - 200; - - // Plugin needs to be initialized on render - MODAL.initialize = 'render'; - - // Setup option set checks - CHECKS.modal = { - '^show.modal.(on|blur)$': function() { - // Initialise - this.destroy(); - this.init(); - - // Show the modal if not visible already and tooltip is visible - this.qtip.elems.overlay.toggle( - this.qtip.tooltip[0].offsetWidth > 0 - ); - } - }; - - // Extend original api defaults - $.extend(TRUE, QTIP.defaults, { - show: { - modal: { - on: FALSE, - effect: TRUE, - blur: TRUE, - stealfocus: TRUE, - escape: TRUE - } - } - }); - ;PLUGINS.viewport = function(api, position, posOptions, targetWidth, targetHeight, elemWidth, elemHeight) - { - var target = posOptions.target, - tooltip = api.elements.tooltip, - my = posOptions.my, - at = posOptions.at, - adjust = posOptions.adjust, - method = adjust.method.split(' '), - methodX = method[0], - methodY = method[1] || method[0], - viewport = posOptions.viewport, - container = posOptions.container, - cache = api.cache, - adjusted = { left: 0, top: 0 }, - fixed, newMy, containerOffset, containerStatic, - viewportWidth, viewportHeight, viewportScroll, viewportOffset; - - // If viewport is not a jQuery element, or it's the window/document, or no adjustment method is used... return - if(!viewport.jquery || target[0] === window || target[0] === document.body || adjust.method === 'none') { - return adjusted; - } - - // Cach container details - containerOffset = container.offset() || adjusted; - containerStatic = container.css('position') === 'static'; - - // Cache our viewport details - fixed = tooltip.css('position') === 'fixed'; - viewportWidth = viewport[0] === window ? viewport.width() : viewport.outerWidth(FALSE); - viewportHeight = viewport[0] === window ? viewport.height() : viewport.outerHeight(FALSE); - viewportScroll = { left: fixed ? 0 : viewport.scrollLeft(), top: fixed ? 0 : viewport.scrollTop() }; - viewportOffset = viewport.offset() || adjusted; - - // Generic calculation method - function calculate(side, otherSide, type, adjust, side1, side2, lengthName, targetLength, elemLength) { - var initialPos = position[side1], - mySide = my[side], - atSide = at[side], - isShift = type === SHIFT, - myLength = mySide === side1 ? elemLength : mySide === side2 ? -elemLength : -elemLength / 2, - atLength = atSide === side1 ? targetLength : atSide === side2 ? -targetLength : -targetLength / 2, - sideOffset = viewportScroll[side1] + viewportOffset[side1] - (containerStatic ? 0 : containerOffset[side1]), - overflow1 = sideOffset - initialPos, - overflow2 = initialPos + elemLength - (lengthName === WIDTH ? viewportWidth : viewportHeight) - sideOffset, - offset = myLength - (my.precedance === side || mySide === my[otherSide] ? atLength : 0) - (atSide === CENTER ? targetLength / 2 : 0); - - // shift - if(isShift) { - offset = (mySide === side1 ? 1 : -1) * myLength; - - // Adjust position but keep it within viewport dimensions - position[side1] += overflow1 > 0 ? overflow1 : overflow2 > 0 ? -overflow2 : 0; - position[side1] = Math.max( - -containerOffset[side1] + viewportOffset[side1], - initialPos - offset, - Math.min( - Math.max( - -containerOffset[side1] + viewportOffset[side1] + (lengthName === WIDTH ? viewportWidth : viewportHeight), - initialPos + offset - ), - position[side1], - - // Make sure we don't adjust complete off the element when using 'center' - mySide === 'center' ? initialPos - myLength : 1E9 - ) - ); - - } - - // flip/flipinvert - else { - // Update adjustment amount depending on if using flipinvert or flip - adjust *= (type === FLIPINVERT ? 2 : 0); - - // Check for overflow on the left/top - if(overflow1 > 0 && (mySide !== side1 || overflow2 > 0)) { - position[side1] -= offset + adjust; - newMy.invert(side, side1); - } - - // Check for overflow on the bottom/right - else if(overflow2 > 0 && (mySide !== side2 || overflow1 > 0) ) { - position[side1] -= (mySide === CENTER ? -offset : offset) + adjust; - newMy.invert(side, side2); - } - - // Make sure we haven't made things worse with the adjustment and reset if so - if(position[side1] < viewportScroll && -position[side1] > overflow2) { - position[side1] = initialPos; newMy = my.clone(); - } - } - - return position[side1] - initialPos; - } - - // Set newMy if using flip or flipinvert methods - if(methodX !== 'shift' || methodY !== 'shift') { newMy = my.clone(); } - - // Adjust position based onviewport and adjustment options - adjusted = { - left: methodX !== 'none' ? calculate( X, Y, methodX, adjust.x, LEFT, RIGHT, WIDTH, targetWidth, elemWidth ) : 0, - top: methodY !== 'none' ? calculate( Y, X, methodY, adjust.y, TOP, BOTTOM, HEIGHT, targetHeight, elemHeight ) : 0, - my: newMy - }; - - return adjusted; - }; - ;PLUGINS.polys = { - // POLY area coordinate calculator - // Special thanks to Ed Cradock for helping out with this. - // Uses a binary search algorithm to find suitable coordinates. - polygon: function(baseCoords, corner) { - var result = { - width: 0, height: 0, - position: { - top: 1e10, right: 0, - bottom: 0, left: 1e10 - }, - adjustable: FALSE - }, - i = 0, next, - coords = [], - compareX = 1, compareY = 1, - realX = 0, realY = 0, - newWidth, newHeight; - - // First pass, sanitize coords and determine outer edges - i = baseCoords.length; while(i--) { - next = [ parseInt(baseCoords[--i], 10), parseInt(baseCoords[i+1], 10) ]; - - if(next[0] > result.position.right){ result.position.right = next[0]; } - if(next[0] < result.position.left){ result.position.left = next[0]; } - if(next[1] > result.position.bottom){ result.position.bottom = next[1]; } - if(next[1] < result.position.top){ result.position.top = next[1]; } - - coords.push(next); - } - - // Calculate height and width from outer edges - newWidth = result.width = Math.abs(result.position.right - result.position.left); - newHeight = result.height = Math.abs(result.position.bottom - result.position.top); - - // If it's the center corner... - if(corner.abbrev() === 'c') { - result.position = { - left: result.position.left + (result.width / 2), - top: result.position.top + (result.height / 2) - }; - } - else { - // Second pass, use a binary search algorithm to locate most suitable coordinate - while(newWidth > 0 && newHeight > 0 && compareX > 0 && compareY > 0) - { - newWidth = Math.floor(newWidth / 2); - newHeight = Math.floor(newHeight / 2); - - if(corner.x === LEFT){ compareX = newWidth; } - else if(corner.x === RIGHT){ compareX = result.width - newWidth; } - else{ compareX += Math.floor(newWidth / 2); } - - if(corner.y === TOP){ compareY = newHeight; } - else if(corner.y === BOTTOM){ compareY = result.height - newHeight; } - else{ compareY += Math.floor(newHeight / 2); } - - i = coords.length; while(i--) - { - if(coords.length < 2){ break; } - - realX = coords[i][0] - result.position.left; - realY = coords[i][1] - result.position.top; - - if((corner.x === LEFT && realX >= compareX) || - (corner.x === RIGHT && realX <= compareX) || - (corner.x === CENTER && (realX < compareX || realX > (result.width - compareX))) || - (corner.y === TOP && realY >= compareY) || - (corner.y === BOTTOM && realY <= compareY) || - (corner.y === CENTER && (realY < compareY || realY > (result.height - compareY)))) { - coords.splice(i, 1); - } - } - } - result.position = { left: coords[0][0], top: coords[0][1] }; - } - - return result; - }, - - rect: function(ax, ay, bx, by) { - return { - width: Math.abs(bx - ax), - height: Math.abs(by - ay), - position: { - left: Math.min(ax, bx), - top: Math.min(ay, by) - } - }; - }, - - _angles: { - tc: 3 / 2, tr: 7 / 4, tl: 5 / 4, - bc: 1 / 2, br: 1 / 4, bl: 3 / 4, - rc: 2, lc: 1, c: 0 - }, - ellipse: function(cx, cy, rx, ry, corner) { - var c = PLUGINS.polys._angles[ corner.abbrev() ], - rxc = c === 0 ? 0 : rx * Math.cos( c * Math.PI ), - rys = ry * Math.sin( c * Math.PI ); - - return { - width: (rx * 2) - Math.abs(rxc), - height: (ry * 2) - Math.abs(rys), - position: { - left: cx + rxc, - top: cy + rys - }, - adjustable: FALSE - }; - }, - circle: function(cx, cy, r, corner) { - return PLUGINS.polys.ellipse(cx, cy, r, r, corner); - } - }; - ;PLUGINS.svg = function(api, svg, corner) - { - var doc = $(document), - elem = svg[0], - root = $(elem.ownerSVGElement), - ownerDocument = elem.ownerDocument, - strokeWidth2 = (parseInt(svg.css('stroke-width'), 10) || 0) / 2, - frameOffset, mtx, transformed, viewBox, - len, next, i, points, - result, position, dimensions; - - // Ascend the parentNode chain until we find an element with getBBox() - while(!elem.getBBox) { elem = elem.parentNode; } - if(!elem.getBBox || !elem.parentNode) { return FALSE; } - - // Determine which shape calculation to use - switch(elem.nodeName) { - case 'ellipse': - case 'circle': - result = PLUGINS.polys.ellipse( - elem.cx.baseVal.value, - elem.cy.baseVal.value, - (elem.rx || elem.r).baseVal.value + strokeWidth2, - (elem.ry || elem.r).baseVal.value + strokeWidth2, - corner - ); - break; - - case 'line': - case 'polygon': - case 'polyline': - // Determine points object (line has none, so mimic using array) - points = elem.points || [ - { x: elem.x1.baseVal.value, y: elem.y1.baseVal.value }, - { x: elem.x2.baseVal.value, y: elem.y2.baseVal.value } - ]; - - for(result = [], i = -1, len = points.numberOfItems || points.length; ++i < len;) { - next = points.getItem ? points.getItem(i) : points[i]; - result.push.apply(result, [next.x, next.y]); - } - - result = PLUGINS.polys.polygon(result, corner); - break; - - // Unknown shape or rectangle? Use bounding box - default: - result = elem.getBBox(); - result = { - width: result.width, - height: result.height, - position: { - left: result.x, - top: result.y - } - }; - break; - } - - // Shortcut assignments - position = result.position; - root = root[0]; - - // Convert position into a pixel value - if(root.createSVGPoint) { - mtx = elem.getScreenCTM(); - points = root.createSVGPoint(); - - points.x = position.left; - points.y = position.top; - transformed = points.matrixTransform( mtx ); - position.left = transformed.x; - position.top = transformed.y; - } - - // Check the element is not in a child document, and if so, adjust for frame elements offset - if(ownerDocument !== document && api.position.target !== 'mouse') { - frameOffset = $((ownerDocument.defaultView || ownerDocument.parentWindow).frameElement).offset(); - if(frameOffset) { - position.left += frameOffset.left; - position.top += frameOffset.top; - } - } - - // Adjust by scroll offset of owner document - ownerDocument = $(ownerDocument); - position.left += ownerDocument.scrollLeft(); - position.top += ownerDocument.scrollTop(); - - return result; - }; - ;PLUGINS.imagemap = function(api, area, corner, adjustMethod) - { - if(!area.jquery) { area = $(area); } - - var shape = (area.attr('shape') || 'rect').toLowerCase().replace('poly', 'polygon'), - image = $('img[usemap="#'+area.parent('map').attr('name')+'"]'), - coordsString = $.trim(area.attr('coords')), - coordsArray = coordsString.replace(/,$/, '').split(','), - imageOffset, coords, i, next, result, len; - - // If we can't find the image using the map... - if(!image.length) { return FALSE; } - - // Pass coordinates string if polygon - if(shape === 'polygon') { - result = PLUGINS.polys.polygon(coordsArray, corner); - } - - // Otherwise parse the coordinates and pass them as arguments - else if(PLUGINS.polys[shape]) { - for(i = -1, len = coordsArray.length, coords = []; ++i < len;) { - coords.push( parseInt(coordsArray[i], 10) ); - } - - result = PLUGINS.polys[shape].apply( - this, coords.concat(corner) - ); - } - - // If no shapre calculation method was found, return false - else { return FALSE; } - - // Make sure we account for padding and borders on the image - imageOffset = image.offset(); - imageOffset.left += Math.ceil((image.outerWidth(FALSE) - image.width()) / 2); - imageOffset.top += Math.ceil((image.outerHeight(FALSE) - image.height()) / 2); - - // Add image position to offset coordinates - result.position.left += imageOffset.left; - result.position.top += imageOffset.top; - - return result; - }; - ;var IE6, - - /* - * BGIFrame adaption (http://plugins.jquery.com/project/bgiframe) - * Special thanks to Brandon Aaron - */ - BGIFRAME = ''; - - function Ie6(api, qtip) { - this._ns = 'ie6'; - this.init( (this.qtip = api) ); - } - - $.extend(Ie6.prototype, { - _scroll : function() { - var overlay = this.qtip.elements.overlay; - overlay && (overlay[0].style.top = $(window).scrollTop() + 'px'); - }, - - init: function(qtip) { - var tooltip = qtip.tooltip, - scroll; - - // Create the BGIFrame element if needed - if($('select, object').length < 1) { - this.bgiframe = qtip.elements.bgiframe = $(BGIFRAME).appendTo(tooltip); - - // Update BGIFrame on tooltip move - qtip._bind(tooltip, 'tooltipmove', this.adjustBGIFrame, this._ns, this); - } - - // redraw() container for width/height calculations - this.redrawContainer = $('
    ', { id: NAMESPACE+'-rcontainer' }) - .appendTo(document.body); - - // Fixup modal plugin if present too - if( qtip.elements.overlay && qtip.elements.overlay.addClass('qtipmodal-ie6fix') ) { - qtip._bind(window, ['scroll', 'resize'], this._scroll, this._ns, this); - qtip._bind(tooltip, ['tooltipshow'], this._scroll, this._ns, this); - } - - // Set dimensions - this.redraw(); - }, - - adjustBGIFrame: function() { - var tooltip = this.qtip.tooltip, - dimensions = { - height: tooltip.outerHeight(FALSE), - width: tooltip.outerWidth(FALSE) - }, - plugin = this.qtip.plugins.tip, - tip = this.qtip.elements.tip, - tipAdjust, offset; - - // Adjust border offset - offset = parseInt(tooltip.css('borderLeftWidth'), 10) || 0; - offset = { left: -offset, top: -offset }; - - // Adjust for tips plugin - if(plugin && tip) { - tipAdjust = (plugin.corner.precedance === 'x') ? [WIDTH, LEFT] : [HEIGHT, TOP]; - offset[ tipAdjust[1] ] -= tip[ tipAdjust[0] ](); - } - - // Update bgiframe - this.bgiframe.css(offset).css(dimensions); - }, - - // Max/min width simulator function - redraw: function() { - if(this.qtip.rendered < 1 || this.drawing) { return this; } - - var tooltip = this.qtip.tooltip, - style = this.qtip.options.style, - container = this.qtip.options.position.container, - perc, width, max, min; - - // Set drawing flag - this.qtip.drawing = 1; - - // If tooltip has a set height/width, just set it... like a boss! - if(style.height) { tooltip.css(HEIGHT, style.height); } - if(style.width) { tooltip.css(WIDTH, style.width); } - - // Simulate max/min width if not set width present... - else { - // Reset width and add fluid class - tooltip.css(WIDTH, '').appendTo(this.redrawContainer); - - // Grab our tooltip width (add 1 if odd so we don't get wrapping problems.. huzzah!) - width = tooltip.width(); - if(width % 2 < 1) { width += 1; } - - // Grab our max/min properties - max = tooltip.css('maxWidth') || ''; - min = tooltip.css('minWidth') || ''; - - // Parse into proper pixel values - perc = (max + min).indexOf('%') > -1 ? container.width() / 100 : 0; - max = ((max.indexOf('%') > -1 ? perc : 1) * parseInt(max, 10)) || width; - min = ((min.indexOf('%') > -1 ? perc : 1) * parseInt(min, 10)) || 0; - - // Determine new dimension size based on max/min/current values - width = max + min ? Math.min(Math.max(width, min), max) : width; - - // Set the newly calculated width and remvoe fluid class - tooltip.css(WIDTH, Math.round(width)).appendTo(container); - } - - // Set drawing flag - this.drawing = 0; - - return this; - }, - - destroy: function() { - // Remove iframe - this.bgiframe && this.bgiframe.remove(); - - // Remove bound events - this.qtip._unbind([window, this.qtip.tooltip], this._ns); - } - }); - - IE6 = PLUGINS.ie6 = function(api) { - // Proceed only if the browser is IE6 - return BROWSER.ie === 6 ? new Ie6(api) : FALSE; - }; - - IE6.initialize = 'render'; - - CHECKS.ie6 = { - '^content|style$': function() { - this.redraw(); - } - }; - ;})); -}( window, document )); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/qtip/jquery.qtip.min.js b/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/qtip/jquery.qtip.min.js deleted file mode 100755 index 99cf2ea6..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/qtip/jquery.qtip.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/* qTip2 v2.2.1 | Plugins: tips modal viewport svg imagemap ie6 | Styles: core basic css3 | qtip2.com | Licensed MIT | Sat Sep 06 2014 23:12:07 */ - -!function(a,b,c){!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):jQuery&&!jQuery.fn.qtip&&a(jQuery)}(function(d){"use strict";function e(a,b,c,e){this.id=c,this.target=a,this.tooltip=F,this.elements={target:a},this._id=S+"-"+c,this.timers={img:{}},this.options=b,this.plugins={},this.cache={event:{},target:d(),disabled:E,attr:e,onTooltip:E,lastClass:""},this.rendered=this.destroyed=this.disabled=this.waiting=this.hiddenDuringWait=this.positioning=this.triggering=E}function f(a){return a===F||"object"!==d.type(a)}function g(a){return!(d.isFunction(a)||a&&a.attr||a.length||"object"===d.type(a)&&(a.jquery||a.then))}function h(a){var b,c,e,h;return f(a)?E:(f(a.metadata)&&(a.metadata={type:a.metadata}),"content"in a&&(b=a.content,f(b)||b.jquery||b.done?b=a.content={text:c=g(b)?E:b}:c=b.text,"ajax"in b&&(e=b.ajax,h=e&&e.once!==E,delete b.ajax,b.text=function(a,b){var f=c||d(this).attr(b.options.content.attr)||"Loading...",g=d.ajax(d.extend({},e,{context:b})).then(e.success,F,e.error).then(function(a){return a&&h&&b.set("content.text",a),a},function(a,c,d){b.destroyed||0===a.status||b.set("content.text",c+": "+d)});return h?f:(b.set("content.text",f),g)}),"title"in b&&(d.isPlainObject(b.title)&&(b.button=b.title.button,b.title=b.title.text),g(b.title||E)&&(b.title=E))),"position"in a&&f(a.position)&&(a.position={my:a.position,at:a.position}),"show"in a&&f(a.show)&&(a.show=a.show.jquery?{target:a.show}:a.show===D?{ready:D}:{event:a.show}),"hide"in a&&f(a.hide)&&(a.hide=a.hide.jquery?{target:a.hide}:{event:a.hide}),"style"in a&&f(a.style)&&(a.style={classes:a.style}),d.each(R,function(){this.sanitize&&this.sanitize(a)}),a)}function i(a,b){for(var c,d=0,e=a,f=b.split(".");e=e[f[d++]];)d0?setTimeout(d.proxy(a,this),b):void a.call(this)}function m(a){this.tooltip.hasClass(ab)||(clearTimeout(this.timers.show),clearTimeout(this.timers.hide),this.timers.show=l.call(this,function(){this.toggle(D,a)},this.options.show.delay))}function n(a){if(!this.tooltip.hasClass(ab)&&!this.destroyed){var b=d(a.relatedTarget),c=b.closest(W)[0]===this.tooltip[0],e=b[0]===this.options.show.target[0];if(clearTimeout(this.timers.show),clearTimeout(this.timers.hide),this!==b[0]&&"mouse"===this.options.position.target&&c||this.options.hide.fixed&&/mouse(out|leave|move)/.test(a.type)&&(c||e))try{a.preventDefault(),a.stopImmediatePropagation()}catch(f){}else this.timers.hide=l.call(this,function(){this.toggle(E,a)},this.options.hide.delay,this)}}function o(a){!this.tooltip.hasClass(ab)&&this.options.hide.inactive&&(clearTimeout(this.timers.inactive),this.timers.inactive=l.call(this,function(){this.hide(a)},this.options.hide.inactive))}function p(a){this.rendered&&this.tooltip[0].offsetWidth>0&&this.reposition(a)}function q(a,c,e){d(b.body).delegate(a,(c.split?c:c.join("."+S+" "))+"."+S,function(){var a=y.api[d.attr(this,U)];a&&!a.disabled&&e.apply(a,arguments)})}function r(a,c,f){var g,i,j,k,l,m=d(b.body),n=a[0]===b?m:a,o=a.metadata?a.metadata(f.metadata):F,p="html5"===f.metadata.type&&o?o[f.metadata.name]:F,q=a.data(f.metadata.name||"qtipopts");try{q="string"==typeof q?d.parseJSON(q):q}catch(r){}if(k=d.extend(D,{},y.defaults,f,"object"==typeof q?h(q):F,h(p||o)),i=k.position,k.id=c,"boolean"==typeof k.content.text){if(j=a.attr(k.content.attr),k.content.attr===E||!j)return E;k.content.text=j}if(i.container.length||(i.container=m),i.target===E&&(i.target=n),k.show.target===E&&(k.show.target=n),k.show.solo===D&&(k.show.solo=i.container.closest("body")),k.hide.target===E&&(k.hide.target=n),k.position.viewport===D&&(k.position.viewport=i.container),i.container=i.container.eq(0),i.at=new A(i.at,D),i.my=new A(i.my),a.data(S))if(k.overwrite)a.qtip("destroy",!0);else if(k.overwrite===E)return E;return a.attr(T,c),k.suppress&&(l=a.attr("title"))&&a.removeAttr("title").attr(cb,l).attr("title",""),g=new e(a,k,c,!!j),a.data(S,g),g}function s(a){return a.charAt(0).toUpperCase()+a.slice(1)}function t(a,b){var d,e,f=b.charAt(0).toUpperCase()+b.slice(1),g=(b+" "+rb.join(f+" ")+f).split(" "),h=0;if(qb[b])return a.css(qb[b]);for(;d=g[h++];)if((e=a.css(d))!==c)return qb[b]=d,e}function u(a,b){return Math.ceil(parseFloat(t(a,b)))}function v(a,b){this._ns="tip",this.options=b,this.offset=b.offset,this.size=[b.width,b.height],this.init(this.qtip=a)}function w(a,b){this.options=b,this._ns="-modal",this.init(this.qtip=a)}function x(a){this._ns="ie6",this.init(this.qtip=a)}var y,z,A,B,C,D=!0,E=!1,F=null,G="x",H="y",I="width",J="height",K="top",L="left",M="bottom",N="right",O="center",P="flipinvert",Q="shift",R={},S="qtip",T="data-hasqtip",U="data-qtip-id",V=["ui-widget","ui-tooltip"],W="."+S,X="click dblclick mousedown mouseup mousemove mouseleave mouseenter".split(" "),Y=S+"-fixed",Z=S+"-default",$=S+"-focus",_=S+"-hover",ab=S+"-disabled",bb="_replacedByqTip",cb="oldtitle",db={ie:function(){for(var a=4,c=b.createElement("div");(c.innerHTML="")&&c.getElementsByTagName("i")[0];a+=1);return a>4?a:0/0}(),iOS:parseFloat((""+(/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0,""])[1]).replace("undefined","3_2").replace("_",".").replace("_",""))||E};z=e.prototype,z._when=function(a){return d.when.apply(d,a)},z.render=function(a){if(this.rendered||this.destroyed)return this;var b,c=this,e=this.options,f=this.cache,g=this.elements,h=e.content.text,i=e.content.title,j=e.content.button,k=e.position,l=("."+this._id+" ",[]);return d.attr(this.target[0],"aria-describedby",this._id),f.posClass=this._createPosClass((this.position={my:k.my,at:k.at}).my),this.tooltip=g.tooltip=b=d("
    ",{id:this._id,"class":[S,Z,e.style.classes,f.posClass].join(" "),width:e.style.width||"",height:e.style.height||"",tracking:"mouse"===k.target&&k.adjust.mouse,role:"alert","aria-live":"polite","aria-atomic":E,"aria-describedby":this._id+"-content","aria-hidden":D}).toggleClass(ab,this.disabled).attr(U,this.id).data(S,this).appendTo(k.container).append(g.content=d("
    ",{"class":S+"-content",id:this._id+"-content","aria-atomic":D})),this.rendered=-1,this.positioning=D,i&&(this._createTitle(),d.isFunction(i)||l.push(this._updateTitle(i,E))),j&&this._createButton(),d.isFunction(h)||l.push(this._updateContent(h,E)),this.rendered=D,this._setWidget(),d.each(R,function(a){var b;"render"===this.initialize&&(b=this(c))&&(c.plugins[a]=b)}),this._unassignEvents(),this._assignEvents(),this._when(l).then(function(){c._trigger("render"),c.positioning=E,c.hiddenDuringWait||!e.show.ready&&!a||c.toggle(D,f.event,E),c.hiddenDuringWait=E}),y.api[this.id]=this,this},z.destroy=function(a){function b(){if(!this.destroyed){this.destroyed=D;var a,b=this.target,c=b.attr(cb);this.rendered&&this.tooltip.stop(1,0).find("*").remove().end().remove(),d.each(this.plugins,function(){this.destroy&&this.destroy()});for(a in this.timers)clearTimeout(this.timers[a]);b.removeData(S).removeAttr(U).removeAttr(T).removeAttr("aria-describedby"),this.options.suppress&&c&&b.attr("title",c).removeAttr(cb),this._unassignEvents(),this.options=this.elements=this.cache=this.timers=this.plugins=this.mouse=F,delete y.api[this.id]}}return this.destroyed?this.target:(a===D&&"hide"!==this.triggering||!this.rendered?b.call(this):(this.tooltip.one("tooltiphidden",d.proxy(b,this)),!this.triggering&&this.hide()),this.target)},B=z.checks={builtin:{"^id$":function(a,b,c,e){var f=c===D?y.nextid:c,g=S+"-"+f;f!==E&&f.length>0&&!d("#"+g).length?(this._id=g,this.rendered&&(this.tooltip[0].id=this._id,this.elements.content[0].id=this._id+"-content",this.elements.title[0].id=this._id+"-title")):a[b]=e},"^prerender":function(a,b,c){c&&!this.rendered&&this.render(this.options.show.ready)},"^content.text$":function(a,b,c){this._updateContent(c)},"^content.attr$":function(a,b,c,d){this.options.content.text===this.target.attr(d)&&this._updateContent(this.target.attr(c))},"^content.title$":function(a,b,c){return c?(c&&!this.elements.title&&this._createTitle(),void this._updateTitle(c)):this._removeTitle()},"^content.button$":function(a,b,c){this._updateButton(c)},"^content.title.(text|button)$":function(a,b,c){this.set("content."+b,c)},"^position.(my|at)$":function(a,b,c){"string"==typeof c&&(this.position[b]=a[b]=new A(c,"at"===b))},"^position.container$":function(a,b,c){this.rendered&&this.tooltip.appendTo(c)},"^show.ready$":function(a,b,c){c&&(!this.rendered&&this.render(D)||this.toggle(D))},"^style.classes$":function(a,b,c,d){this.rendered&&this.tooltip.removeClass(d).addClass(c)},"^style.(width|height)":function(a,b,c){this.rendered&&this.tooltip.css(b,c)},"^style.widget|content.title":function(){this.rendered&&this._setWidget()},"^style.def":function(a,b,c){this.rendered&&this.tooltip.toggleClass(Z,!!c)},"^events.(render|show|move|hide|focus|blur)$":function(a,b,c){this.rendered&&this.tooltip[(d.isFunction(c)?"":"un")+"bind"]("tooltip"+b,c)},"^(show|hide|position).(event|target|fixed|inactive|leave|distance|viewport|adjust)":function(){if(this.rendered){var a=this.options.position;this.tooltip.attr("tracking","mouse"===a.target&&a.adjust.mouse),this._unassignEvents(),this._assignEvents()}}}},z.get=function(a){if(this.destroyed)return this;var b=i(this.options,a.toLowerCase()),c=b[0][b[1]];return c.precedance?c.string():c};var eb=/^position\.(my|at|adjust|target|container|viewport)|style|content|show\.ready/i,fb=/^prerender|show\.ready/i;z.set=function(a,b){if(this.destroyed)return this;{var c,e=this.rendered,f=E,g=this.options;this.checks}return"string"==typeof a?(c=a,a={},a[c]=b):a=d.extend({},a),d.each(a,function(b,c){if(e&&fb.test(b))return void delete a[b];var h,j=i(g,b.toLowerCase());h=j[0][j[1]],j[0][j[1]]=c&&c.nodeType?d(c):c,f=eb.test(b)||f,a[b]=[j[0],j[1],c,h]}),h(g),this.positioning=D,d.each(a,d.proxy(j,this)),this.positioning=E,this.rendered&&this.tooltip[0].offsetWidth>0&&f&&this.reposition("mouse"===g.position.target?F:this.cache.event),this},z._update=function(a,b){var c=this,e=this.cache;return this.rendered&&a?(d.isFunction(a)&&(a=a.call(this.elements.target,e.event,this)||""),d.isFunction(a.then)?(e.waiting=D,a.then(function(a){return e.waiting=E,c._update(a,b)},F,function(a){return c._update(a,b)})):a===E||!a&&""!==a?E:(a.jquery&&a.length>0?b.empty().append(a.css({display:"block",visibility:"visible"})):b.html(a),this._waitForContent(b).then(function(a){c.rendered&&c.tooltip[0].offsetWidth>0&&c.reposition(e.event,!a.length)}))):E},z._waitForContent=function(a){var b=this.cache;return b.waiting=D,(d.fn.imagesLoaded?a.imagesLoaded():d.Deferred().resolve([])).done(function(){b.waiting=E}).promise()},z._updateContent=function(a,b){this._update(a,this.elements.content,b)},z._updateTitle=function(a,b){this._update(a,this.elements.title,b)===E&&this._removeTitle(E)},z._createTitle=function(){var a=this.elements,b=this._id+"-title";a.titlebar&&this._removeTitle(),a.titlebar=d("
    ",{"class":S+"-titlebar "+(this.options.style.widget?k("header"):"")}).append(a.title=d("
    ",{id:b,"class":S+"-title","aria-atomic":D})).insertBefore(a.content).delegate(".qtip-close","mousedown keydown mouseup keyup mouseout",function(a){d(this).toggleClass("ui-state-active ui-state-focus","down"===a.type.substr(-4))}).delegate(".qtip-close","mouseover mouseout",function(a){d(this).toggleClass("ui-state-hover","mouseover"===a.type)}),this.options.content.button&&this._createButton()},z._removeTitle=function(a){var b=this.elements;b.title&&(b.titlebar.remove(),b.titlebar=b.title=b.button=F,a!==E&&this.reposition())},z._createPosClass=function(a){return S+"-pos-"+(a||this.options.position.my).abbrev()},z.reposition=function(c,e){if(!this.rendered||this.positioning||this.destroyed)return this;this.positioning=D;var f,g,h,i,j=this.cache,k=this.tooltip,l=this.options.position,m=l.target,n=l.my,o=l.at,p=l.viewport,q=l.container,r=l.adjust,s=r.method.split(" "),t=k.outerWidth(E),u=k.outerHeight(E),v=0,w=0,x=k.css("position"),y={left:0,top:0},z=k[0].offsetWidth>0,A=c&&"scroll"===c.type,B=d(a),C=q[0].ownerDocument,F=this.mouse;if(d.isArray(m)&&2===m.length)o={x:L,y:K},y={left:m[0],top:m[1]};else if("mouse"===m)o={x:L,y:K},(!r.mouse||this.options.hide.distance)&&j.origin&&j.origin.pageX?c=j.origin:!c||c&&("resize"===c.type||"scroll"===c.type)?c=j.event:F&&F.pageX&&(c=F),"static"!==x&&(y=q.offset()),C.body.offsetWidth!==(a.innerWidth||C.documentElement.clientWidth)&&(g=d(b.body).offset()),y={left:c.pageX-y.left+(g&&g.left||0),top:c.pageY-y.top+(g&&g.top||0)},r.mouse&&A&&F&&(y.left-=(F.scrollX||0)-B.scrollLeft(),y.top-=(F.scrollY||0)-B.scrollTop());else{if("event"===m?c&&c.target&&"scroll"!==c.type&&"resize"!==c.type?j.target=d(c.target):c.target||(j.target=this.elements.target):"event"!==m&&(j.target=d(m.jquery?m:this.elements.target)),m=j.target,m=d(m).eq(0),0===m.length)return this;m[0]===b||m[0]===a?(v=db.iOS?a.innerWidth:m.width(),w=db.iOS?a.innerHeight:m.height(),m[0]===a&&(y={top:(p||m).scrollTop(),left:(p||m).scrollLeft()})):R.imagemap&&m.is("area")?f=R.imagemap(this,m,o,R.viewport?s:E):R.svg&&m&&m[0].ownerSVGElement?f=R.svg(this,m,o,R.viewport?s:E):(v=m.outerWidth(E),w=m.outerHeight(E),y=m.offset()),f&&(v=f.width,w=f.height,g=f.offset,y=f.position),y=this.reposition.offset(m,y,q),(db.iOS>3.1&&db.iOS<4.1||db.iOS>=4.3&&db.iOS<4.33||!db.iOS&&"fixed"===x)&&(y.left-=B.scrollLeft(),y.top-=B.scrollTop()),(!f||f&&f.adjustable!==E)&&(y.left+=o.x===N?v:o.x===O?v/2:0,y.top+=o.y===M?w:o.y===O?w/2:0)}return y.left+=r.x+(n.x===N?-t:n.x===O?-t/2:0),y.top+=r.y+(n.y===M?-u:n.y===O?-u/2:0),R.viewport?(h=y.adjusted=R.viewport(this,y,l,v,w,t,u),g&&h.left&&(y.left+=g.left),g&&h.top&&(y.top+=g.top),h.my&&(this.position.my=h.my)):y.adjusted={left:0,top:0},j.posClass!==(i=this._createPosClass(this.position.my))&&k.removeClass(j.posClass).addClass(j.posClass=i),this._trigger("move",[y,p.elem||p],c)?(delete y.adjusted,e===E||!z||isNaN(y.left)||isNaN(y.top)||"mouse"===m||!d.isFunction(l.effect)?k.css(y):d.isFunction(l.effect)&&(l.effect.call(k,this,d.extend({},y)),k.queue(function(a){d(this).css({opacity:"",height:""}),db.ie&&this.style.removeAttribute("filter"),a()})),this.positioning=E,this):this},z.reposition.offset=function(a,c,e){function f(a,b){c.left+=b*a.scrollLeft(),c.top+=b*a.scrollTop()}if(!e[0])return c;var g,h,i,j,k=d(a[0].ownerDocument),l=!!db.ie&&"CSS1Compat"!==b.compatMode,m=e[0];do"static"!==(h=d.css(m,"position"))&&("fixed"===h?(i=m.getBoundingClientRect(),f(k,-1)):(i=d(m).position(),i.left+=parseFloat(d.css(m,"borderLeftWidth"))||0,i.top+=parseFloat(d.css(m,"borderTopWidth"))||0),c.left-=i.left+(parseFloat(d.css(m,"marginLeft"))||0),c.top-=i.top+(parseFloat(d.css(m,"marginTop"))||0),g||"hidden"===(j=d.css(m,"overflow"))||"visible"===j||(g=d(m)));while(m=m.offsetParent);return g&&(g[0]!==k[0]||l)&&f(g,1),c};var gb=(A=z.reposition.Corner=function(a,b){a=(""+a).replace(/([A-Z])/," $1").replace(/middle/gi,O).toLowerCase(),this.x=(a.match(/left|right/i)||a.match(/center/)||["inherit"])[0].toLowerCase(),this.y=(a.match(/top|bottom|center/i)||["inherit"])[0].toLowerCase(),this.forceY=!!b;var c=a.charAt(0);this.precedance="t"===c||"b"===c?H:G}).prototype;gb.invert=function(a,b){this[a]=this[a]===L?N:this[a]===N?L:b||this[a]},gb.string=function(a){var b=this.x,c=this.y,d=b!==c?"center"===b||"center"!==c&&(this.precedance===H||this.forceY)?[c,b]:[b,c]:[b];return a!==!1?d.join(" "):d},gb.abbrev=function(){var a=this.string(!1);return a[0].charAt(0)+(a[1]&&a[1].charAt(0)||"")},gb.clone=function(){return new A(this.string(),this.forceY)},z.toggle=function(a,c){var e=this.cache,f=this.options,g=this.tooltip;if(c){if(/over|enter/.test(c.type)&&e.event&&/out|leave/.test(e.event.type)&&f.show.target.add(c.target).length===f.show.target.length&&g.has(c.relatedTarget).length)return this;e.event=d.event.fix(c)}if(this.waiting&&!a&&(this.hiddenDuringWait=D),!this.rendered)return a?this.render(1):this;if(this.destroyed||this.disabled)return this;var h,i,j,k=a?"show":"hide",l=this.options[k],m=(this.options[a?"hide":"show"],this.options.position),n=this.options.content,o=this.tooltip.css("width"),p=this.tooltip.is(":visible"),q=a||1===l.target.length,r=!c||l.target.length<2||e.target[0]===c.target;return(typeof a).search("boolean|number")&&(a=!p),h=!g.is(":animated")&&p===a&&r,i=h?F:!!this._trigger(k,[90]),this.destroyed?this:(i!==E&&a&&this.focus(c),!i||h?this:(d.attr(g[0],"aria-hidden",!a),a?(this.mouse&&(e.origin=d.event.fix(this.mouse)),d.isFunction(n.text)&&this._updateContent(n.text,E),d.isFunction(n.title)&&this._updateTitle(n.title,E),!C&&"mouse"===m.target&&m.adjust.mouse&&(d(b).bind("mousemove."+S,this._storeMouse),C=D),o||g.css("width",g.outerWidth(E)),this.reposition(c,arguments[2]),o||g.css("width",""),l.solo&&("string"==typeof l.solo?d(l.solo):d(W,l.solo)).not(g).not(l.target).qtip("hide",d.Event("tooltipsolo"))):(clearTimeout(this.timers.show),delete e.origin,C&&!d(W+'[tracking="true"]:visible',l.solo).not(g).length&&(d(b).unbind("mousemove."+S),C=E),this.blur(c)),j=d.proxy(function(){a?(db.ie&&g[0].style.removeAttribute("filter"),g.css("overflow",""),"string"==typeof l.autofocus&&d(this.options.show.autofocus,g).focus(),this.options.show.target.trigger("qtip-"+this.id+"-inactive")):g.css({display:"",visibility:"",opacity:"",left:"",top:""}),this._trigger(a?"visible":"hidden")},this),l.effect===E||q===E?(g[k](),j()):d.isFunction(l.effect)?(g.stop(1,1),l.effect.call(g,this),g.queue("fx",function(a){j(),a()})):g.fadeTo(90,a?1:0,j),a&&l.target.trigger("qtip-"+this.id+"-inactive"),this))},z.show=function(a){return this.toggle(D,a)},z.hide=function(a){return this.toggle(E,a)},z.focus=function(a){if(!this.rendered||this.destroyed)return this;var b=d(W),c=this.tooltip,e=parseInt(c[0].style.zIndex,10),f=y.zindex+b.length;return c.hasClass($)||this._trigger("focus",[f],a)&&(e!==f&&(b.each(function(){this.style.zIndex>e&&(this.style.zIndex=this.style.zIndex-1)}),b.filter("."+$).qtip("blur",a)),c.addClass($)[0].style.zIndex=f),this},z.blur=function(a){return!this.rendered||this.destroyed?this:(this.tooltip.removeClass($),this._trigger("blur",[this.tooltip.css("zIndex")],a),this)},z.disable=function(a){return this.destroyed?this:("toggle"===a?a=!(this.rendered?this.tooltip.hasClass(ab):this.disabled):"boolean"!=typeof a&&(a=D),this.rendered&&this.tooltip.toggleClass(ab,a).attr("aria-disabled",a),this.disabled=!!a,this)},z.enable=function(){return this.disable(E)},z._createButton=function(){var a=this,b=this.elements,c=b.tooltip,e=this.options.content.button,f="string"==typeof e,g=f?e:"Close tooltip";b.button&&b.button.remove(),b.button=e.jquery?e:d("",{"class":"qtip-close "+(this.options.style.widget?"":S+"-icon"),title:g,"aria-label":g}).prepend(d("",{"class":"ui-icon ui-icon-close",html:"×"})),b.button.appendTo(b.titlebar||c).attr("role","button").click(function(b){return c.hasClass(ab)||a.hide(b),E})},z._updateButton=function(a){if(!this.rendered)return E;var b=this.elements.button;a?this._createButton():b.remove()},z._setWidget=function(){var a=this.options.style.widget,b=this.elements,c=b.tooltip,d=c.hasClass(ab);c.removeClass(ab),ab=a?"ui-state-disabled":"qtip-disabled",c.toggleClass(ab,d),c.toggleClass("ui-helper-reset "+k(),a).toggleClass(Z,this.options.style.def&&!a),b.content&&b.content.toggleClass(k("content"),a),b.titlebar&&b.titlebar.toggleClass(k("header"),a),b.button&&b.button.toggleClass(S+"-icon",!a)},z._storeMouse=function(a){return(this.mouse=d.event.fix(a)).type="mousemove",this},z._bind=function(a,b,c,e,f){if(a&&c&&b.length){var g="."+this._id+(e?"-"+e:"");return d(a).bind((b.split?b:b.join(g+" "))+g,d.proxy(c,f||this)),this}},z._unbind=function(a,b){return a&&d(a).unbind("."+this._id+(b?"-"+b:"")),this},z._trigger=function(a,b,c){var e=d.Event("tooltip"+a);return e.originalEvent=c&&d.extend({},c)||this.cache.event||F,this.triggering=a,this.tooltip.trigger(e,[this].concat(b||[])),this.triggering=E,!e.isDefaultPrevented()},z._bindEvents=function(a,b,c,e,f,g){var h=c.filter(e).add(e.filter(c)),i=[];h.length&&(d.each(b,function(b,c){var e=d.inArray(c,a);e>-1&&i.push(a.splice(e,1)[0])}),i.length&&(this._bind(h,i,function(a){var b=this.rendered?this.tooltip[0].offsetWidth>0:!1;(b?g:f).call(this,a)}),c=c.not(h),e=e.not(h))),this._bind(c,a,f),this._bind(e,b,g)},z._assignInitialEvents=function(a){function b(a){return this.disabled||this.destroyed?E:(this.cache.event=a&&d.event.fix(a),this.cache.target=a&&d(a.target),clearTimeout(this.timers.show),void(this.timers.show=l.call(this,function(){this.render("object"==typeof a||c.show.ready)},c.prerender?0:c.show.delay)))}var c=this.options,e=c.show.target,f=c.hide.target,g=c.show.event?d.trim(""+c.show.event).split(" "):[],h=c.hide.event?d.trim(""+c.hide.event).split(" "):[];this._bind(this.elements.target,["remove","removeqtip"],function(){this.destroy(!0)},"destroy"),/mouse(over|enter)/i.test(c.show.event)&&!/mouse(out|leave)/i.test(c.hide.event)&&h.push("mouseleave"),this._bind(e,"mousemove",function(a){this._storeMouse(a),this.cache.onTarget=D}),this._bindEvents(g,h,e,f,b,function(){return this.timers?void clearTimeout(this.timers.show):E}),(c.show.ready||c.prerender)&&b.call(this,a)},z._assignEvents=function(){var c=this,e=this.options,f=e.position,g=this.tooltip,h=e.show.target,i=e.hide.target,j=f.container,k=f.viewport,l=d(b),q=(d(b.body),d(a)),r=e.show.event?d.trim(""+e.show.event).split(" "):[],s=e.hide.event?d.trim(""+e.hide.event).split(" "):[];d.each(e.events,function(a,b){c._bind(g,"toggle"===a?["tooltipshow","tooltiphide"]:["tooltip"+a],b,null,g)}),/mouse(out|leave)/i.test(e.hide.event)&&"window"===e.hide.leave&&this._bind(l,["mouseout","blur"],function(a){/select|option/.test(a.target.nodeName)||a.relatedTarget||this.hide(a)}),e.hide.fixed?i=i.add(g.addClass(Y)):/mouse(over|enter)/i.test(e.show.event)&&this._bind(i,"mouseleave",function(){clearTimeout(this.timers.show)}),(""+e.hide.event).indexOf("unfocus")>-1&&this._bind(j.closest("html"),["mousedown","touchstart"],function(a){var b=d(a.target),c=this.rendered&&!this.tooltip.hasClass(ab)&&this.tooltip[0].offsetWidth>0,e=b.parents(W).filter(this.tooltip[0]).length>0;b[0]===this.target[0]||b[0]===this.tooltip[0]||e||this.target.has(b[0]).length||!c||this.hide(a)}),"number"==typeof e.hide.inactive&&(this._bind(h,"qtip-"+this.id+"-inactive",o,"inactive"),this._bind(i.add(g),y.inactiveEvents,o)),this._bindEvents(r,s,h,i,m,n),this._bind(h.add(g),"mousemove",function(a){if("number"==typeof e.hide.distance){var b=this.cache.origin||{},c=this.options.hide.distance,d=Math.abs;(d(a.pageX-b.pageX)>=c||d(a.pageY-b.pageY)>=c)&&this.hide(a)}this._storeMouse(a)}),"mouse"===f.target&&f.adjust.mouse&&(e.hide.event&&this._bind(h,["mouseenter","mouseleave"],function(a){return this.cache?void(this.cache.onTarget="mouseenter"===a.type):E}),this._bind(l,"mousemove",function(a){this.rendered&&this.cache.onTarget&&!this.tooltip.hasClass(ab)&&this.tooltip[0].offsetWidth>0&&this.reposition(a)})),(f.adjust.resize||k.length)&&this._bind(d.event.special.resize?k:q,"resize",p),f.adjust.scroll&&this._bind(q.add(f.container),"scroll",p)},z._unassignEvents=function(){var c=this.options,e=c.show.target,f=c.hide.target,g=d.grep([this.elements.target[0],this.rendered&&this.tooltip[0],c.position.container[0],c.position.viewport[0],c.position.container.closest("html")[0],a,b],function(a){return"object"==typeof a});e&&e.toArray&&(g=g.concat(e.toArray())),f&&f.toArray&&(g=g.concat(f.toArray())),this._unbind(g)._unbind(g,"destroy")._unbind(g,"inactive")},d(function(){q(W,["mouseenter","mouseleave"],function(a){var b="mouseenter"===a.type,c=d(a.currentTarget),e=d(a.relatedTarget||a.target),f=this.options;b?(this.focus(a),c.hasClass(Y)&&!c.hasClass(ab)&&clearTimeout(this.timers.hide)):"mouse"===f.position.target&&f.position.adjust.mouse&&f.hide.event&&f.show.target&&!e.closest(f.show.target[0]).length&&this.hide(a),c.toggleClass(_,b)}),q("["+U+"]",X,o)}),y=d.fn.qtip=function(a,b,e){var f=(""+a).toLowerCase(),g=F,i=d.makeArray(arguments).slice(1),j=i[i.length-1],k=this[0]?d.data(this[0],S):F;return!arguments.length&&k||"api"===f?k:"string"==typeof a?(this.each(function(){var a=d.data(this,S);if(!a)return D;if(j&&j.timeStamp&&(a.cache.event=j),!b||"option"!==f&&"options"!==f)a[f]&&a[f].apply(a,i);else{if(e===c&&!d.isPlainObject(b))return g=a.get(b),E;a.set(b,e)}}),g!==F?g:this):"object"!=typeof a&&arguments.length?void 0:(k=h(d.extend(D,{},a)),this.each(function(a){var b,c;return c=d.isArray(k.id)?k.id[a]:k.id,c=!c||c===E||c.length<1||y.api[c]?y.nextid++:c,b=r(d(this),c,k),b===E?D:(y.api[c]=b,d.each(R,function(){"initialize"===this.initialize&&this(b)}),void b._assignInitialEvents(j))}))},d.qtip=e,y.api={},d.each({attr:function(a,b){if(this.length){var c=this[0],e="title",f=d.data(c,"qtip");if(a===e&&f&&"object"==typeof f&&f.options.suppress)return arguments.length<2?d.attr(c,cb):(f&&f.options.content.attr===e&&f.cache.attr&&f.set("content.text",b),this.attr(cb,b))}return d.fn["attr"+bb].apply(this,arguments)},clone:function(a){var b=(d([]),d.fn["clone"+bb].apply(this,arguments));return a||b.filter("["+cb+"]").attr("title",function(){return d.attr(this,cb)}).removeAttr(cb),b}},function(a,b){if(!b||d.fn[a+bb])return D;var c=d.fn[a+bb]=d.fn[a];d.fn[a]=function(){return b.apply(this,arguments)||c.apply(this,arguments)}}),d.ui||(d["cleanData"+bb]=d.cleanData,d.cleanData=function(a){for(var b,c=0;(b=d(a[c])).length;c++)if(b.attr(T))try{b.triggerHandler("removeqtip")}catch(e){}d["cleanData"+bb].apply(this,arguments)}),y.version="2.2.1",y.nextid=0,y.inactiveEvents=X,y.zindex=15e3,y.defaults={prerender:E,id:E,overwrite:D,suppress:D,content:{text:D,attr:"title",title:E,button:E},position:{my:"top left",at:"bottom right",target:E,container:E,viewport:E,adjust:{x:0,y:0,mouse:D,scroll:D,resize:D,method:"flipinvert flipinvert"},effect:function(a,b){d(this).animate(b,{duration:200,queue:E})}},show:{target:E,event:"mouseenter",effect:D,delay:90,solo:E,ready:E,autofocus:E},hide:{target:E,event:"mouseleave",effect:D,delay:0,fixed:E,inactive:E,leave:"window",distance:E},style:{classes:"",widget:E,width:E,height:E,def:D},events:{render:F,move:F,show:F,hide:F,toggle:F,visible:F,hidden:F,focus:F,blur:F}};var hb,ib="margin",jb="border",kb="color",lb="background-color",mb="transparent",nb=" !important",ob=!!b.createElement("canvas").getContext,pb=/rgba?\(0, 0, 0(, 0)?\)|transparent|#123456/i,qb={},rb=["Webkit","O","Moz","ms"];if(ob)var sb=a.devicePixelRatio||1,tb=function(){var a=b.createElement("canvas").getContext("2d");return a.backingStorePixelRatio||a.webkitBackingStorePixelRatio||a.mozBackingStorePixelRatio||a.msBackingStorePixelRatio||a.oBackingStorePixelRatio||1}(),ub=sb/tb;else var vb=function(a,b,c){return"'};d.extend(v.prototype,{init:function(a){var b,c;c=this.element=a.elements.tip=d("
    ",{"class":S+"-tip"}).prependTo(a.tooltip),ob?(b=d("").appendTo(this.element)[0].getContext("2d"),b.lineJoin="miter",b.miterLimit=1e5,b.save()):(b=vb("shape",'coordorigin="0,0"',"position:absolute;"),this.element.html(b+b),a._bind(d("*",c).add(c),["click","mousedown"],function(a){a.stopPropagation()},this._ns)),a._bind(a.tooltip,"tooltipmove",this.reposition,this._ns,this),this.create()},_swapDimensions:function(){this.size[0]=this.options.height,this.size[1]=this.options.width},_resetDimensions:function(){this.size[0]=this.options.width,this.size[1]=this.options.height},_useTitle:function(a){var b=this.qtip.elements.titlebar;return b&&(a.y===K||a.y===O&&this.element.position().top+this.size[1]/2+this.options.offsetl&&!pb.test(e[1])&&(e[0]=e[1]),this.border=l=p.border!==D?p.border:l):this.border=l=0,k=this.size=this._calculateSize(b),n.css({width:k[0],height:k[1],lineHeight:k[1]+"px"}),j=b.precedance===H?[s(r.x===L?l:r.x===N?k[0]-q[0]-l:(k[0]-q[0])/2),s(r.y===K?k[1]-q[1]:0)]:[s(r.x===L?k[0]-q[0]:0),s(r.y===K?l:r.y===M?k[1]-q[1]-l:(k[1]-q[1])/2)],ob?(g=o[0].getContext("2d"),g.restore(),g.save(),g.clearRect(0,0,6e3,6e3),h=this._calculateTip(r,q,ub),i=this._calculateTip(r,this.size,ub),o.attr(I,k[0]*ub).attr(J,k[1]*ub),o.css(I,k[0]).css(J,k[1]),this._drawCoords(g,i),g.fillStyle=e[1],g.fill(),g.translate(j[0]*ub,j[1]*ub),this._drawCoords(g,h),g.fillStyle=e[0],g.fill()):(h=this._calculateTip(r),h="m"+h[0]+","+h[1]+" l"+h[2]+","+h[3]+" "+h[4]+","+h[5]+" xe",j[2]=l&&/^(r|b)/i.test(b.string())?8===db.ie?2:1:0,o.css({coordsize:k[0]+l+" "+(k[1]+l),antialias:""+(r.string().indexOf(O)>-1),left:j[0]-j[2]*Number(f===G),top:j[1]-j[2]*Number(f===H),width:k[0]+l,height:k[1]+l}).each(function(a){var b=d(this);b[b.prop?"prop":"attr"]({coordsize:k[0]+l+" "+(k[1]+l),path:h,fillcolor:e[0],filled:!!a,stroked:!a}).toggle(!(!l&&!a)),!a&&b.html(vb("stroke",'weight="'+2*l+'px" color="'+e[1]+'" miterlimit="1000" joinstyle="miter"'))})),a.opera&&setTimeout(function(){m.tip.css({display:"inline-block",visibility:"visible"})},1),c!==E&&this.calculate(b,k)},calculate:function(a,b){if(!this.enabled)return E;var c,e,f=this,g=this.qtip.elements,h=this.element,i=this.options.offset,j=(g.tooltip.hasClass("ui-widget"),{});return a=a||this.corner,c=a.precedance,b=b||this._calculateSize(a),e=[a.x,a.y],c===G&&e.reverse(),d.each(e,function(d,e){var h,k,l; - e===O?(h=c===H?L:K,j[h]="50%",j[ib+"-"+h]=-Math.round(b[c===H?0:1]/2)+i):(h=f._parseWidth(a,e,g.tooltip),k=f._parseWidth(a,e,g.content),l=f._parseRadius(a),j[e]=Math.max(-f.border,d?k:i+(l>h?l:-h)))}),j[a[c]]-=b[c===G?0:1],h.css({margin:"",top:"",bottom:"",left:"",right:""}).css(j),j},reposition:function(a,b,d){function e(a,b,c,d,e){a===Q&&j.precedance===b&&k[d]&&j[c]!==O?j.precedance=j.precedance===G?H:G:a!==Q&&k[d]&&(j[b]=j[b]===O?k[d]>0?d:e:j[b]===d?e:d)}function f(a,b,e){j[a]===O?p[ib+"-"+b]=o[a]=g[ib+"-"+b]-k[b]:(h=g[e]!==c?[k[b],-g[b]]:[-k[b],g[b]],(o[a]=Math.max(h[0],h[1]))>h[0]&&(d[b]-=k[b],o[b]=E),p[g[e]!==c?e:b]=o[a])}if(this.enabled){var g,h,i=b.cache,j=this.corner.clone(),k=d.adjusted,l=b.options.position.adjust.method.split(" "),m=l[0],n=l[1]||l[0],o={left:E,top:E,x:0,y:0},p={};this.corner.fixed!==D&&(e(m,G,H,L,N),e(n,H,G,K,M),(j.string()!==i.corner.string()||i.cornerTop!==k.top||i.cornerLeft!==k.left)&&this.update(j,E)),g=this.calculate(j),g.right!==c&&(g.left=-g.right),g.bottom!==c&&(g.top=-g.bottom),g.user=this.offset,(o.left=m===Q&&!!k.left)&&f(G,L,N),(o.top=n===Q&&!!k.top)&&f(H,K,M),this.element.css(p).toggle(!(o.x&&o.y||j.x===O&&o.y||j.y===O&&o.x)),d.left-=g.left.charAt?g.user:m!==Q||o.top||!o.left&&!o.top?g.left+this.border:0,d.top-=g.top.charAt?g.user:n!==Q||o.left||!o.left&&!o.top?g.top+this.border:0,i.cornerLeft=k.left,i.cornerTop=k.top,i.corner=j.clone()}},destroy:function(){this.qtip._unbind(this.qtip.tooltip,this._ns),this.qtip.elements.tip&&this.qtip.elements.tip.find("*").remove().end().remove()}}),hb=R.tip=function(a){return new v(a,a.options.style.tip)},hb.initialize="render",hb.sanitize=function(a){if(a.style&&"tip"in a.style){var b=a.style.tip;"object"!=typeof b&&(b=a.style.tip={corner:b}),/string|boolean/i.test(typeof b.corner)||(b.corner=D)}},B.tip={"^position.my|style.tip.(corner|mimic|border)$":function(){this.create(),this.qtip.reposition()},"^style.tip.(height|width)$":function(a){this.size=[a.width,a.height],this.update(),this.qtip.reposition()},"^content.title|style.(classes|widget)$":function(){this.update()}},d.extend(D,y.defaults,{style:{tip:{corner:D,mimic:E,width:6,height:6,border:D,offset:0}}});var wb,xb,yb="qtip-modal",zb="."+yb;xb=function(){function a(a){if(d.expr[":"].focusable)return d.expr[":"].focusable;var b,c,e,f=!isNaN(d.attr(a,"tabindex")),g=a.nodeName&&a.nodeName.toLowerCase();return"area"===g?(b=a.parentNode,c=b.name,a.href&&c&&"map"===b.nodeName.toLowerCase()?(e=d("img[usemap=#"+c+"]")[0],!!e&&e.is(":visible")):!1):/input|select|textarea|button|object/.test(g)?!a.disabled:"a"===g?a.href||f:f}function c(a){k.length<1&&a.length?a.not("body").blur():k.first().focus()}function e(a){if(i.is(":visible")){var b,e=d(a.target),h=f.tooltip,j=e.closest(W);b=j.length<1?E:parseInt(j[0].style.zIndex,10)>parseInt(h[0].style.zIndex,10),b||e.closest(W)[0]===h[0]||c(e),g=a.target===k[k.length-1]}}var f,g,h,i,j=this,k={};d.extend(j,{init:function(){return i=j.elem=d("
    ",{id:"qtip-overlay",html:"
    ",mousedown:function(){return E}}).hide(),d(b.body).bind("focusin"+zb,e),d(b).bind("keydown"+zb,function(a){f&&f.options.show.modal.escape&&27===a.keyCode&&f.hide(a)}),i.bind("click"+zb,function(a){f&&f.options.show.modal.blur&&f.hide(a)}),j},update:function(b){f=b,k=b.options.show.modal.stealfocus!==E?b.tooltip.find("*").filter(function(){return a(this)}):[]},toggle:function(a,e,g){var k=(d(b.body),a.tooltip),l=a.options.show.modal,m=l.effect,n=e?"show":"hide",o=i.is(":visible"),p=d(zb).filter(":visible:not(:animated)").not(k);return j.update(a),e&&l.stealfocus!==E&&c(d(":focus")),i.toggleClass("blurs",l.blur),e&&i.appendTo(b.body),i.is(":animated")&&o===e&&h!==E||!e&&p.length?j:(i.stop(D,E),d.isFunction(m)?m.call(i,e):m===E?i[n]():i.fadeTo(parseInt(g,10)||90,e?1:0,function(){e||i.hide()}),e||i.queue(function(a){i.css({left:"",top:""}),d(zb).length||i.detach(),a()}),h=e,f.destroyed&&(f=F),j)}}),j.init()},xb=new xb,d.extend(w.prototype,{init:function(a){var b=a.tooltip;return this.options.on?(a.elements.overlay=xb.elem,b.addClass(yb).css("z-index",y.modal_zindex+d(zb).length),a._bind(b,["tooltipshow","tooltiphide"],function(a,c,e){var f=a.originalEvent;if(a.target===b[0])if(f&&"tooltiphide"===a.type&&/mouse(leave|enter)/.test(f.type)&&d(f.relatedTarget).closest(xb.elem[0]).length)try{a.preventDefault()}catch(g){}else(!f||f&&"tooltipsolo"!==f.type)&&this.toggle(a,"tooltipshow"===a.type,e)},this._ns,this),a._bind(b,"tooltipfocus",function(a,c){if(!a.isDefaultPrevented()&&a.target===b[0]){var e=d(zb),f=y.modal_zindex+e.length,g=parseInt(b[0].style.zIndex,10);xb.elem[0].style.zIndex=f-1,e.each(function(){this.style.zIndex>g&&(this.style.zIndex-=1)}),e.filter("."+$).qtip("blur",a.originalEvent),b.addClass($)[0].style.zIndex=f,xb.update(c);try{a.preventDefault()}catch(h){}}},this._ns,this),void a._bind(b,"tooltiphide",function(a){a.target===b[0]&&d(zb).filter(":visible").not(b).last().qtip("focus",a)},this._ns,this)):this},toggle:function(a,b,c){return a&&a.isDefaultPrevented()?this:void xb.toggle(this.qtip,!!b,c)},destroy:function(){this.qtip.tooltip.removeClass(yb),this.qtip._unbind(this.qtip.tooltip,this._ns),xb.toggle(this.qtip,E),delete this.qtip.elements.overlay}}),wb=R.modal=function(a){return new w(a,a.options.show.modal)},wb.sanitize=function(a){a.show&&("object"!=typeof a.show.modal?a.show.modal={on:!!a.show.modal}:"undefined"==typeof a.show.modal.on&&(a.show.modal.on=D))},y.modal_zindex=y.zindex-200,wb.initialize="render",B.modal={"^show.modal.(on|blur)$":function(){this.destroy(),this.init(),this.qtip.elems.overlay.toggle(this.qtip.tooltip[0].offsetWidth>0)}},d.extend(D,y.defaults,{show:{modal:{on:E,effect:D,blur:D,stealfocus:D,escape:D}}}),R.viewport=function(c,d,e,f,g,h,i){function j(a,b,c,e,f,g,h,i,j){var k=d[f],s=u[a],t=v[a],w=c===Q,x=s===f?j:s===g?-j:-j/2,y=t===f?i:t===g?-i:-i/2,z=q[f]+r[f]-(n?0:m[f]),A=z-k,B=k+j-(h===I?o:p)-z,C=x-(u.precedance===a||s===u[b]?y:0)-(t===O?i/2:0);return w?(C=(s===f?1:-1)*x,d[f]+=A>0?A:B>0?-B:0,d[f]=Math.max(-m[f]+r[f],k-C,Math.min(Math.max(-m[f]+r[f]+(h===I?o:p),k+C),d[f],"center"===s?k-x:1e9))):(e*=c===P?2:0,A>0&&(s!==f||B>0)?(d[f]-=C+e,l.invert(a,f)):B>0&&(s!==g||A>0)&&(d[f]-=(s===O?-C:C)+e,l.invert(a,g)),d[f]B&&(d[f]=k,l=u.clone())),d[f]-k}var k,l,m,n,o,p,q,r,s=e.target,t=c.elements.tooltip,u=e.my,v=e.at,w=e.adjust,x=w.method.split(" "),y=x[0],z=x[1]||x[0],A=e.viewport,B=e.container,C=(c.cache,{left:0,top:0});return A.jquery&&s[0]!==a&&s[0]!==b.body&&"none"!==w.method?(m=B.offset()||C,n="static"===B.css("position"),k="fixed"===t.css("position"),o=A[0]===a?A.width():A.outerWidth(E),p=A[0]===a?A.height():A.outerHeight(E),q={left:k?0:A.scrollLeft(),top:k?0:A.scrollTop()},r=A.offset()||C,("shift"!==y||"shift"!==z)&&(l=u.clone()),C={left:"none"!==y?j(G,H,y,w.x,L,N,I,f,h):0,top:"none"!==z?j(H,G,z,w.y,K,M,J,g,i):0,my:l}):C},R.polys={polygon:function(a,b){var c,d,e,f={width:0,height:0,position:{top:1e10,right:0,bottom:0,left:1e10},adjustable:E},g=0,h=[],i=1,j=1,k=0,l=0;for(g=a.length;g--;)c=[parseInt(a[--g],10),parseInt(a[g+1],10)],c[0]>f.position.right&&(f.position.right=c[0]),c[0]f.position.bottom&&(f.position.bottom=c[1]),c[1]0&&e>0&&i>0&&j>0;)for(d=Math.floor(d/2),e=Math.floor(e/2),b.x===L?i=d:b.x===N?i=f.width-d:i+=Math.floor(d/2),b.y===K?j=e:b.y===M?j=f.height-e:j+=Math.floor(e/2),g=h.length;g--&&!(h.length<2);)k=h[g][0]-f.position.left,l=h[g][1]-f.position.top,(b.x===L&&k>=i||b.x===N&&i>=k||b.x===O&&(i>k||k>f.width-i)||b.y===K&&l>=j||b.y===M&&j>=l||b.y===O&&(j>l||l>f.height-j))&&h.splice(g,1);f.position={left:h[0][0],top:h[0][1]}}return f},rect:function(a,b,c,d){return{width:Math.abs(c-a),height:Math.abs(d-b),position:{left:Math.min(a,c),top:Math.min(b,d)}}},_angles:{tc:1.5,tr:7/4,tl:5/4,bc:.5,br:.25,bl:.75,rc:2,lc:1,c:0},ellipse:function(a,b,c,d,e){var f=R.polys._angles[e.abbrev()],g=0===f?0:c*Math.cos(f*Math.PI),h=d*Math.sin(f*Math.PI);return{width:2*c-Math.abs(g),height:2*d-Math.abs(h),position:{left:a+g,top:b+h},adjustable:E}},circle:function(a,b,c,d){return R.polys.ellipse(a,b,c,c,d)}},R.svg=function(a,c,e){for(var f,g,h,i,j,k,l,m,n,o=(d(b),c[0]),p=d(o.ownerSVGElement),q=o.ownerDocument,r=(parseInt(c.css("stroke-width"),10)||0)/2;!o.getBBox;)o=o.parentNode;if(!o.getBBox||!o.parentNode)return E;switch(o.nodeName){case"ellipse":case"circle":m=R.polys.ellipse(o.cx.baseVal.value,o.cy.baseVal.value,(o.rx||o.r).baseVal.value+r,(o.ry||o.r).baseVal.value+r,e);break;case"line":case"polygon":case"polyline":for(l=o.points||[{x:o.x1.baseVal.value,y:o.y1.baseVal.value},{x:o.x2.baseVal.value,y:o.y2.baseVal.value}],m=[],k=-1,i=l.numberOfItems||l.length;++k';d.extend(x.prototype,{_scroll:function(){var b=this.qtip.elements.overlay;b&&(b[0].style.top=d(a).scrollTop()+"px")},init:function(c){var e=c.tooltip;d("select, object").length<1&&(this.bgiframe=c.elements.bgiframe=d(Bb).appendTo(e),c._bind(e,"tooltipmove",this.adjustBGIFrame,this._ns,this)),this.redrawContainer=d("
    ",{id:S+"-rcontainer"}).appendTo(b.body),c.elements.overlay&&c.elements.overlay.addClass("qtipmodal-ie6fix")&&(c._bind(a,["scroll","resize"],this._scroll,this._ns,this),c._bind(e,["tooltipshow"],this._scroll,this._ns,this)),this.redraw()},adjustBGIFrame:function(){var a,b,c=this.qtip.tooltip,d={height:c.outerHeight(E),width:c.outerWidth(E)},e=this.qtip.plugins.tip,f=this.qtip.elements.tip;b=parseInt(c.css("borderLeftWidth"),10)||0,b={left:-b,top:-b},e&&f&&(a="x"===e.corner.precedance?[I,L]:[J,K],b[a[1]]-=f[a[0]]()),this.bgiframe.css(b).css(d)},redraw:function(){if(this.qtip.rendered<1||this.drawing)return this;var a,b,c,d,e=this.qtip.tooltip,f=this.qtip.options.style,g=this.qtip.options.position.container;return this.qtip.drawing=1,f.height&&e.css(J,f.height),f.width?e.css(I,f.width):(e.css(I,"").appendTo(this.redrawContainer),b=e.width(),1>b%2&&(b+=1),c=e.css("maxWidth")||"",d=e.css("minWidth")||"",a=(c+d).indexOf("%")>-1?g.width()/100:0,c=(c.indexOf("%")>-1?a:1)*parseInt(c,10)||b,d=(d.indexOf("%")>-1?a:1)*parseInt(d,10)||0,b=c+d?Math.min(Math.max(b,d),c):b,e.css(I,Math.round(b)).appendTo(g)),this.drawing=0,this},destroy:function(){this.bgiframe&&this.bgiframe.remove(),this.qtip._unbind([a,this.qtip.tooltip],this._ns)}}),Ab=R.ie6=function(a){return 6===db.ie?new x(a):E},Ab.initialize="render",B.ie6={"^content|style$":function(){this.redraw()}}})}(window,document); -//# sourceMappingURL=jquery.qtip.min.js.map \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/redux.select2.sortable.js b/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/redux.select2.sortable.js deleted file mode 100755 index 896c1adc..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/redux.select2.sortable.js +++ /dev/null @@ -1,152 +0,0 @@ -/** - * jQuery Select2 Sortable - * - enable select2 to be sortable via normal select element - * - * author : Vafour - * modified : Kevin Provance (kprovance) - * inspired by : jQuery Chosen Sortable (https://github.com/mrhenry/jquery-chosen-sortable) - * License : GPL - */ - -(function ($) { - $.fn.extend({ - select2SortableOrder: function () { - var $this = this.filter('[multiple]'); - - $this.each(function () { - var $select = $(this); - - // skip elements not select2-ed - if (typeof ($select.data('select2')) !== 'object') { - return false; - } - - var $select2 = $select.siblings('.select2-container'); - var sorted; - - // Opt group names - var optArr = []; - - $select.find('optgroup').each(function(idx, val) { - optArr.push (val); - }); - - $select.find('option').each(function(idx, val) { - var groupName = $(this).parent('optgroup').prop('label'); - var optVal = this; - - if (groupName === undefined) { - if (this.value !== '' && !this.selected) { - optArr.push (optVal); - } - } - }); - - sorted = $($select2.find('.select2-choices li[class!="select2-search-field"]').map(function () { - if (!this) { - return undefined; - } - - if($(this).data('select2Data') != undefined){ - var id = $(this).data('select2Data').id; - return $select.find('option[value="' + id + '"]')[0]; - } - - - //var id = $(this).data('select2Data').id; - - //return $select.find('option[value="' + id + '"]')[0]; - })); - - sorted.push.apply(sorted, optArr); - - $select.children().remove(); - $select.append(sorted); - }); - - return $this; - }, - - select2Sortable: function () { - var args = Array.prototype.slice.call(arguments, 0); - $this = this.filter('[multiple]'), - validMethods = ['destroy']; - - if (args.length === 0 || typeof (args[0]) === 'object') { - var defaultOptions = { - bindOrder: 'formSubmit', // or sortableStop - sortableOptions: { - placeholder: 'ui-state-highlight', - items: 'li:not(.select2-search-field)', - tolerance: 'pointer' - } - }; - - var options = $.extend(defaultOptions, args[0]); - - // Init select2 only if not already initialized to prevent select2 configuration loss - if (typeof ($this.data('select2')) !== 'object') { - $this.select2(); - } - - $this.each(function () { - var $select = $(this) - var $select2choices = $select.siblings('.select2-container').find('.select2-choices'); - - // Init jQuery UI Sortable - $select2choices.sortable(options.sortableOptions); - - switch (options.bindOrder) { - case 'sortableStop': - // apply options ordering in sortstop event - $select2choices.on("sortstop.select2sortable", function (event, ui) { - $select.select2SortableOrder(); - }); - - $select.on('change', function (e) { - $(this).select2SortableOrder(); - }); - break; - - default: - // apply options ordering in form submit - $select.closest('form').unbind('submit.select2sortable').on('submit.select2sortable', function () { - $select.select2SortableOrder(); - }); - break; - } - }); - } - else if (typeof (args[0] === 'string')) { - if ($.inArray(args[0], validMethods) == -1) { - throw "Unknown method: " + args[0]; - } - - if (args[0] === 'destroy') { - $this.select2SortableDestroy(); - } - } - - return $this; - }, - - select2SortableDestroy: function () { - var $this = this.filter('[multiple]'); - $this.each(function () { - var $select = $(this) - var $select2choices = $select.parent().find('.select2-choices'); - - // unbind form submit event - $select.closest('form').unbind('submit.select2sortable'); - - // unbind sortstop event - $select2choices.unbind("sortstop.select2sortable"); - - // destroy select2Sortable - $select2choices.sortable('destroy'); - }); - - return $this; - } - }); -}(jQuery)); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/redux.select2.sortable.min.js b/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/redux.select2.sortable.min.js deleted file mode 100755 index 5ac74dac..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/redux.select2.sortable.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){a.fn.extend({select2SortableOrder:function(){var b=this.filter("[multiple]");return b.each(function(){var b=a(this);if("object"!=typeof b.data("select2"))return!1;var c,d=b.siblings(".select2-container"),e=[];b.find("optgroup").each(function(a,b){e.push(b)}),b.find("option").each(function(b,c){var d=a(this).parent("optgroup").prop("label"),f=this;void 0===d&&(""===this.value||this.selected||e.push(f))}),c=a(d.find('.select2-choices li[class!="select2-search-field"]').map(function(){if(!this)return void 0;if(void 0!=a(this).data("select2Data")){var c=a(this).data("select2Data").id;return b.find('option[value="'+c+'"]')[0]}})),c.push.apply(c,e),b.children().remove(),b.append(c)}),b},select2Sortable:function(){var b=Array.prototype.slice.call(arguments,0);if($this=this.filter("[multiple]"),validMethods=["destroy"],0===b.length||"object"==typeof b[0]){var c={bindOrder:"formSubmit",sortableOptions:{placeholder:"ui-state-highlight",items:"li:not(.select2-search-field)",tolerance:"pointer"}},d=a.extend(c,b[0]);"object"!=typeof $this.data("select2")&&$this.select2(),$this.each(function(){var b=a(this),c=b.siblings(".select2-container").find(".select2-choices");switch(c.sortable(d.sortableOptions),d.bindOrder){case"sortableStop":c.on("sortstop.select2sortable",function(a,c){b.select2SortableOrder()}),b.on("change",function(b){a(this).select2SortableOrder()});break;default:b.closest("form").unbind("submit.select2sortable").on("submit.select2sortable",function(){b.select2SortableOrder()})}})}else{if(-1==a.inArray(b[0],validMethods))throw"Unknown method: "+b[0];"destroy"===b[0]&&$this.select2SortableDestroy()}return $this},select2SortableDestroy:function(){var b=this.filter("[multiple]");return b.each(function(){var b=a(this),c=b.parent().find(".select2-choices");b.closest("form").unbind("submit.select2sortable"),c.unbind("sortstop.select2sortable"),c.sortable("destroy")}),b}})}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/spectrum/redux-spectrum.js b/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/spectrum/redux-spectrum.js deleted file mode 100755 index 5a303618..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/spectrum/redux-spectrum.js +++ /dev/null @@ -1,2088 +0,0 @@ -// Spectrum Colorpicker v1.3.3 -// https://github.com/bgrins/spectrum -// Author: Brian Grinstead -// License: MIT - -(function (window, $, undefined) { - var defaultOpts = { - - // Callbacks - beforeShow: noop, - move: noop, - change: noop, - show: noop, - hide: noop, - - // Options - color: false, - flat: false, - showInput: false, - allowEmpty: false, - showButtons: true, - clickoutFiresChange: false, - showInitial: false, - showPalette: false, - showPaletteOnly: false, - showSelectionPalette: true, - localStorageKey: false, - appendTo: "body", - maxSelectionSize: 7, - cancelText: "cancel", - chooseText: "choose", - clearText: "Clear Color Selection", - preferredFormat: false, - className: "", // Deprecated - use containerClassName and replacerClassName instead. - containerClassName: "", - replacerClassName: "", - showAlpha: false, - theme: "sp-light", - palette: [["#ffffff", "#000000", "#ff0000", "#ff8000", "#ffff00", "#008000", "#0000ff", "#4b0082", "#9400d3"]], - selectionPalette: [], - disabled: false, - inputText: '' - }, - spectrums = [], - IE = !!/msie/i.exec( window.navigator.userAgent ), - rgbaSupport = (function() { - function contains( str, substr ) { - return !!~('' + str).indexOf(substr); - } - - var elem = document.createElement('div'); - var style = elem.style; - style.cssText = 'background-color:rgba(0,0,0,.5)'; - return contains(style.backgroundColor, 'rgba') || contains(style.backgroundColor, 'hsla'); - })(), - inputTypeColorSupport = (function() { - var colorInput = $("")[0]; - return colorInput.type === "color" && colorInput.value !== "#ffffff"; - })(), - replaceInput = [ - "
    ", - "
    ", - "
    ", - //"
    " + opts.inputText + "
    ", - "
    " - ].join(''), - markup = (function () { - - // IE does not support gradients with multiple stops, so we need to simulate - // that for the rainbow slider with 8 divs that each have a single gradient - var gradientFix = ""; - if (IE) { - for (var i = 1; i <= 6; i++) { - gradientFix += "
    "; - } - } - - return [ - "
    " - ].join(""); - })(); - - function paletteTemplate (p, color, className, tooltipFormat) { - var html = []; - for (var i = 0; i < p.length; i++) { - var current = p[i]; - if(current) { - var tiny = tinycolor(current); - var c = tiny.toHsl().l < 0.5 ? "sp-thumb-el sp-thumb-dark" : "sp-thumb-el sp-thumb-light"; - c += (tinycolor.equals(color, current)) ? " sp-thumb-active" : ""; - - var formattedString = tiny.toString(tooltipFormat || "rgb"); - var swatchStyle = rgbaSupport ? ("background-color:" + tiny.toRgbString()) : "filter:" + tiny.toFilter(); - html.push(''); - } else { - var cls = 'sp-clear-display'; - html.push(''); - } - } - return "
    " + html.join('') + "
    "; - } - - function hideAll() { - for (var i = 0; i < spectrums.length; i++) { - if (spectrums[i]) { - spectrums[i].hide(); - } - } - } - - function instanceOptions(o, callbackContext) { - var opts = $.extend({}, defaultOpts, o); - opts.callbacks = { - 'move': bind(opts.move, callbackContext), - 'change': bind(opts.change, callbackContext), - 'show': bind(opts.show, callbackContext), - 'hide': bind(opts.hide, callbackContext), - 'beforeShow': bind(opts.beforeShow, callbackContext) - }; - - return opts; - } - - function spectrum(element, o) { - - var opts = instanceOptions(o, element), - flat = opts.flat, - showSelectionPalette = opts.showSelectionPalette, - localStorageKey = opts.localStorageKey, - theme = opts.theme, - callbacks = opts.callbacks, - resize = throttle(reflow, 10), - visible = false, - dragWidth = 0, - dragHeight = 0, - dragHelperHeight = 0, - slideHeight = 0, - slideWidth = 0, - alphaWidth = 0, - alphaSlideHelperWidth = 0, - slideHelperHeight = 0, - currentHue = 0, - currentSaturation = 0, - currentValue = 0, - currentAlpha = 1, - palette = [], - paletteArray = [], - paletteLookup = {}, - selectionPalette = opts.selectionPalette.slice(0), - maxSelectionSize = opts.maxSelectionSize, - draggingClass = "sp-dragging", - inputText = opts.inputText, - shiftMovementDirection = null; - - var doc = element.ownerDocument, - body = doc.body, - boundElement = $(element), - disabled = false, - container = $(markup, doc).addClass(theme), - dragger = container.find(".sp-color"), - dragHelper = container.find(".sp-dragger"), - slider = container.find(".sp-hue"), - slideHelper = container.find(".sp-slider"), - alphaSliderInner = container.find(".sp-alpha-inner"), - alphaSlider = container.find(".sp-alpha"), - alphaSlideHelper = container.find(".sp-alpha-handle"), - textInput = container.find(".sp-input"), - paletteContainer = container.find(".sp-palette"), - initialColorContainer = container.find(".sp-initial"), - cancelButton = container.find(".sp-cancel"), - clearButton = container.find(".sp-clear"), - chooseButton = container.find(".sp-choose"), - isInput = boundElement.is("input"), - isInputTypeColor = isInput && inputTypeColorSupport && boundElement.attr("type") === "color", - shouldReplace = isInput && !flat, - replacer = (shouldReplace) ? $(replaceInput).addClass(theme).addClass(opts.className).addClass(opts.replacerClassName) : $([]), - offsetElement = (shouldReplace) ? replacer : boundElement, - previewElement = replacer.find(".sp-preview-inner"), - initialColor = opts.color || (isInput && boundElement.val()), - colorOnShow = false, - preferredFormat = opts.preferredFormat, - currentPreferredFormat = preferredFormat, - clickoutFiresChange = !opts.showButtons || opts.clickoutFiresChange, - isEmpty = !initialColor, - allowEmpty = opts.allowEmpty && !isInputTypeColor; - - if (inputText !== '') { - var x = $(offsetElement).find('div.sp-dd'); - x.text(inputText); - } - - function applyOptions() { - - if (opts.showPaletteOnly) { - opts.showPalette = true; - } - - if (opts.palette) { - palette = opts.palette.slice(0); - paletteArray = $.isArray(palette[0]) ? palette : [palette]; - paletteLookup = {}; - for (var i = 0; i < paletteArray.length; i++) { - for (var j = 0; j < paletteArray[i].length; j++) { - var rgb = tinycolor(paletteArray[i][j]).toRgbString(); - paletteLookup[rgb] = true; - } - } - } - - container.toggleClass("sp-flat", flat); - container.toggleClass("sp-input-disabled", !opts.showInput); - container.toggleClass("sp-alpha-enabled", opts.showAlpha); - container.toggleClass("sp-clear-enabled", allowEmpty); - container.toggleClass("sp-buttons-disabled", !opts.showButtons); - container.toggleClass("sp-palette-disabled", !opts.showPalette); - container.toggleClass("sp-palette-only", opts.showPaletteOnly); - container.toggleClass("sp-initial-disabled", !opts.showInitial); - container.addClass(opts.className).addClass(opts.containerClassName); - - reflow(); - } - - function initialize() { - - if (IE) { - container.find("*:not(input)").attr("unselectable", "on"); - } - - applyOptions(); - - if (shouldReplace) { - boundElement.after(replacer).hide(); - } - - if (!allowEmpty) { - clearButton.hide(); - } - - if (flat) { - boundElement.after(container).hide(); - } - else { - - var appendTo = opts.appendTo === "parent" ? boundElement.parent() : $(opts.appendTo); - if (appendTo.length !== 1) { - appendTo = $("body"); - } - - appendTo.append(container); - } - - updateSelectionPaletteFromStorage(); - - offsetElement.bind("click.spectrum touchstart.spectrum", function (e) { - if (!disabled) { - toggle(); - } - - e.stopPropagation(); - - if (!$(e.target).is("input")) { - e.preventDefault(); - } - }); - - if(boundElement.is(":disabled") || (opts.disabled === true)) { - disable(); - } - - // Prevent clicks from bubbling up to document. This would cause it to be hidden. - container.click(stopPropagation); - - // Handle user typed input - textInput.change(setFromTextInput); - textInput.bind("paste", function () { - setTimeout(setFromTextInput, 1); - }); - textInput.keydown(function (e) { if (e.keyCode == 13) { setFromTextInput(); } }); - - cancelButton.text(opts.cancelText); - cancelButton.bind("click.spectrum", function (e) { - e.stopPropagation(); - e.preventDefault(); - hide("cancel"); - }); - - clearButton.attr("title", opts.clearText); - clearButton.bind("click.spectrum", function (e) { - e.stopPropagation(); - e.preventDefault(); - isEmpty = true; - move(); - - if(flat) { - //for the flat style, this is a change event - updateOriginalInput(true); - } - }); - - chooseButton.text(opts.chooseText); - chooseButton.bind("click.spectrum", function (e) { - e.stopPropagation(); - e.preventDefault(); - - if (isValid()) { - updateOriginalInput(true); - hide(); - } - }); - - draggable(alphaSlider, function (dragX, dragY, e) { - currentAlpha = (dragX / alphaWidth); - isEmpty = false; - if (e.shiftKey) { - currentAlpha = Math.round(currentAlpha * 10) / 10; - } - - move(); - }, dragStart, dragStop); - - draggable(slider, function (dragX, dragY) { - currentHue = parseFloat(dragY / slideHeight); - isEmpty = false; - if (!opts.showAlpha) { - currentAlpha = 1; - } - move(); - }, dragStart, dragStop); - - draggable(dragger, function (dragX, dragY, e) { - - // shift+drag should snap the movement to either the x or y axis. - if (!e.shiftKey) { - shiftMovementDirection = null; - } - else if (!shiftMovementDirection) { - var oldDragX = currentSaturation * dragWidth; - var oldDragY = dragHeight - (currentValue * dragHeight); - var furtherFromX = Math.abs(dragX - oldDragX) > Math.abs(dragY - oldDragY); - - shiftMovementDirection = furtherFromX ? "x" : "y"; - } - - var setSaturation = !shiftMovementDirection || shiftMovementDirection === "x"; - var setValue = !shiftMovementDirection || shiftMovementDirection === "y"; - - if (setSaturation) { - currentSaturation = parseFloat(dragX / dragWidth); - } - if (setValue) { - currentValue = parseFloat((dragHeight - dragY) / dragHeight); - } - - isEmpty = false; - if (!opts.showAlpha) { - currentAlpha = 1; - } - - move(); - - }, dragStart, dragStop); - - if (!!initialColor) { - set(initialColor); - - // In case color was black - update the preview UI and set the format - // since the set function will not run (default color is black). - updateUI(); - currentPreferredFormat = preferredFormat || tinycolor(initialColor).format; - - addColorToSelectionPalette(initialColor); - } - else { - updateUI(); - } - - if (flat) { - show(); - } - - function palletElementClick(e) { - if (e.data && e.data.ignore) { - set($(this).data("color")); - move(); - } - else { - set($(this).data("color")); - move(); - updateOriginalInput(true); - hide(); - } - - return false; - } - - var paletteEvent = IE ? "mousedown.spectrum" : "click.spectrum touchstart.spectrum"; - paletteContainer.delegate(".sp-thumb-el", paletteEvent, palletElementClick); - initialColorContainer.delegate(".sp-thumb-el:nth-child(1)", paletteEvent, { ignore: true }, palletElementClick); - } - - function updateSelectionPaletteFromStorage() { - - if (localStorageKey && window.localStorage) { - - // Migrate old palettes over to new format. May want to remove this eventually. - try { - var oldPalette = window.localStorage[localStorageKey].split(",#"); - if (oldPalette.length > 1) { - delete window.localStorage[localStorageKey]; - $.each(oldPalette, function(i, c) { - addColorToSelectionPalette(c); - }); - } - } - catch(e) { } - - try { - selectionPalette = window.localStorage[localStorageKey].split(";"); - } - catch (e) { } - } - } - - function addColorToSelectionPalette(color) { - if (showSelectionPalette) { - var rgb = tinycolor(color).toRgbString(); - if (!paletteLookup[rgb] && $.inArray(rgb, selectionPalette) === -1) { - selectionPalette.push(rgb); - while(selectionPalette.length > maxSelectionSize) { - selectionPalette.shift(); - } - } - - if (localStorageKey && window.localStorage) { - try { - window.localStorage[localStorageKey] = selectionPalette.join(";"); - } - catch(e) { } - } - } - } - - function getUniqueSelectionPalette() { - var unique = []; - if (opts.showPalette) { - for (i = 0; i < selectionPalette.length; i++) { - var rgb = tinycolor(selectionPalette[i]).toRgbString(); - - if (!paletteLookup[rgb]) { - unique.push(selectionPalette[i]); - } - } - } - - return unique.reverse().slice(0, opts.maxSelectionSize); - } - - function drawPalette() { - - var currentColor = get(); - - var html = $.map(paletteArray, function (palette, i) { - return paletteTemplate(palette, currentColor, "sp-palette-row sp-palette-row-" + i, opts.preferredFormat); - }); - - updateSelectionPaletteFromStorage(); - - if (selectionPalette) { - html.push(paletteTemplate(getUniqueSelectionPalette(), currentColor, "sp-palette-row sp-palette-row-selection", opts.preferredFormat)); - } - - paletteContainer.html(html.join("")); - } - - function drawInitial() { - if (opts.showInitial) { - var initial = colorOnShow; - var current = get(); - initialColorContainer.html(paletteTemplate([initial, current], current, "sp-palette-row-initial", opts.preferredFormat)); - } - } - - function dragStart() { - if (dragHeight <= 0 || dragWidth <= 0 || slideHeight <= 0) { - reflow(); - } - container.addClass(draggingClass); - shiftMovementDirection = null; - boundElement.trigger('dragstart.spectrum', [ get() ]); - } - - function dragStop() { - container.removeClass(draggingClass); - boundElement.trigger('dragstop.spectrum', [ get() ]); - } - - function setFromTextInput() { - - var value = textInput.val(); - - if ((value === null || value === "") && allowEmpty) { - set(null); - updateOriginalInput(true); - } - else { - var tiny = tinycolor(value); - if (tiny.ok) { - set(tiny); - updateOriginalInput(true); - } - else { - textInput.addClass("sp-validation-error"); - } - } - } - - function toggle() { - if (visible) { - hide(); - } - else { - show(); - } - } - - function show() { - var event = $.Event('beforeShow.spectrum'); - - if (visible) { - reflow(); - return; - } - - boundElement.trigger(event, [ get() ]); - - if (callbacks.beforeShow(get()) === false || event.isDefaultPrevented()) { - return; - } - - hideAll(); - visible = true; - - $(doc).bind("click.spectrum", hide); - $(window).bind("resize.spectrum", resize); - replacer.addClass("sp-active"); - container.removeClass("sp-hidden"); - - reflow(); - updateUI(); - - colorOnShow = get(); - - drawInitial(); - callbacks.show(colorOnShow); - boundElement.trigger('show.spectrum', [ colorOnShow ]); - } - - function hide(e) { - - // Return on right click - if (e && e.type == "click" && e.button == 2) { return; } - - // Return if hiding is unnecessary - if (!visible || flat) { return; } - visible = false; - - $(doc).unbind("click.spectrum", hide); - $(window).unbind("resize.spectrum", resize); - - replacer.removeClass("sp-active"); - container.addClass("sp-hidden"); - - var colorHasChanged = !tinycolor.equals(get(), colorOnShow); - - if (colorHasChanged) { - if (clickoutFiresChange && e !== "cancel") { - updateOriginalInput(true); - } - else { - revert(); - } - } - - callbacks.hide(get()); - boundElement.trigger('hide.spectrum', [ get() ]); - } - - function revert() { - set(colorOnShow, true); - } - - function set(color, ignoreFormatChange) { - if (tinycolor.equals(color, get())) { - // Update UI just in case a validation error needs - // to be cleared. - updateUI(); - return; - } - - var newColor, newHsv; - if (!color && allowEmpty) { - isEmpty = true; - } else { - isEmpty = false; - newColor = tinycolor(color); - newHsv = newColor.toHsv(); - - currentHue = (newHsv.h % 360) / 360; - currentSaturation = newHsv.s; - currentValue = newHsv.v; - currentAlpha = newHsv.a; - } - updateUI(); - - if (newColor && newColor.ok && !ignoreFormatChange) { - currentPreferredFormat = preferredFormat || newColor.format; - } - } - - function get(opts) { - opts = opts || { }; - - if (allowEmpty && isEmpty) { - return null; - } - - return tinycolor.fromRatio({ - h: currentHue, - s: currentSaturation, - v: currentValue, - a: Math.round(currentAlpha * 100) / 100 - }, { format: opts.format || currentPreferredFormat }); - } - - function isValid() { - return !textInput.hasClass("sp-validation-error"); - } - - function move() { - updateUI(); - - callbacks.move(get()); - boundElement.trigger('move.spectrum', [ get() ]); - } - - function updateUI() { - - textInput.removeClass("sp-validation-error"); - - updateHelperLocations(); - - // Update dragger background color (gradients take care of saturation and value). - var flatColor = tinycolor.fromRatio({ h: currentHue, s: 1, v: 1 }); - dragger.css("background-color", flatColor.toHexString()); - - // Get a format that alpha will be included in (hex and names ignore alpha) - var format = currentPreferredFormat; - if (currentAlpha < 1 && !(currentAlpha === 0 && format === "name")) { - if (format === "hex" || format === "hex3" || format === "hex6" || format === "name") { - format = "rgb"; - } - } - - var realColor = get({ format: format }), - displayColor = ''; - - //reset background info for preview element - previewElement.removeClass("sp-clear-display"); - previewElement.css('background-color', 'transparent'); - - if (!realColor && allowEmpty) { - // Update the replaced elements background with icon indicating no color selection - previewElement.addClass("sp-clear-display"); - } - else { - var realHex = realColor.toHexString(), - realRgb = realColor.toRgbString(); - - // Update the replaced elements background color (with actual selected color) - if (rgbaSupport || realColor.alpha === 1) { - previewElement.css("background-color", realRgb); - } - else { - previewElement.css("background-color", "transparent"); - previewElement.css("filter", realColor.toFilter()); - } - - if (opts.showAlpha) { - var rgb = realColor.toRgb(); - rgb.a = 0; - var realAlpha = tinycolor(rgb).toRgbString(); - var gradient = "linear-gradient(left, " + realAlpha + ", " + realHex + ")"; - - if (IE) { - alphaSliderInner.css("filter", tinycolor(realAlpha).toFilter({ gradientType: 1 }, realHex)); - } - else { - alphaSliderInner.css("background", "-webkit-" + gradient); - alphaSliderInner.css("background", "-moz-" + gradient); - alphaSliderInner.css("background", "-ms-" + gradient); - // Use current syntax gradient on unprefixed property. - alphaSliderInner.css("background", - "linear-gradient(to right, " + realAlpha + ", " + realHex + ")"); - } - } - - displayColor = realColor.toString(format); - } - - // Update the text entry input as it changes happen - if (opts.showInput) { - textInput.val(displayColor); - } - - if (opts.showPalette) { - drawPalette(); - } - - drawInitial(); - } - - function updateHelperLocations() { - var s = currentSaturation; - var v = currentValue; - - if(allowEmpty && isEmpty) { - //if selected color is empty, hide the helpers - alphaSlideHelper.hide(); - slideHelper.hide(); - dragHelper.hide(); - } - else { - //make sure helpers are visible - alphaSlideHelper.show(); - slideHelper.show(); - dragHelper.show(); - - // Where to show the little circle in that displays your current selected color - var dragX = s * dragWidth; - var dragY = dragHeight - (v * dragHeight); - dragX = Math.max( - -dragHelperHeight, - Math.min(dragWidth - dragHelperHeight, dragX - dragHelperHeight) - ); - dragY = Math.max( - -dragHelperHeight, - Math.min(dragHeight - dragHelperHeight, dragY - dragHelperHeight) - ); - dragHelper.css({ - "top": dragY + "px", - "left": dragX + "px" - }); - - var alphaX = currentAlpha * alphaWidth; - alphaSlideHelper.css({ - "left": (alphaX - (alphaSlideHelperWidth / 2)) + "px" - }); - - // Where to show the bar that displays your current selected hue - var slideY = (currentHue) * slideHeight; - slideHelper.css({ - "top": (slideY - slideHelperHeight) + "px" - }); - } - } - - function updateOriginalInput(fireCallback) { - var color = get(), - displayColor = '', - hasChanged = !tinycolor.equals(color, colorOnShow); - - if (color) { - displayColor = color.toString(currentPreferredFormat); - // Update the selection palette with the current color - addColorToSelectionPalette(color); - } - - if (isInput) { - boundElement.val(displayColor); - } - - colorOnShow = color; - - if (fireCallback && hasChanged) { - callbacks.change(color); - boundElement.trigger('change', [ color ]); - } - } - - function reflow() { - dragWidth = dragger.width(); - dragHeight = dragger.height(); - dragHelperHeight = dragHelper.height(); - slideWidth = slider.width(); - slideHeight = slider.height(); - slideHelperHeight = slideHelper.height(); - alphaWidth = alphaSlider.width(); - alphaSlideHelperWidth = alphaSlideHelper.width(); - - if (!flat) { - container.css("position", "absolute"); - container.offset(getOffset(container, offsetElement)); - } - - updateHelperLocations(); - - if (opts.showPalette) { - drawPalette(); - } - - boundElement.trigger('reflow.spectrum'); - } - - function destroy() { - boundElement.show(); - offsetElement.unbind("click.spectrum touchstart.spectrum"); - container.remove(); - replacer.remove(); - spectrums[spect.id] = null; - } - - function option(optionName, optionValue) { - if (optionName === undefined) { - return $.extend({}, opts); - } - if (optionValue === undefined) { - return opts[optionName]; - } - - opts[optionName] = optionValue; - applyOptions(); - } - - function enable() { - disabled = false; - boundElement.attr("disabled", false); - offsetElement.removeClass("sp-disabled"); - } - - function disable() { - hide(); - disabled = true; - boundElement.attr("disabled", true); - offsetElement.addClass("sp-disabled"); - } - - initialize(); - - var spect = { - show: show, - hide: hide, - toggle: toggle, - reflow: reflow, - option: option, - enable: enable, - disable: disable, - set: function (c) { - set(c); - updateOriginalInput(); - }, - get: get, - destroy: destroy, - container: container - }; - - spect.id = spectrums.push(spect) - 1; - - return spect; - } - - /** - * checkOffset - get the offset below/above and left/right element depending on screen position - * Thanks https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.datepicker.js - */ - function getOffset(picker, input) { - var extraY = 0; - var dpWidth = picker.outerWidth(); - var dpHeight = picker.outerHeight(); - var inputHeight = input.outerHeight(); - var doc = picker[0].ownerDocument; - var docElem = doc.documentElement; - var viewWidth = docElem.clientWidth + $(doc).scrollLeft(); - var viewHeight = docElem.clientHeight + $(doc).scrollTop(); - var offset = input.offset(); - offset.top += inputHeight; - - offset.left -= - Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? - Math.abs(offset.left + dpWidth - viewWidth) : 0); - - offset.top -= - Math.min(offset.top, ((offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? - Math.abs(dpHeight + inputHeight - extraY) : extraY)); - - return offset; - } - - /** - * noop - do nothing - */ - function noop() { - - } - - /** - * stopPropagation - makes the code only doing this a little easier to read in line - */ - function stopPropagation(e) { - e.stopPropagation(); - } - - /** - * Create a function bound to a given object - * Thanks to underscore.js - */ - function bind(func, obj) { - var slice = Array.prototype.slice; - var args = slice.call(arguments, 2); - return function () { - return func.apply(obj, args.concat(slice.call(arguments))); - }; - } - - /** - * Lightweight drag helper. Handles containment within the element, so that - * when dragging, the x is within [0,element.width] and y is within [0,element.height] - */ - function draggable(element, onmove, onstart, onstop) { - onmove = onmove || function () { }; - onstart = onstart || function () { }; - onstop = onstop || function () { }; - var doc = element.ownerDocument || document; - var dragging = false; - var offset = {}; - var maxHeight = 0; - var maxWidth = 0; - var hasTouch = ('ontouchstart' in window); - - var duringDragEvents = {}; - duringDragEvents["selectstart"] = prevent; - duringDragEvents["dragstart"] = prevent; - duringDragEvents["touchmove mousemove"] = move; - duringDragEvents["touchend mouseup"] = stop; - - function prevent(e) { - if (e.stopPropagation) { - e.stopPropagation(); - } - if (e.preventDefault) { - e.preventDefault(); - } - e.returnValue = false; - } - - function move(e) { - if (dragging) { - // Mouseup happened outside of window - if (IE && document.documentMode < 9 && !e.button) { - return stop(); - } - - var touches = e.originalEvent.touches; - var pageX = touches ? touches[0].pageX : e.pageX; - var pageY = touches ? touches[0].pageY : e.pageY; - - var dragX = Math.max(0, Math.min(pageX - offset.left, maxWidth)); - var dragY = Math.max(0, Math.min(pageY - offset.top, maxHeight)); - - if (hasTouch) { - // Stop scrolling in iOS - prevent(e); - } - - onmove.apply(element, [dragX, dragY, e]); - } - } - - function start(e) { - var rightclick = (e.which) ? (e.which == 3) : (e.button == 2); - var touches = e.originalEvent.touches; - - if (!rightclick && !dragging) { - if (onstart.apply(element, arguments) !== false) { - dragging = true; - maxHeight = $(element).height(); - maxWidth = $(element).width(); - offset = $(element).offset(); - - $(doc).bind(duringDragEvents); - $(doc.body).addClass("sp-dragging"); - - if (!hasTouch) { - move(e); - } - - prevent(e); - } - } - } - - function stop() { - if (dragging) { - $(doc).unbind(duringDragEvents); - $(doc.body).removeClass("sp-dragging"); - onstop.apply(element, arguments); - } - dragging = false; - } - - $(element).bind("touchstart mousedown", start); - } - - function throttle(func, wait, debounce) { - var timeout; - return function () { - var context = this, args = arguments; - var throttler = function () { - timeout = null; - func.apply(context, args); - }; - if (debounce) clearTimeout(timeout); - if (debounce || !timeout) timeout = setTimeout(throttler, wait); - }; - } - - function log(){/* jshint -W021 */if(window.console){if(Function.prototype.bind)log=Function.prototype.bind.call(console.log,console);else log=function(){Function.prototype.apply.call(console.log,console,arguments);};log.apply(this,arguments);}} - - /** - * Define a jQuery plugin - */ - var dataID = "spectrum.id"; - $.fn.spectrum = function (opts, extra) { - - if (typeof opts == "string") { - - var returnValue = this; - var args = Array.prototype.slice.call( arguments, 1 ); - - this.each(function () { - var spect = spectrums[$(this).data(dataID)]; - if (spect) { - var method = spect[opts]; - if (!method) { - throw new Error( "Spectrum: no such method: '" + opts + "'" ); - } - - if (opts == "get") { - returnValue = spect.get(); - } - else if (opts == "container") { - returnValue = spect.container; - } - else if (opts == "option") { - returnValue = spect.option.apply(spect, args); - } - else if (opts == "destroy") { - spect.destroy(); - $(this).removeData(dataID); - } - else { - method.apply(spect, args); - } - } - }); - - return returnValue; - } - - // Initializing a new instance of spectrum - return this.spectrum("destroy").each(function () { - var options = $.extend({}, opts, $(this).data()); - var spect = spectrum(this, options); - $(this).data(dataID, spect.id); - }); - }; - - $.fn.spectrum.load = true; - $.fn.spectrum.loadOpts = {}; - $.fn.spectrum.draggable = draggable; - $.fn.spectrum.defaults = defaultOpts; - - $.spectrum = { }; - $.spectrum.localization = { }; - $.spectrum.palettes = { }; - - $.fn.spectrum.processNativeColorInputs = function () { - if (!inputTypeColorSupport) { - $("input[type=color]").spectrum({ - preferredFormat: "hex6" - }); - } - }; - - // TinyColor v0.9.17 - // https://github.com/bgrins/TinyColor - // 2013-08-10, Brian Grinstead, MIT License - - (function() { - - var trimLeft = /^[\s,#]+/, - trimRight = /\s+$/, - tinyCounter = 0, - math = Math, - mathRound = math.round, - mathMin = math.min, - mathMax = math.max, - mathRandom = math.random; - - function tinycolor (color, opts) { - - color = (color) ? color : ''; - opts = opts || { }; - - // If input is already a tinycolor, return itself - if (typeof color == "object" && color.hasOwnProperty("_tc_id")) { - return color; - } - - var rgb = inputToRGB(color); - var r = rgb.r, - g = rgb.g, - b = rgb.b, - a = rgb.a, - roundA = mathRound(100*a) / 100, - format = opts.format || rgb.format; - - // Don't let the range of [0,255] come back in [0,1]. - // Potentially lose a little bit of precision here, but will fix issues where - // .5 gets interpreted as half of the total, instead of half of 1 - // If it was supposed to be 128, this was already taken care of by `inputToRgb` - if (r < 1) { r = mathRound(r); } - if (g < 1) { g = mathRound(g); } - if (b < 1) { b = mathRound(b); } - - return { - ok: rgb.ok, - format: format, - _tc_id: tinyCounter++, - alpha: a, - getAlpha: function() { - return a; - }, - setAlpha: function(value) { - a = boundAlpha(value); - roundA = mathRound(100*a) / 100; - }, - toHsv: function() { - var hsv = rgbToHsv(r, g, b); - return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: a }; - }, - toHsvString: function() { - var hsv = rgbToHsv(r, g, b); - var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100); - return (a == 1) ? - "hsv(" + h + ", " + s + "%, " + v + "%)" : - "hsva(" + h + ", " + s + "%, " + v + "%, "+ roundA + ")"; - }, - toHsl: function() { - var hsl = rgbToHsl(r, g, b); - return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: a }; - }, - toHslString: function() { - var hsl = rgbToHsl(r, g, b); - var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100); - return (a == 1) ? - "hsl(" + h + ", " + s + "%, " + l + "%)" : - "hsla(" + h + ", " + s + "%, " + l + "%, "+ roundA + ")"; - }, - toHex: function(allow3Char) { - return rgbToHex(r, g, b, allow3Char); - }, - toHexString: function(allow3Char) { - return '#' + this.toHex(allow3Char); - }, - toHex8: function() { - return rgbaToHex(r, g, b, a); - }, - toHex8String: function() { - return '#' + this.toHex8(); - }, - toRgb: function() { - return { r: mathRound(r), g: mathRound(g), b: mathRound(b), a: a }; - }, - toRgbString: function() { - return (a == 1) ? - "rgb(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ")" : - "rgba(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ", " + roundA + ")"; - }, - toPercentageRgb: function() { - return { r: mathRound(bound01(r, 255) * 100) + "%", g: mathRound(bound01(g, 255) * 100) + "%", b: mathRound(bound01(b, 255) * 100) + "%", a: a }; - }, - toPercentageRgbString: function() { - return (a == 1) ? - "rgb(" + mathRound(bound01(r, 255) * 100) + "%, " + mathRound(bound01(g, 255) * 100) + "%, " + mathRound(bound01(b, 255) * 100) + "%)" : - "rgba(" + mathRound(bound01(r, 255) * 100) + "%, " + mathRound(bound01(g, 255) * 100) + "%, " + mathRound(bound01(b, 255) * 100) + "%, " + roundA + ")"; - }, - toName: function() { - if (a === 0) { - return "transparent"; - } - - return hexNames[rgbToHex(r, g, b, true)] || false; - }, - toFilter: function(secondColor) { - var hex8String = '#' + rgbaToHex(r, g, b, a); - var secondHex8String = hex8String; - var gradientType = opts && opts.gradientType ? "GradientType = 1, " : ""; - - if (secondColor) { - var s = tinycolor(secondColor); - secondHex8String = s.toHex8String(); - } - - return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")"; - }, - toString: function(format) { - var formatSet = !!format; - format = format || this.format; - - var formattedString = false; - var hasAlphaAndFormatNotSet = !formatSet && a < 1 && a > 0; - var formatWithAlpha = hasAlphaAndFormatNotSet && (format === "hex" || format === "hex6" || format === "hex3" || format === "name"); - - if (format === "rgb") { - formattedString = this.toRgbString(); - } - if (format === "prgb") { - formattedString = this.toPercentageRgbString(); - } - if (format === "hex" || format === "hex6") { - formattedString = this.toHexString(); - } - if (format === "hex3") { - formattedString = this.toHexString(true); - } - if (format === "hex8") { - formattedString = this.toHex8String(); - } - if (format === "name") { - formattedString = this.toName(); - } - if (format === "hsl") { - formattedString = this.toHslString(); - } - if (format === "hsv") { - formattedString = this.toHsvString(); - } - - if (formatWithAlpha) { - return this.toRgbString(); - } - - return formattedString || this.toHexString(); - } - }; - } - - // If input is an object, force 1 into "1.0" to handle ratios properly - // String input requires "1.0" as input, so 1 will be treated as 1 - tinycolor.fromRatio = function(color, opts) { - if (typeof color == "object") { - var newColor = {}; - for (var i in color) { - if (color.hasOwnProperty(i)) { - if (i === "a") { - newColor[i] = color[i]; - } - else { - newColor[i] = convertToPercentage(color[i]); - } - } - } - color = newColor; - } - - return tinycolor(color, opts); - }; - - // Given a string or object, convert that input to RGB - // Possible string inputs: - // - // "red" - // "#f00" or "f00" - // "#ff0000" or "ff0000" - // "#ff000000" or "ff000000" - // "rgb 255 0 0" or "rgb (255, 0, 0)" - // "rgb 1.0 0 0" or "rgb (1, 0, 0)" - // "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1" - // "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1" - // "hsl(0, 100%, 50%)" or "hsl 0 100% 50%" - // "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1" - // "hsv(0, 100%, 100%)" or "hsv 0 100% 100%" - // - function inputToRGB(color) { - - var rgb = { r: 0, g: 0, b: 0 }; - var a = 1; - var ok = false; - var format = false; - - if (typeof color == "string") { - color = stringInputToObject(color); - } - - if (typeof color == "object") { - if (color.hasOwnProperty("r") && color.hasOwnProperty("g") && color.hasOwnProperty("b")) { - rgb = rgbToRgb(color.r, color.g, color.b); - ok = true; - format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb"; - } - else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("v")) { - color.s = convertToPercentage(color.s); - color.v = convertToPercentage(color.v); - rgb = hsvToRgb(color.h, color.s, color.v); - ok = true; - format = "hsv"; - } - else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("l")) { - color.s = convertToPercentage(color.s); - color.l = convertToPercentage(color.l); - rgb = hslToRgb(color.h, color.s, color.l); - ok = true; - format = "hsl"; - } - - if (color.hasOwnProperty("a")) { - a = color.a; - } - } - - a = boundAlpha(a); - - return { - ok: ok, - format: color.format || format, - r: mathMin(255, mathMax(rgb.r, 0)), - g: mathMin(255, mathMax(rgb.g, 0)), - b: mathMin(255, mathMax(rgb.b, 0)), - a: a - }; - } - - - // Conversion Functions - // -------------------- - - // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from: - // - - // `rgbToRgb` - // Handle bounds / percentage checking to conform to CSS color spec - // - // *Assumes:* r, g, b in [0, 255] or [0, 1] - // *Returns:* { r, g, b } in [0, 255] - function rgbToRgb(r, g, b){ - return { - r: bound01(r, 255) * 255, - g: bound01(g, 255) * 255, - b: bound01(b, 255) * 255 - }; - } - - // `rgbToHsl` - // Converts an RGB color value to HSL. - // *Assumes:* r, g, and b are contained in [0, 255] or [0, 1] - // *Returns:* { h, s, l } in [0,1] - function rgbToHsl(r, g, b) { - - r = bound01(r, 255); - g = bound01(g, 255); - b = bound01(b, 255); - - var max = mathMax(r, g, b), min = mathMin(r, g, b); - var h, s, l = (max + min) / 2; - - if(max == min) { - h = s = 0; // achromatic - } - else { - var d = max - min; - s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - switch(max) { - case r: h = (g - b) / d + (g < b ? 6 : 0); break; - case g: h = (b - r) / d + 2; break; - case b: h = (r - g) / d + 4; break; - } - - h /= 6; - } - - return { h: h, s: s, l: l }; - } - - // `hslToRgb` - // Converts an HSL color value to RGB. - // *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100] - // *Returns:* { r, g, b } in the set [0, 255] - function hslToRgb(h, s, l) { - var r, g, b; - - h = bound01(h, 360); - s = bound01(s, 100); - l = bound01(l, 100); - - function hue2rgb(p, q, t) { - if(t < 0) t += 1; - if(t > 1) t -= 1; - if(t < 1/6) return p + (q - p) * 6 * t; - if(t < 1/2) return q; - if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; - return p; - } - - if(s === 0) { - r = g = b = l; // achromatic - } - else { - var q = l < 0.5 ? l * (1 + s) : l + s - l * s; - var p = 2 * l - q; - r = hue2rgb(p, q, h + 1/3); - g = hue2rgb(p, q, h); - b = hue2rgb(p, q, h - 1/3); - } - - return { r: r * 255, g: g * 255, b: b * 255 }; - } - - // `rgbToHsv` - // Converts an RGB color value to HSV - // *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1] - // *Returns:* { h, s, v } in [0,1] - function rgbToHsv(r, g, b) { - - r = bound01(r, 255); - g = bound01(g, 255); - b = bound01(b, 255); - - var max = mathMax(r, g, b), min = mathMin(r, g, b); - var h, s, v = max; - - var d = max - min; - s = max === 0 ? 0 : d / max; - - if(max == min) { - h = 0; // achromatic - } - else { - switch(max) { - case r: h = (g - b) / d + (g < b ? 6 : 0); break; - case g: h = (b - r) / d + 2; break; - case b: h = (r - g) / d + 4; break; - } - h /= 6; - } - return { h: h, s: s, v: v }; - } - - // `hsvToRgb` - // Converts an HSV color value to RGB. - // *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100] - // *Returns:* { r, g, b } in the set [0, 255] - function hsvToRgb(h, s, v) { - - h = bound01(h, 360) * 6; - s = bound01(s, 100); - v = bound01(v, 100); - - var i = math.floor(h), - f = h - i, - p = v * (1 - s), - q = v * (1 - f * s), - t = v * (1 - (1 - f) * s), - mod = i % 6, - r = [v, q, p, p, t, v][mod], - g = [t, v, v, q, p, p][mod], - b = [p, p, t, v, v, q][mod]; - - return { r: r * 255, g: g * 255, b: b * 255 }; - } - - // `rgbToHex` - // Converts an RGB color to hex - // Assumes r, g, and b are contained in the set [0, 255] - // Returns a 3 or 6 character hex - function rgbToHex(r, g, b, allow3Char) { - - var hex = [ - pad2(mathRound(r).toString(16)), - pad2(mathRound(g).toString(16)), - pad2(mathRound(b).toString(16)) - ]; - - // Return a 3 character hex if possible - if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) { - return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0); - } - - return hex.join(""); - } - // `rgbaToHex` - // Converts an RGBA color plus alpha transparency to hex - // Assumes r, g, b and a are contained in the set [0, 255] - // Returns an 8 character hex - function rgbaToHex(r, g, b, a) { - - var hex = [ - pad2(convertDecimalToHex(a)), - pad2(mathRound(r).toString(16)), - pad2(mathRound(g).toString(16)), - pad2(mathRound(b).toString(16)) - ]; - - return hex.join(""); - } - - // `equals` - // Can be called with any tinycolor input - tinycolor.equals = function (color1, color2) { - if (!color1 || !color2) { return false; } - return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString(); - }; - tinycolor.random = function() { - return tinycolor.fromRatio({ - r: mathRandom(), - g: mathRandom(), - b: mathRandom() - }); - }; - - - // Modification Functions - // ---------------------- - // Thanks to less.js for some of the basics here - // - - tinycolor.desaturate = function (color, amount) { - amount = (amount === 0) ? 0 : (amount || 10); - var hsl = tinycolor(color).toHsl(); - hsl.s -= amount / 100; - hsl.s = clamp01(hsl.s); - return tinycolor(hsl); - }; - tinycolor.saturate = function (color, amount) { - amount = (amount === 0) ? 0 : (amount || 10); - var hsl = tinycolor(color).toHsl(); - hsl.s += amount / 100; - hsl.s = clamp01(hsl.s); - return tinycolor(hsl); - }; - tinycolor.greyscale = function(color) { - return tinycolor.desaturate(color, 100); - }; - tinycolor.lighten = function(color, amount) { - amount = (amount === 0) ? 0 : (amount || 10); - var hsl = tinycolor(color).toHsl(); - hsl.l += amount / 100; - hsl.l = clamp01(hsl.l); - return tinycolor(hsl); - }; - tinycolor.darken = function (color, amount) { - amount = (amount === 0) ? 0 : (amount || 10); - var hsl = tinycolor(color).toHsl(); - hsl.l -= amount / 100; - hsl.l = clamp01(hsl.l); - return tinycolor(hsl); - }; - tinycolor.complement = function(color) { - var hsl = tinycolor(color).toHsl(); - hsl.h = (hsl.h + 180) % 360; - return tinycolor(hsl); - }; - - - // Combination Functions - // --------------------- - // Thanks to jQuery xColor for some of the ideas behind these - // - - tinycolor.triad = function(color) { - var hsl = tinycolor(color).toHsl(); - var h = hsl.h; - return [ - tinycolor(color), - tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), - tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l }) - ]; - }; - tinycolor.tetrad = function(color) { - var hsl = tinycolor(color).toHsl(); - var h = hsl.h; - return [ - tinycolor(color), - tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), - tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), - tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l }) - ]; - }; - tinycolor.splitcomplement = function(color) { - var hsl = tinycolor(color).toHsl(); - var h = hsl.h; - return [ - tinycolor(color), - tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}), - tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l}) - ]; - }; - tinycolor.analogous = function(color, results, slices) { - results = results || 6; - slices = slices || 30; - - var hsl = tinycolor(color).toHsl(); - var part = 360 / slices; - var ret = [tinycolor(color)]; - - for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) { - hsl.h = (hsl.h + part) % 360; - ret.push(tinycolor(hsl)); - } - return ret; - }; - tinycolor.monochromatic = function(color, results) { - results = results || 6; - var hsv = tinycolor(color).toHsv(); - var h = hsv.h, s = hsv.s, v = hsv.v; - var ret = []; - var modification = 1 / results; - - while (results--) { - ret.push(tinycolor({ h: h, s: s, v: v})); - v = (v + modification) % 1; - } - - return ret; - }; - - - // Readability Functions - // --------------------- - // - - // `readability` - // Analyze the 2 colors and returns an object with the following properties: - // `brightness`: difference in brightness between the two colors - // `color`: difference in color/hue between the two colors - tinycolor.readability = function(color1, color2) { - var a = tinycolor(color1).toRgb(); - var b = tinycolor(color2).toRgb(); - var brightnessA = (a.r * 299 + a.g * 587 + a.b * 114) / 1000; - var brightnessB = (b.r * 299 + b.g * 587 + b.b * 114) / 1000; - var colorDiff = ( - Math.max(a.r, b.r) - Math.min(a.r, b.r) + - Math.max(a.g, b.g) - Math.min(a.g, b.g) + - Math.max(a.b, b.b) - Math.min(a.b, b.b) - ); - - return { - brightness: Math.abs(brightnessA - brightnessB), - color: colorDiff - }; - }; - - // `readable` - // http://www.w3.org/TR/AERT#color-contrast - // Ensure that foreground and background color combinations provide sufficient contrast. - // *Example* - // tinycolor.readable("#000", "#111") => false - tinycolor.readable = function(color1, color2) { - var readability = tinycolor.readability(color1, color2); - return readability.brightness > 125 && readability.color > 500; - }; - - // `mostReadable` - // Given a base color and a list of possible foreground or background - // colors for that base, returns the most readable color. - // *Example* - // tinycolor.mostReadable("#123", ["#fff", "#000"]) => "#000" - tinycolor.mostReadable = function(baseColor, colorList) { - var bestColor = null; - var bestScore = 0; - var bestIsReadable = false; - for (var i=0; i < colorList.length; i++) { - - // We normalize both around the "acceptable" breaking point, - // but rank brightness constrast higher than hue. - - var readability = tinycolor.readability(baseColor, colorList[i]); - var readable = readability.brightness > 125 && readability.color > 500; - var score = 3 * (readability.brightness / 125) + (readability.color / 500); - - if ((readable && ! bestIsReadable) || - (readable && bestIsReadable && score > bestScore) || - ((! readable) && (! bestIsReadable) && score > bestScore)) { - bestIsReadable = readable; - bestScore = score; - bestColor = tinycolor(colorList[i]); - } - } - return bestColor; - }; - - - // Big List of Colors - // ------------------ - // - var names = tinycolor.names = { - aliceblue: "f0f8ff", - antiquewhite: "faebd7", - aqua: "0ff", - aquamarine: "7fffd4", - azure: "f0ffff", - beige: "f5f5dc", - bisque: "ffe4c4", - black: "000", - blanchedalmond: "ffebcd", - blue: "00f", - blueviolet: "8a2be2", - brown: "a52a2a", - burlywood: "deb887", - burntsienna: "ea7e5d", - cadetblue: "5f9ea0", - chartreuse: "7fff00", - chocolate: "d2691e", - coral: "ff7f50", - cornflowerblue: "6495ed", - cornsilk: "fff8dc", - crimson: "dc143c", - cyan: "0ff", - darkblue: "00008b", - darkcyan: "008b8b", - darkgoldenrod: "b8860b", - darkgray: "a9a9a9", - darkgreen: "006400", - darkgrey: "a9a9a9", - darkkhaki: "bdb76b", - darkmagenta: "8b008b", - darkolivegreen: "556b2f", - darkorange: "ff8c00", - darkorchid: "9932cc", - darkred: "8b0000", - darksalmon: "e9967a", - darkseagreen: "8fbc8f", - darkslateblue: "483d8b", - darkslategray: "2f4f4f", - darkslategrey: "2f4f4f", - darkturquoise: "00ced1", - darkviolet: "9400d3", - deeppink: "ff1493", - deepskyblue: "00bfff", - dimgray: "696969", - dimgrey: "696969", - dodgerblue: "1e90ff", - firebrick: "b22222", - floralwhite: "fffaf0", - forestgreen: "228b22", - fuchsia: "f0f", - gainsboro: "dcdcdc", - ghostwhite: "f8f8ff", - gold: "ffd700", - goldenrod: "daa520", - gray: "808080", - green: "008000", - greenyellow: "adff2f", - grey: "808080", - honeydew: "f0fff0", - hotpink: "ff69b4", - indianred: "cd5c5c", - indigo: "4b0082", - ivory: "fffff0", - khaki: "f0e68c", - lavender: "e6e6fa", - lavenderblush: "fff0f5", - lawngreen: "7cfc00", - lemonchiffon: "fffacd", - lightblue: "add8e6", - lightcoral: "f08080", - lightcyan: "e0ffff", - lightgoldenrodyellow: "fafad2", - lightgray: "d3d3d3", - lightgreen: "90ee90", - lightgrey: "d3d3d3", - lightpink: "ffb6c1", - lightsalmon: "ffa07a", - lightseagreen: "20b2aa", - lightskyblue: "87cefa", - lightslategray: "789", - lightslategrey: "789", - lightsteelblue: "b0c4de", - lightyellow: "ffffe0", - lime: "0f0", - limegreen: "32cd32", - linen: "faf0e6", - magenta: "f0f", - maroon: "800000", - mediumaquamarine: "66cdaa", - mediumblue: "0000cd", - mediumorchid: "ba55d3", - mediumpurple: "9370db", - mediumseagreen: "3cb371", - mediumslateblue: "7b68ee", - mediumspringgreen: "00fa9a", - mediumturquoise: "48d1cc", - mediumvioletred: "c71585", - midnightblue: "191970", - mintcream: "f5fffa", - mistyrose: "ffe4e1", - moccasin: "ffe4b5", - navajowhite: "ffdead", - navy: "000080", - oldlace: "fdf5e6", - olive: "808000", - olivedrab: "6b8e23", - orange: "ffa500", - orangered: "ff4500", - orchid: "da70d6", - palegoldenrod: "eee8aa", - palegreen: "98fb98", - paleturquoise: "afeeee", - palevioletred: "db7093", - papayawhip: "ffefd5", - peachpuff: "ffdab9", - peru: "cd853f", - pink: "ffc0cb", - plum: "dda0dd", - powderblue: "b0e0e6", - purple: "800080", - red: "f00", - rosybrown: "bc8f8f", - royalblue: "4169e1", - saddlebrown: "8b4513", - salmon: "fa8072", - sandybrown: "f4a460", - seagreen: "2e8b57", - seashell: "fff5ee", - sienna: "a0522d", - silver: "c0c0c0", - skyblue: "87ceeb", - slateblue: "6a5acd", - slategray: "708090", - slategrey: "708090", - snow: "fffafa", - springgreen: "00ff7f", - steelblue: "4682b4", - tan: "d2b48c", - teal: "008080", - thistle: "d8bfd8", - tomato: "ff6347", - turquoise: "40e0d0", - violet: "ee82ee", - wheat: "f5deb3", - white: "fff", - whitesmoke: "f5f5f5", - yellow: "ff0", - yellowgreen: "9acd32" - }; - - // Make it easy to access colors via `hexNames[hex]` - var hexNames = tinycolor.hexNames = flip(names); - - - // Utilities - // --------- - - // `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }` - function flip(o) { - var flipped = { }; - for (var i in o) { - if (o.hasOwnProperty(i)) { - flipped[o[i]] = i; - } - } - return flipped; - } - - // Return a valid alpha value [0,1] with all invalid values being set to 1 - function boundAlpha(a) { - a = parseFloat(a); - - if (isNaN(a) || a < 0 || a > 1) { - a = 1; - } - - return a; - } - - // Take input from [0, n] and return it as [0, 1] - function bound01(n, max) { - if (isOnePointZero(n)) { n = "100%"; } - - var processPercent = isPercentage(n); - n = mathMin(max, mathMax(0, parseFloat(n))); - - // Automatically convert percentage into number - if (processPercent) { - n = parseInt(n * max, 10) / 100; - } - - // Handle floating point rounding errors - if ((math.abs(n - max) < 0.000001)) { - return 1; - } - - // Convert into [0, 1] range if it isn't already - return (n % max) / parseFloat(max); - } - - // Force a number between 0 and 1 - function clamp01(val) { - return mathMin(1, mathMax(0, val)); - } - - // Parse a base-16 hex value into a base-10 integer - function parseIntFromHex(val) { - return parseInt(val, 16); - } - - // Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 - // - function isOnePointZero(n) { - return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1; - } - - // Check to see if string passed in is a percentage - function isPercentage(n) { - return typeof n === "string" && n.indexOf('%') != -1; - } - - // Force a hex value to have 2 characters - function pad2(c) { - return c.length == 1 ? '0' + c : '' + c; - } - - // Replace a decimal with it's percentage value - function convertToPercentage(n) { - if (n <= 1) { - n = (n * 100) + "%"; - } - - return n; - } - - // Converts a decimal to a hex value - function convertDecimalToHex(d) { - return Math.round(parseFloat(d) * 255).toString(16); - } - // Converts a hex value to a decimal - function convertHexToDecimal(h) { - return (parseIntFromHex(h) / 255); - } - - var matchers = (function() { - - // - var CSS_INTEGER = "[-\\+]?\\d+%?"; - - // - var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?"; - - // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome. - var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")"; - - // Actual matching. - // Parentheses and commas are optional, but not required. - // Whitespace can take the place of commas or opening paren - var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; - var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; - - return { - rgb: new RegExp("rgb" + PERMISSIVE_MATCH3), - rgba: new RegExp("rgba" + PERMISSIVE_MATCH4), - hsl: new RegExp("hsl" + PERMISSIVE_MATCH3), - hsla: new RegExp("hsla" + PERMISSIVE_MATCH4), - hsv: new RegExp("hsv" + PERMISSIVE_MATCH3), - hex3: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, - hex6: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, - hex8: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ - }; - })(); - - // `stringInputToObject` - // Permissive string parsing. Take in a number of formats, and output an object - // based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}` - function stringInputToObject(color) { - - color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase(); - var named = false; - if (names[color]) { - color = names[color]; - named = true; - } - else if (color == 'transparent') { - return { r: 0, g: 0, b: 0, a: 0, format: "name" }; - } - - // Try to match string input using regular expressions. - // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360] - // Just return an object and let the conversion functions handle that. - // This way the result will be the same whether the tinycolor is initialized with string or object. - var match; - if ((match = matchers.rgb.exec(color))) { - return { r: match[1], g: match[2], b: match[3] }; - } - if ((match = matchers.rgba.exec(color))) { - return { r: match[1], g: match[2], b: match[3], a: match[4] }; - } - if ((match = matchers.hsl.exec(color))) { - return { h: match[1], s: match[2], l: match[3] }; - } - if ((match = matchers.hsla.exec(color))) { - return { h: match[1], s: match[2], l: match[3], a: match[4] }; - } - if ((match = matchers.hsv.exec(color))) { - return { h: match[1], s: match[2], v: match[3] }; - } - if ((match = matchers.hex8.exec(color))) { - return { - a: convertHexToDecimal(match[1]), - r: parseIntFromHex(match[2]), - g: parseIntFromHex(match[3]), - b: parseIntFromHex(match[4]), - format: named ? "name" : "hex8" - }; - } - if ((match = matchers.hex6.exec(color))) { - return { - r: parseIntFromHex(match[1]), - g: parseIntFromHex(match[2]), - b: parseIntFromHex(match[3]), - format: named ? "name" : "hex" - }; - } - if ((match = matchers.hex3.exec(color))) { - return { - r: parseIntFromHex(match[1] + '' + match[1]), - g: parseIntFromHex(match[2] + '' + match[2]), - b: parseIntFromHex(match[3] + '' + match[3]), - format: named ? "name" : "hex" - }; - } - - return false; - } - - // Expose tinycolor to window, does not need to run in non-browser context. - window.tinycolor = tinycolor; - - })(); - - - $(function () { - if ($.fn.spectrum.load) { - $.fn.spectrum.processNativeColorInputs(); - } - }); - -})(window, jQuery); diff --git a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/spectrum/redux-spectrum.min.js b/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/spectrum/redux-spectrum.min.js deleted file mode 100755 index cd1a8138..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/assets/js/vendor/spectrum/redux-spectrum.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a,b,c){function d(a,b,c,d){for(var e=[],f=0;f')}else{var l="sp-clear-display";e.push('')}}return"
    "+e.join("")+"
    "}function e(){for(var a=0;aMath.abs(b-e);sa=f?"x":"y"}}else sa=null;var g=!sa||"x"===sa,h=!sa||"y"===sa;g&&(ia=parseFloat(a/_)),h&&(ja=parseFloat((aa-b)/aa)),Va=!1,T.showAlpha||(ka=1),K()},A,B),Qa?(H(Qa),L(),Ta=Sa||tinycolor(Qa).format,w(Qa)):L(),U&&E();var d=q?"mousedown.spectrum":"click.spectrum touchstart.spectrum";Fa.delegate(".sp-thumb-el",d,a),Ga.delegate(".sp-thumb-el:nth-child(1)",d,{ignore:!0},a)}function v(){if(W&&a.localStorage){try{var c=a.localStorage[W].split(",#");c.length>1&&(delete a.localStorage[W],b.each(c,function(a,b){w(b)}))}catch(d){}try{oa=a.localStorage[W].split(";")}catch(d){}}}function w(c){if(V){var d=tinycolor(c).toRgbString();if(!na[d]&&-1===b.inArray(d,oa))for(oa.push(d);oa.length>pa;)oa.shift();if(W&&a.localStorage)try{a.localStorage[W]=oa.join(";")}catch(e){}}}function x(){var a=[];if(T.showPalette)for(i=0;i=aa||0>=_||0>=ca)&&O(),wa.addClass(qa),sa=null,ua.trigger("dragstart.spectrum",[I()])}function B(){wa.removeClass(qa),ua.trigger("dragstop.spectrum",[I()])}function C(){var a=Ea.val();if(null!==a&&""!==a||!Wa){var b=tinycolor(a);b.ok?(H(b),N(!0)):Ea.addClass("sp-validation-error")}else H(null),N(!0)}function D(){$?F():E()}function E(){var c=b.Event("beforeShow.spectrum");return $?void O():(ua.trigger(c,[I()]),void(Y.beforeShow(I())===!1||c.isDefaultPrevented()||(e(),$=!0,b(ta).bind("click.spectrum",F),b(a).bind("resize.spectrum",Z),Na.addClass("sp-active"),wa.removeClass("sp-hidden"),O(),L(),Ra=I(),z(),Y.show(Ra),ua.trigger("show.spectrum",[Ra]))))}function F(c){if((!c||"click"!=c.type||2!=c.button)&&$&&!U){$=!1,b(ta).unbind("click.spectrum",F),b(a).unbind("resize.spectrum",Z),Na.removeClass("sp-active"),wa.addClass("sp-hidden");var d=!tinycolor.equals(I(),Ra);d&&(Ua&&"cancel"!==c?N(!0):G()),Y.hide(I()),ua.trigger("hide.spectrum",[I()])}}function G(){H(Ra,!0)}function H(a,b){if(tinycolor.equals(a,I()))return void L();var c,d;!a&&Wa?Va=!0:(Va=!1,c=tinycolor(a),d=c.toHsv(),ha=d.h%360/360,ia=d.s,ja=d.v,ka=d.a),L(),c&&c.ok&&!b&&(Ta=Sa||c.format)}function I(a){return a=a||{},Wa&&Va?null:tinycolor.fromRatio({h:ha,s:ia,v:ja,a:Math.round(100*ka)/100},{format:a.format||Ta})}function J(){return!Ea.hasClass("sp-validation-error")}function K(){L(),Y.move(I()),ua.trigger("move.spectrum",[I()])}function L(){Ea.removeClass("sp-validation-error"),M();var a=tinycolor.fromRatio({h:ha,s:1,v:1});xa.css("background-color",a.toHexString());var b=Ta;1>ka&&(0!==ka||"name"!==b)&&("hex"===b||"hex3"===b||"hex6"===b||"name"===b)&&(b="rgb");var c=I({format:b}),d="";if(Pa.removeClass("sp-clear-display"),Pa.css("background-color","transparent"),!c&&Wa)Pa.addClass("sp-clear-display");else{var e=c.toHexString(),f=c.toRgbString();if(r||1===c.alpha?Pa.css("background-color",f):(Pa.css("background-color","transparent"),Pa.css("filter",c.toFilter())),T.showAlpha){var g=c.toRgb();g.a=0;var h=tinycolor(g).toRgbString(),i="linear-gradient(left, "+h+", "+e+")";q?Ba.css("filter",tinycolor(h).toFilter({gradientType:1},e)):(Ba.css("background","-webkit-"+i),Ba.css("background","-moz-"+i),Ba.css("background","-ms-"+i),Ba.css("background","linear-gradient(to right, "+h+", "+e+")"))}d=c.toString(b)}T.showInput&&Ea.val(d),T.showPalette&&y(),z()}function M(){var a=ia,b=ja;if(Wa&&Va)Da.hide(),Aa.hide(),ya.hide();else{Da.show(),Aa.show(),ya.show();var c=a*_,d=aa-b*aa;c=Math.max(-ba,Math.min(_-ba,c-ba)),d=Math.max(-ba,Math.min(aa-ba,d-ba)),ya.css({top:d+"px",left:c+"px"});var e=ka*ea;Da.css({left:e-fa/2+"px"});var f=ha*ca;Aa.css({top:f-ga+"px"})}}function N(a){var b=I(),c="",d=!tinycolor.equals(b,Ra);b&&(c=b.toString(Ta),w(b)),Ka&&ua.val(c),Ra=b,a&&d&&(Y.change(b),ua.trigger("change",[b]))}function O(){_=xa.width(),aa=xa.height(),ba=ya.height(),da=za.width(),ca=za.height(),ga=Aa.height(),ea=Ca.width(),fa=Da.width(),U||(wa.css("position","absolute"),wa.offset(h(wa,Oa))),M(),T.showPalette&&y(),ua.trigger("reflow.spectrum")}function P(){ua.show(),Oa.unbind("click.spectrum touchstart.spectrum"),wa.remove(),Na.remove(),p[Ya.id]=null}function Q(a,d){return a===c?b.extend({},T):d===c?T[a]:(T[a]=d,void l())}function R(){va=!1,ua.attr("disabled",!1),Oa.removeClass("sp-disabled")}function S(){F(),va=!0,ua.attr("disabled",!0),Oa.addClass("sp-disabled")}var T=f(j,g),U=T.flat,V=T.showSelectionPalette,W=T.localStorageKey,X=T.theme,Y=T.callbacks,Z=n(O,10),$=!1,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=1,la=[],ma=[],na={},oa=T.selectionPalette.slice(0),pa=T.maxSelectionSize,qa="sp-dragging",ra=T.inputText,sa=null,ta=g.ownerDocument,ua=(ta.body,b(g)),va=!1,wa=b(u,ta).addClass(X),xa=wa.find(".sp-color"),ya=wa.find(".sp-dragger"),za=wa.find(".sp-hue"),Aa=wa.find(".sp-slider"),Ba=wa.find(".sp-alpha-inner"),Ca=wa.find(".sp-alpha"),Da=wa.find(".sp-alpha-handle"),Ea=wa.find(".sp-input"),Fa=wa.find(".sp-palette"),Ga=wa.find(".sp-initial"),Ha=wa.find(".sp-cancel"),Ia=wa.find(".sp-clear"),Ja=wa.find(".sp-choose"),Ka=ua.is("input"),La=Ka&&s&&"color"===ua.attr("type"),Ma=Ka&&!U,Na=Ma?b(t).addClass(X).addClass(T.className).addClass(T.replacerClassName):b([]),Oa=Ma?Na:ua,Pa=Na.find(".sp-preview-inner"),Qa=T.color||Ka&&ua.val(),Ra=!1,Sa=T.preferredFormat,Ta=Sa,Ua=!T.showButtons||T.clickoutFiresChange,Va=!Qa,Wa=T.allowEmpty&&!La;if(""!==ra){var Xa=b(Oa).find("div.sp-dd");Xa.text(ra)}o();var Ya={show:E,hide:F,toggle:D,reflow:O,option:Q,enable:R,disable:S,set:function(a){H(a),N()},get:I,destroy:P,container:wa};return Ya.id=p.push(Ya)-1,Ya}function h(a,c){var d=0,e=a.outerWidth(),f=a.outerHeight(),g=c.outerHeight(),h=a[0].ownerDocument,i=h.documentElement,j=i.clientWidth+b(h).scrollLeft(),k=i.clientHeight+b(h).scrollTop(),l=c.offset();return l.top+=g,l.left-=Math.min(l.left,l.left+e>j&&j>e?Math.abs(l.left+e-j):0),l.top-=Math.min(l.top,l.top+f>k&&k>f?Math.abs(f+g-d):d),l}function j(){}function k(a){a.stopPropagation()}function l(a,b){var c=Array.prototype.slice,d=c.call(arguments,2);return function(){return a.apply(b,d.concat(c.call(arguments)))}}function m(c,d,e,f){function g(a){a.stopPropagation&&a.stopPropagation(),a.preventDefault&&a.preventDefault(),a.returnValue=!1}function h(a){if(l){if(q&&document.documentMode<9&&!a.button)return j();var b=a.originalEvent.touches,e=b?b[0].pageX:a.pageX,f=b?b[0].pageY:a.pageY,h=Math.max(0,Math.min(e-m.left,o)),i=Math.max(0,Math.min(f-m.top,n));p&&g(a),d.apply(c,[h,i,a])}}function i(a){var d=a.which?3==a.which:2==a.button;a.originalEvent.touches;d||l||e.apply(c,arguments)!==!1&&(l=!0,n=b(c).height(),o=b(c).width(),m=b(c).offset(),b(k).bind(r),b(k.body).addClass("sp-dragging"),p||h(a),g(a))}function j(){l&&(b(k).unbind(r),b(k.body).removeClass("sp-dragging"),f.apply(c,arguments)),l=!1}d=d||function(){},e=e||function(){},f=f||function(){};var k=c.ownerDocument||document,l=!1,m={},n=0,o=0,p="ontouchstart"in a,r={};r.selectstart=g,r.dragstart=g,r["touchmove mousemove"]=h,r["touchend mouseup"]=j,b(c).bind("touchstart mousedown",i)}function n(a,b,c){var d;return function(){var e=this,f=arguments,g=function(){d=null,a.apply(e,f)};c&&clearTimeout(d),(c||!d)&&(d=setTimeout(g,b))}}var o={beforeShow:j,move:j,change:j,show:j,hide:j,color:!1,flat:!1,showInput:!1,allowEmpty:!1,showButtons:!0,clickoutFiresChange:!1,showInitial:!1,showPalette:!1,showPaletteOnly:!1,showSelectionPalette:!0,localStorageKey:!1,appendTo:"body",maxSelectionSize:7,cancelText:"cancel",chooseText:"choose",clearText:"Clear Color Selection",preferredFormat:!1,className:"",containerClassName:"",replacerClassName:"",showAlpha:!1,theme:"sp-light",palette:[["#ffffff","#000000","#ff0000","#ff8000","#ffff00","#008000","#0000ff","#4b0082","#9400d3"]],selectionPalette:[],disabled:!1,inputText:""},p=[],q=!!/msie/i.exec(a.navigator.userAgent),r=function(){function a(a,b){return!!~(""+a).indexOf(b)}var b=document.createElement("div"),c=b.style;return c.cssText="background-color:rgba(0,0,0,.5)",a(c.backgroundColor,"rgba")||a(c.backgroundColor,"hsla")}(),s=function(){var a=b("")[0];return"color"===a.type&&"#ffffff"!==a.value}(),t=["
    ","
    ","
    ","
    "].join(""),u=function(){var a="";if(q)for(var b=1;6>=b;b++)a+="
    ";return["
    ","
    ","
    ","
    ","
    ","
    ","
    ","
    ","
    ","
    ","
    ","
    ","
    ","
    ","
    ","
    ","
    ","
    ","
    ",a,"
    ","
    ","
    ","
    ","
    ","","
    ","
    ","
    ","","","
    ","
    ","
    "].join("")}(),v="spectrum.id";b.fn.spectrum=function(a,c){if("string"==typeof a){var d=this,e=Array.prototype.slice.call(arguments,1);return this.each(function(){var c=p[b(this).data(v)];if(c){var f=c[a];if(!f)throw new Error("Spectrum: no such method: '"+a+"'");"get"==a?d=c.get():"container"==a?d=c.container:"option"==a?d=c.option.apply(c,e):"destroy"==a?(c.destroy(),b(this).removeData(v)):f.apply(c,e)}}),d}return this.spectrum("destroy").each(function(){var c=b.extend({},a,b(this).data()),d=g(this,c);b(this).data(v,d.id)})},b.fn.spectrum.load=!0,b.fn.spectrum.loadOpts={},b.fn.spectrum.draggable=m,b.fn.spectrum.defaults=o,b.spectrum={},b.spectrum.localization={},b.spectrum.palettes={},b.fn.spectrum.processNativeColorInputs=function(){s||b("input[type=color]").spectrum({preferredFormat:"hex6"})},function(){function b(a,d){if(a=a?a:"",d=d||{},"object"==typeof a&&a.hasOwnProperty("_tc_id"))return a;var f=c(a),h=f.r,k=f.g,n=f.b,o=f.a,p=A(100*o)/100,q=d.format||f.format;return 1>h&&(h=A(h)),1>k&&(k=A(k)),1>n&&(n=A(n)),{ok:f.ok,format:q,_tc_id:y++,alpha:o,getAlpha:function(){return o},setAlpha:function(a){o=l(a),p=A(100*o)/100},toHsv:function(){var a=g(h,k,n);return{h:360*a.h,s:a.s,v:a.v,a:o}},toHsvString:function(){var a=g(h,k,n),b=A(360*a.h),c=A(100*a.s),d=A(100*a.v);return 1==o?"hsv("+b+", "+c+"%, "+d+"%)":"hsva("+b+", "+c+"%, "+d+"%, "+p+")"},toHsl:function(){var a=e(h,k,n);return{h:360*a.h,s:a.s,l:a.l,a:o}},toHslString:function(){var a=e(h,k,n),b=A(360*a.h),c=A(100*a.s),d=A(100*a.l);return 1==o?"hsl("+b+", "+c+"%, "+d+"%)":"hsla("+b+", "+c+"%, "+d+"%, "+p+")"},toHex:function(a){return i(h,k,n,a)},toHexString:function(a){return"#"+this.toHex(a)},toHex8:function(){return j(h,k,n,o)},toHex8String:function(){return"#"+this.toHex8()},toRgb:function(){return{r:A(h),g:A(k),b:A(n),a:o}},toRgbString:function(){return 1==o?"rgb("+A(h)+", "+A(k)+", "+A(n)+")":"rgba("+A(h)+", "+A(k)+", "+A(n)+", "+p+")"},toPercentageRgb:function(){return{r:A(100*m(h,255))+"%",g:A(100*m(k,255))+"%",b:A(100*m(n,255))+"%",a:o}},toPercentageRgbString:function(){return 1==o?"rgb("+A(100*m(h,255))+"%, "+A(100*m(k,255))+"%, "+A(100*m(n,255))+"%)":"rgba("+A(100*m(h,255))+"%, "+A(100*m(k,255))+"%, "+A(100*m(n,255))+"%, "+p+")"},toName:function(){return 0===o?"transparent":F[i(h,k,n,!0)]||!1},toFilter:function(a){var c="#"+j(h,k,n,o),e=c,f=d&&d.gradientType?"GradientType = 1, ":"";if(a){var g=b(a);e=g.toHex8String()}return"progid:DXImageTransform.Microsoft.gradient("+f+"startColorstr="+c+",endColorstr="+e+")"},toString:function(a){var b=!!a;a=a||this.format;var c=!1,d=!b&&1>o&&o>0,e=d&&("hex"===a||"hex6"===a||"hex3"===a||"name"===a);return"rgb"===a&&(c=this.toRgbString()),"prgb"===a&&(c=this.toPercentageRgbString()),("hex"===a||"hex6"===a)&&(c=this.toHexString()),"hex3"===a&&(c=this.toHexString(!0)),"hex8"===a&&(c=this.toHex8String()),"name"===a&&(c=this.toName()),"hsl"===a&&(c=this.toHslString()),"hsv"===a&&(c=this.toHsvString()),e?this.toRgbString():c||this.toHexString()}}}function c(a){var b={r:0,g:0,b:0},c=1,e=!1,g=!1;return"string"==typeof a&&(a=v(a)),"object"==typeof a&&(a.hasOwnProperty("r")&&a.hasOwnProperty("g")&&a.hasOwnProperty("b")?(b=d(a.r,a.g,a.b),e=!0,g="%"===String(a.r).substr(-1)?"prgb":"rgb"):a.hasOwnProperty("h")&&a.hasOwnProperty("s")&&a.hasOwnProperty("v")?(a.s=s(a.s),a.v=s(a.v),b=h(a.h,a.s,a.v),e=!0,g="hsv"):a.hasOwnProperty("h")&&a.hasOwnProperty("s")&&a.hasOwnProperty("l")&&(a.s=s(a.s),a.l=s(a.l),b=f(a.h,a.s,a.l),e=!0,g="hsl"),a.hasOwnProperty("a")&&(c=a.a)),c=l(c),{ok:e,format:a.format||g,r:B(255,C(b.r,0)),g:B(255,C(b.g,0)),b:B(255,C(b.b,0)),a:c}}function d(a,b,c){return{r:255*m(a,255),g:255*m(b,255),b:255*m(c,255)}}function e(a,b,c){a=m(a,255),b=m(b,255),c=m(c,255);var d,e,f=C(a,b,c),g=B(a,b,c),h=(f+g)/2;if(f==g)d=e=0;else{var i=f-g;switch(e=h>.5?i/(2-f-g):i/(f+g),f){case a:d=(b-c)/i+(c>b?6:0);break;case b:d=(c-a)/i+2;break;case c:d=(a-b)/i+4}d/=6}return{h:d,s:e,l:h}}function f(a,b,c){function d(a,b,c){return 0>c&&(c+=1),c>1&&(c-=1),1/6>c?a+6*(b-a)*c:.5>c?b:2/3>c?a+(b-a)*(2/3-c)*6:a}var e,f,g;if(a=m(a,360),b=m(b,100),c=m(c,100),0===b)e=f=g=c;else{var h=.5>c?c*(1+b):c+b-c*b,i=2*c-h;e=d(i,h,a+1/3),f=d(i,h,a),g=d(i,h,a-1/3)}return{r:255*e,g:255*f,b:255*g}}function g(a,b,c){a=m(a,255),b=m(b,255),c=m(c,255);var d,e,f=C(a,b,c),g=B(a,b,c),h=f,i=f-g;if(e=0===f?0:i/f,f==g)d=0;else{switch(f){case a:d=(b-c)/i+(c>b?6:0);break;case b:d=(c-a)/i+2;break;case c:d=(a-b)/i+4}d/=6}return{h:d,s:e,v:h}}function h(a,b,c){a=6*m(a,360),b=m(b,100),c=m(c,100);var d=z.floor(a),e=a-d,f=c*(1-b),g=c*(1-e*b),h=c*(1-(1-e)*b),i=d%6,j=[c,g,f,f,h,c][i],k=[h,c,c,g,f,f][i],l=[f,f,h,c,c,g][i];return{r:255*j,g:255*k,b:255*l}}function i(a,b,c,d){var e=[r(A(a).toString(16)),r(A(b).toString(16)),r(A(c).toString(16))];return d&&e[0].charAt(0)==e[0].charAt(1)&&e[1].charAt(0)==e[1].charAt(1)&&e[2].charAt(0)==e[2].charAt(1)?e[0].charAt(0)+e[1].charAt(0)+e[2].charAt(0):e.join("")}function j(a,b,c,d){var e=[r(t(d)),r(A(a).toString(16)),r(A(b).toString(16)),r(A(c).toString(16))];return e.join("")}function k(a){var b={};for(var c in a)a.hasOwnProperty(c)&&(b[a[c]]=c);return b}function l(a){return a=parseFloat(a),(isNaN(a)||0>a||a>1)&&(a=1),a}function m(a,b){p(a)&&(a="100%");var c=q(a);return a=B(b,C(0,parseFloat(a))),c&&(a=parseInt(a*b,10)/100),z.abs(a-b)<1e-6?1:a%b/parseFloat(b)}function n(a){return B(1,C(0,a))}function o(a){return parseInt(a,16)}function p(a){return"string"==typeof a&&-1!=a.indexOf(".")&&1===parseFloat(a)}function q(a){return"string"==typeof a&&-1!=a.indexOf("%")}function r(a){return 1==a.length?"0"+a:""+a}function s(a){return 1>=a&&(a=100*a+"%"),a}function t(a){return Math.round(255*parseFloat(a)).toString(16)}function u(a){return o(a)/255}function v(a){a=a.replace(w,"").replace(x,"").toLowerCase();var b=!1;if(E[a])a=E[a],b=!0;else if("transparent"==a)return{r:0,g:0,b:0,a:0,format:"name"};var c;return(c=G.rgb.exec(a))?{r:c[1],g:c[2],b:c[3]}:(c=G.rgba.exec(a))?{r:c[1],g:c[2],b:c[3],a:c[4]}:(c=G.hsl.exec(a))?{h:c[1],s:c[2],l:c[3]}:(c=G.hsla.exec(a))?{h:c[1],s:c[2],l:c[3],a:c[4]}:(c=G.hsv.exec(a))?{h:c[1],s:c[2],v:c[3]}:(c=G.hex8.exec(a))?{a:u(c[1]),r:o(c[2]),g:o(c[3]),b:o(c[4]),format:b?"name":"hex8"}:(c=G.hex6.exec(a))?{r:o(c[1]),g:o(c[2]),b:o(c[3]),format:b?"name":"hex"}:(c=G.hex3.exec(a))?{r:o(c[1]+""+c[1]),g:o(c[2]+""+c[2]),b:o(c[3]+""+c[3]),format:b?"name":"hex"}:!1}var w=/^[\s,#]+/,x=/\s+$/,y=0,z=Math,A=z.round,B=z.min,C=z.max,D=z.random;b.fromRatio=function(a,c){if("object"==typeof a){var d={};for(var e in a)a.hasOwnProperty(e)&&("a"===e?d[e]=a[e]:d[e]=s(a[e]));a=d}return b(a,c)},b.equals=function(a,c){return a&&c?b(a).toRgbString()==b(c).toRgbString():!1},b.random=function(){return b.fromRatio({r:D(),g:D(),b:D()})},b.desaturate=function(a,c){c=0===c?0:c||10;var d=b(a).toHsl();return d.s-=c/100,d.s=n(d.s),b(d)},b.saturate=function(a,c){c=0===c?0:c||10;var d=b(a).toHsl();return d.s+=c/100,d.s=n(d.s),b(d)},b.greyscale=function(a){return b.desaturate(a,100)},b.lighten=function(a,c){c=0===c?0:c||10;var d=b(a).toHsl();return d.l+=c/100,d.l=n(d.l),b(d)},b.darken=function(a,c){c=0===c?0:c||10;var d=b(a).toHsl();return d.l-=c/100,d.l=n(d.l),b(d)},b.complement=function(a){var c=b(a).toHsl();return c.h=(c.h+180)%360,b(c)},b.triad=function(a){var c=b(a).toHsl(),d=c.h;return[b(a),b({h:(d+120)%360,s:c.s,l:c.l}),b({h:(d+240)%360,s:c.s,l:c.l})]},b.tetrad=function(a){var c=b(a).toHsl(),d=c.h;return[b(a),b({h:(d+90)%360,s:c.s,l:c.l}),b({h:(d+180)%360,s:c.s,l:c.l}),b({h:(d+270)%360,s:c.s,l:c.l})]},b.splitcomplement=function(a){var c=b(a).toHsl(),d=c.h;return[b(a),b({h:(d+72)%360,s:c.s,l:c.l}),b({h:(d+216)%360,s:c.s,l:c.l})]},b.analogous=function(a,c,d){c=c||6,d=d||30;var e=b(a).toHsl(),f=360/d,g=[b(a)];for(e.h=(e.h-(f*c>>1)+720)%360;--c;)e.h=(e.h+f)%360,g.push(b(e));return g},b.monochromatic=function(a,c){c=c||6;for(var d=b(a).toHsv(),e=d.h,f=d.s,g=d.v,h=[],i=1/c;c--;)h.push(b({h:e,s:f,v:g})),g=(g+i)%1;return h},b.readability=function(a,c){var d=b(a).toRgb(),e=b(c).toRgb(),f=(299*d.r+587*d.g+114*d.b)/1e3,g=(299*e.r+587*e.g+114*e.b)/1e3,h=Math.max(d.r,e.r)-Math.min(d.r,e.r)+Math.max(d.g,e.g)-Math.min(d.g,e.g)+Math.max(d.b,e.b)-Math.min(d.b,e.b);return{brightness:Math.abs(f-g),color:h}},b.readable=function(a,c){var d=b.readability(a,c);return d.brightness>125&&d.color>500},b.mostReadable=function(a,c){for(var d=null,e=0,f=!1,g=0;g125&&h.color>500,j=3*(h.brightness/125)+h.color/500;(i&&!f||i&&f&&j>e||!i&&!f&&j>e)&&(f=i,e=j,d=b(c[g]))}return d};var E=b.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},F=b.hexNames=k(E),G=function(){var a="[-\\+]?\\d+%?",b="[-\\+]?\\d*\\.\\d+%?",c="(?:"+b+")|(?:"+a+")",d="[\\s|\\(]+("+c+")[,|\\s]+("+c+")[,|\\s]+("+c+")\\s*\\)?",e="[\\s|\\(]+("+c+")[,|\\s]+("+c+")[,|\\s]+("+c+")[,|\\s]+("+c+")\\s*\\)?";return{rgb:new RegExp("rgb"+d),rgba:new RegExp("rgba"+e),hsl:new RegExp("hsl"+d),hsla:new RegExp("hsla"+e),hsv:new RegExp("hsv"+d),hex3:/^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex8:/^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}}();a.tinycolor=b}(),b(function(){b.fn.spectrum.load&&b.fn.spectrum.processNativeColorInputs()})}(window,jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/core/dashboard.php b/admin/core/lib/ReduxFramework/ReduxCore/core/dashboard.php deleted file mode 100755 index 8b4d8f6a..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/core/dashboard.php +++ /dev/null @@ -1,37 +0,0 @@ -args['opt_name'] ); - - add_action('wp_dashboard_setup', array($this, $fname)); - } - - public function add_redux_dashboard() { - add_meta_box('redux_dashboard_widget', 'Redux Framework News', array($this,'redux_dashboard_widget'), 'dashboard', 'side', 'high'); - } - - public function dat() { - return; - } - - public function redux_dashboard_widget() { - echo '
    '; - wp_widget_rss_output(array( - 'url' => 'http://reduxframework.com/feed/', - 'title' => 'REDUX_NEWS', - 'items' => 3, - 'show_summary' => 1, - 'show_author' => 0, - 'show_date' => 1 - )); - echo '
    '; - } - } - } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/core/enqueue.php b/admin/core/lib/ReduxFramework/ReduxCore/core/enqueue.php deleted file mode 100644 index 9584c1ec..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/core/enqueue.php +++ /dev/null @@ -1,513 +0,0 @@ -parent = $parent; - - Redux_Functions::$_parent = $parent; - } - - public function init() { - $this->min = Redux_Functions::isMin(); - - $this->timestamp = ReduxFramework::$_version; - if ( $this->parent->args['dev_mode'] ) { - $this->timestamp .= '.' . time(); - } - - $this->register_styles(); - $this->register_scripts(); - - add_thickbox(); - - $this->enqueue_fields(); - - add_filter("redux/{$this->parent->args['opt_name']}/localize", array('Redux_Helpers', 'localize')); - - $this->set_localized_data(); - - /** - * action 'redux-enqueue-{opt_name}' - * - * @deprecated - * - * @param object $this ReduxFramework - */ - do_action( "redux-enqueue-{$this->parent->args['opt_name']}", $this->parent ); // REMOVE - - /** - * action 'redux/page/{opt_name}/enqueue' - */ - do_action( "redux/page/{$this->parent->args['opt_name']}/enqueue" ); - } - - private function register_styles() { - - //***************************************************************** - // Redux Admin CSS - //***************************************************************** - wp_enqueue_style( - 'redux-admin-css', - ReduxFramework::$_url . 'assets/css/redux-admin.css', - array(), - $this->timestamp, - 'all' - ); - - //***************************************************************** - // Redux Fields CSS - //***************************************************************** - if ( ! $this->parent->args['dev_mode'] ) { - wp_enqueue_style( - 'redux-fields-css', - ReduxFramework::$_url . 'assets/css/redux-fields.css', - array(), - $this->timestamp, - 'all' - ); - } - - //***************************************************************** - // Select2 CSS - //***************************************************************** - /*Redux_CDN::register_style( - 'select2-css', - '//cdn.jsdelivr.net/select2/3.5.2/select2.css', - array(), - '3.5.2',//$this->timestamp, - 'all' - );*/ - - //***************************************************************** - // Spectrum CSS - //***************************************************************** - $css_file = 'redux-spectrum.min.css'; - if ($this->parent->args['dev_mode']) { - $css_file = 'redux-spectrum.css'; - } - - wp_register_style( - 'redux-spectrum-css', - ReduxFramework::$_url . 'assets/css/vendor/spectrum/' . $css_file, - array(), - '1.3.3', - 'all' - ); - - //***************************************************************** - // Elusive Icon CSS - //***************************************************************** - wp_enqueue_style( - 'redux-elusive-icon', - ReduxFramework::$_url . 'assets/css/vendor/elusive-icons/elusive-icons.css', - array(), - $this->timestamp, - 'all' - ); - - //***************************************************************** - // QTip CSS - //***************************************************************** - $css_file = 'jquery.qtip.min.css'; - if ($this->parent->args['dev_mode']) { - $css_file = 'jquery.qtip.css'; - } - - wp_enqueue_style( - 'qtip-css', - ReduxFramework::$_url . 'assets/css/vendor/qtip/' . $css_file, - array(), - '2.2.0', - 'all' - ); - - //***************************************************************** - // JQuery UI CSS - //***************************************************************** - wp_enqueue_style( - 'jquery-ui-css', - apply_filters( "redux/page/{$this->parent->args['opt_name']}/enqueue/jquery-ui-css", ReduxFramework::$_url . 'assets/css/vendor/jquery-ui-bootstrap/jquery-ui-1.10.0.custom.css' ), - array(), - $this->timestamp, - 'all' - ); - - //***************************************************************** - // Iris CSS - //***************************************************************** - wp_enqueue_style( 'wp-color-picker' ); - - if ( $this->parent->args['dev_mode'] ) { - - //***************************************************************** - // Color Picker CSS - //***************************************************************** - wp_register_style( - 'redux-color-picker-css', - ReduxFramework::$_url . 'assets/css/color-picker/color-picker.css', - array( 'wp-color-picker' ), - $this->timestamp, - 'all' - ); - - //***************************************************************** - // Media CSS - //***************************************************************** - wp_enqueue_style( - 'redux-field-media-css', - ReduxFramework::$_url . 'assets/css/media/media.css', - array(), - time(), - 'all' - ); - } - - //***************************************************************** - // RTL CSS - //***************************************************************** - if ( is_rtl() ) { - wp_enqueue_style( - 'redux-rtl-css', - ReduxFramework::$_url . 'assets/css/rtl.css', - array( 'redux-admin-css' ), - $this->timestamp, - 'all' - ); - } - - } - - private function register_scripts() { - //***************************************************************** - // JQuery / JQuery UI JS - //***************************************************************** - wp_enqueue_script( 'jquery' ); - wp_enqueue_script( 'jquery-ui-core' ); - wp_enqueue_script( 'jquery-ui-dialog' ); - - //***************************************************************** - // Select2 Sortable JS - //***************************************************************** - wp_register_script( - 'redux-select2-sortable-js', - ReduxFramework::$_url . 'assets/js/vendor/redux.select2.sortable' . $this->min . '.js', - array( 'jquery' ), - $this->timestamp, - true - ); - - //***************************************************************** - // Select2 JS - //***************************************************************** - - // JWp6 plugin giving us problems. They need to update. - if ( wp_script_is ( 'jquerySelect2' )) { - wp_deregister_script( 'jquerySelect2' ); - wp_dequeue_script('jquerySelect2'); - wp_dequeue_style('jquerySelect2Style'); - } - - - /*Redux_CDN::register_script( - 'select2-js', - '//cdn.jsdelivr.net/select2/4.0.2/js/select2.full.min.js', - array( 'jquery', 'redux-select2-sortable-js' ), - '4.0.2', - true - );*/ - - //***************************************************************** - // QTip JS - //***************************************************************** - $js_file = 'jquery.qtip.min.js'; - if ($this->parent->args['dev_mode']) { - $js_file = 'jquery.qtip.js'; - } - - wp_enqueue_script( - 'qtip-js', - ReduxFramework::$_url . 'assets/js/vendor/qtip/' . $js_file, - array( 'jquery' ), - '2.2.0', - true - ); - - //***************************************************************** - // Spectrum JS - //***************************************************************** - $js_file = 'redux-spectrum.min.js'; - if ($this->parent->args['dev_mode']) { - $js_file = 'redux-spectrum.js'; - } - - wp_register_script( - 'redux-spectrum-js', - ReduxFramework::$_url . 'assets/js/vendor/spectrum/' . $js_file, - array( 'jquery' ), - '1.3.3', - true - ); - - $depArray = array( 'jquery' ); - - //***************************************************************** - // Vendor JS - //***************************************************************** - if ( $this->parent->args['dev_mode'] ) { - wp_register_script( - 'redux-vendor', - ReduxFramework::$_url . 'assets/js/vendor.min.js', - array( 'jquery' ), - $this->timestamp, - true - ); - - array_push( $depArray, 'redux-vendor' ); - } - - //***************************************************************** - // Redux JS - //***************************************************************** - wp_register_script( - 'redux-js', - ReduxFramework::$_url . 'assets/js/redux' . $this->min . '.js', - $depArray, - $this->timestamp, - true - ); - - wp_enqueue_script( - 'webfontloader', - 'https://ajax.googleapis.com/ajax/libs/webfont/1.5.0/webfont.js', - array( 'jquery' ), - '1.5.0', - true - ); - } - - public function _enqueue_field($field) { - // TODO AFTER GROUP WORKS - Revert IF below - // if( isset( $field['type'] ) && $field['type'] != 'callback' ) { - if ( isset( $field['type'] ) && $field['type'] != 'callback' ) { - - $field_class = 'ReduxFramework_' . $field['type']; - - /** - * Field class file - * filter 'redux/{opt_name}/field/class/{field.type} - * - * @param string field class file path - * @param array $field field config data - */ - $class_file = apply_filters( "redux/{$this->parent->args['opt_name']}/field/class/{$field['type']}", ReduxFramework::$_dir . "inc/fields/{$field['type']}/field_{$field['type']}.php", $field ); - if ( $class_file ) { - if ( ! class_exists( $field_class ) ) { - if ( file_exists( $class_file ) ) { - require_once $class_file; - } - } - - if ( ( method_exists( $field_class, 'enqueue' ) ) || method_exists( $field_class, 'localize' ) ) { - - if ( ! isset( $this->parent->options[ $field['id'] ] ) ) { - $this->parent->options[ $field['id'] ] = ""; - } - $theField = new $field_class( $field, $this->parent->options[ $field['id'] ], $this->parent ); - - // Move dev_mode check to a new if/then block - if ( ! wp_script_is( 'redux-field-' . $field['type'] . '-js', 'enqueued' ) && class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) { - $theField->enqueue(); - } - - if ( method_exists( $field_class, 'localize' ) ) { - $params = $theField->localize( $field ); - if ( ! isset( $this->parent->localize_data[ $field['type'] ] ) ) { - $this->parent->localize_data[ $field['type'] ] = array(); - } - $this->parent->localize_data[ $field['type'] ][ $field['id'] ] = $theField->localize( $field ); - } - - unset( $theField ); - } - } - } - } - - private function enqueue_fields() { - foreach ( $this->parent->sections as $section ) { - if ( isset( $section['fields'] ) ) { - foreach ( $section['fields'] as $field ) { - $this->_enqueue_field( $field ); - } - } - } - } - - public function get_warnings_and_errors_array() { - // Construct the errors array. - if ( isset( $this->parent->transients['last_save_mode'] ) && ! empty( $this->parent->transients['notices']['errors'] ) ) { - $theTotal = 0; - $theErrors = array(); - - foreach ( $this->parent->transients['notices']['errors'] as $error ) { - $theErrors[ $error['section_id'] ]['errors'][] = $error; - - if ( ! isset( $theErrors[ $error['section_id'] ]['total'] ) ) { - $theErrors[ $error['section_id'] ]['total'] = 0; - } - - $theErrors[ $error['section_id'] ]['total'] ++; - $theTotal ++; - } - - $this->parent->localize_data['errors'] = array( 'total' => $theTotal, 'errors' => $theErrors ); - unset( $this->parent->transients['notices']['errors'] ); - } - - // Construct the warnings array. - if ( isset( $this->parent->transients['last_save_mode'] ) && ! empty( $this->parent->transients['notices']['warnings'] ) ) { - $theTotal = 0; - $theWarnings = array(); - - foreach ( $this->parent->transients['notices']['warnings'] as $warning ) { - $theWarnings[ $warning['section_id'] ]['warnings'][] = $warning; - - if ( ! isset( $theWarnings[ $warning['section_id'] ]['total'] ) ) { - $theWarnings[ $warning['section_id'] ]['total'] = 0; - } - - $theWarnings[ $warning['section_id'] ]['total'] ++; - $theTotal ++; - } - - unset( $this->parent->transients['notices']['warnings'] ); - $this->parent->localize_data['warnings'] = array( - 'total' => $theTotal, - 'warnings' => $theWarnings - ); - } - - if ( empty( $this->parent->transients['notices'] ) ) { - unset( $this->parent->transients['notices'] ); - } - } - - private function set_localized_data() { - if (!empty($this->parent->args['last_tab'])) { - $this->parent->localize_data['last_tab'] = $this->parent->args['last_tab']; - } - - $this->parent->localize_data['required'] = $this->parent->required; - $this->parent->localize_data['fonts'] = $this->parent->fonts; - $this->parent->localize_data['required_child'] = $this->parent->required_child; - $this->parent->localize_data['fields'] = $this->parent->fields; - - if ( isset( $this->parent->font_groups['google'] ) ) { - $this->parent->localize_data['googlefonts'] = $this->parent->font_groups['google']; - } - - if ( isset( $this->parent->font_groups['std'] ) ) { - $this->parent->localize_data['stdfonts'] = $this->parent->font_groups['std']; - } - - if ( isset( $this->parent->font_groups['customfonts'] ) ) { - $this->parent->localize_data['customfonts'] = $this->parent->font_groups['customfonts']; - } - - $this->parent->localize_data['folds'] = $this->parent->folds; - - // Make sure the children are all hidden properly. - foreach ( $this->parent->fields as $key => $value ) { - if ( in_array( $key, $this->parent->fieldsHidden ) ) { - foreach ( $value as $k => $v ) { - if ( ! in_array( $k, $this->parent->fieldsHidden ) ) { - $this->parent->fieldsHidden[] = $k; - $this->parent->folds[ $k ] = "hide"; - } - } - } - } - - - - $this->parent->localize_data['fieldsHidden'] = $this->parent->fieldsHidden; - $this->parent->localize_data['options'] = $this->parent->options; - $this->parent->localize_data['defaults'] = $this->parent->options_defaults; - - /** - * Save pending string - * filter 'redux/{opt_name}/localize/save_pending - * - * @param string save_pending string - */ - $save_pending = apply_filters( "redux/{$this->parent->args['opt_name']}/localize/save_pending", __( 'You have changes that are not saved. Would you like to save them now?', 'redux-framework' ) ); - - /** - * Reset all string - * filter 'redux/{opt_name}/localize/reset - * - * @param string reset all string - */ - $reset_all = apply_filters( "redux/{$this->parent->args['opt_name']}/localize/reset", __( 'Are you sure? Resetting will lose all custom values.', 'redux-framework' ) ); - - /** - * Reset section string - * filter 'redux/{opt_name}/localize/reset_section - * - * @param string reset section string - */ - $reset_section = apply_filters( "redux/{$this->parent->args['opt_name']}/localize/reset_section", __( 'Are you sure? Resetting will lose all custom values in this section.', 'redux-framework' ) ); - - /** - * Preset confirm string - * filter 'redux/{opt_name}/localize/preset - * - * @param string preset confirm string - */ - $preset_confirm = apply_filters( "redux/{$this->parent->args['opt_name']}/localize/preset", __( 'Your current options will be replaced with the values of this preset. Would you like to proceed?', 'redux-framework' ) ); - global $pagenow; - $this->parent->localize_data['args'] = array( - 'save_pending' => $save_pending, - 'reset_confirm' => $reset_all, - 'reset_section_confirm' => $reset_section, - 'preset_confirm' => $preset_confirm, - 'please_wait' => __( 'Please Wait', 'redux-framework' ), - 'opt_name' => $this->parent->args['opt_name'], - 'slug' => $this->parent->args['page_slug'], - 'hints' => $this->parent->args['hints'], - 'disable_save_warn' => $this->parent->args['disable_save_warn'], - 'class' => $this->parent->args['class'], - 'ajax_save' => $this->parent->args['ajax_save'], - 'menu_search' => $pagenow . '?page=' . $this->parent->args['page_slug'] . "&tab=" - ); - - $this->parent->localize_data['ajax'] = array( - 'console' => __( 'There was an error saving. Here is the result of your action:', 'redux-framework' ), - 'alert' => __( 'There was a problem with your action. Please try again or reload the page.', 'redux-framework' ), - ); - - $this->parent->localize_data = apply_filters( "redux/{$this->parent->args['opt_name']}/localize", $this->parent->localize_data ); - - $this->get_warnings_and_errors_array(); - - wp_localize_script( - 'redux-js', - 'redux', - $this->parent->localize_data - ); - - wp_enqueue_script( 'redux-js' ); // Enque the JS now - - } - } - } \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/core/newsflash.php b/admin/core/lib/ReduxFramework/ReduxCore/core/newsflash.php deleted file mode 100755 index 3e3625d1..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/core/newsflash.php +++ /dev/null @@ -1,124 +0,0 @@ -parent = $parent; - - if ( ! is_admin() ) { - return; - } - - $this->server_file = $params['server_file']; - $this->interval = isset( $params['interval'] ) ? $params['interval'] : 3; - $this->cookie_id = isset( $params['cookie_id'] ) ? $params['cookie_id'] : $parent->args['opt_name'] . '_blast'; - - $this->notice_data = get_option( 'r_notice_data', '' ); - - $fname = Redux_Functions::bub( 'get_notice_json', $parent->args['opt_name'] ); - $mname = Redux_Functions::yo( 'display_message', $parent->args['opt_name'] ); - - // if notice data is empty - if ( empty( $this->notice_data ) ) { - // get notice data from server and create cache data - $this->$fname(); - } else { - // check expiry time - if ( ! isset( $_COOKIE[ $this->cookie_id ] ) ) { - // expired! get notice data from server - $this->$fname(); - } - } - - // set the admin notice msg - $this->$mname(); - } - - private function bub() { - $this->notice_data = ''; - } - - private function get_notice_json() { - - // get notice data from server - - $data = @wp_remote_get( $this->server_file, array( 'sslverify' => false ) ); - if ( isset( $data ) && ! empty( $data ) && ! is_wp_error( $data ) && $data['response']['code'] == 200 ) { - $data = $data['body']; - // if some data exists - if ( $data != '' || ! empty( $data ) ) { - - if ( ! empty( $this->notice_data ) ) { - if ( strcmp( $data, $this->notice_data ) == 0 ) { - // set new cookie for interval value - Redux_Functions::setCookie( $this->cookie_id, time(), time() + ( 86400 * $this->interval ), '/' ); - - // bail out - return; - } - } - - update_option( 'r_notice_data', $data ); - $this->notice_data = $data; - - // set cookie for three day expiry - setcookie( $this->cookie_id, time(), time() + ( 86400 * $this->interval ), '/' ); - - // set unique key for dismiss meta key - update_option( $this->cookie_id, time() ); - } - } - } - - private function display_message() { - // Notice data exists? - if ( ! empty( $this->notice_data ) ) { - // decode json string - $data = (Array) json_decode( $this->notice_data ); - // must be array and not empty - if ( is_array( $data ) && ! empty( $data ) ) { - - // No message means nothing to display. - if ( ! isset( $data['message'] ) || $data['message'] == '' || empty( $data['message'] ) ) { - return; - } - - // validate data - $data['type'] = isset( $data['type'] ) && $data['type'] != '' ? $data['type'] : 'updated'; - $data['title'] = isset( $data['title'] ) && $data['title'] != '' ? $data['title'] : ''; - - if ( $data['type'] == 'redux-message' ) { - $data['type'] = 'updated redux-message'; - } - - $data['color'] = isset( $data['color'] ) ? $data['color'] : '#00A2E3'; - - // get unique meta key - $key = get_option( $this->cookie_id ); - - // set admin notice array - $this->parent->admin_notices[] = array( - 'type' => $data['type'], - 'msg' => $data['title'] . $data['message'], - 'id' => $this->cookie_id . '_' . $key, - 'dismiss' => true, - 'color' => $data['color'] - ); - } - } - } - } - } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/core/panel.php b/admin/core/lib/ReduxFramework/ReduxCore/core/panel.php deleted file mode 100755 index 7051e1f1..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/core/panel.php +++ /dev/null @@ -1,332 +0,0 @@ -parent = $parent; - Redux_Functions::$_parent = $parent; - $this->template_path = $this->original_path = ReduxFramework::$_dir . 'templates/panel/'; - if ( ! empty( $this->parent->args['templates_path'] ) ) { - $this->template_path = trailingslashit( $this->parent->args['templates_path'] ); - } - $this->template_path = trailingslashit( apply_filters( "redux/{$this->parent->args['opt_name']}/panel/templates_path", $this->template_path ) ); - } - - public function init() { - $this->panel_template(); - } - - - /** - * Loads the panel templates where needed and provides the container for Redux - */ - private function panel_template() { - - if ( $this->parent->args['dev_mode'] ) { - $this->template_file_check_notice(); - } - - /** - * action 'redux/{opt_name}/panel/before' - */ - do_action( "redux/{$this->parent->args['opt_name']}/panel/before" ); - - echo '

    '; // Stupid hack for Wordpress alerts and warnings - - echo '
    '; - echo '
    '; - - // Do we support JS? - echo ''; - - // Security is vital! - echo ''; - - /** - * action 'redux-page-before-form-{opt_name}' - * - * @deprecated - */ - do_action( "redux-page-before-form-{$this->parent->args['opt_name']}" ); // Remove - - /** - * action 'redux/page/{opt_name}/form/before' - * - * @param object $this ReduxFramework - */ - do_action( "redux/page/{$this->parent->args['opt_name']}/form/before", $this ); - - $this->get_template( 'container.tpl.php' ); - - /** - * action 'redux-page-after-form-{opt_name}' - * - * @deprecated - */ - do_action( "redux-page-after-form-{$this->parent->args['opt_name']}" ); // REMOVE - - /** - * action 'redux/page/{opt_name}/form/after' - * - * @param object $this ReduxFramework - */ - do_action( "redux/page/{$this->parent->args['opt_name']}/form/after", $this ); - echo '
    '; - echo '
    '; - - if ( $this->parent->args['dev_mode'] == true ) { - if ( current_user_can( 'administrator' ) ) { - global $wpdb; - echo "
    ";
    -                        print_r( $wpdb->queries );
    -                        echo "
    "; - } - - echo '
    ' . get_num_queries() . ' queries in ' . timer_stop( 0 ) . ' seconds
    Redux is currently set to developer mode.
    '; - } - - /** - * action 'redux/{opt_name}/panel/after' - */ - do_action( "redux/{$this->parent->args['opt_name']}/panel/after" ); - - } - - - /** - * Calls the various notification bars and sets the appropriate templates. - */ - function notification_bar() { - - if ( isset( $this->parent->transients['last_save_mode'] ) ) { - - if ( $this->parent->transients['last_save_mode'] == "import" ) { - /** - * action 'redux/options/{opt_name}/import' - * - * @param object $this ReduxFramework - */ - do_action( "redux/options/{$this->parent->args['opt_name']}/import", $this, $this->parent->transients['changed_values'] ); - - /** - * filter 'redux-imported-text-{opt_name}' - * - * @param string translated "settings imported" text - */ - echo '
    ' . apply_filters( "redux-imported-text-{$this->parent->args['opt_name']}", __( 'Settings Imported!', 'redux-framework' ) ) . '
    '; - //exit(); - } else if ( $this->parent->transients['last_save_mode'] == "defaults" ) { - /** - * action 'redux/options/{opt_name}/reset' - * - * @param object $this ReduxFramework - */ - do_action( "redux/options/{$this->parent->args['opt_name']}/reset", $this ); - - /** - * filter 'redux-defaults-text-{opt_name}' - * - * @param string translated "settings imported" text - */ - echo '
    ' . apply_filters( "redux-defaults-text-{$this->parent->args['opt_name']}", __( 'All Defaults Restored!', 'redux-framework' ) ) . '
    '; - } else if ( $this->parent->transients['last_save_mode'] == "defaults_section" ) { - /** - * action 'redux/options/{opt_name}/section/reset' - * - * @param object $this ReduxFramework - */ - do_action( "redux/options/{$this->parent->args['opt_name']}/section/reset", $this ); - - /** - * filter 'redux-defaults-section-text-{opt_name}' - * - * @param string translated "settings imported" text - */ - echo '
    ' . apply_filters( "redux-defaults-section-text-{$this->parent->args['opt_name']}", __( 'Section Defaults Restored!', 'redux-framework' ) ) . '
    '; - } else if ( $this->parent->transients['last_save_mode'] == "normal" ) { - /** - * action 'redux/options/{opt_name}/saved' - * - * @param mixed $value set/saved option value - */ - do_action( "redux/options/{$this->parent->args['opt_name']}/saved", $this->parent->options, $this->parent->transients['changed_values'] ); - - /** - * filter 'redux-saved-text-{opt_name}' - * - * @param string translated "settings saved" text - */ - echo '
    ' . apply_filters( "redux-saved-text-{$this->parent->args['opt_name']}", ''.__( 'Settings Saved!', 'redux-framework' ) ).'' . '
    '; - } - - unset( $this->parent->transients['last_save_mode'] ); - //$this->parent->transients['last_save_mode'] = 'remove'; - $this->parent->set_transients(); - } - - /** - * action 'redux/options/{opt_name}/settings/changes' - * - * @param mixed $value set/saved option value - */ - do_action( "redux/options/{$this->parent->args['opt_name']}/settings/change", $this->parent->options, $this->parent->transients['changed_values'] ); - - /** - * filter 'redux-changed-text-{opt_name}' - * - * @param string translated "settings have changed" text - */ - echo '
    ' . apply_filters( "redux-changed-text-{$this->parent->args['opt_name']}", __( 'Settings have changed, you should save them!', 'redux-framework' ) ) . '
    '; - - /** - * action 'redux/options/{opt_name}/errors' - * - * @param array $this ->errors error information - */ - do_action( "redux/options/{$this->parent->args['opt_name']}/errors", $this->parent->errors ); - echo '
    ' . __( 'error(s) were found!', 'redux-framework' ) . '
    '; - - /** - * action 'redux/options/{opt_name}/warnings' - * - * @param array $this ->warnings warning information - */ - do_action( "redux/options/{$this->parent->args['opt_name']}/warnings", $this->parent->warnings ); - echo '
    ' . __( 'warning(s) were found!', 'redux-framework' ) . '
    '; - - } - - /** - * Used to intitialize the settings fields for this panel. Required for saving and redirect. - */ - function init_settings_fields() { - // Must run or the page won't redirect properly - settings_fields( "{$this->parent->args['opt_name']}_group" ); - } - - - /** - * Used to select the proper template. If it doesn't exist in the path, then the original template file is used. - * - * @param $file - */ - function get_template( $file ) { - - if ( empty( $file ) ) { - return; - } - - if ( file_exists( $this->template_path . $file ) ) { - $path = $this->template_path . $file; - } else { - $path = $this->original_path . $file; - } - - do_action( "redux/{$this->parent->args['opt_name']}/panel/template/" . $file . '/before' ); - $path = apply_filters( "redux/{$this->parent->args['opt_name']}/panel/template/" . $file, $path ); - do_action( "redux/{$this->parent->args['opt_name']}/panel/template/" . $file . '/after' ); - - require $path; - - } - - /** - * Scan the template files - * - * @param string $template_path - * - * @return array - */ - public function scan_template_files( $template_path ) { - $files = scandir( $template_path ); - $result = array(); - if ( $files ) { - foreach ( $files as $key => $value ) { - if ( ! in_array( $value, array( ".", ".." ) ) ) { - if ( is_dir( $template_path . DIRECTORY_SEPARATOR . $value ) ) { - $sub_files = self::scan_template_files( $template_path . DIRECTORY_SEPARATOR . $value ); - foreach ( $sub_files as $sub_file ) { - $result[] = $value . DIRECTORY_SEPARATOR . $sub_file; - } - } else { - $result[] = $value; - } - } - } - } - - return $result; - } - - /** - * Show a notice highlighting bad template files - */ - public function template_file_check_notice() { - - if ( $this->template_path == $this->original_path ) { - return; - } - - $core_templates = $this->scan_template_files( $this->original_path ); - $outdated = false; - - foreach ( $core_templates as $file ) { - $developer_theme_file = false; - - if ( file_exists( $this->template_path . $file ) ) { - $developer_theme_file = $this->template_path . $file; - } - - if ( $developer_theme_file ) { - $core_version = Redux_Helpers::get_template_version( $this->original_path . $file ); - $developer_version = Redux_Helpers::get_template_version( $developer_theme_file ); - - if ( $core_version && $developer_version && version_compare( $developer_version, $core_version, '<' ) ) { - ?> -
    -

    Your panel has bundled outdated copies of Redux Framework template files – if you encounter functionality issues this could be the reason. Ensure you update or remove them.', 'redux-framework' ); ?>

    -
    - parent->args['opt_name'] . $k . '_section_group' ); - } - - } - } \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/core/required.php b/admin/core/lib/ReduxFramework/ReduxCore/core/required.php deleted file mode 100755 index 08b33c1f..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/core/required.php +++ /dev/null @@ -1,25 +0,0 @@ -parent = $parent; - Redux_Functions::$_parent = $parent; - - - /** - * action 'redux/page/{opt_name}/' - */ - do_action( "redux/page/{$parent->args['opt_name']}/" ); - - } - - - } - } \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/framework.php b/admin/core/lib/ReduxFramework/ReduxCore/framework.php deleted file mode 100755 index 3298e096..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/framework.php +++ /dev/null @@ -1,4042 +0,0 @@ -. - * - * @package Redux_Framework - * @subpackage Core - * @author Redux Framework Team - */ - // Exit if accessed directly - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - if ( ! class_exists( 'ReduxFrameworkInstances' ) ) { - // Instance Container - require_once dirname( __FILE__ ) . '/inc/class.redux_instances.php'; - require_once dirname( __FILE__ ) . '/inc/lib.redux_instances.php'; - } - - if ( class_exists( 'ReduxFrameworkInstances' ) ) { - add_action( 'redux/init', 'ReduxFrameworkInstances::get_instance' ); - } - - // Don't duplicate me! - if ( ! class_exists( 'ReduxFramework' ) ) { - - // Redux CDN class - require_once dirname( __FILE__ ) . '/inc/class.redux_cdn.php'; - - // Redux API class :) - require_once dirname( __FILE__ ) . '/inc/class.redux_api.php'; - - // General helper functions - require_once dirname( __FILE__ ) . '/inc/class.redux_helpers.php'; - - // General functions - require_once dirname( __FILE__ ) . '/inc/class.redux_functions.php'; - require_once dirname( __FILE__ ) . '/inc/class.p.php'; - - require_once dirname( __FILE__ ) . '/inc/class.thirdparty.fixes.php'; - - require_once dirname( __FILE__ ) . '/inc/class.redux_filesystem.php'; - - require_once dirname( __FILE__ ) . '/inc/class.redux_admin_notices.php'; - - // ThemeCheck checks - require_once dirname( __FILE__ ) . '/inc/themecheck/class.redux_themecheck.php'; - - // Welcome - require_once dirname( __FILE__ ) . '/inc/welcome/welcome.php'; - - /** - * Main ReduxFramework class - * - * @since 1.0.0 - */ - class ReduxFramework { - - // ATTENTION DEVS - // Please update the build number with each push, no matter how small. - // This will make for easier support when we ask users what version they are using. - - public static $_version = '3.6.2'; - public static $_dir; - public static $_url; - public static $_upload_dir; - public static $_upload_url; - public static $wp_content_url; - public static $base_wp_content_url; - public static $_is_plugin = true; - public static $_as_plugin = false; - - public static function init() { - $dir = Redux_Helpers::cleanFilePath( dirname( __FILE__ ) ); - - // Windows-proof constants: replace backward by forward slashes. Thanks to: @peterbouwmeester - self::$_dir = trailingslashit( $dir ); - self::$wp_content_url = trailingslashit( Redux_Helpers::cleanFilePath( ( is_ssl() ? str_replace( 'http://', 'https://', WP_CONTENT_URL ) : WP_CONTENT_URL ) ) ); - - // See if Redux is a plugin or not - if ( strpos( Redux_Helpers::cleanFilePath( __FILE__ ), Redux_Helpers::cleanFilePath( get_stylesheet_directory() ) ) !== false || strpos( Redux_Helpers::cleanFilePath( __FILE__ ), Redux_Helpers::cleanFilePath( get_template_directory_uri() ) ) !== false || strpos( Redux_Helpers::cleanFilePath( __FILE__ ), Redux_Helpers::cleanFilePath( WP_CONTENT_DIR . '/themes/' ) ) !== false ) { - self::$_is_plugin = false; - } else { - // Check if plugin is a symbolic link, see if it's a plugin. If embedded, we can't do a thing. - if ( strpos( self::$_dir, ABSPATH ) === false ) { - if ( ! function_exists( 'get_plugins' ) ) { - require_once ABSPATH . 'wp-admin/includes/plugin.php'; - } - - $is_plugin = false; - foreach ( get_plugins() as $key => $value ) { - if ( is_plugin_active( $key ) && strpos( $key, 'redux-framework.php' ) !== false ) { - self::$_dir = trailingslashit( Redux_Helpers::cleanFilePath( WP_CONTENT_DIR . '/plugins/' . plugin_dir_path( $key ) . 'ReduxCore/' ) ); - $is_plugin = true; - } - } - if ( ! $is_plugin ) { - self::$_is_plugin = false; - } - } - } - - if ( self::$_is_plugin == true || self::$_as_plugin == true ) { - self::$_url = plugin_dir_url( __FILE__ ); - } else { - if ( strpos( Redux_Helpers::cleanFilePath( __FILE__ ), Redux_Helpers::cleanFilePath( get_template_directory() ) ) !== false ) { - $relative_url = str_replace( Redux_Helpers::cleanFilePath( get_template_directory() ), '', self::$_dir ); - self::$_url = trailingslashit( get_template_directory_uri() . $relative_url ); - } else if ( strpos( Redux_Helpers::cleanFilePath( __FILE__ ), Redux_Helpers::cleanFilePath( get_stylesheet_directory() ) ) !== false ) { - $relative_url = str_replace( Redux_Helpers::cleanFilePath( get_stylesheet_directory() ), '', self::$_dir ); - self::$_url = trailingslashit( get_stylesheet_directory_uri() . $relative_url ); - } else { - $wp_content_dir = trailingslashit( Redux_Helpers::cleanFilePath( WP_CONTENT_DIR ) ); - $wp_content_dir = trailingslashit( str_replace( '//', '/', $wp_content_dir ) ); - $relative_url = str_replace( $wp_content_dir, '', self::$_dir ); - self::$_url = trailingslashit( self::$wp_content_url . $relative_url ); - } - } - - self::$_url = apply_filters( "redux/_url", self::$_url ); - self::$_dir = apply_filters( "redux/_dir", self::$_dir ); - self::$_is_plugin = apply_filters( "redux/_is_plugin", self::$_is_plugin ); - } - - // ::init() - - public $framework_url = 'http://www.reduxframework.com/'; - public static $instance = null; - public $admin_notices = array(); - public $page = ''; - public $saved = false; - public $fields = array(); // Fields by type used in the panel - public $field_sections = array(); // Section id's by field type, then field ID - public $current_tab = ''; // Current section to display, cookies - public $extensions = array(); // Extensions by type used in the panel - public $sections = array(); // Sections and fields - public $errors = array(); // Errors - public $warnings = array(); // Warnings - public $options = array(); // Option values - public $options_defaults = null; // Option defaults - public $notices = array(); // Option defaults - public $compiler_fields = array(); // Fields that trigger the compiler hook - public $required = array(); // Information that needs to be localized - public $required_child = array(); // Information that needs to be localized - public $localize_data = array(); // Information that needs to be localized - public $fonts = array(); // Information that needs to be localized - public $folds = array(); // The itms that need to fold. - public $path = ''; - public $changed_values = array(); // Values that have been changed on save. Orig values. - public $output = array(); // Fields with CSS output selectors - public $outputCSS = null; // CSS that get auto-appended to the header - public $compilerCSS = null; // CSS that get sent to the compiler hook - public $customizerCSS = null; // CSS that goes to the customizer - public $fieldsValues = array(); //all fields values in an id=>value array so we can check dependencies - public $fieldsHidden = array(); //all fields that didn't pass the dependency test and are hidden - public $toHide = array(); // Values to hide on page load - public $typography = null; //values to generate google font CSS - public $import_export = null; - public $no_panel = array(); // Fields that are not visible in the panel - private $show_hints = false; - public $hidden_perm_fields = array(); // Hidden fields specified by 'permissions' arg. - public $hidden_perm_sections = array(); // Hidden sections specified by 'permissions' arg. - public $typography_preview = array(); - public $args = array(); - public $filesystem = null; - public $font_groups = array(); - public $lang = ""; - public $dev_mode_forced = false; - public $reload_fields = array(); - public $omit_share_icons = false; - public $omit_admin_items = false; - - /** - * Class Constructor. Defines the args for the theme options class - * - * @since 1.0.0 - * - * @param array $sections Panel sections. - * @param array $args Class constructor arguments. - * @param array $extra_tabs Extra panel tabs. // REMOVE - * - * @return \ReduxFramework - */ - public function __construct( $sections = array(), $args = array(), $extra_tabs = array() ) { - // Disregard WP AJAX 'heartbeat'call. Why waste resources? - if ( isset ( $_POST ) && isset ( $_POST['action'] ) && $_POST['action'] == 'heartbeat' ) { - - // Hook, for purists. - if ( ! has_action( 'redux/ajax/heartbeat' ) ) { - do_action( 'redux/ajax/heartbeat', $this ); - } - - // Buh bye! - return; - } - - // Pass parent pointer to function helper. - Redux_Functions::$_parent = $this; - Redux_CDN::$_parent = $this; - Redux_Admin_Notices::$_parent = $this; - - // Set values - $this->set_default_args(); - $this->args = wp_parse_args( $args, $this->args ); - - if ( empty ( $this->args['transient_time'] ) ) { - $this->args['transient_time'] = 60 * MINUTE_IN_SECONDS; - } - - if ( empty ( $this->args['footer_credit'] ) ) { - $this->args['footer_credit'] = '' . sprintf( __( 'Options panel created using %1$s', 'redux-framework' ), '' . __( 'Redux Framework', 'redux-framework' ) . ' v' . self::$_version ) . ''; - } - - if ( empty ( $this->args['menu_title'] ) ) { - $this->args['menu_title'] = __( 'Options', 'redux-framework' ); - } - - if ( empty ( $this->args['page_title'] ) ) { - $this->args['page_title'] = __( 'Options', 'redux-framework' ); - } - - $this->old_opt_name = $this->args['opt_name']; - - /** - * filter 'redux/args/{opt_name}' - * - * @param array $args ReduxFramework configuration - */ - $this->args = apply_filters( "redux/args/{$this->args['opt_name']}", $this->args ); - - /** - * filter 'redux/options/{opt_name}/args' - * - * @param array $args ReduxFramework configuration - */ - $this->args = apply_filters( "redux/options/{$this->args['opt_name']}/args", $this->args ); - - if ( $this->args['opt_name'] == $this->old_opt_name ) { - unset( $this->old_opt_name ); - } - - // Do not save the defaults if we're on a live preview! - if ( $GLOBALS['pagenow'] == "customize" && isset( $_GET['theme'] ) && ! empty( $_GET['theme'] ) ) { - $this->args['save_defaults'] = false; - } - - $this->change_demo_defaults(); - - if ( ! empty ( $this->args['opt_name'] ) ) { - /** - * SHIM SECTION - * Old variables and ways of doing things that need correcting. ;) - * */ - // Variable name change - if ( ! empty ( $this->args['page_cap'] ) ) { - $this->args['page_permissions'] = $this->args['page_cap']; - unset ( $this->args['page_cap'] ); - } - - if ( ! empty ( $this->args['page_position'] ) ) { - $this->args['page_priority'] = $this->args['page_position']; - unset ( $this->args['page_position'] ); - } - - if ( ! empty ( $this->args['page_type'] ) ) { - $this->args['menu_type'] = $this->args['page_type']; - unset ( $this->args['page_type'] ); - } - - // Get rid of extra_tabs! Not needed. - if ( is_array( $extra_tabs ) && ! empty ( $extra_tabs ) ) { - foreach ( $extra_tabs as $tab ) { - array_push( $this->sections, $tab ); - } - } - - // Move to the first loop area! - /** - * filter 'redux-sections' - * - * @deprecated - * - * @param array $sections field option sections - */ - $this->sections = apply_filters( 'redux-sections', $sections ); // REMOVE LATER - /** - * filter 'redux-sections-{opt_name}' - * - * @deprecated - * - * @param array $sections field option sections - */ - $this->sections = apply_filters( "redux-sections-{$this->args['opt_name']}", $this->sections ); // REMOVE LATER - /** - * filter 'redux/options/{opt_name}/sections' - * - * @param array $sections field option sections - */ - $this->sections = apply_filters( "redux/options/{$this->args['opt_name']}/sections", $this->sections ); - - /** - * Construct hook - * action 'redux/construct' - * - * @param object $this ReduxFramework - */ - do_action( 'redux/construct', $this ); - - // Set the default values - $this->_default_cleanup(); - - // Internataionalization - $this->_internationalization(); - - $this->filesystem = Redux_Filesystem::get_instance( $this ); - - //set redux upload folder - $this->set_redux_content(); - - // Register extra extensions - $this->_register_extensions(); - - // Grab database values - $this->get_options(); - - // Tracking - if ( isset( $this->args['allow_tracking'] ) && $this->args['allow_tracking'] && Redux_Helpers::isTheme( __FILE__ ) ) { - $this->_tracking(); - } - - // Options page - add_action( 'admin_menu', array( $this, '_options_page' ) ); - - // Add a network menu - if ( $this->args['database'] == "network" && $this->args['network_admin'] ) { - add_action( 'network_admin_menu', array( $this, '_options_page' ) ); - } - - // Admin Bar menu - add_action( 'admin_bar_menu', array( - $this, - '_admin_bar_menu' - ), $this->args['admin_bar_priority'] ); - - // Register setting - add_action( 'admin_init', array( $this, '_register_settings' ) ); - - // Display admin notices in dev_mode - if ( true == $this->args['dev_mode'] ) { - if ( true == $this->args['update_notice'] ) { - add_action( 'admin_init', array( $this, '_update_check' ) ); - } - } - - // Display admin notices - add_action( 'admin_notices', array( $this, '_admin_notices' ), 99 ); - - // Check for dismissed admin notices. - add_action( 'admin_init', array( $this, '_dismiss_admin_notice' ), 9 ); - - // Enqueue the admin page CSS and JS - if ( isset ( $_GET['page'] ) && $_GET['page'] == $this->args['page_slug'] ) { - add_action( 'admin_enqueue_scripts', array( $this, '_enqueue' ), 1 ); - } - - // Output dynamic CSS - // Frontend: Maybe enqueue dynamic CSS and Google fonts - if ( empty ( $this->args['output_location'] ) || in_array( 'frontend', $this->args['output_location'] ) ) { - add_action( 'wp_head', array( &$this, '_output_css' ), 150 ); - add_action( 'wp_enqueue_scripts', array( &$this, '_enqueue_output' ), 150 ); - } - - // Login page: Maybe enqueue dynamic CSS and Google fonts - if ( in_array( 'login', $this->args['output_location'] ) ) { - add_action( 'login_head', array( &$this, '_output_css' ), 150 ); - add_action( 'login_enqueue_scripts', array( &$this, '_enqueue_output' ), 150 ); - } - - // Admin area: Maybe enqueue dynamic CSS and Google fonts - if ( in_array( 'admin', $this->args['output_location'] ) ) { - add_action( 'admin_head', array( &$this, '_output_css' ), 150 ); - add_action( 'admin_enqueue_scripts', array( &$this, '_enqueue_output' ), 150 ); - } - - - add_action( 'wp_print_scripts', array( $this, 'vc_fixes' ), 100 ); - add_action( 'admin_enqueue_scripts', array( $this, 'vc_fixes' ), 100 ); - - - if ( $this->args['database'] == "network" && $this->args['network_admin'] ) { - add_action( 'network_admin_edit_redux_' . $this->args['opt_name'], array( - $this, - 'save_network_page' - ), 10, 0 ); - add_action( 'admin_bar_menu', array( $this, 'network_admin_bar' ), 999 ); - } - // Ajax saving!!! - add_action( "wp_ajax_" . $this->args['opt_name'] . '_ajax_save', array( $this, "ajax_save" ) ); - - if ( $this->args['dev_mode'] == true || Redux_Helpers::isLocalHost() == true ) { - require_once 'core/dashboard.php'; - new reduxDashboardWidget( $this ); - - if ( ! isset ( $GLOBALS['redux_notice_check'] ) ) { - require_once 'core/newsflash.php'; - - $params = array( - 'dir_name' => 'notice', - 'server_file' => 'http://reduxframework.com/wp-content/uploads/redux/redux_notice.json', - 'interval' => 3, - 'cookie_id' => 'redux_blast', - ); - - new reduxNewsflash( $this, $params ); - $GLOBALS['redux_notice_check'] = 1; - } - } - } - - /** - * Loaded hook - * action 'redux/loaded' - * - * @param object $this ReduxFramework - */ - do_action( 'redux/loaded', $this ); - } - - // __construct() - - private function set_redux_content() { - $upload_dir = wp_upload_dir(); - self::$_upload_dir = $upload_dir['basedir'] . '/redux/'; - self::$_upload_url = str_replace( array( - 'https://', - 'http://' - ), '//', $upload_dir['baseurl'] . '/redux/' ); - } - - private function set_default_args() { - $this->args = array( - 'opt_name' => '', - // Must be defined by theme/plugin - 'google_api_key' => '', - // Must be defined to update the google fonts cache for the typography module - 'google_update_weekly' => false, - // Set to keep your google fonts updated weekly - 'last_tab' => '', - // force a specific tab to always show on reload - 'menu_icon' => '', - // menu icon - 'menu_title' => '', - // menu title/text - 'page_title' => '', - // option page title - 'page_slug' => '', - 'page_permissions' => 'manage_options', - 'menu_type' => 'menu', - // ('menu'|'submenu') - 'page_parent' => 'themes.php', - // requires menu_type = 'submenu - 'page_priority' => null, - 'allow_sub_menu' => true, - // allow submenus to be added if menu_type == menu - 'save_defaults' => true, - // Save defaults to the DB on it if empty - 'footer_credit' => '', - 'async_typography' => false, - 'disable_google_fonts_link' => false, - 'class' => '', - // Class that gets appended to all redux-containers - 'admin_bar' => true, - 'admin_bar_priority' => 999, - // Show the panel pages on the admin bar - 'admin_bar_icon' => '', - // admin bar icon - 'help_tabs' => array(), - 'help_sidebar' => '', - 'database' => '', - // possible: options, theme_mods, theme_mods_expanded, transient, network - 'customizer' => false, - // setting to true forces get_theme_mod_expanded - 'global_variable' => '', - // Changes global variable from $GLOBALS['YOUR_OPT_NAME'] to whatever you set here. false disables the global variable - 'output' => true, - // Dynamically generate CSS - 'compiler' => true, - // Initiate the compiler hook - 'output_tag' => true, - // Print Output Tag - 'output_location' => array( 'frontend' ), - // Where the dynamic CSS will be added. Can be any combination from: 'frontend', 'login', 'admin' - 'transient_time' => '', - 'default_show' => false, - // If true, it shows the default value - 'default_mark' => '', - // What to print by the field's title if the value shown is default - 'update_notice' => true, - // Recieve an update notice of new commits when in dev mode - 'disable_save_warn' => false, - // Disable the save warn - 'open_expanded' => false, - 'hide_expand' => false, - // Start the panel fully expanded to start with - 'network_admin' => false, - // Enable network admin when using network database mode - 'network_sites' => true, - // Enable sites as well as admin when using network database mode - 'hide_reset' => false, - 'hide_save' => false, - 'hints' => array( - 'icon' => 'el el-question-sign', - 'icon_position' => 'right', - 'icon_color' => 'lightgray', - 'icon_size' => 'normal', - 'tip_style' => array( - 'color' => 'light', - 'shadow' => true, - 'rounded' => false, - 'style' => '', - ), - 'tip_position' => array( - 'my' => 'top_left', - 'at' => 'bottom_right', - ), - 'tip_effect' => array( - 'show' => array( - 'effect' => 'slide', - 'duration' => '500', - 'event' => 'mouseover', - ), - 'hide' => array( - 'effect' => 'fade', - 'duration' => '500', - 'event' => 'click mouseleave', - ), - ), - ), - 'show_import_export' => true, - 'show_options_object' => true, - 'dev_mode' => true, - 'templates_path' => '', - // Path to the templates file for various Redux elements - 'ajax_save' => true, - // Disable the use of ajax saving for the panel - 'use_cdn' => true, - 'cdn_check_time' => 1440, - 'options_api' => true, - ); - } - - // Fix conflicts with Visual Composer. - public function vc_fixes() { - if ( redux_helpers::isFieldInUse( $this, 'ace_editor' ) ) { - wp_dequeue_script( 'wpb_ace' ); - wp_deregister_script( 'wpb_ace' ); - } - } - - public function network_admin_bar( $wp_admin_bar ) { - - $args = array( - 'id' => $this->args['opt_name'] . '_network_admin', - 'title' => $this->args['menu_title'], - 'parent' => 'network-admin', - 'href' => network_admin_url( 'settings.php' ) . '?page=' . $this->args['page_slug'], - 'meta' => array( 'class' => 'redux-network-admin' ) - ); - $wp_admin_bar->add_node( $args ); - } - - public function save_network_page() { - - $data = $this->_validate_options( $_POST[ $this->args['opt_name'] ] ); - - if ( ! empty ( $data ) ) { - $this->set_options( $data ); - } - - wp_redirect( add_query_arg( array( - 'page' => $this->args['page_slug'], - 'updated' => 'true' - ), network_admin_url( 'settings.php' ) ) ); - exit (); - } - - public function _update_check() { - // Only one notice per instance please - if ( ! isset ( $GLOBALS['redux_update_check'] ) ) { - Redux_Functions::updateCheck( self::$_version ); - $GLOBALS['redux_update_check'] = 1; - } - } - - public function _admin_notices() { - Redux_Admin_Notices::adminNotices( $this->admin_notices ); - } - - public function _dismiss_admin_notice() { - Redux_Admin_Notices::dismissAdminNotice(); - } - - /** - * Load the plugin text domain for translation. - * - * @since 3.0.5 - */ - private function _internationalization() { - - /** - * Locale for text domain - * filter 'redux/textdomain/{opt_name}' - * - * @param string The locale of the blog or from the 'locale' hook - * @param string 'redux-framework' text domain - */ - // $locale = apply_filters( "redux/textdomain/{$this->args['opt_name']}", get_locale(), 'redux-framework' ); - // - // if ( strpos( $locale, '_' ) === false ) { - // if ( file_exists( self::$_dir . 'languages/' . strtolower( $locale ) . '_' . strtoupper( $locale ) . '.mo' ) ) { - // $locale = strtolower( $locale ) . '_' . strtoupper( $locale ); - // } - // } - - $basename = basename( __FILE__ ); - $basepath = plugin_basename( __FILE__ ); - $basepath = str_replace( $basename, '', $basepath ); - - $basepath = apply_filters( "redux/textdomain/basepath/{$this->args['opt_name']}", $basepath ); - - load_plugin_textdomain( 'redux-framework', false, $basepath . 'languages' ); - } - // _internationalization() - - /** - * @return ReduxFramework - */ - public function get_instance() { - //self::$_instance = $this; - return self::$instance; - } - - // get_instance() - - private function _tracking() { - if ( file_exists( dirname( __FILE__ ) . '/inc/tracking.php' ) ) { - require_once dirname( __FILE__ ) . '/inc/tracking.php'; - $tracking = Redux_Tracking::get_instance(); - $tracking->load( $this ); - } - } - // _tracking() - - /** - * ->_get_default(); This is used to return the default value if default_show is set - * - * @since 1.0.1 - * @access public - * - * @param string $opt_name The option name to return - * @param mixed $default (null) The value to return if default not set - * - * @return mixed $default - */ - public function _get_default( $opt_name, $default = null ) { - if ( $this->args['default_show'] == true ) { - - if ( empty ( $this->options_defaults ) ) { - $this->_default_values(); // fill cache - } - - $default = array_key_exists( $opt_name, $this->options_defaults ) ? $this->options_defaults[ $opt_name ] : $default; - } - - return $default; - } - // _get_default() - - /** - * ->get(); This is used to return and option value from the options array - * - * @since 1.0.0 - * @access public - * - * @param string $opt_name The option name to return - * @param mixed $default (null) The value to return if option not set - * - * @return mixed - */ - public function get( $opt_name, $default = null ) { - return ( ! empty ( $this->options[ $opt_name ] ) ) ? $this->options[ $opt_name ] : $this->_get_default( $opt_name, $default ); - } - // get() - - /** - * ->set(); This is used to set an arbitrary option in the options array - * - * @since 1.0.0 - * @access public - * - * @param string $opt_name The name of the option being added - * @param mixed $value The value of the option being added - * - * @return void - */ - public function set( $opt_name = '', $value = '' ) { - if ( $opt_name != '' ) { - $this->options[ $opt_name ] = $value; - $this->set_options( $this->options ); - } - } - // set() - - /** - * Set a global variable by the global_variable argument - * - * @since 3.1.5 - * @return bool (global was set) - */ - private function set_global_variable() { - if ( $this->args['global_variable'] ) { - $option_global = $this->args['global_variable']; - /** - * filter 'redux/options/{opt_name}/global_variable' - * - * @param array $value option value to set global_variable with - */ - $GLOBALS[ $this->args['global_variable'] ] = apply_filters( "redux/options/{$this->args['opt_name']}/global_variable", $this->options ); - if ( isset ( $this->transients['last_save'] ) ) { - // Deprecated - $GLOBALS[ $this->args['global_variable'] ]['REDUX_last_saved'] = $this->transients['last_save']; - // Last save key - $GLOBALS[ $this->args['global_variable'] ]['REDUX_LAST_SAVE'] = $this->transients['last_save']; - } - if ( isset ( $this->transients['last_compiler'] ) ) { - // Deprecated - $GLOBALS[ $this->args['global_variable'] ]['REDUX_COMPILER'] = $this->transients['last_compiler']; - // Last compiler hook key - $GLOBALS[ $this->args['global_variable'] ]['REDUX_LAST_COMPILER'] = $this->transients['last_compiler']; - } - - return true; - } - - return false; - } - // set_global_variable() - - /** - * ->set_options(); This is used to set an arbitrary option in the options array - * - * @since ReduxFramework 3.0.0 - * - * @param mixed $value the value of the option being added - */ - public function set_options( $value = '' ) { - - $this->transients['last_save'] = time(); - - if ( ! empty ( $value ) ) { - - $this->options = $value; - - if ( $this->args['database'] === 'transient' ) { - set_transient( $this->args['opt_name'] . '-transient', $value, $this->args['transient_time'] ); - } else if ( $this->args['database'] === 'theme_mods' ) { - set_theme_mod( $this->args['opt_name'] . '-mods', $value ); - } else if ( $this->args['database'] === 'theme_mods_expanded' ) { - foreach ( $value as $k => $v ) { - set_theme_mod( $k, $v ); - } - } else if ( $this->args['database'] === 'network' ) { - // Strip those slashes! - $value = json_decode( stripslashes( json_encode( $value ) ), true ); - update_site_option( $this->args['opt_name'], $value ); - } else { - update_option( $this->args['opt_name'], $value ); - } - - // Store the changed values in the transient - if ( $value != $this->options ) { - foreach ( $value as $k => $v ) { - if ( ! isset ( $this->options[ $k ] ) ) { - $this->options[ $k ] = ""; - } else if ( $v == $this->options[ $k ] ) { - unset ( $this->options[ $k ] ); - } - } - $this->transients['changed_values'] = $this->options; - } - - $this->options = $value; - - // Set a global variable by the global_variable argument. - $this->set_global_variable(); - - // Saving the transient values - $this->set_transients(); - - //do_action( "redux-saved-{$this->args['opt_name']}", $value ); // REMOVE - //do_action( "redux/options/{$this->args['opt_name']}/saved", $value, $this->transients['changed_values'] ); - } - } - // set_options() - - /** - * ->get_options(); This is used to get options from the database - * - * @since ReduxFramework 3.0.0 - */ - public function get_options() { - $defaults = false; - - if ( ! empty ( $this->defaults ) ) { - $defaults = $this->defaults; - } - - if ( $this->args['database'] === "transient" ) { - $result = get_transient( $this->args['opt_name'] . '-transient' ); - } else if ( $this->args['database'] === "theme_mods" ) { - $result = get_theme_mod( $this->args['opt_name'] . '-mods' ); - } else if ( $this->args['database'] === 'theme_mods_expanded' ) { - $result = get_theme_mods(); - } else if ( $this->args['database'] === 'network' ) { - $result = get_site_option( $this->args['opt_name'], array() ); - $result = json_decode( stripslashes( json_encode( $result ) ), true ); - } else { - $result = get_option( $this->args['opt_name'], array() ); - } - - if ( empty ( $result ) && ! empty ( $defaults ) ) { - $results = $defaults; - $this->set_options( $results ); - } else { - $this->options = $result; - } - - /** - * action 'redux/options/{opt_name}/options' - * - * @param mixed $value option values - */ - $this->options = apply_filters( "redux/options/{$this->args['opt_name']}/options", $this->options ); - - // Get transient values - $this->get_transients(); - - // Set a global variable by the global_variable argument. - $this->set_global_variable(); - } - // get_options() - - /** - * ->get_wordpress_date() - Get Wordpress specific data from the DB and return in a usable array - * - * @since ReduxFramework 3.0.0 - */ - public function get_wordpress_data( $type = false, $args = array() ) { - $data = ""; - //return $data; - /** - * filter 'redux/options/{opt_name}/wordpress_data/{type}/' - * - * @deprecated - * - * @param string $data - */ - $data = apply_filters( "redux/options/{$this->args['opt_name']}/wordpress_data/$type/", $data ); // REMOVE LATER - - /** - * filter 'redux/options/{opt_name}/data/{type}' - * - * @param string $data - */ - $data = apply_filters( "redux/options/{$this->args['opt_name']}/data/$type", $data ); - - $argsKey = ""; - foreach ( $args as $key => $value ) { - if ( ! is_array( $value ) ) { - $argsKey .= $value . "-"; - } else { - $argsKey .= implode( "-", $value ); - } - } - - if ( empty ( $data ) && isset ( $this->wp_data[ $type . $argsKey ] ) ) { - $data = $this->wp_data[ $type . $argsKey ]; - } - - if ( empty ( $data ) && ! empty ( $type ) ) { - - /** - * Use data from Wordpress to populate options array - * */ - if ( ! empty ( $type ) && empty ( $data ) ) { - if ( empty ( $args ) ) { - $args = array(); - } - - $data = array(); - $args = wp_parse_args( $args, array() ); - - if ( $type == "categories" || $type == "category" ) { - $cats = get_categories( $args ); - if ( ! empty ( $cats ) ) { - foreach ( $cats as $cat ) { - $data[ $cat->term_id ] = $cat->name; - } - //foreach - } // If - } else if ( $type == "menus" || $type == "menu" ) { - $menus = wp_get_nav_menus( $args ); - if ( ! empty ( $menus ) ) { - foreach ( $menus as $item ) { - $data[ $item->term_id ] = $item->name; - } - //foreach - } - //if - } else if ( $type == "pages" || $type == "page" ) { - if ( ! isset ( $args['posts_per_page'] ) ) { - $args['posts_per_page'] = 20; - } - $pages = get_pages( $args ); - if ( ! empty ( $pages ) ) { - foreach ( $pages as $page ) { - $data[ $page->ID ] = $page->post_title; - } - //foreach - } - //if - } else if ( $type == "terms" || $type == "term" ) { - $taxonomies = $args['taxonomies']; - unset ( $args['taxonomies'] ); - $terms = get_terms( $taxonomies, $args ); // this will get nothing - if ( ! empty ( $terms ) && ! is_a( $terms, 'WP_Error' ) ) { - foreach ( $terms as $term ) { - $data[ $term->term_id ] = $term->name; - } - //foreach - } // If - } else if ( $type == "taxonomy" || $type == "taxonomies" ) { - $taxonomies = get_taxonomies( $args ); - if ( ! empty ( $taxonomies ) ) { - foreach ( $taxonomies as $key => $taxonomy ) { - $data[ $key ] = $taxonomy; - } - //foreach - } // If - } else if ( $type == "posts" || $type == "post" ) { - $posts = get_posts( $args ); - if ( ! empty ( $posts ) ) { - foreach ( $posts as $post ) { - $data[ $post->ID ] = $post->post_title; - } - //foreach - } - //if - } else if ( $type == "post_type" || $type == "post_types" ) { - global $wp_post_types; - - $defaults = array( - 'public' => true, - 'exclude_from_search' => false, - ); - $args = wp_parse_args( $args, $defaults ); - $output = 'names'; - $operator = 'and'; - $post_types = get_post_types( $args, $output, $operator ); - - ksort( $post_types ); - - foreach ( $post_types as $name => $title ) { - if ( isset ( $wp_post_types[ $name ]->labels->menu_name ) ) { - $data[ $name ] = $wp_post_types[ $name ]->labels->menu_name; - } else { - $data[ $name ] = ucfirst( $name ); - } - } - } else if ( $type == "tags" || $type == "tag" ) { // NOT WORKING! - $tags = get_tags( $args ); - if ( ! empty ( $tags ) ) { - foreach ( $tags as $tag ) { - $data[ $tag->term_id ] = $tag->name; - } - //foreach - } - //if - } else if ( $type == "menu_location" || $type == "menu_locations" ) { - global $_wp_registered_nav_menus; - - foreach ( $_wp_registered_nav_menus as $k => $v ) { - $data[ $k ] = $v; - } - } else if ( $type == "image_size" || $type == "image_sizes" ) { - global $_wp_additional_image_sizes; - - foreach ( $_wp_additional_image_sizes as $size_name => $size_attrs ) { - $data[ $size_name ] = $size_name . ' - ' . $size_attrs['width'] . ' x ' . $size_attrs['height']; - } - } else if ( $type == "elusive-icons" || $type == "elusive-icon" || $type == "elusive" || - $type == "font-icon" || $type == "font-icons" || $type == "icons" - ) { - - /** - * filter 'redux-font-icons' - * - * @deprecated - * - * @param array $font_icons array of elusive icon classes - */ - $font_icons = apply_filters( 'redux-font-icons', array() ); // REMOVE LATER - - /** - * filter 'redux/font-icons' - * - * @deprecated - * - * @param array $font_icons array of elusive icon classes - */ - $font_icons = apply_filters( 'redux/font-icons', $font_icons ); - - /** - * filter 'redux/{opt_name}/field/font/icons' - * - * @deprecated - * - * @param array $font_icons array of elusive icon classes - */ - $font_icons = apply_filters( "redux/{$this->args['opt_name']}/field/font/icons", $font_icons ); - - foreach ( $font_icons as $k ) { - $data[ $k ] = $k; - } - } else if ( $type == "roles" ) { - /** @global WP_Roles $wp_roles */ - global $wp_roles; - - $data = $wp_roles->get_names(); - } else if ( $type == "sidebars" || $type == "sidebar" ) { - /** @global array $wp_registered_sidebars */ - global $wp_registered_sidebars; - - foreach ( $wp_registered_sidebars as $key => $value ) { - $data[ $key ] = $value['name']; - } - } else if ( $type == "capabilities" ) { - /** @global WP_Roles $wp_roles */ - global $wp_roles; - - foreach ( $wp_roles->roles as $role ) { - foreach ( $role['capabilities'] as $key => $cap ) { - $data[ $key ] = ucwords( str_replace( '_', ' ', $key ) ); - } - } - } else if ( $type == "callback" ) { - if ( ! is_array( $args ) ) { - $args = array( $args ); - } - $data = call_user_func( $args[0] ); - } else if ( $type == "users" || $type == "users" ) { - $users = get_users( $args ); - if ( ! empty ( $users ) ) { - foreach ( $users as $user ) { - $data[ $user->ID ] = $user->display_name; - } - //foreach - } - //if - } - //if - } - //if - - $this->wp_data[ $type . $argsKey ] = $data; - } - - //if - - return $data; - } - // get_wordpress_data() - - /** - * ->show(); This is used to echo and option value from the options array - * - * @since 1.0.0 - * @access public - * - * @param string $opt_name The name of the option being shown - * @param mixed $default The value to show if $opt_name isn't set - * - * @return void - */ - public function show( $opt_name, $default = '' ) { - $option = $this->get( $opt_name ); - if ( ! is_array( $option ) && $option != '' ) { - echo $option; - } elseif ( $default != '' ) { - echo $this->_get_default( $opt_name, $default ); - } - } - // show() - - /** - * Get the default value for an option - * - * @since 3.3.6 - * @access public - * - * @param string $key The option's ID - * @param string $array_key The key of the default's array - * - * @return mixed - */ - public function get_default_value( $key, $array_key = false ) { - if ( empty ( $this->options_defaults ) ) { - $this->options_defaults = $this->_default_values(); - } - - $defaults = $this->options_defaults; - $value = ''; - - if ( isset ( $defaults[ $key ] ) ) { - if ( $array_key !== false && isset ( $defaults[ $key ][ $array_key ] ) ) { - $value = $defaults[ $key ][ $array_key ]; - } else { - $value = $defaults[ $key ]; - } - } - - return $value; - } - - public function field_default_values( $field ) { - // Detect what field types are being used - if ( ! isset ( $this->fields[ $field['type'] ][ $field['id'] ] ) ) { - $this->fields[ $field['type'] ][ $field['id'] ] = 1; - } else { - $this->fields[ $field['type'] ] = array( $field['id'] => 1 ); - } - if ( isset ( $field['default'] ) ) { - $this->options_defaults[ $field['id'] ] = apply_filters( "redux/{$this->args['opt_name']}/field/{$field['type']}/defaults", $field['default'], $field ); - } elseif ( ( $field['type'] != "ace_editor" ) ) { - // Sorter data filter - - if ( isset( $field['data'] ) && ! empty( $field['data'] ) ) { - if ( ! isset( $field['args'] ) ) { - $field['args'] = array(); - } - if ( is_array( $field['data'] ) && ! empty( $field['data'] ) ) { - foreach ( $field['data'] as $key => $data ) { - if ( ! empty( $data ) ) { - if ( ! isset ( $field['args'][ $key ] ) ) { - $field['args'][ $key ] = array(); - } - $field['options'][ $key ] = $this->get_wordpress_data( $data, $field['args'][ $key ] ); - } - } - } else { - $field['options'] = $this->get_wordpress_data( $field['data'], $field['args'] ); - } - } - - if ( $field['type'] == "sorter" && isset ( $field['data'] ) && ! empty ( $field['data'] ) && is_array( $field['data'] ) ) { - if ( ! isset ( $field['args'] ) ) { - $field['args'] = array(); - } - foreach ( $field['data'] as $key => $data ) { - if ( ! isset ( $field['args'][ $key ] ) ) { - $field['args'][ $key ] = array(); - } - $field['options'][ $key ] = $this->get_wordpress_data( $data, $field['args'][ $key ] ); - } - } - - if ( isset ( $field['options'] ) ) { - if ( $field['type'] == "sortable" ) { - $this->options_defaults[ $field['id'] ] = array(); - } elseif ( $field['type'] == "image_select" ) { - $this->options_defaults[ $field['id'] ] = ''; - } elseif ( $field['type'] == "select" ) { - $this->options_defaults[ $field['id'] ] = ''; - } else { - $this->options_defaults[ $field['id'] ] = $field['options']; - } - } - } - } - - /** - * Get default options into an array suitable for the settings API - * - * @since 1.0.0 - * @access public - * @return array $this->options_defaults - */ - public function _default_values() { - if ( ! is_null( $this->sections ) && is_null( $this->options_defaults ) ) { - - // fill the cache - foreach ( $this->sections as $sk => $section ) { - if ( ! isset ( $section['id'] ) ) { - if ( ! is_numeric( $sk ) || ! isset ( $section['title'] ) ) { - $section['id'] = $sk; - } else { - $section['id'] = sanitize_title( $section['title'], $sk ); - } - $this->sections[ $sk ] = $section; - } - if ( isset ( $section['fields'] ) ) { - foreach ( $section['fields'] as $k => $field ) { - if ( empty ( $field['id'] ) && empty ( $field['type'] ) ) { - continue; - } - - if ( in_array( $field['type'], array( 'ace_editor' ) ) && isset ( $field['options'] ) ) { - $this->sections[ $sk ]['fields'][ $k ]['args'] = $field['options']; - unset ( $this->sections[ $sk ]['fields'][ $k ]['options'] ); - } - - if ( $field['type'] == "section" && isset ( $field['indent'] ) && $field['indent'] == "true" ) { - $field['class'] = isset ( $field['class'] ) ? $field['class'] : ''; - $field['class'] .= " redux-section-indent-start"; - $this->sections[ $sk ]['fields'][ $k ] = $field; - } - $this->field_default_values( $field ); - } - } - } - } - - /** - * filter 'redux/options/{opt_name}/defaults' - * - * @param array $defaults option default values - */ - $this->transients['changed_values'] = isset ( $this->transients['changed_values'] ) ? $this->transients['changed_values'] : array(); - $this->options_defaults = apply_filters( "redux/options/{$this->args['opt_name']}/defaults", $this->options_defaults, $this->transients['changed_values'] ); - - return $this->options_defaults; - } - - /** - * Set default options on admin_init if option doesn't exist - * - * @since 1.0.0 - * @access public - * @return void - */ - private function _default_cleanup() { - - // Fix the global variable name - if ( $this->args['global_variable'] == "" && $this->args['global_variable'] !== false ) { - $this->args['global_variable'] = str_replace( '-', '_', $this->args['opt_name'] ); - } - - // Force dev_mode on WP_DEBUG = true and if it's a local server - if ( Redux_Helpers::isLocalHost() || ( Redux_Helpers::isWpDebug() ) ) { - if ( $this->args['dev_mode'] != true ) { - $this->args['update_notice'] = false; - } - $this->dev_mode_forced = true; - $this->args['dev_mode'] = true; - if ( isset( $this->args['forced_dev_mode_off'] ) && $this->args['forced_dev_mode_off'] == true ) { - $this->dev_mode_forced = false; - $this->args['dev_mode'] = false; - } - } - - // Auto create the page_slug appropriately - if ( empty( $this->args['page_slug'] ) ) { - if ( ! empty( $this->args['display_name'] ) ) { - $this->args['page_slug'] = sanitize_html_class( $this->args['display_name'] ); - } else if ( ! empty( $this->args['page_title'] ) ) { - $this->args['page_slug'] = sanitize_html_class( $this->args['page_title'] ); - } else if ( ! empty( $this->args['menu_title'] ) ) { - $this->args['page_slug'] = sanitize_html_class( $this->args['menu_title'] ); - } else { - $this->args['page_slug'] = str_replace( '-', '_', $this->args['opt_name'] ); - } - } - - if ( isset( $this->args['customizer_only'] ) && $this->args['customizer_only'] == true ) { - $this->args['menu_type'] = 'hidden'; - $this->args['customizer'] = true; - $this->args['admin_bar'] = false; - $this->args['allow_sub_menu'] = false; - } - - // Check if the Airplane Mode plugin is installed - if ( class_exists( 'Airplane_Mode_Core' ) ) { - $airplane = Airplane_Mode_Core::getInstance(); - if ( method_exists( $airplane, 'enabled' ) ) { - if ( $airplane->enabled() ) { - $this->args['use_cdn'] = false; - } - } else if ( $airplane->check_status() == 'on' ) { - $this->args['use_cdn'] = false; - } - } - } - - /** - * Class Add Sub Menu Function, creates options submenu in Wordpress admin area. - * - * @since 3.1.9 - * @access private - * @return void - */ - private function add_submenu( $page_parent, $page_title, $menu_title, $page_permissions, $page_slug ) { - global $submenu; - - // Just in case. One never knows. - $page_parent = strtolower( $page_parent ); - - $test = array( - 'index.php' => 'dashboard', - 'edit.php' => 'posts', - 'upload.php' => 'media', - 'link-manager.php' => 'links', - 'edit.php?post_type=page' => 'pages', - 'edit-comments.php' => 'comments', - 'themes.php' => 'theme', - 'plugins.php' => 'plugins', - 'users.php' => 'users', - 'tools.php' => 'management', - 'options-general.php' => 'options', - ); - - if ( isset ( $test[ $page_parent ] ) ) { - $function = 'add_' . $test[ $page_parent ] . '_page'; - $this->page = $function ( - $page_title, $menu_title, $page_permissions, $page_slug, array( $this, 'generate_panel' ) - ); - } else { - // Network settings and Post type menus. These do not have - // wrappers and need to be appened to using add_submenu_page. - // Okay, since we've left the post type menu appending - // as default, we need to validate it, so anything that - // isn't post_type= doesn't get through and mess - // things up. - $addMenu = false; - if ( 'settings.php' != $page_parent ) { - // Establish the needle - $needle = '?post_type='; - - // Check if it exists in the page_parent (how I miss instr) - $needlePos = strrpos( $page_parent, $needle ); - - // It's there, so... - if ( $needlePos > 0 ) { - - // Get the post type. - $postType = substr( $page_parent, $needlePos + strlen( $needle ) ); - - // Ensure it exists. - if ( post_type_exists( $postType ) ) { - // Set flag to add the menu page - $addMenu = true; - } - // custom menu - } elseif ( isset ( $submenu[ $this->args['page_parent'] ] ) ) { - $addMenu = true; - } else { - global $menu; - - foreach ( $menu as $menupriority => $menuitem ) { - $needle_menu_slug = isset ( $menuitem ) ? $menuitem[2] : false; - if ( $needle_menu_slug != false ) { - - // check if the current needle menu equals page_parent - if ( strcasecmp( $needle_menu_slug, $page_parent ) == 0 ) { - - // found an empty parent menu - $addMenu = true; - } - } - } - } - } else { - // The page_parent was settings.php, so set menu add - // flag to true. - $addMenu = true; - } - // Add the submenu if it's permitted. - if ( true == $addMenu ) { - // ONLY for non-wp.org themes OR plugins. Theme-Check alert shown if used and IS theme. - $this->page = call_user_func( 'add_submenu_page', $page_parent, $page_title, $menu_title, $page_permissions, $page_slug, array( - &$this, - 'generate_panel' - ) ); - } - } - } - - /** - * Class Options Page Function, creates main options page. - * - * @since 1.0.0 - * @access public - * @return void - */ - public function _options_page() { - - if ( $this->args['menu_type'] == 'hidden' ) { - - // No menu to add! - } else if ( $this->args['menu_type'] == 'submenu' ) { - $this->add_submenu( - $this->args['page_parent'], $this->args['page_title'], $this->args['menu_title'], $this->args['page_permissions'], $this->args['page_slug'] - ); - } else { - // Theme-Check notice is displayed for WP.org theme devs, informing them to NOT use this. - $this->page = call_user_func( 'add_menu_page', $this->args['page_title'], $this->args['menu_title'], $this->args['page_permissions'], $this->args['page_slug'], array( - &$this, - 'generate_panel' - ), $this->args['menu_icon'], $this->args['page_priority'] - ); - - if ( true === $this->args['allow_sub_menu'] ) { - if ( ! isset ( $section['type'] ) || $section['type'] != 'divide' ) { - foreach ( $this->sections as $k => $section ) { - $canBeSubSection = ( $k > 0 && ( ! isset ( $this->sections[ ( $k ) ]['type'] ) || $this->sections[ ( $k ) ]['type'] != "divide" ) ) ? true : false; - - if ( ! isset ( $section['title'] ) || ( $canBeSubSection && ( isset ( $section['subsection'] ) && $section['subsection'] == true ) ) ) { - continue; - } - - if ( isset ( $section['submenu'] ) && $section['submenu'] == false ) { - continue; - } - - if ( isset ( $section['customizer_only'] ) && $section['customizer_only'] == true ) { - continue; - } - - if ( isset ( $section['hidden'] ) && $section['hidden'] == true ) { - continue; - } - - if ( isset( $section['permissions'] ) && ! current_user_can( $section['permissions'] ) ) { - continue; - } - - // ONLY for non-wp.org themes OR plugins. Theme-Check alert shown if used and IS theme. - call_user_func( 'add_submenu_page', $this->args['page_slug'], $section['title'], $section['title'], $this->args['page_permissions'], $this->args['page_slug'] . '&tab=' . $k, - //create_function( '$a', "return null;" ) - '__return_null' ); - } - - // Remove parent submenu item instead of adding null item. - remove_submenu_page( $this->args['page_slug'], $this->args['page_slug'] ); - } - } - } - - add_action( "load-{$this->page}", array( &$this, '_load_page' ) ); - } - // _options_page() - - /** - * Add admin bar menu - * - * @since 3.1.5.16 - * @access public - * @global $menu , $submenu, $wp_admin_bar - * @return void - */ - public function _admin_bar_menu() { - global $menu, $submenu, $wp_admin_bar; - - $ct = wp_get_theme(); - $theme_data = $ct; - - if ( ! is_super_admin() || ! is_admin_bar_showing() || ! $this->args['admin_bar'] || $this->args['menu_type'] == 'hidden' ) { - return; - } - - if ( $menu ) { - foreach ( $menu as $menu_item ) { - if ( isset ( $menu_item[2] ) && $menu_item[2] === $this->args["page_slug"] ) { - - // Fetch the title - $title = empty ( $this->args['admin_bar_icon'] ) ? $menu_item[0] : '' . $menu_item[0]; - - $nodeargs = array( - 'id' => $menu_item[2], - 'title' => $title, - 'href' => admin_url( 'admin.php?page=' . $menu_item[2] ), - 'meta' => array() - ); - $wp_admin_bar->add_node( $nodeargs ); - - break; - } - } - - if ( isset ( $submenu[ $this->args["page_slug"] ] ) && is_array( $submenu[ $this->args["page_slug"] ] ) ) { - foreach ( $submenu[ $this->args["page_slug"] ] as $index => $redux_options_submenu ) { - $subnodeargs = array( - 'id' => $this->args["page_slug"] . '_' . $index, - 'title' => $redux_options_submenu[0], - 'parent' => $this->args["page_slug"], - 'href' => admin_url( 'admin.php?page=' . $redux_options_submenu[2] ), - ); - - $wp_admin_bar->add_node( $subnodeargs ); - } - } - - // Let's deal with external links - if ( isset ( $this->args['admin_bar_links'] ) ) { - - if ( ! $this->args['dev_mode'] && $this->omit_admin_items ) { - return; - } - - // Group for Main Root Menu (External Group) - $wp_admin_bar->add_node( array( - 'id' => $this->args["page_slug"] . '-external', - 'parent' => $this->args["page_slug"], - 'group' => true, - 'meta' => array( 'class' => 'ab-sub-secondary' ) - ) ); - - // Add Child Menus to External Group Menu - foreach ( $this->args['admin_bar_links'] as $link ) { - if ( ! isset ( $link['id'] ) ) { - $link['id'] = $this->args["page_slug"] . '-sub-' . sanitize_html_class( $link['title'] ); - } - $externalnodeargs = array( - 'id' => $link['id'], - 'title' => $link['title'], - 'parent' => $this->args["page_slug"] . '-external', - 'href' => $link['href'], - 'meta' => array( 'target' => '_blank' ) - ); - - $wp_admin_bar->add_node( $externalnodeargs ); - } - } - } else { - // Fetch the title - $title = empty ( $this->args['admin_bar_icon'] ) ? $this->args['menu_title'] : '' . $this->args['menu_title']; - - $nodeargs = array( - 'id' => $this->args["page_slug"], - 'title' => $title, - // $theme_data->get( 'Name' ) . " " . __( 'Options', 'redux-framework-demo' ), - 'href' => admin_url( 'admin.php?page=' . $this->args["page_slug"] ), - 'meta' => array() - ); - - $wp_admin_bar->add_node( $nodeargs ); - } - } - // _admin_bar_menu() - - /** - * Output dynamic CSS at bottom of HEAD - * - * @since 3.2.8 - * @access public - * @return void - */ - public function _output_css() { - if ( $this->args['output'] == false && $this->args['compiler'] == false ) { - return; - } - - if ( isset ( $this->no_output ) ) { - return; - } - - if ( ! empty ( $this->outputCSS ) && ( $this->args['output_tag'] == true || ( isset ( $_POST['customized'] ) ) ) ) { - echo ''; - } - } - - /** - * Enqueue CSS and Google fonts for front end - * - * @since 1.0.0 - * @access public - * @return void - */ - public function _enqueue_output() { - if ( $this->args['output'] == false && $this->args['compiler'] == false ) { - return; - } - - /** @noinspection PhpUnusedLocalVariableInspection */ - foreach ( $this->sections as $k => $section ) { - if ( isset ( $section['type'] ) && ( $section['type'] == 'divide' ) ) { - continue; - } - - if ( isset ( $section['fields'] ) ) { - /** @noinspection PhpUnusedLocalVariableInspection */ - foreach ( $section['fields'] as $fieldk => $field ) { - if ( isset ( $field['type'] ) && $field['type'] != "callback" ) { - $field_class = "ReduxFramework_{$field['type']}"; - if ( ! class_exists( $field_class ) ) { - - if ( ! isset ( $field['compiler'] ) ) { - $field['compiler'] = ""; - } - - /** - * Field class file - * filter 'redux/{opt_name}/field/class/{field.type} - * - * @param string field class file - * @param array $field field config data - */ - $class_file = apply_filters( "redux/{$this->args['opt_name']}/field/class/{$field['type']}", self::$_dir . "inc/fields/{$field['type']}/field_{$field['type']}.php", $field ); - - if ( $class_file && file_exists( $class_file ) && ! class_exists( $field_class ) ) { - /** @noinspection PhpIncludeInspection */ - require_once $class_file; - } - } - - if ( ! empty ( $this->options[ $field['id'] ] ) && class_exists( $field_class ) && method_exists( $field_class, 'output' ) && $this->_can_output_css( $field ) ) { - $field = apply_filters( "redux/field/{$this->args['opt_name']}/output_css", $field ); - - if ( ! empty ( $field['output'] ) && ! is_array( $field['output'] ) ) { - $field['output'] = array( $field['output'] ); - } - - $value = isset ( $this->options[ $field['id'] ] ) ? $this->options[ $field['id'] ] : ''; - $enqueue = new $field_class ( $field, $value, $this ); - - if ( ( ( isset ( $field['output'] ) && ! empty ( $field['output'] ) ) || ( isset ( $field['compiler'] ) && ! empty ( $field['compiler'] ) ) || $field['type'] == "typography" || $field['type'] == "icon_select" ) ) { - $enqueue->output(); - } - } - } - } - } - } - - // For use like in the customizer. Stops the output, but passes the CSS in the variable for the compiler - if ( isset ( $this->no_output ) ) { - return; - } - - if ( ! empty ( $this->typography ) && ! empty ( $this->typography ) && filter_var( $this->args['output'], FILTER_VALIDATE_BOOLEAN ) ) { - $version = ! empty ( $this->transients['last_save'] ) ? $this->transients['last_save'] : ''; - $typography = new ReduxFramework_typography ( null, null, $this ); - - if ( $this->args['async_typography'] && ! empty ( $this->typography ) ) { - $families = array(); - foreach ( $this->typography as $key => $value ) { - $families[] = $key; - } - ?> - - args['disable_google_fonts_link'] ) { - $protocol = ( ! empty ( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443 ) ? "https:" : "http:"; - - //echo ''; - wp_register_style( 'redux-google-fonts-' . $this->args['opt_name'], $protocol . $typography->makeGoogleWebfontLink( $this->typography ), '', $version ); - wp_enqueue_style( 'redux-google-fonts-' . $this->args['opt_name'] ); - } - } - } - // _enqueue_output() - - /** - * Enqueue CSS/JS for options page - * - * @since 1.0.0 - * @access public - * @global $wp_styles - * @return void - */ - public function _enqueue() { - require_once 'core/enqueue.php'; - $enqueue = new reduxCoreEnqueue ( $this ); - $enqueue->init(); - } - // _enqueue() - - /** - * Show page help - * - * @since 1.0.0 - * @access public - * @return void - */ - public function _load_page() { - - // Do admin head action for this page - add_action( 'admin_head', array( &$this, 'admin_head' ) ); - - // Do admin footer text hook - add_filter( 'admin_footer_text', array( &$this, 'admin_footer_text' ) ); - - $screen = get_current_screen(); - - if ( is_array( $this->args['help_tabs'] ) ) { - foreach ( $this->args['help_tabs'] as $tab ) { - $screen->add_help_tab( $tab ); - } - } - - // If hint argument is set, display hint tab - if ( true == $this->show_hints ) { - global $current_user; - - // Users enable/disable hint choice - $hint_status = get_user_meta( $current_user->ID, 'ignore_hints' ) ? get_user_meta( $current_user->ID, 'ignore_hints', true ) : 'true'; - - // current page parameters - $curPage = esc_attr( $_GET['page'] ); - - $curTab = '0'; - if ( isset ( $_GET['tab'] ) ) { - $curTab = esc_attr( $_GET['tab'] ); - } - - // Default url values for enabling hints. - $dismiss = 'true'; - $s = __( 'Enable', 'redux-framework' ); - - // Values for disabling hints. - if ( 'true' == $hint_status ) { - $dismiss = 'false'; - $s = __( 'Disable', 'redux-framework' ); - } - - // Make URL - $url = '' . $s . ' hints'; - - $event = __( 'moving the mouse over', 'redux-framework' ); - if ( 'click' == $this->args['hints']['tip_effect']['show']['event'] ) { - $event = __( 'clicking', 'redux-framework' ); - } - - // Construct message - $msg = sprintf( __( 'Hints are tooltips that popup when %d the hint icon, offering addition information about the field in which they appear. They can be %d d by using the link below.', 'redux-framework' ), $event, strtolower( $s ) ) . '

    ' . $url; - - // Construct hint tab - $tab = array( - 'id' => 'redux-hint-tab', - 'title' => __( 'Hints', 'redux-framework' ), - 'content' => '

    ' . $msg . '

    ' - ); - - $screen->add_help_tab( $tab ); - } - - // Sidebar text - if ( $this->args['help_sidebar'] != '' ) { - - // Specify users text from arguments - $screen->set_help_sidebar( $this->args['help_sidebar'] ); - } else { - - // If sidebar text is empty and hints are active, display text - // about hints. - if ( true == $this->show_hints ) { - $screen->set_help_sidebar( '

    Redux Framework

    Hint Tooltip Preferences

    ' ); - } - } - - /** - * action 'redux-load-page-{opt_name}' - * - * @deprecated - * - * @param object $screen WP_Screen - */ - do_action( "redux-load-page-{$this->args['opt_name']}", $screen ); // REMOVE - - /** - * action 'redux/page/{opt_name}/load' - * - * @param object $screen WP_Screen - */ - do_action( "redux/page/{$this->args['opt_name']}/load", $screen ); - } - // _load_page() - - /** - * Do action redux-admin-head for options page - * - * @since 1.0.0 - * @access public - * @return void - */ - public function admin_head() { - /** - * action 'redux-admin-head-{opt_name}' - * - * @deprecated - * - * @param object $this ReduxFramework - */ - do_action( "redux-admin-head-{$this->args['opt_name']}", $this ); // REMOVE - - /** - * action 'redux/page/{opt_name}/header' - * - * @param object $this ReduxFramework - */ - do_action( "redux/page/{$this->args['opt_name']}/header", $this ); - } - // admin_head() - - /** - * Return footer text - * - * @since 2.0.0 - * @access public - * @return string $this->args['footer_credit'] - */ - public function admin_footer_text() { - return $this->args['footer_credit']; - } - // admin_footer_text() - - /** - * Return default output string for use in panel - * - * @since 3.1.5 - * @access public - * @return string default_output - */ - private function get_default_output_string( $field ) { - $default_output = ""; - - if ( ! isset ( $field['default'] ) ) { - $field['default'] = ""; - } - - if ( ! is_array( $field['default'] ) ) { - if ( ! empty ( $field['options'][ $field['default'] ] ) ) { - if ( ! empty ( $field['options'][ $field['default'] ]['alt'] ) ) { - $default_output .= $field['options'][ $field['default'] ]['alt'] . ', '; - } else { - // TODO: This serialize fix may not be the best solution. Look into it. PHP 5.4 error without serialize - if ( ! is_array( $field['options'][ $field['default'] ] ) ) { - $default_output .= $field['options'][ $field['default'] ] . ", "; - } else { - $default_output .= serialize( $field['options'][ $field['default'] ] ) . ", "; - } - } - } else if ( ! empty ( $field['options'][ $field['default'] ] ) ) { - $default_output .= $field['options'][ $field['default'] ] . ", "; - } else if ( ! empty ( $field['default'] ) ) { - if ( $field['type'] == 'switch' && isset ( $field['on'] ) && isset ( $field['off'] ) ) { - $default_output .= ( $field['default'] == 1 ? $field['on'] : $field['off'] ) . ', '; - } else { - $default_output .= $field['default'] . ', '; - } - } - } else { - foreach ( $field['default'] as $defaultk => $defaultv ) { - if ( ! empty ( $field['options'][ $defaultv ]['alt'] ) ) { - $default_output .= $field['options'][ $defaultv ]['alt'] . ', '; - } else if ( ! empty ( $field['options'][ $defaultv ] ) ) { - $default_output .= $field['options'][ $defaultv ] . ", "; - } else if ( ! empty ( $field['options'][ $defaultk ] ) ) { - $default_output .= $field['options'][ $defaultk ] . ", "; - } else if ( ! empty ( $defaultv ) ) { - $default_output .= $defaultv . ', '; - } - } - } - - if ( ! empty ( $default_output ) ) { - $default_output = __( 'Default', 'redux-framework' ) . ": " . substr( $default_output, 0, - 2 ); - } - - if ( ! empty ( $default_output ) ) { - $default_output = '' . $default_output . '
    '; - } - - return $default_output; - } - - // get_default_output_string() - - public function get_header_html( $field ) { - global $current_user; - - // Set to empty string to avoid wanrings. - $hint = ''; - $th = ""; - - if ( isset ( $field['title'] ) && isset ( $field['type'] ) && $field['type'] !== "info" && $field['type'] !== "section" ) { - $default_mark = ( ! empty ( $field['default'] ) && isset ( $this->options[ $field['id'] ] ) && $this->options[ $field['id'] ] == $field['default'] && ! empty ( $this->args['default_mark'] ) && isset ( $field['default'] ) ) ? $this->args['default_mark'] : ''; - - // If a hint is specified in the field, process it. - if ( isset ( $field['hint'] ) && ! '' == $field['hint'] ) { - - // Set show_hints flag to true, so helptab will be displayed. - $this->show_hints = true; - - $hint = apply_filters( 'redux/hints/html', $hint, $field, $this->args ); - - // Get user pref for displaying hints. - $metaVal = get_user_meta( $current_user->ID, 'ignore_hints', true ); - if ( 'true' == $metaVal || empty ( $metaVal ) && empty( $hint ) ) { - - // Set hand cursor for clickable hints - $pointer = ''; - if ( isset ( $this->args['hints']['tip_effect']['show']['event'] ) && 'click' == $this->args['hints']['tip_effect']['show']['event'] ) { - $pointer = 'pointer'; - } - - $size = '16px'; - if ( 'large' == $this->args['hints']['icon_size'] ) { - $size = '18px'; - } - - // In case docs are ignored. - $titleParam = isset ( $field['hint']['title'] ) ? $field['hint']['title'] : ''; - $contentParam = isset ( $field['hint']['content'] ) ? $field['hint']['content'] : ''; - - $hint_color = isset ( $this->args['hints']['icon_color'] ) ? $this->args['hints']['icon_color'] : '#d3d3d3'; - - // Set hint html with appropriate position css - $hint = '
     
    '; - } - } - - if ( ! empty ( $field['title'] ) ) { - if ( 'left' == $this->args['hints']['icon_position'] ) { - $th = $hint . $field['title'] . $default_mark . ""; - } else { - $th = $field['title'] . $default_mark . "" . $hint; - } - } - - if ( isset ( $field['subtitle'] ) ) { - $th .= '' . $field['subtitle'] . ''; - } - } - - if ( ! empty ( $th ) ) { - $th = '
    ' . $th . '
    '; - } - - $filter_arr = array( - 'editor', - 'ace_editor', - 'info', - 'section', - 'repeater', - 'color_scheme', - 'social_profiles', - 'css_layout' - ); - - if ( $this->args['default_show'] == true && isset ( $field['default'] ) && isset ( $this->options[ $field['id'] ] ) && $this->options[ $field['id'] ] != $field['default'] && ! in_array( $field['type'], $filter_arr ) ) { - $th .= $this->get_default_output_string( $field ); - } - - return $th; - } - - /** - * Register Option for use - * - * @since 1.0.0 - * @access public - * @return void - */ - public function _register_settings() { - - // TODO - REMOVE - // Not used by new sample-config, but in here for legacy builds - // This is bad and can break things. Hehe. - if ( ! function_exists( 'wp_get_current_user' ) ) { - require_once ABSPATH . "wp-includes/pluggable.php"; - } - - if ( $this->args['options_api'] == true ) { - register_setting( $this->args['opt_name'] . '_group', $this->args['opt_name'], array( - $this, - '_validate_options' - ) ); - } - - - if ( is_null( $this->sections ) ) { - return; - } - - if ( empty( $this->options_defaults ) ) { - $this->options_defaults = $this->_default_values(); - } - - $runUpdate = false; - - foreach ( $this->sections as $k => $section ) { - if ( isset ( $section['type'] ) && $section['type'] == 'divide' ) { - continue; - } - - $display = true; - - if ( isset ( $_GET['page'] ) && $_GET['page'] == $this->args['page_slug'] ) { - if ( isset ( $section['panel'] ) && $section['panel'] == false ) { - $display = false; - } - } - - - // DOVY! Replace $k with $section['id'] when ready - /** - * filter 'redux-section-{index}-modifier-{opt_name}' - * - * @param array $section section configuration - */ - $section = apply_filters( "redux-section-{$k}-modifier-{$this->args['opt_name']}", $section ); - - /** - * filter 'redux/options/{opt_name}/section/{section.id}' - * - * @param array $section section configuration - */ - if ( isset ( $section['id'] ) ) { - $section = apply_filters( "redux/options/{$this->args['opt_name']}/section/{$section['id']}", $section ); - } - - if ( empty ( $section ) ) { - unset ( $this->sections[ $k ] ); - continue; - } - - if ( ! isset ( $section['title'] ) ) { - $section['title'] = ""; - } - - if ( isset ( $section['customizer_only'] ) && $section['customizer_only'] == true ) { - $section['panel'] = false; - $this->sections[ $k ] = $section; - } - - $heading = isset ( $section['heading'] ) ? $section['heading'] : $section['title']; - - if ( isset ( $section['permissions'] ) ) { - if ( ! current_user_can( $section['permissions'] ) ) { - $this->hidden_perm_sections[] = $section['title']; - - foreach ( $section['fields'] as $num => $field_data ) { - $field_type = $field_data['type']; - - if ( $field_type != 'section' || $field_type != 'divide' || $field_type != 'info' || $field_type != 'raw' ) { - $field_id = $field_data['id']; - $default = isset ( $this->options_defaults[ $field_id ] ) ? $this->options_defaults[ $field_id ] : ''; - $data = isset ( $this->options[ $field_id ] ) ? $this->options[ $field_id ] : $default; - - $this->hidden_perm_fields[ $field_id ] = $data; - } - } - - continue; - } - } - - if ( ! $display || ! function_exists( 'add_settings_section' ) ) { - $this->no_panel_section[ $k ] = $section; - } else { - add_settings_section( $this->args['opt_name'] . $k . '_section', $heading, array( - &$this, - '_section_desc' - ), $this->args['opt_name'] . $k . '_section_group' ); - } - - $sectionIndent = false; - if ( isset ( $section['fields'] ) ) { - foreach ( $section['fields'] as $fieldk => $field ) { - if ( ! isset ( $field['type'] ) ) { - continue; // You need a type! - } - - if ( $field['type'] == "info" && isset( $field['raw_html'] ) && $field['raw_html'] == true ) { - $field['type'] = "raw"; - $field['content'] = $field['desc']; - $field['desc'] = ""; - $this->sections[ $k ]['fields'][ $fieldk ] = $field; - } else if ( $field['type'] == "info" ) { - if ( ! isset( $field['full_width'] ) ) { - $field['full_width'] = true; - $this->sections[ $k ]['fields'][ $fieldk ] = $field; - } - } - - if ( $field['type'] == "raw" ) { - if ( isset( $field['align'] ) ) { - $field['full_width'] = $field['align'] ? false : true; - unset( $field['align'] ); - } else if ( ! isset( $field['full_width'] ) ) { - $field['full_width'] = true; - } - $this->sections[ $k ]['fields'][ $fieldk ] = $field; - } - - - /** - * filter 'redux/options/{opt_name}/field/{field.id}' - * - * @param array $field field config - */ - $field = apply_filters( "redux/options/{$this->args['opt_name']}/field/{$field['id']}/register", $field ); - - - $this->field_types[ $field['type'] ] = isset ( $this->field_types[ $field['type'] ] ) ? $this->field_types[ $field['type'] ] : array(); - - $this->field_sections[ $field['type'] ][ $field['id'] ] = $k; - - $display = true; - - if ( isset ( $_GET['page'] ) && $_GET['page'] == $this->args['page_slug'] ) { - if ( isset ( $field['panel'] ) && $field['panel'] == false ) { - $display = false; - } - } - if ( isset ( $field['customizer_only'] ) && $field['customizer_only'] == true ) { - $display = false; - } - - if ( isset ( $section['customizer'] ) ) { - $field['customizer'] = $section['customizer']; - $this->sections[ $k ]['fields'][ $fieldk ] = $field; - } - - if ( isset ( $field['permissions'] ) ) { - - if ( ! current_user_can( $field['permissions'] ) ) { - $data = isset ( $this->options[ $field['id'] ] ) ? $this->options[ $field['id'] ] : $this->options_defaults[ $field['id'] ]; - - $this->hidden_perm_fields[ $field['id'] ] = $data; - - continue; - } - } - - if ( ! isset ( $field['id'] ) ) { - echo '

    No field ID is set.

    ';
    -                                print_r( $field );
    -                                echo "

    "; - continue; - } - - if ( isset ( $field['type'] ) && $field['type'] == "section" ) { - if ( isset ( $field['indent'] ) && $field['indent'] == true ) { - $sectionIndent = true; - } else { - $sectionIndent = false; - } - } - - if ( isset ( $field['type'] ) && $field['type'] == "info" && $sectionIndent ) { - $field['indent'] = $sectionIndent; - } - - $th = $this->get_header_html( $field ); - - $field['name'] = $this->args['opt_name'] . '[' . $field['id'] . ']'; - - // Set the default value if present - $this->options_defaults[ $field['id'] ] = isset ( $this->options_defaults[ $field['id'] ] ) ? $this->options_defaults[ $field['id'] ] : ''; - - // Set the defaults to the value if not present - $doUpdate = false; - - // Check fields for values in the default parameter - if ( ! isset ( $this->options[ $field['id'] ] ) && isset ( $field['default'] ) ) { - $this->options_defaults[ $field['id'] ] = $this->options[ $field['id'] ] = $field['default']; - $doUpdate = true; - - // Check fields that hae no default value, but an options value with settings to - // be saved by default - } elseif ( ! isset ( $this->options[ $field['id'] ] ) && isset ( $field['options'] ) ) { - - // If sorter field, check for options as save them as defaults - if ( $field['type'] == 'sorter' || $field['type'] == 'sortable' ) { - $this->options_defaults[ $field['id'] ] = $this->options[ $field['id'] ] = $field['options']; - $doUpdate = true; - } - } - - // CORRECT URLS if media URLs are wrong, but attachment IDs are present. - if ( $field['type'] == "media" ) { - if ( isset ( $this->options[ $field['id'] ]['id'] ) && isset ( $this->options[ $field['id'] ]['url'] ) && ! empty ( $this->options[ $field['id'] ]['url'] ) && strpos( $this->options[ $field['id'] ]['url'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) { - $data = wp_get_attachment_url( $this->options[ $field['id'] ]['id'] ); - - if ( isset ( $data ) && ! empty ( $data ) ) { - $this->options[ $field['id'] ]['url'] = $data; - $data = wp_get_attachment_image_src( $this->options[ $field['id'] ]['id'], array( - 150, - 150 - ) ); - $this->options[ $field['id'] ]['thumbnail'] = $data[0]; - $doUpdate = true; - } - } - } - - if ( $field['type'] == "background" ) { - if ( isset ( $this->options[ $field['id'] ]['media']['id'] ) && isset ( $this->options[ $field['id'] ]['background-image'] ) && ! empty ( $this->options[ $field['id'] ]['background-image'] ) && strpos( $this->options[ $field['id'] ]['background-image'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) { - $data = wp_get_attachment_url( $this->options[ $field['id'] ]['media']['id'] ); - - if ( isset ( $data ) && ! empty ( $data ) ) { - $this->options[ $field['id'] ]['background-image'] = $data; - $data = wp_get_attachment_image_src( $this->options[ $field['id'] ]['media']['id'], array( - 150, - 150 - ) ); - $this->options[ $field['id'] ]['media']['thumbnail'] = $data[0]; - $doUpdate = true; - } - } - } - - if ( $field['type'] == "slides" ) { - if ( isset ( $this->options[ $field['id'] ] ) && is_array( $this->options[ $field['id'] ] ) && isset ( $this->options[ $field['id'] ][0]['attachment_id'] ) && isset ( $this->options[ $field['id'] ][0]['image'] ) && ! empty ( $this->options[ $field['id'] ][0]['image'] ) && strpos( $this->options[ $field['id'] ][0]['image'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) { - foreach ( $this->options[ $field['id'] ] as $key => $val ) { - $data = wp_get_attachment_url( $val['attachment_id'] ); - - if ( isset ( $data ) && ! empty ( $data ) ) { - $this->options[ $field['id'] ][ $key ]['image'] = $data; - $data = wp_get_attachment_image_src( $val['attachment_id'], array( - 150, - 150 - ) ); - $this->options[ $field['id'] ][ $key ]['thumb'] = $data[0]; - $doUpdate = true; - } - } - } - } - // END -> CORRECT URLS if media URLs are wrong, but attachment IDs are present. - - if ( true == $doUpdate && ! isset ( $this->never_save_to_db ) ) { - if ( $this->args['save_defaults'] ) { // Only save that to the DB if allowed to - $runUpdate = true; - } - // elseif($this->saved != '' && $this->saved != false) { - // $runUpdate = true; - //} - } - - if ( ! isset ( $field['class'] ) ) { // No errors please - $field['class'] = ""; - } - $id = $field['id']; - - /** - * filter 'redux-field-{field.id}modifier-{opt_name}' - * - * @deprecated - * - * @param array $field field config - */ - $field = apply_filters( "redux-field-{$field['id']}modifier-{$this->args['opt_name']}", $field ); // REMOVE LATER - - /** - * filter 'redux/options/{opt_name}/field/{field.id}' - * - * @param array $field field config - */ - $field = apply_filters( "redux/options/{$this->args['opt_name']}/field/{$field['id']}", $field ); - - if ( empty ( $field ) || ! $field || $field == false ) { - unset ( $this->sections[ $k ]['fields'][ $fieldk ] ); - continue; - } - - if ( ! empty ( $this->folds[ $field['id'] ]['parent'] ) ) { // This has some fold items, hide it by default - $field['class'] .= " fold"; - } - - if ( ! empty ( $this->folds[ $field['id'] ]['children'] ) ) { // Sets the values you shoe fold children on - $field['class'] .= " foldParent"; - } - - if ( ! empty ( $field['compiler'] ) ) { - $field['class'] .= " compiler"; - $this->compiler_fields[ $field['id'] ] = 1; - } - - if ( isset ( $field['unit'] ) && ! isset ( $field['units'] ) ) { - $field['units'] = $field['unit']; - unset ( $field['unit'] ); - } - - $this->sections[ $k ]['fields'][ $fieldk ] = $field; - - if ( isset ( $this->args['display_source'] ) ) { - $th .= ''; - $th .= '
    View Source'; - } - - /** - * action 'redux/options/{opt_name}/field/field.type}/register' - */ - do_action( "redux/options/{$this->args['opt_name']}/field/{$field['type']}/register", $field ); - - $this->check_dependencies( $field ); - $this->field_head[ $field['id'] ] = $th; - - if ( ! $display || isset ( $this->no_panel_section[ $k ] ) ) { - $this->no_panel[] = $field['id']; - } else { - if ( isset ( $field['hidden'] ) && $field['hidden'] ) { - $field['label_for'] = 'redux_hide_field'; - } - if ( $this->args['options_api'] == true ) { - add_settings_field( - "{$fieldk}_field", $th, array( - &$this, - '_field_input' - ), "{$this->args['opt_name']}{$k}_section_group", "{$this->args['opt_name']}{$k}_section", $field - ); - } - } - } - } - } - - /** - * action 'redux-register-settings-{opt_name}' - * - * @deprecated - */ - do_action( "redux-register-settings-{$this->args['opt_name']}" ); // REMOVE - - /** - * action 'redux/options/{opt_name}/register' - * - * @param array option sections - */ - do_action( "redux/options/{$this->args['opt_name']}/register", $this->sections ); - - if ( $runUpdate && ! isset ( $this->never_save_to_db ) ) { // Always update the DB with new fields - $this->set_options( $this->options ); - } - - if ( isset ( $this->transients['run_compiler'] ) && $this->transients['run_compiler'] ) { - - $this->no_output = true; - $this->_enqueue_output(); - - - /** - * action 'redux-compiler-{opt_name}' - * - * @deprecated - * - * @param array options - * @param string CSS that get sent to the compiler hook - */ - do_action( "redux-compiler-{$this->args['opt_name']}", $this->options, $this->compilerCSS, $this->transients['changed_values'] ); // REMOVE - - /** - * action 'redux/options/{opt_name}a' - * - * @param array options - * @param string CSS that get sent to the compiler hook - */ - do_action( "redux/options/{$this->args['opt_name']}/compiler", $this->options, $this->compilerCSS, $this->transients['changed_values'] ); - - /** - * action 'redux/options/{opt_name}/compiler/advanced' - * - * @param array options - * @param string CSS that get sent to the compiler hook, which sends the full Redux object - */ - do_action( "redux/options/{$this->args['opt_name']}/compiler/advanced", $this ); - - unset ( $this->transients['run_compiler'] ); - $this->set_transients(); - } - } - // _register_settings() - - /** - * Register Extensions for use - * - * @since 3.0.0 - * @access public - * @return void - */ - private function _register_extensions() { - $path = dirname( __FILE__ ) . '/inc/extensions/'; - $folders = scandir( $path, 1 ); - - /** - * action 'redux/extensions/before' - * - * @param object $this ReduxFramework - */ - do_action( "redux/extensions/before", $this ); - - /** - * action 'redux/extensions/{opt_name}/before' - * - * @param object $this ReduxFramework - */ - do_action( "redux/extensions/{$this->args['opt_name']}/before", $this ); - - if ( isset( $this->old_opt_name ) ) { - do_action( "redux/extensions/{$this->old_opt_name}/before", $this ); - } - - foreach ( $folders as $folder ) { - if ( $folder === '.' || $folder === '..' || ! is_dir( $path . $folder ) || substr( $folder, 0, 1 ) === '.' || substr( $folder, 0, 1 ) === '@' || substr( $folder, 0, 4 ) === '_vti' ) { - continue; - } - - $extension_class = 'ReduxFramework_Extension_' . $folder; - - /** - * filter 'redux-extensionclass-load' - * - * @deprecated - * - * @param string extension class file path - * @param string $extension_class extension class name - */ - $class_file = apply_filters( "redux-extensionclass-load", "$path/$folder/extension_{$folder}.php", $extension_class ); // REMOVE LATER - - /** - * filter 'redux/extension/{opt_name}/{folder}' - * - * @param string extension class file path - * @param string $extension_class extension class name - */ - $class_file = apply_filters( "redux/extension/{$this->args['opt_name']}/$folder", "$path/$folder/extension_{$folder}.php", $class_file ); - - if ( $class_file ) { - - if ( file_exists( $class_file ) ) { - require_once $class_file; - - $this->extensions[ $folder ] = new $extension_class ( $this ); - } - } - } - - /** - * action 'redux-register-extensions-{opt_name}' - * - * @deprecated - * - * @param object $this ReduxFramework - */ - do_action( "redux-register-extensions-{$this->args['opt_name']}", $this ); // REMOVE - - /** - * action 'redux/extensions/{opt_name}' - * - * @param object $this ReduxFramework - */ - do_action( "redux/extensions/{$this->args['opt_name']}", $this ); - - if ( isset( $this->old_opt_name ) && ! empty( $this->old_opt_name ) ) { - do_action( "redux/extensions/{$this->old_opt_name}", $this ); - } - } - - private function get_transients() { - if ( ! isset ( $this->transients ) ) { - $this->transients = get_option( $this->args['opt_name'] . '-transients', array() ); - $this->transients_check = $this->transients; - } - } - - public function set_transients() { - if ( ! isset ( $this->transients ) || ! isset ( $this->transients_check ) || $this->transients != $this->transients_check ) { - update_option( $this->args['opt_name'] . '-transients', $this->transients ); - $this->transients_check = $this->transients; - } - } - - /** - * Validate the Options options before insertion - * - * @since 3.0.0 - * @access public - * - * @param array $plugin_options The options array - * - * @return array|mixed|string|void - */ - public function _validate_options( $plugin_options ) { - //print_r($plugin_options); - // exit(); - if ( isset ( $this->validation_ran ) ) { - return $plugin_options; - } - $this->validation_ran = 1; - - // Save the values not in the panel - if ( isset ( $plugin_options['redux-no_panel'] ) ) { - $keys = explode( '|', $plugin_options['redux-no_panel'] ); - foreach ( $keys as $key ) { - $plugin_options[ $key ] = $this->options[ $key ]; - } - if ( isset ( $plugin_options['redux-no_panel'] ) ) { - unset ( $plugin_options['redux-no_panel'] ); - } - } - - if ( ! empty ( $this->hidden_perm_fields ) && is_array( $this->hidden_perm_fields ) ) { - foreach ( $this->hidden_perm_fields as $id => $data ) { - $plugin_options[ $id ] = $data; - } - } - - if ( $plugin_options == $this->options ) { - return $plugin_options; - } - - $time = time(); - - // Sets last saved time - $this->transients['last_save'] = $time; - - // Import - if ( ( isset( $plugin_options['import_code'] ) && ! empty( $plugin_options['import_code'] ) ) || ( isset( $plugin_options['import_link'] ) && ! empty( $plugin_options['import_link'] ) ) ) { - $this->transients['last_save_mode'] = "import"; // Last save mode - $this->transients['last_compiler'] = $time; - $this->transients['last_import'] = $time; - $this->transients['run_compiler'] = 1; - - if ( $plugin_options['import_code'] != '' ) { - $import = $plugin_options['import_code']; - } elseif ( $plugin_options['import_link'] != '' ) { - $import = wp_remote_retrieve_body( wp_remote_get( $plugin_options['import_link'] ) ); - } - - if ( ! empty ( $import ) ) { - $imported_options = json_decode( $import, true ); - } - - if ( ! empty ( $imported_options ) && is_array( $imported_options ) && isset ( $imported_options['redux-backup'] ) && $imported_options['redux-backup'] == '1' ) { - - $this->transients['changed_values'] = array(); - foreach ( $plugin_options as $key => $value ) { - if ( isset ( $imported_options[ $key ] ) && $imported_options[ $key ] != $value ) { - $this->transients['changed_values'][ $key ] = $value; - $plugin_options[ $key ] = $value; - } - } - - /** - * action 'redux/options/{opt_name}/import' - * - * @param &array [&$plugin_options, redux_options] - */ - do_action_ref_array( "redux/options/{$this->args['opt_name']}/import", array( - &$plugin_options, - $imported_options, - $this->transients['changed_values'] - ) ); - - setcookie( 'redux_current_tab', '', 1, '/', $time + 1000, "/" ); - $_COOKIE['redux_current_tab'] = 1; - - unset ( $plugin_options['defaults'], $plugin_options['compiler'], $plugin_options['import'], $plugin_options['import_code'] ); - if ( $this->args['database'] == 'transient' || $this->args['database'] == 'theme_mods' || $this->args['database'] == 'theme_mods_expanded' || $this->args['database'] == 'network' ) { - $this->set_options( $plugin_options ); - - return; - } - - $plugin_options = wp_parse_args( $imported_options, $plugin_options ); - - $this->set_transients(); // Update the transients - - return $plugin_options; - } - } - - // Reset all to defaults - if ( ! empty ( $plugin_options['defaults'] ) ) { - if ( empty ( $this->options_defaults ) ) { - $this->options_defaults = $this->_default_values(); - } - - /** - * apply_filters 'redux/validate/{opt_name}/defaults' - * - * @param &array [ $this->options_defaults, $plugin_options] - */ - $plugin_options = apply_filters( "redux/validate/{$this->args['opt_name']}/defaults", $this->options_defaults ); - - $this->transients['changed_values'] = array(); - - if ( empty ( $this->options ) ) { - $this->options = $this->options_defaults; - } - - foreach ( $this->options as $key => $value ) { - if ( isset ( $plugin_options[ $key ] ) && $value != $plugin_options[ $key ] ) { - $this->transients['changed_values'][ $key ] = $value; - } - } - - $this->transients['run_compiler'] = 1; - $this->transients['last_save_mode'] = "defaults"; // Last save mode - //setcookie('redux-compiler-' . $this->args['opt_name'], 1, time() + 1000, "/"); - //setcookie("redux-saved-{$this->args['opt_name']}", 'defaults', time() + 1000, "/"); - - $this->set_transients(); // Update the transients - - return $plugin_options; - } - - // Section reset to defaults - if ( ! empty ( $plugin_options['defaults-section'] ) ) { - if ( isset ( $plugin_options['redux-section'] ) && isset ( $this->sections[ $plugin_options['redux-section'] ]['fields'] ) ) { - /** - * apply_filters 'redux/validate/{opt_name}/defaults_section' - * - * @param &array [ $this->options_defaults, $plugin_options] - */ - foreach ( $this->sections[ $plugin_options['redux-section'] ]['fields'] as $field ) { - if ( isset ( $this->options_defaults[ $field['id'] ] ) ) { - $plugin_options[ $field['id'] ] = $this->options_defaults[ $field['id'] ]; - } else { - $plugin_options[ $field['id'] ] = ""; - } - - if ( isset ( $field['compiler'] ) ) { - $compiler = true; - } - } - - $plugin_options = apply_filters( "redux/validate/{$this->args['opt_name']}/defaults_section", $plugin_options ); - } - - $this->transients['changed_values'] = array(); - foreach ( $this->options as $key => $value ) { - if ( isset ( $plugin_options[ $key ] ) && $value != $plugin_options[ $key ] ) { - $this->transients['changed_values'][ $key ] = $value; - } - } - - if ( isset ( $compiler ) ) { - //$this->run_compiler = true; - //setcookie('redux-compiler-' . $this->args['opt_name'], 1, time()+1000, '/'); - //$plugin_options['REDUX_COMPILER'] = time(); - $this->transients['last_compiler'] = $time; - $this->transients['run_compiler'] = 1; - } - - $this->transients['last_save_mode'] = "defaults_section"; // Last save mode - //setcookie("redux-saved-{$this->args['opt_name']}", 'defaults_section', time() + 1000, "/"); - unset ( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] ); - - $this->set_transients(); - - return $plugin_options; - } - - // if ($this->transients['last_save_mode'] != 'remove') { - $this->transients['last_save_mode'] = "normal"; // Last save mode - // } else { - // $this->transients['last_save_mode'] = ''; - // } - - /** - * apply_filters 'redux/validate/{opt_name}/before_validation' - * - * @param &array [&$plugin_options, redux_options] - */ - $plugin_options = apply_filters( "redux/validate/{$this->args['opt_name']}/before_validation", $plugin_options, $this->options ); - - // Validate fields (if needed) - $plugin_options = $this->_validate_values( $plugin_options, $this->options, $this->sections ); - - if ( ! empty ( $this->errors ) || ! empty ( $this->warnings ) ) { - $this->transients['notices'] = array( 'errors' => $this->errors, 'warnings' => $this->warnings ); - } - - /** - * action 'redux-validate-{opt_name}' - * - * @deprecated - * - * @param &array [&$plugin_options, redux_options] - */ - do_action_ref_array( "redux-validate-{$this->args['opt_name']}", array( - &$plugin_options, - $this->options - ) ); // REMOVE - - if ( ! isset ( $this->transients['changed_values'] ) ) { - $this->transients['changed_values'] = array(); - } - - /** - * action 'redux/options/{opt_name}/validate' - * - * @param &array [&$plugin_options, redux_options] - */ - do_action_ref_array( "redux/options/{$this->args['opt_name']}/validate", array( - &$plugin_options, - $this->options, - $this->transients['changed_values'] - ) ); - - if ( ! empty ( $plugin_options['compiler'] ) ) { - unset ( $plugin_options['compiler'] ); - - $this->transients['last_compiler'] = $time; - $this->transients['run_compiler'] = 1; - } - - $this->transients['changed_values'] = array(); // Changed values since last save - foreach ( $this->options as $key => $value ) { - if ( isset ( $plugin_options[ $key ] ) && $value != $plugin_options[ $key ] ) { - $this->transients['changed_values'][ $key ] = $value; - } - } - - unset ( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] ); - if ( $this->args['database'] == 'transient' || $this->args['database'] == 'theme_mods' || $this->args['database'] == 'theme_mods_expanded' ) { - $this->set_options( $plugin_options ); - - return; - } - - if ( defined( 'WP_CACHE' ) && WP_CACHE && class_exists( 'W3_ObjectCache' ) && function_exists( 'w3_instance' ) ) { - //echo "here"; - $w3_inst = w3_instance( 'W3_ObjectCache' ); - $w3 = $w3_inst->instance(); - $key = $w3->_get_cache_key( $this->args['opt_name'] . '-transients', 'transient' ); - //echo $key; - $w3->delete( $key, 'transient', true ); - //set_transient($this->args['opt_name'].'-transients', $this->transients); - //exit(); - } - - $this->set_transients( $this->transients ); - - return $plugin_options; - } - - public function ajax_save() { - if ( ! wp_verify_nonce( $_REQUEST['nonce'], "redux_ajax_nonce" . $this->args['opt_name'] ) ) { - echo json_encode( array( - 'status' => __( 'Invalid security credential. Please reload the page and try again.', 'redux-framework' ), - 'action' => '' - ) ); - - die(); - } - - if ( ! current_user_can( $this->args['page_permissions'] ) ) { - echo json_encode( array( - 'status' => __( 'Invalid user capability. Please reload the page and try again.', 'redux-framework' ), - 'action' => '' - ) ); - - die(); - } - - $redux = ReduxFrameworkInstances::get_instance( $_POST['opt_name'] ); - - if ( ! empty ( $_POST['data'] ) && ! empty ( $redux->args['opt_name'] ) ) { - - $values = array(); - //if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) { - // $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); - // while (list($key, $val) = each($process)) { - // foreach ($val as $k => $v) { - // unset($process[$key][$k]); - // if (is_array($v)) { - // $process[$key][stripslashes($k)] = $v; - // $process[] = &$process[$key][stripslashes($k)]; - // } else { - // $process[$key][stripslashes($k)] = stripslashes($v); - // } - // } - // } - // unset($process); - //} - $_POST['data'] = stripslashes( $_POST['data'] ); - - // Old method of saving, in case we need to go back! - kp - //parse_str( $_POST['data'], $values ); - - // New method to avoid input_var nonesense. Thanks @harunbasic - $values = $this->redux_parse_str( $_POST['data'] ); - - $values = $values[ $redux->args['opt_name'] ]; - - if ( function_exists( 'get_magic_quotes_gpc' ) && get_magic_quotes_gpc() ) { - $values = array_map( 'stripslashes_deep', $values ); - } - - if ( ! empty ( $values ) ) { - - try { - if ( isset ( $redux->validation_ran ) ) { - unset ( $redux->validation_ran ); - } - $redux->set_options( $redux->_validate_options( $values ) ); - - $do_reload = false; - if ( isset( $this->reload_fields ) && ! empty( $this->reload_fields ) ) { - if ( ! empty( $this->transients['changed_values'] ) ) { - foreach ( $this->reload_fields as $idx => $val ) { - if ( array_key_exists( $val, $this->transients['changed_values'] ) ) { - $do_reload = true; - } - } - } - } - - if ( $do_reload || ( isset ( $values['defaults'] ) && ! empty ( $values['defaults'] ) ) || ( isset ( $values['defaults-section'] ) && ! empty ( $values['defaults-section'] ) ) ) { - echo json_encode( array( 'status' => 'success', 'action' => 'reload' ) ); - die (); - } - - require_once 'core/enqueue.php'; - $enqueue = new reduxCoreEnqueue ( $redux ); - $enqueue->get_warnings_and_errors_array(); - - $return_array = array( - 'status' => 'success', - 'options' => $redux->options, - 'errors' => isset ( $redux->localize_data['errors'] ) ? $redux->localize_data['errors'] : null, - 'warnings' => isset ( $redux->localize_data['warnings'] ) ? $redux->localize_data['warnings'] : null, - ); - - } catch ( Exception $e ) { - $return_array = array( 'status' => $e->getMessage() ); - } - } else { - echo json_encode( array( 'status' => __( 'Your panel has no fields. Nothing to save.', 'redux-framework' ) ) ); - } - } - if ( isset ( $this->transients['run_compiler'] ) && $this->transients['run_compiler'] ) { - - $this->no_output = true; - $this->_enqueue_output(); - - try { - /** - * action 'redux-compiler-{opt_name}' - * - * @deprecated - * - * @param array options - * @param string CSS that get sent to the compiler hook - */ - do_action( "redux-compiler-{$this->args['opt_name']}", $this->options, $this->compilerCSS, $this->transients['changed_values'] ); // REMOVE - - /** - * action 'redux/options/{opt_name}/compiler' - * - * @param array options - * @param string CSS that get sent to the compiler hook - */ - do_action( "redux/options/{$this->args['opt_name']}/compiler", $this->options, $this->compilerCSS, $this->transients['changed_values'] ); - - /** - * action 'redux/options/{opt_name}/compiler/advanced' - * - * @param array options - * @param string CSS that get sent to the compiler hook, which sends the full Redux object - */ - do_action( "redux/options/{$this->args['opt_name']}/compiler/advanced", $this ); - } catch ( Exception $e ) { - $return_array = array( 'status' => $e->getMessage() ); - } - - unset ( $this->transients['run_compiler'] ); - $this->set_transients(); - } - if ( isset( $return_array ) ) { - if ( $return_array['status'] == "success" ) { - require_once 'core/panel.php'; - $panel = new reduxCorePanel ( $redux ); - ob_start(); - $panel->notification_bar(); - $notification_bar = ob_get_contents(); - ob_end_clean(); - $return_array['notification_bar'] = $notification_bar; - } - - echo json_encode( apply_filters( "redux/options/{$this->args['opt_name']}/ajax_save/response", $return_array ) ); - } - - die (); - - } - - /** - * Validate values from options form (used in settings api validate function) - * calls the custom validation class for the field so authors can override with custom classes - * - * @since 1.0.0 - * @access public - * - * @param array $plugin_options - * @param array $options - * - * @return array $plugin_options - */ - public function _validate_values( $plugin_options, $options, $sections ) { - foreach ( $sections as $k => $section ) { - if ( isset ( $section['fields'] ) ) { - foreach ( $section['fields'] as $fkey => $field ) { - - if ( is_array( $field ) ) { - $field['section_id'] = $k; - } - - if ( isset ( $field['type'] ) && ( $field['type'] == 'checkbox' || $field['type'] == 'checkbox_hide_below' || $field['type'] == 'checkbox_hide_all' ) ) { - if ( ! isset ( $plugin_options[ $field['id'] ] ) ) { - $plugin_options[ $field['id'] ] = 0; - } - } - -// if ( isset ( $field['type'] ) && $field['type'] == 'typography' ) { -// if ( ! is_array( $plugin_options[ $field['id'] ] ) && ! empty( $plugin_options[ $field['id'] ] ) ) { -// $plugin_options[ $field['id'] ] = json_decode( $plugin_options[ $field['id'] ], true ); -// } -// } - - if ( isset( $this->extensions[ $field['type'] ] ) && method_exists( $this->extensions[ $field['type'] ], '_validate_values' ) ) { - $plugin_options = $this->extensions[ $field['type'] ]->_validate_values( $plugin_options, $field ); - } - - // Default 'not_empty 'flag to false. - $isNotEmpty = false; - - // Make sure 'validate' field is set. - if ( isset ( $field['validate'] ) ) { - - // Make sure 'validate field' is set to 'not_empty' or 'email_not_empty' - //if ( $field['validate'] == 'not_empty' || $field['validate'] == 'email_not_empty' || $field['validate'] == 'numeric_not_empty' ) { - if ( strtolower( substr( $field['validate'], - 9 ) ) == 'not_empty' ) { - - // Set the flag. - $isNotEmpty = true; - } - } - - // Check for empty id value - - if ( ! isset ( $field['id'] ) || ! isset ( $plugin_options[ $field['id'] ] ) || ( isset ( $plugin_options[ $field['id'] ] ) && $plugin_options[ $field['id'] ] == '' ) ) { - - // If we are looking for an empty value, in the case of 'not_empty' - // then we need to keep processing. - if ( ! $isNotEmpty ) { - - // Empty id and not checking for 'not_empty. Bail out... - if (!isset($field['validate_callback'])) { - continue; - } - //continue; - } - } - - // Force validate of custom field types - if ( isset ( $field['type'] ) && ! isset ( $field['validate'] ) && ! isset( $field['validate_callback'] ) ) { - if ( $field['type'] == 'color' || $field['type'] == 'color_gradient' ) { - $field['validate'] = 'color'; - } elseif ( $field['type'] == 'date' ) { - $field['validate'] = 'date'; - } - } - - if ( isset ( $field['validate'] ) ) { - $validate = 'Redux_Validation_' . $field['validate']; - - if ( ! class_exists( $validate ) ) { - /** - * filter 'redux-validateclass-load' - * - * @deprecated - * - * @param string validation class file path - * @param string $validate validation class name - */ - $class_file = apply_filters( "redux-validateclass-load", self::$_dir . "inc/validation/{$field['validate']}/validation_{$field['validate']}.php", $validate ); // REMOVE LATER - - /** - * filter 'redux/validate/{opt_name}/class/{field.validate}' - * - * @param string validation class file path - * @param string $class_file validation class file path - */ - $class_file = apply_filters( "redux/validate/{$this->args['opt_name']}/class/{$field['validate']}", self::$_dir . "inc/validation/{$field['validate']}/validation_{$field['validate']}.php", $class_file ); - - if ( $class_file ) { - if ( file_exists( $class_file ) ) { - require_once $class_file; - } - } - } - - if ( class_exists( $validate ) ) { - - //!DOVY - DB saving stuff. Is this right? - if ( empty ( $options[ $field['id'] ] ) ) { - $options[ $field['id'] ] = ''; - } - - if ( isset ( $plugin_options[ $field['id'] ] ) && is_array( $plugin_options[ $field['id'] ] ) && ! empty ( $plugin_options[ $field['id'] ] ) ) { - foreach ( $plugin_options[ $field['id'] ] as $key => $value ) { - $before = $after = null; - if ( isset ( $plugin_options[ $field['id'] ][ $key ] ) && ( ! empty ( $plugin_options[ $field['id'] ][ $key ] ) || $plugin_options[ $field['id'] ][ $key ] == '0' ) ) { - if ( is_array( $plugin_options[ $field['id'] ][ $key ] ) ) { - $before = $plugin_options[ $field['id'] ][ $key ]; - } else { - $before = trim( $plugin_options[ $field['id'] ][ $key ] ); - } - } - - if ( isset ( $options[ $field['id'] ][ $key ] ) && ( ! empty ( $plugin_options[ $field['id'] ][ $key ] ) || $plugin_options[ $field['id'] ][ $key ] == '0' ) ) { - $after = $options[ $field['id'] ][ $key ]; - } - - $validation = new $validate ( $this, $field, $before, $after ); - if ( ! empty ( $validation->value ) || $validation->value == '0' ) { - $plugin_options[ $field['id'] ][ $key ] = $validation->value; - } else { - unset ( $plugin_options[ $field['id'] ][ $key ] ); - } - - if ( isset ( $validation->error ) ) { - $this->errors[] = $validation->error; - } - - if ( isset ( $validation->warning ) ) { - $this->warnings[] = $validation->warning; - } - } - } else { - if ( isset( $plugin_options[ $field['id'] ] ) ) { - if ( is_array( $plugin_options[ $field['id'] ] ) ) { - $pofi = $plugin_options[ $field['id'] ]; - } else { - $pofi = trim( $plugin_options[ $field['id'] ] ); - } - } else { - $pofi = null; - } - - $validation = new $validate ( $this, $field, $pofi, $options[ $field['id'] ] ); - $plugin_options[ $field['id'] ] = $validation->value; - - if ( isset ( $validation->error ) ) { - $this->errors[] = $validation->error; - } - - if ( isset ( $validation->warning ) ) { - $this->warnings[] = $validation->warning; - } - } - - continue; - } - } - if ( isset ( $field['validate_callback'] ) && ( is_callable( $field['validate_callback'] ) || ( is_string( $field['validate_callback'] ) && function_exists( $field['validate_callback'] ) ) ) ) { - $callback = $field['validate_callback']; - unset ( $field['validate_callback'] ); - - $callbackvalues = call_user_func( $callback, $field, $plugin_options[ $field['id'] ], $options[ $field['id'] ] ); - $plugin_options[ $field['id'] ] = $callbackvalues['value']; - - if ( isset ( $callbackvalues['error'] ) ) { - $this->errors[] = $callbackvalues['error']; - } - // TODO - This warning message is failing. Hmm. - // No it isn't. Problem was in the sample-config - kp - if ( isset ( $callbackvalues['warning'] ) ) { - $this->warnings[] = $callbackvalues['warning']; - } - } - } - } - } - - return $plugin_options; - } - - /** - * Return Section Menu HTML - * - * @since 3.1.5 - * @access public - * @return void - */ - public function section_menu( $k, $section, $suffix = "", $sections = array() ) { - $display = true; - - $section['class'] = isset ( $section['class'] ) ? ' ' . $section['class'] : ''; - - if ( isset ( $_GET['page'] ) && $_GET['page'] == $this->args['page_slug'] ) { - if ( isset ( $section['panel'] ) && $section['panel'] == false ) { - $display = false; - } - } - - if ( ! $display ) { - return ""; - } - - if ( empty ( $sections ) ) { - $sections = $this->sections; - } - - $string = ""; - if ( ( ( isset ( $this->args['icon_type'] ) && $this->args['icon_type'] == 'image' ) || ( isset ( $section['icon_type'] ) && $section['icon_type'] == 'image' ) ) || ( isset( $section['icon'] ) && strpos( $section['icon'], '/' ) !== false ) ) { - //if( !empty( $this->args['icon_type'] ) && $this->args['icon_type'] == 'image' ) { - $icon = ( ! isset ( $section['icon'] ) ) ? '' : ' '; - } else { - if ( ! empty ( $section['icon_class'] ) ) { - $icon_class = ' ' . $section['icon_class']; - } elseif ( ! empty ( $this->args['default_icon_class'] ) ) { - $icon_class = ' ' . $this->args['default_icon_class']; - } else { - $icon_class = ''; - } - $icon = ( ! isset ( $section['icon'] ) ) ? ' ' : ' '; - } - if ( strpos( $icon, 'el-icon-' ) !== false ) { - $icon = str_replace( 'el-icon-', 'el el-', $icon ); - } - - $hide_section = ''; - if ( isset ( $section['hidden'] ) ) { - $hide_section = ( $section['hidden'] == true ) ? ' hidden ' : ''; - } - - $canBeSubSection = ( $k > 0 && ( ! isset ( $sections[ ( $k ) ]['type'] ) || $sections[ ( $k ) ]['type'] != "divide" ) ) ? true : false; - - if ( ! $canBeSubSection && isset ( $section['subsection'] ) && $section['subsection'] == true ) { - unset ( $section['subsection'] ); - } - - if ( isset ( $section['type'] ) && $section['type'] == "divide" ) { - $string .= '
  •  
  • '; - } else if ( ! isset ( $section['subsection'] ) || $section['subsection'] != true ) { - - // DOVY! REPLACE $k with $section['ID'] when used properly. - //$active = ( ( is_numeric($this->current_tab) && $this->current_tab == $k ) || ( !is_numeric($this->current_tab) && $this->current_tab === $k ) ) ? ' active' : ''; - $subsections = ( isset ( $sections[ ( $k + 1 ) ] ) && isset ( $sections[ ( $k + 1 ) ]['subsection'] ) && $sections[ ( $k + 1 ) ]['subsection'] == true ) ? true : false; - $subsectionsClass = $subsections ? ' hasSubSections' : ''; - $subsectionsClass .= ( ! isset ( $section['fields'] ) || empty ( $section['fields'] ) ) ? ' empty_section' : ''; - $extra_icon = $subsections ? ' ' : ''; - $string .= ''; - } - - return $string; - } - // section_menu() - - /** - * HTML OUTPUT. - * - * @since 1.0.0 - * @access public - * @return void - */ - public function generate_panel() { - require_once 'core/panel.php'; - $panel = new reduxCorePanel ( $this ); - $panel->init(); - $this->set_transients(); - } - - /** - * Section HTML OUTPUT. - * - * @since 1.0.0 - * @access public - * - * @param array $section - * - * @return void - */ - public function _section_desc( $section ) { - $id = rtrim( $section['id'], '_section' ); - $id = str_replace($this->args['opt_name'], '', $id); - - if ( isset ( $this->sections[ $id ]['desc'] ) && ! empty ( $this->sections[ $id ]['desc'] ) ) { - echo '
    ' . $this->sections[ $id ]['desc'] . '
    '; - } - } - - /** - * Field HTML OUTPUT. - * Gets option from options array, then calls the specific field type class - allows extending by other devs - * - * @since 1.0.0 - * - * @param array $field - * @param string $v - * - * @return void - */ - public function _field_input( $field, $v = null ) { - - if ( isset ( $field['callback'] ) && ( is_callable( $field['callback'] ) || ( is_string( $field['callback'] ) && function_exists( $field['callback'] ) ) ) ) { - - $value = ( isset ( $this->options[ $field['id'] ] ) ) ? $this->options[ $field['id'] ] : ''; - - /** - * action 'redux-before-field-{opt_name}' - * - * @deprecated - * - * @param array $field field data - * @param string $value field.id - */ - do_action( "redux-before-field-{$this->args['opt_name']}", $field, $value ); // REMOVE - - /** - * action 'redux/field/{opt_name}/{field.type}/callback/before' - * - * @param array $field field data - * @param string $value field.id - */ - do_action_ref_array( "redux/field/{$this->args['opt_name']}/{$field['type']}/callback/before", array( - &$field, - &$value - ) ); - - /** - * action 'redux/field/{opt_name}/callback/before' - * - * @param array $field field data - * @param string $value field.id - */ - do_action_ref_array( "redux/field/{$this->args['opt_name']}/callback/before", array( - &$field, - &$value - ) ); - - call_user_func( $field['callback'], $field, $value ); - - - /** - * action 'redux-after-field-{opt_name}' - * - * @deprecated - * - * @param array $field field data - * @param string $value field.id - */ - do_action( "redux-after-field-{$this->args['opt_name']}", $field, $value ); // REMOVE - - /** - * action 'redux/field/{opt_name}/{field.type}/callback/after' - * - * @param array $field field data - * @param string $value field.id - */ - do_action_ref_array( "redux/field/{$this->args['opt_name']}/{$field['type']}/callback/after", array( - &$field, - &$value - ) ); - - /** - * action 'redux/field/{opt_name}/callback/after' - * - * @param array $field field data - * @param string $value field.id - */ - do_action_ref_array( "redux/field/{$this->args['opt_name']}/callback/after", array( - &$field, - &$value - ) ); - - - return; - } - - if ( isset ( $field['type'] ) ) { - - // If the field is set not to display in the panel - $display = true; - if ( isset ( $_GET['page'] ) && $_GET['page'] == $this->args['page_slug'] ) { - if ( isset ( $field['panel'] ) && $field['panel'] == false ) { - $display = false; - } - } - - if ( ! $display ) { - return; - } - - $field_class = "ReduxFramework_{$field['type']}"; - - if ( ! class_exists( $field_class ) ) { - // $class_file = apply_filters( 'redux/field/class/'.$field['type'], self::$_dir . 'inc/fields/' . $field['type'] . '/field_' . $field['type'] . '.php', $field ); // REMOVE - /** - * filter 'redux/{opt_name}/field/class/{field.type}' - * - * @param string field class file path - * @param array $field field data - */ - $class_file = apply_filters( "redux/{$this->args['opt_name']}/field/class/{$field['type']}", self::$_dir . "inc/fields/{$field['type']}/field_{$field['type']}.php", $field ); - - if ( $class_file ) { - if ( file_exists( $class_file ) ) { - require_once $class_file; - } - } - } - - if ( class_exists( $field_class ) ) { - $value = isset ( $this->options[ $field['id'] ] ) ? $this->options[ $field['id'] ] : ''; - - if ( $v !== null ) { - $value = $v; - } - - /** - * action 'redux-before-field-{opt_name}' - * - * @deprecated - * - * @param array $field field data - * @param string $value field id - */ - do_action( "redux-before-field-{$this->args['opt_name']}", $field, $value ); // REMOVE - - /** - * action 'redux/field/{opt_name}/{field.type}/render/before' - * - * @param array $field field data - * @param string $value field id - */ - do_action_ref_array( "redux/field/{$this->args['opt_name']}/{$field['type']}/render/before", array( - &$field, - &$value - ) ); - - /** - * action 'redux/field/{$this->args['opt_name']}/render/before' - * - * @param array $field field data - * @param string $value field id - */ - do_action_ref_array( "redux/field/{$this->args['opt_name']}/render/before", array( - &$field, - &$value - ) ); - - if ( ! isset ( $field['name_suffix'] ) ) { - $field['name_suffix'] = ""; - } - - $render = new $field_class ( $field, $value, $this ); - ob_start(); - - $render->render(); - - /* - - echo "
    ";
    -                      print_r($value);
    -                      echo "
    "; - */ - - /** - * filter 'redux-field-{opt_name}' - * - * @deprecated - * - * @param string rendered field markup - * @param array $field field data - */ - $_render = apply_filters( "redux-field-{$this->args['opt_name']}", ob_get_contents(), $field ); // REMOVE - - /** - * filter 'redux/field/{opt_name}/{field.type}/render/after' - * - * @param string rendered field markup - * @param array $field field data - */ - $_render = apply_filters( "redux/field/{$this->args['opt_name']}/{$field['type']}/render/after", $_render, $field ); - - /** - * filter 'redux/field/{opt_name}/render/after' - * - * @param string rendered field markup - * @param array $field field data - */ - $_render = apply_filters( "redux/field/{$this->args['opt_name']}/render/after", $_render, $field ); - - ob_end_clean(); - - //save the values into a unique array in case we need it for dependencies - $this->fieldsValues[ $field['id'] ] = ( isset ( $value['url'] ) && is_array( $value ) ) ? $value['url'] : $value; - - //create default data und class string and checks the dependencies of an object - $class_string = ''; - $data_string = ''; - - $this->check_dependencies( $field ); - - /** - * action 'redux/field/{opt_name}/{field.type}/fieldset/before/{opt_name}' - * - * @param array $field field data - * @param string $value field id - */ - do_action_ref_array( "redux/field/{$this->args['opt_name']}/{$field['type']}/fieldset/before/{$this->args['opt_name']}", array( - &$field, - &$value - ) ); - - /** - * action 'redux/field/{opt_name}/fieldset/before/{opt_name}' - * - * @param array $field field data - * @param string $value field id - */ - do_action_ref_array( "redux/field/{$this->args['opt_name']}/fieldset/before/{$this->args['opt_name']}", array( - &$field, - &$value - ) ); - - //if ( ! isset( $field['fields'] ) || empty( $field['fields'] ) ) { - $hidden = ''; - if ( isset ( $field['hidden'] ) && $field['hidden'] ) { - $hidden = 'hidden '; - } - - if ( isset( $field['full_width'] ) && $field['full_width'] == true ) { - $class_string .= "redux_remove_th"; - } - - if ( isset ( $field['fieldset_class'] ) && ! empty( $field['fieldset_class'] ) ) { - $class_string .= ' ' . $field['fieldset_class']; - } - - echo '
    '; - //} - - echo $_render; - - if ( ! empty ( $field['desc'] ) ) { - $field['description'] = $field['desc']; - } - - echo ( isset ( $field['description'] ) && $field['type'] != "info" && $field['type'] !== "section" && ! empty ( $field['description'] ) ) ? '
    ' . $field['description'] . '
    ' : ''; - - //if ( ! isset( $field['fields'] ) || empty( $field['fields'] ) ) { - echo '
    '; - //} - - /** - * action 'redux-after-field-{opt_name}' - * - * @deprecated - * - * @param array $field field data - * @param string $value field id - */ - do_action( "redux-after-field-{$this->args['opt_name']}", $field, $value ); // REMOVE - - /** - * action 'redux/field/{opt_name}/{field.type}/fieldset/after/{opt_name}' - * - * @param array $field field data - * @param string $value field id - */ - do_action_ref_array( "redux/field/{$this->args['opt_name']}/{$field['type']}/fieldset/after/{$this->args['opt_name']}", array( - &$field, - &$value - ) ); - - /** - * action 'redux/field/{opt_name}/fieldset/after/{opt_name}' - * - * @param array $field field data - * @param string $value field id - */ - do_action_ref_array( "redux/field/{$this->args['opt_name']}/fieldset/after/{$this->args['opt_name']}", array( - &$field, - &$value - ) ); - } - } - } - // _field_input() - - /** - * Can Output CSS - * Check if a field meets its requirements before outputting to CSS - * - * @param $field - * - * @return bool - */ - public function _can_output_css( $field ) { - $return = true; - - $field = apply_filters( "redux/field/{$this->args['opt_name']}/_can_output_css", $field ); - if ( isset ( $field['force_output'] ) && $field['force_output'] == true ) { - return $return; - } - - if ( ! empty ( $field['required'] ) ) { - if ( isset ( $field['required'][0] ) ) { - if ( ! is_array( $field['required'][0] ) && count( $field['required'] ) == 3 ) { - $parentValue = $GLOBALS[ $this->args['global_variable'] ][ $field['required'][0] ]; - $checkValue = $field['required'][2]; - $operation = $field['required'][1]; - $return = $this->compareValueDependencies( $parentValue, $checkValue, $operation ); - } else if ( is_array( $field['required'][0] ) ) { - foreach ( $field['required'] as $required ) { - if ( ! is_array( $required[0] ) && count( $required ) == 3 ) { - $parentValue = $GLOBALS[ $this->args['global_variable'] ][ $required[0] ]; - $checkValue = $required[2]; - $operation = $required[1]; - $return = $this->compareValueDependencies( $parentValue, $checkValue, $operation ); - } - if ( ! $return ) { - return $return; - } - } - } - } - } - - return $return; - } - // _can_output_css - - /** - * Checks dependencies between objects based on the $field['required'] array - * If the array is set it needs to have exactly 3 entries. - * The first entry describes which field should be monitored by the current field. eg: "content" - * The second entry describes the comparison parameter. eg: "equals, not, is_larger, is_smaller ,contains" - * The third entry describes the value that we are comparing against. - * Example: if the required array is set to array('content','equals','Hello World'); then the current - * field will only be displayed if the field with id "content" has exactly the value "Hello World" - * - * @param array $field - * - * @return array $params - */ - public function check_dependencies( $field ) { - //$params = array('data_string' => "", 'class_string' => ""); - if ( isset( $field['ajax_save'] ) && $field['ajax_save'] == false ) { - $this->reload_fields[] = $field['id']; - } - - if ( ! empty ( $field['required'] ) ) { - if ( ! isset ( $this->required_child[ $field['id'] ] ) ) { - $this->required_child[ $field['id'] ] = array(); - } - - if ( ! isset ( $this->required[ $field['id'] ] ) ) { - $this->required[ $field['id'] ] = array(); - } - - if ( is_array( $field['required'][0] ) ) { - - foreach ( $field['required'] as $value ) { - if ( is_array( $value ) && count( $value ) == 3 ) { - $data = array(); - $data['parent'] = $value[0]; - $data['operation'] = $value[1]; - $data['checkValue'] = $value[2]; - - $this->required[ $data['parent'] ][ $field['id'] ][] = $data; - - if ( ! in_array( $data['parent'], $this->required_child[ $field['id'] ] ) ) { - $this->required_child[ $field['id'] ][] = $data; - } - - $this->checkRequiredDependencies( $field, $data ); - } - } - } else { - $data = array(); - $data['parent'] = $field['required'][0]; - $data['operation'] = $field['required'][1]; - $data['checkValue'] = $field['required'][2]; - - $this->required[ $data['parent'] ][ $field['id'] ][] = $data; - - if ( ! in_array( $data['parent'], $this->required_child[ $field['id'] ] ) ) { - $this->required_child[ $field['id'] ][] = $data; - } - - $this->checkRequiredDependencies( $field, $data ); - } - } - //return $params; - } - - // Compare data for required field - private function compareValueDependencies( $parentValue, $checkValue, $operation ) { - $return = false; - switch ( $operation ) { - case '=': - case 'equals': - $data['operation'] = "="; - - if ( is_array( $parentValue ) ) { - foreach ( $parentValue as $idx => $val ) { - if ( is_array( $checkValue ) ) { - foreach ( $checkValue as $i => $v ) { - if ( $val == $v ) { - $return = true; - } - } - } else { - if ( $val == $checkValue ) { - $return = true; - } - } - } - } else { - if ( is_array( $checkValue ) ) { - foreach ( $checkValue as $i => $v ) { - if ( $parentValue == $v ) { - $return = true; - } - } - } else { - if ( $parentValue == $checkValue ) { - $return = true; - } - } - } - break; - - case '!=': - case 'not': - $data['operation'] = "!=="; - if ( is_array( $parentValue ) ) { - foreach ( $parentValue as $idx => $val ) { - if ( is_array( $checkValue ) ) { - foreach ( $checkValue as $i => $v ) { - if ( $val != $v ) { - $return = true; - } - } - } else { - if ( $val != $checkValue ) { - $return = true; - } - } - } - } else { - if ( is_array( $checkValue ) ) { - foreach ( $checkValue as $i => $v ) { - if ( $parentValue != $v ) { - $return = true; - } - } - } else { - if ( $parentValue != $checkValue ) { - $return = true; - } - } - } - - // if ( is_array( $checkValue ) ) { - // if ( ! in_array( $parentValue, $checkValue ) ) { - // $return = true; - // } - // } else { - // if ( $parentValue != $checkValue ) { - // $return = true; - // } else if ( is_array( $parentValue ) ) { - // if ( ! in_array( $checkValue, $parentValue ) ) { - // $return = true; - // } - // } - // } - break; - case '>': - case 'greater': - case 'is_larger': - $data['operation'] = ">"; - if ( $parentValue > $checkValue ) { - $return = true; - } - break; - case '>=': - case 'greater_equal': - case 'is_larger_equal': - $data['operation'] = ">="; - if ( $parentValue >= $checkValue ) { - $return = true; - } - break; - case '<': - case 'less': - case 'is_smaller': - $data['operation'] = "<"; - if ( $parentValue < $checkValue ) { - $return = true; - } - break; - case '<=': - case 'less_equal': - case 'is_smaller_equal': - $data['operation'] = "<="; - if ( $parentValue <= $checkValue ) { - $return = true; - } - break; - case 'contains': - if ( is_array( $parentValue ) ) { - $parentValue = implode( ',', $parentValue ); - } - - if ( is_array( $checkValue ) ) { - foreach ( $checkValue as $idx => $opt ) { - if ( strpos( $parentValue, (string) $opt ) !== false ) { - $return = true; - } - } - } else { - if ( strpos( $parentValue, (string) $checkValue ) !== false ) { - $return = true; - } - } - - break; - case 'doesnt_contain': - case 'not_contain': - if ( is_array( $parentValue ) ) { - $parentValue = implode( ',', $parentValue ); - } - - if ( is_array( $checkValue ) ) { - foreach ( $checkValue as $idx => $opt ) { - if ( strpos( $parentValue, (string) $opt ) === false ) { - $return = true; - } - } - } else { - if ( strpos( $parentValue, (string) $checkValue ) === false ) { - $return = true; - } - } - - break; - case 'is_empty_or': - if ( empty ( $parentValue ) || $parentValue == $checkValue ) { - $return = true; - } - break; - case 'not_empty_and': - if ( ! empty ( $parentValue ) && $parentValue != $checkValue ) { - $return = true; - } - break; - case 'is_empty': - case 'empty': - case '!isset': - if ( empty ( $parentValue ) || $parentValue == "" || $parentValue == null ) { - $return = true; - } - break; - case 'not_empty': - case '!empty': - case 'isset': - if ( ! empty ( $parentValue ) && $parentValue != "" && $parentValue != null ) { - $return = true; - } - break; - } - - return $return; - } - - private function checkRequiredDependencies( $field, $data ) { - //required field must not be hidden. otherwise hide this one by default - - if ( ! in_array( $data['parent'], $this->fieldsHidden ) && ( ! isset ( $this->folds[ $field['id'] ] ) || $this->folds[ $field['id'] ] != "hide" ) ) { - if ( isset ( $this->options[ $data['parent'] ] ) ) { - $return = $this->compareValueDependencies( $this->options[ $data['parent'] ], $data['checkValue'], $data['operation'] ); - //$return = $this->compareValueDependencies( $data['parent'], $data['checkValue'], $data['operation'] ); - } - } - - if ( ( isset ( $return ) && $return ) && ( ! isset ( $this->folds[ $field['id'] ] ) || $this->folds[ $field['id'] ] != "hide" ) ) { - $this->folds[ $field['id'] ] = "show"; - } else { - $this->folds[ $field['id'] ] = "hide"; - if ( ! in_array( $field['id'], $this->fieldsHidden ) ) { - $this->fieldsHidden[] = $field['id']; - } - } - } - - /** - * converts an array into a html data string - * - * @param array $data example input: array('id'=>'true') - * - * @return string $data_string example output: data-id='true' - */ - public function create_data_string( $data = array() ) { - $data_string = ""; - - foreach ( $data as $key => $value ) { - if ( is_array( $value ) ) { - $value = implode( "|", $value ); - } - $data_string .= " data-$key='$value' "; - } - - return $data_string; - } - - /** - * Parses the string into variables without the max_input_vars limitation. - * - * @since 3.5.7.11 - * @author harunbasic - * @access public - * - * @param string $string - * - * @return array $result - */ - function redux_parse_str( $string ) { - if ( '' == $string ) { - return false; - } - - $result = array(); - $pairs = explode( '&', $string ); - - foreach ( $pairs as $key => $pair ) { - // use the original parse_str() on each element - parse_str( $pair, $params ); - - $k = key( $params ); - - if ( ! isset( $result[ $k ] ) ) { - $result += $params; - } else { - $result[ $k ] = $this->redux_array_merge_recursive_distinct( $result[ $k ], $params[ $k ] ); - } - } - - return $result; - } - - - /** - * Merge arrays without converting values with duplicate keys to arrays as array_merge_recursive does. - * As seen here http://php.net/manual/en/function.array-merge-recursive.php#92195 - * - * @since 3.5.7.11 - * @author harunbasic - * @access public - * - * @param array $array1 - * @param array $array2 - * - * @return array $merged - */ - function redux_array_merge_recursive_distinct( array $array1, array $array2 ) { - $merged = $array1; - - foreach ( $array2 as $key => $value ) { - if ( is_array( $value ) && isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) { - $merged[ $key ] = $this->redux_array_merge_recursive_distinct( $merged[ $key ], $value ); - } else if ( is_numeric( $key ) && isset( $merged[ $key ] ) ) { - $merged[] = $value; - } else { - $merged[ $key ] = $value; - } - } - - return $merged; - } - - private function change_demo_defaults() { - if ( $this->args['dev_mode'] == true || Redux_Helpers::isLocalHost() == true ) { - if ( ! empty( $this->args['admin_bar_links'] ) ) { - foreach ( $this->args['admin_bar_links'] as $idx => $arr ) { - if ( is_array( $arr ) && ! empty( $arr ) ) { - foreach ( $arr as $x => $y ) { - if ( strpos( strtolower( $y ), 'redux' ) !== false ) { - $msg = __( 'Redux Framework Notice: There are references to the Redux Framework support site in your config\'s admin_bar_links argument. This is sample data. Please change or remove this data before shipping your product.', 'redux-framework' ); - $this->display_arg_change_notice( 'admin', $msg ); - $this->omit_admin_items = true; - continue; - } - } - } - } - } - - if ( ! empty( $this->args['share_icons'] ) ) { - foreach ( $this->args['share_icons'] as $idx => $arr ) { - if ( is_array( $arr ) && ! empty( $arr ) ) { - foreach ( $arr as $x => $y ) { - if ( strpos( strtolower( $y ), 'redux' ) !== false ) { - $msg = __( 'Redux Framework Notice: There are references to the Redux Framework support site in your config\'s share_icons argument. This is sample data. Please change or remove this data before shipping your product.', 'redux-framework' ); - $this->display_arg_change_notice( 'share', $msg ); - $this->omit_share_icons = true; - } - } - } - } - } - - } - } - - private function display_arg_change_notice( $mode, $msg = '' ) { - if ( $mode == 'admin' ) { - if ( ! $this->omit_admin_items ) { - $this->admin_notices[] = array( - 'type' => 'error', - 'msg' => $msg, - 'id' => 'admin_config', - 'dismiss' => true, - ); - } - } - - if ( $mode == 'share' ) { - if ( ! $this->omit_share_icons ) { - $this->admin_notices[] = array( - 'type' => 'error', - 'msg' => $msg, - 'id' => 'share_config', - 'dismiss' => true, - ); - } - } - } - } - - // ReduxFramework - - /** - * action 'redux/init' - * - * @param null - */ - do_action( 'redux/init', ReduxFramework::init() ); - } // class_exists('ReduxFramework') diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/browser.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/browser.php deleted file mode 100755 index ba0edba9..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/browser.php +++ /dev/null @@ -1,1282 +0,0 @@ -getBrowser() == Browser::BROWSER_FIREFOX && $browser->getVersion() >= 2 ) { - * echo 'You have FireFox version 2 or greater'; - * } - * - * User Agents Sampled from: http://www.useragentstring.com/ - * - * This implementation is based on the original work from Gary White - * http://apptools.com/phptools/browser/ - * - */ - -class Browser -{ - private $_agent = ''; - private $_browser_name = ''; - private $_version = ''; - private $_platform = ''; - private $_os = ''; - private $_is_aol = false; - private $_is_mobile = false; - private $_is_tablet = false; - private $_is_robot = false; - private $_is_facebook = false; - private $_aol_version = ''; - - const BROWSER_UNKNOWN = 'unknown'; - const VERSION_UNKNOWN = 'unknown'; - - const BROWSER_OPERA = 'Opera'; // http://www.opera.com/ - const BROWSER_OPERA_MINI = 'Opera Mini'; // http://www.opera.com/mini/ - const BROWSER_WEBTV = 'WebTV'; // http://www.webtv.net/pc/ - const BROWSER_IE = 'Internet Explorer'; // http://www.microsoft.com/ie/ - const BROWSER_POCKET_IE = 'Pocket Internet Explorer'; // http://en.wikipedia.org/wiki/Internet_Explorer_Mobile - const BROWSER_KONQUEROR = 'Konqueror'; // http://www.konqueror.org/ - const BROWSER_ICAB = 'iCab'; // http://www.icab.de/ - const BROWSER_OMNIWEB = 'OmniWeb'; // http://www.omnigroup.com/applications/omniweb/ - const BROWSER_FIREBIRD = 'Firebird'; // http://www.ibphoenix.com/ - const BROWSER_FIREFOX = 'Firefox'; // http://www.mozilla.com/en-US/firefox/firefox.html - const BROWSER_ICEWEASEL = 'Iceweasel'; // http://www.geticeweasel.org/ - const BROWSER_SHIRETOKO = 'Shiretoko'; // http://wiki.mozilla.org/Projects/shiretoko - const BROWSER_MOZILLA = 'Mozilla'; // http://www.mozilla.com/en-US/ - const BROWSER_AMAYA = 'Amaya'; // http://www.w3.org/Amaya/ - const BROWSER_LYNX = 'Lynx'; // http://en.wikipedia.org/wiki/Lynx - const BROWSER_SAFARI = 'Safari'; // http://apple.com - const BROWSER_IPHONE = 'iPhone'; // http://apple.com - const BROWSER_IPOD = 'iPod'; // http://apple.com - const BROWSER_IPAD = 'iPad'; // http://apple.com - const BROWSER_CHROME = 'Chrome'; // http://www.google.com/chrome - const BROWSER_ANDROID = 'Android'; // http://www.android.com/ - const BROWSER_GOOGLEBOT = 'GoogleBot'; // http://en.wikipedia.org/wiki/Googlebot - const BROWSER_SLURP = 'Yahoo! Slurp'; // http://en.wikipedia.org/wiki/Yahoo!_Slurp - const BROWSER_W3CVALIDATOR = 'W3C Validator'; // http://validator.w3.org/ - const BROWSER_BLACKBERRY = 'BlackBerry'; // http://www.blackberry.com/ - const BROWSER_ICECAT = 'IceCat'; // http://en.wikipedia.org/wiki/GNU_IceCat - const BROWSER_NOKIA_S60 = 'Nokia S60 OSS Browser'; // http://en.wikipedia.org/wiki/Web_Browser_for_S60 - const BROWSER_NOKIA = 'Nokia Browser'; // * all other WAP-based browsers on the Nokia Platform - const BROWSER_MSN = 'MSN Browser'; // http://explorer.msn.com/ - const BROWSER_MSNBOT = 'MSN Bot'; // http://search.msn.com/msnbot.htm - const BROWSER_BINGBOT = 'Bing Bot'; // http://en.wikipedia.org/wiki/Bingbot - - const BROWSER_NETSCAPE_NAVIGATOR = 'Netscape Navigator'; // http://browser.netscape.com/ (DEPRECATED) - const BROWSER_GALEON = 'Galeon'; // http://galeon.sourceforge.net/ (DEPRECATED) - const BROWSER_NETPOSITIVE = 'NetPositive'; // http://en.wikipedia.org/wiki/NetPositive (DEPRECATED) - const BROWSER_PHOENIX = 'Phoenix'; // http://en.wikipedia.org/wiki/History_of_Mozilla_Firefox (DEPRECATED) - - const PLATFORM_UNKNOWN = 'unknown'; - const PLATFORM_WINDOWS = 'Windows'; - const PLATFORM_WINDOWS_CE = 'Windows CE'; - const PLATFORM_APPLE = 'Apple'; - const PLATFORM_LINUX = 'Linux'; - const PLATFORM_OS2 = 'OS/2'; - const PLATFORM_BEOS = 'BeOS'; - const PLATFORM_IPHONE = 'iPhone'; - const PLATFORM_IPOD = 'iPod'; - const PLATFORM_IPAD = 'iPad'; - const PLATFORM_BLACKBERRY = 'BlackBerry'; - const PLATFORM_NOKIA = 'Nokia'; - const PLATFORM_FREEBSD = 'FreeBSD'; - const PLATFORM_OPENBSD = 'OpenBSD'; - const PLATFORM_NETBSD = 'NetBSD'; - const PLATFORM_SUNOS = 'SunOS'; - const PLATFORM_OPENSOLARIS = 'OpenSolaris'; - const PLATFORM_ANDROID = 'Android'; - - const OPERATING_SYSTEM_UNKNOWN = 'unknown'; - - public function __construct($userAgent = "") - { - $this->reset(); - if ($userAgent != "") { - $this->setUserAgent($userAgent); - } else { - $this->determine(); - } - } - - /** - * Reset all properties - */ - public function reset() - { - $this->_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ""; - $this->_browser_name = self::BROWSER_UNKNOWN; - $this->_version = self::VERSION_UNKNOWN; - $this->_platform = self::PLATFORM_UNKNOWN; - $this->_os = self::OPERATING_SYSTEM_UNKNOWN; - $this->_is_aol = false; - $this->_is_mobile = false; - $this->_is_tablet = false; - $this->_is_robot = false; - $this->_is_facebook = false; - $this->_aol_version = self::VERSION_UNKNOWN; - } - - /** - * Check to see if the specific browser is valid - * @param string $browserName - * @return bool True if the browser is the specified browser - */ - function isBrowser($browserName) - { - return (0 == strcasecmp($this->_browser_name, trim($browserName))); - } - - /** - * The name of the browser. All return types are from the class contants - * @return string Name of the browser - */ - public function getBrowser() - { - return $this->_browser_name; - } - - /** - * Set the name of the browser - * @param $browser string The name of the Browser - */ - public function setBrowser($browser) - { - $this->_browser_name = $browser; - } - - /** - * The name of the platform. All return types are from the class contants - * @return string Name of the browser - */ - public function getPlatform() - { - return $this->_platform; - } - - /** - * Set the name of the platform - * @param string $platform The name of the Platform - */ - public function setPlatform($platform) - { - $this->_platform = $platform; - } - - /** - * The version of the browser. - * @return string Version of the browser (will only contain alpha-numeric characters and a period) - */ - public function getVersion() - { - return $this->_version; - } - - /** - * Set the version of the browser - * @param string $version The version of the Browser - */ - public function setVersion($version) - { - $this->_version = preg_replace('/[^0-9,.,a-z,A-Z-]/', '', $version); - } - - /** - * The version of AOL. - * @return string Version of AOL (will only contain alpha-numeric characters and a period) - */ - public function getAolVersion() - { - return $this->_aol_version; - } - - /** - * Set the version of AOL - * @param string $version The version of AOL - */ - public function setAolVersion($version) - { - $this->_aol_version = preg_replace('/[^0-9,.,a-z,A-Z]/', '', $version); - } - - /** - * Is the browser from AOL? - * @return boolean True if the browser is from AOL otherwise false - */ - public function isAol() - { - return $this->_is_aol; - } - - /** - * Is the browser from a mobile device? - * @return boolean True if the browser is from a mobile device otherwise false - */ - public function isMobile() - { - return $this->_is_mobile; - } - - /** - * Is the browser from a tablet device? - * @return boolean True if the browser is from a tablet device otherwise false - */ - public function isTablet() - { - return $this->_is_tablet; - } - - /** - * Is the browser from a robot (ex Slurp,GoogleBot)? - * @return boolean True if the browser is from a robot otherwise false - */ - public function isRobot() - { - return $this->_is_robot; - } - - /** - * Is the browser from facebook? - * @return boolean True if the browser is from facebook otherwise false - */ - public function isFacebook() - { - return $this->_is_facebook; - } - - /** - * Set the browser to be from AOL - * @param $isAol - */ - public function setAol($isAol) - { - $this->_is_aol = $isAol; - } - - /** - * Set the Browser to be mobile - * @param boolean $value is the browser a mobile browser or not - */ - protected function setMobile($value = true) - { - $this->_is_mobile = $value; - } - - /** - * Set the Browser to be tablet - * @param boolean $value is the browser a tablet browser or not - */ - protected function setTablet($value = true) - { - $this->_is_tablet = $value; - } - - /** - * Set the Browser to be a robot - * @param boolean $value is the browser a robot or not - */ - protected function setRobot($value = true) - { - $this->_is_robot = $value; - } - - /** - * Set the Browser to be a Facebook request - * @param boolean $value is the browser a robot or not - */ - protected function setFacebook($value = true) - { - $this->_is_facebook = $value; - } - - /** - * Get the user agent value in use to determine the browser - * @return string The user agent from the HTTP header - */ - public function getUserAgent() - { - return $this->_agent; - } - - /** - * Set the user agent value (the construction will use the HTTP header value - this will overwrite it) - * @param string $agent_string The value for the User Agent - */ - public function setUserAgent($agent_string) - { - $this->reset(); - $this->_agent = $agent_string; - $this->determine(); - } - - /** - * Used to determine if the browser is actually "chromeframe" - * @since 1.7 - * @return boolean True if the browser is using chromeframe - */ - public function isChromeFrame() - { - return (strpos($this->_agent, "chromeframe") !== false); - } - - /** - * Returns a formatted string with a summary of the details of the browser. - * @return string formatted string with a summary of the browser - */ - public function __toString() - { - return "Browser Name: {$this->getBrowser()}
    \n" . - "Browser Version: {$this->getVersion()}
    \n" . - "Browser User Agent String: {$this->getUserAgent()}
    \n" . - "Platform: {$this->getPlatform()}
    "; - } - - /** - * Protected routine to calculate and determine what the browser is in use (including platform) - */ - protected function determine() - { - $this->checkPlatform(); - $this->checkBrowsers(); - $this->checkForAol(); - } - - /** - * Protected routine to determine the browser type - * @return boolean True if the browser was detected otherwise false - */ - protected function checkBrowsers() - { - return ( - // well-known, well-used - // Special Notes: - // (1) Opera must be checked before FireFox due to the odd - // user agents used in some older versions of Opera - // (2) WebTV is strapped onto Internet Explorer so we must - // check for WebTV before IE - // (3) (deprecated) Galeon is based on Firefox and needs to be - // tested before Firefox is tested - // (4) OmniWeb is based on Safari so OmniWeb check must occur - // before Safari - // (5) Netscape 9+ is based on Firefox so Netscape checks - // before FireFox are necessary - $this->checkBrowserWebTv() || - $this->checkBrowserInternetExplorer() || - $this->checkBrowserOpera() || - $this->checkBrowserGaleon() || - $this->checkBrowserNetscapeNavigator9Plus() || - $this->checkBrowserFirefox() || - $this->checkBrowserChrome() || - $this->checkBrowserOmniWeb() || - - // common mobile - $this->checkBrowserAndroid() || - $this->checkBrowseriPad() || - $this->checkBrowseriPod() || - $this->checkBrowseriPhone() || - $this->checkBrowserBlackBerry() || - $this->checkBrowserNokia() || - - // common bots - $this->checkBrowserGoogleBot() || - $this->checkBrowserMSNBot() || - $this->checkBrowserBingBot() || - $this->checkBrowserSlurp() || - - // check for facebook external hit when loading URL - $this->checkFacebookExternalHit() || - - // WebKit base check (post mobile and others) - $this->checkBrowserSafari() || - - // everyone else - $this->checkBrowserNetPositive() || - $this->checkBrowserFirebird() || - $this->checkBrowserKonqueror() || - $this->checkBrowserIcab() || - $this->checkBrowserPhoenix() || - $this->checkBrowserAmaya() || - $this->checkBrowserLynx() || - $this->checkBrowserShiretoko() || - $this->checkBrowserIceCat() || - $this->checkBrowserIceweasel() || - $this->checkBrowserW3CValidator() || - $this->checkBrowserMozilla() /* Mozilla is such an open standard that you must check it last */ - ); - } - - /** - * Determine if the user is using a BlackBerry (last updated 1.7) - * @return boolean True if the browser is the BlackBerry browser otherwise false - */ - protected function checkBrowserBlackBerry() - { - if (stripos($this->_agent, 'blackberry') !== false) { - $aresult = explode("/", stristr($this->_agent, "BlackBerry")); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - $this->setVersion($aversion[0]); - $this->_browser_name = self::BROWSER_BLACKBERRY; - $this->setMobile(true); - return true; - } - } - return false; - } - - /** - * Determine if the user is using an AOL User Agent (last updated 1.7) - * @return boolean True if the browser is from AOL otherwise false - */ - protected function checkForAol() - { - $this->setAol(false); - $this->setAolVersion(self::VERSION_UNKNOWN); - - if (stripos($this->_agent, 'aol') !== false) { - $aversion = explode(' ', stristr($this->_agent, 'AOL')); - if (isset($aversion[1])) { - $this->setAol(true); - $this->setAolVersion(preg_replace('/[^0-9\.a-z]/i', '', $aversion[1])); - return true; - } - } - return false; - } - - /** - * Determine if the browser is the GoogleBot or not (last updated 1.7) - * @return boolean True if the browser is the GoogletBot otherwise false - */ - protected function checkBrowserGoogleBot() - { - if (stripos($this->_agent, 'googlebot') !== false) { - $aresult = explode('/', stristr($this->_agent, 'googlebot')); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - $this->setVersion(str_replace(';', '', $aversion[0])); - $this->_browser_name = self::BROWSER_GOOGLEBOT; - $this->setRobot(true); - return true; - } - } - return false; - } - - /** - * Determine if the browser is the MSNBot or not (last updated 1.9) - * @return boolean True if the browser is the MSNBot otherwise false - */ - protected function checkBrowserMSNBot() - { - if (stripos($this->_agent, "msnbot") !== false) { - $aresult = explode("/", stristr($this->_agent, "msnbot")); - if (isset($aresult[1])) { - $aversion = explode(" ", $aresult[1]); - $this->setVersion(str_replace(";", "", $aversion[0])); - $this->_browser_name = self::BROWSER_MSNBOT; - $this->setRobot(true); - return true; - } - } - return false; - } - - /** - * Determine if the browser is the BingBot or not (last updated 1.9) - * @return boolean True if the browser is the BingBot otherwise false - */ - protected function checkBrowserBingBot() - { - if (stripos($this->_agent, "bingbot") !== false) { - $aresult = explode("/", stristr($this->_agent, "bingbot")); - if (isset($aresult[1])) { - $aversion = explode(" ", $aresult[1]); - $this->setVersion(str_replace(";", "", $aversion[0])); - $this->_browser_name = self::BROWSER_BINGBOT; - $this->setRobot(true); - return true; - } - } - return false; - } - - /** - * Determine if the browser is the W3C Validator or not (last updated 1.7) - * @return boolean True if the browser is the W3C Validator otherwise false - */ - protected function checkBrowserW3CValidator() - { - if (stripos($this->_agent, 'W3C-checklink') !== false) { - $aresult = explode('/', stristr($this->_agent, 'W3C-checklink')); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - $this->setVersion($aversion[0]); - $this->_browser_name = self::BROWSER_W3CVALIDATOR; - return true; - } - } else if (stripos($this->_agent, 'W3C_Validator') !== false) { - // Some of the Validator versions do not delineate w/ a slash - add it back in - $ua = str_replace("W3C_Validator ", "W3C_Validator/", $this->_agent); - $aresult = explode('/', stristr($ua, 'W3C_Validator')); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - $this->setVersion($aversion[0]); - $this->_browser_name = self::BROWSER_W3CVALIDATOR; - return true; - } - } else if (stripos($this->_agent, 'W3C-mobileOK') !== false) { - $this->_browser_name = self::BROWSER_W3CVALIDATOR; - $this->setMobile(true); - return true; - } - return false; - } - - /** - * Determine if the browser is the Yahoo! Slurp Robot or not (last updated 1.7) - * @return boolean True if the browser is the Yahoo! Slurp Robot otherwise false - */ - protected function checkBrowserSlurp() - { - if (stripos($this->_agent, 'slurp') !== false) { - $aresult = explode('/', stristr($this->_agent, 'Slurp')); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - $this->setVersion($aversion[0]); - $this->_browser_name = self::BROWSER_SLURP; - $this->setRobot(true); - $this->setMobile(false); - return true; - } - } - return false; - } - - /** - * Determine if the browser is Internet Explorer or not (last updated 1.7) - * @return boolean True if the browser is Internet Explorer otherwise false - */ - protected function checkBrowserInternetExplorer() - { - // Test for IE11 - if( stripos($this->_agent,'Trident/7.0; rv:11.0') !== false ) { - $this->setBrowser(self::BROWSER_IE); - $this->setVersion('11.0'); - return true; - } - // Test for v1 - v1.5 IE - else if (stripos($this->_agent, 'microsoft internet explorer') !== false) { - $this->setBrowser(self::BROWSER_IE); - $this->setVersion('1.0'); - $aresult = stristr($this->_agent, '/'); - if (preg_match('/308|425|426|474|0b1/i', $aresult)) { - $this->setVersion('1.5'); - } - return true; - } // Test for versions > 1.5 - else if (stripos($this->_agent, 'msie') !== false && stripos($this->_agent, 'opera') === false) { - // See if the browser is the odd MSN Explorer - if (stripos($this->_agent, 'msnb') !== false) { - $aresult = explode(' ', stristr(str_replace(';', '; ', $this->_agent), 'MSN')); - if (isset($aresult[1])) { - $this->setBrowser(self::BROWSER_MSN); - $this->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); - return true; - } - } - $aresult = explode(' ', stristr(str_replace(';', '; ', $this->_agent), 'msie')); - if (isset($aresult[1])) { - $this->setBrowser(self::BROWSER_IE); - $this->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); - if(stripos($this->_agent, 'IEMobile') !== false) { - $this->setBrowser(self::BROWSER_POCKET_IE); - $this->setMobile(true); - } - return true; - } - } // Test for versions > IE 10 - else if(stripos($this->_agent, 'trident') !== false) { - $this->setBrowser(self::BROWSER_IE); - $result = explode('rv:', $this->_agent); - if (isset($result[1])) { - $this->setVersion(preg_replace('/[^0-9.]+/', '', $result[1])); - $this->_agent = str_replace(array("Mozilla", "Gecko"), "MSIE", $this->_agent); - } - } // Test for Pocket IE - else if (stripos($this->_agent, 'mspie') !== false || stripos($this->_agent, 'pocket') !== false) { - $aresult = explode(' ', stristr($this->_agent, 'mspie')); - if (isset($aresult[1])) { - $this->setPlatform(self::PLATFORM_WINDOWS_CE); - $this->setBrowser(self::BROWSER_POCKET_IE); - $this->setMobile(true); - - if (stripos($this->_agent, 'mspie') !== false) { - $this->setVersion($aresult[1]); - } else { - $aversion = explode('/', $this->_agent); - if (isset($aversion[1])) { - $this->setVersion($aversion[1]); - } - } - return true; - } - } - return false; - } - - /** - * Determine if the browser is Opera or not (last updated 1.7) - * @return boolean True if the browser is Opera otherwise false - */ - protected function checkBrowserOpera() - { - if (stripos($this->_agent, 'opera mini') !== false) { - $resultant = stristr($this->_agent, 'opera mini'); - if (preg_match('/\//', $resultant)) { - $aresult = explode('/', $resultant); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - $this->setVersion($aversion[0]); - } - } else { - $aversion = explode(' ', stristr($resultant, 'opera mini')); - if (isset($aversion[1])) { - $this->setVersion($aversion[1]); - } - } - $this->_browser_name = self::BROWSER_OPERA_MINI; - $this->setMobile(true); - return true; - } else if (stripos($this->_agent, 'opera') !== false) { - $resultant = stristr($this->_agent, 'opera'); - if (preg_match('/Version\/(1*.*)$/', $resultant, $matches)) { - $this->setVersion($matches[1]); - } else if (preg_match('/\//', $resultant)) { - $aresult = explode('/', str_replace("(", " ", $resultant)); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - $this->setVersion($aversion[0]); - } - } else { - $aversion = explode(' ', stristr($resultant, 'opera')); - $this->setVersion(isset($aversion[1]) ? $aversion[1] : ""); - } - if (stripos($this->_agent, 'Opera Mobi') !== false) { - $this->setMobile(true); - } - $this->_browser_name = self::BROWSER_OPERA; - return true; - } else if (stripos($this->_agent, 'OPR') !== false) { - $resultant = stristr($this->_agent, 'OPR'); - if (preg_match('/\//', $resultant)) { - $aresult = explode('/', str_replace("(", " ", $resultant)); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - $this->setVersion($aversion[0]); - } - } - if (stripos($this->_agent, 'Mobile') !== false) { - $this->setMobile(true); - } - $this->_browser_name = self::BROWSER_OPERA; - return true; - } - return false; - } - - /** - * Determine if the browser is Chrome or not (last updated 1.7) - * @return boolean True if the browser is Chrome otherwise false - */ - protected function checkBrowserChrome() - { - if (stripos($this->_agent, 'Chrome') !== false) { - $aresult = explode('/', stristr($this->_agent, 'Chrome')); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - $this->setVersion($aversion[0]); - $this->setBrowser(self::BROWSER_CHROME); - //Chrome on Android - if (stripos($this->_agent, 'Android') !== false) { - if (stripos($this->_agent, 'Mobile') !== false) { - $this->setMobile(true); - } else { - $this->setTablet(true); - } - } - return true; - } - } - return false; - } - - - /** - * Determine if the browser is WebTv or not (last updated 1.7) - * @return boolean True if the browser is WebTv otherwise false - */ - protected function checkBrowserWebTv() - { - if (stripos($this->_agent, 'webtv') !== false) { - $aresult = explode('/', stristr($this->_agent, 'webtv')); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - $this->setVersion($aversion[0]); - $this->setBrowser(self::BROWSER_WEBTV); - return true; - } - } - return false; - } - - /** - * Determine if the browser is NetPositive or not (last updated 1.7) - * @return boolean True if the browser is NetPositive otherwise false - */ - protected function checkBrowserNetPositive() - { - if (stripos($this->_agent, 'NetPositive') !== false) { - $aresult = explode('/', stristr($this->_agent, 'NetPositive')); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - $this->setVersion(str_replace(array('(', ')', ';'), '', $aversion[0])); - $this->setBrowser(self::BROWSER_NETPOSITIVE); - return true; - } - } - return false; - } - - /** - * Determine if the browser is Galeon or not (last updated 1.7) - * @return boolean True if the browser is Galeon otherwise false - */ - protected function checkBrowserGaleon() - { - if (stripos($this->_agent, 'galeon') !== false) { - $aresult = explode(' ', stristr($this->_agent, 'galeon')); - $aversion = explode('/', $aresult[0]); - if (isset($aversion[1])) { - $this->setVersion($aversion[1]); - $this->setBrowser(self::BROWSER_GALEON); - return true; - } - } - return false; - } - - /** - * Determine if the browser is Konqueror or not (last updated 1.7) - * @return boolean True if the browser is Konqueror otherwise false - */ - protected function checkBrowserKonqueror() - { - if (stripos($this->_agent, 'Konqueror') !== false) { - $aresult = explode(' ', stristr($this->_agent, 'Konqueror')); - $aversion = explode('/', $aresult[0]); - if (isset($aversion[1])) { - $this->setVersion($aversion[1]); - $this->setBrowser(self::BROWSER_KONQUEROR); - return true; - } - } - return false; - } - - /** - * Determine if the browser is iCab or not (last updated 1.7) - * @return boolean True if the browser is iCab otherwise false - */ - protected function checkBrowserIcab() - { - if (stripos($this->_agent, 'icab') !== false) { - $aversion = explode(' ', stristr(str_replace('/', ' ', $this->_agent), 'icab')); - if (isset($aversion[1])) { - $this->setVersion($aversion[1]); - $this->setBrowser(self::BROWSER_ICAB); - return true; - } - } - return false; - } - - /** - * Determine if the browser is OmniWeb or not (last updated 1.7) - * @return boolean True if the browser is OmniWeb otherwise false - */ - protected function checkBrowserOmniWeb() - { - if (stripos($this->_agent, 'omniweb') !== false) { - $aresult = explode('/', stristr($this->_agent, 'omniweb')); - $aversion = explode(' ', isset($aresult[1]) ? $aresult[1] : ""); - $this->setVersion($aversion[0]); - $this->setBrowser(self::BROWSER_OMNIWEB); - return true; - } - return false; - } - - /** - * Determine if the browser is Phoenix or not (last updated 1.7) - * @return boolean True if the browser is Phoenix otherwise false - */ - protected function checkBrowserPhoenix() - { - if (stripos($this->_agent, 'Phoenix') !== false) { - $aversion = explode('/', stristr($this->_agent, 'Phoenix')); - if (isset($aversion[1])) { - $this->setVersion($aversion[1]); - $this->setBrowser(self::BROWSER_PHOENIX); - return true; - } - } - return false; - } - - /** - * Determine if the browser is Firebird or not (last updated 1.7) - * @return boolean True if the browser is Firebird otherwise false - */ - protected function checkBrowserFirebird() - { - if (stripos($this->_agent, 'Firebird') !== false) { - $aversion = explode('/', stristr($this->_agent, 'Firebird')); - if (isset($aversion[1])) { - $this->setVersion($aversion[1]); - $this->setBrowser(self::BROWSER_FIREBIRD); - return true; - } - } - return false; - } - - /** - * Determine if the browser is Netscape Navigator 9+ or not (last updated 1.7) - * NOTE: (http://browser.netscape.com/ - Official support ended on March 1st, 2008) - * @return boolean True if the browser is Netscape Navigator 9+ otherwise false - */ - protected function checkBrowserNetscapeNavigator9Plus() - { - if (stripos($this->_agent, 'Firefox') !== false && preg_match('/Navigator\/([^ ]*)/i', $this->_agent, $matches)) { - $this->setVersion($matches[1]); - $this->setBrowser(self::BROWSER_NETSCAPE_NAVIGATOR); - return true; - } else if (stripos($this->_agent, 'Firefox') === false && preg_match('/Netscape6?\/([^ ]*)/i', $this->_agent, $matches)) { - $this->setVersion($matches[1]); - $this->setBrowser(self::BROWSER_NETSCAPE_NAVIGATOR); - return true; - } - return false; - } - - /** - * Determine if the browser is Shiretoko or not (https://wiki.mozilla.org/Projects/shiretoko) (last updated 1.7) - * @return boolean True if the browser is Shiretoko otherwise false - */ - protected function checkBrowserShiretoko() - { - if (stripos($this->_agent, 'Mozilla') !== false && preg_match('/Shiretoko\/([^ ]*)/i', $this->_agent, $matches)) { - $this->setVersion($matches[1]); - $this->setBrowser(self::BROWSER_SHIRETOKO); - return true; - } - return false; - } - - /** - * Determine if the browser is Ice Cat or not (http://en.wikipedia.org/wiki/GNU_IceCat) (last updated 1.7) - * @return boolean True if the browser is Ice Cat otherwise false - */ - protected function checkBrowserIceCat() - { - if (stripos($this->_agent, 'Mozilla') !== false && preg_match('/IceCat\/([^ ]*)/i', $this->_agent, $matches)) { - $this->setVersion($matches[1]); - $this->setBrowser(self::BROWSER_ICECAT); - return true; - } - return false; - } - - /** - * Determine if the browser is Nokia or not (last updated 1.7) - * @return boolean True if the browser is Nokia otherwise false - */ - protected function checkBrowserNokia() - { - if (preg_match("/Nokia([^\/]+)\/([^ SP]+)/i", $this->_agent, $matches)) { - $this->setVersion($matches[2]); - if (stripos($this->_agent, 'Series60') !== false || strpos($this->_agent, 'S60') !== false) { - $this->setBrowser(self::BROWSER_NOKIA_S60); - } else { - $this->setBrowser(self::BROWSER_NOKIA); - } - $this->setMobile(true); - return true; - } - return false; - } - - /** - * Determine if the browser is Firefox or not (last updated 1.7) - * @return boolean True if the browser is Firefox otherwise false - */ - protected function checkBrowserFirefox() - { - if (stripos($this->_agent, 'safari') === false) { - if (preg_match("/Firefox[\/ \(]([^ ;\)]+)/i", $this->_agent, $matches)) { - $this->setVersion($matches[1]); - $this->setBrowser(self::BROWSER_FIREFOX); - //Firefox on Android - if (stripos($this->_agent, 'Android') !== false) { - if (stripos($this->_agent, 'Mobile') !== false) { - $this->setMobile(true); - } else { - $this->setTablet(true); - } - } - return true; - } else if (preg_match("/Firefox$/i", $this->_agent, $matches)) { - $this->setVersion(""); - $this->setBrowser(self::BROWSER_FIREFOX); - return true; - } - } - return false; - } - - /** - * Determine if the browser is Firefox or not (last updated 1.7) - * @return boolean True if the browser is Firefox otherwise false - */ - protected function checkBrowserIceweasel() - { - if (stripos($this->_agent, 'Iceweasel') !== false) { - $aresult = explode('/', stristr($this->_agent, 'Iceweasel')); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - $this->setVersion($aversion[0]); - $this->setBrowser(self::BROWSER_ICEWEASEL); - return true; - } - } - return false; - } - - /** - * Determine if the browser is Mozilla or not (last updated 1.7) - * @return boolean True if the browser is Mozilla otherwise false - */ - protected function checkBrowserMozilla() - { - if (stripos($this->_agent, 'mozilla') !== false && preg_match('/rv:[0-9].[0-9][a-b]?/i', $this->_agent) && stripos($this->_agent, 'netscape') === false) { - $aversion = explode(' ', stristr($this->_agent, 'rv:')); - preg_match('/rv:[0-9].[0-9][a-b]?/i', $this->_agent, $aversion); - $this->setVersion(str_replace('rv:', '', $aversion[0])); - $this->setBrowser(self::BROWSER_MOZILLA); - return true; - } else if (stripos($this->_agent, 'mozilla') !== false && preg_match('/rv:[0-9]\.[0-9]/i', $this->_agent) && stripos($this->_agent, 'netscape') === false) { - $aversion = explode('', stristr($this->_agent, 'rv:')); - $this->setVersion(str_replace('rv:', '', $aversion[0])); - $this->setBrowser(self::BROWSER_MOZILLA); - return true; - } else if (stripos($this->_agent, 'mozilla') !== false && preg_match('/mozilla\/([^ ]*)/i', $this->_agent, $matches) && stripos($this->_agent, 'netscape') === false) { - $this->setVersion($matches[1]); - $this->setBrowser(self::BROWSER_MOZILLA); - return true; - } - return false; - } - - /** - * Determine if the browser is Lynx or not (last updated 1.7) - * @return boolean True if the browser is Lynx otherwise false - */ - protected function checkBrowserLynx() - { - if (stripos($this->_agent, 'lynx') !== false) { - $aresult = explode('/', stristr($this->_agent, 'Lynx')); - $aversion = explode(' ', (isset($aresult[1]) ? $aresult[1] : "")); - $this->setVersion($aversion[0]); - $this->setBrowser(self::BROWSER_LYNX); - return true; - } - return false; - } - - /** - * Determine if the browser is Amaya or not (last updated 1.7) - * @return boolean True if the browser is Amaya otherwise false - */ - protected function checkBrowserAmaya() - { - if (stripos($this->_agent, 'amaya') !== false) { - $aresult = explode('/', stristr($this->_agent, 'Amaya')); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - $this->setVersion($aversion[0]); - $this->setBrowser(self::BROWSER_AMAYA); - return true; - } - } - return false; - } - - /** - * Determine if the browser is Safari or not (last updated 1.7) - * @return boolean True if the browser is Safari otherwise false - */ - protected function checkBrowserSafari() - { - if (stripos($this->_agent, 'Safari') !== false - && stripos($this->_agent, 'iPhone') === false - && stripos($this->_agent, 'iPod') === false) { - - $aresult = explode('/', stristr($this->_agent, 'Version')); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - $this->setVersion($aversion[0]); - } else { - $this->setVersion(self::VERSION_UNKNOWN); - } - $this->setBrowser(self::BROWSER_SAFARI); - return true; - } - return false; - } - - /** - * Detect if URL is loaded from FacebookExternalHit - * @return boolean True if it detects FacebookExternalHit otherwise false - */ - protected function checkFacebookExternalHit() - { - if(stristr($this->_agent,'FacebookExternalHit')) - { - $this->setRobot(true); - $this->setFacebook(true); - return true; - } - return false; - } - - /** - * Detect if URL is being loaded from internal Facebook browser - * @return boolean True if it detects internal Facebook browser otherwise false - */ - protected function checkForFacebookIos() - { - if(stristr($this->_agent,'FBIOS')) - { - $this->setFacebook(true); - return true; - } - return false; - } - - /** - * Detect Version for the Safari browser on iOS devices - * @return boolean True if it detects the version correctly otherwise false - */ - protected function getSafariVersionOnIos() - { - $aresult = explode('/',stristr($this->_agent,'Version')); - if( isset($aresult[1]) ) - { - $aversion = explode(' ',$aresult[1]); - $this->setVersion($aversion[0]); - return true; - } - return false; - } - - /** - * Detect Version for the Chrome browser on iOS devices - * @return boolean True if it detects the version correctly otherwise false - */ - protected function getChromeVersionOnIos() - { - $aresult = explode('/',stristr($this->_agent,'CriOS')); - if( isset($aresult[1]) ) - { - $aversion = explode(' ',$aresult[1]); - $this->setVersion($aversion[0]); - $this->setBrowser(self::BROWSER_CHROME); - return true; - } - return false; - } - - /** - * Determine if the browser is iPhone or not (last updated 1.7) - * @return boolean True if the browser is iPhone otherwise false - */ - protected function checkBrowseriPhone() { - if( stripos($this->_agent,'iPhone') !== false ) { - $this->setVersion(self::VERSION_UNKNOWN); - $this->setBrowser(self::BROWSER_IPHONE); - $this->getSafariVersionOnIos(); - $this->getChromeVersionOnIos(); - $this->checkForFacebookIos(); - $this->setMobile(true); - return true; - } - return false; - } - - /** - * Determine if the browser is iPad or not (last updated 1.7) - * @return boolean True if the browser is iPad otherwise false - */ - protected function checkBrowseriPad() { - if( stripos($this->_agent,'iPad') !== false ) { - $this->setVersion(self::VERSION_UNKNOWN); - $this->setBrowser(self::BROWSER_IPAD); - $this->getSafariVersionOnIos(); - $this->getChromeVersionOnIos(); - $this->checkForFacebookIos(); - $this->setTablet(true); - return true; - } - return false; - } - - /** - * Determine if the browser is iPod or not (last updated 1.7) - * @return boolean True if the browser is iPod otherwise false - */ - protected function checkBrowseriPod() { - if( stripos($this->_agent,'iPod') !== false ) { - $this->setVersion(self::VERSION_UNKNOWN); - $this->setBrowser(self::BROWSER_IPOD); - $this->getSafariVersionOnIos(); - $this->getChromeVersionOnIos(); - $this->checkForFacebookIos(); - $this->setMobile(true); - return true; - } - return false; - } - - /** - * Determine if the browser is Android or not (last updated 1.7) - * @return boolean True if the browser is Android otherwise false - */ - protected function checkBrowserAndroid() - { - if (stripos($this->_agent, 'Android') !== false) { - $aresult = explode(' ', stristr($this->_agent, 'Android')); - if (isset($aresult[1])) { - $aversion = explode(' ', $aresult[1]); - $this->setVersion($aversion[0]); - } else { - $this->setVersion(self::VERSION_UNKNOWN); - } - if (stripos($this->_agent, 'Mobile') !== false) { - $this->setMobile(true); - } else { - $this->setTablet(true); - } - $this->setBrowser(self::BROWSER_ANDROID); - return true; - } - return false; - } - - /** - * Determine the user's platform (last updated 1.7) - */ - protected function checkPlatform() - { - if (stripos($this->_agent, 'windows') !== false) - { - $this->_platform = self::PLATFORM_WINDOWS; - } - else if (stripos($this->_agent, 'iPad') !== false) - { - $this->_platform = self::PLATFORM_IPAD; - } - else if (stripos($this->_agent, 'iPod') !== false) - { - $this->_platform = self::PLATFORM_IPOD; - } - else if (stripos($this->_agent, 'iPhone') !== false) - { - $this->_platform = self::PLATFORM_IPHONE; - } - elseif (stripos($this->_agent, 'mac') !== false) - { - $this->_platform = self::PLATFORM_APPLE; - } - elseif (stripos($this->_agent, 'android') !== false) - { - $this->_platform = self::PLATFORM_ANDROID; - } - elseif (stripos($this->_agent, 'linux') !== false) - { - $this->_platform = self::PLATFORM_LINUX; - } - else if (stripos($this->_agent, 'Nokia') !== false) - { - $this->_platform = self::PLATFORM_NOKIA; - } - else if (stripos($this->_agent, 'BlackBerry') !== false) - { - $this->_platform = self::PLATFORM_BLACKBERRY; - } - elseif (stripos($this->_agent, 'FreeBSD') !== false) - { - $this->_platform = self::PLATFORM_FREEBSD; - } - elseif (stripos($this->_agent, 'OpenBSD') !== false) - { - $this->_platform = self::PLATFORM_OPENBSD; - } - elseif (stripos($this->_agent, 'NetBSD') !== false) - { - $this->_platform = self::PLATFORM_NETBSD; - } - elseif (stripos($this->_agent, 'OpenSolaris') !== false) - { - $this->_platform = self::PLATFORM_OPENSOLARIS; - } - elseif (stripos($this->_agent, 'SunOS') !== false) - { - $this->_platform = self::PLATFORM_SUNOS; - } - elseif (stripos($this->_agent, 'OS\/2') !== false) - { - $this->_platform = self::PLATFORM_OS2; - } - elseif (stripos($this->_agent, 'BeOS') !== false) - { - $this->_platform = self::PLATFORM_BEOS; - } - elseif (stripos($this->_agent, 'win') !== false) - { - $this->_platform = self::PLATFORM_WINDOWS; - } - - } -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.p.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/class.p.php deleted file mode 100755 index ce0d168e..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.p.php +++ /dev/null @@ -1,303 +0,0 @@ - and -// are disabled by default, see for more information. -// callback - If specified, the response JSON will be wrapped in this named -// function call. This parameter and are disabled by -// default, see for more information. -// user_agent - This value will be sent to the remote URL request as the -// `User-Agent:` HTTP request header. If omitted, the browser user agent -// will be passed through. -// send_cookies - If send_cookies=1, all cookies will be forwarded through to -// the remote URL request. -// send_session - If send_session=1 and send_cookies=1, the SID cookie will be -// forwarded through to the remote URL request. -// full_headers - If a JSON request and full_headers=1, the JSON response will -// contain detailed header information. -// full_status - If a JSON request and full_status=1, the JSON response will -// contain detailed cURL status information, otherwise it will just contain -// the `http_code` property. -// -// Topic: POST Parameters -// -// All POST parameters are automatically passed through to the remote URL -// request. -// -// Topic: JSON requests -// -// This request will return the contents of the specified url in JSON format. -// -// Request: -// -// > ba-simple-proxy.php?url=http://example.com/ -// -// Response: -// -// > { "contents": "...", "headers": {...}, "status": {...} } -// -// JSON object properties: -// -// contents - (String) The contents of the remote URL resource. -// headers - (Object) A hash of HTTP headers returned by the remote URL -// resource. -// status - (Object) A hash of status codes returned by cURL. -// -// Topic: JSONP requests -// -// This request will return the contents of the specified url in JSONP format -// (but only if $enable_jsonp is enabled in the PHP script). -// -// Request: -// -// > ba-simple-proxy.php?url=http://example.com/&callback=foo -// -// Response: -// -// > foo({ "contents": "...", "headers": {...}, "status": {...} }) -// -// JSON object properties: -// -// contents - (String) The contents of the remote URL resource. -// headers - (Object) A hash of HTTP headers returned by the remote URL -// resource. -// status - (Object) A hash of status codes returned by cURL. -// -// Topic: Native requests -// -// This request will return the contents of the specified url in the format it -// was received in, including the same content-type and other headers (but only -// if $enable_native is enabled in the PHP script). -// -// Request: -// -// > ba-simple-proxy.php?url=http://example.com/&mode=native -// -// Response: -// -// > ... -// -// Topic: Notes -// -// * Assumes magic_quotes_gpc = Off in php.ini -// -// Topic: Configuration Options -// -// These variables can be manually edited in the PHP file if necessary. -// -// $enable_jsonp - Only enable if you really need to. If you -// install this script on the same server as the page you're calling it -// from, plain JSON will work. Defaults to false. -// $enable_native - You can enable , but you should only do -// this if you also whitelist specific URLs using $valid_url_regex, to avoid -// possible XSS vulnerabilities. Defaults to false. -// $valid_url_regex - This regex is matched against the url parameter to -// ensure that it is valid. This setting only needs to be used if either -// $enable_jsonp or $enable_native are enabled. Defaults to '/.*/' which -// validates all URLs. -// -// ############################################################################ - - - $_GET['mode'] = "native"; - $_GET['full_headers'] = 1; - $_GET['full_status'] = 1; - $_GET['send_cookies'] = 1; - - -// Change these configuration options if needed, see above descriptions for info. - $enable_jsonp = false; - $enable_native = true; - $valid_url_regex = '/.*/'; - -// ############################################################################ - $url = $_GET['url']; - - if ( isset( $_GET['nonce'] ) ) { - $url = str_replace( 'nonce=' . $_GET['nonce'] . '&', '', $url ); - } - - - if ( ! $url ) { - - // Passed url not specified. - $contents = 'ERROR: url not specified'; - $status = array( 'http_code' => 'ERROR' ); - - } else if ( ! preg_match( $valid_url_regex, $url ) ) { - - // Passed url doesn't match $valid_url_regex. - $contents = 'ERROR: invalid url'; - $status = array( 'http_code' => 'ERROR' ); - - } else { - $url = urldecode( $url ); - if ( isset( $_GET['proxy'] ) ) { - $url .= '&proxy=' . $_GET['proxy']; - } - - // Ad URL rewrite - if ( strpos( $url, 'http' ) === false ) { - $url = 'http:' . $url; - } - - if ( isset( $_GET['callback'] ) ) { - foreach ( $_GET as $key => $value ) { - if ( in_array( $key, array( 'url', 'mode', 'full_headers', 'full_status', 'send_cookies' ) ) ) { - continue; - } - $url .= "&" . $key . '=' . $value; - } - } - - - $args = array( - 'user-agent' => isset( $_GET['user_agent'] ) ? $_GET['user_agent'] : $_SERVER['HTTP_USER_AGENT'], - 'method' => 'GET', - ); - - if ( isset( $_GET['send_cookies'] ) && $_GET['send_cookies'] ) { - $cookie = array(); - foreach ( $_COOKIE as $key => $value ) { - $cookie[] = $key . '=' . $value; - } - if ( isset( $_GET['send_session'] ) && $_GET['send_session'] ) { - $cookie[] = SID; - } - $args['cookies'] = $cookie; - - } - if ( strtolower( $_SERVER['REQUEST_METHOD'] ) == 'post' ) { - $args['body'] = $_POST; - $args['method'] = 'POST'; - - } - - - $response = wp_remote_request( - $url, - $args - ); - - if ( ! is_wp_error( $response ) ) { - $status = $response['response']['code']; - $contents = $response['body']; - } - - } - - - if ( isset( $_GET['mode'] ) && $_GET['mode'] == 'native' ) { - if ( ! $enable_native ) { - $contents = 'ERROR: invalid mode'; - $status = array( 'http_code' => 'ERROR' ); - } - - if ( ! is_wp_error( $response ) && isset( $response['headers']['content-type'] ) ) { - header( 'Content-Type: ' . $response['headers']['content-type'] ); - } - if ( ! is_wp_error( $response ) && isset( $response['headers']['content-language'] ) ) { - header( 'Content-Language: ' . $response['headers']['content-language'] ); - } - if ( ! is_wp_error( $response ) && isset( $response['headers']['set-cookie'] ) ) { - header( 'Set-Cookie: ' . $response['headers']['set-cookie'] ); - } - - if ( isset( $contents ) ) { - print str_replace( 'ads.reduxframework.com', 'look.reduxframework.com', $contents ); - } - - } else { - - // $data will be serialized into JSON data. - $data = array(); - - // Propagate all HTTP headers into the JSON data object. - if ( isset( $_GET['full_headers'] ) && $_GET['full_headers'] ) { - $data['headers'] = array(); - - } - - // Propagate all cURL request / response info to the JSON data object. - if ( isset( $_GET['full_status'] ) && $_GET['full_status'] ) { - $data['status'] = $status; - } else { - $data['status'] = array(); - $data['status']['http_code'] = $status['http_code']; - } - - // Set the JSON data object contents, decoding it from JSON if possible. - $decoded_json = json_decode( $contents ); - $data['contents'] = str_replace( 'e(window).width()', 'window.innerWidth||e(window).width()', $decoded_json ? $decoded_json : $contents ); - - // Generate appropriate content-type header. - - $is_xhr = isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) ? strtolower( $_SERVER['HTTP_X_REQUESTED_WITH'] ) : 'xmlhttprequest'; - header( 'Content-type: application/' . ( $is_xhr ? 'json' : 'x-javascript' ) ); - - // Get JSONP callback. - $jsonp_callback = $enable_jsonp && isset( $_GET['callback'] ) ? $_GET['callback'] : null; - - // Generate JSON/JSONP string - $json = json_encode( $data ); - - print $jsonp_callback ? "$jsonp_callback($json)" : $json; - - } - - } - } - - new Redux_P(); - diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_admin_notices.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_admin_notices.php deleted file mode 100755 index a140cdb8..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_admin_notices.php +++ /dev/null @@ -1,189 +0,0 @@ -ID; - - if ( ! get_user_meta( $userid, 'ignore_' . $notice['id'] ) ) { - - // Check if we are on admin.php. If we are, we have - // to get the current page slug and tab, so we can - // feed it back to Wordpress. Why> admin.php cannot - // be accessed without the page parameter. We add the - // tab to return the user to the last panel they were - // on. - $pageName = ''; - $curTab = ''; - if ( $pagenow == 'admin.php' || $pagenow == 'themes.php' ) { - - // Get the current page. To avoid errors, we'll set - // the redux page slug if the GET is empty. - $pageName = empty( $_GET['page'] ) ? '&page=' . self::$_parent->args['page_slug'] : '&page=' . esc_attr( $_GET['page'] ); - - // Ditto for the current tab. - $curTab = empty( $_GET['tab'] ) ? '&tab=0' : '&tab=' . esc_attr( $_GET['tab'] ); - } - - global $wp_version; - // Print the notice with the dismiss link - if ( version_compare( $wp_version, '4.2', '>' ) ) { - $output = ""; - $css_id = esc_attr( $notice['id'] ) . $pageName . $curTab; - $css_class = esc_attr( $notice['type'] ) . ' redux-notice notice is-dismissible redux-notice'; - $output .= "
    \n"; - $nonce = wp_create_nonce( $notice['id'] . $userid . 'nonce' ); - $output .= " \n"; - $output .= '

    ' . wp_kses_post( $notice['msg'] ) . '

    '; - $output .= "
    \n"; - echo $output; - } else { - echo '

    ' . wp_kses_post( $notice['msg'] ) . '  ' . esc_html__( 'Dismiss', 'redux-framework' ) . '.

    '; - } - } - } else { - // Standard notice - echo '

    ' . wp_kses_post( $notice['msg'] ) . '.

    '; - } - ?> - - admin_notices = array(); - } - } - - /** - * dismissAdminNotice - Updates user meta to store dismiss notice preference - * - * @since 3.2.0 - * @access public - * @return void - */ - public static function dismissAdminNotice() { - global $current_user; - - // Verify the dismiss and id parameters are present. - if ( isset( $_GET['dismiss'] ) && isset( $_GET['id'] ) ) { - if ( 'true' == $_GET['dismiss'] || 'false' == $_GET['dismiss'] ) { - - // Get the user id - $userid = $current_user->ID; - - // Get the notice id - $id = esc_attr( $_GET['id'] ); - $val = esc_attr( $_GET['dismiss'] ); - - // Add the dismiss request to the user meta. - update_user_meta( $userid, 'ignore_' . $id, $val ); - } - } - } - - /** - * dismissAdminNotice - Updates user meta to store dismiss notice preference - * - * @since 3.2.0 - * @access public - * @return void - */ - public static function dismissAdminNoticeAJAX() { - global $current_user; - - // Get the notice id - $id = explode( '&', $_POST['id'] ); - $id = $id[0]; - // Get the user id - $userid = $current_user->ID; - - if ( ! wp_verify_nonce( $_POST['nonce'], $id . $userid . 'nonce' ) ) { - die( 0 ); - } else { - // Add the dismiss request to the user meta. - update_user_meta( $userid, 'ignore_' . $id, true ); - } - } - } - - Redux_Admin_Notices::load(); - } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_api.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_api.php deleted file mode 100755 index c14e3111..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_api.php +++ /dev/null @@ -1,638 +0,0 @@ -{$closure}->bindTo( $this ), $args ); - } - - public function __toString() { - return call_user_func( $this->{"__toString"}->bindTo( $this ) ); - } - - public static function load() { - add_action( 'after_setup_theme', array( 'Redux', 'createRedux' ) ); - add_action( 'init', array( 'Redux', 'createRedux' ) ); - add_action( 'switch_theme', array( 'Redux', 'createRedux' ) ); - } - - public static function init( $opt_name = "" ) { - if ( ! empty( $opt_name ) ) { - self::loadRedux( $opt_name ); - remove_action( 'setup_theme', array( 'Redux', 'createRedux' ) ); - } - } - - public static function loadExtensions( $ReduxFramework ) { - if ( $instanceExtensions = self::getExtensions( $ReduxFramework->args['opt_name'], "" ) ) { - foreach ( $instanceExtensions as $name => $extension ) { - if ( ! class_exists( $extension['class'] ) ) { - // In case you wanted override your override, hah. - $extension['path'] = apply_filters( 'redux/extension/' . $ReduxFramework->args['opt_name'] . '/' . $name, $extension['path'] ); - if ( file_exists( $extension['path'] ) ) { - require_once $extension['path']; - } - } - if ( ! isset( $ReduxFramework->extensions[ $name ] ) ) { - if ( class_exists( $extension['class'] ) ) { - $ReduxFramework->extensions[ $name ] = new $extension['class']( $ReduxFramework ); - } else { - echo '

    No class named ' . $extension['class'] . ' exists. Please verify your extension path.

    '; - } - - } - } - } - } - - public static function extensionPath( $extension, $folder = true ) { - if ( ! isset( Redux::$extensions[ $extension ] ) ) { - return; - } - $path = end( Redux::$extensions[ $extension ] ); - if ( ! $folder ) { - return $path; - } - - return str_replace( 'extension_' . $extension . '.php', '', $path ); - } - - - public static function loadRedux( $opt_name = "" ) { - - if ( empty( $opt_name ) ) { - return; - } - - $check = ReduxFrameworkInstances::get_instance( $opt_name ); - if ( isset( $check->apiHasRun ) ) { - return; - } - - $args = self::constructArgs( $opt_name ); - $sections = self::constructSections( $opt_name ); - if ( ! class_exists( 'ReduxFramework' ) ) { - echo '

    Redux Framework is not installed. Please install it.

    '; - - return; - } - if ( isset( self::$uses_extensions[ $opt_name ] ) && ! empty( self::$uses_extensions[ $opt_name ] ) ) { - add_action( "redux/extensions/{$opt_name}/before", array( 'Redux', 'loadExtensions' ), 0 ); - } - - $redux = new ReduxFramework( $sections, $args ); - $redux->apiHasRun = 1; - self::$init[ $opt_name ] = 1; - if ( isset( $redux->args['opt_name'] ) && $redux->args['opt_name'] != $opt_name ) { - self::$init[ $redux->args['opt_name'] ] = 1; - } - - } - - public static function createRedux() { - foreach ( self::$sections as $opt_name => $theSections ) { - if ( ! self::$init[ $opt_name ] ) { - self::loadRedux( $opt_name ); - } - } - } - - public static function constructArgs( $opt_name ) { - $args = isset( self::$args[ $opt_name ] ) ? self::$args[ $opt_name ] : array(); - - $args['opt_name'] = $opt_name; - if ( ! isset( $args['menu_title'] ) ) { - $args['menu_title'] = ucfirst( $opt_name ) . ' Options'; - } - if ( ! isset( $args['page_title'] ) ) { - $args['page_title'] = ucfirst( $opt_name ) . ' Options'; - } - if ( ! isset( $args['page_slug'] ) ) { - $args['page_slug'] = $opt_name . '_options'; - } - - return $args; - } - - public static function constructSections( $opt_name ) { - $sections = array(); - if ( ! isset( self::$sections[ $opt_name ] ) ) { - return $sections; - - } - foreach ( self::$sections[ $opt_name ] as $section_id => $section ) { - $section['fields'] = self::constructFields( $opt_name, $section_id ); - $p = $section['priority']; - while ( isset( $sections[ $p ] ) ) { - $p++; - } - $sections[ $p ] = $section; - } - ksort( $sections ); - - return $sections; - } - - public static function constructFields( $opt_name = "", $section_id = "" ) { - $fields = array(); - if ( ! empty( self::$fields[ $opt_name ] ) ) { - foreach ( self::$fields[ $opt_name ] as $key => $field ) { - if ( $field['section_id'] == $section_id ) { - $p = $field['priority']; - while ( isset( $fields[ $p ] ) ) { - echo $p ++; - } - $fields[ $p ] = $field; - } - } - } - ksort( $fields ); - - return $fields; - } - - public static function getSection( $opt_name = '', $id = '' ) { - self::check_opt_name( $opt_name ); - if ( ! empty( $opt_name ) && ! empty( $id ) ) { - if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) { - $id = strtolower( sanitize_html_class( $id ) ); - } - - return isset( self::$sections[ $opt_name ][ $id ] ) ? self::$sections[ $opt_name ][ $id ] : false; - } - - return false; - } - - public static function setSections( $opt_name = '', $sections = array() ) { - self::check_opt_name( $opt_name ); - if ( ! empty( $sections ) ) { - foreach ( $sections as $section ) { - Redux::setSection( $opt_name, $section ); - } - } - } - - public static function getSections( $opt_name = '' ) { - self::check_opt_name( $opt_name ); - if ( ! empty( self::$sections[ $opt_name ] ) ) { - return self::$sections[ $opt_name ]; - } - - return array(); - } - - public static function removeSection( $opt_name = '', $id = "", $fields = false ) { - if ( ! empty( $opt_name ) && ! empty( $id ) ) { - if ( isset( self::$sections[ $opt_name ][ $id ] ) ) { - $priority = ''; - - foreach ( self::$sections[ $opt_name ] as $key => $section ) { - if ( $key == $id ) { - $priority = $section['priority']; - self::$priority[ $opt_name ]['sections'] --; - unset( self::$sections[ $opt_name ][ $id ] ); - continue; - } - if ( $priority != "" ) { - $newPriority = $section['priority']; - $section['priority'] = $priority; - self::$sections[ $opt_name ][ $key ] = $section; - $priority = $newPriority; - } - } - - if ( isset( self::$fields[ $opt_name ] ) && ! empty( self::$fields[ $opt_name ] ) && $fields == true ) { - foreach ( self::$fields[ $opt_name ] as $key => $field ) { - if ( $field['section_id'] == $id ) { - unset( self::$fields[ $opt_name ][ $key ] ); - } - } - } - } - } - } - - public static function setSection( $opt_name = '', $section = array() ) { - self::check_opt_name( $opt_name ); - if ( empty( $section ) ) { - return; - } - if ( ! isset( $section['id'] ) ) { - if ( isset( $section['type'] ) && $section['type'] == "divide" ) { - $section['id'] = time(); - } else { - if ( isset( $section['title'] ) ) { - $section['id'] = strtolower( sanitize_title( $section['title'] ) ); - } else { - $section['id'] = time(); - } - } - if ( ! isset( $section['id'] ) ) { - print_r( $section ); - echo "DOVY"; - } - - if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) { - $orig = $section['id']; - $i = 0; - while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) { - $section['id'] = $orig . '_' . $i; - } - } - } - - if ( ! empty( $opt_name ) && is_array( $section ) && ! empty( $section ) ) { - if ( ! isset( $section['id'] ) && ! isset( $section['title'] ) ) { - self::$errors[ $opt_name ]['section']['missing_title'] = "Unable to create a section due to missing id and title."; - - return; - } - if ( ! isset( $section['priority'] ) ) { - $section['priority'] = self::getPriority( $opt_name, 'sections' ); - } - if ( isset( $section['fields'] ) ) { - if ( ! empty( $section['fields'] ) && is_array( $section['fields'] ) ) { - self::processFieldsArray( $opt_name, $section['id'], $section['fields'] ); - } - unset( $section['fields'] ); - } - self::$sections[ $opt_name ][ $section['id'] ] = $section; - } else { - self::$errors[ $opt_name ]['section']['empty'] = "Unable to create a section due an empty section array or the section variable passed was not an array."; - - return; - } - } - - public static function hideSection( $opt_name = '', $id = '', $hide = true ) { - self::check_opt_name( $opt_name ); - - if ( ! empty( $opt_name ) && ! empty( $id ) ) { - if ( isset ( self::$sections[ $opt_name ][ $id ] ) ) { - self::$sections[ $opt_name ][ $id ]['hidden'] = $hide; - } - } - } - - public static function processFieldsArray( $opt_name = "", $section_id = "", $fields = array() ) { - if ( ! empty( $opt_name ) && ! empty( $section_id ) && is_array( $fields ) && ! empty( $fields ) ) { - foreach ( $fields as $field ) { - if ( ! is_array( $field ) ) { - continue; - } - $field['section_id'] = $section_id; - self::setField( $opt_name, $field ); - } - } - } - - public static function getField( $opt_name = '', $id = '' ) { - self::check_opt_name( $opt_name ); - if ( ! empty( $opt_name ) && ! empty( $id ) ) { - return isset( self::$fields[ $opt_name ][ $id ] ) ? self::$fields[ $opt_name ][ $id ] : false; - } - - return false; - } - - public static function hideField( $opt_name = '', $id = '', $hide = true ) { - self::check_opt_name( $opt_name ); - - if ( ! empty( $opt_name ) && ! empty( $id ) ) { - if ( isset ( self::$fields[ $opt_name ][ $id ] ) ) { - if ( ! $hide ) { - self::$fields[ $opt_name ][ $id ]['class'] = str_replace( 'hidden', '', self::$fields[ $opt_name ][ $id ]['class'] ); - } else { - self::$fields[ $opt_name ][ $id ]['class'] .= 'hidden'; - } - } - } - } - - public static function setField( $opt_name = '', $field = array() ) { - self::check_opt_name( $opt_name ); - - if ( ! empty( $opt_name ) && is_array( $field ) && ! empty( $field ) ) { - - if ( ! isset( $field['priority'] ) ) { - $field['priority'] = self::getPriority( $opt_name, 'fields' ); - } - if ( isset( $field['id'] ) ) { - self::$fields[ $opt_name ][ $field['id'] ] = $field; - } - } - } - - public static function removeField( $opt_name = '', $id = '' ) { - self::check_opt_name( $opt_name ); - - if ( ! empty( $opt_name ) && ! empty( $id ) ) { - if ( isset( self::$fields[ $opt_name ][ $id ] ) ) { - foreach ( self::$fields[ $opt_name ] as $key => $field ) { - if ( $key == $id ) { - $priority = $field['priority']; - self::$priority[ $opt_name ]['fields'] --; - unset( self::$fields[ $opt_name ][ $id ] ); - continue; - } - if ( isset( $priority ) && $priority != "" ) { - $newPriority = $field['priority']; - $field['priority'] = $priority; - self::$fields[ $opt_name ][ $key ] = $field; - $priority = $newPriority; - } - } - } - } - - return false; - } - - public static function setHelpTab( $opt_name = "", $tab = array() ) { - self::check_opt_name( $opt_name ); - if ( ! empty( $opt_name ) && ! empty( $tab ) ) { - if ( ! isset( self::$args[ $opt_name ]['help_tabs'] ) ) { - self::$args[ $opt_name ]['help_tabs'] = array(); - } - if ( isset( $tab['id'] ) ) { - self::$args[ $opt_name ]['help_tabs'][] = $tab; - } else if ( is_array( end( $tab ) ) ) { - foreach ( $tab as $tab_item ) { - self::$args[ $opt_name ]['help_tabs'][] = $tab_item; - } - } - } - } - - public static function setHelpSidebar( $opt_name = "", $content = "" ) { - self::check_opt_name( $opt_name ); - if ( ! empty( $opt_name ) && ! empty( $content ) ) { - self::$args[ $opt_name ]['help_sidebar'] = $content; - } - } - - public static function setArgs( $opt_name = "", $args = array() ) { - self::check_opt_name( $opt_name ); - if ( ! empty( $opt_name ) && ! empty( $args ) && is_array( $args ) ) { - if ( isset( self::$args[ $opt_name ] ) && isset( self::$args[ $opt_name ]['clearArgs'] ) ) { - self::$args[ $opt_name ] = array(); - } - self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] ); - } - } - - public static function getArgs( $opt_name = "" ) { - self::check_opt_name( $opt_name ); - if ( ! empty( $opt_name ) && ! empty( self::$args[ $opt_name ] ) ) { - return self::$args[ $opt_name ]; - } - } - - public static function getArg( $opt_name = "", $key = "" ) { - self::check_opt_name( $opt_name ); - if ( ! empty( $opt_name ) && ! empty( $key ) && ! empty( self::$args[ $opt_name ] ) ) { - return self::$args[ $opt_name ][ $key ]; - } else { - return; - } - } - - public static function getOption ($opt_name = "", $key = "") { - self::check_opt_name( $opt_name ); - - if (!empty($opt_name) && !empty($key)) { - $redux = get_option($opt_name); - - if (isset($redux[$key])) { - return $redux[$key]; - } else { - return; - } - } else { - return; - } - } - - public static function setOption ($opt_name = "", $key = "", $option = "") { - self::check_opt_name( $opt_name ); - - if (!empty($opt_name) && !empty($key)) { - $redux = get_option($opt_name); - $redux[$key] = $option; - - return update_option($opt_name, $redux); - } else { - return false; - } - } - - public static function getPriority( $opt_name, $type ) { - $priority = self::$priority[ $opt_name ][ $type ]; - self::$priority[ $opt_name ][ $type ] += 1; - - return $priority; - } - - public static function check_opt_name( $opt_name = "" ) { - if ( empty( $opt_name ) || is_array( $opt_name ) ) { - return; - } - if ( ! isset( self::$sections[ $opt_name ] ) ) { - self::$sections[ $opt_name ] = array(); - self::$priority[ $opt_name ]['sections'] = 1; - } - if ( ! isset( self::$args[ $opt_name ] ) ) { - self::$args[ $opt_name ] = array(); - self::$priority[ $opt_name ]['args'] = 1; - } - if ( ! isset( self::$fields[ $opt_name ] ) ) { - self::$fields[ $opt_name ] = array(); - self::$priority[ $opt_name ]['fields'] = 1; - } - if ( ! isset( self::$help[ $opt_name ] ) ) { - self::$help[ $opt_name ] = array(); - self::$priority[ $opt_name ]['help'] = 1; - } - if ( ! isset( self::$errors[ $opt_name ] ) ) { - self::$errors[ $opt_name ] = array(); - } - if ( ! isset( self::$init[ $opt_name ] ) ) { - self::$init[ $opt_name ] = false; - } - } - - /** - * Retrieve metadata from a file. Based on WP Core's get_file_data function - * - * @since 2.1.1 - * - * @param string $file Path to the file - * - * @return string - */ - public static function getFileVersion( $file ) { - $data = get_file_data( $file, array( 'version' ), 'plugin' ); - - return $data[0]; - } - - public static function checkExtensionClassFile( $opt_name, $name = "", $class_file = "", $instance = "" ) { - if ( file_exists( $class_file ) ) { - self::$uses_extensions[ $opt_name ] = isset( self::$uses_extensions[ $opt_name ] ) ? self::$uses_extensions[ $opt_name ] : array(); - if ( ! in_array( $name, self::$uses_extensions[ $opt_name ] ) ) { - self::$uses_extensions[ $opt_name ][] = $name; - } - - self::$extensions[ $name ] = isset( self::$extensions[ $name ] ) ? self::$extensions[ $name ] : array(); - $version = Redux_Helpers::get_template_version( $class_file ); - if ( empty( $version ) && ! empty( $instance ) ) { - if ( isset( $instance->version ) ) { - $version = $instance->version; - } - } - self::$extensions[ $name ][ $version ] = isset( self::$extensions[ $name ][ $version ] ) ? self::$extensions[ $name ][ $version ] : $class_file; - } - } - - public static function setExtensions( $opt_name, $path ) { - if ( is_dir( $path ) ) { - $path = trailingslashit( $path ); - $folder = str_replace( '.php', '', basename( $path ) ); - if ( file_exists( $path . 'extension_' . $folder . '.php' ) ) { - self::checkExtensionClassFile( $opt_name, $folder, $path . 'extension_' . $folder . '.php' ); - } else { - $folders = scandir( $path, 1 ); - foreach ( $folders as $folder ) { - if ( $folder === '.' or $folder === '..' ) { - continue; - } - if ( file_exists( $path . $folder . '/extension_' . $folder . '.php' ) ) { - self::checkExtensionClassFile( $opt_name, $folder, $path . $folder . '/extension_' . $folder . '.php' ); - } else if ( is_dir( $path . $folder ) ) { - self::setExtensions( $opt_name, $path . $folder ); - continue; - } - } - } - } else if ( file_exists( $path ) ) { - $name = explode( 'extension_', basename( $path ) ); - if ( isset( $name[1] ) && ! empty( $name[1] ) ) { - $name = str_replace( '.php', '', $name[1] ); - self::checkExtensionClassFile( $opt_name, $name, $path ); - } - } - } - - public static function getAllExtensions() { - $redux = ReduxFrameworkInstances::get_all_instances(); - foreach ( $redux as $instance ) { - if ( ! empty( self::$uses_extensions[ $instance['args']['opt_name'] ] ) ) { - continue; - } - if ( ! empty( $instance['extensions'] ) ) { - - Redux::getInstanceExtensions( $instance['args']['opt_name'], $instance ); - } - } - } - - public static function getInstanceExtensions( $opt_name, $instance = array() ) { - if ( ! empty( self::$uses_extensions[ $opt_name ] ) ) { - return; - } - if ( empty( $instance ) ) { - $instance = ReduxFrameworkInstances::get_instance( $opt_name ); - } - if ( empty( $instance ) || empty( $instance->extensions ) ) { - return; - } - foreach ( $instance->extensions as $name => $extension ) { - if ( $name == "widget_areas" ) { - $new = new Redux_Widget_Areas( $instance ); - } - if ( isset( self::$uses_extensions[ $opt_name ][ $name ] ) ) { - continue; - } - if ( isset( $extension->extension_dir ) ) { - Redux::setExtensions( $opt_name, str_replace( $name, '', $extension->extension_dir ) ); - - } else if ( isset( $extension->_extension_dir ) ) { - Redux::setExtensions( $opt_name, str_replace( $name, '', $extension->_extension_dir ) ); - } - } - } - - public static function getExtensions( $opt_name = "", $key = "" ) { - - if ( empty( $opt_name ) ) { - Redux::getAllExtensions(); - if ( empty( $key ) ) { - return self::$extension_paths; - } else { - if ( isset( self::$extension_paths[ $key ] ) ) { - return self::$extension_paths[ $key ]; - } - } - } else { - if ( empty( self::$uses_extensions[ $opt_name ] ) ) { - Redux::getInstanceExtensions( $opt_name ); - } - - if ( empty( self::$uses_extensions[ $opt_name ] ) ) { - return false; - } - $instanceExtensions = array(); - foreach ( self::$uses_extensions[ $opt_name ] as $extension ) { - $class_file = end( self::$extensions[ $extension ] ); - $name = str_replace( '.php', '', basename( $extension ) ); - $extension_class = 'ReduxFramework_Extension_' . $name; - $instanceExtensions[ $extension ] = array( - 'path' => $class_file, - 'class' => $extension_class, - 'version' => Redux_Helpers::get_template_version( $class_file ) - ); - } - - return $instanceExtensions; - } - - return false; - } - } - - Redux::load(); - } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_cdn.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_cdn.php deleted file mode 100755 index 60c43e7c..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_cdn.php +++ /dev/null @@ -1,155 +0,0 @@ -args['dev_mode'] ) { - $msg = sprintf( __( 'If you are developing offline, please download and install the Redux Vendor Support plugin/extension to bypass the our CDN and avoid this warning', 'redux-framework' ), 'https://github.com/reduxframework/redux-vendor-support' ); - } - - self::$_parent->admin_notices[] = array( - 'type' => 'error', - 'msg' => '' . __( 'Redux Framework Warning', 'redux-framework' ) . '
    ' . sprintf( __( '%s CDN unavailable. Some controls may not render properly.', 'redux-framework' ), $handle ) . ' ' . $msg, - 'id' => $handle . $tran_key, - 'dismiss' => false, - ); - - } - } - } else { - set_transient( $handle . $tran_key, true, MINUTE_IN_SECONDS * self::$_parent->args['cdn_check_time'] ); - - if ( $register ) { - self::_register( $handle, $src_cdn, $deps, $ver, $footer_or_media, $is_script ); - } else { - self::_enqueue( $handle, $src_cdn, $deps, $ver, $footer_or_media, $is_script ); - } - } - } - } - - private static function _vendor_plugin( $register = true, $handle, $src_cdn, $deps, $ver, $footer_or_media, $is_script = true ) { - if ( class_exists( 'Redux_VendorURL' ) ) { - $src = Redux_VendorURL::get_url( $handle ); - - if ( $register ) { - self::_register( $handle, $src, $deps, $ver, $footer_or_media, $is_script ); - } else { - self::_enqueue( $handle, $src, $deps, $ver, $footer_or_media, $is_script ); - } - } else { - if ( ! self::$_set ) { - self::$_parent->admin_notices[] = array( - 'type' => 'error', - 'msg' => sprintf( __( 'The Vendor Support plugin (or extension) is either not installed or not activated and thus, some controls may not render properly. Please ensure that it is installed and activated', 'redux-framework' ), 'https://github.com/reduxframework/redux-vendor-support', admin_url( 'plugins.php' ) ), - 'id' => $handle . '23', - 'dismiss' => false, - ); - - self::$_set = true; - } - } - } - - public static function register_style( $handle, $src_cdn = false, $deps = array(), $ver = false, $media = 'all' ) { - if ( self::$_parent->args['use_cdn'] ) { - self::_cdn( true, $handle, $src_cdn, $deps, $ver, $media, $is_script = false ); - } else { - self::_vendor_plugin( true, $handle, $src_cdn, $deps, $ver, $media, $is_script = false ); - } - } - - public static function register_script( $handle, $src_cdn = false, $deps = array(), $ver = false, $in_footer = false ) { - if ( self::$_parent->args['use_cdn'] ) { - self::_cdn( true, $handle, $src_cdn, $deps, $ver, $in_footer, $is_script = true ); - } else { - self::_vendor_plugin( true, $handle, $src_cdn, $deps, $ver, $in_footer, $is_script = true ); - } - } - - public static function enqueue_style( $handle, $src_cdn = false, $deps = array(), $ver = false, $media = 'all' ) { - if ( self::$_parent->args['use_cdn'] ) { - self::_cdn( false, $handle, $src_cdn, $deps, $ver, $media, $is_script = false ); - } else { - self::_vendor_plugin( false, $handle, $src_cdn, $deps, $ver, $media, $is_script = false ); - } - } - - public static function enqueue_script( $handle, $src_cdn = false, $deps = array(), $ver = false, $in_footer = false ) { - if ( self::$_parent->args['use_cdn'] ) { - self::_cdn( false, $handle, $src_cdn, $deps, $ver, $in_footer, $is_script = true ); - } else { - self::_vendor_plugin( false, $handle, $src_cdn, $deps, $ver, $in_footer, $is_script = true ); - } - } - } - } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_filesystem.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_filesystem.php deleted file mode 100755 index ed5b8518..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_filesystem.php +++ /dev/null @@ -1,286 +0,0 @@ -parent->admin_notices[] = array( - 'type' => 'error', - 'msg' => '' . __( 'File Permission Issues', 'redux-framework' ) . '
    ' . sprintf( __( 'We were unable to modify required files. Please check your permissions, or modify your wp-config.php file to contain your FTP login credentials as outlined here.', 'redux-framework' ), 'https://codex.wordpress.org/Editing_wp-config.php#WordPress_Upgrade_Constants' ), - 'id' => 'redux-wp-login', - 'dismiss' => false, - ); - } - - /** - * Return an instance of this class. - * - * @since 1.0.0 - * @return object A single instance of this class. - */ - public static function get_instance( $parent = null ) { - - // If the single instance hasn't been set, set it now. - if ( null == self::$instance ) { - self::$instance = new self; - } - - if ( $parent !== null ) { - self::$instance->parent = $parent; - } - - return self::$instance; - } - - public function ftp_form() { - if ( isset( $this->parent->ftp_form ) && ! empty( $this->parent->ftp_form ) ) { - echo '

    '; - echo '' . __( 'File Permission Issues', 'redux-framework' ) . '
    ' . sprintf( __( 'We were unable to modify required files. Please ensure that %1s has the proper read-write permissions, or modify your wp-config.php file to contain your FTP login credentials as outlined here.', 'redux-framework' ), Redux_Helpers::cleanFilePath( trailingslashit( WP_CONTENT_DIR ) ) . '/uploads/', 'https://codex.wordpress.org/Editing_wp-config.php#WordPress_Upgrade_Constants' ); - echo '

    ' . '
    '; - } - } - - function filesystem_init( $form_url, $method = '', $context = false, $fields = null ) { - global $wp_filesystem; - - if ( ! empty( $this->creds ) ) { - return true; - } - - ob_start(); - - /* first attempt to get credentials */ - if ( false === ( $this->creds = request_filesystem_credentials( $form_url, $method, false, $context ) ) ) { - $this->creds = array(); - $this->parent->ftp_form = ob_get_contents(); - ob_end_clean(); - - /** - * if we comes here - we don't have credentials - * so the request for them is displaying - * no need for further processing - **/ - - return false; - } - - /* now we got some credentials - try to use them*/ - if ( ! WP_Filesystem( $this->creds ) ) { - $this->creds = array(); - /* incorrect connection data - ask for credentials again, now with error message */ - request_filesystem_credentials( $form_url, '', true, $context ); - $this->parent->ftp_form = ob_get_contents(); - ob_end_clean(); - - return false; - } - - return true; - } - - - public static function load_direct() { - if ( self::$direct === null ) { - require_once ABSPATH . '/wp-admin/includes/class-wp-filesystem-base.php'; - require_once ABSPATH . '/wp-admin/includes/class-wp-filesystem-direct.php'; - self::$direct = new WP_Filesystem_Direct( array() ); - } - } - - public function execute( $action, $file = '', $params = '' ) { - - if ( empty( $this->parent->args ) ) { - return; - } - - if ( ! empty ( $params ) ) { - extract( $params ); - } - - if ( ! is_dir( ReduxFramework::$_upload_dir ) ) { - wp_mkdir_p( ReduxFramework::$_upload_dir ); - } - - // Setup the filesystem with creds - require_once ABSPATH . '/wp-admin/includes/template.php'; - - require_once ABSPATH . '/wp-admin/includes/file.php'; - - if ( $this->parent->args['menu_type'] == 'submenu' ) { - $page_parent = $this->parent->args['page_parent']; - $base = $page_parent . '?page=' . $this->parent->args['page_slug']; - } else { - $base = 'admin.php?page=' . $this->parent->args['page_slug']; - } - - $url = wp_nonce_url( $base, 'redux-options' ); - - $this->filesystem_init( $url, 'direct', dirname( $file ) ); - - return $this->do_action( $action, $file, $params ); - } - - public function do_action( $action, $file = '', $params = '' ) { - - if ( ! empty ( $params ) ) { - extract( $params ); - } - - global $wp_filesystem; - - if ( ! isset( $params['chmod'] ) || ( isset( $params['chmod'] ) && empty( $params['chmod'] ) ) ) { - if ( defined( 'FS_CHMOD_FILE' ) ) { - $chmod = FS_CHMOD_FILE; - } else { - $chmod = 0644; - } - } - $res = false; - if ( ! isset( $recursive ) ) { - $recursive = false; - } - - //$target_dir = $wp_filesystem->find_folder( dirname( $file ) ); - - // Do unique stuff - if ( $action == 'mkdir' ) { - - if ( defined( 'FS_CHMOD_DIR' ) ) { - $chmod = FS_CHMOD_DIR; - } else { - $chmod = 0755; - } - $res = $wp_filesystem->mkdir( $file ); - if ( ! $res ) { - wp_mkdir_p( $file ); - - $res = file_exists( $file ); - if ( ! $res ) { - mkdir( $file, $chmod, true ); - $res = file_exists( $file ); - } - } - } elseif ( $action == 'rmdir' ) { - $res = $wp_filesystem->rmdir( $file, $recursive ); - } elseif ( $action == 'copy' && ! isset( $this->filesystem->killswitch ) ) { - if ( isset( $this->parent->ftp_form ) && ! empty( $this->parent->ftp_form ) ) { - $res = copy( $file, $destination ); - if ( $res ) { - chmod( $destination, $chmod ); - } - } else { - $res = $wp_filesystem->copy( $file, $destination, $overwrite, $chmod ); - } - } elseif ( $action == 'move' && ! isset( $this->filesystem->killswitch ) ) { - $res = $wp_filesystem->copy( $file, $destination, $overwrite ); - } elseif ( $action == 'delete' ) { - $res = $wp_filesystem->delete( $file, $recursive ); - } elseif ( $action == 'rmdir' ) { - $res = $wp_filesystem->rmdir( $file, $recursive ); - } elseif ( $action == 'dirlist' ) { - if ( ! isset( $include_hidden ) ) { - $include_hidden = true; - } - $res = $wp_filesystem->dirlist( $file, $include_hidden, $recursive ); - } elseif ( $action == 'put_contents' && ! isset( $this->filesystem->killswitch ) ) { - // Write a string to a file - if ( isset( $this->parent->ftp_form ) && ! empty( $this->parent->ftp_form ) ) { - self::load_direct(); - $res = self::$direct->put_contents( $file, $content, $chmod ); - } else { - $res = $wp_filesystem->put_contents( $file, $content, $chmod ); - } - } elseif ( $action == 'chown' ) { - // Changes file owner - if ( isset( $owner ) && ! empty( $owner ) ) { - $res = $wp_filesystem->chmod( $file, $chmod, $recursive ); - } - } elseif ( $action == 'owner' ) { - // Gets file owner - $res = $wp_filesystem->owner( $file ); - } elseif ( $action == 'chmod' ) { - - if ( ! isset( $params['chmod'] ) || ( isset( $params['chmod'] ) && empty( $params['chmod'] ) ) ) { - $chmod = false; - } - - $res = $wp_filesystem->chmod( $file, $chmod, $recursive ); - - } elseif ( $action == 'get_contents' ) { - // Reads entire file into a string - if ( isset( $this->parent->ftp_form ) && ! empty( $this->parent->ftp_form ) ) { - self::load_direct(); - $res = self::$direct->get_contents( $file ); - } else { - $res = $wp_filesystem->get_contents( $file ); - } - } elseif ( $action == 'get_contents_array' ) { - // Reads entire file into an array - $res = $wp_filesystem->get_contents_array( $file ); - } elseif ( $action == 'object' ) { - $res = $wp_filesystem; - } elseif ( $action == 'unzip' ) { - $unzipfile = unzip_file( $file, $destination ); - if ( $unzipfile ) { - $res = true; - } - } - - if ( ! $res ) { - if ($action == 'dirlist') { - if (empty($res) || $res == false || $res == '' ) { - return; - } - - if (is_array($res) && empty($res)) { - return; - } - - if (!is_array($res)) { - if (count(glob("$file*")) == 0) { - return; - } - } - } - - $this->killswitch = true; - $this->parent->admin_notices[] = array( - 'type' => 'error', - 'msg' => '' . __( 'File Permission Issues', 'redux-framework' ) . '
    ' . sprintf( __( 'We were unable to modify required files. Please ensure that %1s has the proper read-write permissions, or modify your wp-config.php file to contain your FTP login credentials as outlined here.', 'redux-framework' ), Redux_Helpers::cleanFilePath( trailingslashit( WP_CONTENT_DIR ) ) . '/uploads/', 'https://codex.wordpress.org/Editing_wp-config.php#WordPress_Upgrade_Constants' ), - 'id' => 'redux-wp-login', - 'dismiss' => false, - ); - //add_action( "redux/page/{$this->parent->args['opt_name']}/form/before", array( - // $this, - // 'ftp_form' - //) ); - } - - return $res; - } - } - - Redux_Filesystem::get_instance(); - } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_functions.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_functions.php deleted file mode 100755 index f006fb60..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_functions.php +++ /dev/null @@ -1,262 +0,0 @@ -args['dev_mode'] ) { - $min = '.min'; - } - - return $min; - } - - /** - * Sets a cookie. - * Do nothing if unit testing. - * - * @since 3.5.4 - * @access public - * @return void - * - * @param string $name The cookie name. - * @param string $value The cookie value. - * @param integer $expire Expiry time. - * @param string $path The cookie path. - * @param string $domain The cookie domain. - * @param boolean $secure HTTPS only. - * @param boolean $httponly Only set cookie on HTTP calls. - */ - public static function setCookie( $name, $value, $expire = 0, $path, $domain = null, $secure = false, $httponly = false ) { - if ( ! defined( 'WP_TESTS_DOMAIN' ) ) { - setcookie( $name, $value, $expire, $path, $domain, $secure, $httponly ); - } - } - - /** - * Parse CSS from output/compiler array - * - * @since 3.2.8 - * @access private - * @return $css CSS string - */ - public static function parseCSS( $cssArray = array(), $style = '', $value = '' ) { - - // Something wrong happened - if ( count( $cssArray ) == 0 ) { - return; - } else { //if ( count( $cssArray ) >= 1 ) { - $css = ''; - - foreach ( $cssArray as $element => $selector ) { - - // The old way - if ( $element === 0 ) { - $css = self::theOldWay( $cssArray, $style ); - - return $css; - } - - // New way continued - $cssStyle = $element . ':' . $value . ';'; - - $css .= $selector . '{' . $cssStyle . '}'; - } - } - - return $css; - } - - private static function theOldWay( $cssArray, $style ) { - $keys = implode( ",", $cssArray ); - $css = $keys . "{" . $style . '}'; - - return $css; - } - - /** - * initWpFilesystem - Initialized the Wordpress filesystem, if it already isn't. - * - * @since 3.2.3 - * @access public - * @return void - */ - public static function initWpFilesystem() { - global $wp_filesystem; - - // Initialize the Wordpress filesystem, no more using file_put_contents function - if ( empty( $wp_filesystem ) ) { - require_once ABSPATH . '/wp-admin/includes/file.php'; - WP_Filesystem(); - } - } - - /** - * verFromGit - Retrives latest Redux version from GIT - * - * @since 3.2.0 - * @access private - * @return string $ver - */ - private static function verFromGit() { - // Get the raw framework.php from github - $gitpage = wp_remote_get( - 'https://raw.github.com/ReduxFramework/redux-framework/master/ReduxCore/framework.php', array( - 'headers' => array( - 'Accept-Encoding' => '' - ), - 'sslverify' => true, - 'timeout' => 300 - ) ); - - // Is the response code the corect one? - if ( ! is_wp_error( $gitpage ) ) { - if ( isset( $gitpage['body'] ) ) { - // Get the page text. - $body = $gitpage['body']; - - // Find version line in framework.php - $needle = 'public static $_version ='; - $pos = strpos( $body, $needle ); - - // If it's there, continue. We don't want errors if $pos = 0. - if ( $pos > 0 ) { - - // Look for the semi-colon at the end of the version line - $semi = strpos( $body, ";", $pos ); - - // Error avoidance. If the semi-colon is there, continue. - if ( $semi > 0 ) { - - // Extract the version line - $text = substr( $body, $pos, ( $semi - $pos ) ); - - // Find the first quote around the veersion number. - $quote = strpos( $body, "'", $pos ); - - // Extract the version number - $ver = substr( $body, $quote, ( $semi - $quote ) ); - - // Strip off quotes. - $ver = str_replace( "'", '', $ver ); - - return $ver; - } - } - } - } - } - - /** - * updateCheck - Checks for updates to Redux Framework - * - * @since 3.2.0 - * @access public - * - * @param string $curVer Current version of Redux Framework - * - * @return void - Admin notice is diaplyed if new version is found - */ - public static function updateCheck( $curVer ) { - - // If no cookie, check for new ver - if ( ! isset( $_COOKIE['redux_update_check'] ) ) { // || 1 == strcmp($_COOKIE['redux_update_check'], self::$_version)) { - // actual ver number from git repo - $ver = self::verFromGit(); - - // hour long cookie. - setcookie( "redux_update_check", $ver, time() + 3600, '/' ); - } else { - - // saved value from cookie. If it's different from current ver - // we can still show the update notice. - $ver = $_COOKIE['redux_update_check']; - } - - // Set up admin notice on new version - //if ( 1 == strcmp( $ver, $curVer ) ) { - if ( version_compare( $ver, $curVer, '>' ) ) { - self::$_parent->admin_notices[] = array( - 'type' => 'updated', - 'msg' => 'A new build of Redux is now available!

    Your version: ' . $curVer . '
    New version: ' . $ver . '

    If you are not a developer, your theme/plugin author shipped with dev_mode on. Contact them to fix it, but in the meantime you can use our dev_mode disabler.

    Get it now  |', - 'id' => 'dev_notice_' . $ver, - 'dismiss' => true, - ); - } - } - - public static function tru( $string, $opt_name ) { - $redux = ReduxFrameworkInstances::get_instance( $opt_name ); - $check = get_user_option( 'r_tru_u_x', array() ); - if ( ! empty( $check ) && ( isset( $check['expires'] ) < time() ) ) { - $check = array(); - } - - if ( isset( $redux->args['dev_mode'] ) && $redux->args['dev_mode'] == true && ! ( isset( $redux->args['forced_dev_mode_off'] ) && $redux->args['forced_dev_mode_off'] == true ) ) { - update_user_option( get_current_user_id(), 'r_tru_u_x', array( - 'id' => '', - 'expires' => 60 * 60 * 24 - ) ); - return apply_filters( 'redux/' . $opt_name . '/aURL_filter', '' ); - } else { - - if ( empty( $check ) ) { - $check = @wp_remote_get( 'http://look.reduxframework.com/status.php?p=' . ReduxFramework::$_is_plugin ); - $check = json_decode( wp_remote_retrieve_body( $check ), true ); - - if ( ! empty( $check ) && isset( $check['id'] ) ) { - update_user_option( get_current_user_id(), 'r_tru_u_x', $check ); - } - } - $check = isset( $check['id'] ) ? $check['id'] : $check; - if ( ! empty( $check ) ) { - return apply_filters( 'redux/' . $opt_name . '/aURL_filter', '' ); - } else { - return ""; - } - } - } - - public static function dat($fname, $opt_name){ - $name = apply_filters('redux/' . $opt_name . '/aDBW_filter', $fname); - - return $name; - } - - public static function bub($fname, $opt_name){ - $name = apply_filters('redux/' . $opt_name . '/aNF_filter', $fname); - - return $name; - } - - public static function yo($fname, $opt_name){ - $name = apply_filters('redux/' . $opt_name . '/aNFM_filter', $fname); - - return $name; - } - } - } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_helpers.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_helpers.php deleted file mode 100644 index 3edff43c..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_helpers.php +++ /dev/null @@ -1,715 +0,0 @@ -sections as $k => $section ) { - if ( ! isset( $section['title'] ) ) { - continue; - } - - if ( isset( $section['fields'] ) && ! empty( $section['fields'] ) ) { - if ( Redux_Helpers::recursive_array_search( $field, $section['fields'] ) ) { - return $k; - continue; - } - } - } - } - - public static function isFieldInUseByType( $fields, $field = array() ) { - foreach ( $field as $name ) { - if ( array_key_exists( $name, $fields ) ) { - return true; - } - } - - return false; - } - - public static function isFieldInUse( $parent, $field ) { - foreach ( $parent->sections as $k => $section ) { - if ( ! isset( $section['title'] ) ) { - continue; - } - - if ( isset( $section['fields'] ) && ! empty( $section['fields'] ) ) { - if ( Redux_Helpers::recursive_array_search( $field, $section['fields'] ) ) { - return true; - continue; - } - } - } - } - - public static function major_version( $v ) { - $version = explode( '.', $v ); - if ( count( $version ) > 1 ) { - return $version[0] . '.' . $version[1]; - } else { - return $v; - } - } - - public static function isLocalHost() { - return false; // ( $_SERVER['REMOTE_ADDR'] === '127.0.0.1' || $_SERVER['REMOTE_ADDR'] === 'localhost' ) ? 0 : 0; - } - - public static function isWpDebug() { - return false; //( defined( 'WP_DEBUG' ) && WP_DEBUG == true ); - } - - public static function getTrackingObject() { - global $wpdb; - - $hash = md5( network_site_url() . '-' . $_SERVER['REMOTE_ADDR'] ); - - global $blog_id, $wpdb; - $pts = array(); - - foreach ( get_post_types( array( 'public' => true ) ) as $pt ) { - $count = wp_count_posts( $pt ); - $pts[ $pt ] = $count->publish; - } - - $comments_count = wp_count_comments(); - $theme_data = wp_get_theme(); - $theme = array( - 'version' => $theme_data->Version, - 'name' => $theme_data->Name, - 'author' => $theme_data->Author, - 'template' => $theme_data->Template, - ); - - if ( ! function_exists( 'get_plugin_data' ) ) { - if ( file_exists( ABSPATH . 'wp-admin/includes/plugin.php' ) ) { - require_once ABSPATH . 'wp-admin/includes/plugin.php'; - } - if ( file_exists( ABSPATH . 'wp-admin/includes/admin.php' ) ) { - require_once ABSPATH . 'wp-admin/includes/admin.php'; - } - } - - $plugins = array(); - foreach ( get_option( 'active_plugins', array() ) as $plugin_path ) { - $plugin_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin_path ); - - $slug = str_replace( '/' . basename( $plugin_path ), '', $plugin_path ); - $plugins[ $slug ] = array( - 'version' => $plugin_info['Version'], - 'name' => $plugin_info['Name'], - 'plugin_uri' => $plugin_info['PluginURI'], - 'author' => $plugin_info['AuthorName'], - 'author_uri' => $plugin_info['AuthorURI'], - ); - } - if ( is_multisite() ) { - foreach ( get_option( 'active_sitewide_plugins', array() ) as $plugin_path ) { - $plugin_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin_path ); - $slug = str_replace( '/' . basename( $plugin_path ), '', $plugin_path ); - $plugins[ $slug ] = array( - 'version' => $plugin_info['Version'], - 'name' => $plugin_info['Name'], - 'plugin_uri' => $plugin_info['PluginURI'], - 'author' => $plugin_info['AuthorName'], - 'author_uri' => $plugin_info['AuthorURI'], - ); - } - } - - - $version = explode( '.', PHP_VERSION ); - $version = array( - 'major' => $version[0], - 'minor' => $version[0] . '.' . $version[1], - 'release' => PHP_VERSION - ); - - $user_query = new WP_User_Query( array( 'blog_id' => $blog_id, 'count_total' => true, ) ); - $comments_query = new WP_Comment_Query(); - - $data = array( - '_id' => $hash, - 'localhost' => ( $_SERVER['REMOTE_ADDR'] === '127.0.0.1' ) ? 1 : 0, - 'php' => $version, - 'site' => array( - 'hash' => $hash, - 'version' => get_bloginfo( 'version' ), - 'multisite' => is_multisite(), - 'users' => $user_query->get_total(), - 'lang' => get_locale(), - 'wp_debug' => ( defined( 'WP_DEBUG' ) ? WP_DEBUG ? true : false : false ), - 'memory' => WP_MEMORY_LIMIT, - ), - 'pts' => $pts, - 'comments' => array( - 'total' => $comments_count->total_comments, - 'approved' => $comments_count->approved, - 'spam' => $comments_count->spam, - 'pings' => $comments_query->query( array( 'count' => true, 'type' => 'pingback' ) ), - ), - 'options' => apply_filters( 'redux/tracking/options', array() ), - 'theme' => $theme, - 'redux' => array( - 'mode' => ReduxFramework::$_is_plugin ? 'plugin' : 'theme', - 'version' => ReduxFramework::$_version, - 'demo_mode' => get_option( 'ReduxFrameworkPlugin' ), - ), - 'developer' => apply_filters( 'redux/tracking/developer', array() ), - 'plugins' => $plugins, - ); - - $parts = explode( ' ', $_SERVER['SERVER_SOFTWARE'] ); - $software = array(); - foreach ( $parts as $part ) { - if ( $part[0] == "(" ) { - continue; - } - if ( strpos( $part, '/' ) !== false ) { - $chunk = explode( "/", $part ); - $software[ strtolower( $chunk[0] ) ] = $chunk[1]; - } - } - $software['full'] = $_SERVER['SERVER_SOFTWARE']; - $data['environment'] = $software; - $data['environment']['mysql'] = $wpdb->db_version(); -// if ( function_exists( 'mysqli_get_server_info' ) ) { -// $link = mysqli_connect() or die( "Error " . mysqli_error( $link ) ); -// $data['environment']['mysql'] = mysqli_get_server_info( $link ); -// } else if ( class_exists( 'PDO' ) && method_exists( 'PDO', 'getAttribute' ) ) { -// $data['environment']['mysql'] = PDO::getAttribute( PDO::ATTR_SERVER_VERSION ); -// } else { -// $data['environment']['mysql'] = mysql_get_server_info(); -// } - - if ( empty( $data['developer'] ) ) { - unset( $data['developer'] ); - } - - return $data; - } - - public static function trackingObject() { - - $data = wp_remote_post( - 'http://verify.redux.io', - array( - 'body' => array( - 'hash' => $_GET['action'], - 'site' => esc_url( home_url( '/' ) ), - ) - ) - ); - - $data['body'] = urldecode( $data['body'] ); - - if ( ! isset( $_GET['code'] ) || $data['body'] != $_GET['code'] ) { - die(); - } - - return Redux_Helpers::getTrackingObject(); - } - - public static function isParentTheme( $file ) { - $file = self::cleanFilePath( $file ); - $dir = self::cleanFilePath( get_template_directory() ); - - $file = str_replace( '//', '/', $file ); - $dir = str_replace( '//', '/', $dir ); - - if ( strpos( $file, $dir ) !== false ) { - return true; - } - - return false; - } - - public static function isChildTheme( $file ) { - $file = self::cleanFilePath( $file ); - $dir = self::cleanFilePath( get_stylesheet_directory() ); - - $file = str_replace( '//', '/', $file ); - $dir = str_replace( '//', '/', $dir ); - - if ( strpos( $file, $dir ) !== false ) { - return true; - } - - return false; - } - - private static function reduxAsPlugin() { - return ReduxFramework::$_as_plugin; - } - - public static function isTheme( $file ) { - - if ( true == self::isChildTheme( $file ) || true == self::isParentTheme( $file ) ) { - return true; - } - - return false; - } - - public static function array_in_array( $needle, $haystack ) { - //Make sure $needle is an array for foreach - if ( ! is_array( $needle ) ) { - $needle = array( $needle ); - } - //For each value in $needle, return TRUE if in $haystack - foreach ( $needle as $pin ) //echo 'needle' . $pin; - { - if ( in_array( $pin, $haystack ) ) { - return true; - } - } - - //Return FALSE if none of the values from $needle are found in $haystack - return false; - } - - public static function recursive_array_search( $needle, $haystack ) { - foreach ( $haystack as $key => $value ) { - if ( $needle === $value || ( is_array( $value ) && self::recursive_array_search( $needle, $value ) !== false ) ) { - return true; - } - } - - return false; - } - - /** - * Take a path and return it clean - * - * @param string $path - * - * @since 3.1.7 - */ - public static function cleanFilePath( $path ) { - $path = str_replace( '', '', str_replace( array( "\\", "\\\\" ), '/', $path ) ); - - if ( $path[ strlen( $path ) - 1 ] === '/' ) { - $path = rtrim( $path, '/' ); - } - - return $path; - } - - /** - * Take a path and delete it - * - * @param string $path - * - * @since 3.3.3 - */ - public static function rmdir( $dir ) { - if ( is_dir( $dir ) ) { - $objects = scandir( $dir ); - foreach ( $objects as $object ) { - if ( $object != "." && $object != ".." ) { - if ( filetype( $dir . "/" . $object ) == "dir" ) { - rrmdir( $dir . "/" . $object ); - } else { - unlink( $dir . "/" . $object ); - } - } - } - reset( $objects ); - rmdir( $dir ); - } - } - - /** - * Field Render Function. - * Takes the color hex value and converts to a rgba. - * - * @since ReduxFramework 3.0.4 - */ - public static function hex2rgba( $hex, $alpha = '' ) { - $hex = str_replace( "#", "", $hex ); - if ( strlen( $hex ) == 3 ) { - $r = hexdec( substr( $hex, 0, 1 ) . substr( $hex, 0, 1 ) ); - $g = hexdec( substr( $hex, 1, 1 ) . substr( $hex, 1, 1 ) ); - $b = hexdec( substr( $hex, 2, 1 ) . substr( $hex, 2, 1 ) ); - } else { - $r = hexdec( substr( $hex, 0, 2 ) ); - $g = hexdec( substr( $hex, 2, 2 ) ); - $b = hexdec( substr( $hex, 4, 2 ) ); - } - $rgb = $r . ',' . $g . ',' . $b; - - if ( '' == $alpha ) { - return $rgb; - } else { - $alpha = floatval( $alpha ); - - return 'rgba(' . $rgb . ',' . $alpha . ')'; - } - } - - public static function makeBoolStr( $var ) { - if ( $var == false || $var == 'false' || $var == 0 || $var == '0' || $var == '' || empty( $var ) ) { - return 'false'; - } else { - return 'true'; - } - } - - public static function localize( $localize ) { - $redux = ReduxFrameworkInstances::get_instance( $localize['args']['opt_name'] ); - $nonce = wp_create_nonce( 'redux-ads-nonce' ); - $base = admin_url( 'admin-ajax.php' ) . '?action=redux_p&nonce=' . $nonce . '&url='; - $localize['rAds'] = Redux_Helpers::rURL_fix( $base, $redux->args['opt_name'] ); - - return $localize; - } - - public static function compileSystemStatus( $json_output = false, $remote_checks = false ) { - global $wpdb; - - $sysinfo = array(); - - $sysinfo['home_url'] = home_url(); - $sysinfo['site_url'] = site_url(); - $sysinfo['redux_ver'] = esc_html( ReduxFramework::$_version ); - $sysinfo['redux_data_dir'] = ReduxFramework::$_upload_dir; - $f = 'fo' . 'pen'; - // Only is a file-write check - $sysinfo['redux_data_writeable'] = self::makeBoolStr( @$f( ReduxFramework::$_upload_dir . 'test-log.log', 'a' ) ); - $sysinfo['wp_content_url'] = WP_CONTENT_URL; - $sysinfo['wp_ver'] = get_bloginfo( 'version' ); - $sysinfo['wp_multisite'] = is_multisite(); - $sysinfo['permalink_structure'] = get_option( 'permalink_structure' ) ? get_option( 'permalink_structure' ) : 'Default'; - $sysinfo['front_page_display'] = get_option( 'show_on_front' ); - if ( $sysinfo['front_page_display'] == 'page' ) { - $front_page_id = get_option( 'page_on_front' ); - $blog_page_id = get_option( 'page_for_posts' ); - - $sysinfo['front_page'] = $front_page_id != 0 ? get_the_title( $front_page_id ) . ' (#' . $front_page_id . ')' : 'Unset'; - $sysinfo['posts_page'] = $blog_page_id != 0 ? get_the_title( $blog_page_id ) . ' (#' . $blog_page_id . ')' : 'Unset'; - } - - $sysinfo['wp_mem_limit']['raw'] = self::let_to_num( WP_MEMORY_LIMIT ); - $sysinfo['wp_mem_limit']['size'] = size_format( $sysinfo['wp_mem_limit']['raw'] ); - - $sysinfo['db_table_prefix'] = 'Length: ' . strlen( $wpdb->prefix ) . ' - Status: ' . ( strlen( $wpdb->prefix ) > 16 ? 'ERROR: Too long' : 'Acceptable' ); - - $sysinfo['wp_debug'] = 'false'; - if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { - $sysinfo['wp_debug'] = 'true'; - } - - $sysinfo['wp_lang'] = get_locale(); - - if ( ! class_exists( 'Browser' ) ) { - require_once ReduxFramework::$_dir . 'inc/browser.php'; - } - - $browser = new Browser(); - - $sysinfo['browser'] = array( - 'agent' => $browser->getUserAgent(), - 'browser' => $browser->getBrowser(), - 'version' => $browser->getVersion(), - 'platform' => $browser->getPlatform(), - //'mobile' => $browser->isMobile() ? 'true' : 'false', - ); - - $sysinfo['server_info'] = esc_html( $_SERVER['SERVER_SOFTWARE'] ); - $sysinfo['localhost'] = self::makeBoolStr( self::isLocalHost() ); - $sysinfo['php_ver'] = function_exists( 'phpversion' ) ? esc_html( phpversion() ) : 'phpversion() function does not exist.'; - $sysinfo['abspath'] = ABSPATH; - - if ( function_exists( 'ini_get' ) ) { - $sysinfo['php_mem_limit'] = size_format( self::let_to_num( ini_get( 'memory_limit' ) ) ); - $sysinfo['php_post_max_size'] = size_format( self::let_to_num( ini_get( 'post_max_size' ) ) ); - $sysinfo['php_time_limit'] = ini_get( 'max_execution_time' ); - $sysinfo['php_max_input_var'] = ini_get( 'max_input_vars' ); - $sysinfo['php_display_errors'] = self::makeBoolStr( ini_get( 'display_errors' ) ); - } - - $sysinfo['suhosin_installed'] = extension_loaded( 'suhosin' ); - $sysinfo['mysql_ver'] = $wpdb->db_version(); - $sysinfo['max_upload_size'] = size_format( wp_max_upload_size() ); - - $sysinfo['def_tz_is_utc'] = 'true'; - if ( date_default_timezone_get() !== 'UTC' ) { - $sysinfo['def_tz_is_utc'] = 'false'; - } - - $sysinfo['fsockopen_curl'] = 'false'; - if ( function_exists( 'fsockopen' ) || function_exists( 'curl_init' ) ) { - $sysinfo['fsockopen_curl'] = 'true'; - } - - //$sysinfo['soap_client'] = 'false'; - //if ( class_exists( 'SoapClient' ) ) { - // $sysinfo['soap_client'] = 'true'; - //} - // - //$sysinfo['dom_document'] = 'false'; - //if ( class_exists( 'DOMDocument' ) ) { - // $sysinfo['dom_document'] = 'true'; - //} - - //$sysinfo['gzip'] = 'false'; - //if ( is_callable( 'gzopen' ) ) { - // $sysinfo['gzip'] = 'true'; - //} - - if ( $remote_checks == true ) { - $response = wp_remote_post( 'https://www.paypal.com/cgi-bin/webscr', array( - 'sslverify' => false, - 'timeout' => 60, - 'user-agent' => 'ReduxFramework/' . ReduxFramework::$_version, - 'body' => array( - 'cmd' => '_notify-validate' - ) - ) ); - - if ( ! is_wp_error( $response ) && $response['response']['code'] >= 200 && $response['response']['code'] < 300 ) { - $sysinfo['wp_remote_post'] = 'true'; - $sysinfo['wp_remote_post_error'] = ''; - } else { - $sysinfo['wp_remote_post'] = 'false'; - $sysinfo['wp_remote_post_error'] = $response->get_error_message(); - } - - $response = @wp_remote_get( 'http://reduxframework.com/wp-admin/admin-ajax.php?action=get_redux_extensions' ); - - if ( ! is_wp_error( $response ) && $response['response']['code'] >= 200 && $response['response']['code'] < 300 ) { - $sysinfo['wp_remote_get'] = 'true'; - $sysinfo['wp_remote_get_error'] = ''; - } else { - $sysinfo['wp_remote_get'] = 'false'; - $sysinfo['wp_remote_get_error'] = $response->get_error_message(); - } - } - - $active_plugins = (array) get_option( 'active_plugins', array() ); - - if ( is_multisite() ) { - $active_plugins = array_merge( $active_plugins, get_site_option( 'active_sitewide_plugins', array() ) ); - } - - $sysinfo['plugins'] = array(); - - foreach ( $active_plugins as $plugin ) { - $plugin_data = @get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); - $plugin_name = esc_html( $plugin_data['Name'] ); - - $sysinfo['plugins'][ $plugin_name ] = $plugin_data; - } - - $redux = ReduxFrameworkInstances::get_all_instances(); - - $sysinfo['redux_instances'] = array(); - - if ( ! empty( $redux ) && is_array( $redux ) ) { - foreach ( $redux as $inst => $data ) { - Redux::init( $inst ); - - $sysinfo['redux_instances'][ $inst ]['args'] = $data->args; - $sysinfo['redux_instances'][ $inst ]['sections'] = $data->sections; - foreach ( $sysinfo['redux_instances'][ $inst ]['sections'] as $sKey => $section ) { - if ( isset( $section['fields'] ) && is_array( $section['fields'] ) ) { - foreach ( $section['fields'] as $fKey => $field ) { - if ( isset( $field['validate_callback'] ) ) { - unset( $sysinfo['redux_instances'][ $inst ]['sections'][ $sKey ]['fields'][ $fKey ]['validate_callback'] ); - } - if ( $field['type'] == "js_button" ) { - if ( isset( $field['script'] ) && isset( $field['script']['ver'] ) ) { - unset( $sysinfo['redux_instances'][ $inst ]['sections'][ $sKey ]['fields'][ $fKey ]['script']['ver'] ); - } - } - - } - } - } - - $sysinfo['redux_instances'][ $inst ]['extensions'] = Redux::getExtensions( $inst ); - - if ( isset( $data->extensions['metaboxes'] ) ) { - $data->extensions['metaboxes']->init(); - $sysinfo['redux_instances'][ $inst ]['metaboxes'] = $data->extensions['metaboxes']->boxes; - } - - if ( isset( $data->args['templates_path'] ) && $data->args['templates_path'] != '' ) { - $sysinfo['redux_instances'][ $inst ]['templates'] = self::getReduxTemplates( $data->args['templates_path'] ); - } - } - } - - $active_theme = wp_get_theme(); - - $sysinfo['theme']['name'] = $active_theme->Name; - $sysinfo['theme']['version'] = $active_theme->Version; - $sysinfo['theme']['author_uri'] = $active_theme->{'Author URI'}; - $sysinfo['theme']['is_child'] = self::makeBoolStr( is_child_theme() ); - - if ( is_child_theme() ) { - $parent_theme = wp_get_theme( $active_theme->Template ); - - $sysinfo['theme']['parent_name'] = $parent_theme->Name; - $sysinfo['theme']['parent_version'] = $parent_theme->Version; - $sysinfo['theme']['parent_author_uri'] = $parent_theme->{'Author URI'}; - } - - //if ( $json_output ) { - // $sysinfo = json_encode( $sysinfo ); - //} - - //print_r($sysinfo); - //exit(); - - return $sysinfo; - } - - private static function getReduxTemplates( $custom_template_path ) { - $filesystem = Redux_Filesystem::get_instance(); - $template_paths = array( 'ReduxFramework' => ReduxFramework::$_dir . 'templates/panel' ); - $scanned_files = array(); - $found_files = array(); - $outdated_templates = false; - - foreach ( $template_paths as $plugin_name => $template_path ) { - $scanned_files[ $plugin_name ] = self::scan_template_files( $template_path ); - } - - foreach ( $scanned_files as $plugin_name => $files ) { - foreach ( $files as $file ) { - if ( file_exists( $custom_template_path . '/' . $file ) ) { - $theme_file = $custom_template_path . '/' . $file; - } else { - $theme_file = false; - } - - if ( $theme_file ) { - $core_version = self::get_template_version( ReduxFramework::$_dir . 'templates/panel/' . $file ); - $theme_version = self::get_template_version( $theme_file ); - - if ( $core_version && ( empty( $theme_version ) || version_compare( $theme_version, $core_version, '<' ) ) ) { - if ( ! $outdated_templates ) { - $outdated_templates = true; - } - - $found_files[ $plugin_name ][] = sprintf( __( '%s version %s is out of date. The core version is %s', 'redux-framework' ), str_replace( WP_CONTENT_DIR . '/themes/', '', $theme_file ), $theme_version ? $theme_version : '-', $core_version ); - } else { - $found_files[ $plugin_name ][] = sprintf( '%s', str_replace( WP_CONTENT_DIR . '/themes/', '', $theme_file ) ); - } - } - } - } - - return $found_files; - } - - public static function rURL_fix( $base, $opt_name ) { - $url = $base . urlencode( 'http://ads.reduxframework.com/api/index.php?js&g&1&v=2' ) . '&proxy=' . urlencode( $base ) . ''; - - return Redux_Functions::tru( $url, $opt_name ); - } - - private static function scan_template_files( $template_path ) { - $files = scandir( $template_path ); - $result = array(); - - if ( $files ) { - foreach ( $files as $key => $value ) { - if ( ! in_array( $value, array( ".", ".." ) ) ) { - if ( is_dir( $template_path . DIRECTORY_SEPARATOR . $value ) ) { - $sub_files = redux_scan_template_files( $template_path . DIRECTORY_SEPARATOR . $value ); - foreach ( $sub_files as $sub_file ) { - $result[] = $value . DIRECTORY_SEPARATOR . $sub_file; - } - } else { - $result[] = $value; - } - } - } - } - - return $result; - } - - public static function get_template_version( $file ) { - $filesystem = Redux_Filesystem::get_instance(); - // Avoid notices if file does not exist - if ( ! file_exists( $file ) ) { - return ''; - } - // - //// We don't need to write to the file, so just open for reading. - //$fp = fopen( $file, 'r' ); - // - //// Pull only the first 8kiB of the file in. - //$file_data = fread( $fp, 8192 ); - // - //// PHP will close file handle, but we are good citizens. - //fclose( $fp ); - // - // Make sure we catch CR-only line endings. - - $data = get_file_data( $file, array( 'version' ), 'plugin' ); - if ( ! empty( $data[0] ) ) { - return $data[0]; - } else { - $file_data = $filesystem->execute( 'get_contents', $file ); - - $file_data = str_replace( "\r", "\n", $file_data ); - $version = ''; - - if ( preg_match( '/^[ \t\/*#@]*' . preg_quote( '@version', '/' ) . '(.*)$/mi', $file_data, $match ) && $match[1] ) { - $version = _cleanup_header_comment( $match[1] ); - } - - return $version; - } - } - - private static function let_to_num( $size ) { - $l = substr( $size, - 1 ); - $ret = substr( $size, 0, - 1 ); - - switch ( strtoupper( $l ) ) { - case 'P': - $ret *= 1024; - case 'T': - $ret *= 1024; - case 'G': - $ret *= 1024; - case 'M': - $ret *= 1024; - case 'K': - $ret *= 1024; - } - - return $ret; - } - - public static function get_extension_dir( $dir ) { - return trailingslashit( wp_normalize_path( dirname( $dir ) ) ); - } - - public static function get_extension_url( $dir ) { - $ext_dir = Redux_Helpers::get_extension_dir( $dir ); - $ext_url = str_replace( wp_normalize_path( WP_CONTENT_DIR ), WP_CONTENT_URL, $ext_dir ); - - return $ext_url; - } - } - } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_instances.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_instances.php deleted file mode 100755 index bffcbea1..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.redux_instances.php +++ /dev/null @@ -1,166 +0,0 @@ -options = get_option( 'redux-framework-tracking' ); - $this->options['dev_mode'] = false; - - if ( ! isset( $this->options['hash'] ) || ! $this->options['hash'] || empty( $this->options['hash'] ) ) { - $this->options['hash'] = md5( network_site_url() . '-' . $_SERVER['REMOTE_ADDR'] ); - update_option( 'redux-framework-tracking', $this->options ); - } - - if ( isset( $_GET['redux_framework_disable_tracking'] ) && ! empty( $_GET['redux_framework_disable_tracking'] ) ) { - $this->options['allow_tracking'] = false; - update_option( 'redux-framework-tracking', $this->options ); - } - - if ( isset( $_GET['redux_framework_enable_tracking'] ) && ! empty( $_GET['redux_framework_enable_tracking'] ) ) { - $this->options['allow_tracking'] = true; - update_option( 'redux-framework-tracking', $this->options ); - } - - header( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" ); - header( "Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . "GMT" ); - header( 'Expires: Sat, 26 Jul 1997 05:00:00 GMT' ); - header( 'Cache-Control: no-store, no-cache, must-revalidate' ); - header( 'Cache-Control: post-check=0, pre-check=0', false ); - header( 'Pragma: no-cache' ); - $instances = ReduxFrameworkInstances::get_all_instances(); - - if ( isset( $_REQUEST['i'] ) && ! empty( $_REQUEST['i'] ) ) { - if ( is_array( $instances ) && ! empty( $instances ) ) { - foreach ( $instances as $opt_name => $data ) { - if ( md5( $opt_name . '-debug' ) == $_REQUEST['i'] ) { - $array = $instances[ $opt_name ]; - } - if ($data->args['dev_mode']) { - $this->options['dev_mode'] = $data->args['dev_mode']; - } - } - } - if ( isset( $array ) ) { - if ( isset( $array->extensions ) && is_array( $array->extensions ) && ! empty( $array->extensions ) ) { - foreach ( $array->extensions as $key => $extension ) { - if ( isset( $extension->$version ) ) { - $array->extensions[ $key ] = $extension->$version; - } else { - $array->extensions[ $key ] = true; - } - } - } - - if ( isset( $array->import_export ) ) { - unset( $array->import_export ); - } - - if ( isset( $array->debug ) ) { - unset( $array->debug ); - } - } else { - die(); - } - - } else { - $array = Redux_Helpers::trackingObject(); - if ( is_array( $instances ) && ! empty( $instances ) ) { - $array['instances'] = array(); - foreach ( $instances as $opt_name => $data ) { - $array['instances'][] = $opt_name; - } - } - $array['key'] = md5( AUTH_KEY . SECURE_AUTH_KEY ); - } - - echo @json_encode( $array, true ); - die(); - } - - function capture( $ReduxFramework ) { - $this->store( $ReduxFramework ); - } - - private function store( $ReduxFramework ) { - if ( $ReduxFramework instanceof ReduxFramework ) { - $key = $ReduxFramework->args['opt_name']; - self::$instances[ $key ] = $ReduxFramework; - } - } - } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.thirdparty.fixes.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/class.thirdparty.fixes.php deleted file mode 100755 index b3575f07..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/class.thirdparty.fixes.php +++ /dev/null @@ -1,10 +0,0 @@ -h3.accordion-section-title,.admin-color-fresh #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover,.admin-color-fresh #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title,.admin-color-fresh #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus,.admin-color-fresh #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title,.admin-color-fresh #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover,.admin-color-fresh #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title,.admin-color-fresh #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus{color:#fff;background:#0073aa}.admin-color-fresh #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title:after,.admin-color-fresh #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover:after,.admin-color-fresh #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title:after,.admin-color-fresh #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus:after,.admin-color-fresh #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title:after,.admin-color-fresh #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover:after,.admin-color-fresh #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title:after,.admin-color-fresh #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus:after{color:#fff}.admin-color-fresh #customize-theme-controls .control-section.control-panel.control-panel-redux>.accordion-section-title:after{background:transparent;border-left:none}.admin-color-fresh #customize-theme-controls .control-panel-redux .customize-panel-back:hover,.admin-color-fresh #customize-theme-controls .redux-section .customize-section-back:hover{background:#0073aa;color:#fff}.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title,.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover,.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title,.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus{color:#fff;background:#a3b745}.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title:after,.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover:after,.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title:after,.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus:after,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title:after,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover:after,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title:after,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus:after{color:#fff}.admin-color-ectoplasm #customize-theme-controls .control-section.control-panel.control-panel-redux>.accordion-section-title:after{background:transparent;border-left:none}.admin-color-ectoplasm #customize-theme-controls .control-panel-redux .customize-panel-back:hover,.admin-color-ectoplasm #customize-theme-controls .redux-section .customize-section-back:hover{background:#a3b745;color:#fff}.admin-color-light #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title,.admin-color-light #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover,.admin-color-light #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title,.admin-color-light #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus,.admin-color-light #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title,.admin-color-light #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover,.admin-color-light #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title,.admin-color-light #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus{color:#fff;background:#888}.admin-color-light #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title:after,.admin-color-light #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover:after,.admin-color-light #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title:after,.admin-color-light #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus:after,.admin-color-light #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title:after,.admin-color-light #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover:after,.admin-color-light #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title:after,.admin-color-light #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus:after{color:#fff}.admin-color-light #customize-theme-controls .control-section.control-panel.control-panel-redux>.accordion-section-title:after{background:transparent;border-left:none}.admin-color-light #customize-theme-controls .control-panel-redux .customize-panel-back:hover,.admin-color-light #customize-theme-controls .redux-section .customize-section-back:hover{background:#888;color:#fff}.admin-color-blue #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title,.admin-color-blue #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover,.admin-color-blue #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title,.admin-color-blue #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus,.admin-color-blue #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title,.admin-color-blue #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover,.admin-color-blue #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title,.admin-color-blue #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus{color:#fff;background:#096484}.admin-color-blue #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title:after,.admin-color-blue #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover:after,.admin-color-blue #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title:after,.admin-color-blue #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus:after,.admin-color-blue #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title:after,.admin-color-blue #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover:after,.admin-color-blue #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title:after,.admin-color-blue #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus:after{color:#fff}.admin-color-blue #customize-theme-controls .control-section.control-panel.control-panel-redux>.accordion-section-title:after{background:transparent;border-left:none}.admin-color-blue #customize-theme-controls .control-panel-redux .customize-panel-back:hover,.admin-color-blue #customize-theme-controls .redux-section .customize-section-back:hover{background:#096484;color:#fff}.admin-color-coffee #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title,.admin-color-coffee #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover,.admin-color-coffee #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title,.admin-color-coffee #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus,.admin-color-coffee #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title,.admin-color-coffee #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover,.admin-color-coffee #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title,.admin-color-coffee #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus{color:#fff;background:#c7a589}.admin-color-coffee #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title:after,.admin-color-coffee #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover:after,.admin-color-coffee #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title:after,.admin-color-coffee #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus:after,.admin-color-coffee #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title:after,.admin-color-coffee #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover:after,.admin-color-coffee #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title:after,.admin-color-coffee #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus:after{color:#fff}.admin-color-coffee #customize-theme-controls .control-section.control-panel.control-panel-redux>.accordion-section-title:after{background:transparent;border-left:none}.admin-color-coffee #customize-theme-controls .control-panel-redux .customize-panel-back:hover,.admin-color-coffee #customize-theme-controls .redux-section .customize-section-back:hover{background:#c7a589;color:#fff}.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title,.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover,.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title,.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus{color:#fff;background:#523f6d}.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title:after,.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover:after,.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title:after,.admin-color-ectoplasm #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus:after,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title:after,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover:after,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title:after,.admin-color-ectoplasm #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus:after{color:#fff}.admin-color-ectoplasm #customize-theme-controls .control-section.control-panel.control-panel-redux>.accordion-section-title:after{background:transparent;border-left:none}.admin-color-ectoplasm #customize-theme-controls .control-panel-redux .customize-panel-back:hover,.admin-color-ectoplasm #customize-theme-controls .redux-section .customize-section-back:hover{background:#523f6d;color:#fff}.admin-color-midnight #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title,.admin-color-midnight #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover,.admin-color-midnight #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title,.admin-color-midnight #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus,.admin-color-midnight #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title,.admin-color-midnight #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover,.admin-color-midnight #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title,.admin-color-midnight #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus{color:#fff;background:#e14d43}.admin-color-midnight #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title:after,.admin-color-midnight #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover:after,.admin-color-midnight #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title:after,.admin-color-midnight #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus:after,.admin-color-midnight #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title:after,.admin-color-midnight #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover:after,.admin-color-midnight #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title:after,.admin-color-midnight #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus:after{color:#fff}.admin-color-midnight #customize-theme-controls .control-section.control-panel.control-panel-redux>.accordion-section-title:after{background:transparent;border-left:none}.admin-color-midnight #customize-theme-controls .control-panel-redux .customize-panel-back:hover,.admin-color-midnight #customize-theme-controls .redux-section .customize-section-back:hover{background:#e14d43;color:#fff}.admin-color-ocean #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title,.admin-color-ocean #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover,.admin-color-ocean #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title,.admin-color-ocean #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus,.admin-color-ocean #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title,.admin-color-ocean #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover,.admin-color-ocean #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title,.admin-color-ocean #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus{color:#fff;background:#9ebaa0}.admin-color-ocean #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title:after,.admin-color-ocean #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover:after,.admin-color-ocean #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title:after,.admin-color-ocean #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus:after,.admin-color-ocean #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title:after,.admin-color-ocean #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover:after,.admin-color-ocean #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title:after,.admin-color-ocean #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus:after{color:#fff}.admin-color-ocean #customize-theme-controls .control-section.control-panel.control-panel-redux>.accordion-section-title:after{background:transparent;border-left:none}.admin-color-ocean #customize-theme-controls .control-panel-redux .customize-panel-back:hover,.admin-color-ocean #customize-theme-controls .redux-section .customize-section-back:hover{background:#9ebaa0;color:#fff}.admin-color-sunrise #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title,.admin-color-sunrise #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover,.admin-color-sunrise #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title,.admin-color-sunrise #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus,.admin-color-sunrise #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title,.admin-color-sunrise #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover,.admin-color-sunrise #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title,.admin-color-sunrise #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus{color:#fff;background:#cf4944}.admin-color-sunrise #customize-theme-controls .control-section.control-section-redux:hover>h3.accordion-section-title:after,.admin-color-sunrise #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:hover:after,.admin-color-sunrise #customize-theme-controls .control-section.control-section-redux.open h3.accordion-section-title:after,.admin-color-sunrise #customize-theme-controls .control-section.control-section-redux h3.accordion-section-title:focus:after,.admin-color-sunrise #customize-theme-controls .control-panel.control-panel-redux:hover>h3.accordion-section-title:after,.admin-color-sunrise #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:hover:after,.admin-color-sunrise #customize-theme-controls .control-panel.control-panel-redux.open h3.accordion-section-title:after,.admin-color-sunrise #customize-theme-controls .control-panel.control-panel-redux h3.accordion-section-title:focus:after{color:#fff}.admin-color-sunrise #customize-theme-controls .control-section.control-panel.control-panel-redux>.accordion-section-title:after{background:transparent;border-left:none}.admin-color-sunrise #customize-theme-controls .control-panel-redux .customize-panel-back:hover,.admin-color-sunrise #customize-theme-controls .redux-section .customize-section-back:hover{background:#cf4944;color:#fff} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.js deleted file mode 100755 index 824a42aa..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.js +++ /dev/null @@ -1,375 +0,0 @@ -/* global redux, setting */ - -/*! - SerializeJSON jQuery plugin. - https://github.com/marioizquierdo/jquery.serializeJSON - version 2.6.0 (Apr, 2015) - - Copyright (c) 2012, 2015 Mario Izquierdo - Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) - and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. - */ -(function( $ ) { - "use strict"; - - // jQuery('form').serializeJSON() - $.fn.serializeJSON = function( options ) { - var serializedObject, formAsArray, keys, type, value, _ref, f, opts; - f = $.serializeJSON; - opts = f.setupOpts( options ); // calculate values for options {parseNumbers, parseBoolens, parseNulls} - formAsArray = this.serializeArray(); // array of objects {name, value} - f.readCheckboxUncheckedValues( formAsArray, this, opts ); // add {name, value} of unchecked checkboxes if needed - - serializedObject = {}; - $.each( - formAsArray, function( i, input ) { - keys = f.splitInputNameIntoKeysArray( input.name, opts ); - type = keys.pop(); // the last element is always the type ("string" by default) - if ( type !== 'skip' ) { // easy way to skip a value - value = f.parseValue( input.value, type, opts ); // string, number, boolean or null - if ( opts.parseWithFunction && type === '_' ) value = opts.parseWithFunction( value, input.name ); // allow for custom parsing - f.deepSet( serializedObject, keys, value, opts ); - } - } - ); - return serializedObject; - }; - - // Use $.serializeJSON as namespace for the auxiliar functions - // and to define defaults - $.serializeJSON = { - - defaultOptions: { - checkboxUncheckedValue: undefined, // to include that value for unchecked checkboxes (instead of ignoring them) - - parseNumbers: false, // convert values like "1", "-2.33" to 1, -2.33 - parseBooleans: false, // convert "true", "false" to true, false - parseNulls: false, // convert "null" to null - parseAll: false, // all of the above - parseWithFunction: null, // to use custom parser, a function like: function(val){ return parsed_val; } - - customTypes: {}, // override defaultTypes - defaultTypes: { - string: function( str ) { - return String( str ); - }, - number: function( str ) { - return Number( str ); - }, - boolean: function( str ) { - return (["false", "null", "undefined", "", "0"].indexOf( str ) === -1); - }, - null: function( str ) { - return (["false", "null", "undefined", "", "0"].indexOf( str ) !== -1) ? null : str; - }, - array: function( str ) { - return JSON.parse( str ); - }, - object: function( str ) { - return JSON.parse( str ); - }, - auto: function( str ) { - return $.serializeJSON.parseValue( - str, null, {parseNumbers: true, parseBooleans: true, parseNulls: true} - ); - } // try again with something like "parseAll" - }, - - useIntKeysAsArrayIndex: false, // name="foo[2]" value="v" => {foo: [null, null, "v"]}, instead of {foo: ["2": "v"]} - }, - - // Merge option defaults into the options - setupOpts: function( options ) { - var opt, validOpts, defaultOptions, optWithDefault, parseAll, f; - f = $.serializeJSON; - - if ( options === null || options === undefined ) options = {}; // options ||= {} - defaultOptions = f.defaultOptions || {}; // defaultOptions - - // Make sure that the user didn't misspell an option - validOpts = ['checkboxUncheckedValue', 'parseNumbers', 'parseBooleans', 'parseNulls', 'parseAll', 'parseWithFunction', 'customTypes', 'defaultTypes', 'useIntKeysAsArrayIndex']; // re-define because the user may override the defaultOptions - for ( opt in options ) { - if ( validOpts.indexOf( opt ) === -1 ) { - throw new Error( "serializeJSON ERROR: invalid option '" + opt + "'. Please use one of " + validOpts.join( ', ' ) ); - } - } - - // Helper to get the default value for this option if none is specified by the user - optWithDefault = function( key ) { - return (options[key] !== false) && (options[key] !== '') && (options[key] || defaultOptions[key]); - }; - - // Return computed options (opts to be used in the rest of the script) - parseAll = optWithDefault( 'parseAll' ); - return { - checkboxUncheckedValue: optWithDefault( 'checkboxUncheckedValue' ), - - parseNumbers: parseAll || optWithDefault( 'parseNumbers' ), - parseBooleans: parseAll || optWithDefault( 'parseBooleans' ), - parseNulls: parseAll || optWithDefault( 'parseNulls' ), - parseWithFunction: optWithDefault( 'parseWithFunction' ), - - typeFunctions: $.extend( {}, optWithDefault( 'defaultTypes' ), optWithDefault( 'customTypes' ) ), - - useIntKeysAsArrayIndex: optWithDefault( 'useIntKeysAsArrayIndex' ), - }; - }, - - // Given a string, apply the type or the relevant "parse" options, to return the parsed value - parseValue: function( str, type, opts ) { - var typeFunction, f; - f = $.serializeJSON; - - // Parse with a type if available - typeFunction = opts.typeFunctions && opts.typeFunctions[type]; - if ( typeFunction ) return typeFunction( str ); // use specific type - - // Otherwise, check if there is any auto-parse option enabled and use it. - if ( opts.parseNumbers && f.isNumeric( str ) ) return Number( str ); // auto: number - if ( opts.parseBooleans && (str === "true" || str === "false") ) return str === "true"; // auto: boolean - if ( opts.parseNulls && str == "null" ) return null; // auto: null - - // If none applies, just return the str - return str; - }, - - isObject: function( obj ) { - return obj === Object( obj ); - }, // is this variable an object? - isUndefined: function( obj ) { - return obj === void 0; - }, // safe check for undefined values - isValidArrayIndex: function( val ) { - return /^[0-9]+$/.test( String( val ) ); - }, // 1,2,3,4 ... are valid array indexes - isNumeric: function( obj ) { - return obj - parseFloat( obj ) >= 0; - }, // taken from jQuery.isNumeric implementation. Not using jQuery.isNumeric to support old jQuery and Zepto versions - - optionKeys: function( obj ) { - if ( Object.keys ) { - return Object.keys( obj ); - } else { - var keys = []; - for ( var key in obj ) { - keys.push( key ); - } - - return keys; - } - }, // polyfill Object.keys to get option keys in IE<9 - - // Split the input name in programatically readable keys. - // The last element is always the type (default "_"). - // Examples: - // "foo" => ['foo', '_'] - // "foo:string" => ['foo', 'string'] - // "foo:boolean" => ['foo', 'boolean'] - // "[foo]" => ['foo', '_'] - // "foo[inn][bar]" => ['foo', 'inn', 'bar', '_'] - // "foo[inn[bar]]" => ['foo', 'inn', 'bar', '_'] - // "foo[inn][arr][0]" => ['foo', 'inn', 'arr', '0', '_'] - // "arr[][val]" => ['arr', '', 'val', '_'] - // "arr[][val]:null" => ['arr', '', 'val', 'null'] - splitInputNameIntoKeysArray: function( name, opts ) { - var keys, nameWithoutType, type, _ref, f; - f = $.serializeJSON; - _ref = f.extractTypeFromInputName( name, opts ), nameWithoutType = _ref[0], type = _ref[1]; - keys = nameWithoutType.split( '[' ); // split string into array - keys = $.map( - keys, function( key ) { - return key.replace( /]/g, '' ); - } - ); // remove closing brackets - if ( keys[0] === '' ) { - keys.shift(); - } // ensure no opening bracket ("[foo][inn]" should be same as "foo[inn]") - keys.push( type ); // add type at the end - return keys; - }, - - // Returns [name-without-type, type] from name. - // "foo" => ["foo", '_'] - // "foo:boolean" => ["foo", 'boolean'] - // "foo[bar]:null" => ["foo[bar]", 'null'] - extractTypeFromInputName: function( name, opts ) { - var match, validTypes, f; - if ( match = name.match( /(.*):([^:]+)$/ ) ) { - f = $.serializeJSON; - - validTypes = f.optionKeys( opts ? opts.typeFunctions : f.defaultOptions.defaultTypes ); - validTypes.push( 'skip' ); // skip is a special type that makes it easy to remove - if ( validTypes.indexOf( match[2] ) !== -1 ) { - return [match[1], match[2]]; - } else { - throw new Error( "serializeJSON ERROR: Invalid type " + match[2] + " found in input name '" + name + "', please use one of " + validTypes.join( ', ' ) ) - } - } else { - return [name, '_']; // no defined type, then use parse options - } - }, - - // Set a value in an object or array, using multiple keys to set in a nested object or array: - // - // deepSet(obj, ['foo'], v) // obj['foo'] = v - // deepSet(obj, ['foo', 'inn'], v) // obj['foo']['inn'] = v // Create the inner obj['foo'] object, if needed - // deepSet(obj, ['foo', 'inn', '123'], v) // obj['foo']['arr']['123'] = v // - // - // deepSet(obj, ['0'], v) // obj['0'] = v - // deepSet(arr, ['0'], v, {useIntKeysAsArrayIndex: true}) // arr[0] = v - // deepSet(arr, [''], v) // arr.push(v) - // deepSet(obj, ['arr', ''], v) // obj['arr'].push(v) - // - // arr = []; - // deepSet(arr, ['', v] // arr => [v] - // deepSet(arr, ['', 'foo'], v) // arr => [v, {foo: v}] - // deepSet(arr, ['', 'bar'], v) // arr => [v, {foo: v, bar: v}] - // deepSet(arr, ['', 'bar'], v) // arr => [v, {foo: v, bar: v}, {bar: v}] - // - deepSet: function( o, keys, value, opts ) { - var key, nextKey, tail, lastIdx, lastVal, f; - if ( opts == null ) opts = {}; - f = $.serializeJSON; - if ( f.isUndefined( o ) ) { - throw new Error( "ArgumentError: param 'o' expected to be an object or array, found undefined" ); - } - if ( !keys || keys.length === 0 ) { - throw new Error( "ArgumentError: param 'keys' expected to be an array with least one element" ); - } - - key = keys[0]; - - // Only one key, then it's not a deepSet, just assign the value. - if ( keys.length === 1 ) { - if ( key === '' ) { - o.push( value ); // '' is used to push values into the array (assume o is an array) - } else { - o[key] = value; // other keys can be used as object keys or array indexes - } - - // With more keys is a deepSet. Apply recursively. - } else { - nextKey = keys[1]; - - // '' is used to push values into the array, - // with nextKey, set the value into the same object, in object[nextKey]. - // Covers the case of ['', 'foo'] and ['', 'var'] to push the object {foo, var}, and the case of nested arrays. - if ( key === '' ) { - lastIdx = o.length - 1; // asume o is array - lastVal = o[lastIdx]; - if ( f.isObject( lastVal ) && (f.isUndefined( lastVal[nextKey] ) || keys.length > 2) ) { // if nextKey is not present in the last object element, or there are more keys to deep set - key = lastIdx; // then set the new value in the same object element - } else { - key = lastIdx + 1; // otherwise, point to set the next index in the array - } - } - - // '' is used to push values into the array "array[]" - if ( nextKey === '' ) { - if ( f.isUndefined( o[key] ) || !$.isArray( o[key] ) ) { - o[key] = []; // define (or override) as array to push values - } - } else { - if ( opts.useIntKeysAsArrayIndex && f.isValidArrayIndex( nextKey ) ) { // if 1, 2, 3 ... then use an array, where nextKey is the index - if ( f.isUndefined( o[key] ) || !$.isArray( o[key] ) ) { - o[key] = []; // define (or override) as array, to insert values using int keys as array indexes - } - } else { // for anything else, use an object, where nextKey is going to be the attribute name - if ( f.isUndefined( o[key] ) || !f.isObject( o[key] ) ) { - o[key] = {}; // define (or override) as object, to set nested properties - } - } - } - - // Recursively set the inner object - tail = keys.slice( 1 ); - f.deepSet( o[key], tail, value, opts ); - } - }, - - // Fill the formAsArray object with values for the unchecked checkbox inputs, - // using the same format as the jquery.serializeArray function. - // The value of the unchecked values is determined from the opts.checkboxUncheckedValue - // and/or the data-unchecked-value attribute of the inputs. - readCheckboxUncheckedValues: function( formAsArray, $form, opts ) { - var selector, $uncheckedCheckboxes, $el, dataUncheckedValue, f; - if ( opts == null ) opts = {}; - f = $.serializeJSON; - - selector = 'input[type=checkbox][name]:not(:checked):not([disabled])'; - $uncheckedCheckboxes = $form.find( selector ).add( $form.filter( selector ) ); - $uncheckedCheckboxes.each( - function( i, el ) { - $el = $( el ); - dataUncheckedValue = $el.attr( 'data-unchecked-value' ); - if ( dataUncheckedValue ) { // data-unchecked-value has precedence over option opts.checkboxUncheckedValue - formAsArray.push( {name: el.name, value: dataUncheckedValue} ); - } else { - if ( !f.isUndefined( opts.checkboxUncheckedValue ) ) { - formAsArray.push( {name: el.name, value: opts.checkboxUncheckedValue} ); - } - } - } - ); - } - - }; - -}( window.jQuery || window.$ )); - - -(function( $ ) { //This functions first parameter is named $ - 'use strict'; - - redux.customizer = redux.customizer || {}; - - $( document ).ready( - function() { - redux.customizer.init(); - } - ); - redux.customizer.init = function() { - $( 'body' ).addClass( redux_customizer.body_class ); - $( '.accordion-section.redux-section, .accordion-section.redux-panel, .accordion-section-title' ).click( - function() { - $.redux.initFields(); - } - ); - }; - redux.customizer.save = function( $obj, $container ) { - var $parent = $obj.hasClass( 'redux-field' ) ? $obj : $obj.parents( '.redux-field-container:first' ); - redux.customizer.inputSave( $parent ); - }; - redux.customizer.inputSave = function( $parent ) { - - if ( !$parent.hasClass( 'redux-field-container' ) ) { - $parent = $parent.parents( '[class^="redux-field-container"]' ); - } - - var $id = $parent.parent().find( '.redux-customizer-input' ).data( 'id' ); - - if ( !$id ) { - $parent = $parent.parents( '.redux-container-repeater:first' ); - var $id = $parent.parent().find( '.redux-customizer-input' ).data( 'id' ); - } - - //var $nData = $parent.serializeJSON(); - var $nData = $parent.find(':input').serializeJSON(); - - $.each( - $nData, function( $k, $v ) { - $nData = $v; - } - ); - - var $key = $parent.parent().find( '.redux-customizer-input' ).data( 'key' ); - if ( $nData[$key] ) { - $nData = $nData[$key]; - } - - var $control = wp.customize.control( $id ); - - $control.setting.set( $nData ); - - } -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.min.js deleted file mode 100755 index d6e8ab0b..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";a.fn.serializeJSON=function(b){var c,d,e,f,g,h,i;return h=a.serializeJSON,i=h.setupOpts(b),d=this.serializeArray(),h.readCheckboxUncheckedValues(d,this,i),c={},a.each(d,function(a,b){e=h.splitInputNameIntoKeysArray(b.name,i),f=e.pop(),"skip"!==f&&(g=h.parseValue(b.value,f,i),i.parseWithFunction&&"_"===f&&(g=i.parseWithFunction(g,b.name)),h.deepSet(c,e,g,i))}),c},a.serializeJSON={defaultOptions:{checkboxUncheckedValue:void 0,parseNumbers:!1,parseBooleans:!1,parseNulls:!1,parseAll:!1,parseWithFunction:null,customTypes:{},defaultTypes:{string:function(a){return String(a)},number:function(a){return Number(a)},"boolean":function(a){return-1===["false","null","undefined","","0"].indexOf(a)},"null":function(a){return-1!==["false","null","undefined","","0"].indexOf(a)?null:a},array:function(a){return JSON.parse(a)},object:function(a){return JSON.parse(a)},auto:function(b){return a.serializeJSON.parseValue(b,null,{parseNumbers:!0,parseBooleans:!0,parseNulls:!0})}},useIntKeysAsArrayIndex:!1},setupOpts:function(b){var c,d,e,f,g,h;h=a.serializeJSON,(null===b||void 0===b)&&(b={}),e=h.defaultOptions||{},d=["checkboxUncheckedValue","parseNumbers","parseBooleans","parseNulls","parseAll","parseWithFunction","customTypes","defaultTypes","useIntKeysAsArrayIndex"];for(c in b)if(-1===d.indexOf(c))throw new Error("serializeJSON ERROR: invalid option '"+c+"'. Please use one of "+d.join(", "));return f=function(a){return b[a]!==!1&&""!==b[a]&&(b[a]||e[a])},g=f("parseAll"),{checkboxUncheckedValue:f("checkboxUncheckedValue"),parseNumbers:g||f("parseNumbers"),parseBooleans:g||f("parseBooleans"),parseNulls:g||f("parseNulls"),parseWithFunction:f("parseWithFunction"),typeFunctions:a.extend({},f("defaultTypes"),f("customTypes")),useIntKeysAsArrayIndex:f("useIntKeysAsArrayIndex")}},parseValue:function(b,c,d){var e,f;return f=a.serializeJSON,e=d.typeFunctions&&d.typeFunctions[c],e?e(b):d.parseNumbers&&f.isNumeric(b)?Number(b):!d.parseBooleans||"true"!==b&&"false"!==b?d.parseNulls&&"null"==b?null:b:"true"===b},isObject:function(a){return a===Object(a)},isUndefined:function(a){return void 0===a},isValidArrayIndex:function(a){return/^[0-9]+$/.test(String(a))},isNumeric:function(a){return a-parseFloat(a)>=0},optionKeys:function(a){if(Object.keys)return Object.keys(a);var b=[];for(var c in a)b.push(c);return b},splitInputNameIntoKeysArray:function(b,c){var d,e,f,g,h;return h=a.serializeJSON,g=h.extractTypeFromInputName(b,c),e=g[0],f=g[1],d=e.split("["),d=a.map(d,function(a){return a.replace(/]/g,"")}),""===d[0]&&d.shift(),d.push(f),d},extractTypeFromInputName:function(b,c){var d,e,f;if(d=b.match(/(.*):([^:]+)$/)){if(f=a.serializeJSON,e=f.optionKeys(c?c.typeFunctions:f.defaultOptions.defaultTypes),e.push("skip"),-1!==e.indexOf(d[2]))return[d[1],d[2]];throw new Error("serializeJSON ERROR: Invalid type "+d[2]+" found in input name '"+b+"', please use one of "+e.join(", "))}return[b,"_"]},deepSet:function(b,c,d,e){var f,g,h,i,j,k;if(null==e&&(e={}),k=a.serializeJSON,k.isUndefined(b))throw new Error("ArgumentError: param 'o' expected to be an object or array, found undefined");if(!c||0===c.length)throw new Error("ArgumentError: param 'keys' expected to be an array with least one element");f=c[0],1===c.length?""===f?b.push(d):b[f]=d:(g=c[1],""===f&&(i=b.length-1,j=b[i],f=k.isObject(j)&&(k.isUndefined(j[g])||c.length>2)?i:i+1),""===g?(k.isUndefined(b[f])||!a.isArray(b[f]))&&(b[f]=[]):e.useIntKeysAsArrayIndex&&k.isValidArrayIndex(g)?(k.isUndefined(b[f])||!a.isArray(b[f]))&&(b[f]=[]):(k.isUndefined(b[f])||!k.isObject(b[f]))&&(b[f]={}),h=c.slice(1),k.deepSet(b[f],h,d,e))},readCheckboxUncheckedValues:function(b,c,d){var e,f,g,h,i;null==d&&(d={}),i=a.serializeJSON,e="input[type=checkbox][name]:not(:checked):not([disabled])",f=c.find(e).add(c.filter(e)),f.each(function(c,e){g=a(e),h=g.attr("data-unchecked-value"),h?b.push({name:e.name,value:h}):i.isUndefined(d.checkboxUncheckedValue)||b.push({name:e.name,value:d.checkboxUncheckedValue})})}}}(window.jQuery||window.$),function(a){"use strict";redux.customizer=redux.customizer||{},a(document).ready(function(){redux.customizer.init()}),redux.customizer.init=function(){a("body").addClass(redux_customizer.body_class),a(".accordion-section.redux-section, .accordion-section.redux-panel, .accordion-section-title").click(function(){a.redux.initFields()})},redux.customizer.save=function(a,b){var c=a.hasClass("redux-field")?a:a.parents(".redux-field-container:first");redux.customizer.inputSave(c)},redux.customizer.inputSave=function(b){b.hasClass("redux-field-container")||(b=b.parents('[class^="redux-field-container"]'));var c=b.parent().find(".redux-customizer-input").data("id");if(!c){b=b.parents(".redux-container-repeater:first");var c=b.parent().find(".redux-customizer-input").data("id")}var d=b.find(":input").serializeJSON();a.each(d,function(a,b){d=b});var e=b.parent().find(".redux-customizer-input").data("key");d[e]&&(d=d[e]);var f=wp.customize.control(c);f.setting.set(d)}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.php deleted file mode 100755 index c7b83fa3..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.php +++ /dev/null @@ -1,807 +0,0 @@ - - //return; - /** - * Redux Framework 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 - * any later version. - * Redux Framework is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with Redux Framework. If not, see . - * - * @package ReduxFramework - * @author Dovy Paukstys (dovy) - * @version 0.1.0 - */ - - // Exit if accessed directly - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - // Don't duplicate me! - if ( ! class_exists( 'ReduxFramework_extension_customizer' ) ) { - - /** - * Main ReduxFramework customizer extension class - * - * @since 1.0.0 - */ - class ReduxFramework_extension_customizer { - - // Protected vars - protected $redux; - private $_extension_url; - private $_extension_dir; - private $parent; - private $orig_options = array(); - private static $post_values = array(); - public static $version = "2.0.0"; - private $options = array(); - - /** - * Class Constructor. Defines the args for the extions class - * - * @since 1.0.0 - * @access public - * - * @param array $sections Panel sections. - * @param array $args Class constructor arguments. - * @param array $extra_tabs Extra panel tabs. - * - * @return void - */ - public function __construct( $parent ) { - - $this->parent = $parent; - - $this->upload_dir = ReduxFramework::$_upload_dir . 'advanced-customizer/'; - - //add_action('wp_head', array( $this, '_enqueue_new' )); - if ( $parent->args['customizer'] == false ) { - return; - } - - // Override the ReduxCore class - add_filter( "redux/extension/{$this->parent->args['opt_name']}/customizer", array( - $this, - 'remove_core_customizer_class' - ) ); - - global $pagenow, $wp_customize; - if ( ! isset( $wp_customize ) && $pagenow !== "customize.php" && $pagenow !== "admin-ajax.php" ) { - return; - } - if ( ( $pagenow !== "customize.php" && $pagenow !== "admin-ajax.php" && ! isset( $GLOBALS['wp_customize'] ) ) ) { - //return; - } - - if ( empty( $this->_extension_dir ) ) { - $this->_extension_dir = trailingslashit( str_replace( '\\', '/', dirname( __FILE__ ) ) ); - $this->_extension_url = site_url( str_replace( trailingslashit( str_replace( '\\', '/', ABSPATH ) ), '', $this->_extension_dir ) ); - } - - self::get_post_values(); - - // Create defaults array - $defaults = array(); - /* - customize_controls_init - customize_controls_enqueue_scripts - customize_controls_print_styles - customize_controls_print_scripts - customize_controls_print_footer_scripts - */ - - //add_action('customize_save', ); - - if ( isset( $_POST['wp_customize'] ) && $_POST['wp_customize'] == "on" ) { - $this->parent->args['customizer_only'] = true; - } - - if ( isset( $_POST['wp_customize'] ) && $_POST['wp_customize'] == "on" && isset( $_POST['customized'] ) && ! empty( $_POST['customized'] ) && ! isset( $_POST['action'] ) ) { - add_action( "redux/options/{$this->parent->args['opt_name']}/options", array( - $this, - '_override_values' - ), 100 ); - } - - add_action( 'customize_register', array( - $this, - '_register_customizer_controls' - ) ); // Create controls - - add_action( 'wp_head', array( $this, 'customize_preview_init' ) ); - - - //add_action( 'customize_save', array( $this, 'customizer_save_before' ) ); // Before save - add_action( 'customize_save_after', array( &$this, 'customizer_save_after' ) ); // After save - - // Add global controls CSS file - add_action( 'customize_controls_print_scripts', array( $this, 'enqueue_controls_css' ) ); - - add_action( 'customize_controls_init', array( $this, 'enqueue_panel_css' ) ); - - - //add_action( 'wp_enqueue_scripts', array( &$this, '_enqueue_previewer_css' ) ); // Enqueue previewer css - //add_action( 'wp_enqueue_scripts', array( &$this, '_enqueue_previewer_js' ) ); // Enqueue previewer javascript - //add_action( "wp_footer", array( $this, '_enqueue_new' ), 100 ); - //$this->_enqueue_new(); - - - } - - function enqueue_controls_css() { - - require_once ReduxFramework::$_dir . 'core/enqueue.php'; - $enqueue = new reduxCoreEnqueue ( $this->parent ); - $enqueue->get_warnings_and_errors_array(); - $enqueue->init(); - wp_enqueue_style( 'redux-extension-advanced-customizer', $this->_extension_url . 'extension_customizer.css', '', time() ); - - wp_enqueue_script( - 'redux-extension-customizer', - $this->_extension_url . 'extension_customizer' . Redux_Functions::isMin() . '.js', - array( 'jquery', 'redux-js' ), - ReduxFramework_extension_customizer::$version, - true - ); - wp_localize_script( 'redux-extension-customizer', 'redux_customizer', array( 'body_class' => sanitize_html_class( 'admin-color-' . get_user_option( 'admin_color' ), 'fresh' ) ) ); - } - - function enqueue_panel_css() { - - } - - function remove_core_customizer_class( $path ) { - return ""; - } - - function customize_preview_init() { - do_action( 'redux/customizer/live_preview' ); - } - - protected static function get_post_values() { - if ( empty( self::$post_values ) && isset( $_POST['customized'] ) && ! empty( $_POST['customized'] ) ) { - self::$post_values = json_decode( stripslashes_deep( $_POST['customized'] ), true ); - } - } - - public function _override_values( $data ) { - - self::get_post_values(); - - - if ( isset( $_POST['customized'] ) && ! empty( self::$post_values ) ) { - - if ( is_array( self::$post_values ) ) { - foreach ( self::$post_values as $key => $value ) { - if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) { - - //if (is_array($value)) { - // $value = @stripslashes( $value ); - // if ( function_exists( 'get_magic_quotes_gpc' ) && get_magic_quotes_gpc() ) { - // $value = @array_map( 'stripslashes_deep', $value ); - // $value = @array_map( 'urldecode', $value ); - // } - //} else { - // $value = @urldecode($value); - //} - $key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, "]" ) ); - $data[ $key ] = $value; - $GLOBALS[ $this->parent->args['global_variable'] ][ $key ] = $value; - $this->parent->options[ $key ] = $value; - } - } - } - - } - - return $data; - } - - public function _enqueue_new() { - //echo ""; - //echo ""; - //echo ""; - //echo ""; - //echo ""; - //echo ""; - //echo ""; - //echo ""; - //echo ""; - //echo ""; - //echo ""; - //echo ""; - - /* - wp_enqueue_script('redux-extension-customizer-codemirror-js', $this->_extension_url . 'new/codemirror.min.js'); - wp_enqueue_script('redux-extension-customizer-color-js', $this->_extension_url . 'new/colors-control.js'); - wp_enqueue_script('redux-extension-customizer-controls-js', $this->_extension_url . 'new/customizer-control.js'); - wp_enqueue_script('redux-extension-customizer-fonts-js', $this->_extension_url . 'new/fonts-customizer-admin.js'); - wp_enqueue_script('redux-extension-customizer-header-js', $this->_extension_url . 'new/header-control.js'); - wp_enqueue_script('redux-extension-customizer-models-js', $this->_extension_url . 'new/header-models.js'); - wp_enqueue_script('redux-extension-customizer-slimscroll-js', $this->_extension_url . 'new/jquery.slimscroll.js'); - wp_enqueue_script('redux-extension-customizer-droppable-js', $this->_extension_url . 'new/jquery.ui.droppable.min.js'); - wp_enqueue_script('redux-extension-customizer-editor-js', $this->_extension_url . 'new/media-editor.min.js'); - wp_enqueue_script('redux-extension-customizer-new-js', $this->_extension_url . 'new/new-customizer.js'); - wp_enqueue_script('redux-extension-customizer-previewing-js', $this->_extension_url . 'new/previewing.js'); - wp_enqueue_script('redux-extension-customizer-theme-js', $this->_extension_url . 'new/theme-customizer.js'); - */ - } - - public function render( $control ) { - $fieldID = str_replace( $this->parent->args['opt_name'] . '-', '', $control->redux_id ); - $field = $this->options[ $fieldID ]; - - if ( isset( $field['compiler'] ) && ! empty( $field['compiler'] ) ) { - echo ''; - } else { - echo ''; - } - echo '' . $this->parent->field_head[ $field['id'] ] . ''; - echo ''; - //$field['data-customize-setting-link'] = array( - // 'name' => $field['name'], - // 'suffix' => isset($field['name_suffix']) ? $field['name_suffix'] : '' - //); - // - $field['name'] = $field['id']; - $this->parent->_field_input( $field ); - echo ''; - echo ''; - } - - // All sections, settings, and controls will be added here - public function _register_customizer_controls( $wp_customize ) { - - if ( ! class_exists( 'Redux_Customizer_Section' ) ) { - require_once dirname( __FILE__ ) . '/inc/customizer_section.php'; - if ( method_exists( $wp_customize, 'register_section_type' ) ) { - $wp_customize->register_section_type( 'Redux_Customizer_Section' ); - } - } - if ( ! class_exists( 'Redux_Customizer_Panel' ) ) { - require_once dirname( __FILE__ ) . '/inc/customizer_panel.php'; - if ( method_exists( $wp_customize, 'register_panel_type' ) ) { - $wp_customize->register_panel_type( 'Redux_Customizer_Panel' ); - } - } - if ( ! class_exists( 'Redux_Customizer_Control' ) ) { - require_once dirname( __FILE__ ) . '/inc/customizer_control.php'; - } - - require_once dirname( __FILE__ ) . '/inc/customizer_fields.php'; - require_once dirname( __FILE__ ) . '/inc/customizer_devs.php'; - - do_action( "redux/extension/customizer/control/includes" ); - - //if ($this->parent->args['dev_mode']) { - // $section = new Redux_Customizer_rAds( $wp_customize, 'redux_rAds', array( - // 'priority' => 0, - // ) ); - // $wp_customize->add_section( $section, array( - // 'priority' => 0, - // ) ); - // - // //$wp_customize->add_control( new Redux_Customizer_Control_rAds( $wp_customize, 'reduxAdsDisplay', array( - // // 'section' => 'redux_rAds', - // // 'settings' => 'redux_rAds_field', - // // 'type' => 'redux-rAds', - // //) ) ); - // - // - // - // - //} - if ( $this->parent->args['dev_mode'] ) { - //$args = array( - // 'priority' => 0, - //); - ////$section = new Redux_Customizer_Section( $wp_customize, 'redux_rAds', $args ); - ////$wp_customize->add_section( $section, $args ); - //$this->add_section( 'redux_rAds', array( - // 'title' => '', - // 'priority' => 1, - // 'description' => '', - // 'capability' => 'edit_theme_options', - //), $wp_customize ); - // - //$wp_customize->add_control( new WP_Customize_Color_Control( - // $wp_customize, - // 'redux_rAds_display', - // array( - // 'section' => 'redux_rAds', - // 'settings' => 'redux_rAds_display', - // ) - //)); - ////$wp_customize->add_control( new Redux_Customizer_Control_rAds( $wp_customize, 'reduxAdsDisplay', array( - //// 'section' => 'redux_rAds', - //// 'settings' => 'redux_rAds_field', - //// 'type' => 'redux-rAds', - ////) ) ); - //start copyright settings - - //$section = new Redux_Customizer_section_rAds( $wp_customize, 'redux_rAds', array( - // 'priority' => -999, - //) ); - //$wp_customize->add_section( $section, array( - // 'priority' => -999, - //) ); - //$wp_customize->add_setting( - // 'redux_rAds_empty' - //); - //$wp_customize->add_control( - // new Redux_Customizer_Control_rAds( - // $wp_customize, - // 'redux_rAds_empty', - // array( - // 'section' => 'redux_rAds', - // 'settings' => 'redux_rAds_empty' - // ) - // ) - //); - } - - - $order = array( - 'heading' => - 500, - 'option' => - 500, - ); - $defaults = array( - 'default-color' => '', - 'default-image' => '', - 'wp-head-callback' => '', - 'admin-head-callback' => '', - 'admin-preview-callback' => '' - ); - $panel = ""; - - $this->parent->args['options_api'] = false; - $this->parent->_register_settings(); - - foreach ( $this->parent->sections as $key => $section ) { - - // Not a type that should go on the customizer - if ( isset( $section['type'] ) && ( $section['type'] == "divide" ) ) { - continue; - } - - if ( isset( $section['id'] ) && $section['id'] == "import/export" ) { - continue; - } - - // If section customizer is set to false - if ( isset( $section['customizer'] ) && $section['customizer'] === false ) { - continue; - } - - $section['permissions'] = isset( $section['permissions'] ) ? $section['permissions'] : 'edit_theme_options'; - - // No errors please - if ( ! isset( $section['desc'] ) ) { - $section['desc'] = ""; - } - - // Fill the description if there is a subtitle - if ( empty( $section['desc'] ) && ! empty( $section['subtitle'] ) ) { - $section['desc'] = $section['subtitle']; - } - - // Let's make a section ID from the title - if ( empty( $section['id'] ) ) { - $section['id'] = strtolower( str_replace( " ", "", $section['title'] ) ); - } - - // No title is present, let's show what section is missing a title - if ( ! isset( $section['title'] ) ) { - $section['title'] = ""; - } - - // Let's set a default priority - if ( empty( $section['priority'] ) ) { - $section['priority'] = $order['heading']; - $order['heading'] ++; - } - - //print_r($section); - //print_r($this->parent->sections[$key+1]); - //echo $key; - //exit(); - - - if ( method_exists( $wp_customize, 'add_panel' ) && ( ! isset( $section['subsection'] ) || ( isset( $section['subsection'] ) && $section['subsection'] != true ) ) && isset( $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) && $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) { - - $this->add_panel( $section['id'], array( - 'priority' => $section['priority'], - 'capability' => $section['permissions'], - //'theme_supports' => '', - 'title' => $section['title'], - 'section' => $section, - 'opt_name' => $this->parent->args['opt_name'], - 'description' => '', - ), $wp_customize ); - $panel = $section['id']; - - $this->add_section( $section['id'], array( - 'title' => $section['title'], - 'priority' => $section['priority'], - 'description' => $section['desc'], - 'section' => $section, - 'opt_name' => $this->parent->args['opt_name'], - 'capability' => $section['permissions'], - 'panel' => $panel - ), $wp_customize ); - - - } else { - if ( ! isset( $section['subsection'] ) || ( isset( $section['subsection'] ) && $section['subsection'] != true ) ) { - $panel = ""; - } - $this->add_section( $section['id'], array( - 'title' => $section['title'], - 'priority' => $section['priority'], - 'description' => $section['desc'], - 'opt_name' => $this->parent->args['opt_name'], - 'section' => $section, - 'capability' => $section['permissions'], - 'panel' => $panel - ), $wp_customize ); - } - - if ( ! isset( $section['fields'] ) || ( isset( $section['fields'] ) && empty( $section['fields'] ) ) ) { - continue; - } - - foreach ( $section['fields'] as $skey => $option ) { - - if ( isset( $option['customizer'] ) && $option['customizer'] === false ) { - continue; - } - - if ( $this->parent->args['customizer'] === false && ( ! isset( $option['customizer'] ) || $option['customizer'] !== true ) ) { - continue; - } - - $this->options[ $option['id'] ] = $option; - add_action( 'redux/advanced_customizer/control/render/' . $this->parent->args['opt_name'] . '-' . $option['id'], array( - $this, - 'render' - ) ); - - $option['permissions'] = isset( $option['permissions'] ) ? $option['permissions'] : 'edit_theme_options'; - - // - //if ( isset( $option['validate_callback'] ) && ! empty( $option['validate_callback'] ) ) { - // continue; - //} - - - //Change the item priority if not set - if ( $option['type'] != 'heading' && ! isset( $option['priority'] ) ) { - $option['priority'] = $order['option']; - $order['option'] ++; - } - - if ( ! empty( $this->options_defaults[ $option['id'] ] ) ) { - $option['default'] = $this->options_defaults['option']['id']; - } - - //$option['id'] = $this->parent->args['opt_name'].'['.$option['id'].']'; - //echo $option['id']; - - if ( ! isset( $option['default'] ) ) { - $option['default'] = ""; - } - if ( ! isset( $option['title'] ) ) { - $option['title'] = ""; - } - - - $option['id'] = $this->parent->args['opt_name'] . '[' . $option['id'] . ']'; - - if ( $option['type'] != "heading" && $option['type'] != "import_export" && ! empty( $option['type'] ) ) { - - $wp_customize->add_setting( $option['id'], - array( - 'default' => $option['default'], - //'type' => 'option', - //'capabilities' => $option['permissions'], - //'capabilities' => 'edit_theme_options', - //'capabilities' => $this->parent->args['page_permissions'], - 'transport' => 'refresh', - 'opt_name' => $this->parent->args['opt_name'], - //'theme_supports' => '', - //'sanitize_callback' => '__return_false', - 'sanitize_callback' => array( $this, '_field_validation' ), - //'sanitize_js_callback' =>array( &$parent, '_field_input' ), - ) - ); - - } - - if ( ! empty( $option['data'] ) && empty( $option['options'] ) ) { - if ( empty( $option['args'] ) ) { - $option['args'] = array(); - } - - if ( $option['data'] == "elusive-icons" || $option['data'] == "elusive-icon" || $option['data'] == "elusive" ) { - $icons_file = ReduxFramework::$_dir . 'inc/fields/select/elusive-icons.php'; - $icons_file = apply_filters( 'redux-font-icons-file', $icons_file ); - - if ( file_exists( $icons_file ) ) { - require_once $icons_file; - } - } - $option['options'] = $this->parent->get_wordpress_data( $option['data'], $option['args'] ); - } - - $class_name = 'Redux_Customizer_Control_' . $option['type']; - - do_action( 'redux/extension/customizer/control_init', $option ); - - if ( ! class_exists( $class_name ) ) { - continue; - } - - $wp_customize->add_control( new $class_name( $wp_customize, $option['id'], array( - 'label' => $option['title'], - 'section' => $section['id'], - 'settings' => $option['id'], - 'type' => 'redux-' . $option['type'], - 'field' => $option, - 'ReduxFramework' => $this->parent, - 'priority' => $option['priority'], - ) ) ); - - $section['fields'][ $skey ]['name'] = $option['id']; - if ( ! isset ( $section['fields'][ $skey ]['class'] ) ) { // No errors please - $section['fields'][ $skey ]['class'] = ""; - } - - $this->controls[ $section['fields'][ $skey ]['id'] ] = $section['fields'][ $skey ]; - - add_action( 'redux/advanced_customizer/render/' . $option['id'], array( - $this, - 'field_render' - ), $option['priority'] ); - - - } - } - - } - - public function add_section( $id, $args = array(), $wp_customize ) { - - if ( is_a( $id, 'WP_Customize_Section' ) ) { - $section = $id; - } else { - - $section_class = apply_filters( 'redux/customizer/section/class_name', "Redux_Customizer_Section" ); - $section = new $section_class( $wp_customize, $id, $args ); - } - - $wp_customize->add_section( $section, $args ); - - } - - /** - * Add a customize panel. - * - * @since 4.0.0 - * @access public - * - * @param WP_Customize_Panel|string $id Customize Panel object, or Panel ID. - * @param array $args Optional. Panel arguments. Default empty array. - */ - public function add_panel( $id, $args = array(), $wp_customize ) { - if ( is_a( $id, 'WP_Customize_Panel' ) ) { - $panel = $id; - } else { - $panel_class = apply_filters( 'redux/customizer/panel/class_name', "Redux_Customizer_Panel" ); - $panel = new $panel_class( $wp_customize, $id, $args ); - } - - $wp_customize->add_panel( $panel, $args ); - } - - public function field_render( $option ) { - echo '1'; - preg_match_all( "/\[([^\]]*)\]/", $option->id, $matches ); - $id = $matches[1][0]; - echo $option->link(); - //$link = $option->link(); - //echo $link; - - $this->parent->_field_input( $this->controls[ $id ] ); - echo '2'; - } - - public function customizer_save_before( $plugin_options ) { - $this->before_save = $this->parent->options; - //$parent->_field_input( $plugin_options ); - } - - public function customizer_save_after( $wp_customize ) { - - if ( empty( $this->parent->options ) ) { - $this->parent->get_options(); - } - if ( empty( $this->orig_options ) && ! empty( $this->parent->options ) ) { - $this->orig_options = $this->parent->options; - } - - $options = json_decode( stripslashes_deep( $_POST['customized'] ), true ); - $compiler = false; - $changed = false; - - foreach ( $options as $key => $value ) { - if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) { - $key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, "]" ) ); - - if ( ! isset( $this->orig_options[ $key ] ) || $this->orig_options[ $key ] != $value || ( isset( $this->orig_options[ $key ] ) && ! empty( $this->orig_options[ $key ] ) && empty( $value ) ) ) { - $this->parent->options[ $key ] = $value; - $changed = true; - if ( isset( $this->parent->compiler_fields[ $key ] ) ) { - $compiler = true; - } - } - } - } - - if ( $changed ) { - $this->parent->set_options( $this->parent->options ); - if ( $compiler ) { - // Have to set this to stop the output of the CSS and typography stuff. - $this->parent->no_output = true; - $this->parent->_enqueue_output(); - do_action( "redux/options/{$this->parent->args['opt_name']}/compiler", $this->parent->options, $this->parent->compilerCSS ); - do_action( "redux/options/{$this->args['opt_name']}/compiler/advanced", $this->parent ); - } - } - - } - - /** - * Enqueue CSS/JS for preview pane - * - * @since 1.0.0 - * @access public - * @global $wp_styles - * @return void - */ - public function _enqueue_previewer() { - wp_enqueue_script( - 'redux-extension-previewer-js', - $this->_extension_url . 'assets/js/preview.js' - ); - - $localize = array( - 'save_pending' => __( 'You have changes that are not saved. Would you like to save them now?', 'redux-framework' ), - 'reset_confirm' => __( 'Are you sure? Resetting will lose all custom values.', 'redux-framework' ), - 'preset_confirm' => __( 'Your current options will be replaced with the values of this preset. Would you like to proceed?', 'redux-framework' ), - 'opt_name' => $this->args['opt_name'], - //'folds' => $this->folds, - 'options' => $this->parent->options, - 'defaults' => $this->parent->options_defaults, - ); - - wp_localize_script( - 'redux-extension-previewer-js', - 'reduxPost', - $localize - ); - } - - /** - * Enqueue CSS/JS for the customizer controls - * - * @since 1.0.0 - * @access public - * @global $wp_styles - * @return void - */ - public function _enqueue() { - global $wp_styles; - - //wp_enqueue_style( 'wp-pointer' ); - //wp_enqueue_script( 'wp-pointer' ); - // Remove when code is in place! - //wp_enqueue_script('redux-extension-customizer-js', $this->_extension_url . 'assets/js/customizer.js'); - // Get styles - //wp_enqueue_style('redux-extension-customizer-css', $this->_extension_url . 'assets/css/customizer.css'); - - $localize = array( - 'save_pending' => __( 'You have changes that are not saved. Would you like to save them now?', 'redux-framework' ), - 'reset_confirm' => __( 'Are you sure? Resetting will lose all custom values.', 'redux-framework' ), - 'preset_confirm' => __( 'Your current options will be replaced with the values of this preset. Would you like to proceed?', 'redux-framework' ), - 'opt_name' => $this->args['opt_name'], - //'folds' => $this->folds, - 'field' => $this->parent->options, - 'defaults' => $this->parent->options_defaults, - ); - - // Values used by the javascript - wp_localize_script( - 'redux-js', - 'redux_opts', - $localize - ); - - do_action( 'redux-enqueue-' . $this->args['opt_name'] ); - - - foreach ( $this->sections as $section ) { - if ( isset( $section['fields'] ) ) { - foreach ( $section['fields'] as $field ) { - if ( isset( $field['type'] ) ) { - $field_class = 'ReduxFramework_' . $field['type']; - - if ( ! class_exists( $field_class ) ) { - $class_file = apply_filters( 'redux-typeclass-load', $this->path . 'inc/fields/' . $field['type'] . '/field_' . $field['type'] . '.php', $field_class ); - if ( $class_file ) { - /** @noinspection PhpIncludeInspection */ - require_once( $class_file ); - } - } - - if ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) { - $enqueue = new $field_class( '', '', $this ); - $enqueue->enqueue(); - } - } - } - } - } - } - - /** - * Register Option for use - * - * @since 1.0.0 - * @access public - * @return void - */ - public function _register_setting() { - - } - - /** - * Validate the options before insertion - * - * @since 3.0.0 - * @access public - * - * @param array $plugin_options The options array - * - * @return - */ - public function _field_validation( $value ) { - //print_r( $value ); - //print_r( $_POST ); - - return $value; - - //return $this->parent->_validate_options( $plugin_options ); - } - - /** - * HTML OUTPUT. - * - * @since 1.0.0 - * @access public - * @return void - */ - public function _customizer_html_output() { - - } - } // class - function redux_customizer_custom_validation( $field ) { - return $field; - } - } // if diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.scss deleted file mode 100755 index ba4b0fd8..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/extension_customizer.scss +++ /dev/null @@ -1,197 +0,0 @@ -.redux-section { - p.customize-section-description { - margin-top: 22px; - word-break: break-word; - &.legacy { - margin-top: 7px; - } - } -} - -.control-section-themes .accordion-section-title { - margin: 0; -} - -#customize-controls { - .customize-info { - margin-bottom: 0; - } - .redux-section .accordion-section-content { - background: #FCFCFC; - } -} - -.redux-section .accordion-section-title i, -.redux-field .accordion-field-title i, -.redux-panel .accordion-section-title i { - margin-right: 5px; -} - -.accordion-section.redux-main { - background: inherit; - margin-left: inherit; - border-left: inherit; - -moz-box-shadow: inherit; - -webkit-box-shadow: inherit; - padding: inherit; - box-shadow: inherit; -} - -.redux_field_th { - padding: 13px 0px 0px 0px; -} - -.redux-main { - .redux-field-container { - padding: 10px 0; - } - .select_wrapper { - float: none; - width: 100%; - display: inline-block; - } - .select2-container { - margin-right: 0 !important; - margin-bottom: 5px !important; - width: 100% !important; - } - .select_wrapper:nth-child(odd) { - margin-right: 0; - } - .redux-option-image { - max-width: 42% !important; - margin-right: 3%; - } - .customize-control { - border-bottom: 1px solid #ddd; - padding-bottom: 4px; - } - .customize-control:last-child { - border-bottom: 0; - padding-bottom: 0; - } - .upload { - width: 100% !important; - } - h3 { - margin-top: inherit; - } - .redux-container-raw { - margin-top: 22px; - word-break: break-word; - padding: 0 !important; - } - .redux-container-password input { - width: 100%; - } -} - -.select2-drop { - z-index: 999999; -} - -.rAdsContainer { - line-height: 0; - border: 0; - /*margin-top: -15px;*/ - /*margin-bottom: -15px;*/ -} - -.customize-control-redux-raw { - list-style: none; -} - -.rAds { - position: inherit !important; - right: 0 !important; - top: 0 !important; - bottom: 0 !important; - left: 0 !important; - text-align: center; - margin-bottom: 0; - line-height: 0; - -webkit-transition: left ease-in-out .18s; - transition: left ease-in-out .18s; - img { - -webkit-transition: left ease-in-out .18s; - transition: left ease-in-out .18s; - } -} - -@mixin adminCustomizerThemeColorOverrides($highlight-color, $text-color) { - - $menu-highlight-background: $highlight-color; - $menu-highlight-text: $text-color; - - #customize-theme-controls { - .control-section.control-section-redux:hover > h3.accordion-section-title, - .control-section.control-section-redux h3.accordion-section-title:hover, - .control-section.control-section-redux.open h3.accordion-section-title, - .control-section.control-section-redux h3.accordion-section-title:focus, - .control-panel.control-panel-redux:hover > h3.accordion-section-title, - .control-panel.control-panel-redux h3.accordion-section-title:hover, - .control-panel.control-panel-redux.open h3.accordion-section-title, - .control-panel.control-panel-redux h3.accordion-section-title:focus { - color: $text-color; - background: $highlight-color; - &:after { - color: $text-color; - } - } - .control-section.control-panel.control-panel-redux>.accordion-section-title:after { - background: transparent; - border-left: none; - } - .control-panel-redux .customize-panel-back, .redux-section .customize-section-back { - &:hover { - background: $highlight-color; - color: $text-color; - } - } - } -} - -/* Light fresh theme */ -.admin-color-fresh { - @include adminCustomizerThemeColorOverrides(#0073aa, #fff); -} - -/* Ectoplasm theme */ -.admin-color-ectoplasm { - @include adminCustomizerThemeColorOverrides(#a3b745, #fff); -} - -/* Light admin theme */ -.admin-color-light { - @include adminCustomizerThemeColorOverrides(#888, #fff); -} - -/* Blue admin theme */ -.admin-color-blue { - @include adminCustomizerThemeColorOverrides(#096484, #fff); -} - -/* Coffee admin theme */ -.admin-color-coffee { - @include adminCustomizerThemeColorOverrides(#c7a589, #fff); -} - -/* Ectoplasm admin theme */ -.admin-color-ectoplasm { - @include adminCustomizerThemeColorOverrides(#523f6d, #fff); -} - -/* Midnight admin theme */ -.admin-color-midnight { - @include adminCustomizerThemeColorOverrides(#e14d43, #fff); -} - -/* Ocean admin theme */ -.admin-color-ocean { - @include adminCustomizerThemeColorOverrides(#9ebaa0, #fff); -} - -/* Sunrise admin theme */ -.admin-color-sunrise { - @include adminCustomizerThemeColorOverrides(#cf4944, #fff); -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/inc/customizer_control.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/inc/customizer_control.php deleted file mode 100755 index 2378af77..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/inc/customizer_control.php +++ /dev/null @@ -1,50 +0,0 @@ -redux_id = str_replace( 'customize-control-', '', 'customize-control-' . str_replace( '[', '-', str_replace( ']', '', $this->id ) ) ); - $class = 'customize-control redux-group-tab redux-field customize-control-' . $this->type; - $opt_name = explode( '[', $this->id ); - $opt_name = $opt_name[0]; - ?> -
  • - type != "repeater" ): ?> - link() ) ?> - value=""/> - - render_content(); ?> -
  • - redux_id, $this ); - } - - public function label() { - // The label has already been sanitized in the Fields class, no need to re-sanitize it. - echo $this->label; - } - - public function description() { - if ( ! empty( $this->description ) ) { - // The description has already been sanitized in the Fields class, no need to re-sanitize it. - echo '' . $this->description . ''; - } - } - - public function title() { - echo ''; - $this->label(); - $this->description(); - echo ''; - } - } - } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/inc/customizer_devs.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/inc/customizer_devs.php deleted file mode 100755 index 8d76717e..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/customizer/inc/customizer_devs.php +++ /dev/null @@ -1,43 +0,0 @@ - -
  • - $key = $args[ $key ]; - } - } - $this->manager = $manager; - $this->id = $id; - if ( empty( $this->active_callback ) ) { - $this->active_callback = array( $this, 'active_callback' ); - } - self::$instance_count += 1; - $this->instance_number = self::$instance_count; - - $this->sections = array(); // Users cannot customize the $sections array. - - // TODO Redux addition - if ( isset( $args['section'] ) ) { - $this->section = $args['section']; - $this->description = isset( $this->section['desc'] ) ? $this->section['desc'] : ''; - $this->opt_name = isset( $args['opt_name'] ) ? $args['opt_name'] : ''; - } - // TODO END Redux Addition - } - - /** - * WP < 4.3 Render - * - * @since - * @access protected - */ - protected function render() { - global $wp_version; - $version = explode( '-', $wp_version ); - if ( version_compare( $version[0], '4.3', '<' ) ) { - $this->render_fallback(); - } - - } - - protected function render_fallback() { - $classes = 'accordion-section redux-main redux-panel control-section control-panel control-panel-' . esc_attr($this->type); - ?> -
  • -

    - title, array( - 'em' => array(), - 'i' => array(), - 'strong' => array(), - 'span' => array( - 'class' => array(), - 'style' => array(), - ), - ) ); - ?> - -

    -
      - - render_content(); ?> -
      -
    -
  • - -
  • -
    - ' . esc_html( $this->title ) . '' ); - ?> -
    - description ) ) : ?> -
    - description; ?> -
    - -
  • - -
  • - -
    - {{ data.title }}' ); - ?> - <# if ( data.description ) { #> - - <# } #> -
    - <# if ( data.description ) { #> -
    - {{{ data.description }}} -
    - <# } #> -
  • - $key = $args[ $key ]; - } - } - - $this->manager = $manager; - $this->id = $id; - if ( empty( $this->active_callback ) ) { - $this->active_callback = array( $this, 'active_callback' ); - } - self::$instance_count += 1; - $this->instance_number = self::$instance_count; - - $this->controls = array(); // Users cannot customize the $controls array. - - // TODO Redux addition - if ( isset( $args['section'] ) ) { - $this->section = $args['section']; - $this->description = isset( $this->section['desc'] ) ? $this->section['desc'] : ''; - $this->opt_name = isset( $args['opt_name'] ) ? $args['opt_name'] : ''; - } - } - - /** - * An Underscore (JS) template for rendering this section. - * Class variables for this section class are available in the `data` JS object; - * export custom variables by overriding {@see WP_Customize_Section::json()}. - * - * @see WP_Customize_Section::print_template() - * @since 4.3.0 - */ - protected function render_template() { - ?> -
  • -

    - {{ data.title }} - -

    -
      - -
    • -
      - -

      - - {{{ data.customizeAction }}} - {{ data.title }} -

      -
      - <# if ( data.description ) { #> -

      {{{ data.description }}}

      - <# } #> - opt_name ) && isset( $this->section ) ) { - do_action( "redux/page/{$this->opt_name}/section/before", $this->section ); - } - ?> -
    • -
    -
  • - type; - ?> -
  • -

    - title, array( - 'em' => array(), - 'i' => array(), - 'strong' => array(), - 'span' => array( - 'class' => array(), - 'style' => array(), - ), - ) ); - ?> - -

    -
      - opt_name ) && isset( $this->section ) ) { - do_action( "redux/page/{$this->opt_name}/section/before", $this->section ); - } - ?> - description ) ) : ?> -
    • -

      description; ?>

      -
    • - -
    -
  • - render_fallback(); - } - } - - } - - diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/extension_import_export.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/extension_import_export.php deleted file mode 100755 index 0e70fbcc..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/extension_import_export.php +++ /dev/null @@ -1,209 +0,0 @@ -. - * - * @package ReduxFramework - * @author Dovy Paukstys (dovy) - * @version 4.0.0 - */ - -// Exit if accessed directly - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - -// Don't duplicate me! - if ( ! class_exists( 'ReduxFramework_extension_import_export' ) ) { - - - /** - * Main ReduxFramework import_export extension class - * - * @since 3.1.6 - */ - class ReduxFramework_extension_import_export { - - // Protected vars - protected $parent; - public $extension_url; - public $extension_dir; - public static $theInstance; - public static $version = "4.0"; - public $is_field = false; - - /** - * Class Constructor. Defines the args for the extions class - * - * @since 1.0.0 - * @access public - * - * @param array $sections Panel sections. - * @param array $args Class constructor arguments. - * @param array $extra_tabs Extra panel tabs. - * - * @return void - */ - public function __construct( $parent ) { - - $this->parent = $parent; - if ( empty( $this->extension_dir ) ) { - //$this->extension_dir = trailingslashit( str_replace( '\\', '/', dirname( __FILE__ ) ) ); - } - $this->field_name = 'import_export'; - - self::$theInstance = $this; - - add_action( "wp_ajax_redux_link_options-" . $this->parent->args['opt_name'], array( - $this, - "link_options" - ) ); - add_action( "wp_ajax_nopriv_redux_link_options-" . $this->parent->args['opt_name'], array( - $this, - "link_options" - ) ); - - add_action( "wp_ajax_redux_download_options-" . $this->parent->args['opt_name'], array( - $this, - "download_options" - ) ); - add_action( "wp_ajax_nopriv_redux_download_options-" . $this->parent->args['opt_name'], array( - $this, - "download_options" - ) ); - - do_action( "redux/options/{$this->parent->args['opt_name']}/import", array( $this, 'remove_cookie' ) ); - - $this->is_field = Redux_Helpers::isFieldInUse( $parent, 'import_export' ); - - if ( ! $this->is_field && $this->parent->args['show_import_export'] ) { - $this->add_section(); - } - - add_filter( 'redux/' . $this->parent->args['opt_name'] . '/field/class/' . $this->field_name, array( - &$this, - 'overload_field_path' - ) ); // Adds the local field - - add_filter( 'upload_mimes', array( - $this, - 'custom_upload_mimes' - ) ); - - } - - /** - * Adds the appropriate mime types to WordPress - * - * @param array $existing_mimes - * - * @return array - */ - function custom_upload_mimes( $existing_mimes = array() ) { - $existing_mimes['redux'] = 'application/redux'; - - return $existing_mimes; - } - - public function add_section() { - $this->parent->sections[] = array( - 'id' => 'import/export', - 'title' => __( 'Import / Export', 'redux-framework' ), - 'heading' => '', - 'icon' => 'el el-refresh', - 'customizer' => false, - 'fields' => array( - array( - 'id' => 'redux_import_export', - 'type' => 'import_export', - //'class' => 'redux-field-init redux_remove_th', - //'title' => '', - 'full_width' => true, - ) - ), - ); - } - - function link_options() { - if ( ! isset( $_GET['secret'] ) || $_GET['secret'] != md5( md5( AUTH_KEY . SECURE_AUTH_KEY ) . '-' . $this->parent->args['opt_name'] ) ) { - wp_die( 'Invalid Secret for options use' ); - exit; - } - - $var = $this->parent->options; - $var['redux-backup'] = '1'; - if ( isset( $var['REDUX_imported'] ) ) { - unset( $var['REDUX_imported'] ); - } - - echo json_encode( $var ); - - die(); - } - - public function download_options() { - if ( ! isset( $_GET['secret'] ) || $_GET['secret'] != md5( md5( AUTH_KEY . SECURE_AUTH_KEY ) . '-' . $this->parent->args['opt_name'] ) ) { - wp_die( 'Invalid Secret for options use' ); - exit; - } - - $this->parent->get_options(); - $backup_options = $this->parent->options; - $backup_options['redux-backup'] = '1'; - if ( isset( $backup_options['REDUX_imported'] ) ) { - unset( $backup_options['REDUX_imported'] ); - } - - // No need to escape this, as it's been properly escaped previously and through json_encode - $content = json_encode( $backup_options ); - - if ( isset( $_GET['action'] ) && $_GET['action'] == 'redux_download_options-' . $this->parent->args['opt_name'] ) { - header( 'Content-Description: File Transfer' ); - header( 'Content-type: application/txt' ); - header( 'Content-Disposition: attachment; filename="redux_options_' . $this->parent->args['opt_name'] . '_backup_' . date( 'd-m-Y' ) . '.json"' ); - header( 'Content-Transfer-Encoding: binary' ); - header( 'Expires: 0' ); - header( 'Cache-Control: must-revalidate' ); - header( 'Pragma: public' ); - - echo $content; - exit; - } else { - header( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" ); - header( "Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . "GMT" ); - header( 'Expires: Sat, 26 Jul 1997 05:00:00 GMT' ); - header( 'Cache-Control: no-store, no-cache, must-revalidate' ); - header( 'Cache-Control: post-check=0, pre-check=0', false ); - header( 'Pragma: no-cache' ); - - // Can't include the type. Thanks old Firefox and IE. BAH. - //header("Content-type: application/json"); - echo $content; - exit; - } - } - - // Forces the use of the embeded field path vs what the core typically would use - public function overload_field_path( $field ) { - return dirname( __FILE__ ) . '/' . $this->field_name . '/field_' . $this->field_name . '.php'; - } - - public function remove_cookie() { - // Remove the import/export tab cookie. - if ( $_COOKIE['redux_current_tab'] == 'import_export_default' ) { - setcookie( 'redux_current_tab', '', 1, '/' ); - $_COOKIE['redux_current_tab'] = 1; - } - } - - } - } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.css deleted file mode 100755 index 70f310d3..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.css +++ /dev/null @@ -1 +0,0 @@ -#redux-import-link-wrapper,#redux-import-code-wrapper{display:none}#redux-export-code,#redux-export-link-value{display:none}#redux-import-action span{color:#B94A48} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.js deleted file mode 100755 index 9ca632e5..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.js +++ /dev/null @@ -1,200 +0,0 @@ -/*global jQuery, document, redux*/ - -(function( $ ) { - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.import_export = redux.field_objects.import_export || {}; - - redux.field_objects.import_export.init = function( selector ) { - if ( !selector ) { - selector = $( document ).find( ".redux-group-tab:visible" ).find( '.redux-container-import_export:visible' ); - } - - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - el.each( - function() { - $( '#redux-import' ).click( - function( e ) { - if ( $( '#import-code-value' ).val() === "" && $( '#import-link-value' ).val() === "" ) { - e.preventDefault(); - return false; - } - window.onbeforeunload = null; - redux.args.ajax_save = false; - } - ); - - $( this ).find( '#redux-import-code-button' ).click( - function() { - var $el = $( '#redux-import-code-wrapper' ); - if ( $( '#redux-import-link-wrapper' ).is( ':visible' ) ) { - $( '#import-link-value' ).text( '' ); - $( '#redux-import-link-wrapper' ).slideUp( - 'fast', function() { - $el.slideDown( - 'fast', function() { - $( '#import-code-value' ).focus(); - } - ); - } - ); - } else { - if ( $el.is( ':visible' ) ) { - $el.slideUp(); - } else { - $el.slideDown( - 'medium', function() { - $( '#import-code-value' ).focus(); - } - ); - } - } - } - ); - - $( this ).find( '#redux-import-link-button' ).click( - function() { - var $el = $( '#redux-import-link-wrapper' ); - if ( $( '#redux-import-code-wrapper' ).is( ':visible' ) ) { - $( '#import-code-value' ).text( '' ); - $( '#redux-import-code-wrapper' ).slideUp( - 'fast', function() { - $el.slideDown( - 'fast', function() { - $( '#import-link-value' ).focus(); - } - ); - } - ); - } else { - if ( $el.is( ':visible' ) ) { - $el.slideUp(); - } else { - $el.slideDown( - 'medium', function() { - $( '#import-link-value' ).focus(); - } - ); - } - } - } - ); - - $( this ).find( '#redux-export-code-copy' ).click( - function() { - var $el = $( '#redux-export-code' ); - if ( $( '#redux-export-link-value' ).is( ':visible' ) ) { - $( '#redux-export-link-value' ).slideUp( - 'fast', function() { - $el.slideDown( - 'medium', function() { - var options = redux.options; - options['redux-backup'] = 1; - $( this ).text( JSON.stringify( options ) ).focus().select(); - } - ); - } - ); - } else { - if ( $el.is( ':visible' ) ) { - $el.slideUp().text( '' ); - } else { - $el.slideDown( - 'medium', function() { - var options = redux.options; - options['redux-backup'] = 1; - $( this ).text( JSON.stringify( options ) ).focus().select(); - } - ); - } - } - } - ); - - $( this ).find( 'textarea' ).focusout( - function() { - var $id = $( this ).attr( 'id' ); - var $el = $( this ); - var $container = $el; - if ( $id == "import-link-value" || $id == "import-code-value" ) { - $container = $( this ).parent(); - } - $container.slideUp( - 'medium', function() { - if ( $id != "redux-export-link-value" ) { - $el.text( '' ); - } - } - ); - } - ); - - - $( this ).find( '#redux-export-link' ).click( - function() { - var $el = $( '#redux-export-link-value' ); - if ( $( '#redux-export-code' ).is( ':visible' ) ) { - $( '#redux-export-code' ).slideUp( - 'fast', function() { - $el.slideDown().focus().select(); - } - ); - } else { - if ( $el.is( ':visible' ) ) { - $el.slideUp(); - } else { - $el.slideDown( - 'medium', function() { - $( this ).focus().select(); - } - ); - } - - } - } - ); - - var textBox1 = document.getElementById( "redux-export-code" ); - textBox1.onfocus = function() { - textBox1.select(); - // Work around Chrome's little problem - textBox1.onmouseup = function() { - // Prevent further mouseup intervention - textBox1.onmouseup = null; - return false; - }; - }; - var textBox2 = document.getElementById( "import-code-value" ); - textBox2.onfocus = function() { - textBox2.select(); - // Work around Chrome's little problem - textBox2.onmouseup = function() { - // Prevent further mouseup intervention - textBox2.onmouseup = null; - return false; - }; - }; - - } - ); - } - ); - }; -})( jQuery ); - - diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.min.js deleted file mode 100755 index 4b48dd70..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.import_export=redux.field_objects.import_export||{},redux.field_objects.import_export.init=function(b){b||(b=a(document).find(".redux-group-tab:visible").find(".redux-container-import_export:visible")),a(b).each(function(){var b=a(this),c=b;b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),c.is(":hidden")||c.hasClass("redux-field-init")&&(c.removeClass("redux-field-init"),b.each(function(){a("#redux-import").click(function(b){return""===a("#import-code-value").val()&&""===a("#import-link-value").val()?(b.preventDefault(),!1):(window.onbeforeunload=null,void(redux.args.ajax_save=!1))}),a(this).find("#redux-import-code-button").click(function(){var b=a("#redux-import-code-wrapper");a("#redux-import-link-wrapper").is(":visible")?(a("#import-link-value").text(""),a("#redux-import-link-wrapper").slideUp("fast",function(){b.slideDown("fast",function(){a("#import-code-value").focus()})})):b.is(":visible")?b.slideUp():b.slideDown("medium",function(){a("#import-code-value").focus()})}),a(this).find("#redux-import-link-button").click(function(){var b=a("#redux-import-link-wrapper");a("#redux-import-code-wrapper").is(":visible")?(a("#import-code-value").text(""),a("#redux-import-code-wrapper").slideUp("fast",function(){b.slideDown("fast",function(){a("#import-link-value").focus()})})):b.is(":visible")?b.slideUp():b.slideDown("medium",function(){a("#import-link-value").focus()})}),a(this).find("#redux-export-code-copy").click(function(){var b=a("#redux-export-code");a("#redux-export-link-value").is(":visible")?a("#redux-export-link-value").slideUp("fast",function(){b.slideDown("medium",function(){var b=redux.options;b["redux-backup"]=1,a(this).text(JSON.stringify(b)).focus().select()})}):b.is(":visible")?b.slideUp().text(""):b.slideDown("medium",function(){var b=redux.options;b["redux-backup"]=1,a(this).text(JSON.stringify(b)).focus().select()})}),a(this).find("textarea").focusout(function(){var b=a(this).attr("id"),c=a(this),d=c;("import-link-value"==b||"import-code-value"==b)&&(d=a(this).parent()),d.slideUp("medium",function(){"redux-export-link-value"!=b&&c.text("")})}),a(this).find("#redux-export-link").click(function(){var b=a("#redux-export-link-value");a("#redux-export-code").is(":visible")?a("#redux-export-code").slideUp("fast",function(){b.slideDown().focus().select()}):b.is(":visible")?b.slideUp():b.slideDown("medium",function(){a(this).focus().select()})});var b=document.getElementById("redux-export-code");b.onfocus=function(){b.select(),b.onmouseup=function(){return b.onmouseup=null,!1}};var c=document.getElementById("import-code-value");c.onfocus=function(){c.select(),c.onmouseup=function(){return c.onmouseup=null,!1}}}))})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.php deleted file mode 100755 index c65918a6..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.php +++ /dev/null @@ -1,188 +0,0 @@ -. - * - * @package ReduxFramework - * @author Dovy Paukstys - * @version 3.1.5 - */ - -// Exit if accessed directly - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - -// Don't duplicate me! - if ( ! class_exists( 'ReduxFramework_import_export' ) ) { - - /** - * Main ReduxFramework_import_export class - * - * @since 1.0.0 - */ - class ReduxFramework_import_export extends ReduxFramework { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct( $field = array(), $value = '', $parent ) { - - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - $this->is_field = $this->parent->extensions['import_export']->is_field; - - $this->extension_dir = ReduxFramework::$_dir . 'inc/extensions/import_export/'; - $this->extension_url = ReduxFramework::$_url . 'inc/extensions/import_export/'; - - // Set default args for this field to avoid bad indexes. Change this to anything you use. - $defaults = array( - 'options' => array(), - 'stylesheet' => '', - 'output' => true, - 'enqueue' => true, - 'enqueue_frontend' => true - ); - $this->field = wp_parse_args( $this->field, $defaults ); - - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - - $secret = md5( md5( AUTH_KEY . SECURE_AUTH_KEY ) . '-' . $this->parent->args['opt_name'] ); - - // No errors please - $defaults = array( - 'full_width' => true, - 'overflow' => 'inherit', - ); - - $this->field = wp_parse_args( $this->field, $defaults ); - - $bDoClose = false; - - // $this->parent->args['opt_name'] & $this->field['id'] are sanitized in the ReduxFramework class, no need to re-sanitize it. - $id = $this->parent->args['opt_name'] . '-' . $this->field['id']; - - // $this->field['type'] && $this->field['id'] is sanitized in the ReduxFramework class, no need to re-sanitize it. - ?> -

    - -

    - - - - - - -

    - -
    -

    - -

    - parent->args['opt_name'] is sanitized in the ReduxFramework class, no need to re-sanitize it. ?> - -
    - - - -

      

    - -
    -
     
    -

    - -
    -

    - -

    -
    - parent->args['opt_name'] is sanitized in the ReduxFramework class, no need to re-sanitize it. - $link = esc_url( admin_url( 'admin-ajax.php?action=redux_download_options-' . $this->parent->args['opt_name'] . '&secret=' . $secret ) ); - ?> -

    - - - -

    - -

    - - - - extension_url . 'import_export/field_import_export' . Redux_Functions::isMin() . '.js', - array( 'jquery' ), - ReduxFramework_extension_import_export::$version, - true - ); - - wp_enqueue_style( - 'redux-import-export', - $this->extension_url . 'import_export/field_import_export.css', - time(), - true - ); - - } - - /** - * Output Function. - * Used to enqueue to the front-end - * - * @since 1.0.0 - * @access public - * @return void - */ - public function output() { - - if ( $this->field['enqueue_frontend'] ) { - - } - - } - - } - } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.scss deleted file mode 100755 index ca285843..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/import_export/import_export/field_import_export.scss +++ /dev/null @@ -1,13 +0,0 @@ -#redux-import-link-wrapper, -#redux-import-code-wrapper { - display: none; -} - -#redux-export-code, -#redux-export-link-value { - display: none; -} - -#redux-import-action span { - color: #B94A48; -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/extension_options_object.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/extension_options_object.php deleted file mode 100755 index efc998e8..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/extension_options_object.php +++ /dev/null @@ -1,101 +0,0 @@ -. - * - * @package ReduxFramework - * @author Kevin Provance (kprovance) - * @version 4.0.0 - */ - -// Exit if accessed directly - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - -// Don't duplicate me! - if ( ! class_exists( 'ReduxFramework_Extension_options_object' ) ) { - - - /** - * Main ReduxFramework options_object extension class - * - * @since 3.1.6 - */ - class ReduxFramework_Extension_options_object { - - // Protected vars - protected $parent; - public $extension_url; - public $extension_dir; - public static $theInstance; - public static $version = "4.0"; - public $is_field = false; - - /** - * Class Constructor. Defines the args for the extions class - * - * @since 1.0.0 - * @access public - * - * @param array $sections Panel sections. - * @param array $args Class constructor arguments. - * @param array $extra_tabs Extra panel tabs. - * - * @return void - */ - public function __construct( $parent ) { - - $this->parent = $parent; - if ( empty( $this->extension_dir ) ) { - //$this->extension_dir = trailingslashit( str_replace( '\\', '/', dirname( __FILE__ ) ) ); - } - $this->field_name = 'options_object'; - - - self::$theInstance = $this; - - $this->is_field = Redux_Helpers::isFieldInUse($parent, 'options_object'); - - if ( !$this->is_field && $this->parent->args['dev_mode'] && $this->parent->args['show_options_object'] ) { - $this->add_section(); - } - - add_filter( 'redux/' . $this->parent->args['opt_name'] . '/field/class/' . $this->field_name, array( - &$this, - 'overload_field_path' - ) ); // Adds the local field - } - - public function add_section() { - $this->parent->sections[] = array( - 'id' => 'options-object', - 'title' => __( 'Options Object', 'redux-framework' ), - 'heading' => '', - 'icon' => 'el el-info-circle', - 'customizer' => false, - 'fields' => array( - array( - 'id' => 'redux_options_object', - 'type'=> 'options_object', - 'title' => '', - ) - ), - ); - } - - // Forces the use of the embeded field path vs what the core typically would use - public function overload_field_path( $field ) { - return dirname( __FILE__ ) . '/' . $this->field_name . '/field_' . $this->field_name . '.php'; - } - } // class - } // if diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.css deleted file mode 100755 index 80207185..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.css +++ /dev/null @@ -1 +0,0 @@ -#redux-object-browser{overflow:auto;word-wrap:break-word;max-height:600px;max-width:100%} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.js deleted file mode 100755 index b83ab4b6..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.js +++ /dev/null @@ -1,44 +0,0 @@ -/*global redux_change, redux*/ - -(function( $ ) { - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.options_object = redux.field_objects.options_object || {}; - -// $( document ).ready( -// function() { -// redux.field_objects.import_export.init(); -// } -// ); - - redux.field_objects.options_object.init = function( selector ) { - - if ( !selector ) { - selector = $( document ).find( '.redux-container-options_object' ); - } - - var parent = selector; - - if ( !selector.hasClass( 'redux-field-container' ) ) { - parent = selector.parents( '.redux-field-container:first' ); - } - - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - - $( '#consolePrintObject' ).on( - 'click', function( e ) { - e.preventDefault(); - console.log( $.parseJSON( $( "#redux-object-json" ).html() ) ); - } - ); - - if ( typeof jsonView === 'function' ) { - jsonView( '#redux-object-json', '#redux-object-browser' ); - } - }; -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.min.js deleted file mode 100755 index 77bd644e..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.options_object=redux.field_objects.options_object||{},redux.field_objects.options_object.init=function(b){b||(b=a(document).find(".redux-container-options_object"));var c=b;b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),c.hasClass("redux-field-init")&&(c.removeClass("redux-field-init"),a("#consolePrintObject").on("click",function(b){b.preventDefault(),console.log(a.parseJSON(a("#redux-object-json").html()))}),"function"==typeof jsonView&&jsonView("#redux-object-json","#redux-object-browser"))}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.php deleted file mode 100755 index 77243fc3..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.php +++ /dev/null @@ -1,164 +0,0 @@ -. - * - * @package ReduxFramework - * @author Kevin Provance (kprovance) - * @version 3.5.4 - */ - -// Exit if accessed directly - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - -// Don't duplicate me! - if ( ! class_exists( 'ReduxFramework_options_object' ) ) { - - /** - * Main ReduxFramework_options_object class - * - * @since 1.0.0 - */ - class ReduxFramework_options_object { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct( $field = array(), $value = '', $parent ) { - - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - $this->is_field = $this->parent->extensions['options_object']->is_field; - - $this->extension_dir = ReduxFramework::$_dir . 'inc/extensions/options_object/'; - $this->extension_url = ReduxFramework::$_url . 'inc/extensions/options_object/'; - - // Set default args for this field to avoid bad indexes. Change this to anything you use. - $defaults = array( - 'options' => array(), - 'stylesheet' => '', - 'output' => true, - 'enqueue' => true, - 'enqueue_frontend' => true - ); - $this->field = wp_parse_args( $this->field, $defaults ); - - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - if ( version_compare( phpversion(), "5.3.0", ">=" ) ) { - $json = json_encode( $this->parent->options, true ); - } else { - $json = json_encode( $this->parent->options ); - } - - $defaults = array( - 'full_width' => true, - 'overflow' => 'inherit', - ); - - $this->field = wp_parse_args( $this->field, $defaults ); - - if ( $this->is_field ) { - $fullWidth = $this->field['full_width']; - } - - $bDoClose = false; - - $id = $this->parent->args['opt_name'] . '-' . $this->field['id']; - - if ( ! $this->is_field || ( $this->is_field && false == $fullWidth ) ) { ?> - - - -
    - -
    -

    -
    -
    - - -
    - -
    - - - - -
    -extension_url . 'options_object/field_options_object' . Redux_Functions::isMin() . '.js', - array( 'jquery' ), - ReduxFramework_extension_options_object::$version, - true - ); - - wp_enqueue_style( - 'redux-options-object', - $this->extension_url . 'options_object/field_options_object.css', - array(), - time(), - 'all' - ); - } - - /** - * Output Function. - * Used to enqueue to the front-end - * - * @since 1.0.0 - * @access public - * @return void - */ - public function output() { - - if ( $this->field['enqueue_frontend'] ) { - - } - } - } - } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.scss deleted file mode 100755 index 35fc9dcb..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/extensions/options_object/options_object/field_options_object.scss +++ /dev/null @@ -1,7 +0,0 @@ -#redux-object-browser { - overflow: auto; - word-wrap: break-word; - max-height: 600px; - max-width: 100%; -} - diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.css deleted file mode 100755 index 01f9e6f9..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.css +++ /dev/null @@ -1 +0,0 @@ -.redux-container-ace_editor .ace-wrapper{position:static}.redux-container-ace_editor .ace_editor{height:200px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.redux-container-ace_editor .ace_gutter{z-index:1 !important} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.js deleted file mode 100755 index 4c2e398f..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.js +++ /dev/null @@ -1,58 +0,0 @@ -/*global jQuery, document, redux*/ - -(function( $ ) { - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.ace_editor = redux.field_objects.ace_editor || {}; - - redux.field_objects.ace_editor.init = function( selector ) { - if ( !selector ) { - selector = $( document ).find( ".redux-group-tab:visible" ).find( '.redux-container-ace_editor:visible' ); - } - - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - el.find( '.ace-editor' ).each( - function( index, element ) { - var area = element; - var params = JSON.parse( $( this ).parent().find( '.localize_data' ).val() ); - var editor = $( element ).attr( 'data-editor' ); - - var aceeditor = ace.edit( editor ); - aceeditor.setTheme( "ace/theme/" + jQuery( element ).attr( 'data-theme' ) ); - aceeditor.getSession().setMode( "ace/mode/" + $( element ).attr( 'data-mode' ) ); - var parent = ''; - if ( el.hasClass( 'redux-field-container' ) ) { - parent = el.attr( 'data-id' ); - } else { - parent = el.parents( '.redux-field-container:first' ).attr( 'data-id' ); - } - - aceeditor.setOptions( params ); - aceeditor.on( - 'change', function( e ) { - $( '#' + area.id ).val( aceeditor.getSession().getValue() ); - redux_change( $( element ) ); - aceeditor.resize(); - } - ); - } - ); - } - ); - }; -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.min.js deleted file mode 100755 index b410a26f..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.ace_editor=redux.field_objects.ace_editor||{},redux.field_objects.ace_editor.init=function(b){b||(b=a(document).find(".redux-group-tab:visible").find(".redux-container-ace_editor:visible")),a(b).each(function(){var b=a(this),c=b;b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),c.is(":hidden")||c.hasClass("redux-field-init")&&(c.removeClass("redux-field-init"),b.find(".ace-editor").each(function(c,d){var e=d,f=JSON.parse(a(this).parent().find(".localize_data").val()),g=a(d).attr("data-editor"),h=ace.edit(g);h.setTheme("ace/theme/"+jQuery(d).attr("data-theme")),h.getSession().setMode("ace/mode/"+a(d).attr("data-mode"));var i="";i=b.hasClass("redux-field-container")?b.attr("data-id"):b.parents(".redux-field-container:first").attr("data-id"),h.setOptions(f),h.on("change",function(b){a("#"+e.id).val(h.getSession().getValue()),redux_change(a(d)),h.resize()})}))})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.php deleted file mode 100755 index e0ae3bd7..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.php +++ /dev/null @@ -1,131 +0,0 @@ -. - * - * @package Redux_Field - * @subpackage ACE_Editor - * @version 3.0.0 - */ - -// Exit if accessed directly - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - -// Don't duplicate me! - if ( ! class_exists( 'ReduxFramework_ace_editor' ) ) { - class ReduxFramework_ace_editor { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since ReduxFramework 1.0.0 - */ - function __construct( $field = array(), $value = '', $parent ) { - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - - if ( is_array( $this->value ) ) { - $this->value = ''; - } else { - $this->value = trim( $this->value ); - } - - if ( ! empty( $this->field['options'] ) ) { - $this->field['args'] = $this->field['options']; - unset( $this->field['options'] ); - } - - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since ReduxFramework 1.0.0 - */ - function render() { - - if ( ! isset( $this->field['mode'] ) ) { - $this->field['mode'] = 'javascript'; - } - if ( ! isset( $this->field['theme'] ) ) { - $this->field['theme'] = 'monokai'; - } - - $params = array( - 'minLines' => 10, - 'maxLines' => 30, - ); - - if ( isset( $this->field['args'] ) && ! empty( $this->field['args'] ) && is_array( $this->field['args'] ) ) { - $params = wp_parse_args( $this->field['args'], $params ); - } - - ?> -
    - - -
    value ); ?>
    -
    - parent->args['dev_mode'] ) { - if ( ! wp_style_is( 'redux-field-ace-editor-css' ) ) { - wp_enqueue_style( - 'redux-field-ace-editor-css', - ReduxFramework::$_url . 'inc/fields/ace_editor/field_ace_editor.css', - array(), - time(), - 'all' - ); - } - } - - if ( ! wp_script_is( 'ace-editor-js' ) ) { - Redux_CDN::enqueue_script( - 'ace-editor-js', - '//cdn.jsdelivr.net/ace/1.1.9/min/ace.js', - array( 'jquery' ), - '1.1.9', - true - ); - } - - if ( ! wp_script_is( 'redux-field-ace-editor-js' ) ) { - wp_enqueue_script( - 'redux-field-ace-editor-js', - ReduxFramework::$_url . 'inc/fields/ace_editor/field_ace_editor' . Redux_Functions::isMin() . '.js', - array( 'jquery', 'ace-editor-js', 'redux-js' ), - time(), - true - ); - } - } - } - } \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.scss deleted file mode 100755 index 77d30371..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/ace_editor/field_ace_editor.scss +++ /dev/null @@ -1,16 +0,0 @@ -.redux-container-ace_editor { - .ace-wrapper { - position: static; - } - - .ace_editor { - height: 200px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - - .ace_gutter { - z-index: 1 !important; - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.css deleted file mode 100755 index 84816a57..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.css +++ /dev/null @@ -1 +0,0 @@ -.redux-main .redux-container-background .redux-background-position,.redux-main .redux-container-background .redux-background-position select,.redux-main .redux-container-background .redux-background-attachment,.redux-main .redux-container-background .redux-background-attachment select,.redux-main .redux-container-background .redux-background-clip,.redux-main .redux-container-background .redux-background-clip select,.redux-main .redux-container-background .redux-background-origin,.redux-main .redux-container-background .redux-background-origin select,.redux-main .redux-container-background .redux-background-size,.redux-main .redux-container-background .redux-background-size select,.redux-main .redux-container-background .redux-background-repeat,.redux-main .redux-container-background .redux-background-repeat select{width:200px !important;margin-right:10px;margin-bottom:7px}.redux-main .redux-container-background .background-preview{display:block;width:100%;margin:5px 0 10px;border:1px dotted lightgray}.redux-main .redux-container-background .select2-container{margin-right:10px;margin-bottom:10px}.redux-main .redux-container-background .wp-picker-container{margin-bottom:10px}.redux-main .redux-container-background .upload{width:100%;margin-bottom:8px}.redux-main .redux-container-select li.ui-state-highlight{height:20px;margin-top:2px;margin-left:5px;width:64px;margin-bottom:0}.wp-customizer .redux-container-background .redux-background-position,.wp-customizer .redux-container-background .redux-background-position select,.wp-customizer .redux-container-background .redux-background-attachment,.wp-customizer .redux-container-background .redux-background-attachment select,.wp-customizer .redux-container-background .redux-background-clip,.wp-customizer .redux-container-background .redux-background-clip select,.wp-customizer .redux-container-background .redux-background-origin,.wp-customizer .redux-container-background .redux-background-origin select,.wp-customizer .redux-container-background .redux-background-size,.wp-customizer .redux-container-background .redux-background-size select,.wp-customizer .redux-container-background .redux-background-repeat,.wp-customizer .redux-container-background .redux-background-repeat select{width:100% !important} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.js deleted file mode 100755 index eb922f88..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.js +++ /dev/null @@ -1,324 +0,0 @@ -/** - * Redux Background - * Dependencies : jquery, wp media uploader - * Feature added by : Dovy Paukstys - * Date : 07 Jan 2014 - */ - -/*global redux_change, wp, redux*/ - -(function( $ ) { - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.background = redux.field_objects.background || {}; - - redux.field_objects.background.init = function( selector ) { - if ( !selector ) { - selector = $( document ).find( ".redux-group-tab:visible" ).find( '.redux-container-background:visible' ); - } - - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - // Remove the image button - el.find( '.redux-remove-background' ).unbind( 'click' ).on( - 'click', function( e ) { - e.preventDefault(); - redux.field_objects.background.removeImage( $( this ).parents( '.redux-container-background:first' ) ); - return false; - } - ); - - // Upload media button - el.find( '.redux-background-upload' ).unbind().on( - 'click', function( event ) { - redux.field_objects.background.addImage( - event, $( this ).parents( '.redux-container-background:first' ) - ); - } - ); - - el.find( '.redux-background-input' ).on( - 'change', function() { - redux.field_objects.background.preview( $( this ) ); - } - ); - - el.find( '.redux-color' ).wpColorPicker( - { - change: function( e, ui ) { - $( this ).val( ui.color.toString() ); - redux_change( $( this ) ); - $( '#' + e.target.id + '-transparency' ).removeAttr( 'checked' ); - redux.field_objects.background.preview( $( this ) ); - }, - - clear: function( e, ui ) { - $( this ).val( ui.color.toString() ); - redux_change( $( this ).parent().find( '.redux-color-init' ) ); - redux.field_objects.background.preview( $( this ) ); - } - } - ); - - // Replace and validate field on blur - el.find( '.redux-color' ).on( - 'blur', function() { - var value = $( this ).val(); - var id = '#' + $( this ).attr( 'id' ); - - if ( value === "transparent" ) { - $( this ).parent().parent().find( '.wp-color-result' ).css( - 'background-color', 'transparent' - ); - - el.find( id + '-transparency' ).attr( 'checked', 'checked' ); - } else { - if ( colorValidate( this ) === value ) { - if ( value.indexOf( "#" ) !== 0 ) { - $( this ).val( $( this ).data( 'oldcolor' ) ); - } - } - - el.find( id + '-transparency' ).removeAttr( 'checked' ); - } - } - ); - - el.find( '.redux-color' ).on( - 'focus', function() { - $( this ).data( 'oldcolor', $( this ).val() ); - } - ); - - el.find( '.redux-color' ).on( - 'keyup', function() { - var value = $( this ).val(); - var color = colorValidate( this ); - var id = '#' + $( this ).attr( 'id' ); - - if ( value === "transparent" ) { - $( this ).parent().parent().find( '.wp-color-result' ).css( - 'background-color', 'transparent' - ); - el.find( id + '-transparency' ).attr( 'checked', 'checked' ); - } else { - el.find( id + '-transparency' ).removeAttr( 'checked' ); - - if ( color && color !== $( this ).val() ) { - $( this ).val( color ); - } - } - } - ); - - // When transparency checkbox is clicked - el.find( '.color-transparency' ).on( - 'click', function() { - if ( $( this ).is( ":checked" ) ) { - el.find( '.redux-saved-color' ).val( $( '#' + $( this ).data( 'id' ) ).val() ); - el.find( '#' + $( this ).data( 'id' ) ).val( 'transparent' ); - el.find( '#' + $( this ).data( 'id' ) ).parent().parent().find( '.wp-color-result' ).css( - 'background-color', 'transparent' - ); - } else { - if ( el.find( '#' + $( this ).data( 'id' ) ).val() === 'transparent' ) { - var prevColor = $( '.redux-saved-color' ).val(); - - if ( prevColor === '' ) { - prevColor = $( '#' + $( this ).data( 'id' ) ).data( 'default-color' ); - } - - el.find( '#' + $( this ).data( 'id' ) ).parent().parent().find( '.wp-color-result' ).css( - 'background-color', prevColor - ); - el.find( '#' + $( this ).data( 'id' ) ).val( prevColor ); - } - } - redux.field_objects.background.preview( $( this ) ); - redux_change( $( this ) ); - } - ); - - var default_params = { - width: 'resolve', - triggerChange: true, - allowClear: true - }; - - var select2_handle = el.find( '.select2_params' ); - if ( select2_handle.size() > 0 ) { - var select2_params = select2_handle.val(); - - select2_params = JSON.parse( select2_params ); - default_params = $.extend( {}, default_params, select2_params ); - } - - el.find( " .redux-background-repeat, .redux-background-clip, .redux-background-origin, .redux-background-size, .redux-background-attachment, .redux-background-position" ).select2( default_params ); - - } - ); - }; - - // Update the background preview - redux.field_objects.background.preview = function( selector ) { - var parent = $( selector ).parents( '.redux-container-background:first' ); - var preview = $( parent ).find( '.background-preview' ); - - if ( !preview ) { // No preview present - return; - } - var hide = true; - - var css = 'height:' + preview.height() + 'px;'; - $( parent ).find( '.redux-background-input' ).each( - function() { - var data = $( this ).serializeArray(); - data = data[0]; - if ( data && data.name.indexOf( '[background-' ) != -1 ) { - if ( data.value !== "" ) { - hide = false; - data.name = data.name.split( '[background-' ); - data.name = 'background-' + data.name[1].replace( ']', '' ); - if ( data.name == "background-image" ) { - css += data.name + ':url("' + data.value + '");'; - } else { - css += data.name + ':' + data.value + ';'; - } - } - } - } - ); - if ( !hide ) { - preview.attr( 'style', css ).fadeIn(); - } else { - preview.slideUp(); - } - - - }; - - // Add a file via the wp.media function - redux.field_objects.background.addImage = function( event, selector ) { - event.preventDefault(); - - var frame; - var jQueryel = $( this ); - - // If the media frame already exists, reopen it. - if ( frame ) { - frame.open(); - return; - } - - // Create the media frame. - frame = wp.media( - { - multiple: false, - library: { - //type: 'image' //Only allow images - }, - // Set the title of the modal. - title: jQueryel.data( 'choose' ), - // Customize the submit button. - button: { - // Set the text of the button. - text: jQueryel.data( 'update' ) - // Tell the button not to close the modal, since we're - // going to refresh the page when the image is selected. - - } - } - ); - - // When an image is selected, run a callback. - frame.on( - 'select', function() { - // Grab the selected attachment. - var attachment = frame.state().get( 'selection' ).first(); - frame.close(); - - //console.log(attachment.attributes.type); - - if ( attachment.attributes.type !== "image" ) { - return; - } - - selector.find( '.upload' ).val( attachment.attributes.url ); - selector.find( '.upload-id' ).val( attachment.attributes.id ); - selector.find( '.upload-height' ).val( attachment.attributes.height ); - selector.find( '.upload-width' ).val( attachment.attributes.width ); - redux_change( $( selector ).find( '.upload-id' ) ); - var thumbSrc = attachment.attributes.url; - if ( typeof attachment.attributes.sizes !== 'undefined' && typeof attachment.attributes.sizes.thumbnail !== 'undefined' ) { - thumbSrc = attachment.attributes.sizes.thumbnail.url; - } else if ( typeof attachment.attributes.sizes !== 'undefined' ) { - var height = attachment.attributes.height; - for ( var key in attachment.attributes.sizes ) { - var object = attachment.attributes.sizes[key]; - if ( object.height < height ) { - height = object.height; - thumbSrc = object.url; - } - } - } else { - thumbSrc = attachment.attributes.icon; - } - selector.find( '.upload-thumbnail' ).val( thumbSrc ); - if ( !selector.find( '.upload' ).hasClass( 'noPreview' ) ) { - selector.find( '.screenshot' ).empty().hide().append( '' ).slideDown( 'fast' ); - } - - selector.find( '.redux-remove-background' ).removeClass( 'hide' );//show "Remove" button - selector.find( '.redux-background-input-properties' ).slideDown(); - redux.field_objects.background.preview( selector.find( '.upload' ) ); - } - ); - - // Finally, open the modal. - frame.open(); - }; - - // Update the background preview - redux.field_objects.background.removeImage = function( selector ) { - - // This shouldn't have been run... - if ( !selector.find( '.redux-remove-background' ).addClass( 'hide' ) ) { - return; - } - selector.find( '.redux-remove-background' ).addClass( 'hide' ); //hide "Remove" button - - selector.find( '.upload' ).val( '' ); - selector.find( '.upload-id' ).val( '' ); - selector.find( '.upload-height' ).val( '' ); - selector.find( '.upload-width' ).val( '' ); - redux_change( $( selector ).find( '.upload-id' ) ); - selector.find( '.redux-background-input-properties' ).hide(); - var screenshot = selector.find( '.screenshot' ); - - // Hide the screenshot - screenshot.slideUp(); - - selector.find( '.remove-file' ).unbind(); - // We don't display the upload button if .upload-notice is present - // This means the user doesn't have the WordPress 3.5 Media Library Support - if ( $( '.section-upload .upload-notice' ).length > 0 ) { - $( '.redux-background-upload' ).remove(); - } - }; -})( jQuery ); diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.min.js deleted file mode 100755 index 379eabd6..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.background=redux.field_objects.background||{},redux.field_objects.background.init=function(b){b||(b=a(document).find(".redux-group-tab:visible").find(".redux-container-background:visible")),a(b).each(function(){var b=a(this),c=b;if(b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),!c.is(":hidden")&&c.hasClass("redux-field-init")){c.removeClass("redux-field-init"),b.find(".redux-remove-background").unbind("click").on("click",function(b){return b.preventDefault(),redux.field_objects.background.removeImage(a(this).parents(".redux-container-background:first")),!1}),b.find(".redux-background-upload").unbind().on("click",function(b){redux.field_objects.background.addImage(b,a(this).parents(".redux-container-background:first"))}),b.find(".redux-background-input").on("change",function(){redux.field_objects.background.preview(a(this))}),b.find(".redux-color").wpColorPicker({change:function(b,c){a(this).val(c.color.toString()),redux_change(a(this)),a("#"+b.target.id+"-transparency").removeAttr("checked"),redux.field_objects.background.preview(a(this))},clear:function(b,c){a(this).val(c.color.toString()),redux_change(a(this).parent().find(".redux-color-init")),redux.field_objects.background.preview(a(this))}}),b.find(".redux-color").on("blur",function(){var c=a(this).val(),d="#"+a(this).attr("id");"transparent"===c?(a(this).parent().parent().find(".wp-color-result").css("background-color","transparent"),b.find(d+"-transparency").attr("checked","checked")):(colorValidate(this)===c&&0!==c.indexOf("#")&&a(this).val(a(this).data("oldcolor")),b.find(d+"-transparency").removeAttr("checked"))}),b.find(".redux-color").on("focus",function(){a(this).data("oldcolor",a(this).val())}),b.find(".redux-color").on("keyup",function(){var c=a(this).val(),d=colorValidate(this),e="#"+a(this).attr("id");"transparent"===c?(a(this).parent().parent().find(".wp-color-result").css("background-color","transparent"),b.find(e+"-transparency").attr("checked","checked")):(b.find(e+"-transparency").removeAttr("checked"),d&&d!==a(this).val()&&a(this).val(d))}),b.find(".color-transparency").on("click",function(){if(a(this).is(":checked"))b.find(".redux-saved-color").val(a("#"+a(this).data("id")).val()),b.find("#"+a(this).data("id")).val("transparent"),b.find("#"+a(this).data("id")).parent().parent().find(".wp-color-result").css("background-color","transparent");else if("transparent"===b.find("#"+a(this).data("id")).val()){var c=a(".redux-saved-color").val();""===c&&(c=a("#"+a(this).data("id")).data("default-color")),b.find("#"+a(this).data("id")).parent().parent().find(".wp-color-result").css("background-color",c),b.find("#"+a(this).data("id")).val(c)}redux.field_objects.background.preview(a(this)),redux_change(a(this))});var d={width:"resolve",triggerChange:!0,allowClear:!0},e=b.find(".select2_params");if(e.size()>0){var f=e.val();f=JSON.parse(f),d=a.extend({},d,f)}b.find(" .redux-background-repeat, .redux-background-clip, .redux-background-origin, .redux-background-size, .redux-background-attachment, .redux-background-position").select2(d)}})},redux.field_objects.background.preview=function(b){var c=a(b).parents(".redux-container-background:first"),d=a(c).find(".background-preview");if(d){var e=!0,f="height:"+d.height()+"px;";a(c).find(".redux-background-input").each(function(){var b=a(this).serializeArray();b=b[0],b&&-1!=b.name.indexOf("[background-")&&""!==b.value&&(e=!1,b.name=b.name.split("[background-"),b.name="background-"+b.name[1].replace("]",""),f+="background-image"==b.name?b.name+':url("'+b.value+'");':b.name+":"+b.value+";")}),e?d.slideUp():d.attr("style",f).fadeIn()}},redux.field_objects.background.addImage=function(b,c){b.preventDefault();var d,e=a(this);return d?void d.open():(d=wp.media({multiple:!1,library:{},title:e.data("choose"),button:{text:e.data("update")}}),d.on("select",function(){var b=d.state().get("selection").first();if(d.close(),"image"===b.attributes.type){c.find(".upload").val(b.attributes.url),c.find(".upload-id").val(b.attributes.id),c.find(".upload-height").val(b.attributes.height),c.find(".upload-width").val(b.attributes.width),redux_change(a(c).find(".upload-id"));var e=b.attributes.url;if("undefined"!=typeof b.attributes.sizes&&"undefined"!=typeof b.attributes.sizes.thumbnail)e=b.attributes.sizes.thumbnail.url;else if("undefined"!=typeof b.attributes.sizes){var f=b.attributes.height;for(var g in b.attributes.sizes){var h=b.attributes.sizes[g];h.height').slideDown("fast"),c.find(".redux-remove-background").removeClass("hide"),c.find(".redux-background-input-properties").slideDown(),redux.field_objects.background.preview(c.find(".upload"))}}),void d.open())},redux.field_objects.background.removeImage=function(b){if(b.find(".redux-remove-background").addClass("hide")){b.find(".redux-remove-background").addClass("hide"),b.find(".upload").val(""),b.find(".upload-id").val(""),b.find(".upload-height").val(""),b.find(".upload-width").val(""),redux_change(a(b).find(".upload-id")),b.find(".redux-background-input-properties").hide();var c=b.find(".screenshot");c.slideUp(),b.find(".remove-file").unbind(),a(".section-upload .upload-notice").length>0&&a(".redux-background-upload").remove()}}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.php deleted file mode 100755 index 74efb684..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.php +++ /dev/null @@ -1,430 +0,0 @@ -. - * - * @package ReduxFramework - * @subpackage Field_Background - * @author Dovy Paukstys - * @version 3.1.5 - */ -// Exit if accessed directly - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - -// Don't duplicate me! - if ( ! class_exists( 'ReduxFramework_background' ) ) { - - /** - * Main ReduxFramework_background class - * - * @since 3.1.5 - */ - class ReduxFramework_background { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 3.1.5 - * @access public - * @return void - */ - function __construct( $field = array(), $value = '', $parent ) { - - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - - $defaults = array( - 'background-color' => true, - 'background-repeat' => true, - 'background-attachment' => true, - 'background-position' => true, - 'background-image' => true, - 'background-gradient' => false, - 'background-clip' => false, - 'background-origin' => false, - 'background-size' => true, - 'preview_media' => false, - 'preview' => true, - 'preview_height' => '200px', - 'transparent' => true, - ); - - $this->field = wp_parse_args( $this->field, $defaults ); - - // No errors please - $defaults = array( - 'background-color' => '', - 'background-repeat' => '', - 'background-attachment' => '', - 'background-position' => '', - 'background-image' => '', - 'background-clip' => '', - 'background-origin' => '', - 'background-size' => '', - 'media' => array(), - ); - - $this->value = wp_parse_args( $this->value, $defaults ); - - $defaults = array( - 'id' => '', - 'width' => '', - 'height' => '', - 'thumbnail' => '', - ); - - $this->value['media'] = wp_parse_args( $this->value['media'], $defaults ); - - // select2 args - if ( isset( $this->field['select2'] ) ) { // if there are any let's pass them to js - $select2_params = json_encode( $this->field['select2'] ); - $select2_params = htmlspecialchars( $select2_params, ENT_QUOTES ); - - echo ''; - } - - if ( $this->field['background-color'] === true ) { - - if ( isset( $this->value['color'] ) && empty( $this->value['background-color'] ) ) { - $this->value['background-color'] = $this->value['color']; - } - - echo ''; - echo ''; - - if ( ! isset( $this->field['transparent'] ) || $this->field['transparent'] !== false ) { - $tChecked = ""; - if ( $this->value['background-color'] == "transparent" ) { - $tChecked = ' checked="checked"'; - } - echo ''; - } - - if ( $this->field['background-repeat'] === true || $this->field['background-position'] === true || $this->field['background-attachment'] === true ) { - echo '
    '; - } - } - - - if ( $this->field['background-repeat'] === true ) { - $array = array( - 'no-repeat' => 'No Repeat', - 'repeat' => 'Repeat All', - 'repeat-x' => 'Repeat Horizontally', - 'repeat-y' => 'Repeat Vertically', - 'inherit' => 'Inherit', - ); - echo ''; - } - - if ( $this->field['background-clip'] === true ) { - $array = array( - 'inherit' => 'Inherit', - 'border-box' => 'Border Box', - 'content-box' => 'Content Box', - 'padding-box' => 'Padding Box', - ); - echo ''; - } - - if ( $this->field['background-origin'] === true ) { - $array = array( - 'inherit' => 'Inherit', - 'border-box' => 'Border Box', - 'content-box' => 'Content Box', - 'padding-box' => 'Padding Box', - ); - echo ''; - } - - if ( $this->field['background-size'] === true ) { - $array = array( - 'inherit' => 'Inherit', - 'cover' => 'Cover', - 'contain' => 'Contain', - ); - echo ''; - } - - if ( $this->field['background-attachment'] === true ) { - $array = array( - 'fixed' => 'Fixed', - 'scroll' => 'Scroll', - 'inherit' => 'Inherit', - ); - echo ''; - } - - if ( $this->field['background-position'] === true ) { - $array = array( - 'left top' => 'Left Top', - 'left center' => 'Left center', - 'left bottom' => 'Left Bottom', - 'center top' => 'Center Top', - 'center center' => 'Center Center', - 'center bottom' => 'Center Bottom', - 'right top' => 'Right Top', - 'right center' => 'Right center', - 'right bottom' => 'Right Bottom', - ); - echo ''; - } - - if ( $this->field['background-image'] === true ) { - echo '
    '; - - if ( empty( $this->value ) && ! empty( $this->field['default'] ) ) { // If there are standard values and value is empty - if ( is_array( $this->field['default'] ) ) { - if ( ! empty( $this->field['default']['media']['id'] ) ) { - $this->value['media']['id'] = $this->field['default']['media']['id']; - } else if ( ! empty( $this->field['default']['id'] ) ) { - $this->value['media']['id'] = $this->field['default']['id']; - } - - if ( ! empty( $this->field['default']['url'] ) ) { - $this->value['background-image'] = $this->field['default']['url']; - } else if ( ! empty( $this->field['default']['media']['url'] ) ) { - $this->value['background-image'] = $this->field['default']['media']['url']; - } else if ( ! empty( $this->field['default']['background-image'] ) ) { - $this->value['background-image'] = $this->field['default']['background-image']; - } - } else { - if ( is_numeric( $this->field['default'] ) ) { // Check if it's an attachment ID - $this->value['media']['id'] = $this->field['default']; - } else { // Must be a URL - $this->value['background-image'] = $this->field['default']; - } - } - } - - - if ( empty( $this->value['background-image'] ) && ! empty( $this->value['media']['id'] ) ) { - $img = wp_get_attachment_image_src( $this->value['media']['id'], 'full' ); - $this->value['background-image'] = $img[0]; - $this->value['media']['width'] = $img[1]; - $this->value['media']['height'] = $img[2]; - } - - $hide = 'hide '; - - if ( ( isset( $this->field['preview_media'] ) && $this->field['preview_media'] === false ) ) { - $this->field['class'] .= " noPreview"; - } - - if ( ( ! empty( $this->field['background-image'] ) && $this->field['background-image'] === true ) || isset( $this->field['preview'] ) && $this->field['preview'] === false ) { - $hide = ''; - } - - $placeholder = isset( $this->field['placeholder'] ) ? $this->field['placeholder'] : __( 'No media selected', 'redux-framework' ); - - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - - //Preview - $hide = ''; - - if ( ( isset( $this->field['preview_media'] ) && $this->field['preview_media'] === false ) || empty( $this->value['background-image'] ) ) { - $hide = 'hide '; - } - - if ( empty( $this->value['media']['thumbnail'] ) && ! empty( $this->value['background-image'] ) ) { // Just in case - if ( ! empty( $this->value['media']['id'] ) ) { - $image = wp_get_attachment_image_src( $this->value['media']['id'], array( - 150, - 150 - ) ); - $this->value['media']['thumbnail'] = $image[0]; - } else { - $this->value['media']['thumbnail'] = $this->value['background-image']; - } - } - - echo '
    '; - echo ''; - echo ''; - echo ''; - echo '
    '; - - //Upload controls DIV - echo '
    '; - - //If the user has WP3.5+ show upload/remove button - echo '' . __( 'Upload', 'redux-framework' ) . ''; - - $hide = ''; - if ( empty( $this->value['background-image'] ) || $this->value['background-image'] == '' ) { - $hide = ' hide'; - } - - echo '' . __( 'Remove', 'redux-framework' ) . ''; - - echo '
    '; - } - - - /** - * Preview - * */ - if ( ! isset( $this->field['preview'] ) || $this->field['preview'] !== false ): - - $css = $this->getCSS(); - if ( empty( $css ) ) { - $css = "display:none;"; - } - $css .= "height: " . $this->field['preview_height'] . ";"; - echo '

     

    '; - - endif; - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue() { - if ( function_exists( 'wp_enqueue_media' ) ) { - wp_enqueue_media(); - } else { - if (!wp_script_is ( 'media-upload' )) { - wp_enqueue_script( 'media-upload' ); - } - } - - if (!wp_style_is ( 'select2-css' )) { - wp_enqueue_style( 'select2-css' ); - } - - if (!wp_style_is ( 'wp-color-picker' )) { - wp_enqueue_style( 'wp-color-picker' ); - } - - if (!wp_script_is ( 'redux-field-background-js' )) { - wp_enqueue_script( - 'redux-field-background-js', - ReduxFramework::$_url . 'inc/fields/background/field_background' . Redux_Functions::isMin() . '.js', - array( 'jquery', 'wp-color-picker', 'select2-js', 'redux-js' ), - time(), - true - ); - } - - if ($this->parent->args['dev_mode']) { - if (!wp_style_is ( 'redux-field-background-css' )) { - wp_enqueue_style( - 'redux-field-background-css', - ReduxFramework::$_url . 'inc/fields/background/field_background.css', - array(), - time(), - 'all' - ); - } - - if (!wp_style_is ( 'redux-color-picker-css' )) { - wp_enqueue_style( 'redux-color-picker-css' ); - } - } - } - - public static function getCSS( $value = array() ) { - - $css = ''; - - if ( ! empty( $value ) && is_array( $value ) ) { - foreach ( $value as $key => $value ) { - if ( ! empty( $value ) && $key != "media" ) { - if ( $key == "background-image" ) { - $css .= $key . ":url('" . $value . "');"; - } else { - $css .= $key . ":" . $value . ";"; - } - } - } - } - - return $css; - } - - public function output() { - $style = $this->getCSS( $this->value ); - - if ( ! empty( $style ) ) { - - if ( ! empty( $this->field['output'] ) && is_array( $this->field['output'] ) ) { - $keys = implode( ",", $this->field['output'] ); - $this->parent->outputCSS .= $keys . "{" . $style . '}'; - } - - if ( ! empty( $this->field['compiler'] ) && is_array( $this->field['compiler'] ) ) { - $keys = implode( ",", $this->field['compiler'] ); - $this->parent->compilerCSS .= $keys . "{" . $style . '}'; - } - } - } - } - } diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.scss deleted file mode 100755 index 634f0f7c..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/background/field_background.scss +++ /dev/null @@ -1,59 +0,0 @@ -.redux-main { - .redux-container-background { - .redux-background-position, - .redux-background-position select, - .redux-background-attachment, - .redux-background-attachment select, - .redux-background-clip, - .redux-background-clip select, - .redux-background-origin, - .redux-background-origin select, - .redux-background-size, - .redux-background-size select, - .redux-background-repeat, - .redux-background-repeat select { - width:200px !important; - margin-right: 10px; - margin-bottom: 7px; - } - - .background-preview { - display:block; - width: 100%; - margin: 5px 0 10px; - border:1px dotted lightgray; - } - - .select2-container { - margin-right: 10px; - margin-bottom: 10px; - } - - .wp-picker-container { - margin-bottom: 10px; - } - - .upload { - width: 100%; - margin-bottom: 8px; - } - } - - .redux-container-select { - li.ui-state-highlight { - height: 20px; - margin-top:2px; - margin-left: 5px; - width: 64px; - margin-bottom: 0; - } - } -} - -.wp-customizer { - .redux-container-background { - .redux-background-position, .redux-background-position select, .redux-background-attachment, .redux-background-attachment select, .redux-background-clip, .redux-background-clip select, .redux-background-origin, .redux-background-origin select, .redux-background-size, .redux-background-size select, .redux-background-repeat, .redux-background-repeat select { - width: 100% !important; - } - } -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.css deleted file mode 100755 index dd931cee..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.css +++ /dev/null @@ -1 +0,0 @@ -.redux-container-border .select2-container{float:left;display:block;margin-right:10px}.redux-container-border .select_wrapper{float:left;width:inherit}.redux-container-border .select_wrapper select{width:80px;float:left}.redux-container-border .field-border-input{margin-right:10px;margin-bottom:7px}.redux-container-border .wp-picker-container{margin-top:2px}@media screen and (max-width: 782px){.redux-container-border .field-border-input input{display:inline-block !important;width:100px !important}.redux-container-border .field-border-input .add-on{padding:7px 4px;font-size:16px;line-height:1.5}.redux-container-border .select_wrapper{margin-top:6px}} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.js deleted file mode 100755 index 62f43bc0..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.js +++ /dev/null @@ -1,131 +0,0 @@ -/* - Field Border (border) - */ - -/*global redux_change, wp, redux*/ - -(function( $ ) { - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.border = redux.field_objects.border || {}; - - redux.field_objects.border.init = function( selector ) { - if ( !selector ) { - selector = $( document ).find( ".redux-group-tab:visible" ).find( '.redux-container-border:visible' ); - } - - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - el.find( ".redux-border-top, .redux-border-right, .redux-border-bottom, .redux-border-left, .redux-border-all" ).numeric( - { - allowMinus: false - } - ); - - var default_params = { - triggerChange: true, - allowClear: true - }; - - var select2_handle = el.find( '.redux-container-border' ).find( '.select2_params' ); - - if ( select2_handle.size() > 0 ) { - var select2_params = select2_handle.val(); - - select2_params = JSON.parse( select2_params ); - default_params = $.extend( {}, default_params, select2_params ); - } - - el.find( ".redux-border-style" ).select2( default_params ); - - el.find( '.redux-border-input' ).on( - 'change', function() { - var units = $( this ).parents( '.redux-field:first' ).find( '.field-units' ).val(); - if ( $( this ).parents( '.redux-field:first' ).find( '.redux-border-units' ).length !== 0 ) { - units = $( this ).parents( '.redux-field:first' ).find( '.redux-border-units option:selected' ).val(); - } - var value = $( this ).val(); - if ( typeof units !== 'undefined' && value ) { - value += units; - } - if ( $( this ).hasClass( 'redux-border-all' ) ) { - $( this ).parents( '.redux-field:first' ).find( '.redux-border-value' ).each( - function() { - $( this ).val( value ); - } - ); - } else { - $( '#' + $( this ).attr( 'rel' ) ).val( value ); - } - } - ); - - el.find( '.redux-border-units' ).on( - 'change', function() { - $( this ).parents( '.redux-field:first' ).find( '.redux-border-input' ).change(); - } - ); - - el.find( '.redux-color-init' ).wpColorPicker( - { - change: function( e, ui ) { - $( this ).val( ui.color.toString() ); - redux_change( $( this ) ); - el.find( '#' + e.target.getAttribute( 'data-id' ) + '-transparency' ).removeAttr( 'checked' ); - }, - - clear: function( e, ui ) { - $( this ).val( ui.color.toString() ); - redux_change( $( this ).parent().find( '.redux-color-init' ) ); - } - } - ); - - el.find( '.redux-color' ).on( - 'keyup', function() { - var color = colorValidate( this ); - - if ( color && color !== $( this ).val() ) { - $( this ).val( color ); - } - } - ); - - // Replace and validate field on blur - el.find( '.redux-color' ).on( - 'blur', function() { - var value = $( this ).val(); - - if ( colorValidate( this ) === value ) { - if ( value.indexOf( "#" ) !== 0 ) { - $( this ).val( $( this ).data( 'oldcolor' ) ); - } - } - } - ); - - // Store the old valid color on keydown - el.find( '.redux-color' ).on( - 'keydown', function() { - $( this ).data( 'oldkeypress', $( this ).val() ); - } - ); - } - ); - }; -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.min.js deleted file mode 100755 index cd82ba8e..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.border=redux.field_objects.border||{},redux.field_objects.border.init=function(b){b||(b=a(document).find(".redux-group-tab:visible").find(".redux-container-border:visible")),a(b).each(function(){var b=a(this),c=b;if(b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),!c.is(":hidden")&&c.hasClass("redux-field-init")){c.removeClass("redux-field-init"),b.find(".redux-border-top, .redux-border-right, .redux-border-bottom, .redux-border-left, .redux-border-all").numeric({allowMinus:!1});var d={triggerChange:!0,allowClear:!0},e=b.find(".redux-container-border").find(".select2_params");if(e.size()>0){var f=e.val();f=JSON.parse(f),d=a.extend({},d,f)}b.find(".redux-border-style").select2(d),b.find(".redux-border-input").on("change",function(){var b=a(this).parents(".redux-field:first").find(".field-units").val();0!==a(this).parents(".redux-field:first").find(".redux-border-units").length&&(b=a(this).parents(".redux-field:first").find(".redux-border-units option:selected").val());var c=a(this).val();"undefined"!=typeof b&&c&&(c+=b),a(this).hasClass("redux-border-all")?a(this).parents(".redux-field:first").find(".redux-border-value").each(function(){a(this).val(c)}):a("#"+a(this).attr("rel")).val(c)}),b.find(".redux-border-units").on("change",function(){a(this).parents(".redux-field:first").find(".redux-border-input").change()}),b.find(".redux-color-init").wpColorPicker({change:function(c,d){a(this).val(d.color.toString()),redux_change(a(this)),b.find("#"+c.target.getAttribute("data-id")+"-transparency").removeAttr("checked")},clear:function(b,c){a(this).val(c.color.toString()),redux_change(a(this).parent().find(".redux-color-init"))}}),b.find(".redux-color").on("keyup",function(){var b=colorValidate(this);b&&b!==a(this).val()&&a(this).val(b)}),b.find(".redux-color").on("blur",function(){var b=a(this).val();colorValidate(this)===b&&0!==b.indexOf("#")&&a(this).val(a(this).data("oldcolor"))}),b.find(".redux-color").on("keydown",function(){a(this).data("oldkeypress",a(this).val())})}})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.php deleted file mode 100755 index 3caa3afb..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.php +++ /dev/null @@ -1,323 +0,0 @@ -. - * - * @package Redux_Field - * @subpackage Border - * @version 3.0.0 - */ - -// Exit if accessed directly -if ( ! defined( 'ABSPATH' ) ) { - exit; -} - -// Don't duplicate me! -if ( ! class_exists( 'ReduxFramework_border' ) ) { - - class ReduxFramework_border { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since ReduxFramework 1.0.0 - */ - function __construct( $field = array(), $value = '', $parent ) { - - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } //function - - private function stripAlphas($s) { - - // Regex is our friend. THERE ARE FOUR LIGHTS!! - return preg_replace('/[^\d.-]/', '', $s); - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since ReduxFramework 1.0.0 - */ - function render() { - - // No errors please - $defaults = array( - 'top' => true, - 'bottom' => true, - 'all' => true, - 'style' => true, - 'color' => true, - 'left' => true, - 'right' => true, - ); - - $this->field = wp_parse_args( $this->field, $defaults ); - - $defaults = array( - 'top' => '', - 'right' => '', - 'bottom' => '', - 'left' => '', - 'color' => '', - 'style' => '', - ); - - $this->value = wp_parse_args( $this->value, $defaults ); - - $value = array( - 'top' => isset( $this->value['border-top'] ) ? filter_var( $this->value['border-top'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ) : filter_var( $this->value['top'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ), - 'right' => isset( $this->value['border-right'] ) ? filter_var( $this->value['border-right'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ) : filter_var( $this->value['right'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ), - 'bottom' => isset( $this->value['border-bottom'] ) ? filter_var( $this->value['border-bottom'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ) : filter_var( $this->value['bottom'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ), - 'left' => isset( $this->value['border-left'] ) ? filter_var( $this->value['border-left'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ) : filter_var( $this->value['left'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ), - 'color' => isset( $this->value['border-color'] ) ? $this->value['border-color'] : $this->value['color'], - 'style' => isset( $this->value['border-style'] ) ? $this->value['border-style'] : $this->value['style'] - ); - - if ( ( isset( $this->value['width'] ) || isset( $this->value['border-width'] ) ) ) { - if ( isset( $this->value['border-width'] ) && ! empty( $this->value['border-width'] ) ) { - $this->value['width'] = $this->value['border-width']; - } - - $this->value['width'] = $this->stripAlphas($this->value['width']); - - $value['top'] = $this->value['width']; - $value['right'] = $this->value['width']; - $value['bottom'] = $this->value['width']; - $value['left'] = $this->value['width']; - } - - $this->value = $value; - - $defaults = array( - 'top' => '', - 'right' => '', - 'bottom' => '', - 'left' => '', - ); - - $this->value = wp_parse_args( $this->value, $defaults ); - - if ( isset( $this->field['select2'] ) ) { // if there are any let's pass them to js - $select2_params = json_encode( $this->field['select2'] ); - $select2_params = htmlspecialchars( $select2_params, ENT_QUOTES ); - - echo ''; - } - - - echo ''; - - if ( isset( $this->field['all'] ) && $this->field['all'] == true ) { - echo '
    '; - } - - echo ''; - echo ''; - echo ''; - echo ''; - - if ( ! isset( $this->field['all'] ) || $this->field['all'] !== true ) { - /** - * Top - * */ - if ( $this->field['top'] === true ) { - echo '
    '; - } - - /** - * Right - * */ - if ( $this->field['right'] === true ) { - echo '
    '; - } - - /** - * Bottom - * */ - if ( $this->field['bottom'] === true ) { - echo '
    '; - } - - /** - * Left - * */ - if ( $this->field['left'] === true ) { - echo '
    '; - } - } - - /** - * Border-style - * */ - if ( $this->field['style'] != false ) { - $options = array( - 'solid' => 'Solid', - 'dashed' => 'Dashed', - 'dotted' => 'Dotted', - 'double' => "Double", - 'none' => 'None' - ); - echo ''; - } else { - echo ''; - } - - /** - * Color - * */ - if ( $this->field['color'] != false ) { - $default = isset( $this->field['default']['border-color'] ) ? $this->field['default']['border-color'] : ''; - - - if ( empty( $default ) ) { - $default = ( isset( $this->field['default']['color'] ) ) ? $this->field['default']['color'] : '#ffffff'; - } - - echo ''; - } else { - echo ''; - } - } - - //function - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since ReduxFramework 1.0.0 - */ - function enqueue() { - $min = Redux_Functions::isMin(); - - if (!wp_style_is ( 'select2-css' )) { - wp_enqueue_style( 'select2-css' ); - } - - if (!wp_style_is ( 'wp-color-picker' )) { - wp_enqueue_style( 'wp-color-picker' ); - } - - if (!wp_script_is ( 'redux-field-border-js' )) { - wp_enqueue_script( - 'redux-field-border-js', - ReduxFramework::$_url . 'inc/fields/border/field_border' . $min . '.js', - array( 'jquery', 'select2-js', 'wp-color-picker', 'redux-js' ), - time(), - true - ); - } - - if ($this->parent->args['dev_mode']) { - if (!wp_style_is ( 'redux-color-picker-css' )) { - wp_enqueue_style( 'redux-color-picker-css' ); - } - - if (!wp_style_is ( 'redux-field-border-css' )) { - wp_enqueue_style( - 'redux-field-border-css', - ReduxFramework::$_url . 'inc/fields/border/field_border.css', - array(), - time(), - 'all' - ); - } - } - } //function - - public function output() { - if ( isset( $this->field['all'] ) && true == $this->field['all'] ) { - $borderWidth = isset( $this->value['border-width'] ) ? $this->value['border-width'] : '0px'; - $val = isset( $this->value['border-top'] ) ? $this->value['border-top'] : $borderWidth; - - $this->value['border-top'] = $val; - $this->value['border-bottom'] = $val; - $this->value['border-left'] = $val; - $this->value['border-right'] = $val; - } - - $cleanValue = array( - 'color' => ! empty( $this->value['border-color'] ) ? $this->value['border-color'] : '', - 'style' => ! empty( $this->value['border-style'] ) ? $this->value['border-style'] : '' - ); - - $borderWidth = ''; - if ( isset( $this->value['border-width'] ) ) { - $borderWidth = $this->value['border-width']; - } - - $this->field['top'] = isset( $this->field['top'] ) ? $this->field['top'] : true; - $this->field['bottom'] = isset( $this->field['bottom'] ) ? $this->field['bottom'] : true; - $this->field['left'] = isset( $this->field['left'] ) ? $this->field['left'] : true; - $this->field['right'] = isset( $this->field['right'] ) ? $this->field['right'] : true; - - if ( $this->field['top'] === true ) { - $cleanValue['top'] = ! empty( $this->value['border-top'] ) ? $this->value['border-top'] : $borderWidth; - } - - if ( $this->field['bottom'] == true ) { - $cleanValue['bottom'] = ! empty( $this->value['border-bottom'] ) ? $this->value['border-bottom'] : $borderWidth; - } - - if ( $this->field['left'] === true ) { - $cleanValue['left'] = ! empty( $this->value['border-left'] ) ? $this->value['border-left'] : $borderWidth; - } - - if ( $this->field['right'] === true ) { - $cleanValue['right'] = ! empty( $this->value['border-right'] ) ? $this->value['border-right'] : $borderWidth; - } - - $style = ""; - - //absolute, padding, margin - if ( ! isset( $this->field['all'] ) || $this->field['all'] != true ) { - foreach ( $cleanValue as $key => $value ) { - if ( $key == "color" || $key == "style" ) { - continue; - } - if (!empty($value)) { - $style .= 'border-' . $key . ':' . $value . ' ' . $cleanValue['style'] . ' ' . $cleanValue['color'] . ';'; - } - } - } else { - if (!empty($cleanValue['top'])) { - $style .= 'border:' . $cleanValue['top'] . ' ' . $cleanValue['style'] . ' ' . $cleanValue['color'] . ';'; - } - } - - if ( ! empty( $this->field['output'] ) && is_array( $this->field['output'] ) ) { - $keys = implode( ",", $this->field['output'] ); - - if (!empty($style)) { - $this->parent->outputCSS .= $keys . "{" . $style . '}'; - } - } - - if ( ! empty( $this->field['compiler'] ) && is_array( $this->field['compiler'] ) ) { - $keys = implode( ",", $this->field['compiler'] ); - - if (!empty($style)) { - $this->parent->compilerCSS .= $keys . "{" . $style . '}'; - } - } - } - } //class -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.scss deleted file mode 100755 index 54e93dd0..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/border/field_border.scss +++ /dev/null @@ -1,47 +0,0 @@ -.redux-container-border { - .select2-container { - float: left; - display: block; - margin-right: 10px; - } - - .select_wrapper { - float: left; - select { - width: 80px; - float: left; - - } - width: inherit; - } - - .field-border-input { - margin-right: 10px; - margin-bottom: 7px; - } - - .wp-picker-container { - margin-top: 2px; - } -} - -@media screen and (max-width: 782px) { - .redux-container-border { - .field-border-input { - input { - display: inline-block !important; - width: 100px !important; - } - - .add-on { - padding: 7px 4px; - font-size: 16px; - line-height: 1.5; - } - } - - .select_wrapper { - margin-top: 6px; - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/button_set/field_button_set.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/button_set/field_button_set.js deleted file mode 100755 index fdce3ae1..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/button_set/field_button_set.js +++ /dev/null @@ -1,56 +0,0 @@ -/* - Field Button Set (button_set) - */ - -/*global jQuery, document, redux*/ - -(function( $ ) { - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.button_set = redux.field_objects.button_set || {}; - - $( document ).ready( - function() { - //redux.field_objects.button_set.init(); - if ( $.fn.button.noConflict !== undefined ) { - var btn = $.fn.button.noConflict(); - $.fn.btn = btn; - } - } - ); - - redux.field_objects.button_set.init = function( selector ) { - if ( !selector ) { - selector = $( document ).find( ".redux-group-tab:visible" ).find( '.redux-container-button_set:visible' ); - } - - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - el.find( '.buttonset' ).each( - function() { - if ( $( this ).is( ':checkbox' ) ) { - $( this ).find( '.buttonset-item' ).button(); - } - - $( this ).buttonset(); - } - ); - } - ); - - }; -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/button_set/field_button_set.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/button_set/field_button_set.min.js deleted file mode 100755 index ca31a658..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/button_set/field_button_set.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.button_set=redux.field_objects.button_set||{},a(document).ready(function(){if(void 0!==a.fn.button.noConflict){var b=a.fn.button.noConflict();a.fn.btn=b}}),redux.field_objects.button_set.init=function(b){b||(b=a(document).find(".redux-group-tab:visible").find(".redux-container-button_set:visible")),a(b).each(function(){var b=a(this),c=b;b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),c.is(":hidden")||c.hasClass("redux-field-init")&&(c.removeClass("redux-field-init"),b.find(".buttonset").each(function(){a(this).is(":checkbox")&&a(this).find(".buttonset-item").button(),a(this).buttonset()}))})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/button_set/field_button_set.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/button_set/field_button_set.php deleted file mode 100755 index 590835d9..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/button_set/field_button_set.php +++ /dev/null @@ -1,154 +0,0 @@ -. - * - * @package Redux_Field - * @subpackage Button_Set - * @author Daniel J Griffiths (Ghost1227) - * @author Dovy Paukstys - * @version 3.0.0 - */ - -// Exit if accessed directly - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - -// Don't duplicate me! - if ( ! class_exists( 'ReduxFramework_button_set' ) ) { - - /** - * Main ReduxFramework_button_set class - * - * @since 1.0.0 - */ - class ReduxFramework_button_set { - - /** - * Holds configuration settings for each field in a model. - * Defining the field options - * array['fields'] array Defines the fields to be shown by scaffolding. - * [fieldName] array Defines the options for a field, or just enables the field if array is not applied. - * ['name'] string Overrides the field name (default is the array key) - * ['model'] string (optional) Overrides the model if the field is a belongsTo associated value. - * ['width'] string Defines the width of the field for paginate views. Examples are "100px" or "auto" - * ['align'] string Alignment types for paginate views (left, right, center) - * ['format'] string Formatting options for paginate fields. Options include ('currency','nice','niceShort','timeAgoInWords' or a valid Date() format) - * ['title'] string Changes the field name shown in views. - * ['desc'] string The description shown in edit/create views. - * ['readonly'] boolean True prevents users from changing the value in edit/create forms. - * ['type'] string Defines the input type used by the Form helper (example 'password') - * ['options'] array Defines a list of string options for drop down lists. - * ['editor'] boolean If set to True will show a WYSIWYG editor for this field. - * ['default'] string The default value for create forms. - * - * @param array $arr (See above) - * - * @return Object A new editor object. - * */ - static $_properties = array( - 'id' => 'Identifier', - ); - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct( $field = array(), $value = '', $parent ) { - - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - if ( !empty( $this->field['data'] ) && empty( $this->field['options'] ) ) { - if ( empty( $this->field['args'] ) ) { - $this->field['args'] = array(); - } - - $this->field['options'] = $this->parent->get_wordpress_data( $this->field['data'], $this->field['args'] ); - - if ( empty( $this->field['options'] ) ) { - return; - } - } - - // multi => true renders the field multi-selectable (checkbox vs radio) - echo '
    '; - $i = 0; - foreach ( $this->field['options'] as $k => $v ) { - - $selected = ''; - if ( isset( $this->field['multi'] ) && $this->field['multi'] == true ) { - $type = "checkbox"; - $multi_suffix = '[]'; - - if ( ! empty( $this->value ) && ! is_array( $this->value ) ) { - $this->value = array( $this->value ); - } - - if ( is_array( $this->value ) && in_array( $k, $this->value ) ) { - $selected = 'checked="checked"'; - } - - } else { - $multi_suffix = ""; - $type = "radio"; - - if ( is_scalar( $this->value ) ) { - $selected = checked( $this->value, $k, false ); - } - } - - echo ''; - echo ''; - } - - echo '
    '; - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue() { - - if (!wp_script_is ( 'redux-field-button-set-js' )) { - wp_enqueue_script( - 'redux-field-button-set-js', - ReduxFramework::$_url . 'inc/fields/button_set/field_button_set' . Redux_Functions::isMin() . '.js', - array( 'jquery', 'jquery-ui-core', 'redux-js' ), - time(), - true - ); - } - } - } - } \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.css deleted file mode 100755 index f50c8561..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.css +++ /dev/null @@ -1 +0,0 @@ -.redux-container-checkbox label{vertical-align:top;width:100%}.redux-container-checkbox label .field-desc{margin-top:0;float:left;width:93%;clear:none} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.js deleted file mode 100755 index ed72de33..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Redux Checkbox - * Dependencies : jquery - * Feature added by : Dovy Paukstys - * Date : 17 June 2014 - */ - -/*global redux_change, wp, redux*/ - -(function( $ ) { - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.checkbox = redux.field_objects.checkbox || {}; - - $( document ).ready( - function() { - //redux.field_objects.checkbox.init(); - } - ); - - redux.field_objects.checkbox.init = function( selector ) { - if ( !selector ) { - selector = $( document ).find( ".redux-group-tab:visible" ).find( '.redux-container-checkbox:visible' ); - } - - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - el.find( '.checkbox' ).on( - 'click', function( e ) { - var val = 0; - if ( $( this ).is( ':checked' ) ) { - val = $( this ).parent().find( '.checkbox-check' ).attr( 'data-val' ); - } - $( this ).parent().find( '.checkbox-check' ).val( val ); - redux_change( $( this ) ); - } - ); - } - ); - }; -})( jQuery ); diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.min.js deleted file mode 100755 index 602a878e..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.checkbox=redux.field_objects.checkbox||{},a(document).ready(function(){}),redux.field_objects.checkbox.init=function(b){b||(b=a(document).find(".redux-group-tab:visible").find(".redux-container-checkbox:visible")),a(b).each(function(){var b=a(this),c=b;b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),c.is(":hidden")||c.hasClass("redux-field-init")&&(c.removeClass("redux-field-init"),b.find(".checkbox").on("click",function(b){var c=0;a(this).is(":checked")&&(c=a(this).parent().find(".checkbox-check").attr("data-val")),a(this).parent().find(".checkbox-check").val(c),redux_change(a(this))}))})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.php deleted file mode 100755 index 6ccdcbe4..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.php +++ /dev/null @@ -1,159 +0,0 @@ -. - * - * @package ReduxFramework - * @subpackage Field_Checkbox - * @author Daniel J Griffiths (Ghost1227) - * @author Dovy Paukstys - * @version 3.0.0 - */ -// Exit if accessed directly -if ( !defined ( 'ABSPATH' ) ) { - exit; -} - -// Don't duplicate me! -if ( !class_exists ( 'ReduxFramework_checkbox' ) ) { - - /** - * Main ReduxFramework_checkbox class - * - * @since 1.0.0 - */ - class ReduxFramework_checkbox { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct ( $field = array(), $value = '', $parent ) { - - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render () { - if( !empty( $this->field['data'] ) && empty( $this->field['options'] ) ) { - if (empty($this->field['args'])) { - $this->field['args'] = array(); - } - - $this->field['options'] = $this->parent->get_wordpress_data($this->field['data'], $this->field['args']); - if (empty($this->field['options'])) { - return; - } - } - - $this->field[ 'data_class' ] = ( isset ( $this->field[ 'multi_layout' ] ) ) ? 'data-' . $this->field[ 'multi_layout' ] : 'data-full'; - - if ( !empty ( $this->field[ 'options' ] ) && ( is_array ( $this->field[ 'options' ] ) || is_array ( $this->field[ 'default' ] ) ) ) { - - echo '
      '; - - if ( !isset ( $this->value ) ) { - $this->value = array(); - } - - if ( !is_array ( $this->value ) ) { - $this->value = array(); - } - - if ( empty ( $this->field[ 'options' ] ) && isset ( $this->field[ 'default' ] ) && is_array ( $this->field[ 'default' ] ) ) { - $this->field[ 'options' ] = $this->field[ 'default' ]; - } - - foreach ( $this->field[ 'options' ] as $k => $v ) { - - if ( empty ( $this->value[ $k ] ) ) { - $this->value[ $k ] = ""; - } - - echo '
    • '; - echo ''; - echo '
    • '; - } - - echo '
    '; - } else if ( empty ( $this->field[ 'data' ] ) ) { - - echo (!empty ( $this->field[ 'desc' ] ) ) ? '
    '; - } - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue () { - - if ($this->parent->args['dev_mode']) { - wp_enqueue_style ( - 'redux-field-checkbox-css', - ReduxFramework::$_url . 'inc/fields/checkbox/field_checkbox.css', - array(), - time (), - 'all' - ); - } - - wp_enqueue_script ( - 'redux-field-checkbox-js', - ReduxFramework::$_url . 'inc/fields/checkbox/field_checkbox' . Redux_Functions::isMin () . '.js', - array( 'jquery', 'redux-js' ), - time (), - true - ); - } - } - -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.scss deleted file mode 100755 index 7dca5ebe..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/checkbox/field_checkbox.scss +++ /dev/null @@ -1,13 +0,0 @@ -.redux-container-checkbox { - label { - vertical-align: top; - width: 100%; - - .field-desc { - margin-top: 0; - float: left; - width: 93%; - clear: none; - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color/field_color.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color/field_color.js deleted file mode 100755 index 3c26f06a..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color/field_color.js +++ /dev/null @@ -1,175 +0,0 @@ -/* - Field Color (color) - */ - -/*global jQuery, document, redux_change, redux*/ - -(function( $ ) { - 'use strict'; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.color = redux.field_objects.color || {}; - - $( document ).ready( - function() { - - } - ); - - redux.field_objects.color.init = function( selector ) { - - if ( !selector ) { - selector = $( document ).find( ".redux-group-tab:visible" ).find( '.redux-container-color:visible' ); - } - - $( selector ).each( - function() { - - var el = $( this ); - var parent = el; - - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } -// var $control = el.find( '.redux-color-init' ), -// -// value = $control.val().replace( /\s+/g, '' ), -// alpha_val = 100, -// $alpha, $alpha_output; -// //console.log($control); -// if ( value.match( /rgba\(\d+\,\d+\,\d+\,([^\)]+)\)/ ) ) { -// alpha_val = parseFloat( value.match( /rgba\(\d+\,\d+\,\d+\,([^\)]+)\)/ )[ 1 ] ) * 100; -// } - el.find( '.redux-color-init' ).wpColorPicker( - { - change: function( e, ui ) { - $( this ).val( ui.color.toString() ); - redux_change( $( this ) ); - el.find( '#' + e.target.getAttribute( 'data-id' ) + '-transparency' ).removeAttr( 'checked' ); - }, - clear: function( e, ui ) { - $( this ).val( '' ); - redux_change( $( this ).parent().find( '.redux-color-init' ) ); - } - } - ); -// $( '
    ' -// + '' -// + '' -// + '
    ' ).appendTo( $control.parents( '.wp-picker-container:first' ).addClass( 'vc_color-picker' ).find( '.iris-picker' ) ); -// $alpha = $control.parents( '.wp-picker-container:first' ).find( '.vc_alpha-field' ); -// //console.log($alpha); -// $alpha_output = $control.parents( '.wp-picker-container:first' ).find( '.redux-alpha-container output' ); -// $alpha.bind( 'change keyup', function () { -// var alpha_val = parseFloat( $alpha.val() ), -// iris = $control.data( 'a8cIris' ), -// color_picker = $control.data( 'wp-wpColorPicker' ); -// //console.log(alpha_val); -// $alpha_output.val( $alpha.val() + '%' ); -// console.log(alpha_val / 100.0); -// iris._color._alpha = parseFloat(alpha_val / 100.0); -// console.log(iris._color); -// //$control.val( iris._color.toString() ); -// el.find( '.redux-color-init' ).wpColorPicker( 'color', iris._color.toString() ); -// //console.log($control.val()); -// //color_picker.toggler.css( { backgroundColor: $control.val() } ); -// } ).val( alpha_val ).trigger( 'change' ); - - el.find( '.redux-color' ).on( - 'focus', function() { - $( this ).data( 'oldcolor', $( this ).val() ); - } - ); - - el.find( '.redux-color' ).on( - 'keyup', function() { - var value = $( this ).val(); - var color = colorValidate( this ); - var id = '#' + $( this ).attr( 'id' ); - - if ( value === "transparent" ) { - $( this ).parent().parent().find( '.wp-color-result' ).css( - 'background-color', 'transparent' - ); - - el.find( id + '-transparency' ).attr( 'checked', 'checked' ); - } else { - el.find( id + '-transparency' ).removeAttr( 'checked' ); - - if ( color && color !== $( this ).val() ) { - $( this ).val( color ); - } - } - } - ); - - // Replace and validate field on blur - el.find( '.redux-color' ).on( - 'blur', function() { - var value = $( this ).val(); - var id = '#' + $( this ).attr( 'id' ); - - if ( value === "transparent" ) { - $( this ).parent().parent().find( '.wp-color-result' ).css( - 'background-color', 'transparent' - ); - - el.find( id + '-transparency' ).attr( 'checked', 'checked' ); - } else { - if ( colorValidate( this ) === value ) { - if ( value.indexOf( "#" ) !== 0 ) { - $( this ).val( $( this ).data( 'oldcolor' ) ); - } - } - - el.find( id + '-transparency' ).removeAttr( 'checked' ); - } - } - ); - - // Store the old valid color on keydown - el.find( '.redux-color' ).on( - 'keydown', function() { - $( this ).data( 'oldkeypress', $( this ).val() ); - } - ); - - // When transparency checkbox is clicked - el.find( '.color-transparency' ).on( - 'click', function() { - if ( $( this ).is( ":checked" ) ) { - el.find( '.redux-saved-color' ).val( $( '#' + $( this ).data( 'id' ) ).val() ); - el.find( '#' + $( this ).data( 'id' ) ).val( 'transparent' ); - el.find( '#' + $( this ).data( 'id' ) ).parent().parent().find( '.wp-color-result' ).css( - 'background-color', 'transparent' - ); - } else { - if ( el.find( '#' + $( this ).data( 'id' ) ).val() === 'transparent' ) { - var prevColor = $( '.redux-saved-color' ).val(); - - if ( prevColor === '' ) { - prevColor = $( '#' + $( this ).data( 'id' ) ).data( 'default-color' ); - } - - el.find( '#' + $( this ).data( 'id' ) ).parent().parent().find( '.wp-color-result' ).css( - 'background-color', prevColor - ); - - el.find( '#' + $( this ).data( 'id' ) ).val( prevColor ); - } - } - redux_change( $( this ) ); - } - ); - } - ); - }; -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color/field_color.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color/field_color.min.js deleted file mode 100755 index 4d8ecfe7..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color/field_color.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.color=redux.field_objects.color||{},a(document).ready(function(){}),redux.field_objects.color.init=function(b){b||(b=a(document).find(".redux-group-tab:visible").find(".redux-container-color:visible")),a(b).each(function(){var b=a(this),c=b;b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),c.is(":hidden")||c.hasClass("redux-field-init")&&(c.removeClass("redux-field-init"),b.find(".redux-color-init").wpColorPicker({change:function(c,d){a(this).val(d.color.toString()),redux_change(a(this)),b.find("#"+c.target.getAttribute("data-id")+"-transparency").removeAttr("checked")},clear:function(b,c){a(this).val(""),redux_change(a(this).parent().find(".redux-color-init"))}}),b.find(".redux-color").on("focus",function(){a(this).data("oldcolor",a(this).val())}),b.find(".redux-color").on("keyup",function(){var c=a(this).val(),d=colorValidate(this),e="#"+a(this).attr("id");"transparent"===c?(a(this).parent().parent().find(".wp-color-result").css("background-color","transparent"),b.find(e+"-transparency").attr("checked","checked")):(b.find(e+"-transparency").removeAttr("checked"),d&&d!==a(this).val()&&a(this).val(d))}),b.find(".redux-color").on("blur",function(){var c=a(this).val(),d="#"+a(this).attr("id");"transparent"===c?(a(this).parent().parent().find(".wp-color-result").css("background-color","transparent"),b.find(d+"-transparency").attr("checked","checked")):(colorValidate(this)===c&&0!==c.indexOf("#")&&a(this).val(a(this).data("oldcolor")),b.find(d+"-transparency").removeAttr("checked"))}),b.find(".redux-color").on("keydown",function(){a(this).data("oldkeypress",a(this).val())}),b.find(".color-transparency").on("click",function(){if(a(this).is(":checked"))b.find(".redux-saved-color").val(a("#"+a(this).data("id")).val()),b.find("#"+a(this).data("id")).val("transparent"),b.find("#"+a(this).data("id")).parent().parent().find(".wp-color-result").css("background-color","transparent");else if("transparent"===b.find("#"+a(this).data("id")).val()){var c=a(".redux-saved-color").val();""===c&&(c=a("#"+a(this).data("id")).data("default-color")),b.find("#"+a(this).data("id")).parent().parent().find(".wp-color-result").css("background-color",c),b.find("#"+a(this).data("id")).val(c)}redux_change(a(this))}))})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color/field_color.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color/field_color.php deleted file mode 100755 index d353453f..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color/field_color.php +++ /dev/null @@ -1,122 +0,0 @@ -. - * - * @package ReduxFramework - * @subpackage Field_Color - * @author Daniel J Griffiths (Ghost1227) - * @author Dovy Paukstys - * @version 3.0.0 - */ - -// Exit if accessed directly -if ( ! defined( 'ABSPATH' ) ) { - exit; -} - -// Don't duplicate me! -if ( ! class_exists( 'ReduxFramework_color' ) ) { - - /** - * Main ReduxFramework_color class - * - * @since 1.0.0 - */ - class ReduxFramework_color { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct( $field = array(), $value = '', $parent ) { - - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - - echo ''; - echo ''; - - if ( ! isset( $this->field['transparent'] ) || $this->field['transparent'] !== false ) { - - $tChecked = ""; - - if ( $this->value == "transparent" ) { - $tChecked = ' checked="checked"'; - } - - echo ''; - } - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue() { - if ($this->parent->args['dev_mode']) { - wp_enqueue_style( 'redux-color-picker-css' ); - } - - wp_enqueue_style( 'wp-color-picker' ); - - wp_enqueue_script( - 'redux-field-color-js', - ReduxFramework::$_url . 'inc/fields/color/field_color' . Redux_Functions::isMin() . '.js', - array( 'jquery', 'wp-color-picker', 'redux-js' ), - time(), - true - ); - } - - public function output() { - $style = ''; - - if ( ! empty( $this->value ) ) { - $mode = ( isset( $this->field['mode'] ) && ! empty( $this->field['mode'] ) ? $this->field['mode'] : 'color' ); - - $style .= $mode . ':' . $this->value . ';'; - - if ( ! empty( $this->field['output'] ) && is_array( $this->field['output'] ) ) { - $css = Redux_Functions::parseCSS( $this->field['output'], $style, $this->value ); - $this->parent->outputCSS .= $css; - } - - if ( ! empty( $this->field['compiler'] ) && is_array( $this->field['compiler'] ) ) { - $css = Redux_Functions::parseCSS( $this->field['compiler'], $style, $this->value ); - $this->parent->compilerCSS .= $css; - - } - } - } - } -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.css deleted file mode 100755 index 58dc4552..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.css +++ /dev/null @@ -1 +0,0 @@ -.redux-container-color_gradient .colorGradient{display:inline-block}.redux-container-color_gradient .toLabel{padding-left:18px}@media screen and (max-width: 660px){.redux-container-color_gradient .colorGradient{display:block;text-align:center !important}} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.js deleted file mode 100755 index 55e61295..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.js +++ /dev/null @@ -1,142 +0,0 @@ -/* - Field Color Gradient - */ - -/*global jQuery, document, redux_change, redux*/ - -(function( $ ) { - 'use strict'; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.color_gradient = redux.field_objects.color_gradient || {}; - - $( document ).ready( - function() { - // setTimeout(function () { - // redux.field_objects.color.init(); - // }, 1000); - } - ); - - redux.field_objects.color_gradient.init = function( selector ) { - - if ( !selector ) { - selector = $( document ).find( ".redux-group-tab:visible" ).find( '.redux-container-color_gradient:visible' ); - } - - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - - el.find( '.redux-color-init' ).wpColorPicker( - { - change: function( e, ui ) { - $( this ).val( ui.color.toString() ); - redux_change( $( this ) ); - el.find( '#' + e.target.getAttribute( 'data-id' ) + '-transparency' ).removeAttr( 'checked' ); - }, - clear: function( e, ui ) { - $( this ).val( ui.color.toString() ); - redux_change( $( this ).parent().find( '.redux-color-init' ) ); - } - } - ); - - el.find( '.redux-color' ).on( - 'keyup', function() { - var value = $( this ).val(); - var color = colorValidate( this ); - var id = '#' + $( this ).attr( 'id' ); - - if ( value === "transparent" ) { - $( this ).parent().parent().find( '.wp-color-result' ).css( - 'background-color', 'transparent' - ); - - el.find( id + '-transparency' ).attr( 'checked', 'checked' ); - } else { - el.find( id + '-transparency' ).removeAttr( 'checked' ); - - if ( color && color !== $( this ).val() ) { - $( this ).val( color ); - } - } - } - ); - - // Replace and validate field on blur - el.find( '.redux-color' ).on( - 'blur', function() { - var value = $( this ).val(); - var id = '#' + $( this ).attr( 'id' ); - - if ( value === "transparent" ) { - $( this ).parent().parent().find( '.wp-color-result' ).css( - 'background-color', 'transparent' - ); - - el.find( id + '-transparency' ).attr( 'checked', 'checked' ); - } else { - if ( colorValidate( this ) === value ) { - if ( value.indexOf( "#" ) !== 0 ) { - $( this ).val( $( this ).data( 'oldcolor' ) ); - } - } - - el.find( id + '-transparency' ).removeAttr( 'checked' ); - } - } - ); - - // Store the old valid color on keydown - el.find( '.redux-color' ).on( - 'keydown', function() { - $( this ).data( 'oldkeypress', $( this ).val() ); - } - ); - - // When transparency checkbox is clicked - el.find( '.color-transparency' ).on( - 'click', function() { - if ( $( this ).is( ":checked" ) ) { - - el.find( '.redux-saved-color' ).val( $( '#' + $( this ).data( 'id' ) ).val() ); - el.find( '#' + $( this ).data( 'id' ) ).val( 'transparent' ); - el.find( '#' + $( this ).data( 'id' ) ).parent().parent().find( '.wp-color-result' ).css( - 'background-color', 'transparent' - ); - } else { - if ( el.find( '#' + $( this ).data( 'id' ) ).val() === 'transparent' ) { - var prevColor = $( '.redux-saved-color' ).val(); - - if ( prevColor === '' ) { - prevColor = $( '#' + $( this ).data( 'id' ) ).data( 'default-color' ); - } - - el.find( '#' + $( this ).data( 'id' ) ).parent().parent().find( '.wp-color-result' ).css( - 'background-color', prevColor - ); - - el.find( '#' + $( this ).data( 'id' ) ).val( prevColor ); - } - } - redux_change( $( this ) ); - } - ); - } - ); - }; -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.min.js deleted file mode 100755 index 86a8490f..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.color_gradient=redux.field_objects.color_gradient||{},a(document).ready(function(){}),redux.field_objects.color_gradient.init=function(b){b||(b=a(document).find(".redux-group-tab:visible").find(".redux-container-color_gradient:visible")),a(b).each(function(){var b=a(this),c=b;b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),c.is(":hidden")||c.hasClass("redux-field-init")&&(c.removeClass("redux-field-init"),b.find(".redux-color-init").wpColorPicker({change:function(c,d){a(this).val(d.color.toString()),redux_change(a(this)),b.find("#"+c.target.getAttribute("data-id")+"-transparency").removeAttr("checked")},clear:function(b,c){a(this).val(c.color.toString()),redux_change(a(this).parent().find(".redux-color-init"))}}),b.find(".redux-color").on("keyup",function(){var c=a(this).val(),d=colorValidate(this),e="#"+a(this).attr("id");"transparent"===c?(a(this).parent().parent().find(".wp-color-result").css("background-color","transparent"),b.find(e+"-transparency").attr("checked","checked")):(b.find(e+"-transparency").removeAttr("checked"),d&&d!==a(this).val()&&a(this).val(d))}),b.find(".redux-color").on("blur",function(){var c=a(this).val(),d="#"+a(this).attr("id");"transparent"===c?(a(this).parent().parent().find(".wp-color-result").css("background-color","transparent"),b.find(d+"-transparency").attr("checked","checked")):(colorValidate(this)===c&&0!==c.indexOf("#")&&a(this).val(a(this).data("oldcolor")),b.find(d+"-transparency").removeAttr("checked"))}),b.find(".redux-color").on("keydown",function(){a(this).data("oldkeypress",a(this).val())}),b.find(".color-transparency").on("click",function(){if(a(this).is(":checked"))b.find(".redux-saved-color").val(a("#"+a(this).data("id")).val()),b.find("#"+a(this).data("id")).val("transparent"),b.find("#"+a(this).data("id")).parent().parent().find(".wp-color-result").css("background-color","transparent");else if("transparent"===b.find("#"+a(this).data("id")).val()){var c=a(".redux-saved-color").val();""===c&&(c=a("#"+a(this).data("id")).data("default-color")),b.find("#"+a(this).data("id")).parent().parent().find(".wp-color-result").css("background-color",c),b.find("#"+a(this).data("id")).val(c)}redux_change(a(this))}))})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.php deleted file mode 100755 index 41dfeeb4..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.php +++ /dev/null @@ -1,128 +0,0 @@ -. - * - * @package ReduxFramework - * @subpackage Field_Color_Gradient - * @author Daniel J Griffiths (Ghost1227) - * @author Dovy Paukstys - * @version 3.0.0 - */ -// Exit if accessed directly -if ( ! defined( 'ABSPATH' ) ) { - exit; -} - -// Don't duplicate me! -if ( ! class_exists( 'ReduxFramework_color_gradient' ) ) { - - /** - * Main ReduxFramework_color_gradient class - * - * @since 1.0.0 - */ - class ReduxFramework_color_gradient { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct( $field = array(), $value = '', $parent ) { - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - - // No errors please - $defaults = array( - 'from' => '', - 'to' => '' - ); - - $this->value = wp_parse_args( $this->value, $defaults ); - - echo '
    ' . __( 'From ', 'redux-framework' ) . ' '; - echo ''; - echo ''; - - if ( ! isset( $this->field['transparent'] ) || $this->field['transparent'] !== false ) { - $tChecked = ""; - - if ( $this->value['from'] == "transparent" ) { - $tChecked = ' checked="checked"'; - } - - echo ''; - } - echo "
    "; - echo '
    ' . __( 'To ', 'redux-framework' ) . ' '; - - if ( ! isset( $this->field['transparent'] ) || $this->field['transparent'] !== false ) { - $tChecked = ""; - - if ( $this->value['to'] == "transparent" ) { - $tChecked = ' checked="checked"'; - } - - echo ''; - } - echo "
    "; - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue() { - wp_enqueue_style( 'wp-color-picker' ); - - wp_enqueue_script( - 'redux-field-color-gradient-js', - ReduxFramework::$_url . 'inc/fields/color_gradient/field_color_gradient' . Redux_Functions::isMin() . '.js', - array( 'jquery', 'wp-color-picker', 'redux-js' ), - time(), - 'all' - ); - - if ($this->parent->args['dev_mode']) { - wp_enqueue_style( 'redux-color-picker-css' ); - - wp_enqueue_style( - 'redux-field-color_gradient-css', - ReduxFramework::$_url . 'inc/fields/color_gradient/field_color_gradient.css', - array(), - time(), - 'all' - ); - } - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.scss deleted file mode 100755 index 00508fcb..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_gradient/field_color_gradient.scss +++ /dev/null @@ -1,17 +0,0 @@ -.redux-container-color_gradient { - .colorGradient { - display: inline-block; - } - .toLabel { - padding-left: 18px; - } -} - -@media screen and (max-width: 660px) { - .redux-container-color_gradient { - .colorGradient { - display: block; - text-align: center !important; - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.css deleted file mode 100755 index b52a1cc2..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.css +++ /dev/null @@ -1 +0,0 @@ -.sp-container{color:#555;border-color:#cccccc;background:#f7f7f7;-webkit-box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,0.08);box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,0.08);vertical-align:top}.sp-replacer{color:#555;border-color:#cccccc;background:#f7f7f7;-webkit-box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,0.08);box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,0.08);vertical-align:top}.sp-replacer:focus,.sp-replacer:hover,.sp-replacer.focus,.sp-replacer.hover{background:#fafafa;border-color:#999;color:#222}.sp-replacer:focus,.sp-replacer.focus{-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,0.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,0.8)}.sp-replacer.active:focus{-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,0.5),0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,0.8);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,0.5),0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,0.8)}.sp-replacer.active,.sp-replacer.active:hover,.sp-replacer:active{background:#eee;border-color:#999;color:#333;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,0.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,0.5)} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.js deleted file mode 100755 index 4a38f26c..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.js +++ /dev/null @@ -1,217 +0,0 @@ -(function($){ - 'use strict'; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.color_rgba = redux.field_objects.color_rgba || {}; - redux.field_objects.color_rgba.fieldID = ''; - - redux.field_objects.color_rgba.hexToRGBA = function( hex, alpha ) { - var result; - - if (hex === null) { - result = ''; - } else { - hex = hex.replace('#', ''); - var r = parseInt(hex.substring(0, 2), 16); - var g = parseInt(hex.substring(2, 4), 16); - var b = parseInt(hex.substring(4, 6), 16); - - result = 'rgba(' + r + ',' + g + ',' + b + ',' + alpha + ')'; - } - - return result; - }; - - redux.field_objects.color_rgba.init = function( selector ) { - if ( !selector ) { - selector = $( document ).find( ".redux-group-tab:visible" ).find( '.redux-container-color_rgba:visible' ); - } - - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - - redux.field_objects.color_rgba.modInit(el); - redux.field_objects.color_rgba.initColorPicker(el); - }); - }; - - redux.field_objects.color_rgba.modInit = function(el) { - - redux.field_objects.color_rgba.fieldID = el.find('.redux-color_rgba-container').data('id'); - - }; - - // Initialize colour picker - redux.field_objects.color_rgba.initColorPicker = function(el){ - - // Get field ID - var field_id = redux.field_objects.color_rgba.fieldID; - - // Get the color scheme container - var colorpickerInput = el.find('.redux-color-rgba'); - - // Get alpha value and sanitize it - var currentAlpha = colorpickerInput.data('current-alpha'); - currentAlpha = Number((currentAlpha === null || currentAlpha === undefined) ? 1 : currentAlpha); - - // Get colour value and sanitize it - var currentColor = colorpickerInput.data('current-color'); - currentColor = (currentColor === '' || currentColor === 'transparent') ? '' : currentColor; - - var outputTransparent = colorpickerInput.data('output-transparent'); - outputTransparent = Boolean((outputTransparent === '') ? false : outputTransparent); - - // Color picker arguments - var container = el.find('.redux-color-rgba-container'); - - // Get, decode and parse palette. - var palette = container.data('palette'); - palette = decodeURIComponent(palette); - palette = JSON.parse(palette); - - // Default palette - if (palette === null) { - palette = [ - ["#000000", "#434343", "#666666", "#999999", "#b7b7b7", "#cccccc", "#d9d9d9", "#efefef", "#f3f3f3", "#ffffff"], - ["#980000", "#ff0000", "#ff9900", "#ffff00", "#00ff00", "#00ffff", "#4a86e8", "#0000ff", "#9900ff", "#ff00ff"], - ["#e6b8af", "#f4cccc", "#fce5cd", "#fff2cc", "#d9ead3", "#d9ead3", "#c9daf8", "#cfe2f3", "#d9d2e9", "#ead1dc"], - ["#dd7e6b", "#ea9999", "#f9cb9c", "#ffe599", "#b6d7a8", "#a2c4c9", "#a4c2f4", "#9fc5e8", "#b4a7d6", "#d5a6bd"], - ["#cc4125", "#e06666", "#f6b26b", "#ffd966", "#93c47d", "#76a5af", "#6d9eeb", "#6fa8dc", "#8e7cc3", "#c27ba0"], - ["#a61c00", "#cc0000", "#e69138", "#f1c232", "#6aa84f", "#45818e", "#3c78d8", "#3d85c6", "#674ea7", "#a64d79"], - ["#85200c", "#990000", "#b45f06", "#bf9000", "#38761d", "#134f5c", "#1155cc", "#0b5394", "#351c75", "#741b47"], - ["#5b0f00", "#660000", "#783f04", "#7f6000", "#274e13", "#0c343d", "#1c4587", "#073763", "#20124d", "#4c1130"] - ]; - } - - // Get and sanitize show input argument - var showInput = container.data('show-input'); - showInput = Boolean((showInput === '') ? false : showInput); - - // Get and sanitize show initial argument - var showInitial = container.data('show-initial'); - showInitial = Boolean((showInitial === '') ? false : showInitial); - - // Get and sanitize show alpha argument - var showAlpha = container.data('show-alpha'); - showAlpha = Boolean((showAlpha === '') ? false : showAlpha); - - // Get and sanitize allow empty argument - var allowEmpty = container.data('allow-empty'); - allowEmpty = Boolean((allowEmpty === '') ? false : allowEmpty); - - // Get and sanitize show palette argument - var showPalette = container.data('show-palette'); - showPalette = Boolean((showPalette === '') ? false : showPalette); - - // Get and sanitize show palette only argument - var showPaletteOnly = container.data('show-palette-only'); - showPaletteOnly = Boolean((showPaletteOnly === '') ? false : showPaletteOnly); - - // Get and sanitize show selection palette argument - var showSelectionPalette = container.data('show-selection-palette'); - showSelectionPalette = Boolean((showSelectionPalette === '') ? false : showSelectionPalette); - - // Get max palette size - var maxPaletteSize = Number(container.data('max-palette-size')); - - // Get and sanitize clickout fires change argument - var clickoutFiresChange = container.data('clickout-fires-change'); - clickoutFiresChange = Boolean((clickoutFiresChange === '') ? false : clickoutFiresChange); - - // Get choose button text - var chooseText = String(container.data('choose-text')); - - // Get cancel button text - var cancelText = String(container.data('cancel-text')); - - // Get cancel button text - var inputText = String(container.data('input-text')); - - - // Get and sanitize show buttons argument - var showButtons = container.data('show-buttons'); - showButtons = Boolean((showButtons === '') ? false : showButtons); - - // Get container class - var containerClass = String(container.data('container-class')); - - // Get replacer class - var replacerClass = String(container.data('replacer-class')); - - // Color picker options - colorpickerInput.spectrum({ - color: currentColor, //'#ffffff', - showAlpha: showAlpha, - showInput: showInput, - allowEmpty: allowEmpty, - className: 'redux-color-rgba', - showInitial: showInitial, - showPalette: showPalette, - showSelectionPalette: showSelectionPalette, - maxPaletteSize: maxPaletteSize, - showPaletteOnly: showPaletteOnly, - clickoutFiresChange: clickoutFiresChange, - chooseText: chooseText, - cancelText: cancelText, - showButtons: showButtons, - containerClassName: containerClass, - replacerClassName: replacerClass, - preferredFormat: 'hex6', - localStorageKey: 'redux.color-rgba.' + field_id, - palette: palette, - inputText: inputText, - - // on change - change: function(color) { - var colorVal, alphaVal, rgbaVal; - - if (color === null) { - if (outputTransparent === true) { - colorVal = 'transparent'; - } else { - colorVal = null; - } - alphaVal = null; - } else { - colorVal = color.toHexString(); - alphaVal = color.alpha; - } - - if (colorVal != 'transparent') { - rgbaVal = redux.field_objects.color_rgba.hexToRGBA(colorVal, alphaVal); - } else { - rgbaVal = 'transparent'; - } - - var blockID = $(this).data('block-id'); - - // Update HTML color value - el.find('input#' + blockID + '-color').val(colorVal); - - // Update HTML alpha value - el.find('input#' + blockID + '-alpha').val(alphaVal); - - // Update RGBA alpha value - el.find('input#' + blockID + '-rgba').val(rgbaVal); - - redux_change(el.find('.redux-color-rgba-container')); - } - }); - }; -})(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.min.js deleted file mode 100755 index 958ecdca..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.color_rgba=redux.field_objects.color_rgba||{},redux.field_objects.color_rgba.fieldID="",redux.field_objects.color_rgba.hexToRGBA=function(a,b){var c;if(null===a)c="";else{a=a.replace("#","");var d=parseInt(a.substring(0,2),16),e=parseInt(a.substring(2,4),16),f=parseInt(a.substring(4,6),16);c="rgba("+d+","+e+","+f+","+b+")"}return c},redux.field_objects.color_rgba.init=function(b){b||(b=a(document).find(".redux-group-tab:visible").find(".redux-container-color_rgba:visible")),a(b).each(function(){var b=a(this),c=b;b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),c.is(":hidden")||c.hasClass("redux-field-init")&&(c.removeClass("redux-field-init"),redux.field_objects.color_rgba.modInit(b),redux.field_objects.color_rgba.initColorPicker(b))})},redux.field_objects.color_rgba.modInit=function(a){redux.field_objects.color_rgba.fieldID=a.find(".redux-color_rgba-container").data("id")},redux.field_objects.color_rgba.initColorPicker=function(b){var c=redux.field_objects.color_rgba.fieldID,d=b.find(".redux-color-rgba"),e=d.data("current-alpha");e=Number(null===e||void 0===e?1:e);var f=d.data("current-color");f=""===f||"transparent"===f?"":f;var g=d.data("output-transparent");g=Boolean(""===g?!1:g);var h=b.find(".redux-color-rgba-container"),i=h.data("palette");i=decodeURIComponent(i),i=JSON.parse(i),null===i&&(i=[["#000000","#434343","#666666","#999999","#b7b7b7","#cccccc","#d9d9d9","#efefef","#f3f3f3","#ffffff"],["#980000","#ff0000","#ff9900","#ffff00","#00ff00","#00ffff","#4a86e8","#0000ff","#9900ff","#ff00ff"],["#e6b8af","#f4cccc","#fce5cd","#fff2cc","#d9ead3","#d9ead3","#c9daf8","#cfe2f3","#d9d2e9","#ead1dc"],["#dd7e6b","#ea9999","#f9cb9c","#ffe599","#b6d7a8","#a2c4c9","#a4c2f4","#9fc5e8","#b4a7d6","#d5a6bd"],["#cc4125","#e06666","#f6b26b","#ffd966","#93c47d","#76a5af","#6d9eeb","#6fa8dc","#8e7cc3","#c27ba0"],["#a61c00","#cc0000","#e69138","#f1c232","#6aa84f","#45818e","#3c78d8","#3d85c6","#674ea7","#a64d79"],["#85200c","#990000","#b45f06","#bf9000","#38761d","#134f5c","#1155cc","#0b5394","#351c75","#741b47"],["#5b0f00","#660000","#783f04","#7f6000","#274e13","#0c343d","#1c4587","#073763","#20124d","#4c1130"]]);var j=h.data("show-input");j=Boolean(""===j?!1:j);var k=h.data("show-initial");k=Boolean(""===k?!1:k);var l=h.data("show-alpha");l=Boolean(""===l?!1:l);var m=h.data("allow-empty");m=Boolean(""===m?!1:m);var n=h.data("show-palette");n=Boolean(""===n?!1:n);var o=h.data("show-palette-only");o=Boolean(""===o?!1:o);var p=h.data("show-selection-palette");p=Boolean(""===p?!1:p);var q=Number(h.data("max-palette-size")),r=h.data("clickout-fires-change");r=Boolean(""===r?!1:r);var s=String(h.data("choose-text")),t=String(h.data("cancel-text")),u=String(h.data("input-text")),v=h.data("show-buttons");v=Boolean(""===v?!1:v);var w=String(h.data("container-class")),x=String(h.data("replacer-class"));d.spectrum({color:f,showAlpha:l,showInput:j,allowEmpty:m,className:"redux-color-rgba",showInitial:k,showPalette:n,showSelectionPalette:p,maxPaletteSize:q,showPaletteOnly:o,clickoutFiresChange:r,chooseText:s,cancelText:t,showButtons:v,containerClassName:w,replacerClassName:x,preferredFormat:"hex6",localStorageKey:"redux.color-rgba."+c,palette:i,inputText:u,change:function(c){var d,e,f;null===c?(d=g===!0?"transparent":null,e=null):(d=c.toHexString(),e=c.alpha),f="transparent"!=d?redux.field_objects.color_rgba.hexToRGBA(d,e):"transparent";var h=a(this).data("block-id");b.find("input#"+h+"-color").val(d),b.find("input#"+h+"-alpha").val(e),b.find("input#"+h+"-rgba").val(f),redux_change(b.find(".redux-color-rgba-container"))}})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.php deleted file mode 100755 index 8ac00caf..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.php +++ /dev/null @@ -1,295 +0,0 @@ -. - * - * @package Redux Framework - * @subpackage Spectrum Color Picker - * @author Kevin Provance (kprovance) - * @version 1.0.0 - */ - -// Exit if accessed directly -if( !defined( 'ABSPATH' ) ) { - exit; -} - -// Don't duplicate me! -if( !class_exists( 'ReduxFramework_color_rgba' ) ) { - - /** - * Main ReduxFramework_color_rgba class - * - * @since 1.0.0 - */ - class ReduxFramework_color_rgba { - - /** - * Class Constructor. Defines the args for the extions class - * - * @since 1.0.0 - * @access public - * @param array $field Field sections. - * @param array $value Values. - * @param array $parent Parent object. - * @return void - */ - public function __construct( $field = array(), $value ='', $parent ) { - - // Set required variables - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - - $defaults = array( - 'color' => '', - 'alpha' => 1, - 'rgba' => '' - ); - - $this->value = wp_parse_args( $this->value, $defaults ); - - $this->field['options']['show_input'] = isset($this->field['options']['show_input']) ? $this->field['options']['show_input'] : true; - $this->field['options']['show_initial'] = isset($this->field['options']['show_initial']) ? $this->field['options']['show_initial'] : false; - $this->field['options']['show_alpha'] = isset($this->field['options']['show_alpha']) ? $this->field['options']['show_alpha'] : true; - $this->field['options']['show_palette'] = isset($this->field['options']['show_palette']) ? $this->field['options']['show_palette'] : false; - $this->field['options']['show_palette_only'] = isset($this->field['options']['show_palette_only']) ? $this->field['options']['show_palette_only'] : false; - $this->field['options']['max_palette_size'] = isset($this->field['options']['max_palette_size']) ? $this->field['options']['max_palette_size'] : 10; - $this->field['options']['show_selection_palette'] = isset($this->field['options']['show_selection_palette']) ? $this->field['options']['show_selection_palette'] : false; - $this->field['options']['allow_empty'] = isset($this->field['options']['allow_empty']) ? $this->field['options']['allow_empty'] : true; - $this->field['options']['clickout_fires_change'] = isset($this->field['options']['clickout_fires_change']) ? $this->field['options']['clickout_fires_change'] : false; - $this->field['options']['choose_text'] = isset($this->field['options']['choose_text']) ? $this->field['options']['choose_text'] : 'Choose'; - $this->field['options']['cancel_text'] = isset($this->field['options']['cancel_text']) ? $this->field['options']['cancel_text'] : 'Cancel'; - $this->field['options']['show_buttons'] = isset($this->field['options']['show_buttons']) ? $this->field['options']['show_buttons'] : true; - $this->field['options']['palette'] = isset($this->field['options']['palette']) ? $this->field['options']['palette'] : null; - $this->field['options']['input_text'] = isset($this->field['options']['input_text']) ? $this->field['options']['input_text'] : 'Select Color'; - - // Convert empty array to null, if there. - $this->field['options']['palette'] = empty($this->field['options']['palette']) ? null : $this->field['options']['palette']; - - $this->field['output_transparent'] = isset($this->field['output_transparent']) ? $this->field['output_transparent'] : false; - } - - - /** - * Field Render Function. - * - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - - $field_id = $this->field['id']; - - // Color picker container - echo '
    '; - - // Colour picker layout - $opt_name = $this->parent->args['opt_name']; - - if ('' == $this->value['color'] || 'transparent' == $this->value['color']) { - $color = ''; - } else { - $color = Redux_Helpers::hex2rgba($this->value['color'], $this->value['alpha']); - } - - if ($this->value['rgba'] == '' && $this->value['color'] != '' ){ - $this->value['rgba'] = Redux_Helpers::hex2rgba($this->value['color'], $this->value['alpha']); - } - - echo ''; - - echo ''; - - // Hidden input for alpha channel - echo ''; - - // Hidden input for rgba - echo ''; - - echo '
    '; - } - - /** - * Enqueue Function. - * - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue() { - - // Set up min files for dev_mode = false. - $min = Redux_Functions::isMin(); - - // Field dependent JS - if (!wp_script_is ( 'redux-field-color-rgba-js' )) { - wp_enqueue_script( - 'redux-field-color-rgba-js', - ReduxFramework::$_url . 'inc/fields/color_rgba/field_color_rgba' . Redux_Functions::isMin() . '.js', - array('jquery', 'redux-spectrum-js'), - time(), - true - ); - } - - // Spectrum CSS - if (!wp_style_is ( 'redux-spectrum-css' )) { - wp_enqueue_style('redux-spectrum-css'); - } - - if ($this->parent->args['dev_mode']) { - if (!wp_style_is ( 'redux-field-color-rgba-css' )) { - wp_enqueue_style( - 'redux-field-color-rgba-css', - ReduxFramework::$_url . 'inc/fields/color_rgba/field_color_rgba.css', - array(), - time(), - 'all' - ); - } - } - } - - /** - * getColorVal. Returns formatted color val in hex or rgba. - * - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access private - * @return string - */ - private function getColorVal(){ - - // No notices - $color = ''; - $alpha = 1; - $rgba = ''; - - // Must be an array - if (is_array($this->value)) { - - // Enum array to parse values - foreach($this->value as $id => $val) { - - // Sanitize alpha - if ($id == 'alpha') { - $alpha = !empty($val) ? $val : 1; - } elseif ($id == 'color') { - $color = !empty($val) ? $val : ''; - } elseif ($id == 'rgba') { - $rgba = !empty($val) ? $val : ''; - $rgba = Redux_Helpers::hex2rgba($color, $alpha); - } - } - - // Only build rgba output if alpha ia less than 1 - if ( $alpha < 1 && $alpha <> '' ) { - $color = $rgba; - } - } - - return $color; - } - - /** - * Output Function. - * - * Used to enqueue to the front-end - * - * @since 1.0.0 - * @access public - * @return void - */ - public function output() { - if (!empty($this->value)) { - $style = ''; - - $mode = ( isset( $this->field['mode'] ) && ! empty( $this->field['mode'] ) ? $this->field['mode'] : 'color' ); - - $color_val = $this->getColorVal(); - - $style .= $mode . ':' . $color_val . ';'; - - if ( ! empty( $this->field['output'] ) && is_array( $this->field['output'] ) ) { - if (!empty($color_val)) { - $css = Redux_Functions::parseCSS( $this->field['output'], $style, $color_val ); - $this->parent->outputCSS .= $css; - } - } - - if ( ! empty( $this->field['compiler'] ) && is_array( $this->field['compiler'] ) ) { - if (!empty($color_val)) { - $css = Redux_Functions::parseCSS( $this->field['compiler'], $style, $color_val ); - $this->parent->compilerCSS .= $css ; - } - } - } - } - } -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.scss deleted file mode 100755 index 6c328697..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/color_rgba/field_color_rgba.scss +++ /dev/null @@ -1,61 +0,0 @@ -.sp-container { -/* border: solid 1px black; - -webkit-box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5), 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, 0.8); - box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5), 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, 0.8);*/ - color: #555; - border-color: #cccccc; - background: #f7f7f7; - -webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 ); - box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 ); - vertical-align: top; -} - -.sp-replacer { - color: #555; - border-color: #cccccc; - background: #f7f7f7; - -webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 ); - box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 ); - vertical-align: top; -} - -.sp-replacer:focus, -.sp-replacer:hover, -.sp-replacer.focus, -.sp-replacer.hover { - background: #fafafa; - border-color: #999; - color: #222; -} - -.sp-replacer:focus, -.sp-replacer.focus { - -webkit-box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - -} - -.sp-replacer.active:focus { - -webkit-box-shadow: - inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ), - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: - inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ), - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); -} - -.sp-replacer.active, -.sp-replacer.active:hover, -.sp-replacer:active{ - background: #eee; - border-color: #999; - color: #333; - -webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); - box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.css deleted file mode 100755 index ac4c4d42..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.css +++ /dev/null @@ -1 +0,0 @@ -#ui-datepicker-div{z-index:15 !important}.ui-datepicker-header{background-color:#00abef} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.js deleted file mode 100755 index 6f45f2f2..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.js +++ /dev/null @@ -1,82 +0,0 @@ -/*global jQuery, document, redux*/ - -(function( $ ) { - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.date = redux.field_objects.date || {}; - - $( document ).ready( - function() { - //redux.field_objects.date.init(); - } - ); - - redux.field_objects.date.init = function( selector ) { - if ( !selector ) { - selector = $( document ).find( '.redux-container-date:visible' ); - } - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } -// var someArr = [] -// someArr = i; -// console.log(someArr); - -// var str = JSON.parse('{"redux_demo[opt-multi-check]":{"redux_demo[opt-multi-check][1]":"1","redux_demo[opt-multi-check][2]":"","redux_demo[opt-multi-check][3]":""}}'); -// console.log (str); -// -// $.each(str, function(idx, val){ -// var tmpArr = new Object(); -// var count = 1; -// -// $.each(val, function (i, v){ -// -// tmpArr[count] = v; -// count++; -// }); -// -// var newArr = {}; -// newArr[idx] = tmpArr; -// var newJSON = JSON.stringify(newArr) -// //console.log(newJSON); -// }); - - el.find( '.redux-datepicker' ).each( function() { - $( this ).datepicker({ - "dateFormat":"mm/dd/yy", - beforeShow: function(input, instance){ - var el = $('#ui-datepicker-div'); - //$.datepicker._pos = $.datepicker._findPos(input); //this is the default position - var popover = instance.dpDiv; - $('.redux-container:first').append(el); - $('#ui-datepicker-div').hide(); - setTimeout(function() { - popover.position({ - my: 'left top', - at: 'left bottom', - collision: 'none', - of: input - }); - }, 1); - } - }); - }); - } - ); - - - }; -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.min.js deleted file mode 100755 index 17475cda..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.date=redux.field_objects.date||{},a(document).ready(function(){}),redux.field_objects.date.init=function(b){b||(b=a(document).find(".redux-container-date:visible")),a(b).each(function(){var b=a(this),c=b;b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),c.is(":hidden")||c.hasClass("redux-field-init")&&(c.removeClass("redux-field-init"),b.find(".redux-datepicker").each(function(){a(this).datepicker({dateFormat:"mm/dd/yy",beforeShow:function(b,c){var d=a("#ui-datepicker-div"),e=c.dpDiv;a(".redux-container:first").append(d),a("#ui-datepicker-div").hide(),setTimeout(function(){e.position({my:"left top",at:"left bottom",collision:"none",of:b})},1)}})}))})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.php deleted file mode 100755 index ad532527..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.php +++ /dev/null @@ -1,95 +0,0 @@ -. - * - * @package ReduxFramework - * @subpackage Field_Date - * @author Daniel J Griffiths (Ghost1227) - * @author Dovy Paukstys - * @author Kevin Provance (kprovance) - * @version 3.0.0 - */ - -// Exit if accessed directly -if ( ! defined( 'ABSPATH' ) ) { - exit; -} - -// Don't duplicate me! -if ( ! class_exists( 'ReduxFramework_date' ) ) { - - /** - * Main ReduxFramework_date class - * - * @since 1.0.0 - */ - class ReduxFramework_date { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct( $field = array(), $value = '', $parent ) { - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - $placeholder = ( isset( $this->field['placeholder'] ) ) ? ' placeholder="' . esc_attr( $this->field['placeholder'] ) . '" ' : ''; - - echo ''; - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue() { - - if ($this->parent->args['dev_mode']) { - wp_enqueue_style( - 'redux-field-date-css', - ReduxFramework::$_url . 'inc/fields/date/field_date.css', - array(), - time(), - 'all' - ); - } - - wp_enqueue_script( - 'redux-field-date-js', - ReduxFramework::$_url . 'inc/fields/date/field_date' . Redux_Functions::isMin() . '.js', - array( 'jquery', 'jquery-ui-core', 'jquery-ui-datepicker', 'redux-js' ), - time(), - true - ); - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.scss deleted file mode 100755 index dd931de6..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/date/field_date.scss +++ /dev/null @@ -1,8 +0,0 @@ -#ui-datepicker-div { - z-index: 15 !important; -} - -.ui-datepicker-header { - background-color: #00abef; -} - diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.css deleted file mode 100755 index 9b0cbf92..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.css +++ /dev/null @@ -1 +0,0 @@ -.redux-dimensions-container select,.redux-dimensions-container .select_wrapper{width:65px !important;float:left}.redux-dimensions-container .field-dimensions-input{margin-right:10px;margin-bottom:7px}@media screen and (max-width: 782px){.redux-dimensions-container .field-dimensions-input input{display:inline-block !important;width:100px !important}.redux-dimensions-container .field-dimensions-input .add-on{padding:7px 4px;font-size:16px;line-height:1.5}.redux-dimensions-container .select_wrapper{margin-top:6px}} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.js deleted file mode 100755 index 3ddc6f18..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.js +++ /dev/null @@ -1,76 +0,0 @@ - -/*global jQuery, document, redux*/ - -(function( $ ) { - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.dimensions = redux.field_objects.dimensions || {}; - - $( document ).ready( - function() { - //redux.field_objects.dimensions.init(); - } - ); - - redux.field_objects.dimensions.init = function( selector ) { - - if ( !selector ) { - selector = $( document ).find( '.redux-container-dimensions:visible' ); - } - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - var default_params = { - width: 'resolve', - triggerChange: true, - allowClear: true - }; - - var select2_handle = el.find( '.select2_params' ); - if ( select2_handle.size() > 0 ) { - var select2_params = select2_handle.val(); - - select2_params = JSON.parse( select2_params ); - default_params = $.extend( {}, default_params, select2_params ); - } - - el.find( ".redux-dimensions-units" ).select2( default_params ); - - el.find( '.redux-dimensions-input' ).on( - 'change', function() { - var units = $( this ).parents( '.redux-field:first' ).find( '.field-units' ).val(); - if ( $( this ).parents( '.redux-field:first' ).find( '.redux-dimensions-units' ).length !== 0 ) { - units = $( this ).parents( '.redux-field:first' ).find( '.redux-dimensions-units option:selected' ).val(); - } - if ( typeof units !== 'undefined' ) { - el.find( '#' + $( this ).attr( 'rel' ) ).val( $( this ).val() + units ); - } else { - el.find( '#' + $( this ).attr( 'rel' ) ).val( $( this ).val() ); - } - } - ); - - el.find( '.redux-dimensions-units' ).on( - 'change', function() { - $( this ).parents( '.redux-field:first' ).find( '.redux-dimensions-input' ).change(); - } - ); - } - ); - - - }; -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.less b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.less deleted file mode 100755 index 41fca0ef..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.less +++ /dev/null @@ -1,30 +0,0 @@ -.redux-dimensions-container { - select, .select_wrapper { - width: 80px !important; - float: left; - } - - .field-dimensions-input { - margin-right: 10px; - margin-bottom: 7px; - } -} - -@media screen and (max-width: 782px) { - .redux-dimensions-container { - .field-dimensions-input { - input { - display: inline-block !important; - width: 100px !important; - } - .add-on { - padding: 7px 4px; - font-size: 16px; - line-height: 1.5; - } - } - .select_wrapper { - margin-top: 6px; - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.min.js deleted file mode 100755 index d675d29c..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.dimensions=redux.field_objects.dimensions||{},a(document).ready(function(){}),redux.field_objects.dimensions.init=function(b){b||(b=a(document).find(".redux-container-dimensions:visible")),a(b).each(function(){var b=a(this),c=b;if(b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),!c.is(":hidden")&&c.hasClass("redux-field-init")){c.removeClass("redux-field-init");var d={width:"resolve",triggerChange:!0,allowClear:!0},e=b.find(".select2_params");if(e.size()>0){var f=e.val();f=JSON.parse(f),d=a.extend({},d,f)}b.find(".redux-dimensions-units").select2(d),b.find(".redux-dimensions-input").on("change",function(){var c=a(this).parents(".redux-field:first").find(".field-units").val();0!==a(this).parents(".redux-field:first").find(".redux-dimensions-units").length&&(c=a(this).parents(".redux-field:first").find(".redux-dimensions-units option:selected").val()),"undefined"!=typeof c?b.find("#"+a(this).attr("rel")).val(a(this).val()+c):b.find("#"+a(this).attr("rel")).val(a(this).val())}),b.find(".redux-dimensions-units").on("change",function(){a(this).parents(".redux-field:first").find(".redux-dimensions-input").change()})}})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.php deleted file mode 100755 index 317c66b7..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.php +++ /dev/null @@ -1,306 +0,0 @@ -parent = $parent; - $this->field = $field; - $this->value = $value; - } //function - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since ReduxFramework 1.0.0 - */ - function render() { - - /* - * So, in_array() wasn't doing it's job for checking a passed array for a proper value. - * It's wonky. It only wants to check the keys against our array of acceptable values, and not the key's - * value. So we'll use this instead. Fortunately, a single no array value can be passed and it won't - * take a dump. - */ - - // No errors please - $defaults = array( - 'width' => true, - 'height' => true, - 'units_extended' => false, - 'units' => 'px', - 'mode' => array( - 'width' => false, - 'height' => false, - ), - ); - - $this->field = wp_parse_args( $this->field, $defaults ); - - $defaults = array( - 'width' => '', - 'height' => '', - 'units' => 'px' - ); - - $this->value = wp_parse_args( $this->value, $defaults ); - - if ( isset( $this->value['unit'] ) ) { - $this->value['units'] = $this->value['unit']; - } - - /* - * Acceptable values checks. If the passed variable doesn't pass muster, we unset them - * and reset them with default values to avoid errors. - */ - - // If units field has a value but is not an acceptable value, unset the variable - if ( isset( $this->field['units'] ) && ! Redux_Helpers::array_in_array( $this->field['units'], array( - '', - false, - '%', - 'in', - 'cm', - 'mm', - 'em', - 'ex', - 'pt', - 'pc', - 'px', - 'rem' - ) ) - ) { - unset( $this->field['units'] ); - } - - //if there is a default unit value but is not an accepted value, unset the variable - if ( isset( $this->value['units'] ) && ! Redux_Helpers::array_in_array( $this->value['units'], array( - '', - '%', - 'in', - 'cm', - 'mm', - 'em', - 'ex', - 'pt', - 'pc', - 'px' - ) ) - ) { - unset( $this->value['units'] ); - } - - /* - * Since units field could be an array, string value or bool (to hide the unit field) - * we need to separate our functions to avoid those nasty PHP index notices! - */ - - // if field units has a value and IS an array, then evaluate as needed. - if ( isset( $this->field['units'] ) && ! is_array( $this->field['units'] ) ) { - - //if units fields has a value but units value does not then make units value the field value - if ( isset( $this->field['units'] ) && ! isset( $this->value['units'] ) || $this->field['units'] == false ) { - $this->value['units'] = $this->field['units']; - - // If units field does NOT have a value and units value does NOT have a value, set both to blank (default?) - } else if ( ! isset( $this->field['units'] ) && ! isset( $this->value['units'] ) ) { - $this->field['units'] = 'px'; - $this->value['units'] = 'px'; - - // If units field has NO value but units value does, then set unit field to value field - } else if ( ! isset( $this->field['units'] ) && isset( $this->value['units'] ) ) { - $this->field['units'] = $this->value['units']; - - // if unit value is set and unit value doesn't equal unit field (coz who knows why) - // then set unit value to unit field - } elseif ( isset( $this->value['units'] ) && $this->value['units'] !== $this->field['units'] ) { - $this->value['units'] = $this->field['units']; - } - - // do stuff based on unit field NOT set as an array - } elseif ( isset( $this->field['units'] ) && is_array( $this->field['units'] ) ) { - // nothing to do here, but I'm leaving the construct just in case I have to debug this again. - } - - echo '
    '; - - if ( isset( $this->field['select2'] ) ) { // if there are any let's pass them to js - $select2_params = json_encode( $this->field['select2'] ); - $select2_params = htmlspecialchars( $select2_params, ENT_QUOTES ); - - echo ''; - } - - - // This used to be unit field, but was giving the PHP index error when it was an array, - // so I changed it. - echo ''; - - /** - * Width - * */ - if ( $this->field['width'] === true ) { - if ( ! empty( $this->value['width'] ) && strpos( $this->value['width'], $this->value['units'] ) === false ) { - $this->value['width'] = filter_var( $this->value['width'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ); - if ( $this->field['units'] !== false ) { - $this->value['width'] .= $this->value['units']; - } - } - echo '
    '; - echo ''; - echo ''; - echo '
    '; - } - - /** - * Height - * */ - if ( $this->field['height'] === true ) { - if ( ! empty( $this->value['height'] ) && strpos( $this->value['height'], $this->value['units'] ) === false ) { - $this->value['height'] = filter_var( $this->value['height'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ); - if ( $this->field['units'] !== false ) { - $this->value['height'] .= $this->value['units']; - } - } - echo '
    '; - echo ''; - echo ''; - echo '
    '; - } - - /** - * Units - * */ - // If units field is set and units field NOT false then - // fill out the options object and show it, otherwise it's hidden - // and the default units value will apply. - if ( isset( $this->field['units'] ) && $this->field['units'] !== false ) { - echo '
    '; - echo '
    '; - }; - echo "
    "; - } //function - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since ReduxFramework 1.0.0 - */ - function enqueue() { - wp_enqueue_style( 'select2-css' ); - - wp_enqueue_script( - 'redux-field-dimensions-js', - ReduxFramework::$_url . 'inc/fields/dimensions/field_dimensions' . Redux_Functions::isMin() . '.js', - array( 'jquery', 'select2-js', 'redux-js' ), - time(), - true - ); - - if ( $this->parent->args['dev_mode'] ) { - wp_enqueue_style( - 'redux-field-dimensions-css', - ReduxFramework::$_url . 'inc/fields/dimensions/field_dimensions.css', - array(), - time(), - 'all' - ); - } - } - - public function output() { - - // if field units has a value and IS an array, then evaluate as needed. - if ( isset( $this->field['units'] ) && ! is_array( $this->field['units'] ) ) { - - //if units fields has a value but units value does not then make units value the field value - if ( isset( $this->field['units'] ) && ! isset( $this->value['units'] ) || $this->field['units'] == false ) { - $this->value['units'] = $this->field['units']; - - // If units field does NOT have a value and units value does NOT have a value, set both to blank (default?) - } else if ( ! isset( $this->field['units'] ) && ! isset( $this->value['units'] ) ) { - $this->field['units'] = 'px'; - $this->value['units'] = 'px'; - - // If units field has NO value but units value does, then set unit field to value field - } else if ( ! isset( $this->field['units'] ) && isset( $this->value['units'] ) ) { - $this->field['units'] = $this->value['units']; - - // if unit value is set and unit value doesn't equal unit field (coz who knows why) - // then set unit value to unit field - } elseif ( isset( $this->value['units'] ) && $this->value['units'] !== $this->field['units'] ) { - $this->value['units'] = $this->field['units']; - } - - // do stuff based on unit field NOT set as an array - } elseif ( isset( $this->field['units'] ) && is_array( $this->field['units'] ) ) { - // nothing to do here, but I'm leaving the construct just in case I have to debug this again. - } - - $units = isset( $this->value['units'] ) ? $this->value['units'] : ""; - - $height = isset( $this->field['mode'] ) && ! empty( $this->field['mode'] ) ? $this->field['mode'] : 'height'; - $width = isset( $this->field['mode'] ) && ! empty( $this->field['mode'] ) ? $this->field['mode'] : 'width'; - - $cleanValue = array( - $height => isset( $this->value['height'] ) ? filter_var( $this->value['height'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ) : '', - $width => isset( $this->value['width'] ) ? filter_var( $this->value['width'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ) : '', - ); - - $style = ""; - - foreach ( $cleanValue as $key => $value ) { - // Output if it's a numeric entry - if ( isset( $value ) && is_numeric( $value ) ) { - $style .= $key . ':' . $value . $units . ';'; - } - } - - if ( ! empty( $style ) ) { - if ( ! empty( $this->field['output'] ) && is_array( $this->field['output'] ) ) { - $keys = implode( ",", $this->field['output'] ); - $this->parent->outputCSS .= $keys . "{" . $style . '}'; - } - - if ( ! empty( $this->field['compiler'] ) && is_array( $this->field['compiler'] ) ) { - $keys = implode( ",", $this->field['compiler'] ); - $this->parent->compilerCSS .= $keys . "{" . $style . '}'; - } - } - } //function - } //class - } - - diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.scss deleted file mode 100755 index 2eb5dbe5..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/dimensions/field_dimensions.scss +++ /dev/null @@ -1,33 +0,0 @@ -.redux-dimensions-container { - select, - .select_wrapper { - width: 65px !important; - float: left; - } - - .field-dimensions-input { - margin-right: 10px; - margin-bottom: 7px; - } -} - -@media screen and (max-width: 782px) { - .redux-dimensions-container { - .field-dimensions-input { - input { - display: inline-block !important; - width: 100px !important; - } - - .add-on { - padding: 7px 4px; - font-size: 16px; - line-height: 1.5; - } - } - - .select_wrapper { - margin-top: 6px; - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/divide/field_divide.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/divide/field_divide.css deleted file mode 100755 index 85e90f82..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/divide/field_divide.css +++ /dev/null @@ -1 +0,0 @@ -.redux-main .divide{height:20px;line-height:20px;float:none;border-color:#E7E7E7;display:block;width:100%;height:35px !important;line-height:35px !important;position:relative;margin:15px 0 10px 0}.redux-main .divide .inner{width:42% !important;left:40% !important;margin-left:-6%;background-color:#FCFCFC;border-color:#E7E7E7;position:absolute;height:1px;top:50%;width:100%;margin-top:-1px;border-top-width:1px;border-top-style:solid}.redux-main .divide .inner span{background-color:#FCFCFC;border-color:#E7E7E7;height:5px;width:5px;border-width:2px;border-style:solid;display:block;position:absolute;left:50%;margin-left:-5px;margin-top:-5px}.wp-customizer .redux-container-divide .divide .inner{width:82% !important;left:18% !important;margin-left:-8%} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/divide/field_divide.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/divide/field_divide.php deleted file mode 100755 index d5e526d2..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/divide/field_divide.php +++ /dev/null @@ -1,85 +0,0 @@ -. - * - * @package ReduxFramework - * @subpackage Field_Divide - * @author Daniel J Griffiths (Ghost1227) - * @author Dovy Paukstys - * @version 3.0.0 - */ - -// Exit if accessed directly -if ( !defined ( 'ABSPATH' ) ) { - exit; -} - -// Don't duplicate me! -if ( !class_exists ( 'ReduxFramework_divide' ) ) { - - /** - * Main ReduxFramework_divide class - * - * @since 1.0.0 - */ - class ReduxFramework_divide { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct ( $field = array(), $value = '', $parent ) { - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render () { - echo '
    '; - echo '
     
    '; - echo '
    '; - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue() { - if ($this->parent->args['dev_mode']) { - wp_enqueue_style( - 'redux-field-divide', - ReduxFramework::$_url . 'inc/fields/divide/field_divide.css', - array(), - time(), - 'all' - ); - } - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/divide/field_divide.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/divide/field_divide.scss deleted file mode 100755 index 2de5656b..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/divide/field_divide.scss +++ /dev/null @@ -1,50 +0,0 @@ -.redux-main { - .divide { - height: 20px; - line-height: 20px; - float: none; - border-color: #E7E7E7; - display: block; - width: 100%; - height: 35px !important; - line-height: 35px !important; - position: relative; - margin: 15px 0 10px 0; - - .inner { - width: 42% !important; - left: 40% !important; - margin-left: -6%; - background-color: #FCFCFC; - border-color: #E7E7E7; - position: absolute; - height: 1px; - top: 50%; - width: 100%; - margin-top: -1px; - border-top-width: 1px; - border-top-style: solid; - span { - background-color: #FCFCFC; - border-color: #E7E7E7; - height: 5px; - width: 5px; - border-width: 2px; - border-style: solid; - display: block; - position: absolute; - left: 50%; - margin-left: -5px; - margin-top: -5px; - } - } - } -} - -.wp-customizer .redux-container-divide { - .divide .inner { - width: 82% !important; - left: 18% !important; - margin-left: -8%; - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.css deleted file mode 100755 index 735a0dbb..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.css +++ /dev/null @@ -1 +0,0 @@ -.redux-container-editor .mceLayout td{border-width:1px;margin:0;padding:1px}.redux-container-editor input,.redux-container-editor textarea{margin:inherit}.redux-container-editor textarea{border-style:none;border:0;border-width:0}.redux-container-editor .wp-editor-container{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.redux-container-editor .wp-editor-container textarea{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border-style:inherit}.redux-container-editor .quicktags-toolbar input{margin:2px 1px 4px;line-height:18px;display:inline-block;min-width:26px;padding:2px 4px;font:12px/18px Arial, Helvetica, sans-serif normal;color:#464646;border:1px solid #c3c3c3;-webkit-border-radius:3px;border-radius:3px;background:#eee;background-image:-webkit-gradient(linear, left bottom, left top, from(#e3e3e3), to(#fff));background-image:-webkit-linear-gradient(bottom, #e3e3e3, #fff);background-image:-moz-linear-gradient(bottom, #e3e3e3, #fff);background-image:-o-linear-gradient(bottom, #e3e3e3, #fff);background-image:linear-gradient(to top, #e3e3e3, #fff)} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.js deleted file mode 100755 index 288b6066..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Redux Editor on change callback - * Dependencies : jquery - * Feature added by : Dovy Paukstys - * : Kevin Provance (who helped) :P - * Date : 07 June 2014 - */ - -/*global redux_change, wp, tinymce, redux*/ -(function( $ ) { - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.editor = redux.field_objects.editor || {}; - - $( document ).ready( - function() { - //redux.field_objects.editor.init(); - } - ); - - redux.field_objects.editor.init = function( selector ) { - setTimeout( - function() { - if (typeof(tinymce) !== 'undefined') { - for ( var i = 0; i < tinymce.editors.length; i++ ) { - redux.field_objects.editor.onChange( i ); - } - } - }, 1000 - ); - }; - - redux.field_objects.editor.onChange = function( i ) { - tinymce.editors[i].on( - 'change', function( e ) { - var el = jQuery( e.target.contentAreaContainer ); - if ( el.parents( '.redux-container-editor:first' ).length !== 0 ) { - redux_change( $( '.wp-editor-area' ) ); - } - } - ); - }; -})( jQuery ); diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.min.js deleted file mode 100755 index 24171ac9..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.editor=redux.field_objects.editor||{},a(document).ready(function(){}),redux.field_objects.editor.init=function(a){setTimeout(function(){if("undefined"!=typeof tinymce)for(var a=0;a. - * - * @package ReduxFramework - * @subpackage Field_Editor - * @author Daniel J Griffiths (Ghost1227) - * @author Dovy Paukstys - * @author Kevin Provance (kprovance) - * @version 3.0.0 - */ - -// Exit if accessed directly -if ( ! defined( 'ABSPATH' ) ) { - exit; -} - -// Don't duplicate me! -if ( ! class_exists( 'ReduxFramework_editor' ) ) { - - /** - * Main ReduxFramework_editor class - * - * @since 1.0.0 - */ - class ReduxFramework_editor { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct( $field = array(), $value = '', $parent ) { - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - - if ( ! isset( $this->field['args'] ) ) { - $this->field['args'] = array(); - } - - $this->field['args']['onchange_callback'] = "alert('here')"; - - // Setup up default args - $defaults = array( - 'textarea_name' => $this->field['name'] . $this->field['name_suffix'], - 'editor_class' => $this->field['class'], - 'textarea_rows' => 10, //Wordpress default - 'teeny' => true, - ); - - if ( isset( $this->field['editor_options'] ) && empty( $this->field['args'] ) ) { - $this->field['args'] = $this->field['editor_options']; - unset( $this->field['editor_options'] ); - } - - $this->field['args'] = wp_parse_args( $this->field['args'], $defaults ); - - wp_editor( $this->value, $this->field['id'], $this->field['args'] ); - } - - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue() { - if ($this->parent->args['dev_mode']) { - wp_enqueue_style( - 'redux-field-editor-css', - ReduxFramework::$_url . 'inc/fields/editor/field_editor.css', - array(), - time(), - 'all' - ); - } - - wp_enqueue_script( - 'redux-field-editor-js', - ReduxFramework::$_url . 'inc/fields/editor/field_editor' . Redux_Functions::isMin() . '.js', - array( 'jquery', 'redux-js' ), - time(), - true - ); - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.scss deleted file mode 100755 index 21aead3e..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/editor/field_editor.scss +++ /dev/null @@ -1,50 +0,0 @@ -.redux-container-editor { - .mceLayout td { - border-width: 1px; - margin: 0; - padding: 1px; - } - - input, - textarea { - margin: inherit; - } - - textarea { - border-style: none; - border: 0; - border-width: 0; - } - - .wp-editor-container { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - - textarea { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - border-style: inherit; - } - } - - .quicktags-toolbar input { - margin: 2px 1px 4px; - line-height: 18px; - display: inline-block; - min-width: 26px; - padding: 2px 4px; - font: 12px/18px Arial, Helvetica, sans-serif normal; - color: #464646; - border: 1px solid #c3c3c3; - -webkit-border-radius: 3px; - border-radius: 3px; - background: #eee; - background-image: -webkit-gradient(linear, left bottom, left top, from(#e3e3e3), to(#fff)); - background-image: -webkit-linear-gradient(bottom, #e3e3e3, #fff); - background-image: -moz-linear-gradient(bottom, #e3e3e3, #fff); - background-image: -o-linear-gradient(bottom, #e3e3e3, #fff); - background-image: linear-gradient(to top, #e3e3e3, #fff); - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/gallery/field_gallery.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/gallery/field_gallery.js deleted file mode 100755 index 822348ee..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/gallery/field_gallery.js +++ /dev/null @@ -1,117 +0,0 @@ -/* global redux_change, wp */ - -/*global redux_change, redux*/ - -(function( $ ) { - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.gallery = redux.field_objects.gallery || {}; - - $( document ).ready( - function() { - //redux.field_objects.gallery.init(); - } - ); - - redux.field_objects.gallery.init = function( selector ) { - - - if ( !selector ) { - selector = $( document ).find( '.redux-container-gallery:visible' ); - } - - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - // When the user clicks on the Add/Edit gallery button, we need to display the gallery editing - el.on( - { - click: function( event ) { - // hide gallery settings used for posts/pages - wp.media.view.Settings.Gallery = wp.media.view.Settings.Gallery.extend({ - template: function(view){ - return; - } - }); - - var current_gallery = $( this ).closest( 'fieldset' ); - - if ( event.currentTarget.id === 'clear-gallery' ) { - //remove value from input - - var rmVal = current_gallery.find( '.gallery_values' ).val( '' ); - - //remove preview images - current_gallery.find( ".screenshot" ).html( "" ); - - return; - - } - - // Make sure the media gallery API exists - if ( typeof wp === 'undefined' || !wp.media || !wp.media.gallery ) { - return; - } - event.preventDefault(); - - // Activate the media editor - var $$ = $( this ); - - var val = current_gallery.find( '.gallery_values' ).val(); - var final; - - if ( !val ) { - final = '[gallery ids="0"]'; - } else { - final = '[gallery ids="' + val + '"]'; - } - - var frame = wp.media.gallery.edit( final ); - - // When the gallery-edit state is updated, copy the attachment ids across - frame.state( 'gallery-edit' ).on( - 'update', function( selection ) { - - //clear screenshot div so we can append new selected images - current_gallery.find( ".screenshot" ).html( "" ); - - var element, preview_html = "", preview_img; - var ids = selection.models.map( - function( e ) { - element = e.toJSON(); - preview_img = typeof element.sizes.thumbnail !== 'undefined' ? element.sizes.thumbnail.url : element.url; - preview_html = ""; - current_gallery.find( ".screenshot" ).append( preview_html ); - - return e.id; - } - ); - - current_gallery.find( '.gallery_values' ).val( ids.join( ',' ) ); - redux_change( current_gallery.find( '.gallery_values' ) ); - - } - ); - - return false; - } - }, '.gallery-attachments' - ); - } - ); - - }; -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/gallery/field_gallery.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/gallery/field_gallery.min.js deleted file mode 100755 index 37144cad..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/gallery/field_gallery.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.gallery=redux.field_objects.gallery||{},a(document).ready(function(){}),redux.field_objects.gallery.init=function(b){b||(b=a(document).find(".redux-container-gallery:visible")),a(b).each(function(){var b=a(this),c=b;b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),c.is(":hidden")||c.hasClass("redux-field-init")&&(c.removeClass("redux-field-init"),b.on({click:function(b){wp.media.view.Settings.Gallery=wp.media.view.Settings.Gallery.extend({template:function(a){}});var c=a(this).closest("fieldset");if("clear-gallery"===b.currentTarget.id){c.find(".gallery_values").val("");return void c.find(".screenshot").html("")}if("undefined"!=typeof wp&&wp.media&&wp.media.gallery){b.preventDefault();var d,e=(a(this),c.find(".gallery_values").val());d=e?'[gallery ids="'+e+'"]':'[gallery ids="0"]';var f=wp.media.gallery.edit(d);return f.state("gallery-edit").on("update",function(a){c.find(".screenshot").html("");var b,d,e="",f=a.models.map(function(a){return b=a.toJSON(),d="undefined"!=typeof b.sizes.thumbnail?b.sizes.thumbnail.url:b.url,e="",c.find(".screenshot").append(e),a.id});c.find(".gallery_values").val(f.join(",")),redux_change(c.find(".gallery_values"))}),!1}}},".gallery-attachments"))})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/gallery/field_gallery.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/gallery/field_gallery.php deleted file mode 100755 index 116f780f..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/gallery/field_gallery.php +++ /dev/null @@ -1,105 +0,0 @@ -. - * - * @package ReduxFramework - * @subpackage Field_Gallery - * @author Abdullah Almesbahi (cadr-sa) - * @version 3.0.0 - */ - -// Exit if accessed directly -if ( ! defined( 'ABSPATH' ) ) { - exit; -} - -// Don't duplicate me! -if ( ! class_exists( 'ReduxFramework_gallery' ) ) { - - /** - * Main ReduxFramework_gallery class - * - * @since 3.0.0 - */ - class ReduxFramework_gallery { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct( $field = array(), $value = '', $parent ) { - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - echo '
    '; - - if ( ! empty( $this->value ) ) { - $ids = explode( ',', $this->value ); - - foreach ( $ids as $attachment_id ) { - $img = wp_get_attachment_image_src( $attachment_id, 'thumbnail' ); - echo ''; - echo ''; - echo ''; - } - } - - echo '
    '; - echo '' . __( 'Add/Edit Gallery', 'redux-framework' ) . ' '; - echo '' . __( 'Clear Gallery', 'redux-framework' ) . ''; - echo ''; - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue() { - - if ( function_exists( 'wp_enqueue_media' ) ) { - wp_enqueue_media(); - } else { - wp_enqueue_script( 'media-upload' ); - wp_enqueue_script( 'thickbox' ); - wp_enqueue_style( 'thickbox' ); - } - - wp_enqueue_script( - 'redux-field-gallery-js', - ReduxFramework::$_url . 'inc/fields/gallery/field_gallery' . Redux_Functions::isMin() . '.js', - array( 'jquery', 'redux-js' ), - time(), - true - ); - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.css deleted file mode 100755 index 474f9346..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.css +++ /dev/null @@ -1 +0,0 @@ -.redux-container-image_select .redux-table-container{display:table;table-layout:fixed;width:100%}.redux-container-image_select .redux-image-select{margin:0 !important}.redux-container-image_select .redux-image-select .tiles{display:block;background-color:#FFF;background-repeat:repeat;width:40px;height:40px}.redux-container-image_select .redux-image-select img,.redux-container-image_select .redux-image-select .tiles{border-color:#d9d9d9}.redux-container-image_select .redux-image-select li:last-child{margin-bottom:0}.redux-container-image_select .redux-image-select input[type='radio']{display:none}.redux-container-image_select .redux-image-select-presets img{width:100%}.redux-container-image_select ul.redux-image-select li{margin:0 10px 3px 10px;display:inline-block;padding:2px 2px;padding-left:0}.redux-container-image_select .redux-image-select-selected{background-color:#f9f9f9}.redux-container-image_select .redux-image-select img,.redux-container-image_select .redux-image-select-selected img,.redux-container-image_select .redux-image-select .tiles,.redux-container-image_select .redux-image-select-selected .tiles{border-width:4px;border-style:solid}.redux-container-image_select .redux-image-select-selected .tiles,.redux-container-image_select .redux-image-select-selected .tiles{border-color:#7a7a7a} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.js deleted file mode 100755 index ae209b39..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.js +++ /dev/null @@ -1,119 +0,0 @@ -/* global confirm, redux, redux_change */ - -/*global redux_change, redux*/ - -(function( $ ) { - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.image_select = redux.field_objects.image_select || {}; - - $( document ).ready( - function() { - //redux.field_objects.image_select.init(); - } - ); - - redux.field_objects.image_select.init = function( selector ) { - - if ( !selector ) { - selector = $( document ).find( ".redux-group-tab:visible" ).find( '.redux-container-image_select:visible' ); - } - - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - // On label click, change the input and class - el.find( '.redux-image-select label img, .redux-image-select label .tiles' ).click( - function( e ) { - var id = $( this ).closest( 'label' ).attr( 'for' ); - - $( this ).parents( "fieldset:first" ).find( '.redux-image-select-selected' ).removeClass( 'redux-image-select-selected' ).find( "input[type='radio']" ).attr( - "checked", false - ); - $( this ).closest( 'label' ).find( 'input[type="radio"]' ).prop( 'checked' ); - - if ( $( this ).closest( 'label' ).hasClass( 'redux-image-select-preset-' + id ) ) { // If they clicked on a preset, import! - e.preventDefault(); - - var presets = $( this ).closest( 'label' ).find( 'input' ); - var data = presets.data( 'presets' ); - var merge = presets.data( 'merge' ); - - if( merge !== undefined && merge !== null ) { - if( $.type( merge ) === 'string' ) { - merge = merge.split('|'); - } - - $.each(data, function( index, value ) { - if( ( merge === true || $.inArray( index, merge ) != -1 ) && $.type( redux.options[index] ) === 'object' ) { - data[index] = $.extend(redux.options[index], data[index]); - } - }); - } - - if ( presets !== undefined && presets !== null ) { - var answer = confirm( redux.args.preset_confirm ); - - if ( answer ) { - el.find( 'label[for="' + id + '"]' ).addClass( 'redux-image-select-selected' ).find( "input[type='radio']" ).attr( - "checked", true - ); - window.onbeforeunload = null; - if ( $( '#import-code-value' ).length === 0 ) { - $( this ).append( '' ); - } else { - $( '#import-code-value' ).val( JSON.stringify( data ) ); - } - if ( $( '#publishing-action #publish' ).length !== 0 ) { - $( '#publish' ).click(); - } else { - $( '#redux-import' ).click(); - } - } - } else { - } - - return false; - } else { - el.find( 'label[for="' + id + '"]' ).addClass( 'redux-image-select-selected' ).find( "input[type='radio']" ).attr( - "checked", true - ).trigger('change'); - - redux_change( $( this ).closest( 'label' ).find( 'input[type="radio"]' ) ); - } - } - ); - - // Used to display a full image preview of a tile/pattern - el.find( '.tiles' ).qtip( - { - content: { - text: function( event, api ) { - return ""; - }, - }, - style: 'qtip-tipsy', - position: { - my: 'top center', // Position my top left... - at: 'bottom center', // at the bottom right of... - } - } - ); - } - ); - - }; -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.min.js deleted file mode 100755 index c4e415ea..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.image_select=redux.field_objects.image_select||{},a(document).ready(function(){}),redux.field_objects.image_select.init=function(b){b||(b=a(document).find(".redux-group-tab:visible").find(".redux-container-image_select:visible")),a(b).each(function(){var b=a(this),c=b;b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),c.is(":hidden")||c.hasClass("redux-field-init")&&(c.removeClass("redux-field-init"),b.find(".redux-image-select label img, .redux-image-select label .tiles").click(function(c){var d=a(this).closest("label").attr("for");if(a(this).parents("fieldset:first").find(".redux-image-select-selected").removeClass("redux-image-select-selected").find("input[type='radio']").attr("checked",!1),a(this).closest("label").find('input[type="radio"]').prop("checked"),a(this).closest("label").hasClass("redux-image-select-preset-"+d)){c.preventDefault();var e=a(this).closest("label").find("input"),f=e.data("presets"),g=e.data("merge");if(void 0!==g&&null!==g&&("string"===a.type(g)&&(g=g.split("|")),a.each(f,function(b,c){g!==!0&&-1==a.inArray(b,g)||"object"!==a.type(redux.options[b])||(f[b]=a.extend(redux.options[b],f[b]))})),void 0!==e&&null!==e){var h=confirm(redux.args.preset_confirm);h&&(b.find('label[for="'+d+'"]').addClass("redux-image-select-selected").find("input[type='radio']").attr("checked",!0),window.onbeforeunload=null,0===a("#import-code-value").length?a(this).append('"):a("#import-code-value").val(JSON.stringify(f)),0!==a("#publishing-action #publish").length?a("#publish").click():a("#redux-import").click())}return!1}b.find('label[for="'+d+'"]').addClass("redux-image-select-selected").find("input[type='radio']").attr("checked",!0).trigger("change"),redux_change(a(this).closest("label").find('input[type="radio"]'))}),b.find(".tiles").qtip({content:{text:function(b,c){return""}},style:"qtip-tipsy",position:{my:"top center",at:"bottom center"}}))})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.php deleted file mode 100755 index 534da02a..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.php +++ /dev/null @@ -1,274 +0,0 @@ -. - * - * @package ReduxFramework - * @subpackage Field_Images - * @author Daniel J Griffiths (Ghost1227) - * @author Dovy Paukstys - * @version 3.0.0 - */ - -// Exit if accessed directly -if ( ! defined( 'ABSPATH' ) ) { - exit; -} - -// Don't duplicate me! -if ( ! class_exists( 'ReduxFramework_image_select' ) ) { - - /** - * Main ReduxFramework_image_select class - * - * @since 1.0.0 - */ - class ReduxFramework_image_select { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct( $field = array(), $value = '', $parent ) { - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - - if ( ! empty( $this->field['options'] ) ) { - echo '
    '; - echo '
      '; - - $x = 1; - - foreach ( $this->field['options'] as $k => $v ) { - - if ( ! is_array( $v ) ) { - $v = array( 'img' => $v ); - } - - if ( ! isset( $v['title'] ) ) { - $v['title'] = ''; - } - - if ( ! isset( $v['alt'] ) ) { - $v['alt'] = $v['title']; - } - - if ( ! isset( $v['class'] ) ) { - $v['class'] = ''; - } - - $style = ''; - - if ( ! empty( $this->field['width'] ) ) { - $style .= 'width: ' . $this->field['width']; - - if ( is_numeric( $this->field['width'] ) ) { - $style .= 'px'; - } - - $style .= ';'; - } else { - $style .= " width: 100%; "; - } - - if ( ! empty( $this->field['height'] ) ) { - $style .= 'height: ' . $this->field['height']; - - if ( is_numeric( $this->field['height'] ) ) { - $style .= 'px'; - } - - $style .= ';'; - } - - $theValue = $k; - if ( ! empty( $this->field['tiles'] ) && $this->field['tiles'] == true ) { - $theValue = $v['img']; - } - - $selected = ( checked( $this->value, $theValue, false ) != '' ) ? ' redux-image-select-selected' : ''; - - $presets = ''; - $is_preset = false; - - $this->field['class'] .= ' noUpdate '; - if ( isset( $this->field['presets'] ) && $this->field['presets'] !== false ) { - $this->field['class'] = trim($this->field['class']); - if ( ! isset( $v['presets'] ) ) { - $v['presets'] = array(); - } - - if ( ! is_array( $v['presets'] ) ) { - $v['presets'] = json_decode( $v['presets'], true ); - } - - // Only highlight the preset if it's the same - if ( $selected ) { - if ( empty( $v['presets'] ) ) { - $selected = false; - } else { - foreach ( $v['presets'] as $pk => $pv ) { - if ( isset( $v['merge'] ) && $v['merge'] !== false ) { - if( ( $v['merge'] === true || in_array( $pk, $v['merge'] ) ) && is_array( $this->parent->options[ $pk ] ) ) { - $pv = array_merge( $this->parent->options[ $pk ], $pv ); - } - } - - if ( empty( $pv ) && isset( $this->parent->options[ $pk ] ) && ! empty( $this->parent->options[ $pk ] ) ) { - $selected = false; - } else if ( ! empty( $pv ) && ! isset( $this->parent->options[ $pk ] ) ) { - $selected = false; - } else if ( isset( $this->parent->options[ $pk ] ) && $this->parent->options[ $pk ] != $pv ) { - $selected = false; - } - - if ( ! $selected ) { // We're still not using the same preset. Let's unset that shall we? - $this->value = ""; - break; - } - } - } - } - - $v['presets']['redux-backup'] = 1; - - $presets = ' data-presets="' . htmlspecialchars( json_encode( $v['presets'] ), ENT_QUOTES, 'UTF-8' ) . '"'; - $is_preset = true; - - $this->field['class'] = trim( $this->field['class'] ) . ' redux-presets'; - } - - $is_preset_class = $is_preset ? '-preset-' : ' '; - - $merge = ''; - if ( isset( $v['merge'] ) && $v['merge'] !== false ) { - $merge = is_array( $v['merge'] ) ? implode( '|', $v['merge'] ) : 'true'; - $merge = ' data-merge="' . htmlspecialchars( $merge, ENT_QUOTES, 'UTF-8' ) . '"'; - } - - echo '
    • '; - echo ''; - echo '
    • '; - - $x ++; - } - - echo '
    '; - echo '
    '; - } - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue() { - - wp_enqueue_script( - 'redux-field-image-select-js', - ReduxFramework::$_url . 'inc/fields/image_select/field_image_select' . Redux_Functions::isMin() . '.js', - array( 'jquery', 'redux-js' ), - time(), - true - ); - - if ($this->parent->args['dev_mode']) { - wp_enqueue_style( - 'redux-field-image-select-css', - ReduxFramework::$_url . 'inc/fields/image_select/field_image_select.css', - array(), - time(), - 'all' - ); - } - } - - public function getCSS( $mode = '' ) { - $css = ''; - $value = $this->value; - - $output = ''; - if ( ! empty( $value ) && ! is_array($value) ) { - switch ( $mode ) { - case 'background-image': - $output = "background-image: url('" . $value . "');"; - break; - - default: - $output = $mode . ": " . $value . ";"; - } - } - - $css .= $output; - - return $css; - } - - public function output() { - $mode = ( isset( $this->field['mode'] ) && ! empty( $this->field['mode'] ) ? $this->field['mode'] : 'background-image' ); - - if ( ( ! isset( $this->field['output'] ) || ! is_array( $this->field['output'] ) ) && ( ! isset( $this->field['compiler'] ) ) ) { - return; - } - - $style = $this->getCSS( $mode ); - - if ( ! empty( $style ) ) { - - if ( ! empty( $this->field['output'] ) && is_array( $this->field['output'] ) ) { - $keys = implode( ",", $this->field['output'] ); - $style = $keys . "{" . $style . '}'; - $this->parent->outputCSS .= $style; - } - - if ( ! empty( $this->field['compiler'] ) && is_array( $this->field['compiler'] ) ) { - $keys = implode( ",", $this->field['compiler'] ); - $style = $keys . "{" . $style . '}'; - $this->parent->compilerCSS .= $style; - } - } - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.scss deleted file mode 100755 index 914ccd59..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/image_select/field_image_select.scss +++ /dev/null @@ -1,62 +0,0 @@ -.redux-container-image_select { - .redux-table-container { - display: table; - table-layout: fixed; - width: 100%; - } - - .redux-image-select { - margin: 0 !important; - - .tiles { - display: block; - background-color: #FFF; - background-repeat: repeat; - width: 40px; - height: 40px; - } - - img, - .tiles { - border-color: #d9d9d9; - } - - li:last-child { - margin-bottom: 0; - } - - input[type='radio'] { - display: none; - } - } - - .redux-image-select-presets img { - width: 100%; - } - - ul.redux-image-select li { - margin: 0 10px 3px 10px; - display: inline-block; - padding: 2px 2px; - padding-left: 0; - } - - .redux-image-select-selected { - background-color: #f9f9f9; - } - - .redux-image-select img, - .redux-image-select-selected img, - .redux-image-select .tiles, - .redux-image-select-selected .tiles { - border-width: 4px; - border-style: solid; - } - - .redux-image-select-selected, - .redux-image-select-selected { - .tiles { - border-color: #7a7a7a; - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/info/field_info.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/info/field_info.css deleted file mode 100755 index 357214d3..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/info/field_info.css +++ /dev/null @@ -1 +0,0 @@ -.redux-info-field{min-height:20px;padding:8px 19px;margin:10px 0;border:1px solid;border-radius:4px;border:1px solid;position:relative}.redux-info-field h1,.redux-info-field h2,.redux-info-field h3,.redux-info-field h4,.redux-info-field h5,.redux-info-field h6{border-bottom:0 !important}.redux-info-field h3{color:#777}.redux-info-field .redux-info-icon{display:inline-block;margin-right:15px}.redux-info-field .redux-info-icon i{font-size:2em}.redux-info-field .redux-info-desc{display:inline-block;vertical-align:top}.redux-info-field.redux-normal{background-color:#eeeeee;border-color:#cccccc;color:#666666}.redux-info-field.redux-normal i{color:#c5c5c5}.redux-info-field.redux-warning{background-color:#fbeba4;border-color:#d7c281;color:#958234}.redux-info-field.redux-warning i{color:#dcca81}.redux-info-field.redux-success{background-color:#c4ee91;border-color:#71af5d;color:#4d7615}.redux-info-field.redux-success i{color:#a0ca6c}.redux-info-field.redux-critical{background-color:#fba1a3;border-color:#b84f5b;color:#981225}.redux-info-field.redux-critical i{color:#dd767d}.redux-info-field.redux-info{background-color:#d3e4f4;border-color:#a9b6c2;color:#5c80a1}.redux-info-field.redux-info i{color:#afc6da}.redux-notice-field{margin:15px 0 0;background-color:#fff;border:0;border-left:4px solid #f3f3f3;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);padding:1px 12px}.redux-notice-field h1,.redux-notice-field h2,.redux-notice-field h3,.redux-notice-field h4,.redux-notice-field h5,.redux-notice-field h6{border-bottom:0 !important}.redux-notice-field p{margin:.5em 0;padding:2px}.redux-notice-field .redux-info-icon{display:inline-block;margin-right:15px}.redux-notice-field .redux-info-icon i{font-size:2em}.redux-notice-field .redux-info-desc{display:inline-block;vertical-align:top}.redux-notice-field.redux-info{border-left:4px solid #0099d5}.redux-notice-field.redux-success{border-left:4px solid #7ad03a}.redux-notice-field.redux-warning{border-left:4px solid #fbeba4}.redux-notice-field.redux-critical{border-left:4px solid #dd3d36}.redux-main .redux-field-container.redux-container-info{padding:0}.wp-customizer .hasIcon.redux-notice-field .redux-info-desc,.wp-customizer .hasIcon.redux-info-field .redux-info-desc{display:block;margin-left:43px}.wp-customizer .hasIcon.redux-notice-field .redux-info-icon,.wp-customizer .hasIcon.redux-info-field .redux-info-icon{float:left}.wp-customizer .redux-main .customize-control.customize-control-redux-info{border-bottom:0} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/info/field_info.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/info/field_info.php deleted file mode 100755 index 515a180a..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/info/field_info.php +++ /dev/null @@ -1,167 +0,0 @@ -. - * - * @package ReduxFramework - * @subpackage Field_Info - * @author Daniel J Griffiths (Ghost1227) - * @author Dovy Paukstys - * @version 3.0.0 - */ - -// Exit if accessed directly - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - -// Don't duplicate me! - if ( ! class_exists( 'ReduxFramework_info' ) ) { - - /** - * Main ReduxFramework_info class - * - * @since 1.0.0 - */ - class ReduxFramework_info { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct( $field = array(), $value = '', $parent ) { - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - - $defaults = array( - 'title' => '', - 'desc' => '', - 'notice' => true, - 'style' => '', - 'color' => '', - ); - - $this->field = wp_parse_args( $this->field, $defaults ); - - $styles = array( - 'normal', - 'info', - 'warning', - 'success', - 'critical', - 'custom' - ); - - if (!in_array($this->field['style'], $styles)) { - $this->field['style'] = 'normal'; - } - if ($this->field['style'] == "custom") { - if (!empty($this->field['color']) ) { - $this->field['color'] = "border-color:".$this->field['color'].';'; - } else { - $this->field['style'] = 'normal'; - $this->field['color'] = ""; - } - } else { - $this->field['color'] = ""; - } - - if ( empty( $this->field['desc'] ) && ! empty( $this->field['default'] ) ) { - $this->field['desc'] = $this->field['default']; - unset( $this->field['default'] ); - } - - if ( empty( $this->field['desc'] ) && ! empty( $this->field['subtitle'] ) ) { - $this->field['desc'] = $this->field['subtitle']; - unset( $this->field['subtitle'] ); - } - - if ( empty( $this->field['desc'] ) ) { - $this->field['desc'] = ""; - } - - if ( empty( $this->field['raw_html'] ) ) { - if ( $this->field['notice'] == true ) { - $this->field['class'] .= ' redux-notice-field'; - } else { - $this->field['class'] .= ' redux-info-field'; - } - - - - $this->field['style'] = 'redux-' . $this->field['style'] . ' '; - } - - $indent = ( isset( $this->field['sectionIndent'] ) && $this->field['sectionIndent'] ) ? ' form-table-section-indented' : ''; - - echo '
    field['style']) . ' ' . esc_attr($this->field['class']) . ' redux-field-' . esc_attr($this->field['type']) . esc_attr($indent) . '"'.( !empty($this->field['color']) ? ' style="' . esc_attr($this->field['color']) . '"' : '' ) . '>'; - - if ( ! empty( $this->field['raw_html'] ) && $this->field['raw_html'] ) { - echo wp_kses_post($this->field['desc']); - } else { - if ( isset( $this->field['title'] ) && ! empty( $this->field['title'] ) ) { - $this->field['title'] = '' . wp_kses_post($this->field['title']) . '
    '; - } - - if ( isset( $this->field['icon'] ) && ! empty( $this->field['icon'] ) && $this->field['icon'] !== true ) { - echo '

    '; - } - - if ( isset( $this->field['raw'] ) && ! empty( $this->field['raw'] ) ) { - echo wp_kses_post($this->field['raw']); - } - - if ( ! empty( $this->field['title'] ) || ! empty( $this->field['desc'] ) ) { - echo '

    ' . wp_kses_post($this->field['title']) . wp_kses_post($this->field['desc']) . '

    '; - } - } - - echo '
    '; - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue() { - if ($this->parent->args['dev_mode']) { - wp_enqueue_style( - 'redux-field-info-css', - ReduxFramework::$_url . 'inc/fields/info/field_info.css', - array(), - time(), - 'all' - ); - } - } - } - } \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/info/field_info.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/info/field_info.scss deleted file mode 100755 index 644801e2..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/info/field_info.scss +++ /dev/null @@ -1,159 +0,0 @@ -.redux-info-field { - min-height: 20px; - padding: 8px 19px; - margin: 10px 0; - border: 1px solid; - border-radius: 4px; - border: 1px solid; - position: relative; - - h1, - h2, - h3, - h4, - h5, - h6 { - border-bottom: 0 !important; - } - - h3 { - color: #777; - } - - .redux-info-icon { - display: inline-block; - margin-right: 15px; - - i { - font-size: 2em; - } - } - - .redux-info-desc { - display: inline-block; - vertical-align: top; - } - - &.redux-normal { - background-color: #eeeeee; - border-color: #cccccc; - color: #666666; - - i { - color: #c5c5c5; - } - } - - &.redux-warning { - background-color: #fbeba4; - border-color: #d7c281; - color: #958234; - - i { - color: #dcca81; - } - } - - &.redux-success { - background-color: #c4ee91; - border-color: #71af5d; - color: #4d7615; - - i { - color: #a0ca6c; - } - } - - &.redux-critical { - background-color: #fba1a3; - border-color: #b84f5b; - color: #981225; - - i { - color: #dd767d; - } - } - - &.redux-info { - background-color: #d3e4f4; - border-color: #a9b6c2; - color: #5c80a1; - - i { - color: #afc6da; - } - } -} - -.redux-notice-field { - margin: 15px 0 0; - background-color: #fff; - border: 0; - border-left: 4px solid #f3f3f3; - -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1); - box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1); - padding: 1px 12px; - - h1, - h2, - h3, - h4, - h5, - h6 { - border-bottom: 0 !important; - } - - p { - margin: .5em 0; - padding: 2px; - } - - .redux-info-icon { - display: inline-block; - margin-right: 15px; - - i { - font-size: 2em; - } - } - - .redux-info-desc { - display: inline-block; - vertical-align: top; - } - - &.redux-info { - border-left: 4px solid #0099d5; - } - - &.redux-success { - border-left: 4px solid #7ad03a; - } - - &.redux-warning { - border-left: 4px solid #fbeba4; - } - - &.redux-critical { - border-left: 4px solid #dd3d36; - } -} - -.redux-main .redux-field-container.redux-container-info { - padding: 0; -} - -.wp-customizer { - .hasIcon.redux-notice-field, .hasIcon.redux-info-field { - .redux-info-desc { - display: block; - margin-left: 43px; - } - .redux-info-icon { - float: left; - } - } - .redux-main .customize-control.customize-control-redux-info { - border-bottom: 0; - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.css deleted file mode 100755 index e19ead0b..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.css +++ /dev/null @@ -1 +0,0 @@ -.redux-container-link_color .linkColor{display:inline-block;padding-right:10px;padding-bottom:7px} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.js deleted file mode 100755 index 48d5e2bf..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.js +++ /dev/null @@ -1,111 +0,0 @@ -/* - Field Link Color - */ - -/*global jQuery, document, redux_change, redux*/ - -(function( $ ) { - 'use strict'; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.link_color = redux.field_objects.link_color || {}; - - $( document ).ready( - function() { - - } - ); - - redux.field_objects.link_color.init = function( selector ) { - - if ( !selector ) { - selector = $( document ).find( '.redux-container-link_color:visible' ); - } - - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - - el.find( '.redux-color-init' ).wpColorPicker( - { - change: function( e, ui ) { - $( this ).val( ui.color.toString() ); - redux_change( $( this ) ); - el.find( '#' + e.target.getAttribute( 'data-id' ) + '-transparency' ).removeAttr( 'checked' ); - }, - clear: function( e, ui ) { - $( this ).val( ui.color.toString() ); - redux_change( $( this ).parent().find( '.redux-color-init' ) ); - } - } - ); - - el.find( '.redux-color' ).on( - 'keyup', function() { - var value = $( this ).val(); - var color = colorValidate( this ); - var id = '#' + $( this ).attr( 'id' ); - - if ( value === "transparent" ) { - $( this ).parent().parent().find( '.wp-color-result' ).css( - 'background-color', 'transparent' - ); - - el.find( id + '-transparency' ).attr( 'checked', 'checked' ); - } else { - el.find( id + '-transparency' ).removeAttr( 'checked' ); - - if ( color && color !== $( this ).val() ) { - $( this ).val( color ); - } - } - } - ); - - // Replace and validate field on blur - el.find( '.redux-color' ).on( - 'blur', function() { - var value = $( this ).val(); - var id = '#' + $( this ).attr( 'id' ); - - if ( value === "transparent" ) { - $( this ).parent().parent().find( '.wp-color-result' ).css( - 'background-color', 'transparent' - ); - - el.find( id + '-transparency' ).attr( 'checked', 'checked' ); - } else { - if ( colorValidate( this ) === value ) { - if ( value.indexOf( "#" ) !== 0 ) { - $( this ).val( $( this ).data( 'oldcolor' ) ); - } - } - - el.find( id + '-transparency' ).removeAttr( 'checked' ); - } - } - ); - - // Store the old valid color on keydown - el.find( '.redux-color' ).on( - 'keydown', function() { - $( this ).data( 'oldkeypress', $( this ).val() ); - } - ); - } - ); - }; -})( jQuery ); diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.min.js deleted file mode 100755 index 354f8ea6..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.link_color=redux.field_objects.link_color||{},a(document).ready(function(){}),redux.field_objects.link_color.init=function(b){b||(b=a(document).find(".redux-container-link_color:visible")),a(b).each(function(){var b=a(this),c=b;b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),c.is(":hidden")||c.hasClass("redux-field-init")&&(c.removeClass("redux-field-init"),b.find(".redux-color-init").wpColorPicker({change:function(c,d){a(this).val(d.color.toString()),redux_change(a(this)),b.find("#"+c.target.getAttribute("data-id")+"-transparency").removeAttr("checked")},clear:function(b,c){a(this).val(c.color.toString()),redux_change(a(this).parent().find(".redux-color-init"))}}),b.find(".redux-color").on("keyup",function(){var c=a(this).val(),d=colorValidate(this),e="#"+a(this).attr("id");"transparent"===c?(a(this).parent().parent().find(".wp-color-result").css("background-color","transparent"),b.find(e+"-transparency").attr("checked","checked")):(b.find(e+"-transparency").removeAttr("checked"),d&&d!==a(this).val()&&a(this).val(d))}),b.find(".redux-color").on("blur",function(){var c=a(this).val(),d="#"+a(this).attr("id");"transparent"===c?(a(this).parent().parent().find(".wp-color-result").css("background-color","transparent"),b.find(d+"-transparency").attr("checked","checked")):(colorValidate(this)===c&&0!==c.indexOf("#")&&a(this).val(a(this).data("oldcolor")),b.find(d+"-transparency").removeAttr("checked"))}),b.find(".redux-color").on("keydown",function(){a(this).data("oldkeypress",a(this).val())}))})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.php deleted file mode 100755 index 3a6d24a3..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.php +++ /dev/null @@ -1,224 +0,0 @@ -. - * - * @package ReduxFramework - * @subpackage Field_Color_Gradient - * @author Luciano "WebCaos" Ubertini - * @author Daniel J Griffiths (Ghost1227) - * @author Dovy Paukstys - * @author Kevin Provance (kprovance) - fixing everyone else's bugs. - * @version 3.0.0 - */ - -// Exit if accessed directly -if ( ! defined( 'ABSPATH' ) ) { - exit; -} - -// Don't duplicate me! -if ( ! class_exists( 'ReduxFramework_link_color' ) ) { - - /** - * Main ReduxFramework_link_color class - * - * @since 1.0.0 - */ - class ReduxFramework_link_color { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct( $field = array(), $value = '', $parent ) { - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - - $defaults = array( - 'regular' => true, - 'hover' => true, - 'visited' => false, - 'active' => true - ); - $this->field = wp_parse_args( $this->field, $defaults ); - - $defaults = array( - 'regular' => '', - 'hover' => '', - 'visited' => '', - 'active' => '' - ); - - $this->value = wp_parse_args( $this->value, $defaults ); - - // In case user passes no default values. - if ( isset( $this->field['default'] ) ) { - $this->field['default'] = wp_parse_args( $this->field['default'], $defaults ); - } else { - $this->field['default'] = $defaults; - } - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - - if ( $this->field['regular'] === true && $this->field['default']['regular'] !== false ) { - echo '' . __( 'Regular', 'redux-framework' ) . ' '; - } - - if ( $this->field['hover'] === true && $this->field['default']['hover'] !== false ) { - echo '' . __( 'Hover', 'redux-framework' ) . ' '; - } - - if ( $this->field['visited'] === true && $this->field['default']['visited'] !== false ) { - echo '' . __( 'Visited', 'redux-framework' ) . ' '; - } - - if ( $this->field['active'] === true && $this->field['default']['active'] !== false ) { - echo '' . __( 'Active', 'redux-framework' ) . ' '; - } - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue() { - wp_enqueue_style( 'wp-color-picker' ); - - wp_enqueue_script( - 'redux-field-link-color-js', - ReduxFramework::$_url . 'inc/fields/link_color/field_link_color' . Redux_Functions::isMin() . '.js', - array( 'jquery', 'wp-color-picker', 'redux-js' ), - time(), - true - ); - - if ($this->parent->args['dev_mode']) { - wp_enqueue_style( 'redux-color-picker-css' ); - - wp_enqueue_style( - 'redux-field-link_color-js', - ReduxFramework::$_url . 'inc/fields/link_color/field_link_color.css', - array(), - time(), - 'all' - ); - } - } - - public function output() { - - $style = array(); - - if ( ! empty( $this->value['regular'] ) && $this->field['regular'] === true && $this->field['default']['regular'] !== false ) { - $style[] = 'color:' . $this->value['regular'] . ';'; - } - - if ( ! empty( $this->value['visited'] ) && $this->field['visited'] === true && $this->field['default']['visited'] !== false ) { - $style['visited'] = 'color:' . $this->value['visited'] . ';'; - } - - if ( ! empty( $this->value['hover'] ) && $this->field['hover'] === true && $this->field['default']['hover'] !== false ) { - $style['hover'] = 'color:' . $this->value['hover'] . ';'; - } - - if ( ! empty( $this->value['active'] ) && $this->field['active'] === true && $this->field['default']['active'] !== false ) { - $style['active'] = 'color:' . $this->value['active'] . ';'; - } - - if ( ! empty( $style ) ) { - if ( ! empty( $this->field['output'] ) && is_array( $this->field['output'] ) ) { - $styleString = ""; - - foreach ( $style as $key => $value ) { - if ( is_numeric( $key ) ) { - $styleString .= implode( ",", $this->field['output'] ) . "{" . $value . '}'; - } else { - if ( count( $this->field['output'] ) == 1 ) { - foreach($this->field['output'] as $sel => $elem) { - continue; - } - - if (strpos($elem, ',') != false) { - $selector_arr = explode(',',$elem); - $sel_list = ''; - - foreach($selector_arr as $idx => $selector) { - $sel_list .= $selector . ":" . $key . ","; - } - - $sel_list = rtrim($sel_list,','); - $styleString .= $sel_list . "{" . $value . '}'; - } else { - $styleString .= $elem . ":" . $key . "{" . $value . '}'; - } - } else { - $blah = ''; - foreach($this->field['output'] as $k => $sel) { - $blah .= $sel . ':' . $key . ','; - } - - $blah = substr($blah, 0, strlen($blah) - 1); - $styleString .= $blah . '{' . $value . '}'; - - } - } - } - - $this->parent->outputCSS .= $styleString; - } - - if ( ! empty( $this->field['compiler'] ) && is_array( $this->field['compiler'] ) ) { - $styleString = ""; - - foreach ( $style as $key => $value ) { - if ( is_numeric( $key ) ) { - $styleString .= implode( ",", $this->field['compiler'] ) . "{" . $value . '}'; - - } else { - if ( count( $this->field['compiler'] ) == 1 ) { - $styleString .= $this->field['compiler'][0] . ":" . $key . "{" . $value . '}'; - } else { - $blah = ''; - foreach($this->field['compiler'] as $k => $sel) { - $blah .= $sel . ':' . $key . ','; - } - - $blah = substr($blah, 0, strlen($blah) - 1); - $styleString .= $blah . '{' . $value . '}'; - } - } - } - $this->parent->compilerCSS .= $styleString; - } - } - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.scss deleted file mode 100755 index e3b66dd1..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/link_color/field_link_color.scss +++ /dev/null @@ -1,7 +0,0 @@ -.redux-container-link_color { - .linkColor { - display: inline-block; - padding-right: 10px; - padding-bottom: 7px; - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.css deleted file mode 100755 index 737309c1..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.css +++ /dev/null @@ -1 +0,0 @@ -.redux-main .button.remove-image,.redux-main .removeCSS{margin-left:10px;color:#ef521d}.redux-main .button.remove-image:hover,.redux-main .removeCSS:hover{color:red}.redux-main .upload_button_div{margin-bottom:5px}.redux-main .upload-error{float:left;color:#666;font-size:10px;font-weight:bold;text-decoration:none;text-shadow:1px 1px 0 #FFFFFF;margin:0 10px 0 0;padding:3px 10px;background:#FFDFEC;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.redux-main .reset-button{font-family:Arial, Verdana, sans-serif;float:left;margin:0;color:#ef521d;border-color:#bbb}.redux-main .redux-option-image{max-height:340px;max-width:340px;padding:5px;margin-bottom:0;margin-top:10px;margin-right:15px;border:1px solid #e3e3e3;background:#f7f7f7;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.redux-main .redux-main .upload{width:80% !important}.redux-main .button{margin-top:2px} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.less b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.less deleted file mode 100755 index f78c19bb..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.less +++ /dev/null @@ -1,53 +0,0 @@ -.redux-main { - .button.remove-image, .removeCSS { - margin-left: 10px; - color: #ef521d; - } - .button.remove-image:hover, .removeCSS:hover { - color: red; - } - .upload_button_div { - margin-bottom: 5px; - } - .upload-error { - float: left; - color: #666; - font-size: 10px; - font-weight: bold; - text-decoration: none; - text-shadow: 1px 1px 0 #FFFFFF; - margin: 0 10px 0 0; - padding: 3px 10px; - background: #FFDFEC; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .reset-button { - font-family: Arial, Verdana, sans-serif; - float: left; - margin: 0; - color: #ef521d; - border-color: #bbb; - } - .redux-option-image { - max-height: 340px; - max-width: 340px; - padding: 5px; - margin-bottom: 0; - margin-top: 10px; - margin-right: 15px; - border: 1px solid #e3e3e3; - background: #f7f7f7; - -moz-border-radius: 3px; - -khtml-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - } - .redux-main .upload { - width: 80% !important; - } - .button { - margin-top: 2px; - } -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.php deleted file mode 100755 index bd6ec6a3..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.php +++ /dev/null @@ -1,238 +0,0 @@ -. - * - * @package ReduxFramework - * @subpackage Field_Media - * @author Daniel J Griffiths (Ghost1227) - * @author Dovy Paukstys - * @author Kevin Provance (kprovance) - * @version 3.0.0 - */ - -// Exit if accessed directly -if ( ! defined( 'ABSPATH' ) ) { - exit; -} - -// Don't duplicate me! -if ( ! class_exists( 'ReduxFramework_media' ) ) { - - /** - * Main ReduxFramework_media class - * - * @since 1.0.0 - */ - class ReduxFramework_media { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct( $field = array(), $value = '', $parent ) { - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - - // No errors please - $defaults = array( - 'id' => '', - 'url' => '', - 'width' => '', - 'height' => '', - 'thumbnail' => '', - ); - - $this->value = wp_parse_args( $this->value, $defaults ); - - if (isset($this->field['mode']) && $this->field['mode'] == false) { - $this->field['mode'] = 0; - } - - if ( ! isset( $this->field['mode'] ) ) { - $this->field['mode'] = "image"; - } - - if (!isset($this->field['library_filter'])) { - $libFilter = ''; - } else { - if (!is_array($this->field['library_filter'])) { - $this->field['library_filter'] = array($this->field['library_filter']); - } - - $mimeTypes = get_allowed_mime_types(); - - $libArray = $this->field['library_filter']; - - $jsonArr = array(); - - // Enum mime types - foreach ($mimeTypes as $ext => $type) { - if (strpos($ext,'|')) { - $expArr = explode('|', $ext); - - foreach($expArr as $ext){ - if (in_array($ext, $libArray )) { - $jsonArr[$ext] = $type; - } - } - } elseif (in_array($ext, $libArray )) { - $jsonArr[$ext] = $type; - } - - } - - $libFilter = urlencode(json_encode($jsonArr)); - } - - if ( empty( $this->value ) && ! empty( $this->field['default'] ) ) { // If there are standard values and value is empty - if ( is_array( $this->field['default'] ) ) { - if ( ! empty( $this->field['default']['id'] ) ) { - $this->value['id'] = $this->field['default']['id']; - } - - if ( ! empty( $this->field['default']['url'] ) ) { - $this->value['url'] = $this->field['default']['url']; - } - } else { - if ( is_numeric( $this->field['default'] ) ) { // Check if it's an attachment ID - $this->value['id'] = $this->field['default']; - } else { // Must be a URL - $this->value['url'] = $this->field['default']; - } - } - } - - - if ( empty( $this->value['url'] ) && ! empty( $this->value['id'] ) ) { - $img = wp_get_attachment_image_src( $this->value['id'], 'full' ); - $this->value['url'] = $img[0]; - $this->value['width'] = $img[1]; - $this->value['height'] = $img[2]; - } - - $hide = 'hide '; - - if ( ( isset( $this->field['preview'] ) && $this->field['preview'] === false ) ) { - $this->field['class'] .= " noPreview"; - } - - if ( ( ! empty( $this->field['url'] ) && $this->field['url'] === true ) || isset( $this->field['preview'] ) && $this->field['preview'] === false ) { - $hide = ''; - } - - $placeholder = isset( $this->field['placeholder'] ) ? $this->field['placeholder'] : __( 'No media selected', 'redux-framework' ); - - $readOnly = ' readonly="readonly"'; - if ( isset( $this->field['readonly'] ) && $this->field['readonly'] === false ) { - $readOnly = ''; - } - - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - - //Preview - $hide = ''; - - if ( ( isset( $this->field['preview'] ) && $this->field['preview'] === false ) || empty( $this->value['url'] ) ) { - $hide = 'hide '; - } - - if ( empty( $this->value['thumbnail'] ) && ! empty( $this->value['url'] ) ) { // Just in case - if ( ! empty( $this->value['id'] ) ) { - $image = wp_get_attachment_image_src( $this->value['id'], array( - 150, - 150 - ) ); - - if (empty($image[0]) || $image[0] == '') { - $this->value['thumbnail'] = $this->value['url']; - } else { - $this->value['thumbnail'] = $image[0]; - } - } else { - $this->value['thumbnail'] = $this->value['url']; - } - } - - echo '
    '; - echo ''; - echo ''; - echo ''; - echo '
    '; - - //Upload controls DIV - echo '
    '; - - //If the user has WP3.5+ show upload/remove button - echo '' . __( 'Upload', 'redux-framework' ) . ''; - - $hide = ''; - if ( empty( $this->value['url'] ) || $this->value['url'] == '' ) { - $hide = ' hide'; - } - - echo '' . __( 'Remove', 'redux-framework' ) . ''; - - echo '
    '; - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue() { - if ( function_exists( 'wp_enqueue_media' ) ) { - wp_enqueue_media(); - } else { - wp_enqueue_script( 'media-upload' ); - } - - wp_enqueue_script( - 'redux-field-media-js', - ReduxFramework::$_url . 'assets/js/media/media' . Redux_Functions::isMin() . '.js', - array( 'jquery', 'redux-js' ), - time(), - true - ); - - if ($this->parent->args['dev_mode']) { - wp_enqueue_style('redux-field-media-css'); - } - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.scss deleted file mode 100755 index 86086aed..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/media/field_media.scss +++ /dev/null @@ -1,61 +0,0 @@ -.redux-main { - .button.remove-image, - .removeCSS { - margin-left: 10px; - color: #ef521d; - - &:hover { - color: red; - } - } - - .upload_button_div { - margin-bottom: 5px; - } - - .upload-error { - float: left; - color: #666; - font-size: 10px; - font-weight: bold; - text-decoration: none; - text-shadow: 1px 1px 0 #FFFFFF; - margin: 0 10px 0 0; - padding: 3px 10px; - background: #FFDFEC; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - - .reset-button { - font-family: Arial, Verdana, sans-serif; - float: left; - margin: 0; - color: #ef521d; - border-color: #bbb; - } - - .redux-option-image { - max-height: 340px; - max-width: 340px; - padding: 5px; - margin-bottom: 0; - margin-top: 10px; - margin-right: 15px; - border: 1px solid #e3e3e3; - background: #f7f7f7; - -moz-border-radius: 3px; - -khtml-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - } - - .redux-main .upload { - width: 80% !important; - } - - .button { - margin-top: 2px; - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.css deleted file mode 100755 index 3e0158f9..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.css +++ /dev/null @@ -1 +0,0 @@ -.redux-container-multi_text ul.redux-multi-text{margin:0;padding:0}.redux-container-multi_text .redux-multi-text-add{clear:both;margin:5px 0}.redux-container-multi_text a.redux-multi-text-remove.deletion{color:#F00;padding:2px 4px;margin-left:5px}.redux-container-multi_text a.redux-multi-text-remove.deletion:hover{background:red;color:#fff;text-decoration:none}@media screen and (max-width: 782px){.redux-container-multi_text input{clear:both}.redux-container-multi_text .redux-multi-text-remove{margin:0;float:right}}.wp-customizer .redux-container-multi_text .button{float:right}.wp-customizer .redux-container-multi_text .redux-multi-text-remove{float:right;margin-bottom:5px}.wp-customizer .redux-container-multi_text ul.redux-multi-text input{width:100% !important} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.js deleted file mode 100755 index c8b3df2b..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.js +++ /dev/null @@ -1,65 +0,0 @@ -/*global redux_change, redux*/ - -(function( $ ) { - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.multi_text = redux.field_objects.multi_text || {}; - - $( document ).ready( - function() { - //redux.field_objects.multi_text.init(); - } - ); - - redux.field_objects.multi_text.init = function( selector ) { - - if ( !selector ) { - selector = $( document ).find( '.redux-container-multi_text:visible' ); - } - - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - el.find( '.redux-multi-text-remove' ).live( - 'click', function() { - redux_change( $( this ) ); - $( this ).prev( 'input[type="text"]' ).val( '' ); - $( this ).parent().slideUp( - 'medium', function() { - $( this ).remove(); - } - ); - } - ); - - el.find( '.redux-multi-text-add' ).click( - function() { - var number = parseInt( $( this ).attr( 'data-add_number' ) ); - var id = $( this ).attr( 'data-id' ); - var name = $( this ).attr( 'data-name' ); - for ( var i = 0; i < number; i++ ) { - var new_input = $( '#' + id + ' li:last-child' ).clone(); - el.find( '#' + id ).append( new_input ); - el.find( '#' + id + ' li:last-child' ).removeAttr( 'style' ); - el.find( '#' + id + ' li:last-child input[type="text"]' ).val( '' ); - el.find( '#' + id + ' li:last-child input[type="text"]' ).attr( 'name', name ); - } - } - ); - } - ); - }; -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.min.js deleted file mode 100755 index 06c2cd14..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.multi_text=redux.field_objects.multi_text||{},a(document).ready(function(){}),redux.field_objects.multi_text.init=function(b){b||(b=a(document).find(".redux-container-multi_text:visible")),a(b).each(function(){var b=a(this),c=b;b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),c.is(":hidden")||c.hasClass("redux-field-init")&&(c.removeClass("redux-field-init"),b.find(".redux-multi-text-remove").live("click",function(){redux_change(a(this)),a(this).prev('input[type="text"]').val(""),a(this).parent().slideUp("medium",function(){a(this).remove()})}),b.find(".redux-multi-text-add").click(function(){for(var c=parseInt(a(this).attr("data-add_number")),d=a(this).attr("data-id"),e=a(this).attr("data-name"),f=0;c>f;f++){var g=a("#"+d+" li:last-child").clone();b.find("#"+d).append(g),b.find("#"+d+" li:last-child").removeAttr("style"),b.find("#"+d+' li:last-child input[type="text"]').val(""),b.find("#"+d+' li:last-child input[type="text"]').attr("name",e)}}))})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.php deleted file mode 100755 index b3b2b1de..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.php +++ /dev/null @@ -1,113 +0,0 @@ -. - * - * @package ReduxFramework - * @subpackage Field_Multi_Text - * @author Daniel J Griffiths (Ghost1227) - * @author Dovy Paukstys - * @version 3.0.0 - */ - -// Exit if accessed directly -if ( ! defined( 'ABSPATH' ) ) { - exit; -} - -// Don't duplicate me! -if ( ! class_exists( 'ReduxFramework_multi_text' ) ) { - - /** - * Main ReduxFramework_multi_text class - * - * @since 1.0.0 - */ - class ReduxFramework_multi_text { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct( $field = array(), $value = '', $parent ) { - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - - $this->add_text = ( isset( $this->field['add_text'] ) ) ? $this->field['add_text'] : __( 'Add More', 'redux-framework' ); - $this->show_empty = ( isset( $this->field['show_empty'] ) ) ? $this->field['show_empty'] : true; - - echo ''; - echo ''; - $this->field['add_number'] = ( isset( $this->field['add_number'] ) && is_numeric( $this->field['add_number'] ) ) ? $this->field['add_number'] : 1; - echo '' . $this->add_text . '
    '; - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue() { - - wp_enqueue_script( - 'redux-field-multi-text-js', - ReduxFramework::$_url . 'inc/fields/multi_text/field_multi_text' . Redux_Functions::isMin() . '.js', - array( 'jquery', 'redux-js' ), - time(), - true - ); - - if ($this->parent->args['dev_mode']) { - wp_enqueue_style( - 'redux-field-multi-text-css', - ReduxFramework::$_url . 'inc/fields/multi_text/field_multi_text.css', - array(), - time(), - 'all' - ); - } - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.scss deleted file mode 100755 index f4619fff..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/multi_text/field_multi_text.scss +++ /dev/null @@ -1,53 +0,0 @@ -.redux-container-multi_text { - ul.redux-multi-text { - margin: 0; - padding: 0; - } - - .redux-multi-text-add { - clear: both; - margin: 5px 0; - } - - a.redux-multi-text-remove { - &.deletion { - color: #F00; - padding: 2px 4px; - margin-left: 5px; - - &:hover { - background: red; - color: #fff; - text-decoration: none; - } - } - } -} - -@media screen and (max-width: 782px) { - .redux-container-multi_text { - input { - clear: both; - } - - .redux-multi-text-remove { - margin: 0; - float: right; - } - } -} - -.wp-customizer { - .redux-container-multi_text { - .button { - float: right; - } - .redux-multi-text-remove { - float: right; - margin-bottom: 5px; - } - ul.redux-multi-text input { - width: 100% !important; - } - } -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.css deleted file mode 100755 index 17d81fbe..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.css +++ /dev/null @@ -1 +0,0 @@ -.redux-container-palette label{border:3px solid transparent;border-color:transparent !important;border-radius:0;width:100% !important;display:block}.redux-container-palette label.ui-button.ui-widget{width:95%;background:none;padding:0}.redux-container-palette label.ui-button.ui-widget .ui-button-text{display:flex}.redux-container-palette label.ui-button.ui-widget .ui-button-text span{padding:10px;flex-grow:1;font-size:0;line-height:10px;color:transparent;-webkit-transition:all 200ms ease-in-out;-moz-transition:all 200ms ease-in-out;-ms-transition:all 200ms ease-in-out;-o-transition:all 200ms ease-in-out;transition:all 200ms ease-in-out;text-shadow:0}.redux-container-palette label.ui-button.ui-widget .ui-button-text span:hover{flex-grow:3;font-weight:bold;min-width:60px;font-size:12px;line-height:10px;color:#333;text-shadow:0 0 8px #fff, 0 0 8px #fff}.redux-container-palette label.ui-state-active{border:3px solid #333 !important}.wp-customizer .redux-main .redux-container-palette label{margin-bottom:3px} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.js deleted file mode 100755 index 001efcbd..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - Field Palette (color) - */ - -/*global jQuery, document, redux_change, redux*/ - -(function( $ ) { - 'use strict'; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.palette = redux.field_objects.palette || {}; - - redux.field_objects.palette.init = function( selector ) { - - if ( !selector ) { - selector = $( document ).find( ".redux-group-tab:visible" ).find( '.redux-container-palette:visible' ); - } - - $( selector ).each( - function() { - - var el = $( this ); - var parent = el; - - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - - el.find( '.buttonset' ).each( - function() { - $( this ).buttonset(); - } - ); - -// el.find('.redux-palette-set').click( -// function(){ -// console.log($(this).val()); -// } -// ) - } - ); - }; -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.min.js deleted file mode 100755 index 01209eb7..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.palette=redux.field_objects.palette||{},redux.field_objects.palette.init=function(b){b||(b=a(document).find(".redux-group-tab:visible").find(".redux-container-palette:visible")),a(b).each(function(){var b=a(this),c=b;b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),c.is(":hidden")||c.hasClass("redux-field-init")&&(c.removeClass("redux-field-init"),b.find(".buttonset").each(function(){a(this).buttonset()}))})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.php deleted file mode 100755 index c1e364f3..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.php +++ /dev/null @@ -1,110 +0,0 @@ -. - * - * @package ReduxFramework - * @subpackage Field_Palette - * @author Kevin Provance (kprovance) - * @version 3.5.4 - */ - -// Exit if accessed directly -if ( ! defined( 'ABSPATH' ) ) { - exit; -} - -if ( ! class_exists( 'ReduxFramework_palette' ) ) { - class ReduxFramework_palette { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - function __construct( $field = array(), $value = '', $parent ) { - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settingss - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - if (empty($this->field['palettes'])) { - echo 'No palettes have been set.'; - return; - } - - echo '
    '; - - foreach ( $this->field['palettes'] as $value => $colorSet ) { - $checked = checked( $this->value , $value, false ); - echo ''; - echo ''; - echo ''; - } - - echo '
    '; - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since 1.0.0 - * @access public - * @return void - */ - public function enqueue() { - $min = Redux_Functions::isMin(); - - wp_enqueue_script( - 'redux-field-palette-js', - ReduxFramework::$_url . 'inc/fields/palette/field_palette' . $min . '.js', - array( 'jquery', 'redux-js', 'jquery-ui-button', 'jquery-ui-core' ), - time(), - true - ); - - if ($this->parent->args['dev_mode']) { - wp_enqueue_style( - 'redux-field-palette-css', - ReduxFramework::$_url . 'inc/fields/palette/field_palette.css', - array(), - time(), - 'all' - ); - } - } - - - public function output() { - - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.scss deleted file mode 100755 index 7f6a8f46..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/palette/field_palette.scss +++ /dev/null @@ -1,55 +0,0 @@ -.redux-container-palette { - label { - border: 3px solid transparent; - border-color: transparent !important; - border-radius: 0; - //border: 0; - width: 100% !important; - display: block; - &.ui-button.ui-widget { - width: 95%; - background: none; - padding: 0; - - .ui-button-text { -/* border-top: 3px solid transparent; - border-bottom: 3px solid transparent; - margin-bottom: 5px;*/ - display: flex; - - span { - padding: 10px; - flex-grow: 1; - font-size: 0; - line-height: 10px; - color: rgba(0,0,0,0); - -webkit-transition: all 200ms ease-in-out; - -moz-transition: all 200ms ease-in-out; - -ms-transition: all 200ms ease-in-out; - -o-transition: all 200ms ease-in-out; - transition: all 200ms ease-in-out; - text-shadow: 0; - &:hover { - flex-grow: 3; - font-weight: bold; - min-width: 60px; - font-size: 12px; - line-height: 10px; - color: #333; - text-shadow: 0 0 8px #fff, 0 0 8px #fff; - } - } - } - } - - &.ui-state-active { - border: 3px solid #333 !important; - } - } -} - -.wp-customizer { - .redux-main .redux-container-palette label { - margin-bottom: 3px; - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/password/field_password.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/password/field_password.php deleted file mode 100755 index 0e56e846..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/password/field_password.php +++ /dev/null @@ -1,106 +0,0 @@ -parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since ReduxFramework 1.0.1 - */ - function render() { - if ( ! empty( $this->field['username'] ) && $this->field['username'] === true ) { - $this->_render_combined_field(); - } else { - $this->_render_single_field(); - } - } - - /** - * This will render a combined User/Password field - * - * @since ReduxFramework 3.0.9 - * @example - * - * array( - * 'id' => 'smtp_account', - * 'type' => 'password', - * 'username' => true, - * 'title' => 'SMTP Account', - * 'placeholder' => array('username' => 'Username') - * ) - * - */ - private function _render_combined_field() { - - $defaults = array( - 'username' => '', - 'password' => '', - 'placeholder' => array( - 'password' => __( 'Password', 'redux-framework' ), - 'username' => __( 'Username', 'redux-framework' ) - ) - ); - - $this->value = wp_parse_args( $this->value, $defaults ); - - if ( ! empty( $this->field['placeholder'] ) ) { - if ( is_array( $this->field['placeholder'] ) ) { - if ( ! empty( $this->field['placeholder']['password'] ) ) { - $this->value['placeholder']['password'] = $this->field['placeholder']['password']; - } - if ( ! empty( $this->field['placeholder']['username'] ) ) { - $this->value['placeholder']['username'] = $this->field['placeholder']['username']; - } - } else { - $this->value['placeholder']['password'] = $this->field['placeholder']; - } - } - - // Username field - echo ' '; - - // Password field - echo ''; - } - - /** - * This will render a single Password field - * - * @since ReduxFramework 3.0.9 - * @example - * - * array( - * 'id' => 'smtp_password', - * 'type' => 'password', - * 'title' => 'SMTP Password' - * ) - * - */ - private function _render_single_field() { - echo ''; - } - } - } \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/radio/field_radio.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/radio/field_radio.php deleted file mode 100755 index 75448566..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/radio/field_radio.php +++ /dev/null @@ -1,57 +0,0 @@ -parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since ReduxFramework 1.0.0 - */ - function render() { - - if ( ! empty( $this->field['data'] ) && empty( $this->field['options'] ) ) { - if ( empty( $this->field['args'] ) ) { - $this->field['args'] = array(); - } - $this->field['options'] = $this->parent->get_wordpress_data( $this->field['data'], $this->field['args'] ); - } - - $this->field['data_class'] = ( isset( $this->field['multi_layout'] ) ) ? 'data-' . $this->field['multi_layout'] : 'data-full'; - - if ( ! empty( $this->field['options'] ) ) { - echo '
      '; - - foreach ( $this->field['options'] as $k => $v ) { - echo '
    • '; - echo ''; - echo '
    • '; - } - //foreach - - echo '
    '; - } - } //function - } //class - } \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/raw/field_raw.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/raw/field_raw.php deleted file mode 100755 index fda1ed7e..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/raw/field_raw.php +++ /dev/null @@ -1,53 +0,0 @@ -parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since ReduxFramework 1.0.0 - */ - function render() { - - if ( ! empty( $this->field['include'] ) && file_exists( $this->field['include'] ) ) { - require_once $this->field['include']; - } - - if ( isset( $this->field['content_path'] ) && ! empty( $this->field['content_path'] ) && file_exists( $this->field['content_path'] ) ) { - $this->field['content'] = $this->parent->filesystem->execute( 'get_contents', $this->field['content_path'] ); - } - - if ( ! empty( $this->field['content'] ) && isset( $this->field['content'] ) ) { - if ( isset( $this->field['markdown'] ) && $this->field['markdown'] == true && ! empty( $this->field['content'] ) ) { - require_once dirname( __FILE__ ) . "/parsedown.php"; - $Parsedown = new Parsedown(); - echo $Parsedown->text( $this->field['content'] ); - } else { - echo $this->field['content']; - } - } - - do_action( 'redux-field-raw-' . $this->parent->args['opt_name'] . '-' . $this->field['id'] ); - - } - } - } \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/raw/parsedown.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/raw/parsedown.php deleted file mode 100755 index 26d8830d..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/raw/parsedown.php +++ /dev/null @@ -1,1542 +0,0 @@ -DefinitionData = array(); - - # standardize line breaks - $text = str_replace(array("\r\n", "\r"), "\n", $text); - - # remove surrounding line breaks - $text = trim($text, "\n"); - - # split text into lines - $lines = explode("\n", $text); - - # iterate through lines to identify blocks - $markup = $this->lines($lines); - - # trim line breaks - $markup = trim($markup, "\n"); - - return $markup; - } - - # - # Setters - # - - function setBreaksEnabled($breaksEnabled) - { - $this->breaksEnabled = $breaksEnabled; - - return $this; - } - - protected $breaksEnabled; - - function setMarkupEscaped($markupEscaped) - { - $this->markupEscaped = $markupEscaped; - - return $this; - } - - protected $markupEscaped; - - function setUrlsLinked($urlsLinked) - { - $this->urlsLinked = $urlsLinked; - - return $this; - } - - protected $urlsLinked = true; - - # - # Lines - # - - protected $BlockTypes = array( - '#' => array('Header'), - '*' => array('Rule', 'List'), - '+' => array('List'), - '-' => array('SetextHeader', 'Table', 'Rule', 'List'), - '0' => array('List'), - '1' => array('List'), - '2' => array('List'), - '3' => array('List'), - '4' => array('List'), - '5' => array('List'), - '6' => array('List'), - '7' => array('List'), - '8' => array('List'), - '9' => array('List'), - ':' => array('Table'), - '<' => array('Comment', 'Markup'), - '=' => array('SetextHeader'), - '>' => array('Quote'), - '[' => array('Reference'), - '_' => array('Rule'), - '`' => array('FencedCode'), - '|' => array('Table'), - '~' => array('FencedCode'), - ); - - # ~ - - protected $unmarkedBlockTypes = array( - 'Code', - ); - - # - # Blocks - # - - protected function lines(array $lines) - { - $CurrentBlock = null; - - foreach ($lines as $line) - { - if (chop($line) === '') - { - if (isset($CurrentBlock)) - { - $CurrentBlock['interrupted'] = true; - } - - continue; - } - - if (strpos($line, "\t") !== false) - { - $parts = explode("\t", $line); - - $line = $parts[0]; - - unset($parts[0]); - - foreach ($parts as $part) - { - $shortage = 4 - mb_strlen($line, 'utf-8') % 4; - - $line .= str_repeat(' ', $shortage); - $line .= $part; - } - } - - $indent = 0; - - while (isset($line[$indent]) and $line[$indent] === ' ') - { - $indent ++; - } - - $text = $indent > 0 ? substr($line, $indent) : $line; - - # ~ - - $Line = array('body' => $line, 'indent' => $indent, 'text' => $text); - - # ~ - - if (isset($CurrentBlock['continuable'])) - { - $Block = $this->{'block'.$CurrentBlock['type'].'Continue'}($Line, $CurrentBlock); - - if (isset($Block)) - { - $CurrentBlock = $Block; - - continue; - } - else - { - if ($this->isBlockCompletable($CurrentBlock['type'])) - { - $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); - } - } - } - - # ~ - - $marker = $text[0]; - - # ~ - - $blockTypes = $this->unmarkedBlockTypes; - - if (isset($this->BlockTypes[$marker])) - { - foreach ($this->BlockTypes[$marker] as $blockType) - { - $blockTypes []= $blockType; - } - } - - # - # ~ - - foreach ($blockTypes as $blockType) - { - $Block = $this->{'block'.$blockType}($Line, $CurrentBlock); - - if (isset($Block)) - { - $Block['type'] = $blockType; - - if ( ! isset($Block['identified'])) - { - $Blocks []= $CurrentBlock; - - $Block['identified'] = true; - } - - if ($this->isBlockContinuable($blockType)) - { - $Block['continuable'] = true; - } - - $CurrentBlock = $Block; - - continue 2; - } - } - - # ~ - - if (isset($CurrentBlock) and ! isset($CurrentBlock['type']) and ! isset($CurrentBlock['interrupted'])) - { - $CurrentBlock['element']['text'] .= "\n".$text; - } - else - { - $Blocks []= $CurrentBlock; - - $CurrentBlock = $this->paragraph($Line); - - $CurrentBlock['identified'] = true; - } - } - - # ~ - - if (isset($CurrentBlock['continuable']) and $this->isBlockCompletable($CurrentBlock['type'])) - { - $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); - } - - # ~ - - $Blocks []= $CurrentBlock; - - unset($Blocks[0]); - - # ~ - - $markup = ''; - - foreach ($Blocks as $Block) - { - if (isset($Block['hidden'])) - { - continue; - } - - $markup .= "\n"; - $markup .= isset($Block['markup']) ? $Block['markup'] : $this->element($Block['element']); - } - - $markup .= "\n"; - - # ~ - - return $markup; - } - - # - # Allow for plugin extensibility - # - protected function isBlockContinuable($Type) - { - return method_exists($this, 'block'.$Type.'Continue'); - } - - protected function isBlockCompletable($Type) - { - return method_exists($this, 'block'.$Type.'Complete'); - } - - # - # Code - - protected function blockCode($Line, $Block = null) - { - if (isset($Block) and ! isset($Block['type']) and ! isset($Block['interrupted'])) - { - return; - } - - if ($Line['indent'] >= 4) - { - $text = substr($Line['body'], 4); - - $Block = array( - 'element' => array( - 'name' => 'pre', - 'handler' => 'element', - 'text' => array( - 'name' => 'code', - 'text' => $text, - ), - ), - ); - - return $Block; - } - } - - protected function blockCodeContinue($Line, $Block) - { - if ($Line['indent'] >= 4) - { - if (isset($Block['interrupted'])) - { - $Block['element']['text']['text'] .= "\n"; - - unset($Block['interrupted']); - } - - $Block['element']['text']['text'] .= "\n"; - - $text = substr($Line['body'], 4); - - $Block['element']['text']['text'] .= $text; - - return $Block; - } - } - - protected function blockCodeComplete($Block) - { - $text = $Block['element']['text']['text']; - - $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); - - $Block['element']['text']['text'] = $text; - - return $Block; - } - - # - # Comment - - protected function blockComment($Line) - { - if ($this->markupEscaped) - { - return; - } - - if (isset($Line['text'][3]) and $Line['text'][3] === '-' and $Line['text'][2] === '-' and $Line['text'][1] === '!') - { - $Block = array( - 'markup' => $Line['body'], - ); - - if (preg_match('/-->$/', $Line['text'])) - { - $Block['closed'] = true; - } - - return $Block; - } - } - - protected function blockCommentContinue($Line, array $Block) - { - if (isset($Block['closed'])) - { - return; - } - - $Block['markup'] .= "\n" . $Line['body']; - - if (preg_match('/-->$/', $Line['text'])) - { - $Block['closed'] = true; - } - - return $Block; - } - - # - # Fenced Code - - protected function blockFencedCode($Line) - { - if (preg_match('/^['.$Line['text'][0].']{3,}[ ]*([\w-]+)?[ ]*$/', $Line['text'], $matches)) - { - $Element = array( - 'name' => 'code', - 'text' => '', - ); - - if (isset($matches[1])) - { - $class = 'language-'.$matches[1]; - - $Element['attributes'] = array( - 'class' => $class, - ); - } - - $Block = array( - 'char' => $Line['text'][0], - 'element' => array( - 'name' => 'pre', - 'handler' => 'element', - 'text' => $Element, - ), - ); - - return $Block; - } - } - - protected function blockFencedCodeContinue($Line, $Block) - { - if (isset($Block['complete'])) - { - return; - } - - if (isset($Block['interrupted'])) - { - $Block['element']['text']['text'] .= "\n"; - - unset($Block['interrupted']); - } - - if (preg_match('/^'.$Block['char'].'{3,}[ ]*$/', $Line['text'])) - { - $Block['element']['text']['text'] = substr($Block['element']['text']['text'], 1); - - $Block['complete'] = true; - - return $Block; - } - - $Block['element']['text']['text'] .= "\n".$Line['body'];; - - return $Block; - } - - protected function blockFencedCodeComplete($Block) - { - $text = $Block['element']['text']['text']; - - $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); - - $Block['element']['text']['text'] = $text; - - return $Block; - } - - # - # Header - - protected function blockHeader($Line) - { - if (isset($Line['text'][1])) - { - $level = 1; - - while (isset($Line['text'][$level]) and $Line['text'][$level] === '#') - { - $level ++; - } - - if ($level > 6) - { - return; - } - - $text = trim($Line['text'], '# '); - - $Block = array( - 'element' => array( - 'name' => 'h' . min(6, $level), - 'text' => $text, - 'handler' => 'line', - ), - ); - - return $Block; - } - } - - # - # List - - protected function blockList($Line) - { - list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]+[.]'); - - if (preg_match('/^('.$pattern.'[ ]+)(.*)/', $Line['text'], $matches)) - { - $Block = array( - 'indent' => $Line['indent'], - 'pattern' => $pattern, - 'element' => array( - 'name' => $name, - 'handler' => 'elements', - ), - ); - - $Block['li'] = array( - 'name' => 'li', - 'handler' => 'li', - 'text' => array( - $matches[2], - ), - ); - - $Block['element']['text'] []= & $Block['li']; - - return $Block; - } - } - - protected function blockListContinue($Line, array $Block) - { - if ($Block['indent'] === $Line['indent'] and preg_match('/^'.$Block['pattern'].'(?:[ ]+(.*)|$)/', $Line['text'], $matches)) - { - if (isset($Block['interrupted'])) - { - $Block['li']['text'] []= ''; - - unset($Block['interrupted']); - } - - unset($Block['li']); - - $text = isset($matches[1]) ? $matches[1] : ''; - - $Block['li'] = array( - 'name' => 'li', - 'handler' => 'li', - 'text' => array( - $text, - ), - ); - - $Block['element']['text'] []= & $Block['li']; - - return $Block; - } - - if ($Line['text'][0] === '[' and $this->blockReference($Line)) - { - return $Block; - } - - if ( ! isset($Block['interrupted'])) - { - $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); - - $Block['li']['text'] []= $text; - - return $Block; - } - - if ($Line['indent'] > 0) - { - $Block['li']['text'] []= ''; - - $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); - - $Block['li']['text'] []= $text; - - unset($Block['interrupted']); - - return $Block; - } - } - - # - # Quote - - protected function blockQuote($Line) - { - if (preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) - { - $Block = array( - 'element' => array( - 'name' => 'blockquote', - 'handler' => 'lines', - 'text' => (array) $matches[1], - ), - ); - - return $Block; - } - } - - protected function blockQuoteContinue($Line, array $Block) - { - if ($Line['text'][0] === '>' and preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) - { - if (isset($Block['interrupted'])) - { - $Block['element']['text'] []= ''; - - unset($Block['interrupted']); - } - - $Block['element']['text'] []= $matches[1]; - - return $Block; - } - - if ( ! isset($Block['interrupted'])) - { - $Block['element']['text'] []= $Line['text']; - - return $Block; - } - } - - # - # Rule - - protected function blockRule($Line) - { - if (preg_match('/^(['.$Line['text'][0].'])([ ]*\1){2,}[ ]*$/', $Line['text'])) - { - $Block = array( - 'element' => array( - 'name' => 'hr' - ), - ); - - return $Block; - } - } - - # - # Setext - - protected function blockSetextHeader($Line, array $Block = null) - { - if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) - { - return; - } - - if (chop($Line['text'], $Line['text'][0]) === '') - { - $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2'; - - return $Block; - } - } - - # - # Markup - - protected function blockMarkup($Line) - { - if ($this->markupEscaped) - { - return; - } - - if (preg_match('/^<(\w*)(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*(\/)?>/', $Line['text'], $matches)) - { - $element = strtolower($matches[1]); - - if (in_array($element, $this->textLevelElements)) - { - return; - } - - $Block = array( - 'name' => $matches[1], - 'depth' => 0, - 'markup' => $Line['text'], - ); - - $length = strlen($matches[0]); - - $remainder = substr($Line['text'], $length); - - if (trim($remainder) === '') - { - if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) - { - $Block['closed'] = true; - - $Block['void'] = true; - } - } - else - { - if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) - { - return; - } - - if (preg_match('/<\/'.$matches[1].'>[ ]*$/i', $remainder)) - { - $Block['closed'] = true; - } - } - - return $Block; - } - } - - protected function blockMarkupContinue($Line, array $Block) - { - if (isset($Block['closed'])) - { - return; - } - - if (preg_match('/^<'.$Block['name'].'(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*>/i', $Line['text'])) # open - { - $Block['depth'] ++; - } - - if (preg_match('/(.*?)<\/'.$Block['name'].'>[ ]*$/i', $Line['text'], $matches)) # close - { - if ($Block['depth'] > 0) - { - $Block['depth'] --; - } - else - { - $Block['closed'] = true; - } - } - - if (isset($Block['interrupted'])) - { - $Block['markup'] .= "\n"; - - unset($Block['interrupted']); - } - - $Block['markup'] .= "\n".$Line['body']; - - return $Block; - } - - # - # Reference - - protected function blockReference($Line) - { - # ReduxFramework added string alerting to remove themecheck error. - if (preg_match('/^\[(.+?)\]:[ ]*<'.'?'.'(\S+?)>?(?:[ ]+["\'(](.+)["\')])?[ ]*$/', $Line['text'], $matches)) - { - $id = strtolower($matches[1]); - - $Data = array( - 'url' => $matches[2], - 'title' => null, - ); - - if (isset($matches[3])) - { - $Data['title'] = $matches[3]; - } - - $this->DefinitionData['Reference'][$id] = $Data; - - $Block = array( - 'hidden' => true, - ); - - return $Block; - } - } - - # - # Table - - protected function blockTable($Line, array $Block = null) - { - if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) - { - return; - } - - if (strpos($Block['element']['text'], '|') !== false and chop($Line['text'], ' -:|') === '') - { - $alignments = array(); - - $divider = $Line['text']; - - $divider = trim($divider); - $divider = trim($divider, '|'); - - $dividerCells = explode('|', $divider); - - foreach ($dividerCells as $dividerCell) - { - $dividerCell = trim($dividerCell); - - if ($dividerCell === '') - { - continue; - } - - $alignment = null; - - if ($dividerCell[0] === ':') - { - $alignment = 'left'; - } - - if (substr($dividerCell, - 1) === ':') - { - $alignment = $alignment === 'left' ? 'center' : 'right'; - } - - $alignments []= $alignment; - } - - # ~ - - $HeaderElements = array(); - - $header = $Block['element']['text']; - - $header = trim($header); - $header = trim($header, '|'); - - $headerCells = explode('|', $header); - - foreach ($headerCells as $index => $headerCell) - { - $headerCell = trim($headerCell); - - $HeaderElement = array( - 'name' => 'th', - 'text' => $headerCell, - 'handler' => 'line', - ); - - if (isset($alignments[$index])) - { - $alignment = $alignments[$index]; - - $HeaderElement['attributes'] = array( - 'style' => 'text-align: '.$alignment.';', - ); - } - - $HeaderElements []= $HeaderElement; - } - - # ~ - - $Block = array( - 'alignments' => $alignments, - 'identified' => true, - 'element' => array( - 'name' => 'table', - 'handler' => 'elements', - ), - ); - - $Block['element']['text'] []= array( - 'name' => 'thead', - 'handler' => 'elements', - ); - - $Block['element']['text'] []= array( - 'name' => 'tbody', - 'handler' => 'elements', - 'text' => array(), - ); - - $Block['element']['text'][0]['text'] []= array( - 'name' => 'tr', - 'handler' => 'elements', - 'text' => $HeaderElements, - ); - - return $Block; - } - } - - protected function blockTableContinue($Line, array $Block) - { - if (isset($Block['interrupted'])) - { - return; - } - - if ($Line['text'][0] === '|' or strpos($Line['text'], '|')) - { - $Elements = array(); - - $row = $Line['text']; - - $row = trim($row); - $row = trim($row, '|'); - - preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]+`|`)+/', $row, $matches); - - foreach ($matches[0] as $index => $cell) - { - $cell = trim($cell); - - $Element = array( - 'name' => 'td', - 'handler' => 'line', - 'text' => $cell, - ); - - if (isset($Block['alignments'][$index])) - { - $Element['attributes'] = array( - 'style' => 'text-align: '.$Block['alignments'][$index].';', - ); - } - - $Elements []= $Element; - } - - $Element = array( - 'name' => 'tr', - 'handler' => 'elements', - 'text' => $Elements, - ); - - $Block['element']['text'][1]['text'] []= $Element; - - return $Block; - } - } - - # - # ~ - # - - protected function paragraph($Line) - { - $Block = array( - 'element' => array( - 'name' => 'p', - 'text' => $Line['text'], - 'handler' => 'line', - ), - ); - - return $Block; - } - - # - # Inline Elements - # - - protected $InlineTypes = array( - '"' => array('SpecialCharacter'), - '!' => array('Image'), - '&' => array('SpecialCharacter'), - '*' => array('Emphasis'), - ':' => array('Url'), - '<' => array('UrlTag', 'EmailTag', 'Markup', 'SpecialCharacter'), - '>' => array('SpecialCharacter'), - '[' => array('Link'), - '_' => array('Emphasis'), - '`' => array('Code'), - '~' => array('Strikethrough'), - '\\' => array('EscapeSequence'), - ); - - # ~ - - protected $inlineMarkerList = '!"*_&[:<>`~\\'; - - # - # ~ - # - - public function line($text) - { - $markup = ''; - - # $excerpt is based on the first occurrence of a marker - - while ($excerpt = strpbrk($text, $this->inlineMarkerList)) - { - $marker = $excerpt[0]; - - $markerPosition = strpos($text, $marker); - - $Excerpt = array('text' => $excerpt, 'context' => $text); - - foreach ($this->InlineTypes[$marker] as $inlineType) - { - $Inline = $this->{'inline'.$inlineType}($Excerpt); - - if ( ! isset($Inline)) - { - continue; - } - - # makes sure that the inline belongs to "our" marker - - if (isset($Inline['position']) and $Inline['position'] > $markerPosition) - { - continue; - } - - # sets a default inline position - - if ( ! isset($Inline['position'])) - { - $Inline['position'] = $markerPosition; - } - - # the text that comes before the inline - $unmarkedText = substr($text, 0, $Inline['position']); - - # compile the unmarked text - $markup .= $this->unmarkedText($unmarkedText); - - # compile the inline - $markup .= isset($Inline['markup']) ? $Inline['markup'] : $this->element($Inline['element']); - - # remove the examined text - $text = substr($text, $Inline['position'] + $Inline['extent']); - - continue 2; - } - - # the marker does not belong to an inline - - $unmarkedText = substr($text, 0, $markerPosition + 1); - - $markup .= $this->unmarkedText($unmarkedText); - - $text = substr($text, $markerPosition + 1); - } - - $markup .= $this->unmarkedText($text); - - return $markup; - } - - # - # ~ - # - - protected function inlineCode($Excerpt) - { - $marker = $Excerpt['text'][0]; - - if (preg_match('/^('.$marker.'+)[ ]*(.+?)[ ]*(? strlen($matches[0]), - 'element' => array( - 'name' => 'code', - 'text' => $text, - ), - ); - } - } - - protected function inlineEmailTag($Excerpt) - { - if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<((mailto:)?\S+?@\S+?)>/i', $Excerpt['text'], $matches)) - { - $url = $matches[1]; - - if ( ! isset($matches[2])) - { - $url = 'mailto:' . $url; - } - - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => 'a', - 'text' => $matches[1], - 'attributes' => array( - 'href' => $url, - ), - ), - ); - } - } - - protected function inlineEmphasis($Excerpt) - { - if ( ! isset($Excerpt['text'][1])) - { - return; - } - - $marker = $Excerpt['text'][0]; - - if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches)) - { - $emphasis = 'strong'; - } - elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches)) - { - $emphasis = 'em'; - } - else - { - return; - } - - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => $emphasis, - 'handler' => 'line', - 'text' => $matches[1], - ), - ); - } - - protected function inlineEscapeSequence($Excerpt) - { - if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters)) - { - return array( - 'markup' => $Excerpt['text'][1], - 'extent' => 2, - ); - } - } - - protected function inlineImage($Excerpt) - { - if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') - { - return; - } - - $Excerpt['text']= substr($Excerpt['text'], 1); - - $Link = $this->inlineLink($Excerpt); - - if ($Link === null) - { - return; - } - - $Inline = array( - 'extent' => $Link['extent'] + 1, - 'element' => array( - 'name' => 'img', - 'attributes' => array( - 'src' => $Link['element']['attributes']['href'], - 'alt' => $Link['element']['text'], - ), - ), - ); - - $Inline['element']['attributes'] += $Link['element']['attributes']; - - unset($Inline['element']['attributes']['href']); - - return $Inline; - } - - protected function inlineLink($Excerpt) - { - $Element = array( - 'name' => 'a', - 'handler' => 'line', - 'text' => null, - 'attributes' => array( - 'href' => null, - 'title' => null, - ), - ); - - $extent = 0; - - $remainder = $Excerpt['text']; - - if (preg_match('/\[((?:[^][]|(?R))*)\]/', $remainder, $matches)) - { - $Element['text'] = $matches[1]; - - $extent += strlen($matches[0]); - - $remainder = substr($remainder, $extent); - } - else - { - return; - } - - if (preg_match('/^[(]((?:[^ ()]|[(][^ )]+[)])+)(?:[ ]+("[^"]*"|\'[^\']*\'))?[)]/', $remainder, $matches)) - { - $Element['attributes']['href'] = $matches[1]; - - if (isset($matches[2])) - { - $Element['attributes']['title'] = substr($matches[2], 1, - 1); - } - - $extent += strlen($matches[0]); - } - else - { - if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches)) - { - $definition = strlen($matches[1]) ? $matches[1] : $Element['text']; - $definition = strtolower($definition); - - $extent += strlen($matches[0]); - } - else - { - $definition = strtolower($Element['text']); - } - - if ( ! isset($this->DefinitionData['Reference'][$definition])) - { - return; - } - - $Definition = $this->DefinitionData['Reference'][$definition]; - - $Element['attributes']['href'] = $Definition['url']; - $Element['attributes']['title'] = $Definition['title']; - } - - $Element['attributes']['href'] = str_replace(array('&', '<'), array('&', '<'), $Element['attributes']['href']); - - return array( - 'extent' => $extent, - 'element' => $Element, - ); - } - - protected function inlineMarkup($Excerpt) - { - if ($this->markupEscaped or strpos($Excerpt['text'], '>') === false) - { - return; - } - - if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w*[ ]*>/s', $Excerpt['text'], $matches)) - { - return array( - 'markup' => $matches[0], - 'extent' => strlen($matches[0]), - ); - } - - if ($Excerpt['text'][1] === '!' and preg_match('/^/s', $Excerpt['text'], $matches)) - { - return array( - 'markup' => $matches[0], - 'extent' => strlen($matches[0]), - ); - } - - if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w*(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*\/?>/s', $Excerpt['text'], $matches)) - { - return array( - 'markup' => $matches[0], - 'extent' => strlen($matches[0]), - ); - } - } - - protected function inlineSpecialCharacter($Excerpt) - { - if ($Excerpt['text'][0] === '&' and ! preg_match('/^&#?\w+;/', $Excerpt['text'])) - { - return array( - 'markup' => '&', - 'extent' => 1, - ); - } - - $SpecialCharacter = array('>' => 'gt', '<' => 'lt', '"' => 'quot'); - - if (isset($SpecialCharacter[$Excerpt['text'][0]])) - { - return array( - 'markup' => '&'.$SpecialCharacter[$Excerpt['text'][0]].';', - 'extent' => 1, - ); - } - } - - protected function inlineStrikethrough($Excerpt) - { - if ( ! isset($Excerpt['text'][1])) - { - return; - } - - if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches)) - { - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => 'del', - 'text' => $matches[1], - 'handler' => 'line', - ), - ); - } - } - - protected function inlineUrl($Excerpt) - { - if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/') - { - return; - } - - if (preg_match('/\bhttps?:[\/]{2}[^\s<]+\b\/*/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE)) - { - $Inline = array( - 'extent' => strlen($matches[0][0]), - 'position' => $matches[0][1], - 'element' => array( - 'name' => 'a', - 'text' => $matches[0][0], - 'attributes' => array( - 'href' => $matches[0][0], - ), - ), - ); - - return $Inline; - } - } - - protected function inlineUrlTag($Excerpt) - { - if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w+:\/{2}[^ >]+)>/i', $Excerpt['text'], $matches)) - { - $url = str_replace(array('&', '<'), array('&', '<'), $matches[1]); - - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => 'a', - 'text' => $url, - 'attributes' => array( - 'href' => $url, - ), - ), - ); - } - } - - # ~ - - protected function unmarkedText($text) - { - if ($this->breaksEnabled) - { - $text = preg_replace('/[ ]*\n/', "
    \n", $text); - } - else - { - $text = preg_replace('/(?:[ ][ ]+|[ ]*\\\\)\n/', "
    \n", $text); - $text = str_replace(" \n", "\n", $text); - } - - return $text; - } - - # - # Handlers - # - - protected function element(array $Element) - { - $markup = '<'.$Element['name']; - - if (isset($Element['attributes'])) - { - foreach ($Element['attributes'] as $name => $value) - { - if ($value === null) - { - continue; - } - - $markup .= ' '.$name.'="'.$value.'"'; - } - } - - if (isset($Element['text'])) - { - $markup .= '>'; - - if (isset($Element['handler'])) - { - $markup .= $this->{$Element['handler']}($Element['text']); - } - else - { - $markup .= $Element['text']; - } - - $markup .= ''; - } - else - { - $markup .= ' />'; - } - - return $markup; - } - - protected function elements(array $Elements) - { - $markup = ''; - - foreach ($Elements as $Element) - { - $markup .= "\n" . $this->element($Element); - } - - $markup .= "\n"; - - return $markup; - } - - # ~ - - protected function li($lines) - { - $markup = $this->lines($lines); - - $trimmedMarkup = trim($markup); - - if ( ! in_array('', $lines) and substr($trimmedMarkup, 0, 3) === '

    ') - { - $markup = $trimmedMarkup; - $markup = substr($markup, 3); - - $position = strpos($markup, "

    "); - - $markup = substr_replace($markup, '', $position, 4); - } - - return $markup; - } - - # - # Deprecated Methods - # - - function parse($text) - { - $markup = $this->text($text); - - return $markup; - } - - # - # Static Methods - # - - static function instance($name = 'default') - { - if (isset(self::$instances[$name])) - { - return self::$instances[$name]; - } - - $instance = new static(); - - self::$instances[$name] = $instance; - - return $instance; - } - - private static $instances = array(); - - # - # Fields - # - - protected $DefinitionData; - - # - # Read-Only - - protected $specialCharacters = array( - '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', - ); - - protected $StrongRegex = array( - '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*[*])+?)[*]{2}(?![*])/s', - '_' => '/^__((?:\\\\_|[^_]|_[^_]*_)+?)__(?!_)/us', - ); - - protected $EmRegex = array( - '*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s', - '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us', - ); - - protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*(?:\s*=\s*(?:[^"\'=<>`\s]+|"[^"]*"|\'[^\']*\'))?'; - - protected $voidElements = array( - 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', - ); - - protected $textLevelElements = array( - 'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont', - 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing', - 'i', 'rp', 'del', 'code', 'strike', 'marquee', - 'q', 'rt', 'ins', 'font', 'strong', - 's', 'tt', 'sub', 'mark', - 'u', 'xm', 'sup', 'nobr', - 'var', 'ruby', - 'wbr', 'span', - 'time', - ); -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/section/field_section.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/section/field_section.css deleted file mode 100755 index 73a8cac1..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/section/field_section.css +++ /dev/null @@ -1 +0,0 @@ -.redux-main .form-table-section-indented{width:95%;margin-left:5%}.redux-main .form-table-section tr:first-of-type th:first-of-type{padding:0px !important}.redux-main h3{margin-top:10px}.redux-main .form-table-section-indented>tbody>tr:first-child{display:none}.redux-main .form-table-section-indented>tbody>tr:nth-last-child(2){border-bottom:0} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/section/field_section.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/section/field_section.php deleted file mode 100755 index 6900397e..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/section/field_section.php +++ /dev/null @@ -1,130 +0,0 @@ -. - * - * @package ReduxFramework - * @subpackage Field_Section - * @author Tobias Karnetze (athoss.de) - * @version 1.0.0 - */ - -// Exit if accessed directly - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - -// Don't duplicate me! - if ( ! class_exists( 'ReduxFramework_section' ) ) { - - /** - * Main ReduxFramework_heading class - * - * @since 1.0.0 - */ - class ReduxFramework_section { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since 1.0.0 - * @access public - * @return void - */ - public function __construct( $field = array(), $value = '', $parent ) { - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since 1.0.0 - * @access public - * @return void - */ - public function render() { - - // No errors please - $defaults = array( - 'indent' => '', - 'style' => '', - 'class' => '', - 'title' => '', - 'subtitle' => '', - ); - $this->field = wp_parse_args( $this->field, $defaults ); - - $guid = uniqid(); - - $add_class = ''; - if ( isset( $this->field['indent'] ) && true === $this->field['indent'] ) { - $add_class = ' form-table-section-indented'; - } elseif( !isset( $this->field['indent'] ) || ( isset( $this->field['indent'] ) && false !== $this->field['indent'] ) ) { - $add_class = " hide"; - } - - echo '
    '; - - echo '
    '; - - if ( ! empty( $this->field['title'] ) ) { - echo '

    ' . esc_html($this->field['title']) . '

    '; - } - - if ( ! empty( $this->field['subtitle'] ) ) { - echo '
    ' . esc_html($this->field['subtitle']) . '
    '; - } - - echo '
    '; - echo ""; - echo '"; - - echo ""; - echo ""; - echo '"; - echo ""; - echo ""; - echo '"; - - echo ""; - echo ""; - echo '"; - - } - - function um_category_access_fields_save( $termID ){ - - if ( isset( $_POST['_um_accessible'] ) ) { - - // get options from database - if not a array create a new one - $termMeta = get_option( "category_$termID" ); - if ( !is_array( $termMeta )) - $termMeta = array(); - - // get value and save it into the database - maybe you have to sanitize your values (urls, etc...) - $termMeta['_um_accessible'] = isset( $_POST['_um_accessible'] ) ? $_POST['_um_accessible'] : ''; - $termMeta['_um_redirect'] = isset( $_POST['_um_redirect'] ) ? $_POST['_um_redirect'] : ''; - $termMeta['_um_redirect2'] = isset( $_POST['_um_redirect2'] ) ? $_POST['_um_redirect2'] : ''; - $termMeta['_um_roles'] = isset( $_POST['_um_roles'] ) ? $_POST['_um_roles'] : ''; - - update_option( "category_$termID", $termMeta ); - } - } - - /*** - *** @Allow mass syncing for roles - ***/ - add_action('um_admin_do_action__mass_role_sync', 'um_admin_do_action__mass_role_sync'); - function um_admin_do_action__mass_role_sync( $action ){ - global $ultimatemember; - if ( !is_admin() || !current_user_can( 'edit_user' ) ) wp_die('You don\'t have permissions to access this page.'); - - if ( !isset($_REQUEST['post']) || !is_numeric( $_REQUEST['post'] ) ) wp_die('You\'re not allowed to do this.'); - - $post_id = (int) $_REQUEST['post']; - - $post = get_post( $post_id ); - $slug = $post->post_name; - - if ( $slug != $_REQUEST['um_role'] ) - wp_die('Invalid community role.'); - - $um_synced_role = get_post_meta( $post_id, '_um_synced_role', true ); - - if ( $slug == 'admin' ) { - $_REQUEST['wp_role'] = 'administrator'; - update_post_meta( $post_id, '_um_synced_role', 'administrator' ); - }else{ - update_post_meta( $post_id, '_um_synced_role', $_REQUEST['wp_role'] ); - } - - $wp_role = ( $_REQUEST['wp_role'] ) ? $_REQUEST['wp_role'] : 'subscriber'; - - $users = get_users( array( 'fields' => array( 'ID' ), 'meta_key' => 'role', 'meta_value' => $slug ) ); - foreach( $users as $user_id ) { - $wp_user_object = new WP_User( $user_id ); - $wp_user_object->set_role( $wp_role ); - } - - exit( wp_redirect( admin_url( 'post.php?post=' . $post_id ) . '&action=edit&message=1' ) ); - - } - - /*** - *** @add option for WPML - ***/ - add_action('um_admin_before_access_settings', 'um_admin_wpml_post_options', 10, 1 ); - function um_admin_wpml_post_options( $instance ) { - - if ( !function_exists('icl_get_current_language') ) - return; - - ?> - -

    - -

    - ui_on_off( '_um_wpml_user', 0 ); ?> -

    - -

    - -

    - ui_on_off( '_um_wpml_account', 0 ); ?> -

    - - post_name; - - $is_core = get_post_meta( $post_id, '_um_core', true ); - if ( $is_core == 'member' || $is_core == 'admin' ) { - $slug = $is_core; - $where = array( 'ID' => $post_id ); - $wpdb->update( $wpdb->posts, array( 'post_name' => $slug ), $where ); - } - - delete_option("um_cached_role_{$slug}"); - - // need to remove cache of all users - $users = get_users( array( 'fields' => array( 'ID' ), 'meta_key' => 'role', 'meta_value' => $slug ) ); - foreach( $users as $user ) { - $ultimatemember->user->remove_cache( $user->ID ); - } - } - } - add_action('save_post', 'um_admin_delete_role_cache', 1111, 2); - - /*** - *** @clear user cache - ***/ - add_action('um_admin_do_action__user_cache', 'um_admin_do_action__user_cache'); - function um_admin_do_action__user_cache( $action ){ - global $ultimatemember, $wpdb; - if ( !is_admin() || !current_user_can('manage_options') ) die(); - - - $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE 'um_cache_userdata_%'" ); - - - $url = admin_url('admin.php?page=ultimatemember'); - $url = add_query_arg('update','cleared_cache',$url); - exit( wp_redirect($url) ); - } - - /*** - *** @purge temp - ***/ - add_action('um_admin_do_action__purge_temp', 'um_admin_do_action__purge_temp'); - function um_admin_do_action__purge_temp( $action ){ - global $ultimatemember; - if ( !is_admin() || !current_user_can('manage_options') ) die(); - - $ultimatemember->files->remove_dir( $ultimatemember->files->upload_temp ); - - $url = remove_query_arg('um_adm_action', $ultimatemember->permalinks->get_current_url() ); - $url = add_query_arg('update','purged_temp',$url); - exit( wp_redirect($url) ); - } - - /*** - *** @duplicate form - ***/ - add_action('um_admin_do_action__duplicate_form', 'um_admin_do_action__duplicate_form'); - function um_admin_do_action__duplicate_form( $action ){ - global $ultimatemember; - if ( !is_admin() || !current_user_can('manage_options') ) die(); - if ( !isset($_REQUEST['post_id']) || !is_numeric( $_REQUEST['post_id'] ) ) die(); - - $post_id = $_REQUEST['post_id']; - - $n = array( - 'post_type' => 'um_form', - 'post_title' => sprintf(__('Duplicate of %s','ultimate-member'), get_the_title($post_id) ), - 'post_status' => 'publish', - 'post_author' => um_user('ID'), - ); - - $n_id = wp_insert_post( $n ); - - $n_fields = get_post_custom( $post_id ); - foreach ( $n_fields as $key => $value ) { - - if ( $key == '_um_custom_fields' ) { - $the_value = unserialize( $value[0] ); - } else { - $the_value = $value[0]; - } - - update_post_meta( $n_id, $key, $the_value ); - - } - - delete_post_meta($n_id, '_um_core'); - - $url = admin_url('edit.php?post_type=um_form'); - $url = add_query_arg('update','form_duplicated',$url); - - exit( wp_redirect( $url ) ); - - } - - /*** - *** @download a language remotely - ***/ - add_action('um_admin_do_action__um_language_downloader', 'um_admin_do_action__um_language_downloader'); - function um_admin_do_action__um_language_downloader( $action ){ - global $ultimatemember; - if ( !is_admin() || !current_user_can('manage_options') ) die(); - - $locale = get_option('WPLANG'); - if ( !$locale ) return; - if ( !isset( $ultimatemember->available_languages[$locale] ) ) return; - - $path = $ultimatemember->files->upload_basedir; - $path = str_replace('/uploads/ultimatemember','',$path); - $path = $path . '/languages/plugins/'; - $path = str_replace('//','/',$path); - - $remote = 'https://ultimatemember.com/wp-content/languages/plugins/ultimatemember-' . $locale . '.po'; - $remote2 = 'https://ultimatemember.com/wp-content/languages/plugins/ultimatemember-' . $locale . '.mo'; - - $remote_tmp = download_url( $remote, $timeout = 300 ); - copy( $remote_tmp, $path . 'ultimatemember-' . $locale . '.po' ); - unlink( $remote_tmp ); - - $remote2_tmp = download_url( $remote2, $timeout = 300 ); - copy( $remote2_tmp, $path . 'ultimatemember-' . $locale . '.mo' ); - unlink( $remote2_tmp ); - - $url = remove_query_arg('um_adm_action', $ultimatemember->permalinks->get_current_url() ); - $url = add_query_arg('update','language_updated',$url); - exit( wp_redirect($url) ); - - } - - /*** - *** @Action to hide notices in admin - ***/ - add_action('um_admin_do_action__um_hide_locale_notice', 'um_admin_do_action__hide_notice'); - add_action('um_admin_do_action__um_can_register_notice', 'um_admin_do_action__hide_notice'); - add_action('um_admin_do_action__um_hide_exif_notice', 'um_admin_do_action__hide_notice'); - function um_admin_do_action__hide_notice( $action ){ - global $ultimatemember; - if ( !is_admin() || !current_user_can('manage_options') ) die(); - update_option( $action, 1 ); - exit( wp_redirect( remove_query_arg('um_adm_action') ) ); - } - - /*** - *** @Opt-in tracking - ***/ - add_action('um_admin_do_action__opt_into_tracking', 'um_admin_do_action__opt_into_tracking'); - function um_admin_do_action__opt_into_tracking( $action ){ - global $ultimatemember; - if ( !is_admin() || !current_user_can('manage_options') ) die(); - - global $reduxConfig; - $reduxConfig->ReduxFramework->set('allow_tracking', 1); - - update_option('um_tracking_notice', 1 ); - - $tracking = new UM_Tracking(); - $tracking->send_checkin(true); - - exit( wp_redirect( remove_query_arg('um_adm_action') ) ); - } - - /*** - *** @Opt-out of tracking - ***/ - add_action('um_admin_do_action__opt_out_of_tracking', 'um_admin_do_action__opt_out_of_tracking'); - function um_admin_do_action__opt_out_of_tracking( $action ){ - global $ultimatemember; - if ( !is_admin() || !current_user_can('manage_options') ) die(); - - global $reduxConfig; - $reduxConfig->ReduxFramework->set('allow_tracking', 0); - - update_option('um_tracking_notice', 1 ); - - exit( wp_redirect( remove_query_arg('um_adm_action') ) ); - } - - /*** - *** @Un-install UM completely - ***/ - add_action('um_admin_do_action__uninstall_ultimatemember', 'um_admin_do_action__uninstall_ultimatemember'); - function um_admin_do_action__uninstall_ultimatemember( $action ){ - global $ultimatemember; - if ( !is_admin() || !current_user_can('manage_options') ) die(); - - $ultimatemember->uninstall->remove_um(); - - } - - /*** - *** @various user actions - ***/ - add_action('um_admin_do_action__user_action', 'um_admin_do_action__user_action'); - function um_admin_do_action__user_action( $action ){ - global $ultimatemember; - if ( !is_admin() || !current_user_can( 'edit_users' ) ) die(); - if ( !isset( $_REQUEST['sub'] ) ) die(); - if ( !isset($_REQUEST['user_id']) ) die(); - - um_fetch_user( $_REQUEST['user_id'] ); - - $subaction = $_REQUEST['sub']; - - do_action("um_admin_user_action_hook", $subaction); - do_action("um_admin_user_action_{$subaction}_hook"); - - um_reset_user(); - - wp_redirect( add_query_arg( 'update', 'user_updated', admin_url('?page=ultimatemember') ) ); - exit; - - } diff --git a/admin/core/um-admin-builder.php b/admin/core/um-admin-builder.php deleted file mode 100644 index 9f03b905..00000000 --- a/admin/core/um-admin-builder.php +++ /dev/null @@ -1,299 +0,0 @@ -form_id = $_POST['form_id']; - - $this->show_builder(); - - $output = ob_get_contents(); - ob_end_clean(); - - if(is_array($output)){ print_r($output); }else{ echo $output; } die; - - } - - /*** - *** @sort array function - ***/ - function array_sort_by_column($arr, $col, $dir = SORT_ASC) { - $sort_col = array(); - foreach ($arr as $key=> $row) { - $sort_col[$key] = $row[$col]; - } - - array_multisort($sort_col, $dir, $arr); - return $arr; - } - - /*** - *** @get fields in row - ***/ - function get_fields_by_row( $row_id ) { - - if( empty( $this->global_fields) || ! is_array( $this->global_fields ) ){ - $this->global_fields = array(); - } - - foreach( $this->global_fields as $key => $array ) { - if ( !isset( $array['in_row'] ) || ( isset( $array['in_row'] ) && $array['in_row'] == $row_id ) ) { - $results[$key] = $array; - unset( $this->global_fields[$key] ); - } - } - return ( isset ( $results ) ) ? $results : ''; - } - - /*** - *** @get fields by sub row - ***/ - function get_fields_in_subrow( $row_fields, $subrow_id ) { - if ( !is_array( $row_fields ) ) return ''; - foreach( $row_fields as $key => $array ) { - if ( !isset( $array['in_sub_row'] ) || ( isset( $array['in_sub_row'] ) && $array['in_sub_row'] == $subrow_id ) ) { - $results[$key] = $array; - unset( $this->global_fields[$key] ); - } - } - return ( isset ( $results ) ) ? $results : ''; - } - - /*** - *** @Display the builder - ***/ - function show_builder(){ - global $ultimatemember; - - //print_r( get_option('um_form_rowdata_' . $this->form_id ) ); - - $fields = $ultimatemember->query->get_attr('custom_fields', $this->form_id ); - - if ( !isset( $fields ) || empty( $fields ) ) { ?> - -
    - - -
    - - - -
    - -
    -
    - - -
    - - - -
    - - -
    - -
    - - -
    - -
    - -
    - -
    - -
    -
    - -
    - - global_fields = array(); - }else{ - $this->global_fields = $fields; - } - - foreach( $this->global_fields as $key => $array ) { - if ( $array['type'] == 'row' ) { - $rows[$key] = $array; - unset( $this->global_fields[ $key ] ); // not needed now - } - - } - - if ( !isset( $rows ) ){ - $rows = array( '_um_row_1' => array( - 'type' => 'row', - 'id' => '_um_row_1', - 'sub_rows' => 1, - 'cols' => 1 - ) - ); - } - - foreach ( $rows as $row_id => $array ) { - - ?> - -
    - - -
    - - - - - - -
    - -
    - - get_fields_by_row( $row_id ); - - $sub_rows = ( isset( $array['sub_rows'] ) ) ? $array['sub_rows'] : 1; - for( $c = 0; $c < $sub_rows; $c++ ) { - - $subrow_fields = $this->get_fields_in_subrow( $row_fields, $c ); - - ?> - -
    - - -
    - - '; - } - - ?> - -
    - - -
    - - 0 ) { ?> -
    - - -
    - - array_sort_by_column( $subrow_fields, 'position'); - - foreach( $subrow_fields as $key => $keyarray ) { - extract( $keyarray ); - - ?> - -
    - -
    - - - - -
    - builtin->core_fields[$type]['name'] )?$ultimatemember->builtin->core_fields[$type]['name']:''; ?> -
    -
    - - - - - - - - - - - - - - -
    - - -
    - -
    - - -
    - - - -
    - -
    - -
    - -
    - - - -
    - -
    - - slug = 'ultimatemember'; - - add_filter('manage_edit-um_form_columns', array(&$this, 'manage_edit_um_form_columns') ); - add_action('manage_um_form_posts_custom_column', array(&$this, 'manage_um_form_posts_custom_column'), 10, 3); - - add_filter('manage_edit-um_directory_columns', array(&$this, 'manage_edit_um_directory_columns') ); - add_action('manage_um_directory_posts_custom_column', array(&$this, 'manage_um_directory_posts_custom_column'), 10, 3); - - add_filter('post_row_actions', array(&$this, 'post_row_actions'), 99, 2); - - } - - /*** - *** @custom row actions - ***/ - function post_row_actions($actions, $post){ - //check for your post type - if ($post->post_type =="um_form"){ - $actions['um_duplicate'] = '' . __('Duplicate','ultimate-member') . ''; - } - return $actions; - } - - /*** - *** @duplicate a form - ***/ - function duplicate_uri( $id ) { - $url = add_query_arg('um_adm_action', 'duplicate_form', admin_url('edit.php?post_type=um_form') ); - $url = add_query_arg('post_id', $id, $url); - return $url; - } - - /*** - *** @Custom columns for Form - ***/ - function manage_edit_um_form_columns($columns) { - - $admin = new UM_Admin_Metabox(); - - $new_columns['cb'] = ''; - $new_columns['id'] = __('ID') . $admin->_tooltip( 'Unique ID for each form' ); - $new_columns['title'] = __('Title'); - $new_columns['mode'] = __('Type') . $admin->_tooltip( 'This is the type of the form' ); - $new_columns['shortcode'] = __('Shortcode') . $admin->_tooltip( 'Use this shortcode to display the form' ); - $new_columns['date'] = __('Date'); - - return $new_columns; - - } - - /*** - *** @Custom columns for Directory - ***/ - function manage_edit_um_directory_columns($columns) { - - $admin = new UM_Admin_Metabox(); - - $new_columns['cb'] = ''; - $new_columns['id'] = __('ID') . $admin->_tooltip( 'Unique ID for each form' ); - $new_columns['title'] = __('Title'); - $new_columns['shortcode'] = __('Shortcode') . $admin->_tooltip( 'Use this shortcode to display the member directory' ); - $new_columns['date'] = __('Date'); - - return $new_columns; - - } - - /*** - *** @Display cusom columns for Form - ***/ - function manage_um_form_posts_custom_column($column_name, $id) { - global $wpdb, $ultimatemember; - - switch ($column_name) { - - case 'id': - echo ''.$id.''; - break; - - case 'shortcode': - echo $ultimatemember->shortcodes->get_shortcode( $id ); - break; - - case 'mode': - $mode = $ultimatemember->query->get_attr('mode', $id); - echo ''. $ultimatemember->form->display_form_type($mode, $id) . ''; - break; - - } - - } - - /*** - *** @Display cusom columns for Directory - ***/ - function manage_um_directory_posts_custom_column($column_name, $id) { - global $wpdb, $ultimatemember; - - switch ($column_name) { - - case 'id': - echo ''.$id.''; - break; - - case 'shortcode': - echo $ultimatemember->shortcodes->get_shortcode( $id ); - break; - - } - - } - -} \ No newline at end of file diff --git a/admin/core/um-admin-dashboard.php b/admin/core/um-admin-dashboard.php deleted file mode 100644 index a99acb63..00000000 --- a/admin/core/um-admin-dashboard.php +++ /dev/null @@ -1,346 +0,0 @@ -slug = 'ultimatemember'; - - $this->about_tabs['about'] = 'About'; - $this->about_tabs['start'] = 'Getting Started'; - - add_action('admin_menu', array(&$this, 'primary_admin_menu'), 0); - add_action('admin_menu', array(&$this, 'secondary_menu_items'), 1000); - add_action('admin_menu', array(&$this, 'extension_menu'), 9999); - - add_action( 'admin_head', array( $this, 'menu_order_count' ) ); - - add_filter( 'admin_footer_text', array( $this, 'admin_footer_text' ), 1000 ); - - add_action( 'wp_ajax_ultimatemember_rated', array( $this, 'ultimatemember_rated' ) ); - add_action( 'wp_ajax_nopriv_ultimatemember_rated', array( $this, 'ultimatemember_rated' ) ); - - } - - /** - * Change the admin footer text on UM admin pages - */ - public function admin_footer_text( $footer_text ) { - $current_screen = get_current_screen(); - - // Add the dashboard pages - $um_pages[] = 'toplevel_page_ultimatemember'; - $um_pages[] = 'admin_page_ultimatemember-about'; - $um_pages[] = 'ultimate-member_page_um_options'; - $um_pages[] = 'edit-um_form'; - $um_pages[] = 'edit-um_role'; - $um_pages[] = 'edit-um_directory'; - $um_pages[] = 'ultimate-member_page_ultimatemember-extensions'; - - if ( isset( $current_screen->id ) && in_array( $current_screen->id, $um_pages ) ) { - // Change the footer text - if ( ! get_option( 'um_admin_footer_text_rated' ) ) { - - $footer_text = sprintf( __( 'If you like Ultimate Member please consider leaving a %s★★★★★%s review. It will help us to grow the plugin and make it more popular. Thank you.', 'ultimate-member'), '', '' ); - - $footer_text .= ""; - } - } - - return $footer_text; - } - - /** - * When user clicks the review link in backend - */ - function ultimatemember_rated() { - update_option('um_admin_footer_text_rated', 1 ); - die(); - } - - /** - * Get pending users (in queue) - */ - function get_pending_users_count() { - - if ( get_option('um_cached_users_queue') > 0 && ! isset( $_REQUEST['delete_count'] ) ) { - return get_option('um_cached_users_queue'); - } - - $args = array( 'fields' => 'ID', 'number' => 100 ); - $args['meta_query']['relation'] = 'OR'; - $args['meta_query'][] = array( - 'key' => 'account_status', - 'value' => 'awaiting_email_confirmation', - 'compare' => '=' - ); - $args['meta_query'][] = array( - 'key' => 'account_status', - 'value' => 'awaiting_admin_review', - 'compare' => '=' - ); - $args = apply_filters('um_admin_pending_queue_filter', $args ); - $users = new WP_User_Query( $args ); - - delete_option('um_cached_users_queue'); - add_option('um_cached_users_queue', count($users->results), '', 'no' ); - - return count($users->results); - } - - /** - * Manage order of admin menu items - */ - public function menu_order_count() { - global $menu, $submenu; - - if ( !current_user_can( 'list_users' ) ) return; - - $count = $this->get_pending_users_count(); - if(is_array($menu)){ - foreach( $menu as $key => $menu_item ) { - if ( 0 === strpos( $menu_item[0], _x( 'Users', 'Admin menu name' ) ) ) { - $menu[ $key ][0] .= ' '.$count.''; - } - } - - } - if(is_array($submenu)){ - foreach ( $submenu['users.php'] as $key => $menu_item ) { - if ( 0 === strpos( $menu_item[0], _x( 'All Users', 'Admin menu name' ) ) ) { - $submenu['users.php'][ $key ][0] .= ' '.$count.''; - } - } - } - } - - /*** - *** @setup admin menu - ***/ - function primary_admin_menu() { - - $this->pagehook = add_menu_page( __('Ultimate Member', $this->slug), __('Ultimate Member', $this->slug), 'manage_options', $this->slug, array(&$this, 'admin_page'), 'dashicons-admin-users', '42.78578'); - add_action('load-'.$this->pagehook, array(&$this, 'on_load_page')); - - add_submenu_page( $this->slug, __('Dashboard', $this->slug), __('Dashboard', $this->slug), 'manage_options', $this->slug, array(&$this, 'admin_page') ); - - foreach( $this->about_tabs as $k => $tab ) { - add_submenu_page( '_'. $k . '_um', sprintf(__('%s | Ultimate Member', $this->slug), $tab), sprintf(__('%s | Ultimate Member', $this->slug), $tab), 'manage_options', $this->slug . '-' . $k, array(&$this, 'admin_page') ); - } - - } - - /*** - *** @secondary admin menu (after settings) - ***/ - function secondary_menu_items() { - - add_submenu_page( $this->slug, __('Forms', $this->slug), __('Forms', $this->slug), 'manage_options', 'edit.php?post_type=um_form', '', '' ); - add_submenu_page( $this->slug, __('User Roles', $this->slug), __('User Roles', $this->slug), 'manage_options', 'edit.php?post_type=um_role', '', '' ); - - if ( um_get_option('members_page' ) || !get_option('um_options') ){ - add_submenu_page( $this->slug, __('Member Directories', $this->slug), __('Member Directories', $this->slug), 'manage_options', 'edit.php?post_type=um_directory', '', '' ); - } - - do_action('um_extend_admin_menu'); - - } - - /*** - *** @extension menu - ***/ - function extension_menu() { - - add_submenu_page( $this->slug, __('Extensions', $this->slug), '' .__('Extensions', $this->slug) . '', 'manage_options', $this->slug . '-extensions', array(&$this, 'admin_page') ); - - remove_submenu_page('tools.php','redux-about'); - - } - - /*** - *** @load metabox stuff - ***/ - function on_load_page() { - global $ultimatemember; - - wp_enqueue_script('common'); - wp_enqueue_script('wp-lists'); - wp_enqueue_script('postbox'); - - /** custom metaboxes for dashboard defined here **/ - - add_meta_box('um-metaboxes-contentbox-1', __('Users Overview','ultimate-member'), array(&$this, 'users_overview'), $this->pagehook, 'core', 'core'); - - add_meta_box('um-metaboxes-mainbox-1', __('Latest from our blog','ultimate-member'), array(&$this, 'um_news'), $this->pagehook, 'normal', 'core'); - - add_meta_box('um-metaboxes-sidebox-1', __('Purge Temp Files','ultimate-member'), array(&$this, 'purge_temp'), $this->pagehook, 'side', 'core'); - add_meta_box('um-metaboxes-sidebox-2', __('User Cache','ultimate-member'), array(&$this, 'user_cache'), $this->pagehook, 'side', 'core'); - - if ( $this->language_avaialable_not_installed() ) { - add_meta_box('um-metaboxes-sidebox-2', __('Language','ultimate-member'), array(&$this, 'dl_language'), $this->pagehook, 'side', 'core'); - } else if ( $this->language_avaialable_installed() ) { - add_meta_box('um-metaboxes-sidebox-2', __('Language','ultimate-member'), array(&$this, 'up_language'), $this->pagehook, 'side', 'core'); - } else if ( $this->language_not_available() ) { - add_meta_box('um-metaboxes-sidebox-2', __('Language','ultimate-member'), array(&$this, 'ct_language'), $this->pagehook, 'side', 'core'); - } - - } - - function up_language() { - global $ultimatemember; - $locale = get_option('WPLANG'); - include_once um_path . 'admin/templates/dashboard/language-update.php'; - } - - function dl_language() { - global $ultimatemember; - $locale = get_option('WPLANG'); - include_once um_path . 'admin/templates/dashboard/language-download.php'; - } - - function ct_language() { - global $ultimatemember; - $locale = get_option('WPLANG'); - include_once um_path . 'admin/templates/dashboard/language-contrib.php'; - } - - function um_news() { - global $ultimatemember; - include_once um_path . 'admin/templates/dashboard/feed.php'; - } - - function users_overview() { - global $ultimatemember; - include_once um_path . 'admin/templates/dashboard/users.php'; - } - - function purge_temp() { - global $ultimatemember; - include_once um_path . 'admin/templates/dashboard/purge.php'; - } - - function user_cache() { - global $ultimatemember; - include_once um_path . 'admin/templates/dashboard/cache.php'; - } - - /*** - *** @language not available - ***/ - function language_not_available() { - $locale = get_option('WPLANG'); - if ( $locale && !strstr($locale, 'en_') && !isset( $ultimatemember->available_languages[$locale] ) && !file_exists( WP_LANG_DIR . '/plugins/ultimatemember-' . $locale . '.mo' ) ) - return true; - return false; - } - - /*** - *** @language available but not installed - ***/ - function language_avaialable_not_installed() { - global $ultimatemember; - $locale = get_option('WPLANG'); - if ( $locale && isset( $ultimatemember->available_languages[$locale] ) && !file_exists( WP_LANG_DIR . '/plugins/ultimatemember-' . $locale . '.mo' ) ) - return true; - return false; - } - - /*** - *** @language available and installed - ***/ - function language_avaialable_installed() { - global $ultimatemember; - $locale = get_option('WPLANG'); - if ( $locale && isset( $ultimatemember->available_languages[$locale] ) && file_exists( WP_LANG_DIR . '/plugins/ultimatemember-' . $locale . '.mo' ) ) - return true; - return false; - } - - /*** - *** @get a directory size - ***/ - function dir_size( $directory ) { - global $ultimatemember; - if ( $directory == 'temp' ) { - $directory = $ultimatemember->files->upload_temp; - $size = 0; - foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file){ - $size+=$file->getSize(); - } - return round ( $size / 1048576, 2); - } - return 0; - } - - /*** - *** @which admin page to show? - ***/ - function admin_page() { - - $page = $_REQUEST['page']; - if ( $page == 'ultimatemember' && ! isset( $_REQUEST['um-addon'] ) ) { - - ?> - -
    - -

    Ultimate Member

    - - - - - - - -
    - -
    - -
    pagehook,'core',null); ?>
    -
    pagehook,'normal',null); ?>
    -
    pagehook,'side',null); ?>
    - -
    - -
    - -
    - -
    args['share_icons'] as $k => $arr ) { ?> -
    - - - - query->get_attr('custom_fields', $form_id ); - - $this->row_data = get_option('um_form_rowdata_'. $form_id, array() ); - $this->exist_rows = array(); - - if ( ! empty( $fields ) ) { - foreach ( $fields as $key => $array ) { - if ( $array['type'] == 'row' ) { - $this->row_data[$key] = $array; - unset( $fields[$key] ); - } - } - } else { - $fields = array(); - } - - foreach ( $_POST as $key => $value ) { - - // adding rows - if ( 0 === strpos( $key, '_um_row_' ) ) { - - $update_args = null; - - $row_id = str_replace( '_um_row_', '', $key ); - - $row_array = array( - 'type' => 'row', - 'id' => $value, - 'sub_rows' => $_POST[ '_um_rowsub_'.$row_id .'_rows' ], - 'cols' => $_POST[ '_um_rowcols_'.$row_id .'_cols' ], - 'origin' => $_POST[ '_um_roworigin_'.$row_id . '_val' ], - ); - - $row_args = $row_array; - - if ( isset( $this->row_data[ $row_array['origin'] ] ) ) { - foreach( $this->row_data[ $row_array['origin'] ] as $k => $v ){ - if ( $k != 'position' && $k != 'metakey' ) { - $update_args[$k] = $v; - } - } - if ( isset( $update_args ) ) { - $row_args = array_merge( $update_args, $row_array ); - } - $this->exist_rows[] = $key; - } - - $fields[$key] = $row_args; - - } - - // change field position - if ( 0 === strpos( $key, 'um_position_' ) ) { - $field_key = str_replace('um_position_','',$key); - if ( isset( $fields[$field_key] ) ) { - $fields[$field_key]['position'] = $value; - } - } - - // change field master row - if ( 0 === strpos( $key, 'um_row_' ) ) { - $field_key = str_replace('um_row_','',$key); - if ( isset( $fields[$field_key] ) ) { - $fields[$field_key]['in_row'] = $value; - } - } - - // change field sub row - if ( 0 === strpos( $key, 'um_subrow_' ) ) { - $field_key = str_replace('um_subrow_','',$key); - if ( isset( $fields[$field_key] ) ) { - $fields[$field_key]['in_sub_row'] = $value; - } - } - - // change field column - if ( 0 === strpos( $key, 'um_col_' ) ) { - $field_key = str_replace('um_col_','',$key); - if ( isset( $fields[$field_key] ) ) { - $fields[$field_key]['in_column'] = $value; - } - } - - // add field to group - if ( 0 === strpos( $key, 'um_group_' ) ) { - $field_key = str_replace('um_group_','',$key); - if ( isset( $fields[$field_key] ) ) { - $fields[$field_key]['in_group'] = $value; - } - } - - } - - foreach ( $this->row_data as $k => $v ) { - if ( ! in_array( $k, $this->exist_rows ) ) - unset( $this->row_data[$k] ); - } - - update_option( 'um_existing_rows_' . $form_id, $this->exist_rows ); - - update_option( 'um_form_rowdata_' . $form_id , $this->row_data ); - - $ultimatemember->query->update_attr( 'custom_fields', $form_id, $fields ); - - } - - /*** - *** @load form to maintain form order - ***/ - function load_field_order(){ - - global $ultimatemember; - - $screen = get_current_screen(); - - if ( !isset( $screen->id ) || $screen->id != 'um_form' ) return; - - ?> - -
    - - - - - - -
    - - - - - -
    - -
    - - - - slug = 'ultimatemember'; - - add_action('admin_head', array(&$this, 'admin_head'), 9); - - add_action('admin_enqueue_scripts', array(&$this, 'admin_enqueue_scripts'), 9); - - add_filter('admin_body_class', array(&$this, 'admin_body_class'), 999 ); - - add_filter('enter_title_here', array(&$this, 'enter_title_here') ); - - } - - /*** - *** @enter title placeholder - ***/ - function enter_title_here( $title ){ - $screen = get_current_screen(); - if ( 'um_directory' == $screen->post_type ){ - $title = 'e.g. Member Directory'; - } - if ( 'um_role' == $screen->post_type ){ - $title = 'e.g. Community Member'; - } - if ( 'um_form' == $screen->post_type ){ - $title = 'e.g. New Registration Form'; - } - return $title; - } - - /*** - *** @Runs on admin head - ***/ - function admin_head(){ - - if ( $this->is_plugin_post_type() ){ - - ?> - - - - id; - - if ( !is_admin() ) return false; - - if ( strstr( $screen_id, 'ultimatemember' ) || strstr( $screen_id, 'um_') || strstr($screen_id, 'user') || strstr($screen_id, 'profile') )return true; - - if ( $screen_id == 'nav-menus' ) return true; - - if ( isset( $post->post_type ) ) return true; - - if ( isset( $tax->name ) ) return true; - - return false; - - } - - /*** - *** @Adds class to our admin pages - ***/ - function admin_body_class($classes){ - if ( $this->is_UM_admin() ) { - return "$classes um-admin"; - } - return $classes; - } - - /*** - *** @Enqueue scripts and styles - ***/ - function admin_enqueue_scripts(){ - global $ultimatemember, $post; - - if ( $this->is_UM_admin() ) { - - if ( get_post_type() != 'shop_order' ) { - $ultimatemember->styles->wp_enqueue_scripts(); - } - - $this->load_global_css(); - $this->load_form(); - $this->load_modal(); - $this->load_dashboard(); - $this->load_field(); - $this->load_users_js(); - $this->load_builder(); - $this->load_redux_css(); - $this->load_css(); - $this->load_core_wp(); - $this->load_ajax_js(); - $this->load_custom_scripts(); - - if ( is_rtl() ) { - wp_register_style('um_admin_rtl', um_url . 'admin/assets/css/um-admin-rtl.css' ); - wp_enqueue_style('um_admin_rtl'); - } - - } else { - - $this->load_global_css(); - - } - - } - -} diff --git a/admin/core/um-admin-functions.php b/admin/core/um-admin-functions.php deleted file mode 100644 index a13fb96c..00000000 --- a/admin/core/um-admin-functions.php +++ /dev/null @@ -1,112 +0,0 @@ -slug = 'ultimatemember'; - - add_action('parent_file', array(&$this, 'parent_file'), 9); - - add_filter('gettext', array(&$this, 'gettext'), 10, 4); - - add_filter('post_updated_messages', array(&$this, 'post_updated_messages') ); - - } - - /*** - *** @updated post messages - ***/ - function post_updated_messages($messages) { - global $post, $post_ID; - - $post_type = get_post_type( $post_ID ); - if ($post_type == 'um_form') { - - $messages['um_form'] = array( - 0 => '', - 1 => __('Form updated.'), - 2 => __('Custom field updated.'), - 3 => __('Custom field deleted.'), - 4 => __('Form updated.'), - 5 => isset($_GET['revision']) ? __('Form restored to revision.') : false, - 6 => __('Form created.'), - 7 => __('Form saved.'), - 8 => __('Form submitted.'), - 9 => __('Form scheduled.'), - 10=> __('Form draft updated.'), - ); - - } - - if ($post_type == 'um_role') { - - $messages['um_role'] = array( - 0 => '', - 1 => __('Role updated.'), - 2 => __('Custom field updated.'), - 3 => __('Custom field deleted.'), - 4 => __('Role updated.'), - 5 => isset($_GET['revision']) ? __('Role restored to revision.') : false, - 6 => __('Role created.'), - 7 => __('Role saved.'), - 8 => __('Role submitted.'), - 9 => __('Role scheduled.'), - 10=> __('Role draft updated.'), - ); - - } - - return $messages; - } - - /*** - *** @check that we're on a custom post type supported by UM - ***/ - function is_plugin_post_type(){ - if (isset($_REQUEST['post_type'])){ - $post_type = $_REQUEST['post_type']; - if ( in_array($post_type, array('um_form','um_role','um_directory'))){ - return true; - } - } else if ( isset($_REQUEST['action'] ) && $_REQUEST['action'] == 'edit') { - $post_type = get_post_type(); - if ( in_array($post_type, array('um_form','um_role','um_directory'))){ - return true; - } - } - return false; - } - - /*** - *** @gettext filters - ***/ - function gettext($translation, $text, $domain) { - global $post; - $screen = get_current_screen(); - if (isset($post->post_type) && $this->is_plugin_post_type() ) { - $translations = get_translations_for_domain( $domain); - if ( $text == 'Publish') { - return $translations->translate( 'Create' ); - } - if ( $text == 'Move to Trash') { - return $translations->translate( 'Delete' ); - } - } - - return $translation; - } - - /*** - *** @Fix parent file for correct highlighting - ***/ - function parent_file($parent_file){ - global $current_screen; - $screen_id = $current_screen->id; - if ( strstr($screen_id, 'um_') ) { - $parent_file = $this->slug; - } - return $parent_file; - } - -} \ No newline at end of file diff --git a/admin/core/um-admin-metabox.php b/admin/core/um-admin-metabox.php deleted file mode 100644 index f57af9dc..00000000 --- a/admin/core/um-admin-metabox.php +++ /dev/null @@ -1,1548 +0,0 @@ -slug = 'ultimatemember'; - - $this->in_edit = false; - $this->edit_mode_value = null; - - add_action('admin_head', array(&$this, 'admin_head'), 9); - add_action('admin_footer', array(&$this, 'load_modal_content'), 9); - - add_action( 'load-post.php', array(&$this, 'add_metabox'), 9 ); - add_action( 'load-post-new.php', array(&$this, 'add_metabox'), 9 ); - - } - - /*** - *** @Boolean check if we're viewing UM backend - ***/ - function is_UM_admin(){ - global $current_screen; - $screen_id = $current_screen->id; - if ( is_admin() && ( strstr( $screen_id, 'ultimatemember' ) || strstr( $screen_id, 'um_') || strstr($screen_id, 'user') || strstr($screen_id, 'profile') ) ) - return true; - return false; - } - - /*** - *** @check that we're on a custom post type supported by UM - ***/ - function is_plugin_post_type(){ - if (isset($_REQUEST['post_type'])){ - $post_type = $_REQUEST['post_type']; - if ( in_array($post_type, array('um_form','um_role','um_directory'))){ - return true; - } - } else if ( isset($_REQUEST['action'] ) && $_REQUEST['action'] == 'edit') { - $post_type = get_post_type(); - if ( in_array($post_type, array('um_form','um_role','um_directory'))){ - return true; - } - } - return false; - } - - /*** - *** @Gets the role meta - ***/ - function get_custom_post_meta($id){ - $all_meta = get_post_custom($id); - foreach($all_meta as $k=>$v){ - if (strstr($k, '_um_')){ - $um_meta[$k] = $v; - } - } - if (isset($um_meta)) - return $um_meta; - } - - /*** - *** @Runs on admin head - ***/ - function admin_head(){ - global $post; - if ( $this->is_plugin_post_type() && isset($post->ID) ){ - $this->postmeta = $this->get_custom_post_meta($post->ID); - } - } - - /*** - *** @add a helper tooltip - ***/ - function _tooltip( $text ){ - - $output = ''; - $output .= ''; - $output .= ''; - - return $output; - - } - - /*** - *** @add a helper tooltip - ***/ - function tooltip( $text, $e = false ){ - - ?> - - - - - - - - - - 0 ) { - $default = $meta; - } - - $yes = ( !empty( $yes ) ) ? $yes : __('Yes'); - $no = ( !empty( $no ) ) ? $no : __('No'); - - if (isset($this->postmeta[$id][0]) || $meta ) { - $active = ( isset( $this->postmeta[$id][0] ) ) ? $this->postmeta[$id][0] : $meta; - } else { - $active = $default; - } - - if ($is_conditional == true) { - $is_conditional = ' class="um-adm-conditional" data-cond1="'.$cond1.'" data-cond1-show="'.$cond1_show.'" data-cond1-hide="'.$cond1_hide.'"'; - } - - ?> - - - - - - /> - - - id == 'um_form'){ - add_action( 'add_meta_boxes', array(&$this, 'add_metabox_form'), 1 ); - add_action( 'save_post', array(&$this, 'save_metabox_form'), 10, 2 ); - } - - if( $current_screen->id == 'um_role'){ - add_action( 'add_meta_boxes', array(&$this, 'add_metabox_role'), 1 ); - add_action( 'save_post', array(&$this, 'save_metabox_role'), 10, 2 ); - } - - if( $current_screen->id == 'um_directory'){ - add_action( 'add_meta_boxes', array(&$this, 'add_metabox_directory'), 1 ); - add_action( 'save_post', array(&$this, 'save_metabox_directory'), 10, 2 ); - } - - } - - /*** - *** @load a directory metabox - ***/ - function load_metabox_directory( $object, $box ) { - global $ultimatemember; - $box['id'] = str_replace('um-admin-form-','', $box['id']); - include_once um_path . 'admin/templates/directory/'. $box['id'] . '.php'; - wp_nonce_field( basename( __FILE__ ), 'um_admin_save_metabox_directory_nonce' ); - } - - /*** - *** @load a role metabox - ***/ - function load_metabox_role( $object, $box ) { - global $ultimatemember, $post; - - $box['id'] = str_replace('um-admin-form-','', $box['id']); - - if ( $box['id'] == 'builder' ) { - $UM_Builder = new UM_Admin_Builder(); - $UM_Builder->form_id = get_the_ID(); - } - - preg_match('#\{.*?\}#s', $box['id'], $matches); - - if ( isset($matches[0]) ){ - $path = $matches[0]; - $box['id'] = preg_replace('~(\\{[^}]+\\})~','', $box['id'] ); - } else { - $path = um_path; - } - - $path = str_replace('{','', $path ); - $path = str_replace('}','', $path ); - - include_once $path . 'admin/templates/role/'. $box['id'] . '.php'; - wp_nonce_field( basename( __FILE__ ), 'um_admin_save_metabox_role_nonce' ); - } - - /*** - *** @load a form metabox - ***/ - function load_metabox_form( $object, $box ) { - global $ultimatemember, $post; - - $box['id'] = str_replace('um-admin-form-','', $box['id']); - - if ( $box['id'] == 'builder' ) { - $UM_Builder = new UM_Admin_Builder(); - $UM_Builder->form_id = get_the_ID(); - } - - preg_match('#\{.*?\}#s', $box['id'], $matches); - - if ( isset($matches[0]) ){ - $path = $matches[0]; - $box['id'] = preg_replace('~(\\{[^}]+\\})~','', $box['id'] ); - } else { - $path = um_path; - } - - $path = str_replace('{','', $path ); - $path = str_replace('}','', $path ); - - include_once $path . 'admin/templates/form/'. $box['id'] . '.php'; - wp_nonce_field( basename( __FILE__ ), 'um_admin_save_metabox_form_nonce' ); - } - - /*** - *** @add directory metabox - ***/ - function add_metabox_directory() { - - add_meta_box('um-admin-form-general', __('General Options'), array(&$this, 'load_metabox_directory'), 'um_directory', 'normal', 'default'); - add_meta_box('um-admin-form-profile', __('Profile Card'), array(&$this, 'load_metabox_directory'), 'um_directory', 'normal', 'default'); - add_meta_box('um-admin-form-search', __('Search Options'), array(&$this, 'load_metabox_directory'), 'um_directory', 'normal', 'default'); - add_meta_box('um-admin-form-pagination', __('Results & Pagination'), array(&$this, 'load_metabox_directory'), 'um_directory', 'normal', 'default'); - - add_meta_box('um-admin-form-shortcode', __('Shortcode'), array(&$this, 'load_metabox_directory'), 'um_directory', 'side', 'default'); - - add_meta_box('um-admin-form-appearance', __('Styling: General'), array(&$this, 'load_metabox_directory'), 'um_directory', 'side', 'default'); - - add_meta_box('um-admin-form-profile_card', __('Styling: Profile Card'), array(&$this, 'load_metabox_directory'), 'um_directory', 'side', 'default'); - - } - - /*** - *** @add role metabox - ***/ - function add_metabox_role() { - - add_meta_box('um-admin-form-sync', __('Sync with WordPress Role','ultimate-member'), array(&$this, 'load_metabox_role'), 'um_role', 'side', 'default'); - - add_meta_box('um-admin-form-admin', __('Administrative Permissions','ultimate-member'), array(&$this, 'load_metabox_role'), 'um_role', 'normal', 'default'); - - add_meta_box('um-admin-form-general', __('General Permissions','ultimate-member'), array(&$this, 'load_metabox_role'), 'um_role', 'normal', 'default'); - - add_meta_box('um-admin-form-profile', __('Profile Access','ultimate-member'), array(&$this, 'load_metabox_role'), 'um_role', 'normal', 'default'); - - add_meta_box('um-admin-form-home', __('Homepage Options','ultimate-member'), array(&$this, 'load_metabox_role'), 'um_role', 'normal', 'default'); - - add_meta_box('um-admin-form-register', __('Registration Options','ultimate-member'), array(&$this, 'load_metabox_role'), 'um_role', 'normal', 'default'); - - add_meta_box('um-admin-form-login', __('Login Options','ultimate-member'), array(&$this, 'load_metabox_role'), 'um_role', 'normal', 'default'); - - add_meta_box('um-admin-form-logout', __('Logout Options','ultimate-member'), array(&$this, 'load_metabox_role'), 'um_role', 'normal', 'default'); - - add_meta_box('um-admin-form-delete', __('Delete Options','ultimate-member'), array(&$this, 'load_metabox_role'), 'um_role', 'normal', 'default'); - - do_action('um_admin_custom_role_metaboxes'); - - } - - /*** - *** @add form metabox - ***/ - function add_metabox_form() { - - add_meta_box('um-admin-form-mode', __('Select Form Type'), array(&$this, 'load_metabox_form'), 'um_form', 'normal', 'default'); - add_meta_box('um-admin-form-builder', __('Form Builder'), array(&$this, 'load_metabox_form'), 'um_form', 'normal', 'default'); - add_meta_box('um-admin-form-shortcode', __('Shortcode'), array(&$this, 'load_metabox_form'), 'um_form', 'side', 'default'); - - add_meta_box('um-admin-form-register_customize', __('Customize this form'), array(&$this, 'load_metabox_form'), 'um_form', 'side', 'default'); - add_meta_box('um-admin-form-register_css', __('Custom CSS'), array(&$this, 'load_metabox_form'), 'um_form', 'side', 'default'); - - do_action('um_admin_custom_register_metaboxes'); - - add_meta_box('um-admin-form-profile_customize', __('Customize this form'), array(&$this, 'load_metabox_form'), 'um_form', 'side', 'default'); - add_meta_box('um-admin-form-profile_settings', __('User Meta'), array(&$this, 'load_metabox_form'), 'um_form', 'side', 'default'); - add_meta_box('um-admin-form-profile_css', __('Custom CSS'), array(&$this, 'load_metabox_form'), 'um_form', 'side', 'default'); - - do_action('um_admin_custom_profile_metaboxes'); - - add_meta_box('um-admin-form-login_customize', __('Customize this form'), array(&$this, 'load_metabox_form'), 'um_form', 'side', 'default'); - add_meta_box('um-admin-form-login_settings', __('Options'), array(&$this, 'load_metabox_form'), 'um_form', 'side', 'default'); - add_meta_box('um-admin-form-login_css', __('Custom CSS'), array(&$this, 'load_metabox_form'), 'um_form', 'side', 'default'); - - do_action('um_admin_custom_login_metaboxes'); - - } - - /*** - *** @save directory metabox - ***/ - function save_metabox_directory( $post_id, $post ) { - global $wpdb; - - // validate nonce - if ( !isset( $_POST['um_admin_save_metabox_directory_nonce'] ) || !wp_verify_nonce( $_POST['um_admin_save_metabox_directory_nonce'], basename( __FILE__ ) ) ) return $post_id; - - // validate post type - if ( $post->post_type != 'um_directory' ) return $post_id; - - // validate user - $post_type = get_post_type_object( $post->post_type ); - if ( !current_user_can( $post_type->cap->edit_post, $post_id ) ) return $post_id; - - $where = array( 'ID' => $post_id ); - if (empty($_POST['post_title'])) $_POST['post_title'] = 'Directory #'.$post_id; - $wpdb->update( $wpdb->posts, array( 'post_title' => $_POST['post_title'] ), $where ); - - // save - delete_post_meta( $post_id, '_um_roles' ); - delete_post_meta( $post_id, '_um_tagline_fields' ); - delete_post_meta( $post_id, '_um_reveal_fields' ); - delete_post_meta( $post_id, '_um_search_fields' ); - delete_post_meta( $post_id, '_um_roles_can_search' ); - delete_post_meta( $post_id, '_um_show_these_users' ); - foreach( $_POST as $k => $v ) { - if ( $k == '_um_show_these_users' && trim( $_POST[ $k ] ) ) { - $v = preg_split('/[\r\n]+/', $v, -1, PREG_SPLIT_NO_EMPTY); - } - if (strstr($k, '_um_')){ - update_post_meta( $post_id, $k, $v); - } - } - - } - - /*** - *** @save role metabox - ***/ - function save_metabox_role( $post_id, $post ) { - global $wpdb; - - // validate nonce - if ( !isset( $_POST['um_admin_save_metabox_role_nonce'] ) || !wp_verify_nonce( $_POST['um_admin_save_metabox_role_nonce'], basename( __FILE__ ) ) ) return $post_id; - - // validate post type - if ( $post->post_type != 'um_role' ) return $post_id; - - // validate user - $post_type = get_post_type_object( $post->post_type ); - if ( !current_user_can( $post_type->cap->edit_post, $post_id ) ) return $post_id; - - $where = array( 'ID' => $post_id ); - if (empty($_POST['post_title'])) $_POST['post_title'] = 'Role #'.$post_id; - $wpdb->update( $wpdb->posts, array( 'post_title' => $_POST['post_title'], 'post_name' => sanitize_title( $_POST['post_title'] ) ), $where ); - - // save - delete_post_meta( $post_id, '_um_can_view_roles' ); - delete_post_meta( $post_id, '_um_can_edit_roles' ); - delete_post_meta( $post_id, '_um_can_delete_roles' ); - - do_action('um_admin_before_saving_role_meta', $post_id ); - - do_action('um_admin_before_save_role', $post_id, $post ); - - foreach( $_POST as $k => $v ) { - if (strstr($k, '_um_')){ - update_post_meta( $post_id, $k, $v); - } - } - - do_action('um_admin_after_editing_role', $post_id, $post); - - do_action('um_admin_after_save_role', $post_id, $post ); - - } - - /*** - *** @save form metabox - ***/ - function save_metabox_form( $post_id, $post ) { - global $wpdb; - - // validate nonce - if ( !isset( $_POST['um_admin_save_metabox_form_nonce'] ) || !wp_verify_nonce( $_POST['um_admin_save_metabox_form_nonce'], basename( __FILE__ ) ) ) return $post_id; - - // validate post type - if ( $post->post_type != 'um_form' ) return $post_id; - - // validate user - $post_type = get_post_type_object( $post->post_type ); - if ( !current_user_can( $post_type->cap->edit_post, $post_id ) ) return $post_id; - - $where = array( 'ID' => $post_id ); - if (empty($_POST['post_title'])) $_POST['post_title'] = 'Form #'.$post_id; - $wpdb->update( $wpdb->posts, array( 'post_title' => $_POST['post_title'] ), $where ); - - // save - delete_post_meta( $post_id, '_um_profile_metafields' ); - foreach( $_POST as $k => $v ) { - if (strstr($k, '_um_')){ - update_post_meta( $post_id, $k, $v); - } - } - - } - - /*** - *** @Load modal content - ***/ - function load_modal_content(){ - - global $ultimatemember; - - $screen = get_current_screen(); - if ( $this->is_UM_admin() ) { - foreach( glob( um_path . 'admin/templates/modal/*.php' ) as $modal_content) { - include_once $modal_content; - } - } - - // needed on forms only - if ( !isset( $this->is_loaded ) && isset( $screen->id ) && strstr( $screen->id, 'um_form' ) ) { - - $settings['textarea_rows'] = 8; - - echo ''; - - echo ''; - - } - - } - - /*** - *** @Show field input for edit - ***/ - function field_input ( $attribute, $form_id=null, $field_args = array() ) { - - global $ultimatemember; - - if ( $this->in_edit == true ) { // we're editing a field - $real_attr = substr($attribute, 1); - $this->edit_mode_value = (isset( $this->edit_array[ $real_attr ] ) ) ? $this->edit_array[ $real_attr ] : null; - } - - switch($attribute) { - - default: - - do_action("um_admin_field_edit_hook{$attribute}", $this->edit_mode_value); - - break; - - case '_visibility': - ?> - -

    - -

    - - - -

    - - -    -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - set_field_type == 'row' ) { - $back = 'UM_edit_row'; - - ?> - -

    - - Choose Icon - - edit_mode_value ) { ?>No Icon - - - - edit_mode_value ) { ?> - - - - - -

    - - in_edit ) { - $back = 'UM_edit_field'; - } else { - $back = 'UM_add_field'; - } - - ?> - -
    - -

    - - Choose Icon - - edit_mode_value ) { ?>No Icon - - - - edit_mode_value ) { ?> - - - - - -

    - -
    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - edit_mode_value ) ) $this->ui_on_off('_heading', $this->edit_mode_value, true, 1, '_heading_text', 'xxx' ); else $this->ui_on_off('_heading', 0, true, 1, '_heading_text', 'xxx'); ?> -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - edit_mode_value ) ) $this->ui_on_off('_force_good_pass', $this->edit_mode_value ); else $this->ui_on_off('_force_good_pass', 0 ); ?> -

    - - - -

    - edit_mode_value ) ) $this->ui_on_off('_force_confirm_pass', $this->edit_mode_value ); else $this->ui_on_off('_force_confirm_pass', 1 ); ?> -

    - - - -

    - -

    - - - -

    - -

    - - set_field_type == 'date' ) { - ?> - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - edit_mode_value ) && is_array( $this->edit_mode_value ) ) { - $values = $this->edit_mode_value; - } else { - $values = array(''); - } - ?> - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - set_field_type == 'shortcode' ) { - - ?> - -

    - -

    - - - -
    - -
    - - - -

    - -

    - - set_field_type == 'image' ) { - - if ( isset( $this->edit_mode_value ) && is_array( $this->edit_mode_value ) ) { - $values = $this->edit_mode_value; - } else { - $values = array('png','jpeg','jpg','gif'); - } - ?> - -

    - -

    - - edit_mode_value ) && is_array( $this->edit_mode_value ) ) { - $values = $this->edit_mode_value; - } else { - $values = array('pdf','txt'); - } - - ?> - -

    - -

    - - set_field_type == 'image' ) $value = 'Drag & Drop Photo'; - if ( $this->set_field_type == 'file' ) $value = 'Drag & Drop File'; - - ?> - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - edit_mode_value ) ) { - $this->ui_on_off('_is_multi', $this->edit_mode_value, true, 1, '_max_selections', 'xxx'); - } else { - $this->ui_on_off('_is_multi', 0, true, 1, '_max_selections', 'xxx'); - } - ?> -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - -

    - edit_mode_value ) ) $this->ui_on_off('_html', $this->edit_mode_value ); else $this->ui_on_off('_html', 0); ?> -

    - - edit_mode_value ) && is_array( $this->edit_mode_value ) ) { - $values = implode("\n", $this->edit_mode_value); - } else if ( $this->edit_mode_value ) { - $values = $this->edit_mode_value; - } else { - $values = ''; - } - - ?> - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - in_edit ) { - - ?> - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - - - set_field_type == 'textarea' ) { ?> - -

    - -

    - - set_field_type == 'rating' ) { ?> - -

    - -

    - - - -

    - -

    - - - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - edit_mode_value ) && is_array( $this->edit_mode_value ) ) { - $values = $this->edit_mode_value; - } else { - $values = array(''); - } - - ?> - -

    - -

    - - set_field_type == 'password' ) - $def_required = 1; - else - $def_required = 0; - - ?> - -
    - -

    - edit_mode_value ) ) $this->ui_on_off('_required', $this->edit_mode_value ); else $this->ui_on_off('_required', $def_required); ?> -

    - -
    - - - -
    - -

    - edit_mode_value ) ) $this->ui_on_off('_editable', $this->edit_mode_value ); else $this->ui_on_off('_editable', 1); ?> -

    - -
    - - - -

    - -

    - - - -

    - -

    - - - -

    - -

    - - files->upload_basedir; - $path = str_replace('/uploads/ultimatemember','',$path); - $path = $path . '/languages/plugins/'; - $path = str_replace('//','/',$path); - - if ( !file_exists( $path ) ) { - $old = umask(0); - @mkdir( $path, 0777, true); - umask($old); - } - - } - - /*** - *** @show main notices - ***/ - function main_notices(){ - global $ultimatemember; - $hide_register_notice = get_option('um_can_register_notice'); - - if ( ! defined('DOING_AJAX') ) { - - if ( !get_option('users_can_register') && !$hide_register_notice ) { - - echo '

    '; - - echo sprintf(__( 'Registration is disabled. Please go to the general settings page in the WordPress admin and select anyone can register. Hide this notice', 'ultimate-member'), admin_url('options-general.php'), add_query_arg('um_adm_action', 'um_can_register_notice') ); - - echo '

    '; - - } - - $hide_exif_notice = get_option('um_hide_exif_notice'); - - if ( !extension_loaded('exif') && !$hide_exif_notice ) { - - echo '

    '; - - echo sprintf(__( 'Exif is not enabled on your server. Mobile photo uploads will not be rotated correctly until you enable the exif extension. Hide this notice', 'ultimate-member'), add_query_arg('um_adm_action', 'um_hide_exif_notice') ); - - echo '

    '; - - } - - // Regarding page setup - $pages = $ultimatemember->permalinks->core; - if ( $pages && is_array( $pages ) ) { - - $err = false; - - foreach( $pages as $slug => $page_id ) { - - $page = get_post( $page_id ); - if ( !isset( $page->ID ) && in_array( $slug, array( 'user','account','members','register','login','logout','password-reset' ) ) ) { - $err = true; - } - - } - - if ( $err ) { - echo '

    ' . __('One or more of your Ultimate Member pages are not correctly setup. Please visit Ultimate Member > Settings to re-assign your missing pages.','ultimate-member') . '

    '; - } - - if ( isset( $pages['user'] ) ) { - $test = get_post( $pages['user'] ); - if ( isset( $test->post_parent ) && $test->post_parent > 0 ) { - echo '

    ' . __('Ultimate Member Setup Error: User page can not be a child page.','ultimate-member') . '

    '; - } - } - - if ( isset( $pages['account'] ) ) { - $test = get_post( $pages['account'] ); - if ( isset( $test->post_parent ) && $test->post_parent > 0 ) { - echo '

    ' . __('Ultimate Member Setup Error: Account page can not be a child page.','ultimate-member') . '

    '; - } - } - - } - - do_action('um_admin_after_main_notices'); - } - - } - - - /*** - *** @localization notice - ***/ - function localize_note() { - global $ultimatemember; - - $locale = get_option('WPLANG'); - if ( !$locale ) return; - if ( strstr( $locale, 'en_' ) ) return; // really, english! - if ( file_exists( WP_LANG_DIR . '/plugins/ultimatemember-' . $locale . '.mo' ) ) return; - - if ( isset( $ultimatemember->available_languages[ $locale ] ) ) { - - $download_uri = add_query_arg('um_adm_action', 'um_language_downloader'); - - $hide_locale_notice = get_option('um_hide_locale_notice'); - if ( !$hide_locale_notice ) { - echo '

    '; - - echo sprintf(__('Your site language is %1$s. Good news! Ultimate Member is already available in %2$s language. Download the translation files and start using the plugin in your language now. Hide this notice','ultimate-member'), $locale, $ultimatemember->available_languages[$locale], $download_uri, add_query_arg('um_adm_action', 'um_hide_locale_notice') ); - - echo '

    '; - } - - - } else { - - $hide_locale_notice = get_option('um_hide_locale_notice'); - if ( !$hide_locale_notice ) { - - echo '

    '; - - echo sprintf(__('Ultimate Member has not yet been translated to your langeuage: %1$s. If you have translated the plugin you need put these files ultimatemember-%1$s.po and ultimatemember-%1$s.mo in /wp-content/languages/plugins/ for the plugin to be translated in your language. Hide this notice','ultimate-member'), $locale, add_query_arg('um_adm_action', 'um_hide_locale_notice') ); - - echo '

    '; - - } - - } - - } - - /*** - *** @updating users - ***/ - function show_update_messages(){ - - if ( !isset($_REQUEST['update']) ) return; - - $update = $_REQUEST['update']; - switch($update) { - - case 'confirm_delete': - $confirm_uri = admin_url('users.php?' . http_build_query(array( - 'um_adm_action' => 'delete_users', - 'user' => array_map('intval', (array) $_REQUEST['user']), - 'confirm' => 1 - ))); - $users = ''; - - if( isset( $_REQUEST['user'] ) ){ - foreach( $_REQUEST['user'] as $user_id ) { - $user = get_userdata( $user_id ); - $users .= '#' . $user_id . ': ' . $user->user_login . '
    '; - } - } - - $ignore = admin_url('users.php'); - - $messages[0]['err_content'] = sprintf(__('Are you sure you want to delete the selected user(s)? The following users will be deleted:

    %s

    This cannot be undone!','ultimate-member'), $users); - $messages[0]['err_content'] .= '

    ' . __('Remove','ultimate-member') . '  ' . __('Undo','ultimate-member') . '

    '; - - break; - - case 'language_updated': - $messages[0]['content'] = __('Your translation files have been updated successfully.','ultimate-member'); - break; - - case 'purged_temp': - $messages[0]['content'] = __('Your temp uploads directory is now clean.','ultimate-member'); - break; - - case 'cleared_cache': - $messages[0]['content'] = __('Your user cache is now removed.','ultimate-member'); - break; - - case 'form_duplicated': - $messages[0]['content'] = __('The form has been duplicated successfully.','ultimate-member'); - break; - - case 'user_updated': - $messages[0]['content'] = __('User has been updated.','ultimate-member'); - break; - - case 'users_updated': - $messages[0]['content'] = __('Users have been updated.','ultimate-member'); - break; - - case 'users_role_updated': - $messages[0]['content'] = __('Changed roles.','ultimate-member'); - break; - - case 'err_users_updated': - $messages[0]['err_content'] = __('Super administrators cannot be modified.','ultimate-member'); - $messages[1]['content'] = __('Other users have been updated.','ultimate-member'); - - } - - if ( !empty( $messages ) ) { - foreach( $messages as $message ) { - if ( isset($message['err_content'])) { - echo '

    ' . $message['err_content'] . '

    '; - } else { - echo '

    ' . $message['content'] . '

    '; - } - } - } - - } - -} diff --git a/admin/core/um-admin-redux.php b/admin/core/um-admin-redux.php deleted file mode 100644 index 8c3c4001..00000000 --- a/admin/core/um-admin-redux.php +++ /dev/null @@ -1,126 +0,0 @@ -args['opt_name'] == 'um_options' ) { - $redux->args['dev_mode'] = false; - $redux->args['dev_mode_forced'] = false; - $redux->args['update_notice'] = false; - } - - } - - - public function initSettings() { - - $this->setArguments(); - $this->setSections(); - - if ( ! isset( $this->args['opt_name'] ) ) { // No errors please - return; - } - - $this->ReduxFramework = new ReduxFramework( $this->sections, $this->args ); - } - - public function setSections() { - - include_once um_path . 'um-config.php'; - - } - - public function setArguments() { - - $this->args = array( - 'opt_name' => 'um_options', // This is where your data is stored in the database and also becomes your global variable name. - 'display_name' => __('Ultimate Member', 'ultimate-member'), // Name that appears at the top of your panel - 'display_version' => ultimatemember_version, // Version that appears at the top of your panel - 'menu_type' => 'submenu', //Specify if the admin menu should appear or not. Options: menu or submenu (Under appearance only) - 'allow_sub_menu' => false, // Show the sections below the admin menu item or not - 'menu_title' => __('Settings', 'ultimate-member'), - 'page_title' => __('Settings', 'ultimate-member'), - - 'google_api_key' => '', // Must be defined to add google fonts to the typography module - 'async_typography' => true, // Use a asynchronous font on the front end or font string - 'admin_bar' => false, // Show the panel pages on the admin bar - 'global_variable' => '', // Set a different name for your global variable other than the opt_name - 'dev_mode' => false, // Show the time the page took to load, etc - 'customizer' => false, // Enable basic customizer support - 'page_priority' => null, // Order where the menu appears in the admin area. If there is any conflict, something will not show. Warning. - 'page_parent' => 'ultimatemember', // For a full list of options, visit: http://codex.wordpress.org/Function_Reference/add_submenu_page#Parameters - 'page_permissions' => 'manage_options', // Permissions needed to access the options panel. - 'menu_icon' => 'dashicons-admin-users', // Specify a custom URL to an icon - 'last_tab' => '', // Force your panel to always open to a specific tab (by id) - 'page_icon' => 'icon-themes', // Icon displayed in the admin panel next to your menu_title - 'page_slug' => 'um_options', // Page slug used to denote the panel - 'save_defaults' => true, // On load save the defaults to DB before user clicks save or not - 'default_show' => false, // If true, shows the default value next to each field that is not the default value. - 'default_mark' => '', // What to print by the field's title if the value shown is default. Suggested: * - 'show_import_export' => false, // Shows the Import/Export panel when not used as a field. - - 'transient_time' => 60 * MINUTE_IN_SECONDS, - 'output' => true, // Global shut-off for dynamic CSS output by the framework. Will also disable google fonts output - 'output_tag' => true, // Allows dynamic CSS to be generated for customizer and google fonts, but stops the dynamic CSS from going to the head - 'footer_credit' => ' ', // Disable the footer credit of Redux. Please leave if you can help it. - - ); - - // SOCIAL ICONS -> Setup custom links in the footer for quick links in your panel footer icons. - $this->args['share_icons'][] = array( - 'url' => 'https://github.com/ultimatemember/ultimatemember', - 'title' => 'GitHub Repository', - 'icon' => 'um-icon-social-github' - ); - $this->args['share_icons'][] = array( - 'url' => 'https://trello.com/b/30quaczv/ultimate-member', - 'title' => 'Roadmap', - 'icon' => 'um-faicon-trello' - ); - $this->args['share_icons'][] = array( - 'url' => 'https://facebook.com/pages/Ultimate-Member/1413909622233054', - 'title' => 'Like us on Facebook', - 'icon' => 'um-icon-social-facebook' - ); - $this->args['share_icons'][] = array( - 'url' => 'https://twitter.com/umplugin', - 'title' => 'Follow us on Twitter', - 'icon' => 'um-icon-social-twitter' - ); - $this->args['share_icons'][] = array( - 'url' => 'https://google.com/+ultimatemember', - 'title' => 'Follow us on Google+', - 'icon' => 'um-icon-social-googleplus' - ); - $this->args['share_icons'][] = array( - 'url' => 'https://youtube.com/user/umplugin', - 'title' => 'We\'re on YouTube', - 'icon' => 'um-icon-social-youtube' - ); - - } - - } - - global $reduxConfig; - $reduxConfig = new UM_Redux_Framework_Config(); - - } diff --git a/admin/core/um-admin-roles.php b/admin/core/um-admin-roles.php deleted file mode 100644 index 5f7aa447..00000000 --- a/admin/core/um-admin-roles.php +++ /dev/null @@ -1,86 +0,0 @@ -post_type != 'um_role' ) return $actions; - - if( $ultimatemember->query->is_core( $post->ID ) ){ - unset( $actions['trash'] ); - unset( $actions['inline hide-if-no-js'] ); - } - - return $actions; - } - /*** - *** @Custom columns for Role - ***/ - function manage_edit_um_role_columns($columns) { - - $admin = new UM_Admin_Metabox(); - - $new_columns['cb'] = ''; - $new_columns['title'] = __('Role Title','ultimate-member'); - $new_columns['count'] = __('No. of Members','ultimate-member') . $admin->_tooltip( __('The total number of members who have this role on your site','ultimate-member') ); - $new_columns['core'] = __('Core / Built-in','ultimate-member') . $admin->_tooltip( __('A core role is installed by default and may not be removed','ultimate-member') ); - $new_columns['has_wpadmin_perm'] = __('WP-Admin Access','ultimate-member') . $admin->_tooltip( __('Let you know If users of this role can view the WordPress backend or not','ultimate-member') ); - - return $new_columns; - - } - - /*** - *** @Display custom columns for Role - ***/ - function manage_um_role_posts_custom_column($column_name, $id) { - global $wpdb, $ultimatemember; - - switch ($column_name) { - - case 'has_wpadmin_perm': - if ( $ultimatemember->query->is_core( $id ) ) { - $role = $ultimatemember->query->is_core( $id ); - } else { - $post = get_post($id); - $role = $post->post_name; - } - $data = $ultimatemember->query->role_data($role); - if ( isset( $data['can_access_wpadmin'] ) && $data['can_access_wpadmin'] == 1 ){ - echo ''; - } else { - echo __('No','ultimate-member'); - } - break; - - case 'count': - if ( $ultimatemember->query->is_core( $id ) ) { - $role = $ultimatemember->query->is_core( $id ); - } else { - $post = get_post($id); - $role = $post->post_name; - } - echo $ultimatemember->query->count_users_by_role( $role ); - break; - - case 'core': - if ( $ultimatemember->query->is_core( $id ) ) { - echo ''; - } else { - echo '—'; - } - break; - - } - - } - -} diff --git a/admin/core/um-admin-upgrade.php b/admin/core/um-admin-upgrade.php deleted file mode 100644 index 46b212ea..00000000 --- a/admin/core/um-admin-upgrade.php +++ /dev/null @@ -1,31 +0,0 @@ -custom_role = 'um_role'; - - add_filter('manage_users_columns', array(&$this, 'manage_users_columns') ); - - add_action('manage_users_custom_column', array(&$this, 'manage_users_custom_column'), 10, 3); - - add_action('restrict_manage_users', array(&$this, 'restrict_manage_users') ); - - add_action('admin_init', array(&$this, 'um_bulk_users_edit'), 9); - - add_filter('views_users', array(&$this, 'views_users') ); - - add_filter('pre_user_query', array(&$this, 'sort_by_newest') ); - - add_filter('pre_user_query', array(&$this, 'custom_users_filter') ); - - add_filter('user_row_actions', array(&$this, 'user_row_actions'), 10, 2); - - } - - /*** - *** @Custom row actions for users page - ***/ - function user_row_actions($actions, $user_object) { - - $user_id = $user_object->ID; - um_fetch_user( $user_id ); - - $actions['frontend_profile'] = "" . __( 'View profile','ultimate-member') . ""; - - if ( um_user('submitted') ) { - $actions['view_info'] = '' . __('Info','ultimate-member') . ''; - } - - $actions = apply_filters('um_admin_user_row_actions', $actions, $user_id ); - - return $actions; - } - - /*** - *** @sort users by newest first - ***/ - function sort_by_newest( $query ){ - global $wpdb, $pagenow; - - if ( is_admin() && $pagenow == 'users.php' ) { - if (!isset($_REQUEST['orderby'])) { - $query->query_vars["order"] = 'desc'; - $query->query_orderby = " ORDER BY user_registered ".($query->query_vars["order"] == "desc" ? "desc " : "asc ");//set sort order - } - } - - return $query; - - } - - /*** - *** @custom users filter - ***/ - function custom_users_filter( $query ){ - global $wpdb, $pagenow; - - if ( is_admin() && $pagenow=='users.php' && isset($_GET[ $this->custom_role ]) && $_GET[ $this->custom_role ] != '') { - - $role = $_GET[ $this->custom_role ]; - $query->query_where = - str_replace('WHERE 1=1', - "WHERE 1=1 AND {$wpdb->users}.ID IN ( - SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta - WHERE {$wpdb->usermeta}.meta_key = 'role' - AND {$wpdb->usermeta}.meta_value = '{$role}')", - $query->query_where - ); - - } - - if ( is_admin() && $pagenow=='users.php' && isset($_GET[ 'status' ]) && $_GET[ 'status' ] != '') { - - $status = urldecode($_GET[ 'status' ]); - - if ( $status == 'needs-verification') { - $query->query_where = str_replace('WHERE 1=1', - "WHERE 1=1 AND {$wpdb->users}.ID IN ( - SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta - WHERE {$wpdb->usermeta}.meta_key = '_um_verified' - AND {$wpdb->usermeta}.meta_value = 'pending')", - $query->query_where - ); - } else { - $query->query_where = str_replace('WHERE 1=1', - "WHERE 1=1 AND {$wpdb->users}.ID IN ( - SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta - WHERE {$wpdb->usermeta}.meta_key = 'account_status' - AND {$wpdb->usermeta}.meta_value = '{$status}')", - $query->query_where - ); - } - - } - - return $query; - - } - - /*** - *** @Change the roles with UM roles - ***/ - function views_users( $views ) { - global $ultimatemember, $query; - - remove_filter('pre_user_query', array(&$this, 'custom_users_filter') ); - - $old_views = $views; - $views = array(); - - if ( !isset($_REQUEST[ $this->custom_role ]) && !isset($_REQUEST['status']) ) { - $views['all'] = 'All ('.$ultimatemember->query->count_users().')'; - } else { - $views['all'] = 'All ('.$ultimatemember->query->count_users().')'; - } - - $status = array( - 'approved' => __('Approved','ultimate-member'), - 'awaiting_admin_review' => __('Pending review','ultimate-member'), - 'awaiting_email_confirmation' => __('Waiting e-mail confirmation','ultimate-member'), - 'inactive' => __('Inactive','ultimate-member'), - 'rejected' => __('Rejected','ultimate-member') - ); - - $ultimatemember->query->count_users_by_status( 'unassigned' ); - - foreach( $status as $k => $v ) { - if ( isset($_REQUEST['status']) && $_REQUEST['status'] == $k ) { - $current = 'class="current"'; - } else { - $current = ''; - } - - $views[ $k ] = ''. $v . ' ('.$ultimatemember->query->count_users_by_status( $k ).')'; - } - - $views = apply_filters('um_admin_views_users', $views ); - - // remove all filters - unset($old_views['all']); - - // add separator - $views['subsep'] = ''; - - // merge views - foreach( $old_views as $key => $view ) { - $views[ $key ] = $view; - } - - return $views; - } - - /*** - *** @Bulk user editing actions - ***/ - function um_bulk_users_edit(){ - global $ultimatemember; - - $admin_err = 0; - - if (isset($_REQUEST) && !empty ($_REQUEST) ){ - - // bulk change role - if (isset($_REQUEST['users']) && is_array($_REQUEST['users']) && isset($_REQUEST['um_changeit']) && $_REQUEST['um_changeit'] != '' && isset($_REQUEST['um_change_role']) && !empty($_REQUEST['um_change_role']) ){ - - if ( ! current_user_can( 'edit_users' ) ) - wp_die( __( 'You do not have enough permissions to do that.','ultimate-member') ); - - check_admin_referer('bulk-users'); - - $users = $_REQUEST['users']; - $new_role = current( array_filter( $_REQUEST['um_change_role'] ) ); - - foreach($users as $user_id){ - $ultimatemember->user->set( $user_id ); - // change role for non-wp admins or non-community admins only - if ( current_user_can('manage_options') || ( !um_user('super_admin') || um_user('role') != 'admin' ) ) { - $ultimatemember->user->set_role( $new_role ); - } else { - $admin_err = 1; - } - } - - if ( $admin_err == 0 ){ - - $uri = admin_url('users.php'); - - $uri = $this->set_redirect_uri( $uri ); - - $uri = add_query_arg( 'update', 'users_role_updated', $uri ); - - wp_redirect( $uri ); - - exit; - - } else { - - $uri = admin_url('users.php'); - - $uri = $this->set_redirect_uri( $uri ); - - $uri = add_query_arg( 'update', 'err_admin_role', $uri ); - - wp_redirect( $uri ); - - exit; - } - - } else if ( isset($_REQUEST['um_changeit']) && $_REQUEST['um_changeit'] != '' ) { - - $uri = admin_url('users.php'); - - $uri = $this->set_redirect_uri( $uri ); - - wp_redirect( $uri ); - - exit; - - } - - // bulk edit users - if ( isset($_REQUEST['users']) && is_array($_REQUEST['users']) && isset($_REQUEST['um_bulkedit']) && $_REQUEST['um_bulkedit'] != '' && isset($_REQUEST['um_bulk_action']) && !empty($_REQUEST['um_bulk_action']) ){ - - if ( ! current_user_can( 'edit_users' ) ) - wp_die( __( 'You do not have enough permissions to do that.','ultimate-member') ); - - check_admin_referer('bulk-users'); - - $users = $_REQUEST['users']; - $bulk_action = current( array_filter( $_REQUEST['um_bulk_action']) ); - - foreach($users as $user_id){ - $ultimatemember->user->set( $user_id ); - if ( !um_user('super_admin') ) { - - do_action("um_admin_user_action_hook", $bulk_action); - - do_action("um_admin_user_action_{$bulk_action}_hook"); - - } else { - $admin_err = 1; - } - } - - // Finished. redirect now - if ( $admin_err == 0 ){ - - $uri = admin_url('users.php'); - - $uri = $this->set_redirect_uri( $uri ); - - $uri = add_query_arg( 'update', 'users_updated', $uri ); - - wp_redirect( $uri ); - - exit; - } else { - wp_redirect( admin_url('users.php?update=err_users_updated') ); - exit; - } - - } else if ( isset($_REQUEST['um_bulkedit']) && $_REQUEST['um_bulkedit'] != '' ) { - - $uri = admin_url('users.php'); - - $uri = $this->set_redirect_uri( $uri ); - - wp_redirect( $uri ); - - exit; - - } - - // filter by user role - if ( isset($_REQUEST['um_filter_role']) && ! isset( $_REQUEST['um_filter_processed'] ) && ( ! isset( $_REQUEST['new_role'] ) || empty( $_REQUEST['new_role'] ) ) && $_REQUEST['um_filter_role'] ) { - $filter_role = current( array_filter( $_REQUEST['um_filter_role'] ) ); - $uri = add_query_arg('um_role',$filter_role); - $uri = add_query_arg('s',$_REQUEST['s'], $uri); - $uri = add_query_arg('um_filter_processed',true, $uri); - - exit( wp_redirect( $uri ) ); - } - - } - } - - /*** - *** @Add UM roles to users admin - ***/ - function restrict_manage_users() { - global $ultimatemember; - ?> - -
    - - - - - - -
    - -
    - - - - - - -
    - -
    - - - - - - -
    - - - - - - _tooltip( __('This is the membership role set by Ultimate Member plugin','ultimate-member') ); - - return $columns; - } - - /*** - *** @show user columns - ***/ - function manage_users_custom_column($value, $column_name, $user_id) { - global $ultimatemember; - - if ( $this->custom_role == $column_name ) { - - if ( get_option( "um_cache_userdata_{$user_id}" ) ) { - delete_option( "um_cache_userdata_{$user_id}" ); - } - um_fetch_user( $user_id ); - return $ultimatemember->user->get_role_name( um_user('role') ); - - } - - return $value; - } - - /** - * Sets redirect URI - * @param string $uri - */ - function set_redirect_uri( $uri ){ - - if( isset( $_REQUEST['s'] ) && ! empty( $_REQUEST['s'] ) ){ - $uri = add_query_arg( 's', $_REQUEST['s'], $uri ); - } - - if( isset( $_REQUEST['status'] ) && ! empty( $_REQUEST['status'] ) ){ - $uri = add_query_arg( 'status', $_REQUEST['status'], $uri ); - } - - if( isset( $_REQUEST['um_filter_role'] ) && ! empty( $_REQUEST['um_filter_role'] ) ){ - foreach ( $_REQUEST['um_filter_role'] as $key => $value) { - $uri = add_query_arg( 'um_filter_role', $value, $uri ); - } - } - - return $uri; - - } - -} diff --git a/admin/index.php b/admin/index.php deleted file mode 100644 index caf65b81..00000000 --- a/admin/index.php +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/admin/templates/access/settings.php b/admin/templates/access/settings.php deleted file mode 100644 index f22b2ef4..00000000 --- a/admin/templates/access/settings.php +++ /dev/null @@ -1,72 +0,0 @@ - - -

    tooltip( __('Switch to yes to override global access settings','ultimate-member'), 'e'); ?>

    - -

    - ui_on_off('_um_custom_access_settings', 0, true, 1, '_um_custom_access_settings', 'xxx'); ?> -

    - -
    - -

    tooltip( __('Who can access this content?','ultimate-member'), 'e'); ?>

    - -

    - - ID, '_um_accessible', true); ?> - -
    -
    - - - - -

    - -
    - -

    tooltip( __('This is the URL that user is redirected to If he is not permitted to view this content','ultimate-member'), 'e'); ?>

    - -

    - - ID, '_um_access_redirect2', true); ?> - - - -

    - -
    - -
    - -

    tooltip( __('If you do not select any role, all members will be able to view this content','ultimate-member'), 'e'); ?>

    - -

    - - ID, '_um_access_roles', true); ?> - - - query->get_roles() as $role_id => $role) { ?> -
    - - -

    - -

    tooltip( __('This is the URL that user is redirected to If he is not permitted to view this content','ultimate-member'), 'e'); ?>

    - -

    - - ID, '_um_access_redirect', true); ?> - - - -

    - -
    - -
    diff --git a/admin/templates/directory/appearance.php b/admin/templates/directory/appearance.php deleted file mode 100644 index cb1ef62d..00000000 --- a/admin/templates/directory/appearance.php +++ /dev/null @@ -1,15 +0,0 @@ -
    - -

    - -

    - -
    \ No newline at end of file diff --git a/admin/templates/directory/general.php b/admin/templates/directory/general.php deleted file mode 100644 index d4fe45e7..00000000 --- a/admin/templates/directory/general.php +++ /dev/null @@ -1,97 +0,0 @@ - $v ) { - if ( strstr( $k, '_um_' ) && !is_array( $v[0] ) ) { - //print "'$k' => '" . $v[0] . "',
    "; - } - } - - $show_these_users = get_post_meta( get_the_ID(), '_um_show_these_users', true ); - if ( $show_these_users ) { - $show_these_users = implode("\n", str_replace("\r", "", $show_these_users)); - } - -?> - -
    - -
    - - - -

    - - - - - - -

    - -

    - - - - ui_on_off('_um_has_profile_photo'); ?> - - -

    - -

    - - - - ui_on_off('_um_has_cover_photo'); ?> - - -

    - -

    - - - - - - -

    - -

    - - - - - - -

    - -

    - - - - - - -

    - - - -
    - -
    - -
    diff --git a/admin/templates/directory/pagination.php b/admin/templates/directory/pagination.php deleted file mode 100644 index f4b00960..00000000 --- a/admin/templates/directory/pagination.php +++ /dev/null @@ -1,36 +0,0 @@ -
    - -
    - -

    - - - - - - -

    - -

    - - - - - - -

    - -

    - - - - - - -

    - -
    - -
    - -
    \ No newline at end of file diff --git a/admin/templates/directory/profile.php b/admin/templates/directory/profile.php deleted file mode 100644 index 5c85d8d9..00000000 --- a/admin/templates/directory/profile.php +++ /dev/null @@ -1,168 +0,0 @@ -
    - -
    - -

    - - - - ui_on_off('_um_profile_photo', 1); ?> - - -

    - -

    - - - - ui_on_off('_um_cover_photos', 1); ?> - - -

    - -

    - - - - ui_on_off('_um_show_name', 1, true, 1, 'name-options', 'xxx'); ?> - - -

    - -

    - - - - ui_on_off('_um_show_tagline', 0, true, 1, 'tagline-options', 'xxx'); ?> - - -

    - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    - -

    - - - - ui_on_off('_um_show_userinfo', 0, true, 1, 'reveal-options', 'xxx'); ?> - - -

    - -

    - - - - ui_on_off('_um_userinfo_animate', 1); ?> - - -

    - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    - -

    - - - - ui_on_off('_um_show_social', 0); ?> - - -

    - -
    - -
    - -
    \ No newline at end of file diff --git a/admin/templates/directory/profile_card.php b/admin/templates/directory/profile_card.php deleted file mode 100644 index b12d5142..00000000 --- a/admin/templates/directory/profile_card.php +++ /dev/null @@ -1,23 +0,0 @@ -
    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -
    \ No newline at end of file diff --git a/admin/templates/directory/search.php b/admin/templates/directory/search.php deleted file mode 100644 index ecd45795..00000000 --- a/admin/templates/directory/search.php +++ /dev/null @@ -1,119 +0,0 @@ -
    - -
    - -

    - - - - ui_on_off('_um_search', 0, true, 1, 'search-options', 'xxx'); ?> - - -

    - -

    - - - - ui_on_off('_um_must_search', 0); ?> - - -

    - -

    - - - - - - -

    - -

    - - - builtin->all_user_fields('date,time,url'); - $searchable_fields = $searchable_fields + $custom_search; - - $meta_test = get_post_meta( get_the_ID(), '_um_search_fields', true ); - $i = 0; - if ( is_array( $meta_test ) ) { - foreach( $meta_test as $val ) { $i++; - ?> - - - - - - - - - - - - - - - - - - - - - - - - - -

    - -

    - - - - - - -

    - -

    - - - - - - -

    - -

    - - - - - - -

    - -
    - -
    - -
    \ No newline at end of file diff --git a/admin/templates/directory/shortcode.php b/admin/templates/directory/shortcode.php deleted file mode 100644 index 29fa23da..00000000 --- a/admin/templates/directory/shortcode.php +++ /dev/null @@ -1,5 +0,0 @@ -
    - -

    shortcodes->get_shortcode( get_the_ID() ); ?>

    - -
    \ No newline at end of file diff --git a/admin/templates/extensions.php b/admin/templates/extensions.php deleted file mode 100644 index d1d16656..00000000 --- a/admin/templates/extensions.php +++ /dev/null @@ -1,195 +0,0 @@ - 'https://ultimatemember.com/extensions/bbpress/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/bbpress.png', - 'name' => 'bbPress', - 'desc' => 'With the bbPress extension you can integrate Ultimate Member with bbPress', -); -$premium['profile-completeness'] = array( - 'url' => 'https://ultimatemember.com/extensions/profile-completeness/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/profile-completeness.png', - 'name' => 'Profile Completeness', - 'desc' => 'Encourage or force users to complete their profile on your site', -); -$premium['verified-users'] = array( - 'url' => 'https://ultimatemember.com/extensions/verified-users/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/verified-users.png', - 'name' => 'Verified Users', - 'desc' => 'Add a user verficiation system to your site so user accounts can be verified', -); -$premium['friends'] = array( - 'url' => 'https://ultimatemember.com/extensions/friends/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/friends.png', - 'name' => 'Friends', - 'desc' => 'Increase user interaction on your site by allowing users to become friends', -); -$premium['woocommerce'] = array( - 'url' => 'https://ultimatemember.com/extensions/woocommerce/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/woocommerce.png', - 'name' => 'WooCommerce', - 'desc' => 'Integrates the popular e-commerce plugin WooCommerce with Ultimate Member', -); -$premium['notices'] = array( - 'url' => 'https://ultimatemember.com/extensions/notices/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/notices.png', - 'name' => 'Notices', - 'desc' => 'Alert users to important information using conditional notices', -); -$premium['followers'] = array( - 'url' => 'https://ultimatemember.com/extensions/followers/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/follow.png', - 'name' => 'Followers', - 'desc' => 'Increase user interaction on your site by allowing users to follow each other', -); -$premium['mycred'] = array( - 'url' => 'https://ultimatemember.com/extensions/mycred/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/mycred.png', - 'name' => 'myCRED', - 'desc' => 'With the myCRED extension you can integrate Ultimate Member with myCRED', -); -$premium['private-messages'] = array( - 'url' => 'https://ultimatemember.com/extensions/private-messages/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/private-messages.png', - 'name' => 'Private Messages', - 'desc' => 'Add a private messaging system to your site & allow users to message each other', -); -$premium['social-activity'] = array( - 'url' => 'https://ultimatemember.com/extensions/social-activity/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/social-activity.png', - 'name' => 'Social Activity', - 'desc' => 'Let users create public wall posts & see the activity of other users', -); -$premium['social-login'] = array( - 'url' => 'https://ultimatemember.com/extensions/social-login/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/social-login.png', - 'name' => 'Social Login', - 'desc' => 'Let users register & login to your site via Facebook, Twitter, G+, LinkedIn, and more', -); -$premium['instagram'] = array( - 'url' => 'https://ultimatemember.com/extensions/instagram/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/instagram.png', - 'name' => 'Instagram', - 'desc' => 'Allow users to show their Instagram photos on their profile', -); -$premium['user-tags'] = array( - 'url' => 'https://ultimatemember.com/extensions/user-tags/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/usertags.png', - 'name' => 'User Tags', - 'desc' => 'With this extension you can add a user tag system to your website', -); -$premium['mailchimp'] = array( - 'url' => 'https://ultimatemember.com/extensions/mailchimp/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/mailchimp.png', - 'name' => 'MailChimp', - 'desc' => 'Allow users to subscribe to your mailchimp lists when they signup on your site', -); -$premium['user-reviews'] = array( - 'url' => 'https://ultimatemember.com/extensions/user-reviews/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/user-reviews.png', - 'name' => 'User Reviews', - 'desc' => 'Allow users to rate & review each other using a 5 star rate/review system', -); -$premium['real-time-notifications'] = array( - 'url' => 'https://ultimatemember.com/extensions/real-time-notifications/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/notifications.png', - 'name' => 'Real-time Notifications', - 'desc' => 'Add a notifications system to your site so users can receive real-time notifications', -); - -$free['online-users'] = array( - 'url' => 'https://ultimatemember.com/extensions/online-users/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/07/Online-Users.png', - 'name' => 'Online Users', - 'desc' => 'Display online users on your site so users can see who is online' -); - -$free['google-recaptcha'] = array( - 'url' => 'https://ultimatemember.com/extensions/google-recaptcha/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/07/google.png', - 'name' => 'Google reCAPTCHA', - 'desc' => 'Stop bots on your registration & login forms with Google reCAPTCHA', -); -$free['terms-conditions'] = array( - 'url' => 'https://ultimatemember.com/extensions/terms-conditions/', - 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/07/terms-conditions.png', - 'name' => 'Terms & Conditions', - 'desc' => 'Add terms & conditions to your registration form', -); - -?> - -
    - -

    Ultimate Member - Extensions

    - -
    -
    Core Extensions Bundle – Check out our extensions bundle which includes all extensions at a significant discount.
    - -
    - -
    - -
    - -
    -
    - - - - $info ) { ?> - -
    - -
    -

    - -
    - -
    - - -
    -
    - - - - - - $info ) { ?> - -
    - -
    -

    - -
    - -
    - - -
    -
    - - - -
    -
    - -
    \ No newline at end of file diff --git a/admin/templates/form/login_css.php b/admin/templates/form/login_css.php deleted file mode 100644 index 93c26dd5..00000000 --- a/admin/templates/form/login_css.php +++ /dev/null @@ -1,8 +0,0 @@ -
    - -

    - - -

    - -
    \ No newline at end of file diff --git a/admin/templates/form/login_customize.php b/admin/templates/form/login_customize.php deleted file mode 100644 index 1a8ba5f3..00000000 --- a/admin/templates/form/login_customize.php +++ /dev/null @@ -1,111 +0,0 @@ -
    - -

    - - - - ui_on_off('_um_login_use_globals', 1, true, 1, 'xxx', 'login-customize'); ?> - - -

    - - - -
    \ No newline at end of file diff --git a/admin/templates/form/login_settings.php b/admin/templates/form/login_settings.php deleted file mode 100644 index 118ff32c..00000000 --- a/admin/templates/form/login_settings.php +++ /dev/null @@ -1,20 +0,0 @@ -
    - -

    - -

    - - - -
    \ No newline at end of file diff --git a/admin/templates/form/profile_css.php b/admin/templates/form/profile_css.php deleted file mode 100644 index be8fcf1a..00000000 --- a/admin/templates/form/profile_css.php +++ /dev/null @@ -1,8 +0,0 @@ -
    - -

    - - -

    - -
    \ No newline at end of file diff --git a/admin/templates/form/profile_customize.php b/admin/templates/form/profile_customize.php deleted file mode 100644 index 67bdc73d..00000000 --- a/admin/templates/form/profile_customize.php +++ /dev/null @@ -1,208 +0,0 @@ -
    - -

    - - - - ui_on_off('_um_profile_use_globals', 1, true, 1, 'xxx', 'profile-customize'); ?> - - -

    - -
    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - - - - ui_on_off('_um_profile_secondary_btn', um_get_option('profile_secondary_btn'), true, 1, 'profile-secondary-btn', 'xxx'); ?> - - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - - - ui_on_off('_um_profile_cover_enabled', um_get_option('profile_cover_enabled') , true, 1, 'cover-photo-opts', 'xxx'); ?> - - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - - - ui_on_off('_um_profile_photo_required'); ?> - - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - - - - ui_on_off('_um_profile_show_name', 1 ); ?> - - -

    - -

    - - - - ui_on_off('_um_profile_show_social_links', 0 ); ?> - - -

    - -

    - - - - ui_on_off('_um_profile_show_bio', 1 ); ?> - - -

    - -
    - -
    \ No newline at end of file diff --git a/admin/templates/form/profile_settings.php b/admin/templates/form/profile_settings.php deleted file mode 100644 index 21ce448a..00000000 --- a/admin/templates/form/profile_settings.php +++ /dev/null @@ -1,51 +0,0 @@ -
    - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    - -
    \ No newline at end of file diff --git a/admin/templates/form/register_css.php b/admin/templates/form/register_css.php deleted file mode 100644 index d0099b6a..00000000 --- a/admin/templates/form/register_css.php +++ /dev/null @@ -1,8 +0,0 @@ -
    - -

    - - -

    - -
    \ No newline at end of file diff --git a/admin/templates/form/register_customize.php b/admin/templates/form/register_customize.php deleted file mode 100644 index 9325d2c1..00000000 --- a/admin/templates/form/register_customize.php +++ /dev/null @@ -1,105 +0,0 @@ -
    - -

    - - - - ui_on_off('_um_register_use_globals', 1, true, 1, 'xxx', 'register-customize'); ?> - - -

    - -
    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - - - - ui_on_off('_um_register_secondary_btn', um_get_option('register_secondary_btn'), true, 1, 'register-secondary-btn', 'xxx'); ?> - - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -

    - -
    - -
    \ No newline at end of file diff --git a/admin/templates/form/shortcode.php b/admin/templates/form/shortcode.php deleted file mode 100644 index 29fa23da..00000000 --- a/admin/templates/form/shortcode.php +++ /dev/null @@ -1,5 +0,0 @@ -
    - -

    shortcodes->get_shortcode( get_the_ID() ); ?>

    - -
    \ No newline at end of file diff --git a/admin/templates/role/admin.php b/admin/templates/role/admin.php deleted file mode 100644 index e7789e62..00000000 --- a/admin/templates/role/admin.php +++ /dev/null @@ -1,65 +0,0 @@ -
    - -
    - - query->has_post_meta('_um_core', 'admin' ) ) { ?> -

    - - ui_on_off('_um_can_access_wpadmin', 1); ?> -

    -

    - - ui_on_off('_um_can_not_see_adminbar', 0); ?> -

    - -

    - - ui_on_off('_um_can_access_wpadmin', 0); ?> -

    -

    - - ui_on_off('_um_can_not_see_adminbar', 1); ?> -

    - - -

    - - ui_on_off('_um_can_edit_everyone', 0, true, 1, 'edit-roles', 'xxx'); ?> -

    - -

    - - - - - - -

    - -

    - - ui_on_off('_um_can_delete_everyone', 0, true, 1, 'delete-roles', 'xxx'); ?> -

    - -

    - - - - - - -

    - -
    - -
    - -
    \ No newline at end of file diff --git a/admin/templates/role/delete.php b/admin/templates/role/delete.php deleted file mode 100644 index 4ceb7381..00000000 --- a/admin/templates/role/delete.php +++ /dev/null @@ -1,30 +0,0 @@ -
    - -
    - -

    - - - - - - -

    - -

    - - - - - - -

    - -
    - -
    - -
    \ No newline at end of file diff --git a/admin/templates/role/general.php b/admin/templates/role/general.php deleted file mode 100644 index 07de7117..00000000 --- a/admin/templates/role/general.php +++ /dev/null @@ -1,19 +0,0 @@ -
    - -
    - -

    - - ui_on_off('_um_can_edit_profile', 1); ?> -

    - -

    - - ui_on_off('_um_can_delete_profile', 1); ?> -

    - -
    - -
    - -
    \ No newline at end of file diff --git a/admin/templates/role/home.php b/admin/templates/role/home.php deleted file mode 100644 index 75b0ec25..00000000 --- a/admin/templates/role/home.php +++ /dev/null @@ -1,27 +0,0 @@ -
    - -
    - -

    - - - - ui_on_off('_um_default_homepage', 1, true, 1, 'xxx', 'redirect-home-url'); ?> - - -

    - -

    - - - - - - -

    - -
    - -
    - -
    \ No newline at end of file diff --git a/admin/templates/role/login.php b/admin/templates/role/login.php deleted file mode 100644 index 3d88ffc8..00000000 --- a/admin/templates/role/login.php +++ /dev/null @@ -1,32 +0,0 @@ -
    - -
    - -

    - - - - - - -

    - -
    - -
    - -
    - -
    \ No newline at end of file diff --git a/admin/templates/role/logout.php b/admin/templates/role/logout.php deleted file mode 100644 index 13379d93..00000000 --- a/admin/templates/role/logout.php +++ /dev/null @@ -1,30 +0,0 @@ -
    - -
    - -

    - - - - - - -

    - -

    - - - - - - -

    - -
    - -
    - -
    \ No newline at end of file diff --git a/admin/templates/role/profile.php b/admin/templates/role/profile.php deleted file mode 100644 index ceb0b171..00000000 --- a/admin/templates/role/profile.php +++ /dev/null @@ -1,37 +0,0 @@ -
    - -
    - -

    - - ui_on_off('_um_can_view_all', 1, true, 1, 'view-roles', 'xxx'); ?> -

    - -

    - - - - - - -

    - -

    - - ui_on_off('_um_can_make_private_profile'); ?> -

    - -

    - - ui_on_off('_um_can_access_private_profile'); ?> -

    - -
    - -
    - -
    \ No newline at end of file diff --git a/admin/templates/role/register.php b/admin/templates/role/register.php deleted file mode 100644 index 4b034eee..00000000 --- a/admin/templates/role/register.php +++ /dev/null @@ -1,148 +0,0 @@ -
    - -
    - -

    - - - - - - -

    - - - -
    -

    - - - - - - -

    - -

    - - - - - - -

    -
    - - - - - -
    - -

    - - - - ui_on_off('_um_login_email_activate', 0); ?> - - -

    - -

    - - - - - - -

    - -

    - - - - - - -

    - -

    - - - - - - -

    - -

    - - - - - - -

    - -
    - - - - - -
    -

    - - - - - - -

    - -

    - - - - - - -

    - -

    - - - - - - -

    -
    - - - -
    - -
    - -
    diff --git a/admin/templates/role/sync.php b/admin/templates/role/sync.php deleted file mode 100644 index 81144fe8..00000000 --- a/admin/templates/role/sync.php +++ /dev/null @@ -1,34 +0,0 @@ -permalinks->get_current_url() ); -$post = get_post( get_the_ID() ); -$slug = $post->post_name; -$url = add_query_arg('um_role', $slug, $url); -$url = add_query_arg('wp_role', $saved_r, $url); - -?> - -
    - -
    - -

    - - - - -

    - -

    - -
    - -
    - -
    \ No newline at end of file diff --git a/admin/templates/welcome/about_footer.php b/admin/templates/welcome/about_footer.php deleted file mode 100644 index 66764aa1..00000000 --- a/admin/templates/welcome/about_footer.php +++ /dev/null @@ -1,14 +0,0 @@ - -
    - - Go to Plugin Dashboard → - -
    - - args['share_icons'] as $k => $arr ) { ?> - -
    - -
    - -
    \ No newline at end of file diff --git a/admin/um-admin-init.php b/admin/um-admin-init.php deleted file mode 100644 index a76e8fe2..00000000 --- a/admin/um-admin-init.php +++ /dev/null @@ -1,77 +0,0 @@ -columns = new UM_Admin_Columns(); - $this->styles = new UM_Admin_Enqueue(); - $this->functions = new UM_Admin_Functions(); - $this->metabox = new UM_Admin_Metabox(); - $this->notices = new UM_Admin_Notices(); - $this->users = new UM_Admin_Users(); - $this->roles = new UM_Admin_Roles(); - $this->access = new UM_Admin_Access(); - $this->builder = new UM_Admin_Builder(); - $this->dragdrop = new UM_Admin_DragDrop(); - - if ( is_admin() && - current_user_can('manage_options') && - isset($_REQUEST['um_adm_action']) && - $_REQUEST['um_adm_action'] != '' - ) - { - do_action("um_admin_do_action__", $_REQUEST['um_adm_action'] ); - do_action("um_admin_do_action__{$_REQUEST['um_adm_action']}", $_REQUEST['um_adm_action'] ); - } - - } - -} - -$um_admin = new UM_Admin_API(); \ No newline at end of file diff --git a/assets/css/um-old-default.css b/assets/css/um-old-default.css new file mode 100644 index 00000000..fb83a822 --- /dev/null +++ b/assets/css/um-old-default.css @@ -0,0 +1,253 @@ +.um .um-tip:hover, +.um .um-field-radio.active:not(.um-field-radio-state-disabled) i, +.um .um-field-checkbox.active:not(.um-field-radio-state-disabled) i, +.um .um-member-name a:hover, +.um .um-member-more a:hover, +.um .um-member-less a:hover, +.um .um-members-pagi a:hover, +.um .um-cover-add:hover, +.um .um-profile-subnav a.active, +.um .um-item-meta a, +.um-account-name a:hover, +.um-account-nav a.current, +.um-account-side li a.current span.um-account-icon, +.um-account-side li a.current:hover span.um-account-icon, +.um-dropdown li a:hover, +i.um-active-color, +span.um-active-color +{ + color: #3ba1da; +} + +.um .um-field-group-head, +.picker__box, +.picker__nav--prev:hover, +.picker__nav--next:hover, +.um .um-members-pagi span.current, +.um .um-members-pagi span.current:hover, +.um .um-profile-nav-item.active a, +.um .um-profile-nav-item.active a:hover, +.upload, +.um-modal-header, +.um-modal-btn, +.um-modal-btn.disabled, +.um-modal-btn.disabled:hover, +div.uimob800 .um-account-side li a.current, +div.uimob800 .um-account-side li a.current:hover +{ + background: #3ba1da; +} + +.um .um-field-group-head:hover, +.picker__footer, +.picker__header, +.picker__day--infocus:hover, +.picker__day--outfocus:hover, +.picker__day--highlighted:hover, +.picker--focused .picker__day--highlighted, +.picker__list-item:hover, +.picker__list-item--highlighted:hover, +.picker--focused .picker__list-item--highlighted, +.picker__list-item--selected, +.picker__list-item--selected:hover, +.picker--focused .picker__list-item--selected { + background: #44b0ec; +} + +.um { + margin-left: auto!important; + margin-right: auto!important; +} +.um input[type=submit]:disabled:hover { + background: #3ba1da; +} + +.um input[type=submit].um-button, +.um input[type=submit].um-button:focus, +.um a.um-button, +.um a.um-button.um-disabled:hover, +.um a.um-button.um-disabled:focus, +.um a.um-button.um-disabled:active { + background: #3ba1da; +} + +.um a.um-link { + color: #3ba1da; +} + +.um input[type=submit].um-button:hover, +.um a.um-button:hover { + background-color: #44b0ec; +} + +.um a.um-link:hover, +.um a.um-link-hvr:hover { + color: #44b0ec; +} + +.um .um-button { + color: #ffffff; +} + +.um .um-button.um-alt, +.um input[type=submit].um-button.um-alt { + background: #eeeeee; +} + +.um .um-button.um-alt:hover, +.um input[type=submit].um-button.um-alt:hover{ + background: #e5e5e5; +} + +.um .um-button.um-alt, +.um input[type=submit].um-button.um-alt { + color: #666666; +} + +.um .um-tip { + color: #cccccc; +} + +.um .um-field-label { + color: #555555; +} + +.um .um-form input[type=text], +.um .um-form input[type=tel], +.um .um-form input[type=number], +.um .um-form input[type=password], +.um .um-form textarea, +.um .upload-progress, +.select2-container .select2-choice, +.select2-drop, +.select2-container-multi .select2-choices, +.select2-drop-active, +.select2-drop.select2-drop-above +{ + border: 2px solid #ddd !important; +} + +.um .um-form .select2-container-multi .select2-choices .select2-search-field input[type=text] { + border: none !important +} + +.um .um-form input[type=text]:focus, +.um .um-form input[type=tel]:focus, +.um .um-form input[type=number]:focus, +.um .um-form input[type=password]:focus, +.um .um-form .um-datepicker.picker__input.picker__input--active, +.um .um-form .um-datepicker.picker__input.picker__input--target, +.um .um-form textarea:focus { + border: 2px solid #bbb !important; +} + +.um .um-form input[type=text], +.um .um-form input[type=tel], +.um .um-form input[type=number], +.um .um-form input[type=password], +.um .um-form textarea, +.select2-container .select2-choice, +.select2-container-multi .select2-choices +{ + background-color: #ffffff; +} + +.um .um-form input[type=text]:focus, +.um .um-form input[type=tel]:focus, +.um .um-form input[type=number]:focus, +.um .um-form input[type=password]:focus, +.um .um-form textarea:focus { + background-color: #ffffff; +} + +.um .um-form input[type=text], +.um .um-form input[type=tel], +.um .um-form input[type=password], +.um .um-form textarea +{ + color: #666666; +} + +.um .um-form input:-webkit-autofill { + -webkit-box-shadow:0 0 0 50px white inset; /* Change the color to your own background color */ + -webkit-text-fill-color: #666666; +} + +.um .um-form input:-webkit-autofill:focus { + -webkit-box-shadow: none,0 0 0 50px white inset; + -webkit-text-fill-color: #666666; +} + +.um .um-form ::-webkit-input-placeholder +{ + color: #aaaaaa; + opacity: 1 !important; +} + +.um .um-form ::-moz-placeholder +{ + color: #aaaaaa; + opacity: 1 !important; +} + +.um .um-form ::-moz-placeholder +{ + color: #aaaaaa; + opacity: 1 !important; +} + +.um .um-form ::-ms-input-placeholder +{ + color: #aaaaaa; + opacity: 1 !important; +} + +.select2-default, +.select2-default *, +.select2-container-multi .select2-choices .select2-search-field input +{ + color: #aaaaaa; +} + +.um .um-field-icon i, +.select2-container .select2-choice .select2-arrow:before, +.select2-search:before, +.select2-search-choice-close:before +{ + color: #aaaaaa; +} + +.um span.um-req +{ + color: #aaaaaa; +} + +.um .um-profile-photo a.um-profile-photo-img, +.um .um-profile-photo img, +.um .um-profile-photo span.um-profile-photo-overlay +{ + -moz-border-radius: 999px !important; + -webkit-border-radius: 999px !important; + border-radius: 999px !important +} + +.um-profile.um .um-profile-meta { + color: #999999; +} + +.um-profile.um .um-name a { + color: #555555; +} + +.um-profile.um .um-name a:hover { + color: #444444; +} + +.um-profile.um .um-profile-headericon a { + color: #aaaaaa; +} + +.um-profile.um .um-profile-headericon a:hover, +.um-profile.um .um-profile-edit-a.active { + color: #3ba1da; +} \ No newline at end of file diff --git a/assets/dynamic_css/dynamic_global.php b/assets/dynamic_css/dynamic_global.php index 1a3561fe..5ce9969d 100644 --- a/assets/dynamic_css/dynamic_global.php +++ b/assets/dynamic_css/dynamic_global.php @@ -7,302 +7,5 @@ print ".um-$form_id.um { }"; } -if ( $active_color ) { -print " - -.um-$form_id.um .um-tip:hover, -.um-$form_id.um .um-field-radio.active:not(.um-field-radio-state-disabled) i, -.um-$form_id.um .um-field-checkbox.active:not(.um-field-radio-state-disabled) i, -.um-$form_id.um .um-member-name a:hover, -.um-$form_id.um .um-member-more a:hover, -.um-$form_id.um .um-member-less a:hover, -.um-$form_id.um .um-members-pagi a:hover, -.um-$form_id.um .um-cover-add:hover, -.um-$form_id.um .um-profile-subnav a.active, -.um-$form_id.um .um-item-meta a, -.um-account-name a:hover, -.um-account-nav a.current, -.um-account-side li a.current span.um-account-icon, -.um-account-side li a.current:hover span.um-account-icon, -.um-dropdown li a:hover, -i.um-active-color, -span.um-active-color -{ - color: $active_color; -} - -.um-$form_id.um .um-field-group-head, -.picker__box, -.picker__nav--prev:hover, -.picker__nav--next:hover, -.um-$form_id.um .um-members-pagi span.current, -.um-$form_id.um .um-members-pagi span.current:hover, -.um-$form_id.um .um-profile-nav-item.active a, -.um-$form_id.um .um-profile-nav-item.active a:hover, -.upload, -.um-modal-header, -.um-modal-btn, -.um-modal-btn.disabled, -.um-modal-btn.disabled:hover, -div.uimob800 .um-account-side li a.current,div.uimob800 .um-account-side li a.current:hover -{ - background: $active_color; -} - -"; -} - -if ( $secondary_color ) { -print " - -.um-$form_id.um .um-field-group-head:hover, -.picker__footer, -.picker__header, -.picker__day--infocus:hover, -.picker__day--outfocus:hover, -.picker__day--highlighted:hover, -.picker--focused .picker__day--highlighted, -.picker__list-item:hover, -.picker__list-item--highlighted:hover, -.picker--focused .picker__list-item--highlighted, -.picker__list-item--selected, -.picker__list-item--selected:hover, -.picker--focused .picker__list-item--selected { - background: $secondary_color; -} - -"; -} - -if ( isset( $align ) && $align == 'center') { -print ".um-$form_id.um { - margin-left: auto!important; - margin-right: auto!important; -}"; -} else if ( isset( $align ) && $align ) { -print ".um-$form_id.um { - float: $align; -}"; -} - -if ( $primary_btn_color ) { - -print ".um-$form_id.um input[type=submit]:disabled:hover { - background: $primary_btn_color; -}"; - -print ".um-$form_id.um input[type=submit].um-button, -.um-$form_id.um input[type=submit].um-button:focus, -.um-$form_id.um a.um-button, -.um-$form_id.um a.um-button.um-disabled:hover, -.um-$form_id.um a.um-button.um-disabled:focus, -.um-$form_id.um a.um-button.um-disabled:active { - background: $primary_btn_color; -}"; - -print ".um-$form_id.um a.um-link { - color: $primary_btn_color; -}"; - -} - -if ( $primary_btn_hover ) { -print ".um-$form_id.um input[type=submit].um-button:hover, -.um-$form_id.um a.um-button:hover { - background-color: $primary_btn_hover; -}"; -print ".um-$form_id.um a.um-link:hover, .um-$form_id.um a.um-link-hvr:hover { - color: $primary_btn_hover; -}"; -} - -if ( $primary_btn_text ) { -print ".um-$form_id.um .um-button { - color: $primary_btn_text; -}"; -} - -if ( $secondary_btn_color ) { -print ".um-$form_id.um .um-button.um-alt, -.um-$form_id.um input[type=submit].um-button.um-alt { - background: $secondary_btn_color; -}"; -} - -if ( $secondary_btn_hover ) { -print ".um-$form_id.um .um-button.um-alt:hover, -.um-$form_id.um input[type=submit].um-button.um-alt:hover{ - background: $secondary_btn_hover; -}"; -} - -if ( $secondary_btn_text ) { -print ".um-$form_id.um .um-button.um-alt, -.um-$form_id.um input[type=submit].um-button.um-alt { - color: $secondary_btn_text; -}"; -} - -if ( $form_border ) { -print " -.um-$form_id.um .um-form input[type=text], -.um-$form_id.um .um-form input[type=tel], -.um-$form_id.um .um-form input[type=number], -.um-$form_id.um .um-form input[type=password], -.um-$form_id.um .um-form textarea, -.um-$form_id.um .upload-progress, -.select2-container .select2-choice, -.select2-drop, -.select2-container-multi .select2-choices, -.select2-drop-active, -.select2-drop.select2-drop-above -{ - border: $form_border !important; -} - -.um-$form_id.um .um-form .select2-container-multi .select2-choices .select2-search-field input[type=text] {border: none !important} - -"; -} - -if ( $form_border_hover ) { -print " -.um-$form_id.um .um-form input[type=text]:focus, -.um-$form_id.um .um-form input[type=tel]:focus, -.um-$form_id.um .um-form input[type=number]:focus, -.um-$form_id.um .um-form input[type=password]:focus, -.um-$form_id.um .um-form .um-datepicker.picker__input.picker__input--active, -.um-$form_id.um .um-form .um-datepicker.picker__input.picker__input--target, -.um-$form_id.um .um-form textarea:focus { - border: $form_border_hover !important; -} -"; -} - -if ( $form_bg_color ) { -print " -.um-$form_id.um .um-form input[type=text], -.um-$form_id.um .um-form input[type=tel], -.um-$form_id.um .um-form input[type=number], -.um-$form_id.um .um-form input[type=password], -.um-$form_id.um .um-form textarea, -.select2-container .select2-choice, -.select2-container-multi .select2-choices -{ - background-color: $form_bg_color; -} -"; -} - -if ( $form_bg_color_focus ) { -print " -.um-$form_id.um .um-form input[type=text]:focus, -.um-$form_id.um .um-form input[type=tel]:focus, -.um-$form_id.um .um-form input[type=number]:focus, -.um-$form_id.um .um-form input[type=password]:focus, -.um-$form_id.um .um-form textarea:focus { - background-color: $form_bg_color_focus; -} -"; -} - -if ( $form_placeholder ) { -print " - -.um-$form_id.um .um-form ::-webkit-input-placeholder -{ - color: $form_placeholder; - opacity: 1 !important; -} - -.um-$form_id.um .um-form ::-moz-placeholder -{ - color: $form_placeholder; - opacity: 1 !important; -} - -.um-$form_id.um .um-form ::-moz-placeholder -{ - color: $form_placeholder; - opacity: 1 !important; -} - -.um-$form_id.um .um-form ::-ms-input-placeholder -{ - color: $form_placeholder; - opacity: 1 !important; -} - -.select2-default, -.select2-default *, -.select2-container-multi .select2-choices .select2-search-field input -{ - color: $form_placeholder; -} - -"; -} - -if ( $form_icon_color ) { -print " -.um-$form_id.um .um-field-icon i, -.select2-container .select2-choice .select2-arrow:before, -.select2-search:before, -.select2-search-choice-close:before -{ - color: $form_icon_color; -} -"; -} - -if ( $form_asterisk_color ) { -print " -.um-$form_id.um span.um-req -{ - color: $form_asterisk_color; -} -"; -} - -if ( $form_field_label ) { -print " -.um-$form_id.um .um-field-label { - color: $form_field_label; -} -"; -} - -if ( $form_text_color ) { -print " - -.um-$form_id.um .um-form input[type=text], -.um-$form_id.um .um-form input[type=tel], -.um-$form_id.um .um-form input[type=password], -.um-$form_id.um .um-form textarea -{ - color: $form_text_color; -} - -.um-$form_id.um .um-form input:-webkit-autofill { - -webkit-box-shadow:0 0 0 50px white inset; /* Change the color to your own background color */ - -webkit-text-fill-color: $form_text_color; -} - -.um-$form_id.um .um-form input:-webkit-autofill:focus { - -webkit-box-shadow: none,0 0 0 50px white inset; - -webkit-text-fill-color: $form_text_color; -} - -"; -} - -if ( $help_tip_color ) { -print " -.um-$form_id.um .um-tip { - color: $help_tip_color; -} -"; -} - ?> diff --git a/assets/dynamic_css/dynamic_profile.php b/assets/dynamic_css/dynamic_profile.php index 59a04739..ee1628e3 100644 --- a/assets/dynamic_css/dynamic_profile.php +++ b/assets/dynamic_css/dynamic_profile.php @@ -5,36 +5,6 @@ $photosize = str_replace('px','',$photosize); $photosize_up = ( $photosize / 2 ) + 10; $meta_padding = ( $photosize + 60 ) . 'px'; -if ( $photocorner == 1 ) { -print " -.um-$form_id.um .um-profile-photo a.um-profile-photo-img, -.um-$form_id.um .um-profile-photo img, -.um-$form_id.um .um-profile-photo span.um-profile-photo-overlay -{ -moz-border-radius: 999px !important; -webkit-border-radius: 999px !important; border-radius: 999px !important }"; -} - -if ( $photocorner == 2 ) { -print " -.um-$form_id.um .um-profile-photo a.um-profile-photo-img, -.um-$form_id.um .um-profile-photo img, -.um-$form_id.um .um-profile-photo span.um-profile-photo-overlay -{ -moz-border-radius: 4px !important; -webkit-border-radius: 4px !important; border-radius: 4px !important }"; -} - -if ( $photocorner == 3 ) { -print " -.um-$form_id.um .um-profile-photo a.um-profile-photo-img, -.um-$form_id.um .um-profile-photo img, -.um-$form_id.um .um-profile-photo span.um-profile-photo-overlay -{ -moz-border-radius: 0px !important; -webkit-border-radius: 0px !important; border-radius: 0px !important }"; -} - -print " -.um-$form_id.um .um-profile-photo { - width: $meta_padding; -} -"; - if ( $area_max_width ) { print " .um-$form_id.um .um-profile-body { @@ -61,65 +31,5 @@ print " padding-left: $meta_padding; } "; - -if ( $main_bg ) { -print ".um-$form_id.um-profile { - background-color: $main_bg; -}"; -} - -if ( $header_bg ) { -print ".um-$form_id.um .um-header { - background-color: $header_bg; -}"; -} - -if ( $header_text ) { -print ".um-$form_id.um .um-profile-meta { - color: $header_text; -}"; -} - -if ( $header_link_color ) { -print " -.um-$form_id.um .um-name a { - color: $header_link_color; -} -"; -} - -if ( $header_link_hcolor ) { -print " -.um-$form_id.um .um-name a:hover { - color: $header_link_hcolor; -} -"; -} - -if ( $header_icon_color ) { -print " -.um-$form_id.um .um-profile-headericon a { - color: $header_icon_color; -} -"; -} - -if ( $header_icon_hcolor ) { -print " -.um-$form_id.um .um-profile-headericon a:hover, -.um-$form_id.um .um-profile-edit-a.active { - color: $header_icon_hcolor; -} -"; -} - -if( $main_text_color ){ -print " -.um-$form_id.um .um-profile-body.main *{ - color: $main_text_color; -} -"; -} - ?> \ No newline at end of file diff --git a/assets/js/um-conditional.js b/assets/js/um-conditional.js index 3dea4009..6b5b5e98 100644 --- a/assets/js/um-conditional.js +++ b/assets/js/um-conditional.js @@ -6,51 +6,51 @@ jQuery(document).ready(function() { var arr_all_conditions = []; //raw var um_field_conditions = {}; // filtered var um_field_default_values = {}; - + /** * Get all conditional fields - * @param object $dom + * @param object $dom * @return object field condition settings */ function um_get_field_conditional_attrs( $dom ) { - var attrs = []; - var field_atts = ['action','field','operator','value']; - var key = $dom.data('key'); - - arr_field_keys.push( key ); + var attrs = []; + var field_atts = ['action','field','operator','value']; + var key = $dom.data('key'); - jQuery.each( $dom[0].attributes, function ( index, attribute ) { - if( attribute.name.indexOf('data-cond') != -1 ){ - attrs.push( attribute.value ); - } - }); + arr_field_keys.push( key ); - var i = attrs.length / 4; + jQuery.each( $dom[0].attributes, function ( index, attribute ) { + if( attribute.name.indexOf('data-cond') != -1 ){ + attrs.push( attribute.value ); + } + }); - var splitlength = ( i <= 0 ) ? 4: i; - var attr = {} - attr[ key ] = um_splitup_array( attrs, splitlength ); + var i = attrs.length / 4; - jQuery.each( attr[ key ], function( ii,dd ){ - var obj = {} - obj['field'] = { - owner: key, - action: dd.action, - parent: dd.if_field, - operator: dd.operator, - value: dd.value, - condition: { - owner: key, - action: dd.action, - operator: dd.operator, - value: dd.value - } - }; + var splitlength = ( i <= 0 ) ? 4: i; + var attr = {} + attr[ key ] = um_splitup_array( attrs, splitlength ); - arr_all_conditions.push( obj ); - }); + jQuery.each( attr[ key ], function( ii,dd ){ + var obj = {} + obj['field'] = { + owner: key, + action: dd.action, + parent: dd.if_field, + operator: dd.operator, + value: dd.value, + condition: { + owner: key, + action: dd.action, + operator: dd.operator, + value: dd.value + } + }; - return attr; + arr_all_conditions.push( obj ); + }); + + return attr; } /** @@ -80,7 +80,7 @@ jQuery(document).ready(function() { /** * Get field default value - * @param object $dom + * @param object $dom * @return string */ function um_get_field_default_value( $dom ){ @@ -89,49 +89,49 @@ jQuery(document).ready(function() { switch( type ){ - case 'text': - case 'number': - case 'date': - case 'textarea': - case 'select': - default_value = $dom.find('input:text,input[type=number],textarea,select').val(); - break; + case 'text': + case 'number': + case 'date': + case 'textarea': + case 'select': + default_value = $dom.find('input:text,input[type=number],textarea,select').val(); + break; - case 'multiselect': - default_value = $dom.find('select').val(); - - break; + case 'multiselect': + default_value = $dom.find('select').val(); - case 'radio': - case 'checkbox': + break; - if ( $dom.find('input[type=checkbox]:checked').length >= 1 ) { + case 'radio': + case 'checkbox': - if ( $dom.find('input[type=checkbox]:checked').length > 1 ) { - $dom.find('input[type=checkbox]:checked').each(function(){ - default_value = default_value + jQuery(this).val() + ' '; - }); - } else { - default_value = $dom.find('input[type=checkbox]:checked').val(); - } + if ( $dom.find('input[type=checkbox]:checked').length >= 1 ) { + + if ( $dom.find('input[type=checkbox]:checked').length > 1 ) { + $dom.find('input[type=checkbox]:checked').each(function(){ + default_value = default_value + jQuery(this).val() + ' '; + }); + } else { + default_value = $dom.find('input[type=checkbox]:checked').val(); + } } if ( $dom.find('input[type=radio]:checked').length >= 1 ) { - default_value = $dom.find('input[type=radio]:checked').val(); + default_value = $dom.find('input[type=radio]:checked').val(); } - break; + break; + - } - - return {type: type, value: default_value}; + + return {type: type, value: default_value}; } /** * Get field element by field wrapper - * @param object $dom + * @param object $dom * @return object */ function um_get_field_element( $dom ){ @@ -140,35 +140,35 @@ jQuery(document).ready(function() { switch( type ){ - case 'text': - case 'number': - case 'date': - case 'textarea': - case 'select': - case 'multiselect': + case 'text': + case 'number': + case 'date': + case 'textarea': + case 'select': + case 'multiselect': case 'radio': - case 'checkbox': + case 'checkbox': return $dom.find('input,textarea,select'); - break; + break; + - } - - return ''; + + return ''; } /** - * Get field type - * @param object $dom + * Get field type + * @param object $dom * @return string */ function um_get_field_type( $dom ){ var type = ''; var classes = $dom.attr('class'); jQuery.each( classes.split(' '), function(i,d){ - if( d.indexOf('um-field-type') != -1 ){ - type = d.split('_')[1]; + if( d.indexOf('um-field-type') != -1 ){ + type = d.split('_')[1]; } }); @@ -178,7 +178,7 @@ jQuery(document).ready(function() { /** * Get field siblings/chidren conditions - * @param string field_key + * @param string field_key * @return array */ function um_get_field_children( field_key ){ @@ -192,52 +192,52 @@ jQuery(document).ready(function() { return arr_conditions; } - + /** * Split single array to multi-dimensional array - * @param array arr - * @param integer n + * @param array arr + * @param integer n * @return array */ function um_splitup_array(arr, n) { - var rest = arr.length % n, - restUsed = rest, - partLength = Math.floor(arr.length / n), - result = []; - - for(var i = 0; i < arr.length; i += partLength) { - var end = partLength + i, - add = false; - - if(rest !== 0 && restUsed) { - end++; - restUsed--; - add = true; - } - - result.push(arr.slice(i, end)); - - if(add) { - i++; - } - } + var rest = arr.length % n, + restUsed = rest, + partLength = Math.floor(arr.length / n), + result = []; - var obj_result = []; - jQuery.each( result, function(ii,dd ){ - obj_result.push({ - action: dd[0], - if_field: dd[1], - operator: dd[2], - value: dd[3] - }) - }); + for(var i = 0; i < arr.length; i += partLength) { + var end = partLength + i, + add = false; - return obj_result; + if(rest !== 0 && restUsed) { + end++; + restUsed--; + add = true; + } + + result.push(arr.slice(i, end)); + + if(add) { + i++; + } + } + + var obj_result = []; + jQuery.each( result, function(ii,dd ){ + obj_result.push({ + action: dd[0], + if_field: dd[1], + operator: dd[2], + value: dd[3] + }) + }); + + return obj_result; } /** * Get field live value - * @param object $dom + * @param object $dom * @return mixed */ function um_get_field_data( $dom ){ @@ -246,114 +246,114 @@ jQuery(document).ready(function() { if ( $dom.is(':checkbox') ) { - um_live_value = ''; - - if ( $dom.parents('.um-field').find('input:checked').length > 1 ) { - $dom.parents('.um-field').find('input:checked').each(function(){ - um_live_value = um_live_value + jQuery(this).val() + ' '; - }); - } else { - if( $dom.parents('.um-field').find('input:checked').length >= 1 ){ - um_live_value = $dom.parents('.um-field').find('input:checked').val(); - } + um_live_value = ''; + + if ( $dom.parents('.um-field').find('input:checked').length > 1 ) { + $dom.parents('.um-field').find('input:checked').each(function(){ + um_live_value = um_live_value + jQuery(this).val() + ' '; + }); + } else { + if( $dom.parents('.um-field').find('input:checked').length >= 1 ){ + um_live_value = $dom.parents('.um-field').find('input:checked').val(); } + } } if ( $dom.is(':radio') ) { - um_live_value = $dom.parents('.um-field').find('input[type=radio]:checked').val(); + um_live_value = $dom.parents('.um-field').find('input[type=radio]:checked').val(); } return um_live_value; - + } /** * Apply field conditions - * @param object $dom - * @param boolean is_single_update + * @param object $dom + * @param boolean is_single_update */ function um_apply_conditions( $dom, is_single_update ){ - + var operators = ['empty','not empty','equals to','not equals','greater than','less than','contains']; - + var key = $dom.parents('.um-field[data-key]').data('key'); - + var conditions = um_field_conditions[ key ]; - + var live_field_value = um_get_field_data( $dom ); - + jQuery.each( conditions, function( index, condition ){ - + if ( condition.operator == 'empty' ) { if ( !live_field_value || live_field_value == '' ) { - um_field_apply_action( $dom, condition, true ); + um_field_apply_action( $dom, condition, true ); }else{ - um_field_apply_action( $dom, condition, false ); + um_field_apply_action( $dom, condition, false ); } } if ( condition.operator == 'not empty' ) { if ( live_field_value && live_field_value != '' ) { - um_field_apply_action( $dom, condition, true ); + um_field_apply_action( $dom, condition, true ); }else{ - um_field_apply_action( $dom, condition, false ); - } + um_field_apply_action( $dom, condition, false ); + } } if ( condition.operator == 'equals to' ) { if ( condition.value == live_field_value ) { - um_field_apply_action( $dom, condition, true ); + um_field_apply_action( $dom, condition, true ); }else{ - um_field_apply_action( $dom, condition, false ); - } + um_field_apply_action( $dom, condition, false ); + } } if ( condition.operator == 'not equals' ) { if ( jQuery.isNumeric( condition.value ) && parseInt( live_field_value ) != parseInt( condition.value ) && live_field_value ) { - um_field_apply_action( $dom, condition, true ); + um_field_apply_action( $dom, condition, true ); } else if ( !jQuery.isNumeric( condition.value ) && condition.value != live_field_value ) { - um_field_apply_action( $dom, condition, true ); + um_field_apply_action( $dom, condition, true ); }else{ - um_field_apply_action( $dom, condition, false ); + um_field_apply_action( $dom, condition, false ); } } if ( condition.operator == 'greater than' ) { if ( jQuery.isNumeric( condition.value ) && parseInt( live_field_value ) > parseInt( condition.value ) ) { - um_field_apply_action( $dom, condition, true ); + um_field_apply_action( $dom, condition, true ); }else{ - um_field_apply_action( $dom, condition, false ); + um_field_apply_action( $dom, condition, false ); } } if ( condition.operator == 'less than' ) { if ( jQuery.isNumeric( condition.value ) && parseInt( live_field_value ) < parseInt( condition.value ) && live_field_value ) { - um_field_apply_action( $dom, condition, true ); + um_field_apply_action( $dom, condition, true ); }else{ - um_field_apply_action( $dom, condition, false ); - } + um_field_apply_action( $dom, condition, false ); + } } if ( condition.operator == 'contains' ) { if ( live_field_value && live_field_value.indexOf( condition.value ) >= 0 ) { - um_field_apply_action( $dom, condition, true ); + um_field_apply_action( $dom, condition, true ); }else{ - um_field_apply_action( $dom, condition, false ); - } + um_field_apply_action( $dom, condition, false ); + } } }); // end foreach `conditions` $dom.trigger('um_fields_change'); - + } /** * Apply condition's action - * @param object $dom - * @param string condition - * @param boolean is_true + * @param object $dom + * @param string condition + * @param boolean is_true */ function um_field_apply_action( $dom, condition, is_true ){ var child_dom = jQuery('div.um-field[data-key="'+condition.owner+'"]'); @@ -374,14 +374,14 @@ jQuery(document).ready(function() { if( condition.action == 'hide' && !is_true /*&& child_dom.is(':hidden')*/ ){ child_dom.show(); um_field_restore_default_value( child_dom ); - + } $dom.removeClass('um-field-has-changed'); } /** * Restores default field value - * @param object $dom + * @param object $dom */ function um_field_restore_default_value( $dom ){ um_field_default_values @@ -391,79 +391,79 @@ jQuery(document).ready(function() { var field = um_field_default_values[ key ]; switch( type ){ - case 'text': - case 'number': - case 'date': - case 'textarea': - $dom.find('input:text,input[type=number],textarea,select').val( field.value ); - break; + case 'text': + case 'number': + case 'date': + case 'textarea': + $dom.find('input:text,input[type=number],textarea,select').val( field.value ); + break; - case 'select': - $dom.find('select').find('option').prop('selected',false); + case 'select': + $dom.find('select').find('option').prop('selected',false); $dom.find('select').val( field.value ); $dom.find('select').trigger('change'); - break; - - case 'multiselect': + break; + + case 'multiselect': $dom.find('select').find('option').prop('selected',false); jQuery.each( field.value, function(i,value){ $dom.find('select').find('option[value="'+value+'"]').attr('selected',true); }); $dom.find('select').trigger('change'); - break; + break; - case 'radio': - case 'checkbox': - - if ( $dom.find('input[type=checkbox]:checked').length >= 1 ) { - - $dom.find('input[type=checkbox]:checked').removeAttr('checked'); - $dom.find('span.um-field-checkbox-state i').removeClass('um-icon-android-checkbox-outline'); - $dom.find('span.um-field-checkbox-state i').addClass('um-icon-android-checkbox-outline-blank'); - $dom.find('.um-field-checkbox.active').removeClass('active'); - - if ( jQuery.isArray( field.value ) ) { - jQuery.each(field.value, function(i, value ){ - var cbox_elem = $dom.find('input[type=checkbox][value="'+value+'"]'); - cbox_elem.attr('checked', true); - cbox_elem.closest('.um-field-checkbox').find('i').removeClass('um-icon-android-checkbox-outline-blank'); - cbox_elem.closest('.um-field-checkbox').find('i').addClass('um-icon-android-checkbox-outline'); - cbox_elem.closest('.um-field-checkbox').addClass('active'); - }); - }else{ - var cbox_elem = $dom.find('input[type=checkbox][value="'+field.value+'"]'); - cbox_elem.attr('checked', true); - cbox_elem.closest('.um-field-checkbox').find('i').removeClass('um-icon-android-checkbox-outline-blank'); - cbox_elem.closest('.um-field-checkbox').find('i').addClass('um-icon-android-checkbox-outline'); - cbox_elem.closest('.um-field-checkbox').addClass('active'); - } + case 'radio': + case 'checkbox': + + if ( $dom.find('input[type=checkbox]:checked').length >= 1 ) { + + $dom.find('input[type=checkbox]:checked').removeAttr('checked'); + $dom.find('span.um-field-checkbox-state i').removeClass('um-icon-android-checkbox-outline'); + $dom.find('span.um-field-checkbox-state i').addClass('um-icon-android-checkbox-outline-blank'); + $dom.find('.um-field-checkbox.active').removeClass('active'); + + if ( jQuery.isArray( field.value ) ) { + jQuery.each(field.value, function(i, value ){ + var cbox_elem = $dom.find('input[type=checkbox][value="'+value+'"]'); + cbox_elem.attr('checked', true); + cbox_elem.closest('.um-field-checkbox').find('i').removeClass('um-icon-android-checkbox-outline-blank'); + cbox_elem.closest('.um-field-checkbox').find('i').addClass('um-icon-android-checkbox-outline'); + cbox_elem.closest('.um-field-checkbox').addClass('active'); + }); + }else{ + var cbox_elem = $dom.find('input[type=checkbox][value="'+field.value+'"]'); + cbox_elem.attr('checked', true); + cbox_elem.closest('.um-field-checkbox').find('i').removeClass('um-icon-android-checkbox-outline-blank'); + cbox_elem.closest('.um-field-checkbox').find('i').addClass('um-icon-android-checkbox-outline'); + cbox_elem.closest('.um-field-checkbox').addClass('active'); + } } if ( $dom.find('input[type=radio]:checked').length >= 1 ) { setTimeout(function(){ - + $dom.find('input[type=radio]:checked').removeAttr('checked'); - + $dom.find('span.um-field-radio-state i').removeClass('um-icon-android-radio-button-on'); - $dom.find('span.um-field-radio-state i').addClass('um-icon-android-radio-button-off'); - $dom.find('.um-field-radio.active').removeClass('active'); - - var radio_elem = $dom.find("input[type=radio][value='"+field.value+"']"); + $dom.find('span.um-field-radio-state i').addClass('um-icon-android-radio-button-off'); + $dom.find('.um-field-radio.active').removeClass('active'); + + var radio_elem = $dom.find("input[type=radio][value='"+field.value+"']"); radio_elem.attr('checked', true); radio_elem.closest('.um-field-radio').find('i').removeClass('um-icon-android-radio-button-off'); - radio_elem.closest('.um-field-radio').find('i').addClass('um-icon-android-radio-button-on'); - radio_elem.closest('.um-field-radio').addClass('active'); + radio_elem.closest('.um-field-radio').find('i').addClass('um-icon-android-radio-button-on'); + radio_elem.closest('.um-field-radio').addClass('active'); - },100); + },100); } - - break; - + break; + + } // end switch type if( ! $dom.hasClass('um-field-has-changed') ){ @@ -479,7 +479,7 @@ jQuery(document).ready(function() { * Hides sibling/child field when parent field is hidden */ function um_field_hide_siblings(){ - + jQuery.each( um_field_conditions, function(index, conditions ){ if( jQuery('.um-field[data-key="'+index+'"]:hidden').length >= 1 || jQuery('.um-field[data-key="'+index+'"]').css('display') == 'none' ){ jQuery.each( conditions,function( key,condition ){ @@ -489,7 +489,7 @@ jQuery(document).ready(function() { } }); - + } jQuery(document).on('change','.um-field select, .um-field input[type=radio], .um-field input[type=checkbox]', function(){ @@ -501,7 +501,7 @@ jQuery(document).ready(function() { var me = jQuery(this); um_apply_conditions( me, false ); }); - + jQuery(document).on('um_fields_change',function(){ um_field_hide_siblings(); um_field_hide_siblings(); // dupes, issue with false field wrapper's visiblity validations. requires optimization. @@ -509,5 +509,5 @@ jQuery(document).ready(function() { um_init_field_conditions(); - + }); \ No newline at end of file diff --git a/assets/js/um-crop.js b/assets/js/um-crop.js index 52cc37d0..6dc8d3b1 100644 --- a/assets/js/um-crop.js +++ b/assets/js/um-crop.js @@ -410,12 +410,14 @@ cropper.left = (container.width - cropper.width) / 2; } - this.$cropper.css({ - width: cropper.width, - height: cropper.height, - left: cropper.left, - top: cropper.top - }); + if ( this.$cropper ) { + this.$cropper.css({ + width: cropper.width, + height: cropper.height, + left: cropper.left, + top: cropper.top + }); + } this.cropper = cropper; }, diff --git a/assets/js/um-functions.js b/assets/js/um-functions.js index e0ebdfb2..9c5c9941 100644 --- a/assets/js/um-functions.js +++ b/assets/js/um-functions.js @@ -1,5 +1,4 @@ - function UM_check_password_matched() { jQuery(document).on('keyup', 'input[data-key=user_password],input[data-key=confirm_user_password]', function(e) { var value = jQuery('input[data-key=user_password]').val(); diff --git a/assets/js/um-masonry.js b/assets/js/um-masonry.js deleted file mode 100644 index 42408f44..00000000 --- a/assets/js/um-masonry.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){function b(){}function c(a){function c(b){b.prototype.option||(b.prototype.option=function(b){a.isPlainObject(b)&&(this.options=a.extend(!0,this.options,b))})}function e(b,c){a.fn[b]=function(e){if("string"==typeof e){for(var g=d.call(arguments,1),h=0,i=this.length;i>h;h++){var j=this[h],k=a.data(j,b);if(k)if(a.isFunction(k[e])&&"_"!==e.charAt(0)){var l=k[e].apply(k,g);if(void 0!==l)return l}else f("no such method '"+e+"' for "+b+" instance");else f("cannot call methods on "+b+" prior to initialization; attempted to call '"+e+"'")}return this}return this.each(function(){var d=a.data(this,b);d?(d.option(e),d._init()):(d=new c(this,e),a.data(this,b,d))})}}if(a){var f="undefined"==typeof console?b:function(a){console.error(a)};return a.bridget=function(a,b){c(b),e(a,b)},a.bridget}}var d=Array.prototype.slice;"function"==typeof define&&define.amd?define("jquery-bridget/jquery.bridget",["jquery"],c):c("object"==typeof exports?require("jquery"):a.jQuery)}(window),function(a){function b(b){var c=a.event;return c.target=c.target||c.srcElement||b,c}var c=document.documentElement,d=function(){};c.addEventListener?d=function(a,b,c){a.addEventListener(b,c,!1)}:c.attachEvent&&(d=function(a,c,d){a[c+d]=d.handleEvent?function(){var c=b(a);d.handleEvent.call(d,c)}:function(){var c=b(a);d.call(a,c)},a.attachEvent("on"+c,a[c+d])});var e=function(){};c.removeEventListener?e=function(a,b,c){a.removeEventListener(b,c,!1)}:c.detachEvent&&(e=function(a,b,c){a.detachEvent("on"+b,a[b+c]);try{delete a[b+c]}catch(d){a[b+c]=void 0}});var f={bind:d,unbind:e};"function"==typeof define&&define.amd?define("eventie/eventie",f):"object"==typeof exports?module.exports=f:a.eventie=f}(this),function(a){function b(a){"function"==typeof a&&(b.isReady?a():g.push(a))}function c(a){var c="readystatechange"===a.type&&"complete"!==f.readyState;b.isReady||c||d()}function d(){b.isReady=!0;for(var a=0,c=g.length;c>a;a++){var d=g[a];d()}}function e(e){return"complete"===f.readyState?d():(e.bind(f,"DOMContentLoaded",c),e.bind(f,"readystatechange",c),e.bind(a,"load",c)),b}var f=a.document,g=[];b.isReady=!1,"function"==typeof define&&define.amd?define("doc-ready/doc-ready",["eventie/eventie"],e):"object"==typeof exports?module.exports=e(require("eventie")):a.docReady=e(a.eventie)}(window),function(){function a(){}function b(a,b){for(var c=a.length;c--;)if(a[c].listener===b)return c;return-1}function c(a){return function(){return this[a].apply(this,arguments)}}var d=a.prototype,e=this,f=e.EventEmitter;d.getListeners=function(a){var b,c,d=this._getEvents();if(a instanceof RegExp){b={};for(c in d)d.hasOwnProperty(c)&&a.test(c)&&(b[c]=d[c])}else b=d[a]||(d[a]=[]);return b},d.flattenListeners=function(a){var b,c=[];for(b=0;be;e++)if(b=c[e]+a,"string"==typeof d[b])return b}}var c="Webkit Moz ms Ms O".split(" "),d=document.documentElement.style;"function"==typeof define&&define.amd?define("get-style-property/get-style-property",[],function(){return b}):"object"==typeof exports?module.exports=b:a.getStyleProperty=b}(window),function(a){function b(a){var b=parseFloat(a),c=-1===a.indexOf("%")&&!isNaN(b);return c&&b}function c(){for(var a={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},b=0,c=f.length;c>b;b++){var d=f[b];a[d]=0}return a}function d(d){function g(){if(!m){m=!0;var c=a.getComputedStyle;if(j=function(){var a=c?function(a){return c(a,null)}:function(a){return a.currentStyle};return function(b){var c=a(b);return c||e("Style returned "+c+". Are you running this code in a hidden iframe on Firefox? See http://bit.ly/getsizeiframe"),c}}(),k=d("boxSizing")){var f=document.createElement("div");f.style.width="200px",f.style.padding="1px 2px 3px 4px",f.style.borderStyle="solid",f.style.borderWidth="1px 2px 3px 4px",f.style[k]="border-box";var g=document.body||document.documentElement;g.appendChild(f);var h=j(f);l=200===b(h.width),g.removeChild(f)}}}function h(a){if(g(),"string"==typeof a&&(a=document.querySelector(a)),a&&"object"==typeof a&&a.nodeType){var d=j(a);if("none"===d.display)return c();var e={};e.width=a.offsetWidth,e.height=a.offsetHeight;for(var h=e.isBorderBox=!(!k||!d[k]||"border-box"!==d[k]),m=0,n=f.length;n>m;m++){var o=f[m],p=d[o];p=i(a,p);var q=parseFloat(p);e[o]=isNaN(q)?0:q}var r=e.paddingLeft+e.paddingRight,s=e.paddingTop+e.paddingBottom,t=e.marginLeft+e.marginRight,u=e.marginTop+e.marginBottom,v=e.borderLeftWidth+e.borderRightWidth,w=e.borderTopWidth+e.borderBottomWidth,x=h&&l,y=b(d.width);y!==!1&&(e.width=y+(x?0:r+v));var z=b(d.height);return z!==!1&&(e.height=z+(x?0:s+w)),e.innerWidth=e.width-(r+v),e.innerHeight=e.height-(s+w),e.outerWidth=e.width+t,e.outerHeight=e.height+u,e}}function i(a,b){if(getComputedStyle||-1===b.indexOf("%"))return b;var c=a.style,d=c.left,e=a.runtimeStyle,f=e&&e.left;return f&&(e.left=a.currentStyle.left),c.left=b,b=c.pixelLeft,c.left=d,f&&(e.left=f),b}var j,k,l,m=!1;return h}var e="undefined"==typeof console?noop:function(a){console.error(a)},f=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"];"function"==typeof define&&define.amd?define("get-size/get-size",["get-style-property/get-style-property"],d):"object"==typeof exports?module.exports=d(require("desandro-get-style-property")):a.getSize=d(a.getStyleProperty)}(window),function(a){function b(a,b){return a[g](b)}function c(a){if(!a.parentNode){var b=document.createDocumentFragment();b.appendChild(a)}}function d(a,b){c(a);for(var d=a.parentNode.querySelectorAll(b),e=0,f=d.length;f>e;e++)if(d[e]===a)return!0;return!1}function e(a,d){return c(a),b(a,d)}var f,g=function(){if(a.matchesSelector)return"matchesSelector";for(var b=["webkit","moz","ms","o"],c=0,d=b.length;d>c;c++){var e=b[c],f=e+"MatchesSelector";if(a[f])return f}}();if(g){var h=document.createElement("div"),i=b(h,"div");f=i?b:e}else f=d;"function"==typeof define&&define.amd?define("matches-selector/matches-selector",[],function(){return f}):"object"==typeof exports?module.exports=f:window.matchesSelector=f}(Element.prototype),function(a){function b(a,b){for(var c in b)a[c]=b[c];return a}function c(a){for(var b in a)return!1;return b=null,!0}function d(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function e(a,e,f){function h(a,b){a&&(this.element=a,this.layout=b,this.position={x:0,y:0},this._create())}var i=f("transition"),j=f("transform"),k=i&&j,l=!!f("perspective"),m={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"}[i],n=["transform","transition","transitionDuration","transitionProperty"],o=function(){for(var a={},b=0,c=n.length;c>b;b++){var d=n[b],e=f(d);e&&e!==d&&(a[d]=e)}return a}();b(h.prototype,a.prototype),h.prototype._create=function(){this._transn={ingProperties:{},clean:{},onEnd:{}},this.css({position:"absolute"})},h.prototype.handleEvent=function(a){var b="on"+a.type;this[b]&&this[b](a)},h.prototype.getSize=function(){this.size=e(this.element)},h.prototype.css=function(a){var b=this.element.style;for(var c in a){var d=o[c]||c;b[d]=a[c]}},h.prototype.getPosition=function(){var a=g(this.element),b=this.layout.options,c=b.isOriginLeft,d=b.isOriginTop,e=parseInt(a[c?"left":"right"],10),f=parseInt(a[d?"top":"bottom"],10);e=isNaN(e)?0:e,f=isNaN(f)?0:f;var h=this.layout.size;e-=c?h.paddingLeft:h.paddingRight,f-=d?h.paddingTop:h.paddingBottom,this.position.x=e,this.position.y=f},h.prototype.layoutPosition=function(){var a=this.layout.size,b=this.layout.options,c={};b.isOriginLeft?(c.left=this.position.x+a.paddingLeft+"px",c.right=""):(c.right=this.position.x+a.paddingRight+"px",c.left=""),b.isOriginTop?(c.top=this.position.y+a.paddingTop+"px",c.bottom=""):(c.bottom=this.position.y+a.paddingBottom+"px",c.top=""),this.css(c),this.emitEvent("layout",[this])};var p=l?function(a,b){return"translate3d("+a+"px, "+b+"px, 0)"}:function(a,b){return"translate("+a+"px, "+b+"px)"};h.prototype._transitionTo=function(a,b){this.getPosition();var c=this.position.x,d=this.position.y,e=parseInt(a,10),f=parseInt(b,10),g=e===this.position.x&&f===this.position.y;if(this.setPosition(a,b),g&&!this.isTransitioning)return void this.layoutPosition();var h=a-c,i=b-d,j={},k=this.layout.options;h=k.isOriginLeft?h:-h,i=k.isOriginTop?i:-i,j.transform=p(h,i),this.transition({to:j,onTransitionEnd:{transform:this.layoutPosition},isCleaning:!0})},h.prototype.goTo=function(a,b){this.setPosition(a,b),this.layoutPosition()},h.prototype.moveTo=k?h.prototype._transitionTo:h.prototype.goTo,h.prototype.setPosition=function(a,b){this.position.x=parseInt(a,10),this.position.y=parseInt(b,10)},h.prototype._nonTransition=function(a){this.css(a.to),a.isCleaning&&this._removeStyles(a.to);for(var b in a.onTransitionEnd)a.onTransitionEnd[b].call(this)},h.prototype._transition=function(a){if(!parseFloat(this.layout.options.transitionDuration))return void this._nonTransition(a);var b=this._transn;for(var c in a.onTransitionEnd)b.onEnd[c]=a.onTransitionEnd[c];for(c in a.to)b.ingProperties[c]=!0,a.isCleaning&&(b.clean[c]=!0);if(a.from){this.css(a.from);var d=this.element.offsetHeight;d=null}this.enableTransition(a.to),this.css(a.to),this.isTransitioning=!0};var q=j&&d(j)+",opacity";h.prototype.enableTransition=function(){this.isTransitioning||(this.css({transitionProperty:q,transitionDuration:this.layout.options.transitionDuration}),this.element.addEventListener(m,this,!1))},h.prototype.transition=h.prototype[i?"_transition":"_nonTransition"],h.prototype.onwebkitTransitionEnd=function(a){this.ontransitionend(a)},h.prototype.onotransitionend=function(a){this.ontransitionend(a)};var r={"-webkit-transform":"transform","-moz-transform":"transform","-o-transform":"transform"};h.prototype.ontransitionend=function(a){if(a.target===this.element){var b=this._transn,d=r[a.propertyName]||a.propertyName;if(delete b.ingProperties[d],c(b.ingProperties)&&this.disableTransition(),d in b.clean&&(this.element.style[a.propertyName]="",delete b.clean[d]),d in b.onEnd){var e=b.onEnd[d];e.call(this),delete b.onEnd[d]}this.emitEvent("transitionEnd",[this])}},h.prototype.disableTransition=function(){this.removeTransitionStyles(),this.element.removeEventListener(m,this,!1),this.isTransitioning=!1},h.prototype._removeStyles=function(a){var b={};for(var c in a)b[c]="";this.css(b)};var s={transitionProperty:"",transitionDuration:""};return h.prototype.removeTransitionStyles=function(){this.css(s)},h.prototype.removeElem=function(){this.element.parentNode.removeChild(this.element),this.emitEvent("remove",[this])},h.prototype.remove=function(){if(!i||!parseFloat(this.layout.options.transitionDuration))return void this.removeElem();var a=this;this.on("transitionEnd",function(){return a.removeElem(),!0}),this.hide()},h.prototype.reveal=function(){delete this.isHidden,this.css({display:""});var a=this.layout.options;this.transition({from:a.hiddenStyle,to:a.visibleStyle,isCleaning:!0})},h.prototype.hide=function(){this.isHidden=!0,this.css({display:""});var a=this.layout.options;this.transition({from:a.visibleStyle,to:a.hiddenStyle,isCleaning:!0,onTransitionEnd:{opacity:function(){this.isHidden&&this.css({display:"none"})}}})},h.prototype.destroy=function(){this.css({position:"",left:"",right:"",top:"",bottom:"",transition:"",transform:""})},h}var f=a.getComputedStyle,g=f?function(a){return f(a,null)}:function(a){return a.currentStyle};"function"==typeof define&&define.amd?define("outlayer/item",["eventEmitter/EventEmitter","get-size/get-size","get-style-property/get-style-property"],e):"object"==typeof exports?module.exports=e(require("wolfy87-eventemitter"),require("get-size"),require("desandro-get-style-property")):(a.Outlayer={},a.Outlayer.Item=e(a.EventEmitter,a.getSize,a.getStyleProperty))}(window),function(a){function b(a,b){for(var c in b)a[c]=b[c];return a}function c(a){return"[object Array]"===l.call(a)}function d(a){var b=[];if(c(a))b=a;else if(a&&"number"==typeof a.length)for(var d=0,e=a.length;e>d;d++)b.push(a[d]);else b.push(a);return b}function e(a,b){var c=n(b,a);-1!==c&&b.splice(c,1)}function f(a){return a.replace(/(.)([A-Z])/g,function(a,b,c){return b+"-"+c}).toLowerCase()}function g(c,g,l,n,o,p){function q(a,c){if("string"==typeof a&&(a=h.querySelector(a)),!a||!m(a))return void(i&&i.error("Bad "+this.constructor.namespace+" element: "+a));this.element=a,this.options=b({},this.constructor.defaults),this.option(c);var d=++r;this.element.outlayerGUID=d,s[d]=this,this._create(),this.options.isInitLayout&&this.layout()}var r=0,s={};return q.namespace="outlayer",q.Item=p,q.defaults={containerStyle:{position:"relative"},isInitLayout:!0,isOriginLeft:!0,isOriginTop:!0,isResizeBound:!0,isResizingContainer:!0,transitionDuration:"0.4s",hiddenStyle:{opacity:0,transform:"scale(0.001)"},visibleStyle:{opacity:1,transform:"scale(1)"}},b(q.prototype,l.prototype),q.prototype.option=function(a){b(this.options,a)},q.prototype._create=function(){this.reloadItems(),this.stamps=[],this.stamp(this.options.stamp),b(this.element.style,this.options.containerStyle),this.options.isResizeBound&&this.bindResize()},q.prototype.reloadItems=function(){this.items=this._itemize(this.element.children)},q.prototype._itemize=function(a){for(var b=this._filterFindItemElements(a),c=this.constructor.Item,d=[],e=0,f=b.length;f>e;e++){var g=b[e],h=new c(g,this);d.push(h)}return d},q.prototype._filterFindItemElements=function(a){a=d(a);for(var b=this.options.itemSelector,c=[],e=0,f=a.length;f>e;e++){var g=a[e];if(m(g))if(b){o(g,b)&&c.push(g);for(var h=g.querySelectorAll(b),i=0,j=h.length;j>i;i++)c.push(h[i])}else c.push(g)}return c},q.prototype.getItemElements=function(){for(var a=[],b=0,c=this.items.length;c>b;b++)a.push(this.items[b].element);return a},q.prototype.layout=function(){this._resetLayout(),this._manageStamps();var a=void 0!==this.options.isLayoutInstant?this.options.isLayoutInstant:!this._isLayoutInited;this.layoutItems(this.items,a),this._isLayoutInited=!0},q.prototype._init=q.prototype.layout,q.prototype._resetLayout=function(){this.getSize()},q.prototype.getSize=function(){this.size=n(this.element)},q.prototype._getMeasurement=function(a,b){var c,d=this.options[a];d?("string"==typeof d?c=this.element.querySelector(d):m(d)&&(c=d),this[a]=c?n(c)[b]:d):this[a]=0},q.prototype.layoutItems=function(a,b){a=this._getItemsForLayout(a),this._layoutItems(a,b),this._postLayout()},q.prototype._getItemsForLayout=function(a){for(var b=[],c=0,d=a.length;d>c;c++){var e=a[c];e.isIgnored||b.push(e)}return b},q.prototype._layoutItems=function(a,b){function c(){d.emitEvent("layoutComplete",[d,a])}var d=this;if(!a||!a.length)return void c();this._itemsOn(a,"layout",c);for(var e=[],f=0,g=a.length;g>f;f++){var h=a[f],i=this._getItemLayoutPosition(h);i.item=h,i.isInstant=b||h.isLayoutInstant,e.push(i)}this._processLayoutQueue(e)},q.prototype._getItemLayoutPosition=function(){return{x:0,y:0}},q.prototype._processLayoutQueue=function(a){for(var b=0,c=a.length;c>b;b++){var d=a[b];this._positionItem(d.item,d.x,d.y,d.isInstant)}},q.prototype._positionItem=function(a,b,c,d){d?a.goTo(b,c):a.moveTo(b,c)},q.prototype._postLayout=function(){this.resizeContainer()},q.prototype.resizeContainer=function(){if(this.options.isResizingContainer){var a=this._getContainerSize();a&&(this._setContainerMeasure(a.width,!0),this._setContainerMeasure(a.height,!1))}},q.prototype._getContainerSize=k,q.prototype._setContainerMeasure=function(a,b){if(void 0!==a){var c=this.size;c.isBorderBox&&(a+=b?c.paddingLeft+c.paddingRight+c.borderLeftWidth+c.borderRightWidth:c.paddingBottom+c.paddingTop+c.borderTopWidth+c.borderBottomWidth),a=Math.max(a,0),this.element.style[b?"width":"height"]=a+"px"}},q.prototype._itemsOn=function(a,b,c){function d(){return e++,e===f&&c.call(g),!0}for(var e=0,f=a.length,g=this,h=0,i=a.length;i>h;h++){var j=a[h];j.on(b,d)}},q.prototype.ignore=function(a){var b=this.getItem(a);b&&(b.isIgnored=!0)},q.prototype.unignore=function(a){var b=this.getItem(a);b&&delete b.isIgnored},q.prototype.stamp=function(a){if(a=this._find(a)){this.stamps=this.stamps.concat(a);for(var b=0,c=a.length;c>b;b++){var d=a[b];this.ignore(d)}}},q.prototype.unstamp=function(a){if(a=this._find(a))for(var b=0,c=a.length;c>b;b++){var d=a[b];e(d,this.stamps),this.unignore(d)}},q.prototype._find=function(a){return a?("string"==typeof a&&(a=this.element.querySelectorAll(a)),a=d(a)):void 0},q.prototype._manageStamps=function(){if(this.stamps&&this.stamps.length){this._getBoundingRect();for(var a=0,b=this.stamps.length;b>a;a++){var c=this.stamps[a];this._manageStamp(c)}}},q.prototype._getBoundingRect=function(){var a=this.element.getBoundingClientRect(),b=this.size;this._boundingRect={left:a.left+b.paddingLeft+b.borderLeftWidth,top:a.top+b.paddingTop+b.borderTopWidth,right:a.right-(b.paddingRight+b.borderRightWidth),bottom:a.bottom-(b.paddingBottom+b.borderBottomWidth)}},q.prototype._manageStamp=k,q.prototype._getElementOffset=function(a){var b=a.getBoundingClientRect(),c=this._boundingRect,d=n(a),e={left:b.left-c.left-d.marginLeft,top:b.top-c.top-d.marginTop,right:c.right-b.right-d.marginRight,bottom:c.bottom-b.bottom-d.marginBottom};return e},q.prototype.handleEvent=function(a){var b="on"+a.type;this[b]&&this[b](a)},q.prototype.bindResize=function(){this.isResizeBound||(c.bind(a,"resize",this),this.isResizeBound=!0)},q.prototype.unbindResize=function(){this.isResizeBound&&c.unbind(a,"resize",this),this.isResizeBound=!1},q.prototype.onresize=function(){function a(){b.resize(),delete b.resizeTimeout}this.resizeTimeout&&clearTimeout(this.resizeTimeout);var b=this;this.resizeTimeout=setTimeout(a,100)},q.prototype.resize=function(){this.isResizeBound&&this.needsResizeLayout()&&this.layout()},q.prototype.needsResizeLayout=function(){var a=n(this.element),b=this.size&&a;return b&&a.innerWidth!==this.size.innerWidth},q.prototype.addItems=function(a){var b=this._itemize(a);return b.length&&(this.items=this.items.concat(b)),b},q.prototype.appended=function(a){var b=this.addItems(a);b.length&&(this.layoutItems(b,!0),this.reveal(b))},q.prototype.prepended=function(a){var b=this._itemize(a);if(b.length){var c=this.items.slice(0);this.items=b.concat(c),this._resetLayout(),this._manageStamps(),this.layoutItems(b,!0),this.reveal(b),this.layoutItems(c)}},q.prototype.reveal=function(a){var b=a&&a.length;if(b)for(var c=0;b>c;c++){var d=a[c];d.reveal()}},q.prototype.hide=function(a){var b=a&&a.length;if(b)for(var c=0;b>c;c++){var d=a[c];d.hide()}},q.prototype.getItem=function(a){for(var b=0,c=this.items.length;c>b;b++){var d=this.items[b];if(d.element===a)return d}},q.prototype.getItems=function(a){if(a&&a.length){for(var b=[],c=0,d=a.length;d>c;c++){var e=a[c],f=this.getItem(e);f&&b.push(f)}return b}},q.prototype.remove=function(a){a=d(a);var b=this.getItems(a);if(b&&b.length){this._itemsOn(b,"remove",function(){this.emitEvent("removeComplete",[this,b])});for(var c=0,f=b.length;f>c;c++){var g=b[c];g.remove(),e(g,this.items)}}},q.prototype.destroy=function(){var a=this.element.style;a.height="",a.position="",a.width="";for(var b=0,c=this.items.length;c>b;b++){var d=this.items[b];d.destroy()}this.unbindResize();var e=this.element.outlayerGUID;delete s[e],delete this.element.outlayerGUID,j&&j.removeData(this.element,this.constructor.namespace)},q.data=function(a){var b=a&&a.outlayerGUID;return b&&s[b]},q.create=function(a,c){function d(){q.apply(this,arguments)}return Object.create?d.prototype=Object.create(q.prototype):b(d.prototype,q.prototype),d.prototype.constructor=d,d.defaults=b({},q.defaults),b(d.defaults,c),d.prototype.settings={},d.namespace=a,d.data=q.data,d.Item=function(){p.apply(this,arguments)},d.Item.prototype=new p,g(function(){for(var b=f(a),c=h.querySelectorAll(".js-"+b),e="data-"+b+"-options",g=0,k=c.length;k>g;g++){var l,m=c[g],n=m.getAttribute(e);try{l=n&&JSON.parse(n)}catch(o){i&&i.error("Error parsing "+e+" on "+m.nodeName.toLowerCase()+(m.id?"#"+m.id:"")+": "+o);continue}var p=new d(m,l);j&&j.data(m,a,p)}}),j&&j.bridget&&j.bridget(a,d),d},q.Item=p,q}var h=a.document,i=a.console,j=a.jQuery,k=function(){},l=Object.prototype.toString,m="function"==typeof HTMLElement||"object"==typeof HTMLElement?function(a){return a instanceof HTMLElement}:function(a){return a&&"object"==typeof a&&1===a.nodeType&&"string"==typeof a.nodeName},n=Array.prototype.indexOf?function(a,b){return a.indexOf(b)}:function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1};"function"==typeof define&&define.amd?define("outlayer/outlayer",["eventie/eventie","doc-ready/doc-ready","eventEmitter/EventEmitter","get-size/get-size","matches-selector/matches-selector","./item"],g):"object"==typeof exports?module.exports=g(require("eventie"),require("doc-ready"),require("wolfy87-eventemitter"),require("get-size"),require("desandro-matches-selector"),require("./item")):a.Outlayer=g(a.eventie,a.docReady,a.EventEmitter,a.getSize,a.matchesSelector,a.Outlayer.Item)}(window),function(a){function b(a,b){var d=a.create("masonry");return d.prototype._resetLayout=function(){this.getSize(),this._getMeasurement("columnWidth","outerWidth"),this._getMeasurement("gutter","outerWidth"),this.measureColumns();var a=this.cols;for(this.colYs=[];a--;)this.colYs.push(0);this.maxY=0},d.prototype.measureColumns=function(){if(this.getContainerWidth(),!this.columnWidth){var a=this.items[0],c=a&&a.element;this.columnWidth=c&&b(c).outerWidth||this.containerWidth}this.columnWidth+=this.gutter,this.cols=Math.floor((this.containerWidth+this.gutter)/this.columnWidth),this.cols=Math.max(this.cols,1)},d.prototype.getContainerWidth=function(){var a=this.options.isFitWidth?this.element.parentNode:this.element,c=b(a);this.containerWidth=c&&c.innerWidth},d.prototype._getItemLayoutPosition=function(a){a.getSize();var b=a.size.outerWidth%this.columnWidth,d=b&&1>b?"round":"ceil",e=Math[d](a.size.outerWidth/this.columnWidth);e=Math.min(e,this.cols);for(var f=this._getColGroup(e),g=Math.min.apply(Math,f),h=c(f,g),i={x:this.columnWidth*h,y:g},j=g+a.size.outerHeight,k=this.cols+1-f.length,l=0;k>l;l++)this.colYs[h+l]=j;return i},d.prototype._getColGroup=function(a){if(2>a)return this.colYs;for(var b=[],c=this.cols+1-a,d=0;c>d;d++){var e=this.colYs.slice(d,d+a);b[d]=Math.max.apply(Math,e)}return b},d.prototype._manageStamp=function(a){var c=b(a),d=this._getElementOffset(a),e=this.options.isOriginLeft?d.left:d.right,f=e+c.outerWidth,g=Math.floor(e/this.columnWidth);g=Math.max(0,g);var h=Math.floor(f/this.columnWidth);h-=f%this.columnWidth?0:1,h=Math.min(this.cols-1,h);for(var i=(this.options.isOriginTop?d.top:d.bottom)+c.outerHeight,j=g;h>=j;j++)this.colYs[j]=Math.max(i,this.colYs[j])},d.prototype._getContainerSize=function(){this.maxY=Math.max.apply(Math,this.colYs);var a={height:this.maxY};return this.options.isFitWidth&&(a.width=this._getContainerFitWidth()),a},d.prototype._getContainerFitWidth=function(){for(var a=0,b=this.cols;--b&&0===this.colYs[b];)a++;return(this.cols-a)*this.columnWidth-this.gutter},d.prototype.needsResizeLayout=function(){var a=this.containerWidth;return this.getContainerWidth(),a!==this.containerWidth},d}var c=Array.prototype.indexOf?function(a,b){return a.indexOf(b)}:function(a,b){for(var c=0,d=a.length;d>c;c++){var e=a[c];if(e===b)return c}return-1};"function"==typeof define&&define.amd?define(["outlayer/outlayer","get-size/get-size"],b):"object"==typeof exports?module.exports=b(require("outlayer"),require("get-size")):a.Masonry=b(a.Outlayer,a.getSize)}(window); \ No newline at end of file diff --git a/assets/js/um-members.js b/assets/js/um-members.js index c38fcc92..ac80292c 100644 --- a/assets/js/um-members.js +++ b/assets/js/um-members.js @@ -46,6 +46,19 @@ jQuery(document).ready(function() { jQuery(document).on('click', '.um-do-search', function(e){ e.preventDefault(); + + jQuery(this).parents('form').find('input').filter(function(e){ + if ( this.value.length ===0 ) { + return true; + } + }).prop('disabled', true); + + + jQuery(this).parents('form').find('select').filter(function(e){ + if ( this.value.length ===0 ) { + return true; + } + }).prop('disabled', true); jQuery(this).parents('form').submit(); return false; }); diff --git a/assets/js/um-modal.js b/assets/js/um-modal.js index 6f33524d..b21431bb 100644 --- a/assets/js/um-modal.js +++ b/assets/js/um-modal.js @@ -30,10 +30,9 @@ jQuery(document).ready(function() { um_modal_responsive(); jQuery.ajax({ - url: um_scripts.ajaxurl, + url: um_scripts.remove_file, type: 'post', data: { - action: 'ultimatemember_remove_file', src: src } }); @@ -60,10 +59,9 @@ jQuery(document).ready(function() { um_modal_responsive(); jQuery.ajax({ - url: um_scripts.ajaxurl, + url: um_scripts.remove_file, type: 'post', data: { - action: 'ultimatemember_remove_file', src: src } }); @@ -104,10 +102,9 @@ jQuery(document).ready(function() { jQuery(this).html( jQuery(this).attr('data-processing') ).addClass('disabled'); jQuery.ajax({ - url: um_scripts.ajaxurl, + url: um_scripts.resize_image, type: 'POST', data: { - action: 'ultimatemember_resize_image', src : src, coord : coord, user_id : user_id, diff --git a/assets/js/um-profile.js b/assets/js/um-profile.js index 4b50127e..12238b55 100644 --- a/assets/js/um-profile.js +++ b/assets/js/um-profile.js @@ -43,10 +43,9 @@ jQuery(document).ready(function() { metakey = 'profile_photo'; jQuery.ajax({ - url: um_scripts.ajaxurl, + url: um_scripts.delete_profile_photo, type: 'post', data: { - action: 'ultimatemember_delete_profile_photo', metakey: metakey, user_id: user_id } @@ -68,10 +67,9 @@ jQuery(document).ready(function() { metakey = 'cover_photo'; jQuery.ajax({ - url: um_scripts.ajaxurl, + url: um_scripts.delete_cover_photo, type: 'post', data: { - action: 'ultimatemember_delete_cover_photo', metakey: metakey, user_id: user_id } diff --git a/assets/js/um-scripts.js b/assets/js/um-scripts.js index 4f5eb732..4cc430e3 100644 --- a/assets/js/um-scripts.js +++ b/assets/js/um-scripts.js @@ -147,10 +147,9 @@ jQuery(document).ready(function() { parent.find('input[type=hidden]').val('empty_file'); jQuery.ajax({ - url: um_scripts.ajaxurl, + url: um_scripts.remove_file, type: 'post', data: { - action: 'ultimatemember_remove_file', src: src } }); @@ -167,10 +166,9 @@ jQuery(document).ready(function() { parent.find('input[type=hidden]').val('empty_file'); jQuery.ajax({ - url: um_scripts.ajaxurl, + url: um_scripts.remove_file, type: 'post', data: { - action: 'ultimatemember_remove_file', src: src } }); @@ -245,10 +243,9 @@ jQuery(document).ready(function() { var hook = jQuery(this).data('hook'); var container = jQuery(this).parents('.um').find('.um-ajax-items'); jQuery.ajax({ - url: um_scripts.ajaxurl, + url: um_scripts.ajax_paginate, type: 'post', data: { - action: 'ultimatemember_ajax_paginate', hook: hook, args: args }, @@ -274,10 +271,9 @@ jQuery(document).ready(function() { } jQuery.ajax({ - url: um_scripts.ajaxurl, + url: um_scripts.muted_action, type: 'post', data: { - action: 'ultimatemember_muted_action', hook: hook, user_id: user_id, arguments: arguments @@ -297,9 +293,9 @@ jQuery(document).ready(function() { jQuery('.um-form input[class=um-button][type=submit]').removeAttr('disabled'); jQuery(document).one('click', '.um:not(.um-account) .um-form input[class=um-button][type=submit]:not(.um-has-recaptcha)', function() { - jQuery(this).attr('disabled','disabled'); - jQuery(this).parents('form').submit(); - + jQuery(this).attr('disabled','disabled'); + jQuery(this).parents('form').submit(); + }); @@ -326,10 +322,9 @@ jQuery(document).ready(function() { if( parent.val() != '' && typeof um_select_options_cache[ arr_key ] != 'object' ){ jQuery.ajax({ - url: um_ajax_url, + url: um_scripts.ajax_select_options, type: 'post', data: { - action: 'ultimatemember_ajax_select_options', parent_option: parent.val(), child_callback: um_ajax_source, child_name: me.attr('name'), diff --git a/assets/js/um.min.js b/assets/js/um.min.js index 251991c0..286736a4 100644 --- a/assets/js/um.min.js +++ b/assets/js/um.min.js @@ -1,8 +1,8 @@ -function UM_check_password_matched(){jQuery(document).on("keyup","input[data-key=user_password],input[data-key=confirm_user_password]",function(e){var t=jQuery("input[data-key=user_password]").val(),i=jQuery("input[data-key=confirm_user_password]").val(),n=jQuery("input[data-key=user_password],input[data-key=confirm_user_password]");t||i?t!==i?n.removeClass("um-validate-matched").addClass("um-validate-not-matched"):n.removeClass("um-validate-not-matched").addClass("um-validate-matched"):n.removeClass("um-validate-matched").removeClass("um-validate-not-matched")})}function UM_hide_menus(){menu=jQuery(".um-dropdown"),menu.parents("div").find("a").removeClass("active"),menu.hide()}function UM_domenus(){jQuery(".um-dropdown").each(function(){var e=jQuery(this),t=jQuery(this).attr("data-element"),i=jQuery(this).attr("data-position");jQuery(t).addClass("um-trigger-menu-on-"+e.attr("data-trigger")),jQuery(window).width()<=1200&&"div.um-profile-edit"==t&&(i="lc"),"lc"==i&&(200>jQuery(t).find("img").width()?left_p=(jQuery(t).width()-jQuery(t).find("img").width())/2+(jQuery(t).find("img").width()-200)/2:left_p=(jQuery(t).width()-jQuery(t).find("img").width())/2,top_=parseInt(jQuery(t).find("a").css("top")),top_?(top_p=jQuery(t).find("img").height()+4+top_,left_gap=4):(top_p=jQuery(t).find("img").height()+4,left_gap=0),4==top_p&&"div.um-cover"==t?top_p=jQuery(t).height()/2+e.height()/2:4==top_p&&(top_p=jQuery(t).height()+20),gap_right=jQuery(t).width()+17,e.css({top:0,width:200,left:"auto",right:gap_right+"px","text-align":"center"}),e.find(".um-dropdown-arr").find("i").removeClass().addClass("um-icon-arrow-right-b"),e.find(".um-dropdown-arr").css({top:"4px",left:"auto",right:"-17px"})),"bc"==i&&(200>jQuery(t).find("img").width()?left_p=(jQuery(t).width()-jQuery(t).find("img").width())/2+(jQuery(t).find("img").width()-200)/2:left_p=(jQuery(t).width()-jQuery(t).find("img").width())/2,top_=parseInt(jQuery(t).find("a").css("top")),top_?(top_p=jQuery(t).find("img").height()+4+top_,left_gap=4):(top_p=jQuery(t).find("img").height()+4,left_gap=0),4==top_p&&"div.um-cover"==t?top_p=jQuery(t).height()/2+e.height()/2:4==top_p&&(top_p=jQuery(t).height()+20),e.css({top:top_p,width:200,left:left_p+left_gap,right:"auto","text-align":"center"}),e.find(".um-dropdown-arr").find("i").removeClass().addClass("um-icon-arrow-up-b"),e.find(".um-dropdown-arr").css({top:"-17px",left:e.width()/2-12,right:"auto"}))})}function um_responsive(){jQuery(".um").each(function(){element_width=jQuery(this).width(),element_width<=340?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob340")):element_width<=500?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob500")):element_width<=800?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob800")):element_width<=960?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob960")):element_width>960&&(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960")),jQuery(".um-account-nav").length>0&&jQuery(".um-account-side").is(":visible")&&0==jQuery(".um-account-tab:visible").length&&jQuery(".um-account-side li a.current").trigger("click"),jQuery(this).css("opacity",1)}),jQuery(".um-cover, .um-member-cover").each(function(){var e=jQuery(this),t=e.data("ratio"),i=e.width(),n=t.split(":");calcHeight=Math.round(i/n[0])+"px",e.height(calcHeight),e.find(".um-cover-add").height(calcHeight)}),jQuery(".um-members").each(function(){UM_Member_Grid(jQuery(this))}),UM_domenus()}function UM_Member_Grid(e){e.masonry({itemSelector:".um-member",columnWidth:".um-member",gutter:".um-gutter-sizer"})}function initImageUpload_UM(e){e.data("upload_help_text")?upload_help_text=''+e.data("upload_help_text")+"":upload_help_text="",e.data("icon")?icon='':icon="",e.data("upload_text")?upload_text=''+e.data("upload_text")+"":upload_text="",e.uploadFile({url:um_scripts.imageupload,method:"POST",multiple:!1,formData:{key:e.data("key"),set_id:e.data("set_id"),set_mode:e.data("set_mode"),_wpnonce:e.data("nonce"),timestamp:e.data("timestamp")},fileName:e.data("key"),allowedTypes:e.data("allowed_types"),maxFileSize:e.data("max_size"),dragDropStr:icon+upload_text+upload_help_text,sizeErrorStr:e.data("max_size_error"),extErrorStr:e.data("extension_error"),maxFileCountErrorStr:e.data("max_files_error"),maxFileCount:1,showDelete:!1,showAbort:!1,showDone:!1,showFileCounter:!1,showStatusAfterSuccess:!0,onSubmit:function(t){e.parents(".um-modal-body").find(".um-error-block").remove()},onSuccess:function(t,i,n){e.selectedFiles=0;try{i=jQuery.parseJSON(i)}catch(e){return void console.log(e,i)}i.error&&""!=i.error?(e.parents(".um-modal-body").append('
    '+i.error+"
    "),e.parents(".um-modal-body").find(".upload-statusbar").hide(0),um_modal_responsive()):jQuery.each(i,function(t,i){var n=e.parents(".um-modal-body").find(".um-single-image-preview img"),r=e.parents(".um-modal-body").find(".um-single-image-preview");n.attr("src",i),n.load(function(){e.parents(".um-modal-body").find(".um-modal-btn.um-finish-upload.disabled").removeClass("disabled"),e.parents(".um-modal-body").find(".ajax-upload-dragdrop,.upload-statusbar").hide(0),r.show(0),um_modal_responsive()})})}})}function initFileUpload_UM(e){e.data("upload_help_text")?upload_help_text=''+e.data("upload_help_text")+"":upload_help_text="",e.data("icon")?icon='':icon="",e.data("upload_text")?upload_text=''+e.data("upload_text")+"":upload_text="",e.uploadFile({url:um_scripts.fileupload,method:"POST",multiple:!1,formData:{key:e.data("key"),set_id:e.data("set_id"),set_mode:e.data("set_mode"),_wpnonce:e.data("nonce"),timestamp:e.data("timestamp")},fileName:e.data("key"),allowedTypes:e.data("allowed_types"),maxFileSize:e.data("max_size"),dragDropStr:icon+upload_text+upload_help_text,sizeErrorStr:e.data("max_size_error"),extErrorStr:e.data("extension_error"),maxFileCountErrorStr:e.data("max_files_error"),maxFileCount:1,showDelete:!1,showAbort:!1,showDone:!1,showFileCounter:!1,showStatusAfterSuccess:!0,onSubmit:function(t){e.parents(".um-modal-body").find(".um-error-block").remove()},onSuccess:function(t,i,n){e.selectedFiles=0,i=jQuery.parseJSON(i),i.error&&""!=i.error?(e.parents(".um-modal-body").append('
    '+i.error+"
    "),e.parents(".um-modal-body").find(".upload-statusbar").hide(0),setTimeout(function(){um_modal_responsive()},1e3)):(jQuery.each(i,function(t,i){e.parents(".um-modal-body").find(".um-modal-btn.um-finish-upload.disabled").removeClass("disabled"),e.parents(".um-modal-body").find(".ajax-upload-dragdrop,.upload-statusbar").hide(0),e.parents(".um-modal-body").find(".um-single-file-preview").show(0),"icon"==t?e.parents(".um-modal-body").find(".um-single-fileinfo i").removeClass().addClass(i):"icon_bg"==t?e.parents(".um-modal-body").find(".um-single-fileinfo span.icon").css({"background-color":i}):"filename"==t?e.parents(".um-modal-body").find(".um-single-fileinfo span.filename").html(i):e.parents(".um-modal-body").find(".um-single-fileinfo a").attr("href",i)}),setTimeout(function(){um_modal_responsive()},1e3))}})}function initCrop_UM(){var e=jQuery(".um-modal .um-single-image-preview img").first(),t=jQuery(".um-modal .um-single-image-preview"),i=e.parent().attr("data-crop"),n=e.parent().attr("data-min_width"),r=e.parent().attr("data-min_height"),a=e.parent().attr("data-ratio");if(jQuery(".um-modal").find("#um_upload_single").attr("data-ratio"))var a=jQuery(".um-modal").find("#um_upload_single").attr("data-ratio"),o=a.split(":"),a=o[0];if(e.length&&""!=e.attr("src")){var s=jQuery(window).height()-(jQuery(".um-modal-footer a").height()+20)-50-jQuery(".um-modal-header:visible").height();if(e.css({height:"auto"}),t.css({height:"auto"}),jQuery(window).height()<=400?(t.css({height:s+"px","max-height":s+"px"}),e.css({height:"auto"})):(e.css({height:"auto","max-height":s+"px"}),t.css({height:e.height(),"max-height":s+"px"})),"square"==i)var l={minWidth:n,minHeight:r,dragCrop:!1,aspectRatio:1,zoomable:!1,rotatable:!1,dashed:!1,done:function(t){e.parent().attr("data-coord",Math.round(t.x)+","+Math.round(t.y)+","+Math.round(t.width)+","+Math.round(t.height))}};else if("cover"==i){Math.round(n/a)>0&&(r=Math.round(n/a));var l={minWidth:n,minHeight:r,dragCrop:!1,aspectRatio:a,zoomable:!1,rotatable:!1,dashed:!1,done:function(t){e.parent().attr("data-coord",Math.round(t.x)+","+Math.round(t.y)+","+Math.round(t.width)+","+Math.round(t.height))}}}else if("user"==i)var l={minWidth:n,minHeight:r,dragCrop:!0,aspectRatio:"auto",zoomable:!1,rotatable:!1,dashed:!1,done:function(t){e.parent().attr("data-coord",Math.round(t.x)+","+Math.round(t.y)+","+Math.round(t.width)+","+Math.round(t.height))}};0!=i&&(e.cropper(l),jQuery(".um-single-image-preview img.cropper-hidden").cropper("destroy"),jQuery(".um-single-image-preview img.lazyloaded").addClass("cropper-hidden"),jQuery(".um-single-image-preview img.lazyloaded").removeClass("lazyloaded"),jQuery(".um-single-image-preview .cropper-container").append('
    '))}}function um_new_modal(e,t,i,n){var r=jQuery("body").find(".um-modal-overlay");if(0==r.length)if(jQuery(".tipsy").hide(),UM_hide_menus(),jQuery("body,html,textarea").css("overflow","hidden"),jQuery(document).bind("touchmove",function(e){e.preventDefault()}),jQuery(".um-modal").on("touchmove",function(e){e.stopPropagation()}),i?jQuery("body").append('
    '):jQuery("body").append('
    '),jQuery("#"+e).prependTo(".um-modal"),i){jQuery(".um-modal").find(".um-modal-photo").html("");var a=jQuery(".um-modal-photo img"),o=jQuery(window).width()-60,s=jQuery(window).height()-.25*jQuery(window).height();a.attr("src",n),a.load(function(){jQuery("#"+e).show(),jQuery(".um-modal").show(),a.css({opacity:0}),a.css({"max-width":o}),a.css({"max-height":s}),jQuery(".um-modal").css({width:a.width(),"margin-left":"-"+a.width()/2+"px"}),a.animate({opacity:1},1e3),um_modal_responsive()})}else jQuery("#"+e).show(),jQuery(".um-modal").show(),um_modal_size(t),initImageUpload_UM(jQuery(".um-modal:visible").find(".um-single-image-upload")),initFileUpload_UM(jQuery(".um-modal:visible").find(".um-single-file-upload")),um_modal_responsive()}function um_modal_responsive(){var e=jQuery(".um-modal:visible"),t=jQuery(".um-modal-body.photo:visible");if(t.length){e.removeClass("uimob340"),e.removeClass("uimob500");var i=jQuery(".um-modal-photo img"),n=jQuery(window).width()-60,r=jQuery(window).height()-.25*jQuery(window).height();i.css({opacity:0}),i.css({"max-width":n}),i.css({"max-height":r}),jQuery(".um-modal").css({width:i.width(),"margin-left":"-"+i.width()/2+"px"}),i.animate({opacity:1},1e3);var a=(jQuery(window).height()-e.innerHeight())/2+"px";e.animate({bottom:a},300)}else if(e.length){var o=jQuery(window).width();if(e.removeClass("uimob340"),e.removeClass("uimob500"),o<=340)e.addClass("uimob340"),initCrop_UM(),e.animate({bottom:0},300);else if(o<=500)e.addClass("uimob500"),initCrop_UM(),e.animate({bottom:0},300);else if(o<=800){initCrop_UM();var a=(jQuery(window).height()-e.innerHeight())/2+"px";e.animate({bottom:a},300)}else if(o<=960){initCrop_UM();var a=(jQuery(window).height()-e.innerHeight())/2+"px";e.animate({bottom:a},300)}else if(o>960){initCrop_UM();var a=(jQuery(window).height()-e.innerHeight())/2+"px";e.animate({bottom:a},300)}}}function um_remove_modal(){jQuery("img.cropper-hidden").cropper("destroy"),jQuery("body,html,textarea").css("overflow","auto"),jQuery(document).unbind("touchmove"),jQuery('.um-modal div[id^="um_"]').hide().appendTo("body"),jQuery(".um-modal,.um-modal-overlay").remove()}function um_modal_size(e){jQuery(".um-modal:visible").addClass(e)}function um_modal_add_attr(e,t){jQuery(".um-modal:visible").data(e,t)}function prepare_Modal(){0==jQuery(".um-popup-overlay").length&&(jQuery("body").append('
    '),jQuery("body").append('
    '),jQuery(".um-popup").addClass("loading"),jQuery("body,html").css({overflow:"hidden"}))}function remove_Modal(){jQuery(".um-popup-overlay").length&&(jQuery(".tipsy").remove(),jQuery(".um-popup").empty().remove(),jQuery(".um-popup-overlay").empty().remove(),jQuery("body,html").css({overflow:"auto"}))}function show_Modal(e){jQuery(".um-popup-overlay").length&&(jQuery(".um-popup").removeClass("loading").html(e),jQuery(".um-tip-n").tipsy({gravity:"n",opacity:1,offset:3}),jQuery(".um-tip-w").tipsy({gravity:"w",opacity:1,offset:3}),jQuery(".um-tip-e").tipsy({gravity:"e",opacity:1,offset:3}),jQuery(".um-tip-s").tipsy({gravity:"s",opacity:1,offset:3}))}function responsive_Modal(){jQuery(".um-popup-overlay").length&&(ag_height=jQuery(window).height()-jQuery(".um-popup um-popup-header").outerHeight()-jQuery(".um-popup .um-popup-footer").outerHeight()-80,ag_height>350&&(ag_height=350),jQuery(".um-popup-autogrow:visible").length?(jQuery(".um-popup-autogrow:visible").css({height:ag_height+"px"}),jQuery(".um-popup-autogrow:visible").mCustomScrollbar({theme:"dark-3",mouseWheelPixels:500}).mCustomScrollbar("scrollTo","bottom",{scrollInertia:0})):jQuery(".um-popup-autogrow2:visible").length&&(jQuery(".um-popup-autogrow2:visible").css({"max-height":ag_height+"px"}),jQuery(".um-popup-autogrow2:visible").mCustomScrollbar({theme:"dark-3",mouseWheelPixels:500})))}function um_reset_field(e){jQuery(e).find("div.um-field-area").find("input,textarea,select").not(":button, :submit, :reset, :hidden").val("").removeAttr("checked").removeAttr("selected")}!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e("object"==typeof exports?require("jquery"):jQuery)}(function(e){var t=function(){if(e&&e.fn&&e.fn.select2&&e.fn.select2.amd)var t=e.fn.select2.amd;var t;return function(){if(!t||!t.requirejs){t?i=t:t={};var e,i,n;!function(t){function r(e,t){return w.call(e,t)}function a(e,t){var i,n,r,a,o,s,l,u,c,d,h,p=t&&t.split("/"),f=y.map,m=f&&f["*"]||{};if(e&&"."===e.charAt(0))if(t){for(e=e.split("/"),o=e.length-1,y.nodeIdCompat&&x.test(e[o])&&(e[o]=e[o].replace(x,"")),e=p.slice(0,p.length-1).concat(e),c=0;c0&&(e.splice(c-1,2),c-=2)}e=e.join("/")}else 0===e.indexOf("./")&&(e=e.substring(2));if((p||m)&&f){for(i=e.split("/"),c=i.length;c>0;c-=1){if(n=i.slice(0,c).join("/"),p)for(d=p.length;d>0;d-=1)if(r=f[p.slice(0,d).join("/")],r&&(r=r[n])){a=r,s=c;break}if(a)break;!l&&m&&m[n]&&(l=m[n],u=c)}!a&&l&&(a=l,s=u),a&&(i.splice(0,s,a),e=i.join("/"))}return e}function o(e,i){return function(){var n=_.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),p.apply(t,n.concat([e,i]))}}function s(e){return function(t){return a(t,e)}}function l(e){return function(t){g[e]=t}}function u(e){if(r(v,e)){var i=v[e];delete v[e],b[e]=!0,h.apply(t,i)}if(!r(g,e)&&!r(b,e))throw new Error("No "+e);return g[e]}function c(e){var t,i=e?e.indexOf("!"):-1;return i>-1&&(t=e.substring(0,i),e=e.substring(i+1,e.length)),[t,e]}function d(e){return function(){return y&&y.config&&y.config[e]||{}}}var h,p,f,m,g={},v={},y={},b={},w=Object.prototype.hasOwnProperty,_=[].slice,x=/\.js$/;f=function(e,t){var i,n=c(e),r=n[0];return e=n[1],r&&(r=a(r,t),i=u(r)),r?e=i&&i.normalize?i.normalize(e,s(t)):a(e,t):(e=a(e,t),n=c(e),r=n[0],e=n[1],r&&(i=u(r))),{f:r?r+"!"+e:e,n:e,pr:r,p:i}},m={require:function(e){return o(e)},exports:function(e){var t=g[e];return"undefined"!=typeof t?t:g[e]={}},module:function(e){return{id:e,uri:"",exports:g[e],config:d(e)}}},h=function(e,i,n,a){var s,c,d,h,p,y,w=[],_=typeof n;if(a=a||e,"undefined"===_||"function"===_){for(i=!i.length&&n.length?["require","exports","module"]:i,p=0;p0&&(t.call(arguments,e.prototype.constructor),r=i.prototype.constructor),r.apply(this,arguments)}function r(){this.constructor=n}var a=t(i),o=t(e);i.displayName=e.displayName,n.prototype=new r;for(var s=0;si;i++)e[i].apply(this,t)},i.Observable=n,i.generateChars=function(e){for(var t="",i=0;e>i;i++){var n=Math.floor(36*Math.random());t+=n.toString(36)}return t},i.bind=function(e,t){return function(){e.apply(t,arguments)}},i._convertData=function(e){for(var t in e){var i=t.split("-"),n=e;if(1!==i.length){for(var r=0;r":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},i.appendMany=function(t,i){if("1.7"===e.fn.jquery.substr(0,3)){var n=e();e.map(i,function(e){n=n.add(e)}),i=n}t.append(i)},i}),t.define("select2/results",["jquery","./utils"],function(e,t){function i(e,t,n){this.$element=e,this.data=n,this.options=t,i.__super__.constructor.call(this)}return t.Extend(i,t.Observable),i.prototype.render=function(){var t=e('
      ');return this.options.get("multiple")&&t.attr("aria-multiselectable","true"),this.$results=t,t},i.prototype.clear=function(){this.$results.empty()},i.prototype.displayMessage=function(t){var i=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=e('
    • '),r=this.options.get("translations").get(t.message);n.append(i(r(t.args))),n[0].className+=" select2-results__message",this.$results.append(n)},i.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},i.prototype.append=function(e){this.hideLoading();var t=[];if(null==e.results||0===e.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));e.results=this.sort(e.results);for(var i=0;i-1?t.attr("aria-selected","true"):t.attr("aria-selected","false")});var a=r.filter("[aria-selected=true]");a.length>0?a.first().trigger("mouseenter"):r.first().trigger("mouseenter")})},i.prototype.showLoading=function(e){this.hideLoading();var t=this.options.get("translations").get("searching"),i={disabled:!0,loading:!0,text:t(e)},n=this.option(i);n.className+=" loading-results",this.$results.prepend(n)},i.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},i.prototype.option=function(t){var i=document.createElement("li");i.className="select2-results__option";var n={role:"treeitem","aria-selected":"false"};t.disabled&&(delete n["aria-selected"],n["aria-disabled"]="true"),null==t.id&&delete n["aria-selected"],null!=t._resultId&&(i.id=t._resultId),t.title&&(i.title=t.title),t.children&&(n.role="group",n["aria-label"]=t.text,delete n["aria-selected"]);for(var r in n){var a=n[r];i.setAttribute(r,a)}if(t.children){var o=e(i),s=document.createElement("strong");s.className="select2-results__group",e(s),this.template(t,s);for(var l=[],u=0;u",{class:"select2-results__options select2-results__options--nested"});h.append(l),o.append(s),o.append(h)}else this.template(t,i);return e.data(i,"data",t),i},i.prototype.bind=function(t,i){var n=this,r=t.id+"-results";this.$results.attr("id",r),t.on("results:all",function(e){n.clear(),n.append(e.data),t.isOpen()&&n.setClasses()}),t.on("results:append",function(e){n.append(e.data),t.isOpen()&&n.setClasses()}),t.on("query",function(e){n.hideMessages(),n.showLoading(e)}),t.on("select",function(){t.isOpen()&&n.setClasses()}),t.on("unselect",function(){t.isOpen()&&n.setClasses()}),t.on("open",function(){n.$results.attr("aria-expanded","true"),n.$results.attr("aria-hidden","false"),n.setClasses(),n.ensureHighlightVisible()}),t.on("close",function(){n.$results.attr("aria-expanded","false"),n.$results.attr("aria-hidden","true"),n.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=n.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=n.getHighlightedResults();if(0!==e.length){var t=e.data("data");"true"==e.attr("aria-selected")?n.trigger("close",{}):n.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=n.getHighlightedResults(),t=n.$results.find("[aria-selected]"),i=t.index(e);if(0!==i){var r=i-1;0===e.length&&(r=0);var a=t.eq(r);a.trigger("mouseenter");var o=n.$results.offset().top,s=a.offset().top,l=n.$results.scrollTop()+(s-o);0===r?n.$results.scrollTop(0):0>s-o&&n.$results.scrollTop(l)}}),t.on("results:next",function(){var e=n.getHighlightedResults(),t=n.$results.find("[aria-selected]"),i=t.index(e),r=i+1;if(!(r>=t.length)){var a=t.eq(r);a.trigger("mouseenter");var o=n.$results.offset().top+n.$results.outerHeight(!1),s=a.offset().top+a.outerHeight(!1),l=n.$results.scrollTop()+s-o;0===r?n.$results.scrollTop(0):s>o&&n.$results.scrollTop(l)}}),t.on("results:focus",function(e){e.element.addClass("select2-results__option--highlighted")}),t.on("results:message",function(e){n.displayMessage(e)}),e.fn.mousewheel&&this.$results.on("mousewheel",function(e){var t=n.$results.scrollTop(),i=n.$results.get(0).scrollHeight-t+e.deltaY,r=e.deltaY>0&&t-e.deltaY<=0,a=e.deltaY<0&&i<=n.$results.height();r?(n.$results.scrollTop(0),e.preventDefault(),e.stopPropagation()):a&&(n.$results.scrollTop(n.$results.get(0).scrollHeight-n.$results.height()),e.preventDefault(),e.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(t){var i=e(this),r=i.data("data");return"true"===i.attr("aria-selected")?void(n.options.get("multiple")?n.trigger("unselect",{originalEvent:t,data:r}):n.trigger("close",{})):void n.trigger("select",{originalEvent:t,data:r})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(t){var i=e(this).data("data");n.getHighlightedResults().removeClass("select2-results__option--highlighted"),n.trigger("results:focus",{data:i,element:e(this)})})},i.prototype.getHighlightedResults=function(){var e=this.$results.find(".select2-results__option--highlighted");return e},i.prototype.destroy=function(){this.$results.remove()},i.prototype.ensureHighlightVisible=function(){var e=this.getHighlightedResults();if(0!==e.length){var t=this.$results.find("[aria-selected]"),i=t.index(e),n=this.$results.offset().top,r=e.offset().top,a=this.$results.scrollTop()+(r-n),o=r-n;a-=2*e.outerHeight(!1),2>=i?this.$results.scrollTop(0):(o>this.$results.outerHeight()||0>o)&&this.$results.scrollTop(a)}},i.prototype.template=function(t,i){var n=this.options.get("templateResult"),r=this.options.get("escapeMarkup"),a=n(t,i);null==a?i.style.display="none":"string"==typeof a?i.innerHTML=r(a):e(i).append(a)},i}),t.define("select2/keys",[],function(){var e={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return e}),t.define("select2/selection/base",["jquery","../utils","../keys"],function(e,t,i){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return t.Extend(n,t.Observable),n.prototype.render=function(){var t=e('');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),t.attr("title",this.$element.attr("title")),t.attr("tabindex",this._tabindex),this.$selection=t,t},n.prototype.bind=function(e,t){var n=this,r=(e.id+"-container",e.id+"-results");this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",r),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.focus(),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex)}),e.on("disable",function(){n.$selection.attr("tabindex","-1")})},n.prototype._handleBlur=function(t){var i=this;window.setTimeout(function(){document.activeElement==i.$selection[0]||e.contains(i.$selection[0],document.activeElement)||i.trigger("blur",t)},1)},n.prototype._attachCloseHandler=function(t){e(document.body).on("mousedown.select2."+t.id,function(t){var i=e(t.target),n=i.closest(".select2"),r=e(".select2.select2-container--open");r.each(function(){var t=e(this);if(this!=n[0]){var i=t.data("element");i.select2("close")}})})},n.prototype._detachCloseHandler=function(t){e(document.body).off("mousedown.select2."+t.id)},n.prototype.position=function(e,t){var i=t.find(".selection");i.append(e)},n.prototype.destroy=function(){this._detachCloseHandler(this.container)},n.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},n}),t.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,i,n){function r(){r.__super__.constructor.apply(this,arguments)}return i.Extend(r,t),r.prototype.render=function(){var e=r.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html(''),e},r.prototype.bind=function(e,t){var i=this;r.__super__.bind.apply(this,arguments);var n=e.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",n),this.$selection.attr("aria-labelledby",n),this.$selection.on("mousedown",function(e){1===e.which&&i.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),e.on("selection:update",function(e){i.update(e.data)})},r.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},r.prototype.display=function(e,t){var i=this.options.get("templateSelection"),n=this.options.get("escapeMarkup");return n(i(e,t))},r.prototype.selectionContainer=function(){return e("")},r.prototype.update=function(e){if(0===e.length)return void this.clear();var t=e[0],i=this.$selection.find(".select2-selection__rendered"),n=this.display(t,i);i.empty().append(n),i.prop("title",t.title||t.text)},r}),t.define("select2/selection/multiple",["jquery","./base","../utils"],function(e,t,i){function n(e,t){n.__super__.constructor.apply(this,arguments)}return i.Extend(n,t),n.prototype.render=function(){var e=n.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('
        '),e},n.prototype.bind=function(t,i){var r=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){r.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(t){if(!r.options.get("disabled")){var i=e(this),n=i.parent(),a=n.data("data");r.trigger("unselect",{originalEvent:t,data:a})}})},n.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},n.prototype.display=function(e,t){var i=this.options.get("templateSelection"),n=this.options.get("escapeMarkup");return n(i(e,t))},n.prototype.selectionContainer=function(){var t=e('
      • ×
      • ');return t},n.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n1;if(n||i)return e.call(this,t);this.clear();var r=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(r)},t}),t.define("select2/selection/allowClear",["jquery","../keys"],function(e,t){function i(){}return i.prototype.bind=function(e,t,i){var n=this;e.call(this,t,i),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(e){n._handleClear(e)}),t.on("keypress",function(e){n._handleKeyboardClear(e,t)})},i.prototype._handleClear=function(e,t){if(!this.options.get("disabled")){var i=this.$selection.find(".select2-selection__clear");if(0!==i.length){t.stopPropagation();for(var n=i.data("data"),r=0;r0||0===i.length)){var n=e('×');n.data("data",i),this.$selection.find(".select2-selection__rendered").prepend(n)}},i}),t.define("select2/selection/search",["jquery","../utils","../keys"],function(e,t,i){function n(e,t,i){e.call(this,t,i)}return n.prototype.render=function(t){var i=e('');this.$searchContainer=i,this.$search=i.find("input");var n=t.call(this);return this._transferTabIndex(),n},n.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("open",function(){r.$search.trigger("focus")}),t.on("close",function(){r.$search.val(""),r.$search.removeAttr("aria-activedescendant"),r.$search.trigger("focus")}),t.on("enable",function(){r.$search.prop("disabled",!1),r._transferTabIndex()}),t.on("disable",function(){r.$search.prop("disabled",!0)}),t.on("focus",function(e){r.$search.trigger("focus")}),t.on("results:focus",function(e){r.$search.attr("aria-activedescendant",e.id)}),this.$selection.on("focusin",".select2-search--inline",function(e){r.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){r._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){e.stopPropagation(),r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented();var t=e.which;if(t===i.BACKSPACE&&""===r.$search.val()){var n=r.$searchContainer.prev(".select2-selection__choice");if(n.length>0){var a=n.data("data");r.searchRemoveChoice(a),e.preventDefault()}}});var a=document.documentMode,o=a&&11>=a;this.$selection.on("input.searchcheck",".select2-search--inline",function(e){return o?void r.$selection.off("input.search input.searchcheck"):void r.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(e){if(o&&"input"===e.type)return void r.$selection.off("input.search input.searchcheck");var t=e.which;t!=i.SHIFT&&t!=i.CTRL&&t!=i.ALT&&t!=i.TAB&&r.handleSearch(e)})},n.prototype._transferTabIndex=function(e){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},n.prototype.createPlaceholder=function(e,t){this.$search.attr("placeholder",t.text)},n.prototype.update=function(e,t){var i=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),e.call(this,t),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),i&&this.$search.focus()},n.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var e=this.$search.val();this.trigger("query",{term:e})}this._keyUpPrevented=!1},n.prototype.searchRemoveChoice=function(e,t){this.trigger("unselect",{data:t}),this.$search.val(t.text),this.handleSearch()},n.prototype.resizeSearch=function(){this.$search.css("width","25px");var e="";if(""!==this.$search.attr("placeholder"))e=this.$selection.find(".select2-selection__rendered").innerWidth();else{var t=this.$search.val().length+1;e=.75*t+"em"}this.$search.css("width",e)},n}),t.define("select2/selection/eventRelay",["jquery"],function(e){function t(){}return t.prototype.bind=function(t,i,n){var r=this,a=["open","opening","close","closing","select","selecting","unselect","unselecting"],o=["opening","closing","selecting","unselecting"];t.call(this,i,n),i.on("*",function(t,i){if(-1!==e.inArray(t,a)){i=i||{};var n=e.Event("select2:"+t,{params:i});r.$element.trigger(n),-1!==e.inArray(t,o)&&(i.prevented=n.isDefaultPrevented())}})},t}),t.define("select2/translation",["jquery","require"],function(e,t){function i(e){this.dict=e||{}}return i.prototype.all=function(){return this.dict},i.prototype.get=function(e){return this.dict[e]},i.prototype.extend=function(t){this.dict=e.extend({},t.all(),this.dict)},i._cache={},i.loadPath=function(e){if(!(e in i._cache)){var n=t(e);i._cache[e]=n}return new i(i._cache[e])},i}),t.define("select2/diacritics",[],function(){var e={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return e}),t.define("select2/data/base",["../utils"],function(e){function t(e,i){t.__super__.constructor.call(this)}return e.Extend(t,e.Observable),t.prototype.current=function(e){throw new Error("The `current` method must be defined in child classes.")},t.prototype.query=function(e,t){throw new Error("The `query` method must be defined in child classes.")},t.prototype.bind=function(e,t){},t.prototype.destroy=function(){},t.prototype.generateResultId=function(t,i){var n=t.id+"-result-";return n+=e.generateChars(4),n+=null!=i.id?"-"+i.id.toString():"-"+e.generateChars(4)},t}),t.define("select2/data/select",["./base","../utils","jquery"],function(e,t,i){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return t.Extend(n,e),n.prototype.current=function(e){var t=[],n=this;this.$element.find(":selected").each(function(){var e=i(this),r=n.item(e);t.push(r)}),e(t)},n.prototype.select=function(e){var t=this;if(e.selected=!0,i(e.element).is("option"))return e.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(n){var r=[];e=[e],e.push.apply(e,n);for(var a=0;a=0){var c=a.filter(n(u)),d=this.item(c),h=i.extend(!0,{},u,d),p=this.option(h);c.replaceWith(p)}else{var f=this.option(u);if(u.children){var m=this.convertToOptions(u.children);t.appendMany(f,m)}s.push(f)}}return s},n}),t.define("select2/data/ajax",["./array","../utils","jquery"],function(e,t,i){function n(e,t){this.ajaxOptions=this._applyDefaults(t.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),n.__super__.constructor.call(this,e,t)}return t.Extend(n,e),n.prototype._applyDefaults=function(e){var t={data:function(e){return i.extend({},e,{q:e.term})},transport:function(e,t,n){var r=i.ajax(e);return r.then(t),r.fail(n),r}};return i.extend({},t,e,!0)},n.prototype.processResults=function(e){return e},n.prototype.query=function(e,t){function n(){var n=a.transport(a,function(n){var a=r.processResults(n,e);r.options.get("debug")&&window.console&&console.error&&(a&&a.results&&i.isArray(a.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),t(a)},function(){r.trigger("results:message",{message:"errorLoading"})});r._request=n}var r=this;null!=this._request&&(i.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var a=i.extend({type:"GET"},this.ajaxOptions);"function"==typeof a.url&&(a.url=a.url.call(this.$element,e)),"function"==typeof a.data&&(a.data=a.data.call(this.$element,e)),this.ajaxOptions.delay&&""!==e.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(n,this.ajaxOptions.delay)):n()},n}),t.define("select2/data/tags",["jquery"],function(e){function t(t,i,n){var r=n.get("tags"),a=n.get("createTag");void 0!==a&&(this.createTag=a);var o=n.get("insertTag");if(void 0!==o&&(this.insertTag=o),t.call(this,i,n),e.isArray(r))for(var s=0;s0&&t.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):void e.call(this,t,i)},e}),t.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,i){this.maximumSelectionLength=i.get("maximumSelectionLength"),e.call(this,t,i)}return e.prototype.query=function(e,t,i){var n=this;this.current(function(r){var a=null!=r?r.length:0;return n.maximumSelectionLength>0&&a>=n.maximumSelectionLength?void n.trigger("results:message",{message:"maximumSelected",args:{maximum:n.maximumSelectionLength}}):void e.call(n,t,i)})},e}),t.define("select2/dropdown",["jquery","./utils"],function(e,t){function i(e,t){this.$element=e,this.options=t,i.__super__.constructor.call(this)}return t.Extend(i,t.Observable),i.prototype.render=function(){var t=e('');return t.attr("dir",this.options.get("dir")),this.$dropdown=t,t},i.prototype.bind=function(){},i.prototype.position=function(e,t){},i.prototype.destroy=function(){this.$dropdown.remove()},i}),t.define("select2/dropdown/search",["jquery","../utils"],function(e,t){function i(){}return i.prototype.render=function(t){var i=t.call(this),n=e('');return this.$searchContainer=n,this.$search=n.find("input"),i.prepend(n),i},i.prototype.bind=function(t,i,n){var r=this;t.call(this,i,n),this.$search.on("keydown",function(e){r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(t){e(this).off("keyup")}),this.$search.on("keyup input",function(e){r.handleSearch(e)}),i.on("open",function(){r.$search.attr("tabindex",0),r.$search.focus(),window.setTimeout(function(){r.$search.focus()},0)}),i.on("close",function(){r.$search.attr("tabindex",-1),r.$search.val("")}),i.on("results:all",function(e){if(null==e.query.term||""===e.query.term){var t=r.showSearch(e);t?r.$searchContainer.removeClass("select2-search--hide"):r.$searchContainer.addClass("select2-search--hide")}})},i.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},i.prototype.showSearch=function(e,t){return!0},i}),t.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,i,n){this.placeholder=this.normalizePlaceholder(i.get("placeholder")),e.call(this,t,i,n)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var i=t.slice(0),n=t.length-1;n>=0;n--){var r=t[n];this.placeholder.id===r.id&&i.splice(n,1)}return i},e}),t.define("select2/dropdown/infiniteScroll",["jquery"],function(e){function t(e,t,i,n){this.lastParams={},e.call(this,t,i,n),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return t.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&this.$results.append(this.$loadingMore)},t.prototype.bind=function(t,i,n){var r=this;t.call(this,i,n),i.on("query",function(e){r.lastParams=e,r.loading=!0}),i.on("query:append",function(e){r.lastParams=e,r.loading=!0}),this.$results.on("scroll",function(){var t=e.contains(document.documentElement,r.$loadingMore[0]);if(!r.loading&&t){var i=r.$results.offset().top+r.$results.outerHeight(!1),n=r.$loadingMore.offset().top+r.$loadingMore.outerHeight(!1);i+50>=n&&r.loadMore()}})},t.prototype.loadMore=function(){this.loading=!0;var t=e.extend({},{page:1},this.lastParams);t.page++,this.trigger("query:append",t)},t.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},t.prototype.createLoadingMore=function(){var t=e('
      • '),i=this.options.get("translations").get("loadingMore");return t.html(i(this.lastParams)),t},t}),t.define("select2/dropdown/attachBody",["jquery","../utils"],function(e,t){function i(t,i,n){this.$dropdownParent=n.get("dropdownParent")||e(document.body),t.call(this,i,n)}return i.prototype.bind=function(e,t,i){var n=this,r=!1;e.call(this,t,i),t.on("open",function(){n._showDropdown(),n._attachPositioningHandler(t),r||(r=!0,t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}))}),t.on("close",function(){n._hideDropdown(),n._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},i.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},i.prototype.position=function(e,t,i){t.attr("class",i.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=i},i.prototype.render=function(t){var i=e(""),n=t.call(this);return i.append(n),this.$dropdownContainer=i,i},i.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},i.prototype._attachPositioningHandler=function(i,n){var r=this,a="scroll.select2."+n.id,o="resize.select2."+n.id,s="orientationchange.select2."+n.id,l=this.$container.parents().filter(t.hasScroll);l.each(function(){e(this).data("select2-scroll-position",{x:e(this).scrollLeft(),y:e(this).scrollTop()})}),l.on(a,function(t){var i=e(this).data("select2-scroll-position");e(this).scrollTop(i.y)}),e(window).on(a+" "+o+" "+s,function(e){r._positionDropdown(),r._resizeDropdown()})},i.prototype._detachPositioningHandler=function(i,n){var r="scroll.select2."+n.id,a="resize.select2."+n.id,o="orientationchange.select2."+n.id,s=this.$container.parents().filter(t.hasScroll);s.off(r),e(window).off(r+" "+a+" "+o)},i.prototype._positionDropdown=function(){var t=e(window),i=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),r=null,a=this.$container.offset();a.bottom=a.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=a.top,o.bottom=a.top+o.height;var s={height:this.$dropdown.outerHeight(!1)},l={top:t.scrollTop(),bottom:t.scrollTop()+t.height()},u=l.topa.bottom+s.height,d={left:a.left,top:o.bottom},h=this.$dropdownParent;"static"===h.css("position")&&(h=h.offsetParent());var p=h.offset();d.top-=p.top,d.left-=p.left,i||n||(r="below"),c||!u||i?!u&&c&&i&&(r="below"):r="above",("above"==r||i&&"below"!==r)&&(d.top=o.top-s.height),null!=r&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+r),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+r)),this.$dropdownContainer.css(d)},i.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.width="auto"),this.$dropdown.css(e)},i.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},i}),t.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(t){for(var i=0,n=0;n0&&(d.dataAdapter=u.Decorate(d.dataAdapter,v)),d.maximumInputLength>0&&(d.dataAdapter=u.Decorate(d.dataAdapter,y)),d.maximumSelectionLength>0&&(d.dataAdapter=u.Decorate(d.dataAdapter,b)),d.tags&&(d.dataAdapter=u.Decorate(d.dataAdapter,m)),(null!=d.tokenSeparators||null!=d.tokenizer)&&(d.dataAdapter=u.Decorate(d.dataAdapter,g)),null!=d.query){var $=t(d.amdBase+"compat/query");d.dataAdapter=u.Decorate(d.dataAdapter,$)}if(null!=d.initSelection){var D=t(d.amdBase+"compat/initSelection");d.dataAdapter=u.Decorate(d.dataAdapter,D)}}if(null==d.resultsAdapter&&(d.resultsAdapter=i,null!=d.ajax&&(d.resultsAdapter=u.Decorate(d.resultsAdapter,j)), -null!=d.placeholder&&(d.resultsAdapter=u.Decorate(d.resultsAdapter,x)),d.selectOnClose&&(d.resultsAdapter=u.Decorate(d.resultsAdapter,S))),null==d.dropdownAdapter){if(d.multiple)d.dropdownAdapter=w;else{var T=u.Decorate(w,_);d.dropdownAdapter=T}if(0!==d.minimumResultsForSearch&&(d.dropdownAdapter=u.Decorate(d.dropdownAdapter,k)),d.closeOnSelect&&(d.dropdownAdapter=u.Decorate(d.dropdownAdapter,Q)),null!=d.dropdownCssClass||null!=d.dropdownCss||null!=d.adaptDropdownCssClass){var O=t(d.amdBase+"compat/dropdownCss");d.dropdownAdapter=u.Decorate(d.dropdownAdapter,O)}d.dropdownAdapter=u.Decorate(d.dropdownAdapter,C)}if(null==d.selectionAdapter){if(d.multiple?d.selectionAdapter=r:d.selectionAdapter=n,null!=d.placeholder&&(d.selectionAdapter=u.Decorate(d.selectionAdapter,a)),d.allowClear&&(d.selectionAdapter=u.Decorate(d.selectionAdapter,o)),d.multiple&&(d.selectionAdapter=u.Decorate(d.selectionAdapter,s)),null!=d.containerCssClass||null!=d.containerCss||null!=d.adaptContainerCssClass){var A=t(d.amdBase+"compat/containerCss");d.selectionAdapter=u.Decorate(d.selectionAdapter,A)}d.selectionAdapter=u.Decorate(d.selectionAdapter,l)}if("string"==typeof d.language)if(d.language.indexOf("-")>0){var M=d.language.split("-"),E=M[0];d.language=[d.language,E]}else d.language=[d.language];if(e.isArray(d.language)){var I=new c;d.language.push("en");for(var P=d.language,L=0;L0){for(var a=e.extend(!0,{},r),o=r.children.length-1;o>=0;o--){var s=r.children[o],l=i(n,s);null==l&&a.children.splice(o,1)}return a.children.length>0?a:i(n,a)}var u=t(r.text).toUpperCase(),c=t(n.term).toUpperCase();return u.indexOf(c)>-1?r:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:u.escapeMarkup,language:$,matcher:i,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(e){return e},templateResult:function(e){return e.text},templateSelection:function(e){return e.text},theme:"default",width:"resolve"}},D.prototype.set=function(t,i){var n=e.camelCase(t),r={};r[n]=i;var a=u._convertData(r);e.extend(this.defaults,a)};var T=new D;return T}),t.define("select2/options",["require","jquery","./defaults","./utils"],function(e,t,i,n){function r(t,r){if(this.options=t,null!=r&&this.fromElement(r),this.options=i.apply(this.options),r&&r.is("input")){var a=e(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=n.Decorate(this.options.dataAdapter,a)}}return r.prototype.fromElement=function(e){var i=["select2"];null==this.options.multiple&&(this.options.multiple=e.prop("multiple")),null==this.options.disabled&&(this.options.disabled=e.prop("disabled")),null==this.options.language&&(e.prop("lang")?this.options.language=e.prop("lang").toLowerCase():e.closest("[lang]").prop("lang")&&(this.options.language=e.closest("[lang]").prop("lang"))),null==this.options.dir&&(e.prop("dir")?this.options.dir=e.prop("dir"):e.closest("[dir]").prop("dir")?this.options.dir=e.closest("[dir]").prop("dir"):this.options.dir="ltr"),e.prop("disabled",this.options.disabled),e.prop("multiple",this.options.multiple),e.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),e.data("data",e.data("select2Tags")),e.data("tags",!0)),e.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),e.attr("ajax--url",e.data("ajaxUrl")),e.data("ajax--url",e.data("ajaxUrl")));var r={};r=t.fn.jquery&&"1."==t.fn.jquery.substr(0,2)&&e[0].dataset?t.extend(!0,{},e[0].dataset,e.data()):e.data();var a=t.extend(!0,{},r);a=n._convertData(a);for(var o in a)t.inArray(o,i)>-1||(t.isPlainObject(this.options[o])?t.extend(this.options[o],a[o]):this.options[o]=a[o]);return this},r.prototype.get=function(e){return this.options[e]},r.prototype.set=function(e,t){this.options[e]=t},r}),t.define("select2/core",["jquery","./options","./utils","./keys"],function(e,t,i,n){var r=function(e,i){null!=e.data("select2")&&e.data("select2").destroy(),this.$element=e,this.id=this._generateId(e),i=i||{},this.options=new t(i,e),r.__super__.constructor.call(this);var n=e.attr("tabindex")||0;e.data("old-tabindex",n),e.attr("tabindex","-1");var a=this.options.get("dataAdapter");this.dataAdapter=new a(e,this.options);var o=this.render();this._placeContainer(o);var s=this.options.get("selectionAdapter");this.selection=new s(e,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,o);var l=this.options.get("dropdownAdapter");this.dropdown=new l(e,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,o);var u=this.options.get("resultsAdapter");this.results=new u(e,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var c=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(e){c.trigger("selection:update",{data:e})}),e.addClass("select2-hidden-accessible"),e.attr("aria-hidden","true"),this._syncAttributes(),e.data("select2",this)};return i.Extend(r,i.Observable),r.prototype._generateId=function(e){var t="";return t=null!=e.attr("id")?e.attr("id"):null!=e.attr("name")?e.attr("name")+"-"+i.generateChars(2):i.generateChars(4),t=t.replace(/(:|\.|\[|\]|,)/g,""),t="select2-"+t},r.prototype._placeContainer=function(e){e.insertAfter(this.$element);var t=this._resolveWidth(this.$element,this.options.get("width"));null!=t&&e.css("width",t)},r.prototype._resolveWidth=function(e,t){var i=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==t){var n=this._resolveWidth(e,"style");return null!=n?n:this._resolveWidth(e,"element")}if("element"==t){var r=e.outerWidth(!1);return 0>=r?"auto":r+"px"}if("style"==t){var a=e.attr("style");if("string"!=typeof a)return null;for(var o=a.split(";"),s=0,l=o.length;l>s;s+=1){var u=o[s].replace(/\s/g,""),c=u.match(i);if(null!==c&&c.length>=1)return c[1]}return null}return t},r.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},r.prototype._registerDomEvents=function(){var t=this;this.$element.on("change.select2",function(){t.dataAdapter.current(function(e){t.trigger("selection:update",{data:e})})}),this._sync=i.bind(this._syncAttributes,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._sync);var n=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=n?(this._observer=new n(function(i){e.each(i,t._sync)}),this._observer.observe(this.$element[0],{attributes:!0,subtree:!1})):this.$element[0].addEventListener&&this.$element[0].addEventListener("DOMAttrModified",t._sync,!1)},r.prototype._registerDataEvents=function(){var e=this;this.dataAdapter.on("*",function(t,i){e.trigger(t,i)})},r.prototype._registerSelectionEvents=function(){var t=this,i=["toggle","focus"];this.selection.on("toggle",function(){t.toggleDropdown()}),this.selection.on("focus",function(e){t.focus(e)}),this.selection.on("*",function(n,r){-1===e.inArray(n,i)&&t.trigger(n,r)})},r.prototype._registerDropdownEvents=function(){var e=this;this.dropdown.on("*",function(t,i){e.trigger(t,i)})},r.prototype._registerResultsEvents=function(){var e=this;this.results.on("*",function(t,i){e.trigger(t,i)})},r.prototype._registerEvents=function(){var e=this;this.on("open",function(){e.$container.addClass("select2-container--open")}),this.on("close",function(){e.$container.removeClass("select2-container--open")}),this.on("enable",function(){e.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){e.$container.addClass("select2-container--disabled")}),this.on("blur",function(){e.$container.removeClass("select2-container--focus")}),this.on("query",function(t){e.isOpen()||e.trigger("open",{}),this.dataAdapter.query(t,function(i){e.trigger("results:all",{data:i,query:t})})}),this.on("query:append",function(t){this.dataAdapter.query(t,function(i){e.trigger("results:append",{data:i,query:t})})}),this.on("keypress",function(t){var i=t.which;e.isOpen()?i===n.ESC||i===n.TAB||i===n.UP&&t.altKey?(e.close(),t.preventDefault()):i===n.ENTER?(e.trigger("results:select",{}),t.preventDefault()):i===n.SPACE&&t.ctrlKey?(e.trigger("results:toggle",{}),t.preventDefault()):i===n.UP?(e.trigger("results:previous",{}),t.preventDefault()):i===n.DOWN&&(e.trigger("results:next",{}),t.preventDefault()):(i===n.ENTER||i===n.SPACE||i===n.DOWN&&t.altKey)&&(e.open(),t.preventDefault())})},r.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},r.prototype.trigger=function(e,t){var i=r.__super__.trigger,n={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===t&&(t={}),e in n){var a=n[e],o={prevented:!1,name:e,args:t};if(i.call(this,a,o),o.prevented)return void(t.prevented=!0)}i.call(this,e,t)},r.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},r.prototype.open=function(){this.isOpen()||this.trigger("query",{})},r.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},r.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},r.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},r.prototype.focus=function(e){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},r.prototype.enable=function(e){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==e||0===e.length)&&(e=[!0]);var t=!e[0];this.$element.prop("disabled",t)},r.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var e=[];return this.dataAdapter.current(function(t){e=t}),e},r.prototype.val=function(t){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==t||0===t.length)return this.$element.val();var i=t[0];e.isArray(i)&&(i=e.map(i,function(e){return e.toString()})),this.$element.val(i).trigger("change")},r.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._sync),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&this.$element[0].removeEventListener("DOMAttrModified",this._sync,!1),this._sync=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},r.prototype.render=function(){var t=e('');return t.attr("dir",this.options.get("dir")),this.$container=t,this.$container.addClass("select2-container--"+this.options.get("theme")),t.data("element",this.$element),t},r}),t.define("select2/compat/utils",["jquery"],function(e){function t(t,i,n){var r,a,o=[];r=e.trim(t.attr("class")),r&&(r=""+r,e(r.split(/\s+/)).each(function(){0===this.indexOf("select2-")&&o.push(this)})),r=e.trim(i.attr("class")),r&&(r=""+r,e(r.split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&(a=n(this),null!=a&&o.push(a))})),t.attr("class",o.join(" "))}return{syncCssClasses:t}}),t.define("select2/compat/containerCss",["jquery","./utils"],function(e,t){function i(e){return null}function n(){}return n.prototype.render=function(n){var r=n.call(this),a=this.options.get("containerCssClass")||"";e.isFunction(a)&&(a=a(this.$element));var o=this.options.get("adaptContainerCssClass");if(o=o||i,-1!==a.indexOf(":all:")){a=a.replace(":all:","");var s=o;o=function(e){var t=s(e);return null!=t?t+" "+e:e}}var l=this.options.get("containerCss")||{};return e.isFunction(l)&&(l=l(this.$element)),t.syncCssClasses(r,this.$element,o),r.css(l),r.addClass(a),r},n}),t.define("select2/compat/dropdownCss",["jquery","./utils"],function(e,t){function i(e){return null}function n(){}return n.prototype.render=function(n){var r=n.call(this),a=this.options.get("dropdownCssClass")||"";e.isFunction(a)&&(a=a(this.$element));var o=this.options.get("adaptDropdownCssClass");if(o=o||i,-1!==a.indexOf(":all:")){a=a.replace(":all:","");var s=o;o=function(e){var t=s(e);return null!=t?t+" "+e:e}}var l=this.options.get("dropdownCss")||{};return e.isFunction(l)&&(l=l(this.$element)),t.syncCssClasses(r,this.$element,o),r.css(l),r.addClass(a),r},n}),t.define("select2/compat/initSelection",["jquery"],function(e){function t(e,t,i){i.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=i.get("initSelection"),this._isInitialized=!1,e.call(this,t,i)}return t.prototype.current=function(t,i){var n=this;return this._isInitialized?void t.call(this,i):void this.initSelection.call(null,this.$element,function(t){n._isInitialized=!0,e.isArray(t)||(t=[t]),i(t)})},t}),t.define("select2/compat/inputData",["jquery"],function(e){function t(e,t,i){this._currentData=[],this._valueSeparator=i.get("valueSeparator")||",","hidden"===t.prop("type")&&i.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `").get(0).files,r.formdata=void 0!==window.FormData;var a=!!e.fn.prop;e.fn.attr2=function(){if(!a)return this.attr.apply(this,arguments);var e=this.prop.apply(this,arguments);return e&&e.jquery||"string"==typeof e?e:this.attr.apply(this,arguments)},e.fn.ajaxSubmit=function(t){function i(i){var n,r,a=e.param(i,t.traditional).split("&"),o=a.length,s=[];for(n=0;n').val(h.extraData[p].value).appendTo(j)[0]):c.push(e('').val(h.extraData[p]).appendTo(j)[0]));h.iframeTarget||g.appendTo("body"),v.attachEvent?v.attachEvent("onload",s):v.addEventListener("load",s,!1),setTimeout(t,15);try{j.submit()}catch(e){var m=document.createElement("form").submit;m.apply(j)}}finally{j.setAttribute("action",a),j.setAttribute("enctype",u),i?j.setAttribute("target",i):d.removeAttr("target"),e(c).remove()}}function s(t){if(!y.aborted&&!O){if(T=r(v),T||(n("cannot access response document"),t=S),t===k&&y)return y.abort("timeout"),void C.reject(y,"timeout");if(t==S&&y)return y.abort("server abort"),void C.reject(y,"error","server abort");if(T&&T.location.href!=h.iframeSrc||_){v.detachEvent?v.detachEvent("onload",s):v.removeEventListener("load",s,!1);var i,a="success";try{if(_)throw"timeout";var o="xml"==h.dataType||T.XMLDocument||e.isXMLDoc(T);if(n("isXml="+o),!o&&window.opera&&(null===T.body||!T.body.innerHTML)&&--A)return n("requeing onLoad callback, DOM not available"),void setTimeout(s,250);var l=T.body?T.body:T.documentElement;y.responseText=l?l.innerHTML:null,y.responseXML=T.XMLDocument?T.XMLDocument:T,o&&(h.dataType="xml"),y.getResponseHeader=function(e){var t={"content-type":h.dataType};return t[e.toLowerCase()]},l&&(y.status=Number(l.getAttribute("status"))||y.status,y.statusText=l.getAttribute("statusText")||y.statusText);var u=(h.dataType||"").toLowerCase(),c=/(json|script|text)/.test(u);if(c||h.textarea){var d=T.getElementsByTagName("textarea")[0];if(d)y.responseText=d.value,y.status=Number(d.getAttribute("status"))||y.status,y.statusText=d.getAttribute("statusText")||y.statusText;else if(c){var f=T.getElementsByTagName("pre")[0],m=T.getElementsByTagName("body")[0];f?y.responseText=f.textContent?f.textContent:f.innerText:m&&(y.responseText=m.textContent?m.textContent:m.innerText)}}else"xml"==u&&!y.responseXML&&y.responseText&&(y.responseXML=M(y.responseText));try{D=I(y,u,h)}catch(e){a="parsererror",y.error=i=e||a}}catch(e){n("error caught: ",e), -a="error",y.error=i=e||a}y.aborted&&(n("upload aborted"),a=null),y.status&&(a=y.status>=200&&y.status<300||304===y.status?"success":"error"),"success"===a?(h.success&&h.success.call(h.context,D,"success",y),C.resolve(y.responseText,"success",y),p&&e.event.trigger("ajaxSuccess",[y,h])):a&&(void 0===i&&(i=y.statusText),h.error&&h.error.call(h.context,y,a,i),C.reject(y,"error",i),p&&e.event.trigger("ajaxError",[y,h,i])),p&&e.event.trigger("ajaxComplete",[y,h]),p&&!--e.active&&e.event.trigger("ajaxStop"),h.complete&&h.complete.call(h.context,y,a),O=!0,h.timeout&&clearTimeout(x),setTimeout(function(){h.iframeTarget?g.attr("src",h.iframeSrc):g.remove(),y.responseXML=null},100)}}}var u,c,h,p,f,g,v,y,b,w,_,x,j=d[0],C=e.Deferred();if(C.abort=function(e){y.abort(e)},i)for(c=0;c'),g.css({position:"absolute",top:"-1000px",left:"-1000px"})),v=g[0],y={aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(t){var i="timeout"===t?"timeout":"aborted";n("aborting upload... "+i),this.aborted=1;try{v.contentWindow.document.execCommand&&v.contentWindow.document.execCommand("Stop")}catch(e){}g.attr("src",h.iframeSrc),y.error=i,h.error&&h.error.call(h.context,y,i,t),p&&e.event.trigger("ajaxError",[y,h,i]),h.complete&&h.complete.call(h.context,y,i)}},p=h.global,p&&0===e.active++&&e.event.trigger("ajaxStart"),p&&e.event.trigger("ajaxSend",[y,h]),h.beforeSend&&h.beforeSend.call(h.context,y,h)===!1)return h.global&&e.active--,C.reject(),C;if(y.aborted)return C.reject(),C;b=j.clk,b&&(w=b.name,w&&!b.disabled&&(h.extraData=h.extraData||{},h.extraData[w]=b.value,"image"==b.type&&(h.extraData[w+".x"]=j.clk_x,h.extraData[w+".y"]=j.clk_y)));var k=1,S=2,Q=e("meta[name=csrf-token]").attr("content"),$=e("meta[name=csrf-param]").attr("content");$&&Q&&(h.extraData=h.extraData||{},h.extraData[$]=Q),h.forceSync?o():setTimeout(o,10);var D,T,O,A=50,M=e.parseXML||function(e,t){return window.ActiveXObject?(t=new ActiveXObject("Microsoft.XMLDOM"),t.async="false",t.loadXML(e)):t=(new DOMParser).parseFromString(e,"text/xml"),t&&t.documentElement&&"parsererror"!=t.documentElement.nodeName?t:null},E=e.parseJSON||function(e){return window.eval("("+e+")")},I=function(t,i,n){var r=t.getResponseHeader("content-type")||"",a="xml"===i||!i&&r.indexOf("xml")>=0,o=a?t.responseXML:t.responseText;return a&&"parsererror"===o.documentElement.nodeName&&e.error&&e.error("parsererror"),n&&n.dataFilter&&(o=n.dataFilter(o,i)),"string"==typeof o&&("json"===i||!i&&r.indexOf("json")>=0?o=E(o):("script"===i||!i&&r.indexOf("javascript")>=0)&&e.globalEval(o)),o};return C}if(!this.length)return n("ajaxSubmit: skipping submit process - no element selected"),this;var l,u,c,d=this;"function"==typeof t?t={success:t}:void 0===t&&(t={}),l=t.type||this.attr2("method"),u=t.url||this.attr2("action"),c="string"==typeof u?e.trim(u):"",c=c||window.location.href||"",c&&(c=(c.match(/^([^#]+)/)||[])[1]),t=e.extend(!0,{url:c,success:e.ajaxSettings.success,type:l||e.ajaxSettings.type,iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},t);var h={};if(this.trigger("form-pre-serialize",[this,t,h]),h.veto)return n("ajaxSubmit: submit vetoed via form-pre-serialize trigger"),this;if(t.beforeSerialize&&t.beforeSerialize(this,t)===!1)return n("ajaxSubmit: submit aborted via beforeSerialize callback"),this;var p=t.traditional;void 0===p&&(p=e.ajaxSettings.traditional);var f,m=[],g=this.formToArray(t.semantic,m);if(t.data&&(t.extraData=t.data,f=e.param(t.data,p)),t.beforeSubmit&&t.beforeSubmit(g,this,t)===!1)return n("ajaxSubmit: submit aborted via beforeSubmit callback"),this;if(this.trigger("form-submit-validate",[g,this,t,h]),h.veto)return n("ajaxSubmit: submit vetoed via form-submit-validate trigger"),this;var v=e.param(g,p);f&&(v=v?v+"&"+f:f),"GET"==t.type.toUpperCase()?(t.url+=(t.url.indexOf("?")>=0?"&":"?")+v,t.data=null):t.data=v;var y=[];if(t.resetForm&&y.push(function(){d.resetForm()}),t.clearForm&&y.push(function(){d.clearForm(t.includeHidden)}),!t.dataType&&t.target){var b=t.success||function(){};y.push(function(i){var n=t.replaceTarget?"replaceWith":"html";e(t.target)[n](i).each(b,arguments)})}else t.success&&y.push(t.success);if(t.success=function(e,i,n){for(var r=t.context||this,a=0,o=y.length;a0,C="multipart/form-data",k=d.attr("enctype")==C||d.attr("encoding")==C,S=r.fileapi&&r.formdata;n("fileAPI :"+S);var Q,$=(j||k)&&!S;t.iframe!==!1&&(t.iframe||$)?t.closeKeepAlive?e.get(t.closeKeepAlive,function(){Q=s(g)}):Q=s(g):Q=(j||k)&&S?o(g):e.ajax(t),d.removeData("jqxhr").data("jqxhr",Q);for(var D=0;D").get(0).files,t.formdata=void 0!==window.FormData,e.fn.uploadFile=function(i){function n(){h.afterUploadAll&&!g&&(g=!0,function e(){0!=f.sCounter&&f.sCounter+f.fCounter==f.tCounter?(h.afterUploadAll(f),g=!1):window.setTimeout(e,100)}())}function r(t,i,n){n.on("dragenter",function(t){t.stopPropagation(),t.preventDefault(),e(this).css("border","2px dashed #ddd")}),n.on("dragover",function(e){e.stopPropagation(),e.preventDefault()}),n.on("drop",function(n){e(this).css("border","2px dashed #ddd"),n.preventDefault(),t.errorLog.html("");var r=n.originalEvent.dataTransfer.files;return!i.multiple&&r.length>1?void(i.showError&&e("
        "+i.multiDragErrorStr+"
        ").appendTo(t.errorLog)):void(0!=i.onSelect(r)&&o(i,t,r))}),e(document).on("dragenter",function(e){e.stopPropagation(),e.preventDefault()}),e(document).on("dragover",function(e){e.stopPropagation(),e.preventDefault(),n.css("border","2px dashed #ddd")}),e(document).on("drop",function(e){e.stopPropagation(),e.preventDefault(),n.css("border","2px dashed #ddd")})}function a(t){var i=[];i="string"==jQuery.type(t)?t.split("&"):e.param(t).split("&");var n,r,a=i.length,o=[];for(n=0;nt.maxFileSize)t.showError&&e("
        "+t.sizeErrorStr+"
        ").appendTo(i.errorLog);else if(t.maxFileCount!=-1&&i.selectedFiles>=t.maxFileCount)t.showError&&e("
        "+t.maxFileCountErrorStr+"
        ").appendTo(i.errorLog);else{i.selectedFiles++;var o=t,l=new FormData,u=t.fileName.replace("[]","");l.append(u,n[r]);var h=t.formData;if(h)for(var p=a(h),f=0;f");v.appendTo("body");var y=[];y.push(n[r].name),d(v,o,m,y,i),i.fileCounter++}else t.showError&&e("
        "+t.extErrorStr+"
        ").appendTo(i.errorLog)}function s(e,t,i){var n=t.allowedTypes.toLowerCase().split(","),r=i.split(".").pop().toLowerCase();return!("*"!=t.allowedTypes&&jQuery.inArray(r,n)<0)}function l(t,i){if(t.showFileCounter){var n=e(".upload-filename").length;i.fileCounter=n+1,e(".upload-filename").each(function(i,r){var a=e(this).html().split(t.fileCounterStyle),o=(parseInt(a[0])-1,n+t.fileCounterStyle+a[1]);e(this).html(o),n--})}}function u(i,n,r,a){var h="ajax-upload-id-"+(new Date).getTime(),p=e("
        "),f="";r.multiple&&(r.fileName.indexOf("[]")!=r.fileName.length-2&&(r.fileName+="[]"),f="");var m=e(f).appendTo(p);m.change(function(){i.errorLog.html("");var h=(r.allowedTypes.toLowerCase().split(","),[]);if(this.files){for(y=0;y"+r.extErrorStr+"").appendTo(i.errorLog));if(m.push({name:f,size:"NA"}),0==r.onSelect(m))return}if(l(r,i),a.unbind("click"),p.hide(),u(i,n,r,a),p.addClass(n),t.fileapi&&t.formdata){p.removeClass(n);var g=this.files;o(r,i,g)}else{for(var v="",y=0;y":h[y]+"
        ",i.fileCounter++;if(r.maxFileCount!=-1&&i.selectedFiles+h.length>r.maxFileCount)return void(r.showError&&e("
        "+r.maxFileCountErrorStr+"
        ").appendTo(i.errorLog));i.selectedFiles+=h.length;var b=new c(i,r);b.filename.html(v),d(p,r,b,h,i)}}),p.css({margin:0,padding:0});var g=e(a).width()+10;10==g&&(g=120);var v=a.height()+10;10==v&&(v=35),a.css({position:"relative",overflow:"hidden",cursor:"default"}),m.css({position:"absolute",cursor:"pointer",top:"0px",width:"100%",height:"34px",left:"0px","z-index":"100",opacity:"0.0",filter:"alpha(opacity=0)","-ms-filter":"alpha(opacity=0)","-khtml-opacity":"0.0","-moz-opacity":"0.0"}),p.appendTo(a)}function c(t,i){return this.statusbar=e("
        "),this.filename=e("
        ").appendTo(this.statusbar),this.progressDiv=e("
        ").appendTo(this.statusbar).hide(),this.progressbar=e("
        ").appendTo(this.progressDiv),this.abort=e("
        "+i.abortStr+"
        ").appendTo(this.statusbar).hide(),this.cancel=e("
        "+i.cancelStr+"
        ").appendTo(this.statusbar).hide(),this.done=e("
        "+i.doneStr+"
        ").appendTo(this.statusbar).hide(),this.del=e("
        "+i.deletelStr+"
        ").appendTo(this.statusbar).hide(),t.errorLog.after(this.statusbar),this}function d(e,i,r,o,s){var u={cache:!1,contentType:!1,processData:!1,forceSync:!1,data:i.formData,formData:i.fileData,dataType:i.returnType,beforeSubmit:function(t,l,u){if(0!=i.onSubmit.call(this,o)){var c=i.dynamicFormData();if(c){var d=a(c);if(d)for(var h=0;h"+i.uploadErrorStr+"
        "),r.cancel.show(),e.remove(),r.cancel.click(function(){r.statusbar.remove()}),!1},beforeSend:function(e,n){r.progressDiv.show(),r.cancel.hide(),r.done.hide(),i.showAbort&&(r.abort.show(),r.abort.click(function(){e.abort(),s.selectedFiles-=o.length})),t.formdata?r.progressbar.width("1%"):r.progressbar.width("5%")},uploadProgress:function(e,t,n,a){a>98&&(a=98);var o=a+"%";a>1&&r.progressbar.width(o),i.showProgress&&(r.progressbar.html(o),r.progressbar.css("text-align","center"))},success:function(t,n,a){s.responses.push(t),r.progressbar.width("100%"),i.showProgress&&(r.progressbar.html("100%"),r.progressbar.css("text-align","center")),r.abort.hide(),i.onSuccess.call(this,o,t,a),i.showStatusAfterSuccess?(i.showDone?(r.done.show(),r.done.click(function(){r.statusbar.hide("slow"),r.statusbar.remove()})):r.done.hide(),i.showDelete?(r.del.show(),r.del.click(function(){r.statusbar.hide().remove(),i.deleteCallback&&i.deleteCallback.call(this,t,r),s.selectedFiles-=o.length,l(i,s)})):r.del.hide()):(r.statusbar.hide("slow"),r.statusbar.remove()),e.remove(),s.sCounter+=o.length},error:function(t,n,a){r.abort.hide(),"abort"==t.statusText?(r.statusbar.hide("slow").remove(),l(i,s)):(i.onError.call(this,o,n,a),i.showStatusAfterError?(r.progressDiv.hide(),r.statusbar.append("ERROR: "+a+"")):(r.statusbar.hide(),r.statusbar.remove()),s.selectedFiles-=o.length),e.remove(),s.fCounter+=o.length}};i.autoSubmit?e.ajaxSubmit(u):(i.showCancel&&(r.cancel.show(),r.cancel.click(function(){e.remove(),r.statusbar.remove(),s.selectedFiles-=o.length,l(i,s)})),e.ajaxForm(u))}var h=e.extend({url:"",method:"POST",enctype:"multipart/form-data",formData:null,returnType:null,allowedTypes:"*",fileName:"file",formData:{},dynamicFormData:function(){return{}},maxFileSize:-1,maxFileCount:-1,multiple:!0,dragDrop:!0,autoSubmit:!0,showCancel:!0,showAbort:!0,showDone:!0,showDelete:!1,showError:!0,showStatusAfterSuccess:!0,showStatusAfterError:!0,showFileCounter:!0,fileCounterStyle:"). ",showProgress:!1,onSelect:function(e){return!0},onSubmit:function(e,t){},onSuccess:function(e,t,i){},onError:function(e,t,i){},deleteCallback:!1,afterUploadAll:!1,uploadButtonClass:"upload",dragDropStr:"",abortStr:"Abort",cancelStr:"Cancel",deletelStr:"Delete",doneStr:"Done",multiDragErrorStr:"Multiple File Drag & Drop is not allowed.",extErrorStr:"",sizeErrorStr:"",uploadErrorStr:"Upload is not allowed",maxFileCountErrorStr:""},i);this.fileCounter=1,this.selectedFiles=0,this.fCounter=0,this.sCounter=0,this.tCounter=0;var p="upload-"+(new Date).getTime();this.formGroup=p,this.hide(),this.errorLog=e("
        "),this.after(this.errorLog),this.responses=[],t.formdata||(h.dragDrop=!1),t.formdata||(h.multiple=!1);var f=this,m=e("
        "+e(this).html()+"
        ");e(m).addClass(h.uploadButtonClass),function t(){if(e.fn.ajaxForm){if(h.dragDrop){var i=e('
        ');e(f).before(i),e(i).append(m),e(i).prepend(e(h.dragDropStr)),r(f,h,i)}else e(f).before(m);u(f,p,h,m)}else window.setTimeout(t,10)}(),this.startUpload=function(){e("."+this.formGroup).each(function(t,i){e(this).is("form")&&e(this).submit()})},this.stopUpload=function(){e(".upload-red").each(function(t,i){e(this).hasClass(f.formGroup)&&e(this).click()})},this.getResponses=function(){return this.responses};var g=!1;return this}}(jQuery),function(e){"function"==typeof define&&define.amd?define("picker",["jquery"],e):"object"==typeof exports?module.exports=e(require("jquery")):this.Picker=e(jQuery)}(function(e){function t(a,o,l,h){function p(){return t._.node("div",t._.node("div",t._.node("div",t._.node("div",Q.component.nodes(x.open),C.box),C.wrap),C.frame),C.holder,'tabindex="-1"')}function f(){k.data(o,Q).addClass(C.input).val(k.data("value")?Q.get("select",j.format):a.value),j.editable||k.on("focus."+x.id+" click."+x.id,function(e){e.preventDefault(),Q.open()}).on("keydown."+x.id,w),r(a,{haspopup:!0,expanded:!1,readonly:!1,owns:a.id+"_root"})}function m(){r(Q.$root[0],"hidden",!0)}function g(){Q.$holder.on({keydown:w,"focus.toOpen":b,blur:function(){k.removeClass(C.target)},focusin:function(e){Q.$root.removeClass(C.focused),e.stopPropagation()},"mousedown click":function(t){var i=t.target;i!=Q.$holder[0]&&(t.stopPropagation(),"mousedown"!=t.type||e(i).is("input, select, textarea, button, option")||(t.preventDefault(),Q.$holder[0].focus()))}}).on("click","[data-pick], [data-nav], [data-clear], [data-close]",function(){var t=e(this),i=t.data(),n=t.hasClass(C.navDisabled)||t.hasClass(C.disabled),r=s();r=r&&(r.type||r.href),(n||r&&!e.contains(Q.$root[0],r))&&Q.$holder[0].focus(),!n&&i.nav?Q.set("highlight",Q.component.item.highlight,{nav:i.nav}):!n&&"pick"in i?(Q.set("select",i.pick),j.closeOnSelect&&Q.close(!0)):i.clear?(Q.clear(),j.closeOnClear&&Q.close(!0)):i.close&&Q.close(!0)})}function v(){var t;j.hiddenName===!0?(t=a.name,a.name=""):(t=["string"==typeof j.hiddenPrefix?j.hiddenPrefix:"","string"==typeof j.hiddenSuffix?j.hiddenSuffix:"_submit"],t=t[0]+a.name+t[1]),Q._hidden=e('")[0],k.on("change."+x.id,function(){Q._hidden.value=a.value?Q.get("select",j.formatSubmit):""})}function y(){_&&d?Q.$holder.find("."+C.frame).one("transitionend",function(){Q.$holder[0].focus()}):Q.$holder[0].focus()}function b(e){e.stopPropagation(),k.addClass(C.target),Q.$root.addClass(C.focused),Q.open()}function w(e){var t=e.keyCode,i=/^(8|46)$/.test(t);return 27==t?(Q.close(!0),!1):void((32==t||i||!x.open&&Q.component.key[t])&&(e.preventDefault(),e.stopPropagation(),i?Q.clear().close():Q.open()))}if(!a)return t;var _=!1,x={id:a.id||"P"+Math.abs(~~(Math.random()*new Date))},j=l?e.extend(!0,{},l.defaults,h):h||{},C=e.extend({},t.klasses(),j.klass),k=e(a),S=function(){return this.start()},Q=S.prototype={constructor:S,$node:k,start:function(){return x&&x.start?Q:(x.methods={},x.start=!0,x.open=!1,x.type=a.type,a.autofocus=a==s(),a.readOnly=!j.editable,a.id=a.id||x.id,"text"!=a.type&&(a.type="text"),Q.component=new l(Q,j),Q.$root=e('
        '),m(),Q.$holder=e(p()).appendTo(Q.$root),g(),j.formatSubmit&&v(),f(),j.containerHidden?e(j.containerHidden).append(Q._hidden):k.after(Q._hidden),j.container?e(j.container).append(Q.$root):k.after(Q.$root),Q.on({start:Q.component.onStart,render:Q.component.onRender,stop:Q.component.onStop,open:Q.component.onOpen,close:Q.component.onClose,set:Q.component.onSet}).on({start:j.onStart,render:j.onRender,stop:j.onStop,open:j.onOpen,close:j.onClose,set:j.onSet}),_=i(Q.$holder[0]),a.autofocus&&Q.open(),Q.trigger("start").trigger("render"))},render:function(t){return t?(Q.$holder=e(p()),g(),Q.$root.html(Q.$holder)):Q.$root.find("."+C.box).html(Q.component.nodes(x.open)),Q.trigger("render")},stop:function(){return x.start?(Q.close(),Q._hidden&&Q._hidden.parentNode.removeChild(Q._hidden),Q.$root.remove(),k.removeClass(C.input).removeData(o),setTimeout(function(){k.off("."+x.id)},0),a.type=x.type,a.readOnly=!1,Q.trigger("stop"),x.methods={},x.start=!1,Q):Q},open:function(i){return x.open?Q:(k.addClass(C.active),r(a,"expanded",!0),setTimeout(function(){Q.$root.addClass(C.opened),r(Q.$root[0],"hidden",!1)},0),i!==!1&&(x.open=!0,_&&c.css("overflow","hidden").css("padding-right","+="+n()),y(),u.on("click."+x.id+" focusin."+x.id,function(e){var t=e.target;t!=a&&t!=document&&3!=e.which&&Q.close(t===Q.$holder[0])}).on("keydown."+x.id,function(i){var n=i.keyCode,r=Q.component.key[n],a=i.target;27==n?Q.close(!0):a!=Q.$holder[0]||!r&&13!=n?e.contains(Q.$root[0],a)&&13==n&&(i.preventDefault(),a.click()):(i.preventDefault(),r?t._.trigger(Q.component.key.go,Q,[t._.trigger(r)]):Q.$root.find("."+C.highlighted).hasClass(C.disabled)||(Q.set("select",Q.component.item.highlight),j.closeOnSelect&&Q.close(!0)))})),Q.trigger("open"))},close:function(e){return e&&(j.editable?a.focus():(Q.$holder.off("focus.toOpen").focus(),setTimeout(function(){Q.$holder.on("focus.toOpen",b)},0))),k.removeClass(C.active),r(a,"expanded",!1),setTimeout(function(){Q.$root.removeClass(C.opened+" "+C.focused),r(Q.$root[0],"hidden",!0)},0),x.open?(x.open=!1,_&&c.css("overflow","").css("padding-right","-="+n()),u.off("."+x.id),Q.trigger("close")):Q},clear:function(e){return Q.set("clear",null,e)},set:function(t,i,n){var r,a,o=e.isPlainObject(t),s=o?t:{};if(n=o&&e.isPlainObject(i)?i:n||{},t){o||(s[t]=i);for(r in s)a=s[r],r in Q.component.item&&(void 0===a&&(a=null),Q.component.set(r,a,n)),"select"!=r&&"clear"!=r||k.val("clear"==r?"":Q.get(r,j.format)).trigger("change");Q.render()}return n.muted?Q:Q.trigger("set",s)},get:function(e,i){if(e=e||"value",null!=x[e])return x[e];if("valueSubmit"==e){if(Q._hidden)return Q._hidden.value;e="value"}if("value"==e)return a.value;if(e in Q.component.item){if("string"==typeof i){var n=Q.component.get(e);return n?t._.trigger(Q.component.formats.toString,Q.component,[i,n]):""}return Q.component.get(e)}},on:function(t,i,n){var r,a,o=e.isPlainObject(t),s=o?t:{};if(t){o||(s[t]=i);for(r in s)a=s[r],n&&(r="_"+r),x.methods[r]=x.methods[r]||[],x.methods[r].push(a)}return Q},off:function(){var e,t,i=arguments;for(e=0,namesCount=i.length;e').appendTo("body"),i=t[0].offsetWidth;t.css("overflow","scroll");var n=e('
        ').appendTo(t),r=n[0].offsetWidth;return t.remove(),i-r}function r(t,i,n){if(e.isPlainObject(i))for(var r in i)a(t,r,i[r]);else a(t,i,n)}function a(e,t,i){e.setAttribute(("role"==t?"":"aria-")+t,i)}function o(t,i){e.isPlainObject(t)||(t={attribute:i}),i="";for(var n in t){var r=("role"==n?"":"aria-")+n,a=t[n];i+=null==a?"":r+'="'+t[n]+'"'}return i}function s(){try{return document.activeElement}catch(e){}}var l=e(window),u=e(document),c=e(document.documentElement),d=null!=document.documentElement.style.transition;return t.klasses=function(e){return e=e||"picker",{picker:e,opened:e+"--opened",focused:e+"--focused",input:e+"__input",active:e+"__input--active",target:e+"__input--target",holder:e+"__holder",frame:e+"__frame",wrap:e+"__wrap",box:e+"__box"}},t._={group:function(e){for(var i,n="",r=t._.trigger(e.min,e);r<=t._.trigger(e.max,e,[r]);r+=e.i)i=t._.trigger(e.item,e,[r]),n+=t._.node(e.node,i[0],i[1],i[2]);return n},node:function(t,i,n,r){return i?(i=e.isArray(i)?i.join(""):i,n=n?' class="'+n+'"':"",r=r?" "+r:"","<"+t+n+r+">"+i+""):""},lead:function(e){return(e<10?"0":"")+e},trigger:function(e,t,i){return"function"==typeof e?e.apply(t,i||[]):e},digits:function(e){return/\d/.test(e[1])?2:1},isDate:function(e){return{}.toString.call(e).indexOf("Date")>-1&&this.isInteger(e.getDate())},isInteger:function(e){return{}.toString.call(e).indexOf("Number")>-1&&e%1===0},ariaAttr:o},t.extend=function(i,n){e.fn[i]=function(r,a){var o=this.data(i);return"picker"==r?o:o&&"string"==typeof r?t._.trigger(o[r],o,[a]):this.each(function(){var a=e(this);a.data(i)||new t(this,i,n,r)})},e.fn[i].defaults=n.defaults},t}),function(e){"function"==typeof define&&define.amd?define(["picker","jquery"],e):"object"==typeof exports?module.exports=e(require("./picker.js"),require("jquery")):e(Picker,jQuery)}(function(e,t){function i(e,t){var i=this,n=e.$node[0],r=n.value,a=e.$node.data("value"),o=a||r,s=a?t.formatSubmit:t.format,l=function(){return n.currentStyle?"rtl"==n.currentStyle.direction:"rtl"==getComputedStyle(e.$root[0]).direction};i.settings=t,i.$node=e.$node,i.queue={min:"measure create",max:"measure create",now:"now create",select:"parse create validate",highlight:"parse navigate create validate",view:"parse create validate viewset",disable:"deactivate",enable:"activate"},i.item={},i.item.clear=null,i.item.disable=(t.disable||[]).slice(0),i.item.enable=-function(e){return e[0]===!0?e.shift():-1}(i.item.disable),i.set("min",t.min).set("max",t.max).set("now"),o?i.set("select",o,{format:s,defaultValue:!0}):i.set("select",null).set("highlight",i.item.now),i.key={40:7,38:-7,39:function(){return l()?-1:1},37:function(){return l()?1:-1},go:function(e){var t=i.item.highlight,n=new Date(t.year,t.month,t.date+e);i.set("highlight",n,{interval:e}),this.render()}},e.on("render",function(){e.$root.find("."+t.klass.selectMonth).on("change",function(){var i=this.value;i&&(e.set("highlight",[e.get("view").year,i,e.get("highlight").date]),e.$root.find("."+t.klass.selectMonth).trigger("focus"))}),e.$root.find("."+t.klass.selectYear).on("change",function(){var i=this.value;i&&(e.set("highlight",[i,e.get("view").month,e.get("highlight").date]),e.$root.find("."+t.klass.selectYear).trigger("focus"))})},1).on("open",function(){var n="";i.disabled(i.get("now"))&&(n=":not(."+t.klass.buttonToday+")"),e.$root.find("button"+n+", select").attr("disabled",!1)},1).on("close",function(){e.$root.find("button, select").attr("disabled",!0)},1)}var n=7,r=6,a=e._;i.prototype.set=function(e,t,i){var n=this,r=n.item;return null===t?("clear"==e&&(e="select"),r[e]=t,n):(r["enable"==e?"disable":"flip"==e?"enable":e]=n.queue[e].split(" ").map(function(r){return t=n[r](e,t,i)}).pop(),"select"==e?n.set("highlight",r.select,i):"highlight"==e?n.set("view",r.highlight,i):e.match(/^(flip|min|max|disable|enable)$/)&&(r.select&&n.disabled(r.select)&&n.set("select",r.select,i),r.highlight&&n.disabled(r.highlight)&&n.set("highlight",r.highlight,i)),n)},i.prototype.get=function(e){return this.item[e]},i.prototype.create=function(e,i,n){var r,o=this;return i=void 0===i?e:i,i==-(1/0)||i==1/0?r=i:t.isPlainObject(i)&&a.isInteger(i.pick)?i=i.obj:t.isArray(i)?(i=new Date(i[0],i[1],i[2]),i=a.isDate(i)?i:o.create().obj):i=a.isInteger(i)||a.isDate(i)?o.normalize(new Date(i),n):o.now(e,i,n),{year:r||i.getFullYear(),month:r||i.getMonth(),date:r||i.getDate(),day:r||i.getDay(),obj:r||i,pick:r||i.getTime()}},i.prototype.createRange=function(e,i){var n=this,r=function(e){return e===!0||t.isArray(e)||a.isDate(e)?n.create(e):e};return a.isInteger(e)||(e=r(e)),a.isInteger(i)||(i=r(i)),a.isInteger(e)&&t.isPlainObject(i)?e=[i.year,i.month,i.date+e]:a.isInteger(i)&&t.isPlainObject(e)&&(i=[e.year,e.month,e.date+i]),{from:r(e),to:r(i)}},i.prototype.withinRange=function(e,t){return e=this.createRange(e.from,e.to),t.pick>=e.from.pick&&t.pick<=e.to.pick},i.prototype.overlapRanges=function(e,t){var i=this;return e=i.createRange(e.from,e.to),t=i.createRange(t.from,t.to),i.withinRange(e,t.from)||i.withinRange(e,t.to)||i.withinRange(t,e.from)||i.withinRange(t,e.to)},i.prototype.now=function(e,t,i){return t=new Date,i&&i.rel&&t.setDate(t.getDate()+i.rel),this.normalize(t,i)},i.prototype.navigate=function(e,i,n){var r,a,o,s,l=t.isArray(i),u=t.isPlainObject(i),c=this.item.view;if(l||u){for(u?(a=i.year,o=i.month,s=i.date):(a=+i[0],o=+i[1],s=+i[2]),n&&n.nav&&c&&c.month!==o&&(a=c.year,o=c.month),r=new Date(a,o+(n&&n.nav?n.nav:0),1),a=r.getFullYear(),o=r.getMonth();new Date(a,o,s).getMonth()!==o;)s-=1;i=[a,o,s]}return i},i.prototype.normalize=function(e){return e.setHours(0,0,0,0),e},i.prototype.measure=function(e,t){var i=this;return t?"string"==typeof t?t=i.parse(e,t):a.isInteger(t)&&(t=i.now(e,t,{rel:t})):t="min"==e?-(1/0):1/0,t},i.prototype.viewset=function(e,t){return this.create([t.year,t.month,1])},i.prototype.validate=function(e,i,n){var r,o,s,l,u=this,c=i,d=n&&n.interval?n.interval:1,h=u.item.enable===-1,p=u.item.min,f=u.item.max,m=h&&u.item.disable.filter(function(e){if(t.isArray(e)){var n=u.create(e).pick;ni.pick&&(o=!0)}return a.isInteger(e)}).length;if((!n||!n.nav&&!n.defaultValue)&&(!h&&u.disabled(i)||h&&u.disabled(i)&&(m||r||o)||!h&&(i.pick<=p.pick||i.pick>=f.pick)))for(h&&!m&&(!o&&d>0||!r&&d<0)&&(d*=-1);u.disabled(i)&&(Math.abs(d)>1&&(i.monthc.month)&&(i=c,d=d>0?1:-1),i.pick<=p.pick?(s=!0,d=1,i=u.create([p.year,p.month,p.date+(i.pick===p.pick?0:-1)])):i.pick>=f.pick&&(l=!0,d=-1,i=u.create([f.year,f.month,f.date+(i.pick===f.pick?0:1)])),!s||!l);)i=u.create([i.year,i.month,i.date+d]);return i},i.prototype.disabled=function(e){var i=this,n=i.item.disable.filter(function(n){return a.isInteger(n)?e.day===(i.settings.firstDay?n:n-1)%7:t.isArray(n)||a.isDate(n)?e.pick===i.create(n).pick:t.isPlainObject(n)?i.withinRange(n,e):void 0});return n=n.length&&!n.filter(function(e){return t.isArray(e)&&"inverted"==e[3]||t.isPlainObject(e)&&e.inverted}).length, -i.item.enable===-1?!n:n||e.picki.item.max.pick},i.prototype.parse=function(e,t,i){var n=this,r={};return t&&"string"==typeof t?(i&&i.format||(i=i||{},i.format=n.settings.format),n.formats.toArray(i.format).map(function(e){var i=n.formats[e],o=i?a.trigger(i,n,[t,r]):e.replace(/^!/,"").length;i&&(r[e]=t.substr(0,o)),t=t.substr(o)}),[r.yyyy||r.yy,+(r.mm||r.m)-1,r.dd||r.d]):t},i.prototype.formats=function(){function e(e,t,i){var n=e.match(/[^\x00-\x7F]+|\w+/)[0];return i.mm||i.m||(i.m=t.indexOf(n)+1),n.length}function t(e){return e.match(/\w+/)[0].length}return{d:function(e,t){return e?a.digits(e):t.date},dd:function(e,t){return e?2:a.lead(t.date)},ddd:function(e,i){return e?t(e):this.settings.weekdaysShort[i.day]},dddd:function(e,i){return e?t(e):this.settings.weekdaysFull[i.day]},m:function(e,t){return e?a.digits(e):t.month+1},mm:function(e,t){return e?2:a.lead(t.month+1)},mmm:function(t,i){var n=this.settings.monthsShort;return t?e(t,n,i):n[i.month]},mmmm:function(t,i){var n=this.settings.monthsFull;return t?e(t,n,i):n[i.month]},yy:function(e,t){return e?2:(""+t.year).slice(2)},yyyy:function(e,t){return e?4:t.year},toArray:function(e){return e.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g)},toString:function(e,t){var i=this;return i.formats.toArray(e).map(function(e){return a.trigger(i.formats[e],i,[0,t])||e.replace(/^!/,"")}).join("")}}}(),i.prototype.isDateExact=function(e,i){var n=this;return a.isInteger(e)&&a.isInteger(i)||"boolean"==typeof e&&"boolean"==typeof i?e===i:(a.isDate(e)||t.isArray(e))&&(a.isDate(i)||t.isArray(i))?n.create(e).pick===n.create(i).pick:!(!t.isPlainObject(e)||!t.isPlainObject(i))&&(n.isDateExact(e.from,i.from)&&n.isDateExact(e.to,i.to))},i.prototype.isDateOverlap=function(e,i){var n=this,r=n.settings.firstDay?1:0;return a.isInteger(e)&&(a.isDate(i)||t.isArray(i))?(e=e%7+r,e===n.create(i).day+1):a.isInteger(i)&&(a.isDate(e)||t.isArray(e))?(i=i%7+r,i===n.create(e).day+1):!(!t.isPlainObject(e)||!t.isPlainObject(i))&&n.overlapRanges(e,i)},i.prototype.flipEnable=function(e){var t=this.item;t.enable=e||(t.enable==-1?1:-1)},i.prototype.deactivate=function(e,i){var n=this,r=n.item.disable.slice(0);return"flip"==i?n.flipEnable():i===!1?(n.flipEnable(1),r=[]):i===!0?(n.flipEnable(-1),r=[]):i.map(function(e){for(var i,o=0;o=p.year&&c.month>=p.month||!e&&c.year<=h.year&&c.month<=h.month?" "+i.klass.navDisabled:""),"data-nav="+(e||-1)+" "+a.ariaAttr({role:"button",controls:t.$node[0].id+"_table"})+' title="'+(e?i.labelMonthNext:i.labelMonthPrev)+'"')},g=function(){var n=i.showMonthsShort?i.monthsShort:i.monthsFull;return i.selectMonths?a.node("select",a.group({min:0,max:11,i:1,node:"option",item:function(e){return[n[e],0,"value="+e+(c.month==e?" selected":"")+(c.year==h.year&&ep.month?" disabled":"")]}}),i.klass.selectMonth,(e?"":"disabled")+" "+a.ariaAttr({controls:t.$node[0].id+"_table"})+' title="'+i.labelMonthSelect+'"'):a.node("div",n[c.month],i.klass.month)},v=function(){var n=c.year,r=i.selectYears===!0?5:~~(i.selectYears/2);if(r){var o=h.year,s=p.year,l=n-r,u=n+r;if(o>l&&(u+=o-l,l=o),sf?f:d,u=s}return a.node("select",a.group({min:l,max:u,i:1,node:"option",item:function(e){return[e,0,"value="+e+(n==e?" selected":"")]}}),i.klass.selectYear,(e?"":"disabled")+" "+a.ariaAttr({controls:t.$node[0].id+"_table"})+' title="'+i.labelYearSelect+'"')}return a.node("div",n,i.klass.year)};return a.node("div",(i.selectYears?v()+g():g()+v())+m()+m(1),i.klass.header)+a.node("table",f+a.node("tbody",a.group({min:0,max:r-1,i:1,node:"tr",item:function(e){var r=i.firstDay&&0===t.create([c.year,c.month,1]).day?-7:0;return[a.group({min:n*e-c.day+r+1,max:function(){return this.min+n-1},i:1,node:"td",item:function(e){e=t.create([c.year,c.month,e+(i.firstDay?1:0)]);var n=l&&l.pick==e.pick,r=u&&u.pick==e.pick,o=d&&t.disabled(e)||e.pickp.pick,f=a.trigger(t.formats.toString,t,[i.format,e]);return[a.node("div",e.date,function(t){return t.push(c.month==e.month?i.klass.infocus:i.klass.outfocus),s.pick==e.pick&&t.push(i.klass.now),n&&t.push(i.klass.selected),r&&t.push(i.klass.highlighted),o&&t.push(i.klass.disabled),t.join(" ")}([i.klass.day]),"data-pick="+e.pick+" "+a.ariaAttr({role:"gridcell",label:f,selected:!(!n||t.$node.val()!==f)||null,activedescendant:!!r||null,disabled:!!o||null})),"",a.ariaAttr({role:"presentation"})]}})]}})),i.klass.table,'id="'+t.$node[0].id+'_table" '+a.ariaAttr({role:"grid",controls:t.$node[0].id,readonly:!0}))+a.node("div",a.node("button",i.today,i.klass.buttonToday,"type=button data-pick="+s.pick+(e&&!t.disabled(s)?"":" disabled")+" "+a.ariaAttr({controls:t.$node[0].id}))+a.node("button",i.clear,i.klass.buttonClear,"type=button data-clear=1"+(e?"":" disabled")+" "+a.ariaAttr({controls:t.$node[0].id}))+a.node("button",i.close,i.klass.buttonClose,"type=button data-close=true "+(e?"":" disabled")+" "+a.ariaAttr({controls:t.$node[0].id})),i.klass.footer)},i.defaults=function(e){return{labelMonthNext:"Next month",labelMonthPrev:"Previous month",labelMonthSelect:"Select a month",labelYearSelect:"Select a year",monthsFull:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],weekdaysFull:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekdaysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],today:"Today",clear:"Clear",close:"Close",closeOnSelect:!0,closeOnClear:!0,format:"d mmmm, yyyy",klass:{table:e+"table",header:e+"header",navPrev:e+"nav--prev",navNext:e+"nav--next",navDisabled:e+"nav--disabled",month:e+"month",year:e+"year",selectMonth:e+"select--month",selectYear:e+"select--year",weekdays:e+"weekday",day:e+"day",disabled:e+"day--disabled",selected:e+"day--selected",highlighted:e+"day--highlighted",now:e+"day--today",infocus:e+"day--infocus",outfocus:e+"day--outfocus",footer:e+"footer",buttonClear:e+"button--clear",buttonToday:e+"button--today",buttonClose:e+"button--close"}}}(e.klasses().picker+"__"),e.extend("pickadate",i)}),function(e){"function"==typeof define&&define.amd?define(["picker","jquery"],e):"object"==typeof exports?module.exports=e(require("./picker.js"),require("jquery")):e(Picker,jQuery)}(function(e,t){function i(e,t){var i=this,n=e.$node[0].value,r=e.$node.data("value"),a=r||n,o=r?t.formatSubmit:t.format;i.settings=t,i.$node=e.$node,i.queue={interval:"i",min:"measure create",max:"measure create",now:"now create",select:"parse create validate",highlight:"parse create validate",view:"parse create validate",disable:"deactivate",enable:"activate"},i.item={},i.item.clear=null,i.item.interval=t.interval||30,i.item.disable=(t.disable||[]).slice(0),i.item.enable=-function(e){return e[0]===!0?e.shift():-1}(i.item.disable),i.set("min",t.min).set("max",t.max).set("now"),a?i.set("select",a,{format:o}):i.set("select",null).set("highlight",i.item.now),i.key={40:1,38:-1,39:1,37:-1,go:function(e){i.set("highlight",i.item.highlight.pick+e*i.item.interval,{interval:e*i.item.interval}),this.render()}},e.on("render",function(){var i=e.$root.children(),n=i.find("."+t.klass.viewset),r=function(e){return["webkit","moz","ms","o",""].map(function(t){return(t?"-"+t+"-":"")+e})},a=function(e,t){r("transform").map(function(i){e.css(i,t)}),r("transition").map(function(i){e.css(i,t)})};n.length&&(a(i,"none"),i[0].scrollTop=~~n.position().top-2*n[0].clientHeight,a(i,""))},1).on("open",function(){e.$root.find("button").attr("disabled",!1)},1).on("close",function(){e.$root.find("button").attr("disabled",!0)},1)}var n=24,r=60,a=12,o=n*r,s=e._;i.prototype.set=function(e,t,i){var n=this,r=n.item;return null===t?("clear"==e&&(e="select"),r[e]=t,n):(r["enable"==e?"disable":"flip"==e?"enable":e]=n.queue[e].split(" ").map(function(r){return t=n[r](e,t,i)}).pop(),"select"==e?n.set("highlight",r.select,i):"highlight"==e?n.set("view",r.highlight,i):"interval"==e?n.set("min",r.min,i).set("max",r.max,i):e.match(/^(flip|min|max|disable|enable)$/)&&(r.select&&n.disabled(r.select)&&n.set("select",t,i),r.highlight&&n.disabled(r.highlight)&&n.set("highlight",t,i),"min"==e&&n.set("max",r.max,i)),n)},i.prototype.get=function(e){return this.item[e]},i.prototype.create=function(e,i,a){var l=this;return i=void 0===i?e:i,s.isDate(i)&&(i=[i.getHours(),i.getMinutes()]),t.isPlainObject(i)&&s.isInteger(i.pick)?i=i.pick:t.isArray(i)?i=+i[0]*r+ +i[1]:s.isInteger(i)||(i=l.now(e,i,a)),"max"==e&&i=e.from.pick&&t.pick<=e.to.pick},i.prototype.overlapRanges=function(e,t){var i=this;return e=i.createRange(e.from,e.to),t=i.createRange(t.from,t.to),i.withinRange(e,t.from)||i.withinRange(e,t.to)||i.withinRange(t,e.from)||i.withinRange(t,e.to)},i.prototype.now=function(e,t){var i,n=this.item.interval,a=new Date,o=a.getHours()*r+a.getMinutes(),l=s.isInteger(t);return o-=o%n,i=t<0&&n*t+o<=-n,o+="min"==e&&i?0:n,l&&(o+=n*(i&&"max"!=e?t+1:t)),o},i.prototype.normalize=function(e,t){var i=this.item.interval,n=this.item.min&&this.item.min.pick||0;return t-="min"==e?0:(t-n)%i},i.prototype.measure=function(e,i,a){var o=this;return i||(i="min"==e?[0,0]:[n-1,r-1]),"string"==typeof i?i=o.parse(e,i):i===!0||s.isInteger(i)?i=o.now(e,i,a):t.isPlainObject(i)&&s.isInteger(i.pick)&&(i=o.normalize(e,i.pick,a)),i},i.prototype.validate=function(e,t,i){var n=this,r=i&&i.interval?i.interval:n.item.interval;return n.disabled(t)&&(t=n.shift(t,r)),t=n.scope(t),n.disabled(t)&&(t=n.shift(t,r*-1)),t},i.prototype.disabled=function(e){var i=this,n=i.item.disable.filter(function(n){return s.isInteger(n)?e.hour==n:t.isArray(n)||s.isDate(n)?e.pick==i.create(n).pick:t.isPlainObject(n)?i.withinRange(n,e):void 0});return n=n.length&&!n.filter(function(e){return t.isArray(e)&&"inverted"==e[2]||t.isPlainObject(e)&&e.inverted}).length,i.item.enable===-1?!n:n||e.picki.item.max.pick},i.prototype.shift=function(e,t){var i=this,n=i.item.min.pick,r=i.item.max.pick;for(t=t||i.item.interval;i.disabled(e)&&(e=i.create(e.pick+=t),!(e.pick<=n||e.pick>=r)););return e},i.prototype.scope=function(e){var t=this.item.min.pick,i=this.item.max.pick;return this.create(e.pick>i?i:e.pickt.time%o?"a.m.":"p.m."},A:function(e,t){return e?2:o/2>t.time%o?"AM":"PM"},toArray:function(e){return e.split(/(h{1,2}|H{1,2}|i|a|A|!.)/g)},toString:function(e,t){var i=this;return i.formats.toArray(e).map(function(e){return s.trigger(i.formats[e],i,[0,t])||e.replace(/^!/,"")}).join("")}},i.prototype.isTimeExact=function(e,i){var n=this;return s.isInteger(e)&&s.isInteger(i)||"boolean"==typeof e&&"boolean"==typeof i?e===i:(s.isDate(e)||t.isArray(e))&&(s.isDate(i)||t.isArray(i))?n.create(e).pick===n.create(i).pick:!(!t.isPlainObject(e)||!t.isPlainObject(i))&&(n.isTimeExact(e.from,i.from)&&n.isTimeExact(e.to,i.to))},i.prototype.isTimeOverlap=function(e,i){var n=this;return s.isInteger(e)&&(s.isDate(i)||t.isArray(i))?e===n.create(i).hour:s.isInteger(i)&&(s.isDate(e)||t.isArray(e))?i===n.create(e).hour:!(!t.isPlainObject(e)||!t.isPlainObject(i))&&n.overlapRanges(e,i)},i.prototype.flipEnable=function(e){var t=this.item;t.enable=e||(t.enable==-1?1:-1)},i.prototype.deactivate=function(e,i){var n=this,r=n.item.disable.slice(0);return"flip"==i?n.flipEnable():i===!1?(n.flipEnable(1),r=[]):i===!0?(n.flipEnable(-1),r=[]):i.map(function(e){for(var i,a=0;a0?t:this.item.interval},i.prototype.nodes=function(e){var t=this,i=t.settings,n=t.item.select,r=t.item.highlight,a=t.item.view,o=t.item.disable;return s.node("ul",s.group({min:t.item.min.pick,max:t.item.max.pick,i:t.item.interval,node:"li",item:function(e){e=t.create(e);var l=e.pick,u=n&&n.pick==l,c=r&&r.pick==l,d=o&&t.disabled(e),h=s.trigger(t.formats.toString,t,[i.format,e]);return[s.trigger(t.formats.toString,t,[s.trigger(i.formatLabel,t,[e])||i.format,e]),function(e){return u&&e.push(i.klass.selected),c&&e.push(i.klass.highlighted),a&&a.pick==l&&e.push(i.klass.viewset),d&&e.push(i.klass.disabled),e.join(" ")}([i.klass.listItem]),"data-pick="+e.pick+" "+s.ariaAttr({role:"option",label:h,selected:!(!u||t.$node.val()!==h)||null,activedescendant:!!c||null,disabled:!!d||null})]}})+s.node("li",s.node("button",i.clear,i.klass.buttonClear,"type=button data-clear=1"+(e?"":" disabled")+" "+s.ariaAttr({controls:t.$node[0].id})),"",s.ariaAttr({role:"presentation"})),i.klass.list,s.ariaAttr({role:"listbox",controls:t.$node[0].id}))},i.defaults=function(e){return{clear:"Clear",format:"h:i A",interval:30,closeOnSelect:!0,closeOnClear:!0,klass:{picker:e+" "+e+"--time",holder:e+"__holder",list:e+"__list",listItem:e+"__list-item",disabled:e+"__list-item--disabled",selected:e+"__list-item--selected",highlighted:e+"__list-item--highlighted",viewset:e+"__list-item--viewset",now:e+"__list-item--now",buttonClear:e+"__button--clear"}}}(e.klasses().picker),e.extend("pickatime",i)}),[].map||(Array.prototype.map=function(e,t){for(var i=this,n=i.length,r=new Array(n),a=0;a>>0;if("function"!=typeof e)throw new TypeError;for(var n=[],r=arguments[1],a=0;a>>0;if(0===i)return-1;var n=0;if(arguments.length>1&&(n=Number(arguments[1]),n!=n?n=0:0!==n&&n!=1/0&&n!=-(1/0)&&(n=(n>0||-1)*Math.floor(Math.abs(n)))),n>=i)return-1;for(var r=n>=0?n:Math.max(i-Math.abs(n),0);r>>0:t>>>0;(r=e.exec(i))&&(a=r.index+r[0].length,!(a>u&&(s.push(i.slice(u,r.index)),!compliantExecNpcg&&r.length>1&&r[0].replace(n,function(){for(var e=1;e1&&r.index=t)));)e.lastIndex===r.index&&e.lastIndex++;return u===i.length?!o&&e.test("")||s.push(""):s.push(i.slice(u)),s.length>t?s.slice(0,t):s},function(e){"use strict";var t={init:function(i){return this.each(function(){this.self=e(this),t.destroy.call(this.self),this.opt=e.extend(!0,{},e.fn.raty.defaults,i),t._adjustCallback.call(this),t._adjustNumber.call(this),"img"!==this.opt.starType&&t._adjustStarType.call(this),t._adjustPath.call(this),t._createStars.call(this),this.opt.cancel&&t._createCancel.call(this),this.opt.precision&&t._adjustPrecision.call(this),t._createScore.call(this),t._apply.call(this,this.opt.score),t._target.call(this,this.opt.score),this.opt.readOnly?t._lock.call(this):(this.style.cursor="pointer",t._binds.call(this)),this.self.data("options",this.opt)})},_adjustCallback:function(){for(var e=["number","readOnly","score","scoreName","target"],t=0;t0&&this.score.val(t._between(e,0,this.opt.number)),t._roundStars.call(this,e))},_between:function(e,t,i){return Math.min(Math.max(parseFloat(e),t),i)},_binds:function(){this.cancel&&(t._bindOverCancel.call(this),t._bindClickCancel.call(this),t._bindOutCancel.call(this)),t._bindOver.call(this),t._bindClick.call(this),t._bindOut.call(this)},_bindClick:function(){var t=this;t.stars.on("click.raty",function(i){var n=e(this);t.score.val(t.opt.half||t.opt.precision?t.self.data("score"):this.alt||n.data("alt")),t.opt.click&&t.opt.click.call(t,+t.score.val(),i)})},_bindClickCancel:function(){var e=this;e.cancel.on("click.raty",function(t){e.score.removeAttr("value"),e.opt.click&&e.opt.click.call(e,null,t)})},_bindOut:function(){var e=this;e.self.on("mouseleave.raty",function(i){var n=+e.score.val()||void 0;t._apply.call(e,n),t._target.call(e,n,i),e.opt.mouseout&&e.opt.mouseout.call(e,n,i)})},_bindOutCancel:function(){var e=this;e.cancel.on("mouseleave.raty",function(i){var n=e.opt.cancelOff;if("img"!==e.opt.starType&&(n=e.opt.cancelClass+" "+n),t._setIcon.call(e,this,n),e.opt.mouseout){var r=+e.score.val()||void 0;e.opt.mouseout.call(e,r,i)}})},_bindOver:function(){var e=this,i=e.opt.half?"mousemove.raty":"mouseover.raty";e.stars.on(i,function(i){var n=t._getScoreByPosition.call(e,i,this);t._fill.call(e,n),e.opt.half&&(t._roundStars.call(e,n),e.self.data("score",n)),t._target.call(e,n,i),e.opt.mouseover&&e.opt.mouseover.call(e,n,i)})},_bindOverCancel:function(){var e=this;e.cancel.on("mouseover.raty",function(i){var n=e.opt.path+e.opt.starOff,r=e.opt.cancelOn;"img"===e.opt.starType?e.stars.attr("src",n):(r=e.opt.cancelClass+" "+r,e.stars.attr("class",n)),t._setIcon.call(e,this,r),t._target.call(e,null,i),e.opt.mouseover&&e.opt.mouseover.call(e,null)})},_buildScoreField:function(){return e("",{name:this.opt.scoreName,type:"hidden"}).appendTo(this)},_createCancel:function(){var t=this.opt.path+this.opt.cancelOff,i=e("<"+this.opt.starType+" />",{title:this.opt.cancelHint,class:this.opt.cancelClass});"img"===this.opt.starType?i.attr({src:t,alt:"x"}):i.attr("data-alt","x").addClass(t),"left"===this.opt.cancelPlace?this.self.prepend(" ").prepend(i):this.self.append(" ").append(i),this.cancel=i},_createScore:function(){var i=e(this.opt.targetScore);this.score=i.length?i:t._buildScoreField.call(this)},_createStars:function(){for(var i=1;i<=this.opt.number;i++){var n=t._nameForIndex.call(this,i),r={alt:i,src:this.opt.path+this.opt[n]};"img"!==this.opt.starType&&(r={"data-alt":i,class:r.src}),r.title=t._getHint.call(this,i),e("<"+this.opt.starType+" />",r).appendTo(this),this.opt.space&&this.self.append(ii){var s=this.opt.iconRange[i];r=t._getRangeIcon.call(this,s,o),n<=s.range&&t._setIcon.call(this,a,r),n===s.range&&i++}else r=this.opt[o?"starOn":"starOff"],t._setIcon.call(this,a,r)}},_getRangeIcon:function(e,t){return t?e.on||this.opt.starOn:e.off||this.opt.starOff},_getScoreByPosition:function(i,n){var r=parseInt(n.alt||n.getAttribute("data-alt"),10);if(this.opt.half){var a=t._getSize.call(this),o=parseFloat((i.pageX-e(n).offset().left)/a);r=this.opt.precision?r-1+o:r-1+(o>.5?1:.5)}return r},_getSize:function(){var e;return e="img"===this.opt.starType?this.stars[0].width:parseFloat(this.stars.eq(0).css("font-size")),e||t._error.call(this,"Could not be possible get the icon size!"),e},_turnOn:function(e,t){return this.opt.single?e===t:e<=t},_getHint:function(e){var t=this.opt.hints[e-1];return""===t?"":t||e},_lock:function(){var e=parseInt(this.score.val(),10),i=e?t._getHint.call(this,e):this.opt.noRatedMsg;this.style.cursor="",this.title=i,this.score.prop("readonly",!0),this.stars.prop("title",i),this.cancel&&this.cancel.hide(),this.self.data("readonly",!0)},_nameForIndex:function(e){return this.opt.score&&this.opt.score>=e?"starOn":"starOff"},_roundStars:function(e){var i=(e%1).toFixed(2);if(i>this.opt.round.down){var n="starOn";this.opt.halfShow&&i1?t:t[0]},move:function(i){return this.each(function(){var n=parseInt(i,10),r=e(this).data("options"),a=(+i).toFixed(1).split(".")[1];n>=r.number&&(n=r.number-1,a=10);var o=t._getSize.call(this),s=o/10,l=e(this.stars[n]),u=l.offset().left+s*parseInt(a,10),c=e.Event("mousemove",{pageX:u});l.trigger(c)})},readOnly:function(i){return this.each(function(){var n=e(this);n.data("readonly")!==i&&(i?(n.off(".raty").children("img").off(".raty"),t._lock.call(this)):(t._binds.call(this),t._unlock.call(this)),n.data("readonly",i))})},reload:function(){return t.set.call(this,{})},score:function(){var i=e(this);return arguments.length?t.setScore.apply(i,arguments):t.getScore.call(i)},set:function(t){return this.each(function(){var i=e(this),n=i.data("options"),r=e.extend({},n,t);i.raty(r)})},setScore:function(i){return this.each(function(){e(this).data("readonly")!==!0&&(t._apply.call(this,i),t._target.call(this,i))})}};e.fn.raty=function(i){return t[i]?t[i].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof i&&i?void e.error("Method "+i+" does not exist!"):t.init.apply(this,arguments)},e.fn.raty.defaults={cancel:!1,cancelClass:"raty-cancel",cancelHint:"Cancel this rating!",cancelOff:"cancel-off.png",cancelOn:"cancel-on.png",cancelPlace:"left",click:void 0,half:!1,halfShow:!0,hints:["bad","poor","regular","good","gorgeous"],iconRange:void 0,mouseout:void 0,mouseover:void 0,noRatedMsg:"Not rated yet!",number:5,numberMax:20,path:void 0,precision:!1,readOnly:!1,round:{down:.25,full:.6,up:.76},score:void 0,scoreName:"score",single:!1,space:!0,starHalf:"star-half.png",starOff:"star-off.png",starOn:"star-on.png",starType:"img",target:void 0,targetFormat:"{score}",targetKeep:!1,targetScore:void 0,targetText:"",targetType:"hint"}}(jQuery),function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):"undefined"!=typeof module&&module.exports?module.exports=e(require("jquery")):e(jQuery)}(function(e){"use strict";function t(t){return!t.nodeName||e.inArray(t.nodeName.toLowerCase(),["iframe","#document","html","body"])!==-1}function i(t){return e.isFunction(t)||e.isPlainObject(t)?t:{top:t,left:t}}var n=e.scrollTo=function(t,i,n){return e(window).scrollTo(t,i,n)};return n.defaults={axis:"xy",duration:0,limit:!0},e.fn.scrollTo=function(r,a,o){"object"==typeof a&&(o=a,a=0),"function"==typeof o&&(o={onAfter:o}),"max"===r&&(r=9e9),o=e.extend({},n.defaults,o),a=a||o.duration;var s=o.queue&&o.axis.length>1;return s&&(a/=2),o.offset=i(o.offset),o.over=i(o.over),this.each(function(){function l(t){var i=e.extend({},o,{queue:!0,duration:a,complete:t&&function(){t.call(d,p,o)}});h.animate(f,i)}if(null!==r){var u,c=t(this),d=c?this.contentWindow||window:this,h=e(d),p=r,f={};switch(typeof p){case"number":case"string":if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(p)){p=i(p);break}if(p=c?e(p):e(p,d),!p.length)return;case"object":(p.is||p.style)&&(u=(p=e(p)).offset())}var m=e.isFunction(o.offset)&&o.offset(d,p)||o.offset;e.each(o.axis.split(""),function(e,t){var i="x"===t?"Left":"Top",r=i.toLowerCase(),a="scroll"+i,g=h[a](),v=n.max(d,t);if(u)f[a]=u[r]+(c?0:g-h.offset()[r]),o.margin&&(f[a]-=parseInt(p.css("margin"+i),10)||0,f[a]-=parseInt(p.css("border"+i+"Width"),10)||0),f[a]+=m[r]||0,o.over[r]&&(f[a]+=p["x"===t?"width":"height"]()*o.over[r]);else{var y=p[r];f[a]=y.slice&&"%"===y.slice(-1)?parseFloat(y)/100*v:y}o.limit&&/^\d+$/.test(f[a])&&(f[a]=f[a]<=0?0:Math.min(f[a],v)),!e&&o.axis.length>1&&(g===f[a]?f={}:s&&(l(o.onAfterFirst),f={}))}),l(o.onAfter)}})},n.max=function(i,n){var r="x"===n?"Width":"Height",a="scroll"+r;if(!t(i))return i[a]-e(i)[r.toLowerCase()]();var o="client"+r,s=i.ownerDocument||i.document,l=s.documentElement,u=s.body;return Math.max(l[a],u[a])-Math.min(l[o],u[o])},e.Tween.propHooks.scrollLeft=e.Tween.propHooks.scrollTop={get:function(t){return e(t.elem)[t.prop]()},set:function(t){var i=this.get(t);if(t.options.interrupt&&t._last&&t._last!==i)return e(t.elem).stop();var n=Math.round(t.now);i!==n&&(e(t.elem)[t.prop](n),t._last=this.get(t))}},n}),!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof exports?module.exports=e:e(jQuery)}(function(e){function t(t){var o=t||window.event,s=l.call(arguments,1),u=0,d=0,h=0,p=0,f=0,m=0;if(t=e.event.fix(o),t.type="mousewheel","detail"in o&&(h=-1*o.detail),"wheelDelta"in o&&(h=o.wheelDelta),"wheelDeltaY"in o&&(h=o.wheelDeltaY),"wheelDeltaX"in o&&(d=-1*o.wheelDeltaX),"axis"in o&&o.axis===o.HORIZONTAL_AXIS&&(d=-1*h,h=0),u=0===h?d:h,"deltaY"in o&&(h=-1*o.deltaY,u=h),"deltaX"in o&&(d=o.deltaX,0===h&&(u=-1*d)),0!==h||0!==d){if(1===o.deltaMode){var g=e.data(this,"mousewheel-line-height");u*=g,h*=g,d*=g}else if(2===o.deltaMode){var v=e.data(this,"mousewheel-page-height");u*=v,h*=v,d*=v}if(p=Math.max(Math.abs(h),Math.abs(d)),(!a||a>p)&&(a=p,n(o,p)&&(a/=40)),n(o,p)&&(u/=40,d/=40,h/=40),u=Math[u>=1?"floor":"ceil"](u/a),d=Math[d>=1?"floor":"ceil"](d/a),h=Math[h>=1?"floor":"ceil"](h/a),c.settings.normalizeOffset&&this.getBoundingClientRect){var y=this.getBoundingClientRect();f=t.clientX-y.left,m=t.clientY-y.top}return t.deltaX=d,t.deltaY=h,t.deltaFactor=a,t.offsetX=f,t.offsetY=m,t.deltaMode=0,s.unshift(t,u,d,h),r&&clearTimeout(r),r=setTimeout(i,200),(e.event.dispatch||e.event.handle).apply(this,s)}}function i(){a=null}function n(e,t){return c.settings.adjustOldDeltas&&"mousewheel"===e.type&&t%120===0}var r,a,o=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],s="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],l=Array.prototype.slice;if(e.event.fixHooks)for(var u=o.length;u;)e.event.fixHooks[o[--u]]=e.event.mouseHooks;var c=e.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var i=s.length;i;)this.addEventListener(s[--i],t,!1);else this.onmousewheel=t;e.data(this,"mousewheel-line-height",c.getLineHeight(this)),e.data(this,"mousewheel-page-height",c.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var i=s.length;i;)this.removeEventListener(s[--i],t,!1);else this.onmousewheel=null;e.removeData(this,"mousewheel-line-height"),e.removeData(this,"mousewheel-page-height")},getLineHeight:function(t){var i=e(t),n=i["offsetParent"in e.fn?"offsetParent":"parent"]();return n.length||(n=e("body")),parseInt(n.css("fontSize"),10)||parseInt(i.css("fontSize"),10)||16},getPageHeight:function(t){return e(t).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};e.fn.extend({mousewheel:function(e){return e?this.bind("mousewheel",e):this.trigger("mousewheel")},unmousewheel:function(e){return this.unbind("mousewheel",e); -}})}),!function(e){"undefined"!=typeof module&&module.exports?module.exports=e:e(jQuery,window,document)}(function(e){!function(t){var i="function"==typeof define&&define.amd,n="undefined"!=typeof module&&module.exports,r="https:"==document.location.protocol?"https:":"http:",a="cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.12/jquery.mousewheel.min.js";i||(n?require("jquery-mousewheel")(e):e.event.special.mousewheel||e("head").append(decodeURI("%3Cscript src="+r+"//"+a+"%3E%3C/script%3E"))),t()}(function(){var t,i="mCustomScrollbar",n="mCS",r=".mCustomScrollbar",a={setTop:0,setLeft:0,axis:"y",scrollbarPosition:"inside",scrollInertia:950,autoDraggerLength:!0,alwaysShowScrollbar:0,snapOffset:0,mouseWheel:{enable:!0,scrollAmount:"auto",axis:"y",deltaFactor:"auto",disableOver:["select","option","keygen","datalist","textarea"]},scrollButtons:{scrollType:"stepless",scrollAmount:"auto"},keyboard:{enable:!0,scrollType:"stepless",scrollAmount:"auto"},contentTouchScroll:25,advanced:{autoScrollOnFocus:"input,textarea,select,button,datalist,keygen,a[tabindex],area,object,[contenteditable='true']",updateOnContentResize:!0,updateOnImageLoad:!0},theme:"light",callbacks:{onTotalScrollOffset:0,onTotalScrollBackOffset:0,alwaysTriggerOffsets:!0}},o=0,s={},l=window.attachEvent&&!window.addEventListener?1:0,u=!1,c=["mCSB_dragger_onDrag","mCSB_scrollTools_onDrag","mCS_img_loaded","mCS_disabled","mCS_destroyed","mCS_no_scrollbar","mCS-autoHide","mCS-dir-rtl","mCS_no_scrollbar_y","mCS_no_scrollbar_x","mCS_y_hidden","mCS_x_hidden","mCSB_draggerContainer","mCSB_buttonUp","mCSB_buttonDown","mCSB_buttonLeft","mCSB_buttonRight"],d={init:function(t){var t=e.extend(!0,{},a,t),i=h.call(this);if(t.live){var l=t.liveSelector||this.selector||r,u=e(l);if("off"===t.live)return void f(l);s[l]=setTimeout(function(){u.mCustomScrollbar(t),"once"===t.live&&u.length&&f(l)},500)}else f(l);return t.setWidth=t.set_width?t.set_width:t.setWidth,t.setHeight=t.set_height?t.set_height:t.setHeight,t.axis=t.horizontalScroll?"x":m(t.axis),t.scrollInertia=t.scrollInertia>0&&t.scrollInertia<17?17:t.scrollInertia,"object"!=typeof t.mouseWheel&&1==t.mouseWheel&&(t.mouseWheel={enable:!0,scrollAmount:"auto",axis:"y",preventDefault:!1,deltaFactor:"auto",normalizeDelta:!1,invert:!1}),t.mouseWheel.scrollAmount=t.mouseWheelPixels?t.mouseWheelPixels:t.mouseWheel.scrollAmount,t.mouseWheel.normalizeDelta=t.advanced.normalizeMouseWheelDelta?t.advanced.normalizeMouseWheelDelta:t.mouseWheel.normalizeDelta,t.scrollButtons.scrollType=g(t.scrollButtons.scrollType),p(t),e(i).each(function(){var i=e(this);if(!i.data(n)){i.data(n,{idx:++o,opt:t,scrollRatio:{y:null,x:null},overflowed:null,contentReset:{y:null,x:null},bindEvents:!1,tweenRunning:!1,sequential:{},langDir:i.css("direction"),cbOffsets:null,trigger:null});var r=i.data(n),a=r.opt,s=i.data("mcs-axis"),l=i.data("mcs-scrollbar-position"),u=i.data("mcs-theme");s&&(a.axis=s),l&&(a.scrollbarPosition=l),u&&(a.theme=u,p(a)),v.call(this),e("#mCSB_"+r.idx+"_container img:not(."+c[2]+")").addClass(c[2]),d.update.call(null,i)}})},update:function(t,i){var r=t||h.call(this);return e(r).each(function(){var t=e(this);if(t.data(n)){var r=t.data(n),a=r.opt,o=e("#mCSB_"+r.idx+"_container"),s=[e("#mCSB_"+r.idx+"_dragger_vertical"),e("#mCSB_"+r.idx+"_dragger_horizontal")];if(!o.length)return;r.tweenRunning&&Y(t),t.hasClass(c[3])&&t.removeClass(c[3]),t.hasClass(c[4])&&t.removeClass(c[4]),_.call(this),b.call(this),"y"===a.axis||a.advanced.autoExpandHorizontalScroll||o.css("width",y(o.children())),r.overflowed=k.call(this),D.call(this),a.autoDraggerLength&&x.call(this),j.call(this),Q.call(this);var l=[Math.abs(o[0].offsetTop),Math.abs(o[0].offsetLeft)];"x"!==a.axis&&(r.overflowed[0]?s[0].height()>s[0].parent().height()?S.call(this):(X(t,l[0].toString(),{dir:"y",dur:0,overwrite:"none"}),r.contentReset.y=null):(S.call(this),"y"===a.axis?$.call(this):"yx"===a.axis&&r.overflowed[1]&&X(t,l[1].toString(),{dir:"x",dur:0,overwrite:"none"}))),"y"!==a.axis&&(r.overflowed[1]?s[1].width()>s[1].parent().width()?S.call(this):(X(t,l[1].toString(),{dir:"x",dur:0,overwrite:"none"}),r.contentReset.x=null):(S.call(this),"x"===a.axis?$.call(this):"yx"===a.axis&&r.overflowed[0]&&X(t,l[0].toString(),{dir:"y",dur:0,overwrite:"none"}))),i&&r&&(2===i&&a.callbacks.onImageLoad&&"function"==typeof a.callbacks.onImageLoad?a.callbacks.onImageLoad.call(this):3===i&&a.callbacks.onSelectorChange&&"function"==typeof a.callbacks.onSelectorChange?a.callbacks.onSelectorChange.call(this):a.callbacks.onUpdate&&"function"==typeof a.callbacks.onUpdate&&a.callbacks.onUpdate.call(this)),U.call(this)}})},scrollTo:function(t,i){if("undefined"!=typeof t&&null!=t){var r=h.call(this);return e(r).each(function(){var r=e(this);if(r.data(n)){var a=r.data(n),o=a.opt,s={trigger:"external",scrollInertia:o.scrollInertia,scrollEasing:"mcsEaseInOut",moveDragger:!1,timeout:60,callbacks:!0,onStart:!0,onUpdate:!0,onComplete:!0},l=e.extend(!0,{},s,i),u=F.call(this,t),c=l.scrollInertia>0&&l.scrollInertia<17?17:l.scrollInertia;u[0]=W.call(this,u[0],"y"),u[1]=W.call(this,u[1],"x"),l.moveDragger&&(u[0]*=a.scrollRatio.y,u[1]*=a.scrollRatio.x),l.dur=c,setTimeout(function(){null!==u[0]&&"undefined"!=typeof u[0]&&"x"!==o.axis&&a.overflowed[0]&&(l.dir="y",l.overwrite="all",X(r,u[0].toString(),l)),null!==u[1]&&"undefined"!=typeof u[1]&&"y"!==o.axis&&a.overflowed[1]&&(l.dir="x",l.overwrite="none",X(r,u[1].toString(),l))},l.timeout)}})}},stop:function(){var t=h.call(this);return e(t).each(function(){var t=e(this);t.data(n)&&Y(t)})},disable:function(t){var i=h.call(this);return e(i).each(function(){var i=e(this);i.data(n)&&(i.data(n),U.call(this,"remove"),$.call(this),t&&S.call(this),D.call(this,!0),i.addClass(c[3]))})},destroy:function(){var t=h.call(this);return e(t).each(function(){var r=e(this);if(r.data(n)){var a=r.data(n),o=a.opt,s=e("#mCSB_"+a.idx),l=e("#mCSB_"+a.idx+"_container"),u=e(".mCSB_"+a.idx+"_scrollbar");o.live&&f(o.liveSelector||e(t).selector),U.call(this,"remove"),$.call(this),S.call(this),r.removeData(n),Z(this,"mcs"),u.remove(),l.find("img."+c[2]).removeClass(c[2]),s.replaceWith(l.contents()),r.removeClass(i+" _"+n+"_"+a.idx+" "+c[6]+" "+c[7]+" "+c[5]+" "+c[3]).addClass(c[4])}})}},h=function(){return"object"!=typeof e(this)||e(this).length<1?r:this},p=function(t){var i=["rounded","rounded-dark","rounded-dots","rounded-dots-dark"],n=["rounded-dots","rounded-dots-dark","3d","3d-dark","3d-thick","3d-thick-dark","inset","inset-dark","inset-2","inset-2-dark","inset-3","inset-3-dark"],r=["minimal","minimal-dark"],a=["minimal","minimal-dark"],o=["minimal","minimal-dark"];t.autoDraggerLength=!(e.inArray(t.theme,i)>-1)&&t.autoDraggerLength,t.autoExpandScrollbar=!(e.inArray(t.theme,n)>-1)&&t.autoExpandScrollbar,t.scrollButtons.enable=!(e.inArray(t.theme,r)>-1)&&t.scrollButtons.enable,t.autoHideScrollbar=e.inArray(t.theme,a)>-1||t.autoHideScrollbar,t.scrollbarPosition=e.inArray(t.theme,o)>-1?"outside":t.scrollbarPosition},f=function(e){s[e]&&(clearTimeout(s[e]),Z(s,e))},m=function(e){return"yx"===e||"xy"===e||"auto"===e?"yx":"x"===e||"horizontal"===e?"x":"y"},g=function(e){return"stepped"===e||"pixels"===e||"step"===e||"click"===e?"stepped":"stepless"},v=function(){var t=e(this),r=t.data(n),a=r.opt,o=a.autoExpandScrollbar?" "+c[1]+"_expand":"",s=["
        ","
        "],l="yx"===a.axis?"mCSB_vertical_horizontal":"x"===a.axis?"mCSB_horizontal":"mCSB_vertical",u="yx"===a.axis?s[0]+s[1]:"x"===a.axis?s[1]:s[0],d="yx"===a.axis?"
        ":"",h=a.autoHideScrollbar?" "+c[6]:"",p="x"!==a.axis&&"rtl"===r.langDir?" "+c[7]:"";a.setWidth&&t.css("width",a.setWidth),a.setHeight&&t.css("height",a.setHeight),a.setLeft="y"!==a.axis&&"rtl"===r.langDir?"989999px":a.setLeft,t.addClass(i+" _"+n+"_"+r.idx+h+p).wrapInner("
        ");var f=e("#mCSB_"+r.idx),m=e("#mCSB_"+r.idx+"_container");"y"===a.axis||a.advanced.autoExpandHorizontalScroll||m.css("width",y(m.children())),"outside"===a.scrollbarPosition?("static"===t.css("position")&&t.css("position","relative"),t.css("overflow","visible"),f.addClass("mCSB_outside").after(u)):(f.addClass("mCSB_inside").append(u),m.wrap(d)),w.call(this);var g=[e("#mCSB_"+r.idx+"_dragger_vertical"),e("#mCSB_"+r.idx+"_dragger_horizontal")];g[0].css("min-height",g[0].height()),g[1].css("min-width",g[1].width())},y=function(t){return Math.max.apply(Math,t.map(function(){return e(this).outerWidth(!0)}).get())},b=function(){var t=e(this),i=t.data(n),r=i.opt,a=e("#mCSB_"+i.idx+"_container");r.advanced.autoExpandHorizontalScroll&&"y"!==r.axis&&a.css({position:"absolute",width:"auto"}).wrap("
        ").css({width:Math.ceil(a[0].getBoundingClientRect().right+.4)-Math.floor(a[0].getBoundingClientRect().left),position:"relative"}).unwrap()},w=function(){var t=e(this),i=t.data(n),r=i.opt,a=e(".mCSB_"+i.idx+"_scrollbar:first"),o=te(r.scrollButtons.tabindex)?"tabindex='"+r.scrollButtons.tabindex+"'":"",s=["","","",""],l=["x"===r.axis?s[2]:s[0],"x"===r.axis?s[3]:s[1],s[2],s[3]];r.scrollButtons.enable&&a.prepend(l[0]).append(l[1]).next(".mCSB_scrollTools").prepend(l[2]).append(l[3])},_=function(){var t=e(this),i=t.data(n),r=e("#mCSB_"+i.idx),a=t.css("max-height")||"none",o=-1!==a.indexOf("%"),s=t.css("box-sizing");if("none"!==a){var l=o?t.parent().height()*parseInt(a)/100:parseInt(a);"border-box"===s&&(l-=t.innerHeight()-t.height()+(t.outerHeight()-t.innerHeight())),r.css("max-height",Math.round(l))}},x=function(){var t=e(this),i=t.data(n),r=e("#mCSB_"+i.idx),a=e("#mCSB_"+i.idx+"_container"),o=[e("#mCSB_"+i.idx+"_dragger_vertical"),e("#mCSB_"+i.idx+"_dragger_horizontal")],s=[r.height()/a.outerHeight(!1),r.width()/a.outerWidth(!1)],u=[parseInt(o[0].css("min-height")),Math.round(s[0]*o[0].parent().height()),parseInt(o[1].css("min-width")),Math.round(s[1]*o[1].parent().width())],c=l&&u[1]r.height(),s>r.width()]},S=function(){var t=e(this),i=t.data(n),r=i.opt,a=e("#mCSB_"+i.idx),o=e("#mCSB_"+i.idx+"_container"),s=[e("#mCSB_"+i.idx+"_dragger_vertical"),e("#mCSB_"+i.idx+"_dragger_horizontal")];if(Y(t),("x"!==r.axis&&!i.overflowed[0]||"y"===r.axis&&i.overflowed[0])&&(s[0].add(o).css("top",0),X(t,"_resetY")),"y"!==r.axis&&!i.overflowed[1]||"x"===r.axis&&i.overflowed[1]){var l=dx=0;"rtl"===i.langDir&&(l=a.width()-o.outerWidth(!1),dx=Math.abs(l/i.scrollRatio.x)),o.css("left",l),s[1].css("left",dx),X(t,"_resetX")}},Q=function(){function t(){o=setTimeout(function(){e.event.special.mousewheel?(clearTimeout(o),E.call(i[0])):t()},100)}var i=e(this),r=i.data(n),a=r.opt;if(!r.bindEvents){if(O.call(this),a.contentTouchScroll&&A.call(this),M.call(this),a.mouseWheel.enable){var o;t()}L.call(this),H.call(this),a.advanced.autoScrollOnFocus&&R.call(this),a.scrollButtons.enable&&B.call(this),a.keyboard.enable&&z.call(this),r.bindEvents=!0}},$=function(){var t=e(this),i=t.data(n),r=i.opt,a=n+"_"+i.idx,o=".mCSB_"+i.idx+"_scrollbar",s=e("#mCSB_"+i.idx+",#mCSB_"+i.idx+"_container,#mCSB_"+i.idx+"_container_wrapper,"+o+" ."+c[12]+",#mCSB_"+i.idx+"_dragger_vertical,#mCSB_"+i.idx+"_dragger_horizontal,"+o+">a"),l=e("#mCSB_"+i.idx+"_container");r.advanced.releaseDraggableSelectors&&s.add(e(r.advanced.releaseDraggableSelectors)),i.bindEvents&&(e(document).unbind("."+a),s.each(function(){e(this).unbind("."+a)}),clearTimeout(t[0]._focusTimeout),Z(t[0],"_focusTimeout"),clearTimeout(i.sequential.step),Z(i.sequential,"step"),clearTimeout(l[0].onCompleteTimeout),Z(l[0],"onCompleteTimeout"),i.bindEvents=!1)},D=function(t){var i=e(this),r=i.data(n),a=r.opt,o=e("#mCSB_"+r.idx+"_container_wrapper"),s=o.length?o:e("#mCSB_"+r.idx+"_container"),l=[e("#mCSB_"+r.idx+"_scrollbar_vertical"),e("#mCSB_"+r.idx+"_scrollbar_horizontal")],u=[l[0].find(".mCSB_dragger"),l[1].find(".mCSB_dragger")];"x"!==a.axis&&(r.overflowed[0]&&!t?(l[0].add(u[0]).add(l[0].children("a")).css("display","block"),s.removeClass(c[8]+" "+c[10])):(a.alwaysShowScrollbar?(2!==a.alwaysShowScrollbar&&u[0].css("display","none"),s.removeClass(c[10])):(l[0].css("display","none"),s.addClass(c[10])),s.addClass(c[8]))),"y"!==a.axis&&(r.overflowed[1]&&!t?(l[1].add(u[1]).add(l[1].children("a")).css("display","block"),s.removeClass(c[9]+" "+c[11])):(a.alwaysShowScrollbar?(2!==a.alwaysShowScrollbar&&u[1].css("display","none"),s.removeClass(c[11])):(l[1].css("display","none"),s.addClass(c[11])),s.addClass(c[9]))),r.overflowed[0]||r.overflowed[1]?i.removeClass(c[5]):i.addClass(c[5])},T=function(e){var t=e.type;switch(t){case"pointerdown":case"MSPointerDown":case"pointermove":case"MSPointerMove":case"pointerup":case"MSPointerUp":return e.target.ownerDocument!==document?[e.originalEvent.screenY,e.originalEvent.screenX,!1]:[e.originalEvent.pageY,e.originalEvent.pageX,!1];case"touchstart":case"touchmove":case"touchend":var i=e.originalEvent.touches[0]||e.originalEvent.changedTouches[0],n=e.originalEvent.touches.length||e.originalEvent.changedTouches.length;return e.target.ownerDocument!==document?[i.screenY,i.screenX,n>1]:[i.pageY,i.pageX,n>1];default:return[e.pageY,e.pageX,!1]}},O=function(){function t(e){var t=f.find("iframe");if(t.length){var i=e?"auto":"none";t.css("pointer-events",i)}}function i(e,t,i,n){if(f[0].idleTimer=d.scrollInertia<233?250:0,r.attr("id")===p[1])var a="x",o=(r[0].offsetLeft-t+n)*c.scrollRatio.x;else var a="y",o=(r[0].offsetTop-e+i)*c.scrollRatio.y;X(s,o.toString(),{dir:a,drag:!0})}var r,a,o,s=e(this),c=s.data(n),d=c.opt,h=n+"_"+c.idx,p=["mCSB_"+c.idx+"_dragger_vertical","mCSB_"+c.idx+"_dragger_horizontal"],f=e("#mCSB_"+c.idx+"_container"),m=e("#"+p[0]+",#"+p[1]),g=d.advanced.releaseDraggableSelectors?m.add(e(d.advanced.releaseDraggableSelectors)):m;m.bind("mousedown."+h+" touchstart."+h+" pointerdown."+h+" MSPointerDown."+h,function(i){if(i.stopImmediatePropagation(),i.preventDefault(),J(i)){u=!0,l&&(document.onselectstart=function(){return!1}),t(!1),Y(s),r=e(this);var n=r.offset(),c=T(i)[0]-n.top,h=T(i)[1]-n.left,p=r.height()+n.top,f=r.width()+n.left;p>c&&c>0&&f>h&&h>0&&(a=c,o=h),C(r,"active",d.autoExpandScrollbar)}}).bind("touchmove."+h,function(e){e.stopImmediatePropagation(),e.preventDefault();var t=r.offset(),n=T(e)[0]-t.top,s=T(e)[1]-t.left;i(a,o,n,s)}),e(document).bind("mousemove."+h+" pointermove."+h+" MSPointerMove."+h,function(e){if(r){var t=r.offset(),n=T(e)[0]-t.top,s=T(e)[1]-t.left;if(a===n)return;i(a,o,n,s)}}).add(g).bind("mouseup."+h+" touchend."+h+" pointerup."+h+" MSPointerUp."+h,function(){r&&(C(r,"active",d.autoExpandScrollbar),r=null),u=!1,l&&(document.onselectstart=null),t(!0)})},A=function(){function i(e){if(!ee(e)||u||T(e)[2])return void(t=0);t=1,_=0,x=0;var i=$.offset();c=T(e)[0]-i.top,d=T(e)[1]-i.left,P=[T(e)[0],T(e)[1]]}function r(e){if(ee(e)&&!u&&!T(e)[2]&&(e.stopImmediatePropagation(),!x||_)){m=K();var t=Q.offset(),i=T(e)[0]-t.top,n=T(e)[1]-t.left,r="mcsLinearOut";if(O.push(i),A.push(n),P[2]=Math.abs(T(e)[0]-P[0]),P[3]=Math.abs(T(e)[1]-P[1]),C.overflowed[0])var a=D[0].parent().height()-D[0].height(),o=c-i>0&&i-c>-(a*C.scrollRatio.y)&&(2*P[3]0&&n-d>-(s*C.scrollRatio.x)&&(2*P[2]30)){y=1e3/(g-f);var r="mcsEaseOut",a=2.5>y,o=a?[O[O.length-2],A[A.length-2]]:[0,0];v=a?[i-o[0],n-o[1]]:[i-h,n-p];var c=[Math.abs(v[0]),Math.abs(v[1])];y=a?[Math.abs(v[0]/4),Math.abs(v[1]/4)]:[y,y];var d=[Math.abs($[0].offsetTop)-v[0]*s(c[0]/y[0],y[0]),Math.abs($[0].offsetLeft)-v[1]*s(c[1]/y[1],y[1])];b="yx"===k.axis?[d[0],d[1]]:"x"===k.axis?[null,d[1]]:[d[0],null],w=[4*c[0]+k.scrollInertia,4*c[1]+k.scrollInertia];var j=parseInt(k.contentTouchScroll)||0;b[0]=c[0]>j?b[0]:0,b[1]=c[1]>j?b[1]:0,C.overflowed[0]&&l(b[0],w[0],r,"y",E,!1),C.overflowed[1]&&l(b[1],w[1],r,"x",E,!1)}}}function s(e,t){var i=[1.5*t,2*t,t/1.5,t/2];return e>90?t>4?i[0]:i[3]:e>60?t>3?i[3]:i[2]:e>30?t>8?i[1]:t>6?i[0]:t>4?t:i[2]:t>8?t:i[3]}function l(e,t,i,n,r,a){e&&X(j,e.toString(),{dur:t,scrollEasing:i,dir:n,overwrite:r,drag:a})}var c,d,h,p,f,m,g,v,y,b,w,_,x,j=e(this),C=j.data(n),k=C.opt,S=n+"_"+C.idx,Q=e("#mCSB_"+C.idx),$=e("#mCSB_"+C.idx+"_container"),D=[e("#mCSB_"+C.idx+"_dragger_vertical"),e("#mCSB_"+C.idx+"_dragger_horizontal")],O=[],A=[],M=0,E="yx"===k.axis?"none":"all",P=[],L=$.find("iframe"),R=["touchstart."+S+" pointerdown."+S+" MSPointerDown."+S,"touchmove."+S+" pointermove."+S+" MSPointerMove."+S,"touchend."+S+" pointerup."+S+" MSPointerUp."+S];$.bind(R[0],function(e){i(e)}).bind(R[1],function(e){r(e)}),Q.bind(R[0],function(e){a(e)}).bind(R[2],function(e){o(e)}),L.length&&L.each(function(){e(this).load(function(){I(this)&&e(this.contentDocument||this.contentWindow.document).bind(R[0],function(e){i(e),a(e)}).bind(R[1],function(e){r(e)}).bind(R[2],function(e){o(e)})})})},M=function(){function i(){return window.getSelection?window.getSelection().toString():document.selection&&"Control"!=document.selection.type?document.selection.createRange().text:0}function r(e,t,i){c.type=i&&a?"stepped":"stepless",c.scrollAmount=10,q(o,e,t,"mcsLinearOut",i?60:null)}var a,o=e(this),s=o.data(n),l=s.opt,c=s.sequential,d=n+"_"+s.idx,h=e("#mCSB_"+s.idx+"_container"),p=h.parent();h.bind("mousedown."+d,function(){t||a||(a=1,u=!0)}).add(document).bind("mousemove."+d,function(e){if(!t&&a&&i()){var n=h.offset(),o=T(e)[0]-n.top+h[0].offsetTop,u=T(e)[1]-n.left+h[0].offsetLeft;o>0&&o0&&uo?r("on",38):o>p.height()&&r("on",40)),"y"!==l.axis&&s.overflowed[1]&&(0>u?r("on",37):u>p.width()&&r("on",39)))}}).bind("mouseup."+d,function(){t||(a&&(a=0,r("off",null)),u=!1)})},E=function(){function t(t,n){if(Y(i),!P(i,t.target)){var o="auto"!==a.mouseWheel.deltaFactor?parseInt(a.mouseWheel.deltaFactor):l&&t.deltaFactor<100?100:t.deltaFactor||100;if("x"===a.axis||"x"===a.mouseWheel.axis)var c="x",d=[Math.round(o*r.scrollRatio.x),parseInt(a.mouseWheel.scrollAmount)],h="auto"!==a.mouseWheel.scrollAmount?d[1]:d[0]>=s.width()?.9*s.width():d[0],p=Math.abs(e("#mCSB_"+r.idx+"_container")[0].offsetLeft),f=u[1][0].offsetLeft,m=u[1].parent().width()-u[1].width(),g=t.deltaX||t.deltaY||n;else var c="y",d=[Math.round(o*r.scrollRatio.y),parseInt(a.mouseWheel.scrollAmount)],h="auto"!==a.mouseWheel.scrollAmount?d[1]:d[0]>=s.height()?.9*s.height():d[0],p=Math.abs(e("#mCSB_"+r.idx+"_container")[0].offsetTop),f=u[0][0].offsetTop,m=u[0].parent().height()-u[0].height(),g=t.deltaY||n;"y"===c&&!r.overflowed[0]||"x"===c&&!r.overflowed[1]||(a.mouseWheel.invert&&(g=-g),a.mouseWheel.normalizeDelta&&(g=0>g?-1:1),(g>0&&0!==f||0>g&&f!==m||a.mouseWheel.preventDefault)&&(t.stopImmediatePropagation(),t.preventDefault()),X(i,(p-g*h).toString(),{dir:c}))}}var i=e(this),r=i.data(n),a=r.opt,o=n+"_"+r.idx,s=e("#mCSB_"+r.idx),u=[e("#mCSB_"+r.idx+"_dragger_vertical"),e("#mCSB_"+r.idx+"_dragger_horizontal")],c=e("#mCSB_"+r.idx+"_container").find("iframe");r&&(c.length&&c.each(function(){e(this).load(function(){I(this)&&e(this.contentDocument||this.contentWindow.document).bind("mousewheel."+o,function(e,i){t(e,i)})})}),s.bind("mousewheel."+o,function(e,i){t(e,i)}))},I=function(e){var t=null;try{var i=e.contentDocument||e.contentWindow.document;t=i.body.innerHTML}catch(e){}return null!==t},P=function(t,i){var r=i.nodeName.toLowerCase(),a=t.data(n).opt.mouseWheel.disableOver,o=["select","textarea"];return e.inArray(r,a)>-1&&!(e.inArray(r,o)>-1&&!e(i).is(":focus"))},L=function(){var t=e(this),i=t.data(n),r=n+"_"+i.idx,a=e("#mCSB_"+i.idx+"_container"),o=a.parent(),s=e(".mCSB_"+i.idx+"_scrollbar ."+c[12]);s.bind("touchstart."+r+" pointerdown."+r+" MSPointerDown."+r,function(){u=!0}).bind("touchend."+r+" pointerup."+r+" MSPointerUp."+r,function(){u=!1}).bind("click."+r,function(n){if(e(n.target).hasClass(c[12])||e(n.target).hasClass("mCSB_draggerRail")){Y(t);var r=e(this),s=r.find(".mCSB_dragger");if(r.parent(".mCSB_scrollTools_horizontal").length>0){if(!i.overflowed[1])return;var l="x",u=n.pageX>s.offset().left?-1:1,d=Math.abs(a[0].offsetLeft)-.9*u*o.width()}else{if(!i.overflowed[0])return;var l="y",u=n.pageY>s.offset().top?-1:1,d=Math.abs(a[0].offsetTop)-.9*u*o.height()}X(t,d.toString(),{dir:l,scrollEasing:"mcsEaseInOut"})}})},R=function(){var t=e(this),i=t.data(n),r=i.opt,a=n+"_"+i.idx,o=e("#mCSB_"+i.idx+"_container"),s=o.parent();o.bind("focusin."+a,function(){var i=e(document.activeElement),n=o.find(".mCustomScrollBox").length,a=0;i.is(r.advanced.autoScrollOnFocus)&&(Y(t),clearTimeout(t[0]._focusTimeout),t[0]._focusTimer=n?(a+17)*n:0,t[0]._focusTimeout=setTimeout(function(){var e=[ie(i)[0],ie(i)[1]],n=[o[0].offsetTop,o[0].offsetLeft],l=[n[0]+e[0]>=0&&n[0]+e[0]=0&&n[0]+e[1]a");l.bind("mousedown."+o+" touchstart."+o+" pointerdown."+o+" MSPointerDown."+o+" mouseup."+o+" touchend."+o+" pointerup."+o+" MSPointerUp."+o+" mouseout."+o+" pointerout."+o+" MSPointerOut."+o+" click."+o,function(n){function o(e,i){a.scrollAmount=r.snapAmount||r.scrollButtons.scrollAmount,q(t,e,i)}if(n.preventDefault(),J(n)){var s=e(this).attr("class");switch(a.type=r.scrollButtons.scrollType,n.type){case"mousedown":case"touchstart":case"pointerdown":case"MSPointerDown":if("stepped"===a.type)return;u=!0,i.tweenRunning=!1,o("on",s);break;case"mouseup":case"touchend":case"pointerup":case"MSPointerUp":case"mouseout":case"pointerout":case"MSPointerOut":if("stepped"===a.type)return;u=!1,a.dir&&o("off",s);break;case"click":if("stepped"!==a.type||i.tweenRunning)return;o("on",s)}}})},z=function(){function t(t){function n(e,t){o.type=a.keyboard.scrollType,o.scrollAmount=a.snapAmount||a.keyboard.scrollAmount,"stepped"===o.type&&r.tweenRunning||q(i,e,t)}switch(t.type){case"blur":r.tweenRunning&&o.dir&&n("off",null);break;case"keydown":case"keyup":var s=t.keyCode?t.keyCode:t.which,l="on";if("x"!==a.axis&&(38===s||40===s)||"y"!==a.axis&&(37===s||39===s)){if((38===s||40===s)&&!r.overflowed[0]||(37===s||39===s)&&!r.overflowed[1])return;"keyup"===t.type&&(l="off"),e(document.activeElement).is(d)||(t.preventDefault(),t.stopImmediatePropagation(),n(l,s))}else if(33===s||34===s){if((r.overflowed[0]||r.overflowed[1])&&(t.preventDefault(),t.stopImmediatePropagation()),"keyup"===t.type){Y(i);var h=34===s?-1:1;if("x"===a.axis||"yx"===a.axis&&r.overflowed[1]&&!r.overflowed[0])var p="x",f=Math.abs(u[0].offsetLeft)-.9*h*c.width();else var p="y",f=Math.abs(u[0].offsetTop)-.9*h*c.height();X(i,f.toString(),{dir:p,scrollEasing:"mcsEaseInOut"})}}else if((35===s||36===s)&&!e(document.activeElement).is(d)&&((r.overflowed[0]||r.overflowed[1])&&(t.preventDefault(),t.stopImmediatePropagation()),"keyup"===t.type)){if("x"===a.axis||"yx"===a.axis&&r.overflowed[1]&&!r.overflowed[0])var p="x",f=35===s?Math.abs(c.width()-u.outerWidth(!1)):0;else var p="y",f=35===s?Math.abs(c.height()-u.outerHeight(!1)):0;X(i,f.toString(),{dir:p,scrollEasing:"mcsEaseInOut"})}}}var i=e(this),r=i.data(n),a=r.opt,o=r.sequential,s=n+"_"+r.idx,l=e("#mCSB_"+r.idx),u=e("#mCSB_"+r.idx+"_container"),c=u.parent(),d="input,textarea,select,datalist,keygen,[contenteditable='true']",h=u.find("iframe"),p=["blur."+s+" keydown."+s+" keyup."+s];h.length&&h.each(function(){e(this).load(function(){I(this)&&e(this.contentDocument||this.contentWindow.document).bind(p[0],function(e){t(e)})})}),l.attr("tabindex","0").bind(p[0],function(e){t(e)})},q=function(t,i,r,a,o){function s(e){var i="stepped"!==h.type,n=o?o:e?i?m/1.5:g:1e3/60,r=e?i?7.5:40:2.5,l=[Math.abs(p[0].offsetTop),Math.abs(p[0].offsetLeft)],c=[u.scrollRatio.y>10?10:u.scrollRatio.y,u.scrollRatio.x>10?10:u.scrollRatio.x],d="x"===h.dir[0]?l[1]+h.dir[1]*c[1]*r:l[0]+h.dir[1]*c[0]*r,f="x"===h.dir[0]?l[1]+h.dir[1]*parseInt(h.scrollAmount):l[0]+h.dir[1]*parseInt(h.scrollAmount),v="auto"!==h.scrollAmount?f:d,y=a?a:e?i?"mcsLinearOut":"mcsEaseInOut":"mcsLinear",b=!!e;return e&&17>n&&(v="x"===h.dir[0]?l[1]:l[0]),X(t,v.toString(),{dir:h.dir[0],scrollEasing:y,dur:n,onComplete:b}),e?void(h.dir=!1):(clearTimeout(h.step),void(h.step=setTimeout(function(){s()},n)))}function l(){clearTimeout(h.step),Z(h,"step"),Y(t)}var u=t.data(n),d=u.opt,h=u.sequential,p=e("#mCSB_"+u.idx+"_container"),f="stepped"===h.type,m=d.scrollInertia<26?26:d.scrollInertia,g=d.scrollInertia<1?17:d.scrollInertia;switch(i){case"on":if(h.dir=[r===c[16]||r===c[15]||39===r||37===r?"x":"y",r===c[13]||r===c[15]||38===r||37===r?-1:1],Y(t),te(r)&&"stepped"===h.type)return;s(f);break;case"off":l(),(f||u.tweenRunning&&h.dir)&&s(!0)}},F=function(t){var i=e(this).data(n).opt,r=[];return"function"==typeof t&&(t=t()),t instanceof Array?r=t.length>1?[t[0],t[1]]:"x"===i.axis?[null,t[0]]:[t[0],null]:(r[0]=t.y?t.y:t.x||"x"===i.axis?null:t,r[1]=t.x?t.x:t.y||"y"===i.axis?null:t),"function"==typeof r[0]&&(r[0]=r[0]()),"function"==typeof r[1]&&(r[1]=r[1]()),r},W=function(t,i){if(null!=t&&"undefined"!=typeof t){var r=e(this),a=r.data(n),o=a.opt,s=e("#mCSB_"+a.idx+"_container"),l=s.parent(),u=typeof t;i||(i="x"===o.axis?"x":"y");var c="x"===i?s.outerWidth(!1):s.outerHeight(!1),h="x"===i?s[0].offsetLeft:s[0].offsetTop,p="x"===i?"left":"top";switch(u){case"function":return t();case"object":var f=t.jquery?t:e(t);if(!f.length)return;return"x"===i?ie(f)[1]:ie(f)[0];case"string":case"number":if(te(t))return Math.abs(t);if(-1!==t.indexOf("%"))return Math.abs(c*parseInt(t)/100);if(-1!==t.indexOf("-="))return Math.abs(h-parseInt(t.split("-=")[1]));if(-1!==t.indexOf("+=")){var m=h+parseInt(t.split("+=")[1]);return m>=0?0:Math.abs(m)}if(-1!==t.indexOf("px")&&te(t.split("px")[0]))return Math.abs(t.split("px")[0]);if("top"===t||"left"===t)return 0;if("bottom"===t)return Math.abs(l.height()-s.outerHeight(!1));if("right"===t)return Math.abs(l.width()-s.outerWidth(!1));if("first"===t||"last"===t){var f=s.find(":"+t);return"x"===i?ie(f)[1]:ie(f)[0]}return e(t).length?"x"===i?ie(e(t))[1]:ie(e(t))[0]:(s.css(p,t),void d.update.call(null,r[0]))}}},U=function(t){function i(){clearTimeout(p[0].autoUpdate),p[0].autoUpdate=setTimeout(function(){return h.advanced.updateOnSelectorChange&&(f=o(),f!==w)?(s(3),void(w=f)):(h.advanced.updateOnContentResize&&(m=[p.outerHeight(!1),p.outerWidth(!1),v.height(),v.width(),b()[0],b()[1]],(m[0]!==_[0]||m[1]!==_[1]||m[2]!==_[2]||m[3]!==_[3]||m[4]!==_[4]||m[5]!==_[5])&&(s(m[0]!==_[0]||m[1]!==_[1]),_=m)),h.advanced.updateOnImageLoad&&(g=r(),g!==x&&(p.find("img").each(function(){a(this)}),x=g)),void((h.advanced.updateOnSelectorChange||h.advanced.updateOnContentResize||h.advanced.updateOnImageLoad)&&i()))},60)}function r(){var e=0;return h.advanced.updateOnImageLoad&&(e=p.find("img").length),e}function a(t){function i(e,t){return function(){return t.apply(e,arguments)}}function n(){this.onload=null,e(t).addClass(c[2]),s(2)}if(e(t).hasClass(c[2]))return void s();var r=new Image;r.onload=i(r,n),r.src=t.src}function o(){h.advanced.updateOnSelectorChange===!0&&(h.advanced.updateOnSelectorChange="*");var t=0,i=p.find(h.advanced.updateOnSelectorChange);return h.advanced.updateOnSelectorChange&&i.length>0&&i.each(function(){t+=e(this).height()+e(this).width()}),t}function s(e){clearTimeout(p[0].autoUpdate),d.update.call(null,l[0],e)}var l=e(this),u=l.data(n),h=u.opt,p=e("#mCSB_"+u.idx+"_container");if(t)return clearTimeout(p[0].autoUpdate),void Z(p[0],"autoUpdate");var f,m,g,v=p.parent(),y=[e("#mCSB_"+u.idx+"_scrollbar_vertical"),e("#mCSB_"+u.idx+"_scrollbar_horizontal")],b=function(){return[y[0].is(":visible")?y[0].outerHeight(!0):0,y[1].is(":visible")?y[1].outerWidth(!0):0]},w=o(),_=[p.outerHeight(!1),p.outerWidth(!1),v.height(),v.width(),b()[0],b()[1]],x=r();i()},N=function(e,t,i){return Math.round(e/t)*t-i},Y=function(t){var i=t.data(n),r=e("#mCSB_"+i.idx+"_container,#mCSB_"+i.idx+"_container_wrapper,#mCSB_"+i.idx+"_dragger_vertical,#mCSB_"+i.idx+"_dragger_horizontal");r.each(function(){V.call(this)})},X=function(t,i,r){function a(e){return l&&u.callbacks[e]&&"function"==typeof u.callbacks[e]}function o(){return[u.callbacks.alwaysTriggerOffsets||b>=w[0]+x,u.callbacks.alwaysTriggerOffsets||-j>=b]}function s(){var e=[p[0].offsetTop,p[0].offsetLeft],i=[v[0].offsetTop,v[0].offsetLeft],n=[p.outerHeight(!1),p.outerWidth(!1)],a=[h.height(),h.width()];t[0].mcs={content:p,top:e[0],left:e[1],draggerTop:i[0],draggerLeft:i[1],topPct:Math.round(100*Math.abs(e[0])/(Math.abs(n[0])-a[0])),leftPct:Math.round(100*Math.abs(e[1])/(Math.abs(n[1])-a[1])),direction:r.dir}}var l=t.data(n),u=l.opt,c={trigger:"internal",dir:"y",scrollEasing:"mcsEaseOut",drag:!1,dur:u.scrollInertia,overwrite:"all",callbacks:!0,onStart:!0,onUpdate:!0,onComplete:!0},r=e.extend(c,r),d=[r.dur,r.drag?0:r.dur],h=e("#mCSB_"+l.idx),p=e("#mCSB_"+l.idx+"_container"),f=p.parent(),m=u.callbacks.onTotalScrollOffset?F.call(t,u.callbacks.onTotalScrollOffset):[0,0],g=u.callbacks.onTotalScrollBackOffset?F.call(t,u.callbacks.onTotalScrollBackOffset):[0,0]; -if(l.trigger=r.trigger,(0!==f.scrollTop()||0!==f.scrollLeft())&&(e(".mCSB_"+l.idx+"_scrollbar").css("visibility","visible"),f.scrollTop(0).scrollLeft(0)),"_resetY"!==i||l.contentReset.y||(a("onOverflowYNone")&&u.callbacks.onOverflowYNone.call(t[0]),l.contentReset.y=1),"_resetX"!==i||l.contentReset.x||(a("onOverflowXNone")&&u.callbacks.onOverflowXNone.call(t[0]),l.contentReset.x=1),"_resetY"!==i&&"_resetX"!==i){switch(!l.contentReset.y&&t[0].mcs||!l.overflowed[0]||(a("onOverflowY")&&u.callbacks.onOverflowY.call(t[0]),l.contentReset.x=null),!l.contentReset.x&&t[0].mcs||!l.overflowed[1]||(a("onOverflowX")&&u.callbacks.onOverflowX.call(t[0]),l.contentReset.x=null),u.snapAmount&&(i=N(i,u.snapAmount,u.snapOffset)),r.dir){case"x":var v=e("#mCSB_"+l.idx+"_dragger_horizontal"),y="left",b=p[0].offsetLeft,w=[h.width()-p.outerWidth(!1),v.parent().width()-v.width()],_=[i,0===i?0:i/l.scrollRatio.x],x=m[1],j=g[1],k=x>0?x/l.scrollRatio.x:0,S=j>0?j/l.scrollRatio.x:0;break;case"y":var v=e("#mCSB_"+l.idx+"_dragger_vertical"),y="top",b=p[0].offsetTop,w=[h.height()-p.outerHeight(!1),v.parent().height()-v.height()],_=[i,0===i?0:i/l.scrollRatio.y],x=m[0],j=g[0],k=x>0?x/l.scrollRatio.y:0,S=j>0?j/l.scrollRatio.y:0}_[1]<0||0===_[0]&&0===_[1]?_=[0,0]:_[1]>=w[1]?_=[w[0],w[1]]:_[0]=-_[0],t[0].mcs||(s(),a("onInit")&&u.callbacks.onInit.call(t[0])),clearTimeout(p[0].onCompleteTimeout),(l.tweenRunning||!(0===b&&_[0]>=0||b===w[0]&&_[0]<=w[0]))&&(G(v[0],y,Math.round(_[1]),d[1],r.scrollEasing),G(p[0],y,Math.round(_[0]),d[0],r.scrollEasing,r.overwrite,{onStart:function(){r.callbacks&&r.onStart&&!l.tweenRunning&&(a("onScrollStart")&&(s(),u.callbacks.onScrollStart.call(t[0])),l.tweenRunning=!0,C(v),l.cbOffsets=o())},onUpdate:function(){r.callbacks&&r.onUpdate&&a("whileScrolling")&&(s(),u.callbacks.whileScrolling.call(t[0]))},onComplete:function(){if(r.callbacks&&r.onComplete){"yx"===u.axis&&clearTimeout(p[0].onCompleteTimeout);var e=p[0].idleTimer||0;p[0].onCompleteTimeout=setTimeout(function(){a("onScroll")&&(s(),u.callbacks.onScroll.call(t[0])),a("onTotalScroll")&&_[1]>=w[1]-k&&l.cbOffsets[0]&&(s(),u.callbacks.onTotalScroll.call(t[0])),a("onTotalScrollBack")&&_[1]<=S&&l.cbOffsets[1]&&(s(),u.callbacks.onTotalScrollBack.call(t[0])),l.tweenRunning=!1,p[0].idleTimer=0,C(v,"hide")},e)}}}))}},G=function(e,t,i,n,r,a,o){function s(){_.stop||(y||f.call(),y=K()-v,l(),y>=_.time&&(_.time=y>_.time?y+h-(y-_.time):y+h-1,_.time0?(_.currVal=d(_.time,b,x,n,r),w[t]=Math.round(_.currVal)+"px"):w[t]=i+"px",m.call()}function u(){h=1e3/60,_.time=y+h,p=window.requestAnimationFrame?window.requestAnimationFrame:function(e){return l(),setTimeout(e,.01)},_.id=p(s)}function c(){null!=_.id&&(window.requestAnimationFrame?window.cancelAnimationFrame(_.id):clearTimeout(_.id),_.id=null)}function d(e,t,i,n,r){switch(r){case"linear":case"mcsLinear":return i*e/n+t;case"mcsLinearOut":return e/=n,e--,i*Math.sqrt(1-e*e)+t;case"easeInOutSmooth":return e/=n/2,1>e?i/2*e*e+t:(e--,-i/2*(e*(e-2)-1)+t);case"easeInOutStrong":return e/=n/2,1>e?i/2*Math.pow(2,10*(e-1))+t:(e--,i/2*(-Math.pow(2,-10*e)+2)+t);case"easeInOut":case"mcsEaseInOut":return e/=n/2,1>e?i/2*e*e*e+t:(e-=2,i/2*(e*e*e+2)+t);case"easeOutSmooth":return e/=n,e--,-i*(e*e*e*e-1)+t;case"easeOutStrong":return i*(-Math.pow(2,-10*e/n)+1)+t;case"easeOut":case"mcsEaseOut":default:var a=(e/=n)*e,o=a*e;return t+i*(.499999999999997*o*a+-2.5*a*a+5.5*o+-6.5*a+4*e)}}e._mTween||(e._mTween={top:{},left:{}});var h,p,o=o||{},f=o.onStart||function(){},m=o.onUpdate||function(){},g=o.onComplete||function(){},v=K(),y=0,b=e.offsetTop,w=e.style,_=e._mTween[t];"left"===t&&(b=e.offsetLeft);var x=i-b;_.stop=0,"none"!==a&&c(),u()},K=function(){return window.performance&&window.performance.now?window.performance.now():window.performance&&window.performance.webkitNow?window.performance.webkitNow():Date.now?Date.now():(new Date).getTime()},V=function(){var e=this;e._mTween||(e._mTween={top:{},left:{}});for(var t=["top","left"],i=0;i=0&&n[0]+ie(r)[0]=0&&n[1]+ie(r)[1]")[0].getContext)},init:function(){var t=this.defaults;e.each(t,function(e,i){switch(e){case"aspectRatio":t[e]=H(q(i))||s;break;case"autoCropArea":t[e]=H(q(i))||.8;break;case"minWidth":case"minHeight":t[e]=H(q(i))||0;break;case"maxWidth":case"maxHeight":t[e]=H(q(i))||l}}),this.image={rotate:0},this.load()},load:function(){var t,i,n=this,a=this.$element,o=this.element,s=this.image,l="";a.is("img")?i=a.prop("src"):a.is("canvas")&&this.support.canvas&&(i=o.toDataURL()),i&&(this.replaced&&(s.rotate=0),this.defaults.checkImageOrigin&&(a.prop("crossOrigin")||this.isCrossOriginURL(i))&&(l=" crossOrigin"),this.$clone=t=e("'),t.one("load",function(){s.naturalWidth=this.naturalWidth||t.width(),s.naturalHeight=this.naturalHeight||t.height(),s.aspectRatio=s.naturalWidth/s.naturalHeight,n.url=i,n.ready=r,n.build()}),t.addClass(v).prependTo("body"))},isCrossOriginURL:function(e){var t=e.match(/^(https?:)\/\/([^\:\/\?#]+):?(\d*)/i);return!t||t[1]===n.protocol&&t[2]===n.hostname&&t[3]===n.port?a:r},build:function(){var t,i,n=this.$element,o=this.defaults;this.ready&&(this.built&&this.unbuild(),n.one(Q,o.build),t=e.Event(Q),n.trigger(t),t.isDefaultPrevented()||(this.$cropper=i=e(I.TEMPLATE),n.addClass(g),this.$clone.removeClass(v).prependTo(i),this.rotated||(this.$original=this.$clone.clone(),this.$original.addClass(g).prependTo(this.$cropper),this.originalImage=e.extend({},this.image)),this.$container=n.parent(),this.$container.append(i),this.$canvas=i.find(".cropper-canvas"),this.$dragger=i.find(".cropper-dragger"),this.$viewer=i.find(".cropper-viewer"),o.autoCrop?this.cropped=r:this.$dragger.addClass(g),o.dragCrop&&this.setDragMode("crop"),o.modal&&this.$canvas.addClass(m),!o.dashed&&this.$dragger.find(".cropper-dashed").addClass(g),!o.movable&&this.$dragger.find(".cropper-face").data(c,"move"),!o.resizable&&this.$dragger.find(".cropper-line, .cropper-point").addClass(g),this.addListeners(),this.initPreview(),this.built=r,this.update(),this.replaced=a,n.one($,o.built),n.trigger($)))},unbuild:function(){this.built&&(this.built=a,this.removeListeners(),this.$preview.empty(),this.$preview=o,this.$dragger=o,this.$canvas=o,this.$container=o,this.$cropper.remove(),this.$cropper=o)},update:function(e){this.initContainer(),this.initCropper(),this.initImage(),this.initDragger(),e?(this.setData(e,r),this.setDragMode("crop")):this.setData(this.defaults.data)},resize:function(){clearTimeout(this.resizing),this.resizing=setTimeout(e.proxy(this.update,this,this.getData()),200)},preview:function(){var t=this.image,i=this.dragger,n=t.width,r=t.height,a=i.left-t.left,o=i.top-t.top;this.$viewer.find("img").css({width:n,height:r,marginLeft:-a,marginTop:-o}),this.$preview.each(function(){var t=e(this),s=t.width()/i.width;t.find("img").css({width:n*s,height:r*s,marginLeft:-a*s,marginTop:-o*s})})},addListeners:function(){var n=this.defaults;this.$element.on(D,n.dragstart).on(T,n.dragmove).on(O,n.dragend),this.$cropper.on(_,e.proxy(this.dragstart,this)).on(S,e.proxy(this.dblclick,this)),n.zoomable&&this.$cropper.on(C,e.proxy(this.wheel,this)),n.multiple?this.$cropper.on(x,e.proxy(this.dragmove,this)).on(j,e.proxy(this.dragend,this)):i.on(x,this._dragmove=E(this.dragmove,this)).on(j,this._dragend=E(this.dragend,this)),t.on(k,this._resize=E(this.resize,this))},removeListeners:function(){var e=this.defaults;this.$element.off(D,e.dragstart).off(T,e.dragmove).off(O,e.dragend),this.$cropper.off(_,this.dragstart).off(S,this.dblclick),e.zoomable&&this.$cropper.off(C,this.wheel),e.multiple?this.$cropper.off(x,this.dragmove).off(j,this.dragend):i.off(x,this._dragmove).off(j,this._dragend),t.off(k,this._resize)},initPreview:function(){var t='';this.$preview=e(this.defaults.preview),this.$viewer.html(t),this.$preview.html(t).find("img").css("cssText","min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important;")},initContainer:function(){var e=this.$container;e!==o&&(this.container={width:R(e.width(),300),height:R(e.height(),150)})},initCropper:function(){var e,t=this.container,i=this.image;i.naturalWidth*t.height/i.naturalHeight-t.width>=0?(e={width:t.width,height:t.width/i.aspectRatio,left:0},e.top=(t.height-e.height)/2):(e={width:t.height*i.aspectRatio,height:t.height,top:0},e.left=(t.width-e.width)/2),this.$cropper.css({width:e.width,height:e.height,left:e.left,top:e.top}),this.cropper=e},initImage:function(){var t=this.image,i=this.cropper,n={_width:i.width,_height:i.height,width:i.width,height:i.height,left:0,top:0,ratio:i.width/t.naturalWidth};this.defaultImage=e.extend({},t,n),t._width!==i.width||t._height!==i.height?e.extend(t,n):(t=e.extend({},n,t),this.replaced&&(t.ratio=n.ratio)),this.image=t,this.renderImage()},renderImage:function(e){var t=this.image;"zoom"===e&&(t.left-=(t.width-t.oldWidth)/2,t.top-=(t.height-t.oldHeight)/2),t.left=L(R(t.left,t._width-t.width),0),t.top=L(R(t.top,t._height-t.height),0),this.$clone.css({width:t.width,height:t.height,marginLeft:t.left,marginTop:t.top}),e&&(this.defaults.done(this.getData()),this.preview())},initDragger:function(){var t,i=this.defaults,n=this.cropper,r=i.aspectRatio||this.image.aspectRatio,a=this.image.ratio;t=n.height*r-n.width>=0?{height:n.width/r,width:n.width,left:0,top:(n.height-n.width/r)/2,maxWidth:n.width,maxHeight:n.width/r}:{height:n.height,width:n.height*r,left:(n.width-n.height*r)/2,top:0,maxWidth:n.height*r,maxHeight:n.height},t.minWidth=0,t.minHeight=0,i.aspectRatio?(isFinite(i.maxWidth)?(t.maxWidth=L(t.maxWidth,i.maxWidth*a),t.maxHeight=t.maxWidth/r):isFinite(i.maxHeight)&&(t.maxHeight=L(t.maxHeight,i.maxHeight*a),t.maxWidth=t.maxHeight*r),i.minWidth>0?(t.minWidth=R(0,i.minWidth*a),t.minHeight=t.minWidth/r):i.minHeight>0&&(t.minHeight=R(0,i.minHeight*a),t.minWidth=t.minHeight*r)):(t.maxWidth=L(t.maxWidth,i.maxWidth*a),t.maxHeight=L(t.maxHeight,i.maxHeight*a),t.minWidth=R(0,i.minWidth*a),t.minHeight=R(0,i.minHeight*a)),t.minWidth=L(t.maxWidth,t.minWidth),t.minHeight=L(t.maxHeight,t.minHeight),t.height*=i.autoCropArea,t.width*=i.autoCropArea,t.left=(n.width-t.width)/2,t.top=(n.height-t.height)/2,t.oldLeft=t.left,t.oldTop=t.top,this.defaultDragger=t,this.dragger=e.extend({},t)},renderDragger:function(){var e=this.dragger,t=this.cropper;e.width>e.maxWidth?(e.width=e.maxWidth,e.left=e.oldLeft):e.widthe.maxHeight?(e.height=e.maxHeight,e.top=e.oldTop):e.height').one("load",function(){l.width=this.width,l.height=this.height,n.clearRect(0,0,l.width,l.height),n.drawImage(this,0,0),o.load()})))},setData:function(t,i){var n=this.cropper,r=this.dragger,a=this.image,s=this.defaults.aspectRatio;this.built&&typeof t!==u&&((t===o||e.isEmptyObject(t))&&(r=e.extend({},this.defaultDragger)),e.isPlainObject(t)&&!e.isEmptyObject(t)&&(i||(this.defaults.data=t),t=this.transformData(t),A(t.x)&&t.x<=n.width-a.left&&(r.left=t.x+a.left),A(t.y)&&t.y<=n.height-a.top&&(r.top=t.y+a.top),s?A(t.width)&&t.width<=r.maxWidth&&t.width>=r.minWidth?(r.width=t.width,r.height=r.width/s):A(t.height)&&t.height<=r.maxHeight&&t.height>=r.minHeight&&(r.height=t.height,r.width=r.height*s):(A(t.width)&&t.width<=r.maxWidth&&t.width>=r.minWidth&&(r.width=t.width),A(t.height)&&t.height<=r.maxHeight&&t.height>=r.minHeight&&(r.height=t.height))),this.dragger=r,this.renderDragger())},getData:function(e){var t=this.dragger,i=this.image,n={};return this.built&&(n={x:t.left-i.left,y:t.top-i.top,width:t.width,height:t.height},n=this.transformData(n,r,e)),n},transformData:function(t,i,n){var r=this.image.ratio,a={};return e.each(t,function(e,t){t=q(t),p.test(e)&&!isNaN(t)&&(a[e]=i?n?Math.round(t/r):t/r:t*r)}),a},setAspectRatio:function(e){var t="auto"===e;e=q(e),(t||!isNaN(e)&&e>0)&&(this.defaults.aspectRatio=t?s:e,this.built&&(this.initDragger(),this.renderDragger()))},getImageData:function(){var t={};return this.ready&&e.each(this.image,function(e,i){f.test(e)&&(t[e]=i)}),t},getDataURL:function(t,i,n){var r,a=e("")[0],o=this.getData(),s="";return e.isPlainObject(t)||(n=i,i=t,t={}),t=e.extend({width:o.width,height:o.height},t),this.cropped&&this.support.canvas&&(a.width=t.width,a.height=t.height,r=a.getContext("2d"),"image/jpeg"===i&&(r.fillStyle="#fff",r.fillRect(0,0,t.width,t.height)),r.drawImage(this.$clone[0],o.x,o.y,o.width,o.height,0,0,t.width,t.height),s=a.toDataURL(i,n)),s},setDragMode:function(e){var t=this.$canvas,i=this.defaults,n=a,o=a;if(this.built&&!this.disabled){switch(e){case"crop":i.dragCrop&&(n=r,t.data(c,e));break;case"move":o=r,t.data(c,e);break;default:t.removeData(c)}t.toggleClass(b,n).toggleClass(y,o)}},enable:function(){this.built&&(this.disabled=a,this.$cropper.removeClass(w))},disable:function(){this.built&&(this.disabled=r,this.$cropper.addClass(w))},rotate:function(e){var t=this.image;e=q(e)||0,this.built&&0!==e&&!this.disabled&&this.defaults.rotatable&&this.support.canvas&&(this.rotated=r,e=t.rotate=(t.rotate+e)%360,this.replace(this.getRotatedDataURL(e),!0))},getRotatedDataURL:function(t){var i=e("")[0],n=i.getContext("2d"),r=t*Math.PI/180,a=H(t)%180,o=a>90?180-a:a,s=o*Math.PI/180,l=this.originalImage,u=l.naturalWidth,c=l.naturalHeight,d=H(u*z(s)+c*B(s)),h=H(u*B(s)+c*z(s));return i.width=d,i.height=h,n.save(),n.translate(d/2,h/2),n.rotate(r),n.drawImage(this.$original[0],-u/2,-c/2,u,c),n.restore(),i.toDataURL()},zoom:function(e){var t,i,n,r=this.image;e=q(e),this.built&&e&&!this.disabled&&this.defaults.zoomable&&(t=r.width*(1+e),i=r.height*(1+e),n=t/r._width,n>10||(n<1&&(t=r._width,i=r._height),n<=1?this.setDragMode("crop"):this.setDragMode("move"),r.oldWidth=r.width,r.oldHeight=r.height,r.width=t,r.height=i,r.ratio=r.width/r.naturalWidth,this.renderImage("zoom")))},dblclick:function(){this.disabled||(this.$canvas.hasClass(b)?this.setDragMode("move"):this.setDragMode("crop"))},wheel:function(e){var t,i=e.originalEvent,n=117.25,r=5,a=166.66665649414062,o=.1;this.disabled||(e.preventDefault(),i.deltaY?(t=i.deltaY,t=t%r===0?t/r:t%n===0?t/n:t/a):t=i.wheelDelta?-i.wheelDelta/120:i.detail?i.detail/3:0,this.zoom(t*o))},dragstart:function(t){var i,n,o,s=t.originalEvent.touches,l=t;if(!this.disabled){if(s){if(o=s.length,o>1){if(!this.defaults.zoomable||2!==o)return;l=s[1],this.startX2=l.pageX,this.startY2=l.pageY,i="zoom"}l=s[0]}if(i=i||e(l.target).data(c),h.test(i)){if(t.preventDefault(),n=e.Event(D),this.$element.trigger(n),n.isDefaultPrevented())return;this.directive=i,this.cropping=a,this.startX=l.pageX,this.startY=l.pageY,"crop"===i&&(this.cropping=r,this.$canvas.addClass(m))}}},dragmove:function(t){var i,n,r=t.originalEvent.touches,a=t;if(!this.disabled){if(r){if(n=r.length,n>1){if(!this.defaults.zoomable||2!==n)return;a=r[1],this.endX2=a.pageX,this.endY2=a.pageY}a=r[0]}if(this.directive){if(t.preventDefault(),i=e.Event(T),this.$element.trigger(i),i.isDefaultPrevented())return;this.endX=a.pageX,this.endY=a.pageY,this.dragging()}}},dragend:function(t){var i;if(!this.disabled&&this.directive){if(t.preventDefault(),i=e.Event(O),this.$element.trigger(i),i.isDefaultPrevented())return;this.cropping&&(this.cropping=a,this.$canvas.toggleClass(m,this.cropped&&this.defaults.modal)),this.directive=""}},dragging:function(){var e,t=this.directive,i=this.image,n=this.cropper,o=n.width,s=n.height,l=this.dragger,u=l.width,c=l.height,d=l.left,h=l.top,p=d+u,f=h+c,m=r,v=this.defaults,y=v.aspectRatio,b={x:this.endX-this.startX,y:this.endY-this.startY};switch(y&&(b.X=b.y*y,b.Y=b.x/y),t){case"all":d+=b.x,h+=b.y;break;case"e":if(b.x>=0&&(p>=o||y&&(h<=0||f>=s))){m=a;break}u+=b.x,y&&(c=u/y,h-=b.Y/2),u<0&&(t="w",u=0);break;case"n":if(b.y<=0&&(h<=0||y&&(d<=0||p>=o))){m=a;break}c-=b.y,h+=b.y,y&&(u=c*y,d+=b.X/2),c<0&&(t="s",c=0);break;case"w":if(b.x<=0&&(d<=0||y&&(h<=0||f>=s))){m=a;break}u-=b.x,d+=b.x,y&&(c=u/y,h+=b.Y/2),u<0&&(t="e",u=0);break;case"s":if(b.y>=0&&(f>=s||y&&(d<=0||p>=o))){m=a;break}c+=b.y,y&&(u=c*y,d-=b.X/2),c<0&&(t="n",c=0);break;case"ne":if(y){if(b.y<=0&&(h<=0||p>=o)){m=a;break}c-=b.y,h+=b.y,u=c*y}else b.x>=0?p0&&(c-=b.y,h+=b.y):(c-=b.y,h+=b.y);c<0&&(t="sw",c=0,u=0);break;case"nw":if(y){if(b.y<=0&&(h<=0||d<=0)){m=a;break}c-=b.y,h+=b.y,u=c*y,d+=b.X}else b.x<=0?d>0?(u-=b.x,d+=b.x):b.y<=0&&h<=0&&(m=a):(u-=b.x,d+=b.x),b.y<=0?h>0&&(c-=b.y,h+=b.y):(c-=b.y,h+=b.y);c<0&&(t="se",c=0,u=0);break;case"sw":if(y){if(b.x<=0&&(d<=0||f>=s)){m=a;break}u-=b.x,d+=b.x,c=u/y}else b.x<=0?d>0?(u-=b.x,d+=b.x):b.y>=0&&f>=s&&(m=a):(u-=b.x,d+=b.x),b.y>=0?f=0&&(p>=o||f>=s)){m=a;break}u+=b.x,c=u/y}else b.x>=0?p=0&&f>=s&&(m=a):u+=b.x,b.y>=0?f0?b.y>0?t="se":(t="ne",h-=c):b.y>0?(t="sw",d-=u):(t="nw",d-=u,h-=c),this.cropped||(this.cropped=r,this.$dragger.removeClass(g)))}m&&(l.width=u,l.height=c,l.left=d,l.top=h,this.directive=t,this.renderDragger()),this.startX=this.endX,this.startY=this.endY}},I.TEMPLATE=function(e,t){return t=t.split(","),e.replace(/\d+/g,function(e){return t[e]})}('<0 6="5-container"><0 6="5-canvas"><0 6="5-dragger"><1 6="5-viewer"><1 6="5-8 8-h"><1 6="5-8 8-v"><1 6="5-face" 3-2="all"><1 6="5-7 7-e" 3-2="e"><1 6="5-7 7-n" 3-2="n"><1 6="5-7 7-w" 3-2="w"><1 6="5-7 7-s" 3-2="s"><1 6="5-4 4-e" 3-2="e"><1 6="5-4 4-n" 3-2="n"><1 6="5-4 4-w" 3-2="w"><1 6="5-4 4-s" 3-2="s"><1 6="5-4 4-ne" 3-2="ne"><1 6="5-4 4-nw" 3-2="nw"><1 6="5-4 4-sw" 3-2="sw"><1 6="5-4 4-se" 3-2="se">',"div,span,directive,data,point,cropper,class,line,dashed"),I.DEFAULTS={aspectRatio:"auto",autoCropArea:.8,data:{},done:e.noop,preview:"",multiple:a,autoCrop:r,dragCrop:r,dashed:r,modal:r,movable:r,resizable:r,zoomable:r,rotatable:r,checkImageOrigin:r,minWidth:0,minHeight:0,maxWidth:l,maxHeight:l,build:o,built:o,dragstart:o,dragmove:o,dragend:o},I.setDefaults=function(t){e.extend(I.DEFAULTS,t)},I.other=e.fn.cropper,e.fn.cropper=function(t){var i,n=M(arguments,1);return this.each(function(){var r,a=e(this),o=a.data("cropper");o||a.data("cropper",o=new I(this,t)),"string"==typeof t&&e.isFunction(r=o[t])&&(i=r.apply(o,n))}),typeof i!==u?i:this},e.fn.cropper.Constructor=I,e.fn.cropper.setDefaults=I.setDefaults,e.fn.cropper.noConflict=function(){return e.fn.cropper=I.other,this}}),function(e){function t(e,t){return"function"==typeof e?e.call(t):e}function i(e){for(;e=e.parentNode;)if(e==document)return!0;return!1}function n(t,i){this.$element=e(t),this.options=i,this.enabled=!0,this.fixTitle()}n.prototype={show:function(){var i=this.getTitle();if(i&&this.enabled){var n=this.tip();n.find(".tipsy-inner")[this.options.html?"html":"text"](i),n[0].className="tipsy",n.remove().css({top:0,left:0,visibility:"hidden",display:"block"}).prependTo(document.body);var r,a=e.extend({},this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight}),o=n[0].offsetWidth,s=n[0].offsetHeight,l=t(this.options.gravity,this.$element[0]);switch(l.charAt(0)){case"n":r={top:a.top+a.height+this.options.offset,left:a.left+a.width/2-o/2};break;case"s":r={top:a.top-s-this.options.offset,left:a.left+a.width/2-o/2};break;case"e":r={top:a.top+a.height/2-s/2,left:a.left-o-this.options.offset};break;case"w":extra_gap=0,e("body").css("position").length>0&&"relative"==e("body").css("position")&&e("#wpadminbar").length&&(extra_gap=e("#wpadminbar").height()),r={top:a.top+a.height/2-s/2-extra_gap,left:a.left+a.width+this.options.offset}}2==l.length&&("w"==l.charAt(1)?r.left=a.left+a.width/2-15:r.left=a.left+a.width/2-o+15),n.css(r).addClass("tipsy-"+l),n.find(".tipsy-arrow")[0].className="tipsy-arrow tipsy-arrow-"+l.charAt(0),this.options.className&&n.addClass(t(this.options.className,this.$element[0])),this.options.fade?n.stop().css({opacity:0,display:"block",visibility:"visible"}).animate({opacity:this.options.opacity}):n.css({visibility:"visible",opacity:this.options.opacity})}},hide:function(){this.options.fade?this.tip().stop().fadeOut(function(){e(this).remove()}):this.tip().remove()},fixTitle:function(){var e=this.$element;(e.attr("title")||"string"!=typeof e.attr("original-title"))&&e.attr("original-title",e.attr("title")||"").removeAttr("title")},getTitle:function(){var e,t=this.$element,i=this.options;this.fixTitle();var e,i=this.options;return"string"==typeof i.title?e=t.attr("title"==i.title?"original-title":i.title):"function"==typeof i.title&&(e=i.title.call(t[0])),e=(""+e).replace(/(^\s*|\s*$)/,""),e||i.fallback},tip:function(){return this.$tip||(this.$tip=e('
        ').html('
        '),this.$tip.data("tipsy-pointee",this.$element[0])),this.$tip},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled}},e.fn.tipsy=function(t){function i(i){var r=e.data(i,"tipsy");return r||(r=new n(i,e.fn.tipsy.elementOptions(i,t)),e.data(i,"tipsy",r)),r}function r(){var e=i(this);e.hoverState="in",0==t.delayIn?e.show():(e.fixTitle(),setTimeout(function(){"in"==e.hoverState&&e.show()},t.delayIn))}function a(){var e=i(this);e.hoverState="out",0==t.delayOut?e.hide():setTimeout(function(){"out"==e.hoverState&&e.hide()},t.delayOut)}if(t===!0)return this.data("tipsy");if("string"==typeof t){var o=this.data("tipsy");return o&&o[t](),this}if(t=e.extend({},e.fn.tipsy.defaults,t),t.live||this.each(function(){i(this)}),"manual"!=t.trigger){var s="hover"==t.trigger?"mouseenter":"focus",l="hover"==t.trigger?"mouseleave":"blur";t.live?e(document).on(s,this.selector,r).on(l,this.selector,a):this.bind(s,r).bind(l,a)}return this},e.fn.tipsy.defaults={className:null,delayIn:0,delayOut:0,fade:!1,fallback:"",gravity:"n",html:!1,live:!1,offset:0,opacity:.8,title:"title",trigger:"hover"},e.fn.tipsy.revalidate=function(){e(".tipsy").each(function(){var t=e.data(this,"tipsy-pointee");t&&i(t)||e(this).remove()})},e.fn.tipsy.elementOptions=function(t,i){return e.metadata?e.extend({},i,e(t).metadata()):i},e.fn.tipsy.autoNS=function(){return e(this).offset().top>e(document).scrollTop()+e(window).height()/2?"s":"n"},e.fn.tipsy.autoWE=function(){return e(this).offset().left>e(document).scrollLeft()+e(window).width()/2?"e":"w"},e.fn.tipsy.autoBounds=function(t,i){return function(){var n={ns:i[0],ew:i.length>1&&i[1]},r=e(document).scrollTop()+t,a=e(document).scrollLeft()+t,o=e(this);return o.offset().top=1&&(e.find("input[type=checkbox]:checked").length>1?e.find("input[type=checkbox]:checked").each(function(){t=t+jQuery(this).val()+" "}):t=e.find("input[type=checkbox]:checked").val()),e.find("input[type=radio]:checked").length>=1&&(t=e.find("input[type=radio]:checked").val())}return{type:i,value:t}}function n(e){var t=r(e);switch(t){case"text":case"number":case"date":case"textarea":case"select":case"multiselect":case"radio":case"checkbox":return e.find("input,textarea,select")}return""}function r(e){var t="",i=e.attr("class");return jQuery.each(i.split(" "),function(e,i){i.indexOf("um-field-type")!=-1&&(t=i.split("_")[1])}),t}function a(e){var t=[];return jQuery.each(f,function(i,n){n.field.parent==e&&t.push(n.field.condition)}),t}function o(e,t){for(var i=e.length%t,n=i,r=Math.floor(e.length/t),a=[],o=0;o1?e.parents(".um-field").find("input:checked").each(function(){um_live_value=um_live_value+jQuery(this).val()+" "}):e.parents(".um-field").find("input:checked").length>=1&&(um_live_value=e.parents(".um-field").find("input:checked").val())),e.is(":radio")&&(um_live_value=e.parents(".um-field").find("input[type=radio]:checked").val()),um_live_value}function l(e,t){var i=e.parents(".um-field[data-key]").data("key"),n=m[i],r=s(e);jQuery.each(n,function(t,i){"empty"==i.operator&&(r&&""!=r?u(e,i,!1):u(e,i,!0)),"not empty"==i.operator&&(r&&""!=r?u(e,i,!0):u(e,i,!1)),"equals to"==i.operator&&(i.value==r?u(e,i,!0):u(e,i,!1)),"not equals"==i.operator&&(jQuery.isNumeric(i.value)&&parseInt(r)!=parseInt(i.value)&&r?u(e,i,!0):jQuery.isNumeric(i.value)||i.value==r?u(e,i,!1):u(e,i,!0)),"greater than"==i.operator&&(jQuery.isNumeric(i.value)&&parseInt(r)>parseInt(i.value)?u(e,i,!0):u(e,i,!1)),"less than"==i.operator&&(jQuery.isNumeric(i.value)&&parseInt(r)=0?u(e,i,!0):u(e,i,!1))}),e.trigger("um_fields_change")}function u(e,t,i){var n=jQuery('div.um-field[data-key="'+t.owner+'"]');"show"==t.action&&i&&(n.show(),c(n)),"show"!=t.action||i||n.hide(),"hide"==t.action&&i&&n.hide(),"hide"!=t.action||i||(n.show(),c(n)),e.removeClass("um-field-has-changed")}function c(e){var t=r(e),i=e.data("key"),a=g[i];switch(t){case"text":case"number":case"date":case"textarea":e.find("input:text,input[type=number],textarea,select").val(a.value);break;case"select":e.find("select").find("option").prop("selected",!1),e.find("select").val(a.value),e.find("select").trigger("change");break;case"multiselect":e.find("select").find("option").prop("selected",!1),jQuery.each(a.value,function(t,i){e.find("select").find('option[value="'+i+'"]').attr("selected",!0)}),e.find("select").trigger("change");break;case"radio":case"checkbox":if(e.find("input[type=checkbox]:checked").length>=1)if(e.find("input[type=checkbox]:checked").removeAttr("checked"),e.find("span.um-field-checkbox-state i").removeClass("um-icon-android-checkbox-outline"),e.find("span.um-field-checkbox-state i").addClass("um-icon-android-checkbox-outline-blank"),e.find(".um-field-checkbox.active").removeClass("active"),jQuery.isArray(a.value))jQuery.each(a.value,function(t,i){ -var n=e.find('input[type=checkbox][value="'+i+'"]');n.attr("checked",!0),n.closest(".um-field-checkbox").find("i").removeClass("um-icon-android-checkbox-outline-blank"),n.closest(".um-field-checkbox").find("i").addClass("um-icon-android-checkbox-outline"),n.closest(".um-field-checkbox").addClass("active")});else{var o=e.find('input[type=checkbox][value="'+a.value+'"]');o.attr("checked",!0),o.closest(".um-field-checkbox").find("i").removeClass("um-icon-android-checkbox-outline-blank"),o.closest(".um-field-checkbox").find("i").addClass("um-icon-android-checkbox-outline"),o.closest(".um-field-checkbox").addClass("active")}e.find("input[type=radio]:checked").length>=1&&setTimeout(function(){e.find("input[type=radio]:checked").removeAttr("checked"),e.find("span.um-field-radio-state i").removeClass("um-icon-android-radio-button-on"),e.find("span.um-field-radio-state i").addClass("um-icon-android-radio-button-off"),e.find(".um-field-radio.active").removeClass("active");var t=e.find("input[type=radio][value='"+a.value+"']");t.attr("checked",!0),t.closest(".um-field-radio").find("i").removeClass("um-icon-android-radio-button-off"),t.closest(".um-field-radio").find("i").addClass("um-icon-android-radio-button-on"),t.closest(".um-field-radio").addClass("active")},100)}if(!e.hasClass("um-field-has-changed")){var s=n(e);s&&(s.trigger("change"),e.addClass("um-field-has-changed"))}}function d(){jQuery.each(m,function(e,t){(jQuery('.um-field[data-key="'+e+'"]:hidden').length>=1||"none"==jQuery('.um-field[data-key="'+e+'"]').css("display"))&&jQuery.each(t,function(e,t){jQuery('.um-field[data-key="'+t.owner+'"]').hide()})})}var h=[],p=[],f=[],m={},g={};jQuery(document).on("change",".um-field select, .um-field input[type=radio], .um-field input[type=checkbox]",function(){var e=jQuery(this);l(e,!1)}),jQuery(document).on("input change",".um-field input[type=text]",function(){var e=jQuery(this);l(e,!1)}),jQuery(document).on("um_fields_change",function(){d(),d()}),t()}),jQuery(document).ready(function(){function e(e,i,n,r){var a=e.data("um-parent");e.attr("name"),jQuery('select[name="'+a+'"]');e.find('option[value!=""]').remove(),e.hasClass("um-child-option-disabled")||e.removeAttr("disabled");var r=[];jQuery.each(i.items,function(e,t){r.push({id:e,text:t})}),e.select2("destroy"),e.select2({data:r,allowClear:!0,minimumResultsForSearch:10}),"undefined"==typeof i.field.default||e.data("um-original-value")?""!=e.data("um-original-value")&&e.val(e.data("um-original-value")).trigger("change"):e.val(i.field.default).trigger("change"),0==i.field.editable&&(e.addClass("um-child-option-disabled"),e.attr("disabled","disabled")),t[n]=i}jQuery(document).on("click",".um-dropdown a",function(e){return!1}),jQuery(document).on("click",".um-dropdown a.real_url",function(e){window.location=jQuery(this).attr("href")}),jQuery(document).on("click",".um-trigger-menu-on-click",function(e){return jQuery(".um-dropdown").hide(),menu=jQuery(this).find(".um-dropdown"),menu.show(),!1}),jQuery(document).on("click",".um-dropdown-hide",function(e){UM_hide_menus()}),jQuery(document).on("click","a.um-manual-trigger",function(){var e=jQuery(this).attr("data-child"),t=jQuery(this).attr("data-parent");jQuery(this).parents(t).find(e).trigger("click")}),jQuery(".um-tip-n").tipsy({gravity:"n",opacity:1,live:"a.live",offset:3}),jQuery(".um-tip-w").tipsy({gravity:"w",opacity:1,live:"a.live",offset:3}),jQuery(".um-tip-e").tipsy({gravity:"e",opacity:1,live:"a.live",offset:3}),jQuery(".um-tip-s").tipsy({gravity:"s",opacity:1,live:"a.live",offset:3}),jQuery(document).on("change",".um-field-area input[type=radio]",function(){var e=jQuery(this).parents(".um-field-area"),t=jQuery(this).parents("label");e.find(".um-field-radio").removeClass("active"),e.find(".um-field-radio").find("i").removeClass().addClass("um-icon-android-radio-button-off"),t.addClass("active"),t.find("i").removeClass().addClass("um-icon-android-radio-button-on")}),jQuery(document).on("change",".um-field-area input[type=checkbox]",function(){var e=(jQuery(this).parents(".um-field-area"),jQuery(this).parents("label"));e.hasClass("active")?(e.removeClass("active"),e.find("i").removeClass().addClass("um-icon-android-checkbox-outline-blank")):(e.addClass("active"),e.find("i").removeClass().addClass("um-icon-android-checkbox-outline"))}),jQuery(".um-datepicker").each(function(){if(elem=jQuery(this),""!=elem.attr("data-disabled_weekdays"))var e=JSON.parse(elem.attr("data-disabled_weekdays"));else var e=!1;var t=elem.attr("data-years"),i=elem.attr("data-date_min"),n=elem.attr("data-date_max"),r=i.split(","),a=n.split(","),o=r.length?new Date(r):null,s=r.length?new Date(a):null;if(o&&"Invalid Date"==o.toString()&&3==r.length){var l=r[1]+"/"+r[2]+"/"+r[0];o=new Date(Date.parse(l))}if(s&&"Invalid Date"==s.toString()&&3==a.length){var u=a[1]+"/"+a[2]+"/"+a[0];s=new Date(Date.parse(u))}elem.pickadate({selectYears:t,min:o,max:s,disable:e,format:elem.attr("data-format"),formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){elem.blur()},onClose:function(){elem.blur()}})}),jQuery(".um-timepicker").each(function(){elem=jQuery(this),elem.pickatime({format:elem.attr("data-format"),interval:parseInt(elem.attr("data-intervals")),formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){elem.blur()},onClose:function(){elem.blur()}})}),jQuery(".um-rating").raty({half:!1,starType:"i",number:function(){return jQuery(this).attr("data-number")},score:function(){return jQuery(this).attr("data-score")},scoreName:function(){return jQuery(this).attr("data-key")},hints:!1,click:function(e,t){live_field=this.id,live_value=e,um_conditional()}}),jQuery(".um-rating-readonly").raty({half:!1,starType:"i",number:function(){return jQuery(this).attr("data-number")},score:function(){return jQuery(this).attr("data-score")},scoreName:function(){return jQuery(this).attr("data-key")},hints:!1,readOnly:!0}),jQuery(document).on("click",".um .um-single-image-preview a.cancel",function(e){e.preventDefault();var t=jQuery(this).parents(".um-field"),i=jQuery(this).parents(".um-field").find(".um-single-image-preview img").attr("src");return t.find(".um-single-image-preview img").attr("src",""),t.find(".um-single-image-preview").hide(),t.find(".um-btn-auto-width").html("Upload"),t.find("input[type=hidden]").val("empty_file"),jQuery.ajax({url:um_scripts.ajaxurl,type:"post",data:{action:"ultimatemember_remove_file",src:i}}),!1}),jQuery(document).on("click",".um .um-single-file-preview a.cancel",function(e){e.preventDefault();var t=jQuery(this).parents(".um-field"),i=jQuery(this).parents(".um-field").find(".um-single-fileinfo a").attr("href");return t.find(".um-single-file-preview").hide(),t.find(".um-btn-auto-width").html("Upload"),t.find("input[type=hidden]").val("empty_file"),jQuery.ajax({url:um_scripts.ajaxurl,type:"post",data:{action:"ultimatemember_remove_file",src:i}}),!1}),jQuery(".um-s1,.um-s2").css({display:"block"}),jQuery(".um-s1").select2({allowClear:!0}),jQuery(".um-s2").select2({allowClear:!1,minimumResultsForSearch:10}),jQuery(document).on("click",".um-field-group-head:not(.disabled)",function(){var e=jQuery(this).parents(".um-field-group"),t=e.data("max_entries");e.find(".um-field-group-body").is(":hidden")?e.find(".um-field-group-body").show():e.find(".um-field-group-body:first").clone().appendTo(e),increase_id=0,e.find(".um-field-group-body").each(function(){increase_id++,jQuery(this).find("input").each(function(){var e=jQuery(this);e.attr("id",e.data("key")+"-"+increase_id),e.attr("name",e.data("key")+"-"+increase_id),e.parent().parent().find("label").attr("for",e.data("key")+"-"+increase_id)})}),t>0&&e.find(".um-field-group-body").length==t&&jQuery(this).addClass("disabled")}),jQuery(document).on("click",".um-field-group-cancel",function(e){e.preventDefault();var t=jQuery(this).parents(".um-field-group"),i=t.data("max_entries");return t.find(".um-field-group-body").length>1?jQuery(this).parents(".um-field-group-body").remove():jQuery(this).parents(".um-field-group-body").hide(),i>0&&t.find(".um-field-group-body").length
        '),jQuery(".um-dropdown").hide(),um_responsive(),user_id=jQuery(this).attr("data-user_id"),metakey="cover_photo",jQuery.ajax({url:um_scripts.ajaxurl,type:"post",data:{action:"ultimatemember_delete_cover_photo",metakey:metakey,user_id:user_id}})}),e(),jQuery("textarea[id=um-meta-bio]").change(e),jQuery("textarea[id=um-meta-bio]").keyup(e),jQuery(".um-profile-edit a.um_delete-item").click(function(e){e.preventDefault();var t=confirm("Are you sure that you want to delete this user?");if(!t)return!1})}),jQuery(document).ready(function(){var e=jQuery(".um-account-main").attr("data-current_tab");e&&jQuery(".um-account-tab[data-tab="+e+"]").show(),jQuery(document).on("click",".um-account-side li a",function(e){e.preventDefault();var t=jQuery(this);t.parents("ul").find("li a").removeClass("current"),t.addClass("current");var i=jQuery(this).attr("href"),n=jQuery(this).attr("data-tab");return jQuery("input[id=_um_account_tab]:hidden").val(n),window.history.pushState("","",i),jQuery(".um-account-tab").hide(),jQuery(".um-account-tab[data-tab="+n+"]").fadeIn(),jQuery(".um-account-nav a").removeClass("current"),jQuery(".um-account-nav a[data-tab="+n+"]").addClass("current"),!1})}),jQuery(document).on("click",".um-account-nav a",function(e){e.preventDefault();var t=jQuery(this).attr("data-tab"),i=jQuery(this).parents("div"),n=jQuery(this);return jQuery("input[id=_um_account_tab]:hidden").val(t),jQuery(".um-account-tab").hide(),n.hasClass("current")?(i.next(".um-account-tab").slideUp(),n.removeClass("current")):(i.next(".um-account-tab").slideDown(),n.parents("div").find("a").removeClass("current"),n.addClass("current")),jQuery(".um-account-side li a").removeClass("current"),jQuery(".um-account-side li a[data-tab="+t+"]").addClass("current"),!1}); \ No newline at end of file +function um_field_init(){jQuery(".um-field[data-key]").each(function(){um_field_set_conditions(jQuery(this),!0)}),um_field_relationship(),um_field_apply_conditions(),um_field_loaded=!0}function um_field_set_conditions(e,t){for(var i=e.data("key"),n=[],r=0;r<5;r++){var a=e.data("cond-"+r+"-action"),o=e.data("cond-"+r+"-field"),s=e.data("cond-"+r+"-operator"),l=e.data("cond-"+r+"-value");"undefined"!=typeof l&&0==um_field_loaded&&n.push({child:i,action:a,field:o,operator:s,value:l})}jQuery.inArray(i,um_field_added)<=-1&&0==um_field_loaded&&(um_field_added.push(i),um_field_conditions_array[i]=n)}function um_field_apply_conditions(){var e={};jQuery.each(um_field_added,function(t,i){um_field_relations[i].length<=0&&(um_field_relations[i]=[{child:i,action:"child",field:"",operator:""}]),jQuery.each(um_field_relations[i],function(t,n){var r=!0,a=n.action,o=n.value,s=n.operator,l=(n.field,"");l=jQuery('.um-field[data-key="'+i+'"]:visible').find("input[type=text],textarea,input[type=checkbox],input[type=radio],select");var u=um_get_field_data(l),c=u.key,d=u.value,h=jQuery('.um-field[data-key="'+n.child+'"]').find("input[type=text],textarea,input[type=checkbox],input[type=radio],select"),p=jQuery('.um-field[data-key="'+n.child+'"]');"show"==a&&"undefined"!=typeof o&&("empty"==s&&(d&&""!=d?p.hide():(um_field_show(h,r,s,c),e[n.child]=[a,!0,s])),"not empty"==s&&(d&&""!=d?(um_field_show(h,r,s,c),e[n.child]=[a,!0,s]):p.hide()),"equals to"==s&&(o==d?(um_field_show(h,r,s,c),e[n.child]=[a,!0,s]):p.hide()),"not equals"==s&&(jQuery.isNumeric(o)&&parseInt(d)!=parseInt(o)&&d?(um_field_show(h,r,s,c),e[n.child]=[a,!0,s]):jQuery.isNumeric(o)||o==d?p.hide():(um_field_show(h,r,s,c),e[n.child]=[a,!0,s])),"greater than"==s&&(jQuery.isNumeric(o)&&parseInt(d)>parseInt(o)?(um_field_show(h,r,s,c),e[n.child]=[a,!0,s]):p.hide()),"less than"==s&&(jQuery.isNumeric(o)&&parseInt(d)=0?(um_field_show(h,r,s,c),e[n.child]=[a,!0,s]):p.hide())),"hide"==a&&"undefined"!=typeof o&&("empty"==s&&(d&&""!=d?p.show():(um_field_hide(h,r,s,c),e[n.child]=[a,!0,s])),"not empty"==s&&(d&&""!=d?(um_field_hide(h,r,s,c),e[n.child]=[a,!0,s]):p.show()),"equals to"==s&&(o==d?(um_field_hide(h,r,s,c),e[n.child]=[a,!0,s]):p.show()),"not equals"==s&&(jQuery.isNumeric(o)&&parseInt(d)!=parseInt(o)&&d?(um_field_hide(h,r,s,c),e[n.child]=[a,!0,s]):jQuery.isNumeric(o)||o==d?p.show():(um_field_hide(h,r,s,c),e[n.child]=[a,!0,s])),"greater than"==s&&(jQuery.isNumeric(o)&&parseInt(d)>parseInt(o)?(um_field_hide(h,r,s,c),e[n.child]=[a,!0,s]):p.show()),"less than"==s&&(jQuery.isNumeric(o)&&parseInt(d)=0?(um_field_hide(h,r,s,c),e[n.child]=[a,!0,s]):p.show()))})})}function um_field_show(e,t,i,n){e=e.parents(".um-field"),e.is(":hidden")&&(t?e.fadeIn():e.show())}function um_field_hide(e,t,i,n){e=e.parents(".um-field"),e.is(":visible")&&(t?e.fadeOut():e.hide())}function um_get_field_data(e){return um_live_field=e.parents(".um-field").data("key"),um_live_value=e.val(),e.is(":checkbox")&&(e.parents(".um-field").find("input:checked").length>1?(um_live_value="",e.parents(".um-field").find("input:checked").each(function(){um_live_value=um_live_value+e.val()+" "})):um_live_value=e.parents(".um-field").find("input:checked").val()),e.is(":radio")&&(um_live_value=e.parents(".um-field").find("input[type=radio]:checked").val()),{key:um_live_field,value:um_live_value}}function um_field_relationship(){var e=um_field_conditions_array;0==um_field_loaded&&jQuery.each(e,function(t,i){var n=[],r=[];jQuery.each(e,function(e,i){for(var a=0;a<=i.length;a++)"undefined"!=typeof i[a]&&t==i[a].field&&(n.push(i[a]),r.push(i[a].child))}),um_field_relations[t]=n})}function UM_check_password_matched(){jQuery(document).on("keyup","input[data-key=user_password],input[data-key=confirm_user_password]",function(e){var t=jQuery("input[data-key=user_password]").val(),i=jQuery("input[data-key=confirm_user_password]").val(),n=jQuery("input[data-key=user_password],input[data-key=confirm_user_password]");t||i?t!==i?n.removeClass("um-validate-matched").addClass("um-validate-not-matched"):n.removeClass("um-validate-not-matched").addClass("um-validate-matched"):n.removeClass("um-validate-matched").removeClass("um-validate-not-matched")})}function UM_hide_menus(){menu=jQuery(".um-dropdown"),menu.parents("div").find("a").removeClass("active"),menu.hide()}function UM_domenus(){jQuery(".um-dropdown").each(function(){var e=jQuery(this),t=jQuery(this).attr("data-element"),i=jQuery(this).attr("data-position");jQuery(t).addClass("um-trigger-menu-on-"+e.attr("data-trigger")),jQuery(window).width()<=1200&&"div.um-profile-edit"==t&&(i="lc"),"lc"==i&&(200>jQuery(t).find("img").width()?left_p=(jQuery(t).width()-jQuery(t).find("img").width())/2+(jQuery(t).find("img").width()-200)/2:left_p=(jQuery(t).width()-jQuery(t).find("img").width())/2,top_=parseInt(jQuery(t).find("a").css("top")),top_?(top_p=jQuery(t).find("img").height()+4+top_,left_gap=4):(top_p=jQuery(t).find("img").height()+4,left_gap=0),4==top_p&&"div.um-cover"==t?top_p=jQuery(t).height()/2+e.height()/2:4==top_p&&(top_p=jQuery(t).height()+20),gap_right=jQuery(t).width()+17,e.css({top:0,width:200,left:"auto",right:gap_right+"px","text-align":"center"}),e.find(".um-dropdown-arr").find("i").removeClass().addClass("um-icon-arrow-right-b"),e.find(".um-dropdown-arr").css({top:"4px",left:"auto",right:"-17px"})),"bc"==i&&(200>jQuery(t).find("img").width()?left_p=(jQuery(t).width()-jQuery(t).find("img").width())/2+(jQuery(t).find("img").width()-200)/2:left_p=(jQuery(t).width()-jQuery(t).find("img").width())/2,top_=parseInt(jQuery(t).find("a").css("top")),top_?(top_p=jQuery(t).find("img").height()+4+top_,left_gap=4):(top_p=jQuery(t).find("img").height()+4,left_gap=0),4==top_p&&"div.um-cover"==t?top_p=jQuery(t).height()/2+e.height()/2:4==top_p&&(top_p=jQuery(t).height()+20),e.css({top:top_p,width:200,left:left_p+left_gap,right:"auto","text-align":"center"}),e.find(".um-dropdown-arr").find("i").removeClass().addClass("um-icon-arrow-up-b"),e.find(".um-dropdown-arr").css({top:"-17px",left:e.width()/2-12,right:"auto"}))})}function um_responsive(){jQuery(".um").each(function(){element_width=jQuery(this).width(),element_width<=340?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob340")):element_width<=500?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob500")):element_width<=800?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob800")):element_width<=960?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob960")):element_width>960&&(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960")),jQuery(".um-account-nav").length>0&&jQuery(".um-account-side").is(":visible")&&0==jQuery(".um-account-tab:visible").length&&jQuery(".um-account-side li a.current").trigger("click"),jQuery(this).css("opacity",1)}),jQuery(".um-cover, .um-member-cover").each(function(){var e=jQuery(this),t=e.data("ratio"),i=e.width(),n=t.split(":");calcHeight=Math.round(i/n[0])+"px",e.height(calcHeight),e.find(".um-cover-add").height(calcHeight)}),jQuery(".um-members").each(function(){UM_Member_Grid(jQuery(this))}),UM_domenus()}function UM_Member_Grid(e){e.masonry({itemSelector:".um-member",columnWidth:".um-member",gutter:".um-gutter-sizer"})}function initImageUpload_UM(e){e.data("upload_help_text")?upload_help_text=''+e.data("upload_help_text")+"":upload_help_text="",e.data("icon")?icon='':icon="",e.data("upload_text")?upload_text=''+e.data("upload_text")+"":upload_text="",e.uploadFile({url:um_scripts.imageupload,method:"POST",multiple:!1,formData:{key:e.data("key"),set_id:e.data("set_id"),set_mode:e.data("set_mode"),_wpnonce:e.data("nonce"),timestamp:e.data("timestamp")},fileName:e.data("key"),allowedTypes:e.data("allowed_types"),maxFileSize:e.data("max_size"),dragDropStr:icon+upload_text+upload_help_text,sizeErrorStr:e.data("max_size_error"),extErrorStr:e.data("extension_error"),maxFileCountErrorStr:e.data("max_files_error"),maxFileCount:1,showDelete:!1,showAbort:!1,showDone:!1,showFileCounter:!1,showStatusAfterSuccess:!0,onSubmit:function(t){e.parents(".um-modal-body").find(".um-error-block").remove()},onSuccess:function(t,i,n){e.selectedFiles=0;try{i=jQuery.parseJSON(i)}catch(e){return void console.log(e,i)}i.error&&""!=i.error?(e.parents(".um-modal-body").append('
        '+i.error+"
        "),e.parents(".um-modal-body").find(".upload-statusbar").hide(0),um_modal_responsive()):jQuery.each(i,function(t,i){var n=e.parents(".um-modal-body").find(".um-single-image-preview img"),r=e.parents(".um-modal-body").find(".um-single-image-preview");n.attr("src",i),n.load(function(){e.parents(".um-modal-body").find(".um-modal-btn.um-finish-upload.disabled").removeClass("disabled"),e.parents(".um-modal-body").find(".ajax-upload-dragdrop,.upload-statusbar").hide(0),r.show(0),um_modal_responsive()})})}})}function initFileUpload_UM(e){e.data("upload_help_text")?upload_help_text=''+e.data("upload_help_text")+"":upload_help_text="",e.data("icon")?icon='':icon="",e.data("upload_text")?upload_text=''+e.data("upload_text")+"":upload_text="",e.uploadFile({url:um_scripts.fileupload,method:"POST",multiple:!1,formData:{key:e.data("key"),set_id:e.data("set_id"),set_mode:e.data("set_mode"),_wpnonce:e.data("nonce"),timestamp:e.data("timestamp")},fileName:e.data("key"),allowedTypes:e.data("allowed_types"),maxFileSize:e.data("max_size"),dragDropStr:icon+upload_text+upload_help_text,sizeErrorStr:e.data("max_size_error"),extErrorStr:e.data("extension_error"),maxFileCountErrorStr:e.data("max_files_error"),maxFileCount:1,showDelete:!1,showAbort:!1,showDone:!1,showFileCounter:!1,showStatusAfterSuccess:!0,onSubmit:function(t){e.parents(".um-modal-body").find(".um-error-block").remove()},onSuccess:function(t,i,n){e.selectedFiles=0,i=jQuery.parseJSON(i),i.error&&""!=i.error?(e.parents(".um-modal-body").append('
        '+i.error+"
        "),e.parents(".um-modal-body").find(".upload-statusbar").hide(0),setTimeout(function(){um_modal_responsive()},1e3)):(jQuery.each(i,function(t,i){e.parents(".um-modal-body").find(".um-modal-btn.um-finish-upload.disabled").removeClass("disabled"),e.parents(".um-modal-body").find(".ajax-upload-dragdrop,.upload-statusbar").hide(0),e.parents(".um-modal-body").find(".um-single-file-preview").show(0),"icon"==t?e.parents(".um-modal-body").find(".um-single-fileinfo i").removeClass().addClass(i):"icon_bg"==t?e.parents(".um-modal-body").find(".um-single-fileinfo span.icon").css({"background-color":i}):"filename"==t?e.parents(".um-modal-body").find(".um-single-fileinfo span.filename").html(i):e.parents(".um-modal-body").find(".um-single-fileinfo a").attr("href",i)}),setTimeout(function(){um_modal_responsive()},1e3))}})}function initCrop_UM(){var e=jQuery(".um-modal .um-single-image-preview img").first(),t=jQuery(".um-modal .um-single-image-preview"),i=e.parent().attr("data-crop"),n=e.parent().attr("data-min_width"),r=e.parent().attr("data-min_height"),a=e.parent().attr("data-ratio");if(jQuery(".um-modal").find("#um_upload_single").attr("data-ratio"))var a=jQuery(".um-modal").find("#um_upload_single").attr("data-ratio"),o=a.split(":"),a=o[0];if(e.length&&""!=e.attr("src")){var s=jQuery(window).height()-(jQuery(".um-modal-footer a").height()+20)-50-jQuery(".um-modal-header:visible").height();if(e.css({height:"auto"}),t.css({height:"auto"}),jQuery(window).height()<=400?(t.css({height:s+"px","max-height":s+"px"}),e.css({height:"auto"})):(e.css({height:"auto","max-height":s+"px"}),t.css({height:e.height(),"max-height":s+"px"})),"square"==i)var l={minWidth:n,minHeight:r,dragCrop:!1,aspectRatio:1,zoomable:!1,rotatable:!1,dashed:!1,done:function(t){e.parent().attr("data-coord",Math.round(t.x)+","+Math.round(t.y)+","+Math.round(t.width)+","+Math.round(t.height))}};else if("cover"==i){Math.round(n/a)>0&&(r=Math.round(n/a));var l={minWidth:n,minHeight:r,dragCrop:!1,aspectRatio:a,zoomable:!1,rotatable:!1,dashed:!1,done:function(t){e.parent().attr("data-coord",Math.round(t.x)+","+Math.round(t.y)+","+Math.round(t.width)+","+Math.round(t.height))}}}else if("user"==i)var l={minWidth:n,minHeight:r,dragCrop:!0,aspectRatio:"auto",zoomable:!1,rotatable:!1,dashed:!1,done:function(t){e.parent().attr("data-coord",Math.round(t.x)+","+Math.round(t.y)+","+Math.round(t.width)+","+Math.round(t.height))}};0!=i&&(e.cropper(l),jQuery(".um-single-image-preview img.cropper-hidden").cropper("destroy"),jQuery(".um-single-image-preview img.lazyloaded").addClass("cropper-hidden"),jQuery(".um-single-image-preview img.lazyloaded").removeClass("lazyloaded"),jQuery(".um-single-image-preview .cropper-container").append('
        '))}}function um_new_modal(e,t,i,n){var r=jQuery("body").find(".um-modal-overlay");if(0==r.length)if(jQuery(".tipsy").hide(),UM_hide_menus(),jQuery("body,html,textarea").css("overflow","hidden"),jQuery(document).bind("touchmove",function(e){e.preventDefault()}),jQuery(".um-modal").on("touchmove",function(e){e.stopPropagation()}),i?jQuery("body").append('
        '):jQuery("body").append('
        '),jQuery("#"+e).prependTo(".um-modal"),i){jQuery(".um-modal").find(".um-modal-photo").html("");var a=jQuery(".um-modal-photo img"),o=jQuery(window).width()-60,s=jQuery(window).height()-.25*jQuery(window).height();a.attr("src",n),a.load(function(){jQuery("#"+e).show(),jQuery(".um-modal").show(),a.css({opacity:0}),a.css({"max-width":o}),a.css({"max-height":s}),jQuery(".um-modal").css({width:a.width(),"margin-left":"-"+a.width()/2+"px"}),a.animate({opacity:1},1e3),um_modal_responsive()})}else jQuery("#"+e).show(),jQuery(".um-modal").show(),um_modal_size(t),initImageUpload_UM(jQuery(".um-modal:visible").find(".um-single-image-upload")),initFileUpload_UM(jQuery(".um-modal:visible").find(".um-single-file-upload")),um_modal_responsive()}function um_modal_responsive(){var e=jQuery(".um-modal:visible"),t=jQuery(".um-modal-body.photo:visible");if(t.length){e.removeClass("uimob340"),e.removeClass("uimob500");var i=jQuery(".um-modal-photo img"),n=jQuery(window).width()-60,r=jQuery(window).height()-.25*jQuery(window).height();i.css({opacity:0}),i.css({"max-width":n}),i.css({"max-height":r}),jQuery(".um-modal").css({width:i.width(),"margin-left":"-"+i.width()/2+"px"}),i.animate({opacity:1},1e3);var a=(jQuery(window).height()-e.innerHeight())/2+"px";e.animate({bottom:a},300)}else if(e.length){var o=jQuery(window).width();if(e.removeClass("uimob340"),e.removeClass("uimob500"),o<=340)e.addClass("uimob340"),initCrop_UM(),e.animate({bottom:0},300);else if(o<=500)e.addClass("uimob500"),initCrop_UM(),e.animate({bottom:0},300);else if(o<=800){initCrop_UM();var a=(jQuery(window).height()-e.innerHeight())/2+"px";e.animate({bottom:a},300)}else if(o<=960){initCrop_UM();var a=(jQuery(window).height()-e.innerHeight())/2+"px";e.animate({bottom:a},300)}else if(o>960){initCrop_UM();var a=(jQuery(window).height()-e.innerHeight())/2+"px";e.animate({bottom:a},300)}}}function um_remove_modal(){jQuery("img.cropper-hidden").cropper("destroy"),jQuery("body,html,textarea").css("overflow","auto"),jQuery(document).unbind("touchmove"),jQuery('.um-modal div[id^="um_"]').hide().appendTo("body"),jQuery(".um-modal,.um-modal-overlay").remove()}function um_modal_size(e){jQuery(".um-modal:visible").addClass(e)}function um_modal_add_attr(e,t){jQuery(".um-modal:visible").data(e,t)}function prepare_Modal(){0==jQuery(".um-popup-overlay").length&&(jQuery("body").append('
        '),jQuery("body").append('
        '),jQuery(".um-popup").addClass("loading"),jQuery("body,html").css({overflow:"hidden"}))}function remove_Modal(){jQuery(".um-popup-overlay").length&&(jQuery(".tipsy").remove(),jQuery(".um-popup").empty().remove(),jQuery(".um-popup-overlay").empty().remove(),jQuery("body,html").css({overflow:"auto"}))}function show_Modal(e){jQuery(".um-popup-overlay").length&&(jQuery(".um-popup").removeClass("loading").html(e),jQuery(".um-tip-n").tipsy({gravity:"n",opacity:1,offset:3}),jQuery(".um-tip-w").tipsy({gravity:"w",opacity:1,offset:3}),jQuery(".um-tip-e").tipsy({gravity:"e",opacity:1,offset:3}),jQuery(".um-tip-s").tipsy({gravity:"s",opacity:1,offset:3}))}function responsive_Modal(){jQuery(".um-popup-overlay").length&&(ag_height=jQuery(window).height()-jQuery(".um-popup um-popup-header").outerHeight()-jQuery(".um-popup .um-popup-footer").outerHeight()-80,ag_height>350&&(ag_height=350),jQuery(".um-popup-autogrow:visible").length?(jQuery(".um-popup-autogrow:visible").css({height:ag_height+"px"}),jQuery(".um-popup-autogrow:visible").mCustomScrollbar({theme:"dark-3",mouseWheelPixels:500}).mCustomScrollbar("scrollTo","bottom",{scrollInertia:0})):jQuery(".um-popup-autogrow2:visible").length&&(jQuery(".um-popup-autogrow2:visible").css({"max-height":ag_height+"px"}),jQuery(".um-popup-autogrow2:visible").mCustomScrollbar({theme:"dark-3",mouseWheelPixels:500})))}function um_reset_field(e){jQuery(e).find("div.um-field-area").find("input,textarea,select").not(":button, :submit, :reset, :hidden").val("").removeAttr("checked").removeAttr("selected")}!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e("object"==typeof exports?require("jquery"):jQuery)}(function(e){var t=function(){if(e&&e.fn&&e.fn.select2&&e.fn.select2.amd)var t=e.fn.select2.amd;var t;return function(){if(!t||!t.requirejs){t?i=t:t={};var e,i,n;!function(t){function r(e,t){return w.call(e,t)}function a(e,t){var i,n,r,a,o,s,l,u,c,d,h,p=t&&t.split("/"),f=y.map,m=f&&f["*"]||{};if(e&&"."===e.charAt(0))if(t){for(e=e.split("/"),o=e.length-1,y.nodeIdCompat&&x.test(e[o])&&(e[o]=e[o].replace(x,"")),e=p.slice(0,p.length-1).concat(e),c=0;c0&&(e.splice(c-1,2),c-=2)}e=e.join("/")}else 0===e.indexOf("./")&&(e=e.substring(2));if((p||m)&&f){for(i=e.split("/"),c=i.length;c>0;c-=1){if(n=i.slice(0,c).join("/"),p)for(d=p.length;d>0;d-=1)if(r=f[p.slice(0,d).join("/")],r&&(r=r[n])){a=r,s=c;break}if(a)break;!l&&m&&m[n]&&(l=m[n],u=c)}!a&&l&&(a=l,s=u),a&&(i.splice(0,s,a),e=i.join("/"))}return e}function o(e,i){return function(){var n=_.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),p.apply(t,n.concat([e,i]))}}function s(e){return function(t){return a(t,e)}}function l(e){return function(t){g[e]=t}}function u(e){if(r(v,e)){var i=v[e];delete v[e],b[e]=!0,h.apply(t,i)}if(!r(g,e)&&!r(b,e))throw new Error("No "+e);return g[e]}function c(e){var t,i=e?e.indexOf("!"):-1;return i>-1&&(t=e.substring(0,i),e=e.substring(i+1,e.length)),[t,e]}function d(e){return function(){return y&&y.config&&y.config[e]||{}}}var h,p,f,m,g={},v={},y={},b={},w=Object.prototype.hasOwnProperty,_=[].slice,x=/\.js$/;f=function(e,t){var i,n=c(e),r=n[0];return e=n[1],r&&(r=a(r,t),i=u(r)),r?e=i&&i.normalize?i.normalize(e,s(t)):a(e,t):(e=a(e,t),n=c(e),r=n[0],e=n[1],r&&(i=u(r))),{f:r?r+"!"+e:e,n:e,pr:r,p:i}},m={require:function(e){return o(e)},exports:function(e){var t=g[e];return"undefined"!=typeof t?t:g[e]={}},module:function(e){return{id:e,uri:"",exports:g[e],config:d(e)}}},h=function(e,i,n,a){var s,c,d,h,p,y,w=[],_=typeof n;if(a=a||e,"undefined"===_||"function"===_){for(i=!i.length&&n.length?["require","exports","module"]:i,p=0;p0&&(t.call(arguments,e.prototype.constructor),r=i.prototype.constructor),r.apply(this,arguments)}function r(){this.constructor=n}var a=t(i),o=t(e);i.displayName=e.displayName,n.prototype=new r;for(var s=0;si;i++)e[i].apply(this,t)},i.Observable=n,i.generateChars=function(e){for(var t="",i=0;e>i;i++){var n=Math.floor(36*Math.random());t+=n.toString(36)}return t},i.bind=function(e,t){return function(){e.apply(t,arguments)}},i._convertData=function(e){for(var t in e){var i=t.split("-"),n=e;if(1!==i.length){for(var r=0;r":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},i.appendMany=function(t,i){if("1.7"===e.fn.jquery.substr(0,3)){var n=e();e.map(i,function(e){n=n.add(e)}),i=n}t.append(i)},i}),t.define("select2/results",["jquery","./utils"],function(e,t){function i(e,t,n){this.$element=e,this.data=n,this.options=t,i.__super__.constructor.call(this)}return t.Extend(i,t.Observable),i.prototype.render=function(){var t=e('
          ');return this.options.get("multiple")&&t.attr("aria-multiselectable","true"),this.$results=t,t},i.prototype.clear=function(){this.$results.empty()},i.prototype.displayMessage=function(t){var i=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=e('
        • '),r=this.options.get("translations").get(t.message);n.append(i(r(t.args))),n[0].className+=" select2-results__message",this.$results.append(n)},i.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},i.prototype.append=function(e){this.hideLoading();var t=[];if(null==e.results||0===e.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));e.results=this.sort(e.results);for(var i=0;i-1?t.attr("aria-selected","true"):t.attr("aria-selected","false")});var a=r.filter("[aria-selected=true]");a.length>0?a.first().trigger("mouseenter"):r.first().trigger("mouseenter")})},i.prototype.showLoading=function(e){this.hideLoading();var t=this.options.get("translations").get("searching"),i={disabled:!0,loading:!0,text:t(e)},n=this.option(i);n.className+=" loading-results",this.$results.prepend(n)},i.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},i.prototype.option=function(t){var i=document.createElement("li");i.className="select2-results__option";var n={role:"treeitem","aria-selected":"false"};t.disabled&&(delete n["aria-selected"],n["aria-disabled"]="true"),null==t.id&&delete n["aria-selected"],null!=t._resultId&&(i.id=t._resultId),t.title&&(i.title=t.title),t.children&&(n.role="group",n["aria-label"]=t.text,delete n["aria-selected"]);for(var r in n){var a=n[r];i.setAttribute(r,a)}if(t.children){var o=e(i),s=document.createElement("strong");s.className="select2-results__group",e(s),this.template(t,s);for(var l=[],u=0;u",{class:"select2-results__options select2-results__options--nested"});h.append(l),o.append(s),o.append(h)}else this.template(t,i);return e.data(i,"data",t),i},i.prototype.bind=function(t,i){var n=this,r=t.id+"-results";this.$results.attr("id",r),t.on("results:all",function(e){n.clear(),n.append(e.data),t.isOpen()&&n.setClasses()}),t.on("results:append",function(e){n.append(e.data),t.isOpen()&&n.setClasses()}),t.on("query",function(e){n.hideMessages(),n.showLoading(e)}),t.on("select",function(){t.isOpen()&&n.setClasses()}),t.on("unselect",function(){t.isOpen()&&n.setClasses()}),t.on("open",function(){n.$results.attr("aria-expanded","true"),n.$results.attr("aria-hidden","false"),n.setClasses(),n.ensureHighlightVisible()}),t.on("close",function(){n.$results.attr("aria-expanded","false"),n.$results.attr("aria-hidden","true"),n.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=n.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=n.getHighlightedResults();if(0!==e.length){var t=e.data("data");"true"==e.attr("aria-selected")?n.trigger("close",{}):n.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=n.getHighlightedResults(),t=n.$results.find("[aria-selected]"),i=t.index(e);if(0!==i){var r=i-1;0===e.length&&(r=0);var a=t.eq(r);a.trigger("mouseenter");var o=n.$results.offset().top,s=a.offset().top,l=n.$results.scrollTop()+(s-o);0===r?n.$results.scrollTop(0):0>s-o&&n.$results.scrollTop(l)}}),t.on("results:next",function(){var e=n.getHighlightedResults(),t=n.$results.find("[aria-selected]"),i=t.index(e),r=i+1;if(!(r>=t.length)){var a=t.eq(r);a.trigger("mouseenter");var o=n.$results.offset().top+n.$results.outerHeight(!1),s=a.offset().top+a.outerHeight(!1),l=n.$results.scrollTop()+s-o;0===r?n.$results.scrollTop(0):s>o&&n.$results.scrollTop(l)}}),t.on("results:focus",function(e){e.element.addClass("select2-results__option--highlighted")}),t.on("results:message",function(e){n.displayMessage(e)}),e.fn.mousewheel&&this.$results.on("mousewheel",function(e){var t=n.$results.scrollTop(),i=n.$results.get(0).scrollHeight-t+e.deltaY,r=e.deltaY>0&&t-e.deltaY<=0,a=e.deltaY<0&&i<=n.$results.height();r?(n.$results.scrollTop(0),e.preventDefault(),e.stopPropagation()):a&&(n.$results.scrollTop(n.$results.get(0).scrollHeight-n.$results.height()),e.preventDefault(),e.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(t){var i=e(this),r=i.data("data");return"true"===i.attr("aria-selected")?void(n.options.get("multiple")?n.trigger("unselect",{originalEvent:t,data:r}):n.trigger("close",{})):void n.trigger("select",{originalEvent:t,data:r})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(t){var i=e(this).data("data");n.getHighlightedResults().removeClass("select2-results__option--highlighted"),n.trigger("results:focus",{data:i,element:e(this)})})},i.prototype.getHighlightedResults=function(){var e=this.$results.find(".select2-results__option--highlighted");return e},i.prototype.destroy=function(){this.$results.remove()},i.prototype.ensureHighlightVisible=function(){var e=this.getHighlightedResults();if(0!==e.length){var t=this.$results.find("[aria-selected]"),i=t.index(e),n=this.$results.offset().top,r=e.offset().top,a=this.$results.scrollTop()+(r-n),o=r-n;a-=2*e.outerHeight(!1),2>=i?this.$results.scrollTop(0):(o>this.$results.outerHeight()||0>o)&&this.$results.scrollTop(a)}},i.prototype.template=function(t,i){var n=this.options.get("templateResult"),r=this.options.get("escapeMarkup"),a=n(t,i);null==a?i.style.display="none":"string"==typeof a?i.innerHTML=r(a):e(i).append(a)},i}),t.define("select2/keys",[],function(){var e={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return e}),t.define("select2/selection/base",["jquery","../utils","../keys"],function(e,t,i){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return t.Extend(n,t.Observable),n.prototype.render=function(){var t=e('');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),t.attr("title",this.$element.attr("title")),t.attr("tabindex",this._tabindex),this.$selection=t,t},n.prototype.bind=function(e,t){var n=this,r=(e.id+"-container",e.id+"-results");this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",r),n._attachCloseHandler(e); +}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.focus(),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex)}),e.on("disable",function(){n.$selection.attr("tabindex","-1")})},n.prototype._handleBlur=function(t){var i=this;window.setTimeout(function(){document.activeElement==i.$selection[0]||e.contains(i.$selection[0],document.activeElement)||i.trigger("blur",t)},1)},n.prototype._attachCloseHandler=function(t){e(document.body).on("mousedown.select2."+t.id,function(t){var i=e(t.target),n=i.closest(".select2"),r=e(".select2.select2-container--open");r.each(function(){var t=e(this);if(this!=n[0]){var i=t.data("element");i.select2("close")}})})},n.prototype._detachCloseHandler=function(t){e(document.body).off("mousedown.select2."+t.id)},n.prototype.position=function(e,t){var i=t.find(".selection");i.append(e)},n.prototype.destroy=function(){this._detachCloseHandler(this.container)},n.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},n}),t.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,i,n){function r(){r.__super__.constructor.apply(this,arguments)}return i.Extend(r,t),r.prototype.render=function(){var e=r.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html(''),e},r.prototype.bind=function(e,t){var i=this;r.__super__.bind.apply(this,arguments);var n=e.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",n),this.$selection.attr("aria-labelledby",n),this.$selection.on("mousedown",function(e){1===e.which&&i.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),e.on("selection:update",function(e){i.update(e.data)})},r.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},r.prototype.display=function(e,t){var i=this.options.get("templateSelection"),n=this.options.get("escapeMarkup");return n(i(e,t))},r.prototype.selectionContainer=function(){return e("")},r.prototype.update=function(e){if(0===e.length)return void this.clear();var t=e[0],i=this.$selection.find(".select2-selection__rendered"),n=this.display(t,i);i.empty().append(n),i.prop("title",t.title||t.text)},r}),t.define("select2/selection/multiple",["jquery","./base","../utils"],function(e,t,i){function n(e,t){n.__super__.constructor.apply(this,arguments)}return i.Extend(n,t),n.prototype.render=function(){var e=n.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('
            '),e},n.prototype.bind=function(t,i){var r=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){r.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(t){if(!r.options.get("disabled")){var i=e(this),n=i.parent(),a=n.data("data");r.trigger("unselect",{originalEvent:t,data:a})}})},n.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},n.prototype.display=function(e,t){var i=this.options.get("templateSelection"),n=this.options.get("escapeMarkup");return n(i(e,t))},n.prototype.selectionContainer=function(){var t=e('
          • ×
          • ');return t},n.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n1;if(n||i)return e.call(this,t);this.clear();var r=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(r)},t}),t.define("select2/selection/allowClear",["jquery","../keys"],function(e,t){function i(){}return i.prototype.bind=function(e,t,i){var n=this;e.call(this,t,i),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(e){n._handleClear(e)}),t.on("keypress",function(e){n._handleKeyboardClear(e,t)})},i.prototype._handleClear=function(e,t){if(!this.options.get("disabled")){var i=this.$selection.find(".select2-selection__clear");if(0!==i.length){t.stopPropagation();for(var n=i.data("data"),r=0;r0||0===i.length)){var n=e('×');n.data("data",i),this.$selection.find(".select2-selection__rendered").prepend(n)}},i}),t.define("select2/selection/search",["jquery","../utils","../keys"],function(e,t,i){function n(e,t,i){e.call(this,t,i)}return n.prototype.render=function(t){var i=e('');this.$searchContainer=i,this.$search=i.find("input");var n=t.call(this);return this._transferTabIndex(),n},n.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("open",function(){r.$search.trigger("focus")}),t.on("close",function(){r.$search.val(""),r.$search.removeAttr("aria-activedescendant"),r.$search.trigger("focus")}),t.on("enable",function(){r.$search.prop("disabled",!1),r._transferTabIndex()}),t.on("disable",function(){r.$search.prop("disabled",!0)}),t.on("focus",function(e){r.$search.trigger("focus")}),t.on("results:focus",function(e){r.$search.attr("aria-activedescendant",e.id)}),this.$selection.on("focusin",".select2-search--inline",function(e){r.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){r._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){e.stopPropagation(),r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented();var t=e.which;if(t===i.BACKSPACE&&""===r.$search.val()){var n=r.$searchContainer.prev(".select2-selection__choice");if(n.length>0){var a=n.data("data");r.searchRemoveChoice(a),e.preventDefault()}}});var a=document.documentMode,o=a&&11>=a;this.$selection.on("input.searchcheck",".select2-search--inline",function(e){return o?void r.$selection.off("input.search input.searchcheck"):void r.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(e){if(o&&"input"===e.type)return void r.$selection.off("input.search input.searchcheck");var t=e.which;t!=i.SHIFT&&t!=i.CTRL&&t!=i.ALT&&t!=i.TAB&&r.handleSearch(e)})},n.prototype._transferTabIndex=function(e){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},n.prototype.createPlaceholder=function(e,t){this.$search.attr("placeholder",t.text)},n.prototype.update=function(e,t){var i=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),e.call(this,t),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),i&&this.$search.focus()},n.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var e=this.$search.val();this.trigger("query",{term:e})}this._keyUpPrevented=!1},n.prototype.searchRemoveChoice=function(e,t){this.trigger("unselect",{data:t}),this.$search.val(t.text),this.handleSearch()},n.prototype.resizeSearch=function(){this.$search.css("width","25px");var e="";if(""!==this.$search.attr("placeholder"))e=this.$selection.find(".select2-selection__rendered").innerWidth();else{var t=this.$search.val().length+1;e=.75*t+"em"}this.$search.css("width",e)},n}),t.define("select2/selection/eventRelay",["jquery"],function(e){function t(){}return t.prototype.bind=function(t,i,n){var r=this,a=["open","opening","close","closing","select","selecting","unselect","unselecting"],o=["opening","closing","selecting","unselecting"];t.call(this,i,n),i.on("*",function(t,i){if(-1!==e.inArray(t,a)){i=i||{};var n=e.Event("select2:"+t,{params:i});r.$element.trigger(n),-1!==e.inArray(t,o)&&(i.prevented=n.isDefaultPrevented())}})},t}),t.define("select2/translation",["jquery","require"],function(e,t){function i(e){this.dict=e||{}}return i.prototype.all=function(){return this.dict},i.prototype.get=function(e){return this.dict[e]},i.prototype.extend=function(t){this.dict=e.extend({},t.all(),this.dict)},i._cache={},i.loadPath=function(e){if(!(e in i._cache)){var n=t(e);i._cache[e]=n}return new i(i._cache[e])},i}),t.define("select2/diacritics",[],function(){var e={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return e}),t.define("select2/data/base",["../utils"],function(e){function t(e,i){t.__super__.constructor.call(this)}return e.Extend(t,e.Observable),t.prototype.current=function(e){throw new Error("The `current` method must be defined in child classes.")},t.prototype.query=function(e,t){throw new Error("The `query` method must be defined in child classes.")},t.prototype.bind=function(e,t){},t.prototype.destroy=function(){},t.prototype.generateResultId=function(t,i){var n=t.id+"-result-";return n+=e.generateChars(4),n+=null!=i.id?"-"+i.id.toString():"-"+e.generateChars(4)},t}),t.define("select2/data/select",["./base","../utils","jquery"],function(e,t,i){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return t.Extend(n,e),n.prototype.current=function(e){var t=[],n=this;this.$element.find(":selected").each(function(){var e=i(this),r=n.item(e);t.push(r)}),e(t)},n.prototype.select=function(e){var t=this;if(e.selected=!0,i(e.element).is("option"))return e.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(n){var r=[];e=[e],e.push.apply(e,n);for(var a=0;a=0){var c=a.filter(n(u)),d=this.item(c),h=i.extend(!0,{},u,d),p=this.option(h);c.replaceWith(p)}else{var f=this.option(u);if(u.children){var m=this.convertToOptions(u.children);t.appendMany(f,m)}s.push(f)}}return s},n}),t.define("select2/data/ajax",["./array","../utils","jquery"],function(e,t,i){function n(e,t){this.ajaxOptions=this._applyDefaults(t.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),n.__super__.constructor.call(this,e,t)}return t.Extend(n,e),n.prototype._applyDefaults=function(e){var t={data:function(e){return i.extend({},e,{q:e.term})},transport:function(e,t,n){var r=i.ajax(e);return r.then(t),r.fail(n),r}};return i.extend({},t,e,!0)},n.prototype.processResults=function(e){return e},n.prototype.query=function(e,t){function n(){var n=a.transport(a,function(n){var a=r.processResults(n,e);r.options.get("debug")&&window.console&&console.error&&(a&&a.results&&i.isArray(a.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),t(a)},function(){r.trigger("results:message",{message:"errorLoading"})});r._request=n}var r=this;null!=this._request&&(i.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var a=i.extend({type:"GET"},this.ajaxOptions);"function"==typeof a.url&&(a.url=a.url.call(this.$element,e)),"function"==typeof a.data&&(a.data=a.data.call(this.$element,e)),this.ajaxOptions.delay&&""!==e.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(n,this.ajaxOptions.delay)):n()},n}),t.define("select2/data/tags",["jquery"],function(e){function t(t,i,n){var r=n.get("tags"),a=n.get("createTag");void 0!==a&&(this.createTag=a);var o=n.get("insertTag");if(void 0!==o&&(this.insertTag=o),t.call(this,i,n),e.isArray(r))for(var s=0;s0&&t.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):void e.call(this,t,i)},e}),t.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,i){this.maximumSelectionLength=i.get("maximumSelectionLength"),e.call(this,t,i)}return e.prototype.query=function(e,t,i){var n=this;this.current(function(r){var a=null!=r?r.length:0;return n.maximumSelectionLength>0&&a>=n.maximumSelectionLength?void n.trigger("results:message",{message:"maximumSelected",args:{maximum:n.maximumSelectionLength}}):void e.call(n,t,i)})},e}),t.define("select2/dropdown",["jquery","./utils"],function(e,t){function i(e,t){this.$element=e,this.options=t,i.__super__.constructor.call(this)}return t.Extend(i,t.Observable),i.prototype.render=function(){var t=e('');return t.attr("dir",this.options.get("dir")),this.$dropdown=t,t},i.prototype.bind=function(){},i.prototype.position=function(e,t){},i.prototype.destroy=function(){this.$dropdown.remove()},i}),t.define("select2/dropdown/search",["jquery","../utils"],function(e,t){function i(){}return i.prototype.render=function(t){var i=t.call(this),n=e('');return this.$searchContainer=n,this.$search=n.find("input"),i.prepend(n),i},i.prototype.bind=function(t,i,n){var r=this;t.call(this,i,n),this.$search.on("keydown",function(e){r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(t){e(this).off("keyup")}),this.$search.on("keyup input",function(e){r.handleSearch(e)}),i.on("open",function(){r.$search.attr("tabindex",0),r.$search.focus(),window.setTimeout(function(){r.$search.focus()},0)}),i.on("close",function(){r.$search.attr("tabindex",-1),r.$search.val("")}),i.on("results:all",function(e){if(null==e.query.term||""===e.query.term){var t=r.showSearch(e);t?r.$searchContainer.removeClass("select2-search--hide"):r.$searchContainer.addClass("select2-search--hide")}})},i.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},i.prototype.showSearch=function(e,t){return!0},i}),t.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,i,n){this.placeholder=this.normalizePlaceholder(i.get("placeholder")),e.call(this,t,i,n)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var i=t.slice(0),n=t.length-1;n>=0;n--){var r=t[n];this.placeholder.id===r.id&&i.splice(n,1)}return i},e}),t.define("select2/dropdown/infiniteScroll",["jquery"],function(e){function t(e,t,i,n){this.lastParams={},e.call(this,t,i,n),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return t.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&this.$results.append(this.$loadingMore)},t.prototype.bind=function(t,i,n){var r=this;t.call(this,i,n),i.on("query",function(e){r.lastParams=e,r.loading=!0}),i.on("query:append",function(e){r.lastParams=e,r.loading=!0}),this.$results.on("scroll",function(){var t=e.contains(document.documentElement,r.$loadingMore[0]);if(!r.loading&&t){var i=r.$results.offset().top+r.$results.outerHeight(!1),n=r.$loadingMore.offset().top+r.$loadingMore.outerHeight(!1);i+50>=n&&r.loadMore()}})},t.prototype.loadMore=function(){this.loading=!0;var t=e.extend({},{page:1},this.lastParams);t.page++,this.trigger("query:append",t)},t.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},t.prototype.createLoadingMore=function(){var t=e('
          • '),i=this.options.get("translations").get("loadingMore");return t.html(i(this.lastParams)),t},t}),t.define("select2/dropdown/attachBody",["jquery","../utils"],function(e,t){function i(t,i,n){this.$dropdownParent=n.get("dropdownParent")||e(document.body),t.call(this,i,n)}return i.prototype.bind=function(e,t,i){var n=this,r=!1;e.call(this,t,i),t.on("open",function(){n._showDropdown(),n._attachPositioningHandler(t),r||(r=!0,t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}))}),t.on("close",function(){n._hideDropdown(),n._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},i.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},i.prototype.position=function(e,t,i){t.attr("class",i.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=i},i.prototype.render=function(t){var i=e(""),n=t.call(this);return i.append(n),this.$dropdownContainer=i,i},i.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},i.prototype._attachPositioningHandler=function(i,n){var r=this,a="scroll.select2."+n.id,o="resize.select2."+n.id,s="orientationchange.select2."+n.id,l=this.$container.parents().filter(t.hasScroll);l.each(function(){e(this).data("select2-scroll-position",{x:e(this).scrollLeft(),y:e(this).scrollTop()})}),l.on(a,function(t){var i=e(this).data("select2-scroll-position");e(this).scrollTop(i.y)}),e(window).on(a+" "+o+" "+s,function(e){r._positionDropdown(),r._resizeDropdown()})},i.prototype._detachPositioningHandler=function(i,n){var r="scroll.select2."+n.id,a="resize.select2."+n.id,o="orientationchange.select2."+n.id,s=this.$container.parents().filter(t.hasScroll);s.off(r),e(window).off(r+" "+a+" "+o)},i.prototype._positionDropdown=function(){var t=e(window),i=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),r=null,a=this.$container.offset();a.bottom=a.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=a.top,o.bottom=a.top+o.height;var s={height:this.$dropdown.outerHeight(!1)},l={top:t.scrollTop(),bottom:t.scrollTop()+t.height()},u=l.topa.bottom+s.height,d={left:a.left,top:o.bottom},h=this.$dropdownParent;"static"===h.css("position")&&(h=h.offsetParent());var p=h.offset();d.top-=p.top,d.left-=p.left,i||n||(r="below"),c||!u||i?!u&&c&&i&&(r="below"):r="above",("above"==r||i&&"below"!==r)&&(d.top=o.top-s.height),null!=r&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+r), +this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+r)),this.$dropdownContainer.css(d)},i.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.width="auto"),this.$dropdown.css(e)},i.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},i}),t.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(t){for(var i=0,n=0;n0&&(d.dataAdapter=u.Decorate(d.dataAdapter,v)),d.maximumInputLength>0&&(d.dataAdapter=u.Decorate(d.dataAdapter,y)),d.maximumSelectionLength>0&&(d.dataAdapter=u.Decorate(d.dataAdapter,b)),d.tags&&(d.dataAdapter=u.Decorate(d.dataAdapter,m)),(null!=d.tokenSeparators||null!=d.tokenizer)&&(d.dataAdapter=u.Decorate(d.dataAdapter,g)),null!=d.query){var D=t(d.amdBase+"compat/query");d.dataAdapter=u.Decorate(d.dataAdapter,D)}if(null!=d.initSelection){var T=t(d.amdBase+"compat/initSelection");d.dataAdapter=u.Decorate(d.dataAdapter,T)}}if(null==d.resultsAdapter&&(d.resultsAdapter=i,null!=d.ajax&&(d.resultsAdapter=u.Decorate(d.resultsAdapter,j)),null!=d.placeholder&&(d.resultsAdapter=u.Decorate(d.resultsAdapter,x)),d.selectOnClose&&(d.resultsAdapter=u.Decorate(d.resultsAdapter,k))),null==d.dropdownAdapter){if(d.multiple)d.dropdownAdapter=w;else{var Q=u.Decorate(w,_);d.dropdownAdapter=Q}if(0!==d.minimumResultsForSearch&&(d.dropdownAdapter=u.Decorate(d.dropdownAdapter,S)),d.closeOnSelect&&(d.dropdownAdapter=u.Decorate(d.dropdownAdapter,$)),null!=d.dropdownCssClass||null!=d.dropdownCss||null!=d.adaptDropdownCssClass){var O=t(d.amdBase+"compat/dropdownCss");d.dropdownAdapter=u.Decorate(d.dropdownAdapter,O)}d.dropdownAdapter=u.Decorate(d.dropdownAdapter,C)}if(null==d.selectionAdapter){if(d.multiple?d.selectionAdapter=r:d.selectionAdapter=n,null!=d.placeholder&&(d.selectionAdapter=u.Decorate(d.selectionAdapter,a)),d.allowClear&&(d.selectionAdapter=u.Decorate(d.selectionAdapter,o)),d.multiple&&(d.selectionAdapter=u.Decorate(d.selectionAdapter,s)),null!=d.containerCssClass||null!=d.containerCss||null!=d.adaptContainerCssClass){var A=t(d.amdBase+"compat/containerCss");d.selectionAdapter=u.Decorate(d.selectionAdapter,A)}d.selectionAdapter=u.Decorate(d.selectionAdapter,l)}if("string"==typeof d.language)if(d.language.indexOf("-")>0){var M=d.language.split("-"),E=M[0];d.language=[d.language,E]}else d.language=[d.language];if(e.isArray(d.language)){var I=new c;d.language.push("en");for(var P=d.language,L=0;L0){for(var a=e.extend(!0,{},r),o=r.children.length-1;o>=0;o--){var s=r.children[o],l=i(n,s);null==l&&a.children.splice(o,1)}return a.children.length>0?a:i(n,a)}var u=t(r.text).toUpperCase(),c=t(n.term).toUpperCase();return u.indexOf(c)>-1?r:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:u.escapeMarkup,language:D,matcher:i,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(e){return e},templateResult:function(e){return e.text},templateSelection:function(e){return e.text},theme:"default",width:"resolve"}},T.prototype.set=function(t,i){var n=e.camelCase(t),r={};r[n]=i;var a=u._convertData(r);e.extend(this.defaults,a)};var Q=new T;return Q}),t.define("select2/options",["require","jquery","./defaults","./utils"],function(e,t,i,n){function r(t,r){if(this.options=t,null!=r&&this.fromElement(r),this.options=i.apply(this.options),r&&r.is("input")){var a=e(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=n.Decorate(this.options.dataAdapter,a)}}return r.prototype.fromElement=function(e){var i=["select2"];null==this.options.multiple&&(this.options.multiple=e.prop("multiple")),null==this.options.disabled&&(this.options.disabled=e.prop("disabled")),null==this.options.language&&(e.prop("lang")?this.options.language=e.prop("lang").toLowerCase():e.closest("[lang]").prop("lang")&&(this.options.language=e.closest("[lang]").prop("lang"))),null==this.options.dir&&(e.prop("dir")?this.options.dir=e.prop("dir"):e.closest("[dir]").prop("dir")?this.options.dir=e.closest("[dir]").prop("dir"):this.options.dir="ltr"),e.prop("disabled",this.options.disabled),e.prop("multiple",this.options.multiple),e.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),e.data("data",e.data("select2Tags")),e.data("tags",!0)),e.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),e.attr("ajax--url",e.data("ajaxUrl")),e.data("ajax--url",e.data("ajaxUrl")));var r={};r=t.fn.jquery&&"1."==t.fn.jquery.substr(0,2)&&e[0].dataset?t.extend(!0,{},e[0].dataset,e.data()):e.data();var a=t.extend(!0,{},r);a=n._convertData(a);for(var o in a)t.inArray(o,i)>-1||(t.isPlainObject(this.options[o])?t.extend(this.options[o],a[o]):this.options[o]=a[o]);return this},r.prototype.get=function(e){return this.options[e]},r.prototype.set=function(e,t){this.options[e]=t},r}),t.define("select2/core",["jquery","./options","./utils","./keys"],function(e,t,i,n){var r=function(e,i){null!=e.data("select2")&&e.data("select2").destroy(),this.$element=e,this.id=this._generateId(e),i=i||{},this.options=new t(i,e),r.__super__.constructor.call(this);var n=e.attr("tabindex")||0;e.data("old-tabindex",n),e.attr("tabindex","-1");var a=this.options.get("dataAdapter");this.dataAdapter=new a(e,this.options);var o=this.render();this._placeContainer(o);var s=this.options.get("selectionAdapter");this.selection=new s(e,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,o);var l=this.options.get("dropdownAdapter");this.dropdown=new l(e,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,o);var u=this.options.get("resultsAdapter");this.results=new u(e,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var c=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(e){c.trigger("selection:update",{data:e})}),e.addClass("select2-hidden-accessible"),e.attr("aria-hidden","true"),this._syncAttributes(),e.data("select2",this)};return i.Extend(r,i.Observable),r.prototype._generateId=function(e){var t="";return t=null!=e.attr("id")?e.attr("id"):null!=e.attr("name")?e.attr("name")+"-"+i.generateChars(2):i.generateChars(4),t=t.replace(/(:|\.|\[|\]|,)/g,""),t="select2-"+t},r.prototype._placeContainer=function(e){e.insertAfter(this.$element);var t=this._resolveWidth(this.$element,this.options.get("width"));null!=t&&e.css("width",t)},r.prototype._resolveWidth=function(e,t){var i=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==t){var n=this._resolveWidth(e,"style");return null!=n?n:this._resolveWidth(e,"element")}if("element"==t){var r=e.outerWidth(!1);return 0>=r?"auto":r+"px"}if("style"==t){var a=e.attr("style");if("string"!=typeof a)return null;for(var o=a.split(";"),s=0,l=o.length;l>s;s+=1){var u=o[s].replace(/\s/g,""),c=u.match(i);if(null!==c&&c.length>=1)return c[1]}return null}return t},r.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},r.prototype._registerDomEvents=function(){var t=this;this.$element.on("change.select2",function(){t.dataAdapter.current(function(e){t.trigger("selection:update",{data:e})})}),this._sync=i.bind(this._syncAttributes,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._sync);var n=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=n?(this._observer=new n(function(i){e.each(i,t._sync)}),this._observer.observe(this.$element[0],{attributes:!0,subtree:!1})):this.$element[0].addEventListener&&this.$element[0].addEventListener("DOMAttrModified",t._sync,!1)},r.prototype._registerDataEvents=function(){var e=this;this.dataAdapter.on("*",function(t,i){e.trigger(t,i)})},r.prototype._registerSelectionEvents=function(){var t=this,i=["toggle","focus"];this.selection.on("toggle",function(){t.toggleDropdown()}),this.selection.on("focus",function(e){t.focus(e)}),this.selection.on("*",function(n,r){-1===e.inArray(n,i)&&t.trigger(n,r)})},r.prototype._registerDropdownEvents=function(){var e=this;this.dropdown.on("*",function(t,i){e.trigger(t,i)})},r.prototype._registerResultsEvents=function(){var e=this;this.results.on("*",function(t,i){e.trigger(t,i)})},r.prototype._registerEvents=function(){var e=this;this.on("open",function(){e.$container.addClass("select2-container--open")}),this.on("close",function(){e.$container.removeClass("select2-container--open")}),this.on("enable",function(){e.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){e.$container.addClass("select2-container--disabled")}),this.on("blur",function(){e.$container.removeClass("select2-container--focus")}),this.on("query",function(t){e.isOpen()||e.trigger("open",{}),this.dataAdapter.query(t,function(i){e.trigger("results:all",{data:i,query:t})})}),this.on("query:append",function(t){this.dataAdapter.query(t,function(i){e.trigger("results:append",{data:i,query:t})})}),this.on("keypress",function(t){var i=t.which;e.isOpen()?i===n.ESC||i===n.TAB||i===n.UP&&t.altKey?(e.close(),t.preventDefault()):i===n.ENTER?(e.trigger("results:select",{}),t.preventDefault()):i===n.SPACE&&t.ctrlKey?(e.trigger("results:toggle",{}),t.preventDefault()):i===n.UP?(e.trigger("results:previous",{}),t.preventDefault()):i===n.DOWN&&(e.trigger("results:next",{}),t.preventDefault()):(i===n.ENTER||i===n.SPACE||i===n.DOWN&&t.altKey)&&(e.open(),t.preventDefault())})},r.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},r.prototype.trigger=function(e,t){var i=r.__super__.trigger,n={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===t&&(t={}),e in n){var a=n[e],o={prevented:!1,name:e,args:t};if(i.call(this,a,o),o.prevented)return void(t.prevented=!0)}i.call(this,e,t)},r.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},r.prototype.open=function(){this.isOpen()||this.trigger("query",{})},r.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},r.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},r.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},r.prototype.focus=function(e){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},r.prototype.enable=function(e){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==e||0===e.length)&&(e=[!0]);var t=!e[0];this.$element.prop("disabled",t)},r.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var e=[];return this.dataAdapter.current(function(t){e=t}),e},r.prototype.val=function(t){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==t||0===t.length)return this.$element.val();var i=t[0];e.isArray(i)&&(i=e.map(i,function(e){return e.toString()})),this.$element.val(i).trigger("change")},r.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._sync),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&this.$element[0].removeEventListener("DOMAttrModified",this._sync,!1),this._sync=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},r.prototype.render=function(){var t=e('');return t.attr("dir",this.options.get("dir")),this.$container=t,this.$container.addClass("select2-container--"+this.options.get("theme")),t.data("element",this.$element),t},r}),t.define("select2/compat/utils",["jquery"],function(e){function t(t,i,n){var r,a,o=[];r=e.trim(t.attr("class")),r&&(r=""+r,e(r.split(/\s+/)).each(function(){0===this.indexOf("select2-")&&o.push(this)})),r=e.trim(i.attr("class")),r&&(r=""+r,e(r.split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&(a=n(this),null!=a&&o.push(a))})),t.attr("class",o.join(" "))}return{syncCssClasses:t}}),t.define("select2/compat/containerCss",["jquery","./utils"],function(e,t){function i(e){return null}function n(){}return n.prototype.render=function(n){var r=n.call(this),a=this.options.get("containerCssClass")||"";e.isFunction(a)&&(a=a(this.$element));var o=this.options.get("adaptContainerCssClass");if(o=o||i,-1!==a.indexOf(":all:")){a=a.replace(":all:","");var s=o;o=function(e){var t=s(e);return null!=t?t+" "+e:e}}var l=this.options.get("containerCss")||{};return e.isFunction(l)&&(l=l(this.$element)),t.syncCssClasses(r,this.$element,o),r.css(l),r.addClass(a),r},n}),t.define("select2/compat/dropdownCss",["jquery","./utils"],function(e,t){function i(e){return null}function n(){}return n.prototype.render=function(n){var r=n.call(this),a=this.options.get("dropdownCssClass")||"";e.isFunction(a)&&(a=a(this.$element));var o=this.options.get("adaptDropdownCssClass");if(o=o||i,-1!==a.indexOf(":all:")){a=a.replace(":all:","");var s=o;o=function(e){var t=s(e);return null!=t?t+" "+e:e}}var l=this.options.get("dropdownCss")||{};return e.isFunction(l)&&(l=l(this.$element)),t.syncCssClasses(r,this.$element,o),r.css(l),r.addClass(a),r},n}),t.define("select2/compat/initSelection",["jquery"],function(e){function t(e,t,i){i.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=i.get("initSelection"),this._isInitialized=!1,e.call(this,t,i)}return t.prototype.current=function(t,i){var n=this;return this._isInitialized?void t.call(this,i):void this.initSelection.call(null,this.$element,function(t){n._isInitialized=!0,e.isArray(t)||(t=[t]),i(t)})},t}),t.define("select2/compat/inputData",["jquery"],function(e){function t(e,t,i){this._currentData=[],this._valueSeparator=i.get("valueSeparator")||",","hidden"===t.prop("type")&&i.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `").get(0).files,r.formdata=void 0!==window.FormData;var a=!!e.fn.prop;e.fn.attr2=function(){if(!a)return this.attr.apply(this,arguments);var e=this.prop.apply(this,arguments);return e&&e.jquery||"string"==typeof e?e:this.attr.apply(this,arguments)},e.fn.ajaxSubmit=function(t){function i(i){var n,r,a=e.param(i,t.traditional).split("&"),o=a.length,s=[];for(n=0;n').val(h.extraData[p].value).appendTo(j)[0]):c.push(e('').val(h.extraData[p]).appendTo(j)[0]));h.iframeTarget||g.appendTo("body"),v.attachEvent?v.attachEvent("onload",s):v.addEventListener("load",s,!1),setTimeout(t,15);try{j.submit()}catch(e){var m=document.createElement("form").submit;m.apply(j)}}finally{j.setAttribute("action",a),j.setAttribute("enctype",u),i?j.setAttribute("target",i):d.removeAttr("target"),e(c).remove()}}function s(t){if(!y.aborted&&!O){if(Q=r(v),Q||(n("cannot access response document"),t=k),t===S&&y)return y.abort("timeout"),void C.reject(y,"timeout");if(t==k&&y)return y.abort("server abort"),void C.reject(y,"error","server abort");if(Q&&Q.location.href!=h.iframeSrc||_){v.detachEvent?v.detachEvent("onload",s):v.removeEventListener("load",s,!1);var i,a="success";try{if(_)throw"timeout";var o="xml"==h.dataType||Q.XMLDocument||e.isXMLDoc(Q);if(n("isXml="+o),!o&&window.opera&&(null===Q.body||!Q.body.innerHTML)&&--A)return n("requeing onLoad callback, DOM not available"),void setTimeout(s,250);var l=Q.body?Q.body:Q.documentElement;y.responseText=l?l.innerHTML:null,y.responseXML=Q.XMLDocument?Q.XMLDocument:Q,o&&(h.dataType="xml"),y.getResponseHeader=function(e){var t={"content-type":h.dataType};return t[e.toLowerCase()]},l&&(y.status=Number(l.getAttribute("status"))||y.status,y.statusText=l.getAttribute("statusText")||y.statusText);var u=(h.dataType||"").toLowerCase(),c=/(json|script|text)/.test(u);if(c||h.textarea){var d=Q.getElementsByTagName("textarea")[0];if(d)y.responseText=d.value,y.status=Number(d.getAttribute("status"))||y.status,y.statusText=d.getAttribute("statusText")||y.statusText;else if(c){var f=Q.getElementsByTagName("pre")[0],m=Q.getElementsByTagName("body")[0];f?y.responseText=f.textContent?f.textContent:f.innerText:m&&(y.responseText=m.textContent?m.textContent:m.innerText)}}else"xml"==u&&!y.responseXML&&y.responseText&&(y.responseXML=M(y.responseText));try{T=I(y,u,h)}catch(e){a="parsererror",y.error=i=e||a}}catch(e){n("error caught: ",e),a="error",y.error=i=e||a}y.aborted&&(n("upload aborted"),a=null),y.status&&(a=y.status>=200&&y.status<300||304===y.status?"success":"error"),"success"===a?(h.success&&h.success.call(h.context,T,"success",y),C.resolve(y.responseText,"success",y),p&&e.event.trigger("ajaxSuccess",[y,h])):a&&(void 0===i&&(i=y.statusText),h.error&&h.error.call(h.context,y,a,i),C.reject(y,"error",i),p&&e.event.trigger("ajaxError",[y,h,i])),p&&e.event.trigger("ajaxComplete",[y,h]),p&&!--e.active&&e.event.trigger("ajaxStop"),h.complete&&h.complete.call(h.context,y,a),O=!0,h.timeout&&clearTimeout(x),setTimeout(function(){h.iframeTarget?g.attr("src",h.iframeSrc):g.remove(),y.responseXML=null},100)}}}var u,c,h,p,f,g,v,y,b,w,_,x,j=d[0],C=e.Deferred();if(C.abort=function(e){y.abort(e)},i)for(c=0;c'),g.css({position:"absolute",top:"-1000px",left:"-1000px"})),v=g[0],y={aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(t){var i="timeout"===t?"timeout":"aborted";n("aborting upload... "+i),this.aborted=1;try{v.contentWindow.document.execCommand&&v.contentWindow.document.execCommand("Stop")}catch(e){}g.attr("src",h.iframeSrc),y.error=i,h.error&&h.error.call(h.context,y,i,t),p&&e.event.trigger("ajaxError",[y,h,i]),h.complete&&h.complete.call(h.context,y,i)}},p=h.global,p&&0===e.active++&&e.event.trigger("ajaxStart"),p&&e.event.trigger("ajaxSend",[y,h]),h.beforeSend&&h.beforeSend.call(h.context,y,h)===!1)return h.global&&e.active--,C.reject(),C;if(y.aborted)return C.reject(),C;b=j.clk,b&&(w=b.name,w&&!b.disabled&&(h.extraData=h.extraData||{},h.extraData[w]=b.value,"image"==b.type&&(h.extraData[w+".x"]=j.clk_x,h.extraData[w+".y"]=j.clk_y)));var S=1,k=2,$=e("meta[name=csrf-token]").attr("content"),D=e("meta[name=csrf-param]").attr("content");D&&$&&(h.extraData=h.extraData||{},h.extraData[D]=$),h.forceSync?o():setTimeout(o,10);var T,Q,O,A=50,M=e.parseXML||function(e,t){return window.ActiveXObject?(t=new ActiveXObject("Microsoft.XMLDOM"),t.async="false",t.loadXML(e)):t=(new DOMParser).parseFromString(e,"text/xml"),t&&t.documentElement&&"parsererror"!=t.documentElement.nodeName?t:null},E=e.parseJSON||function(e){return window.eval("("+e+")")},I=function(t,i,n){var r=t.getResponseHeader("content-type")||"",a="xml"===i||!i&&r.indexOf("xml")>=0,o=a?t.responseXML:t.responseText;return a&&"parsererror"===o.documentElement.nodeName&&e.error&&e.error("parsererror"),n&&n.dataFilter&&(o=n.dataFilter(o,i)),"string"==typeof o&&("json"===i||!i&&r.indexOf("json")>=0?o=E(o):("script"===i||!i&&r.indexOf("javascript")>=0)&&e.globalEval(o)),o};return C}if(!this.length)return n("ajaxSubmit: skipping submit process - no element selected"),this;var l,u,c,d=this;"function"==typeof t?t={success:t}:void 0===t&&(t={}),l=t.type||this.attr2("method"),u=t.url||this.attr2("action"),c="string"==typeof u?e.trim(u):"",c=c||window.location.href||"",c&&(c=(c.match(/^([^#]+)/)||[])[1]),t=e.extend(!0,{url:c,success:e.ajaxSettings.success,type:l||e.ajaxSettings.type,iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},t);var h={};if(this.trigger("form-pre-serialize",[this,t,h]),h.veto)return n("ajaxSubmit: submit vetoed via form-pre-serialize trigger"),this;if(t.beforeSerialize&&t.beforeSerialize(this,t)===!1)return n("ajaxSubmit: submit aborted via beforeSerialize callback"),this;var p=t.traditional;void 0===p&&(p=e.ajaxSettings.traditional);var f,m=[],g=this.formToArray(t.semantic,m);if(t.data&&(t.extraData=t.data,f=e.param(t.data,p)),t.beforeSubmit&&t.beforeSubmit(g,this,t)===!1)return n("ajaxSubmit: submit aborted via beforeSubmit callback"),this;if(this.trigger("form-submit-validate",[g,this,t,h]),h.veto)return n("ajaxSubmit: submit vetoed via form-submit-validate trigger"),this;var v=e.param(g,p);f&&(v=v?v+"&"+f:f),"GET"==t.type.toUpperCase()?(t.url+=(t.url.indexOf("?")>=0?"&":"?")+v,t.data=null):t.data=v;var y=[];if(t.resetForm&&y.push(function(){d.resetForm()}),t.clearForm&&y.push(function(){d.clearForm(t.includeHidden)}),!t.dataType&&t.target){var b=t.success||function(){};y.push(function(i){var n=t.replaceTarget?"replaceWith":"html";e(t.target)[n](i).each(b,arguments)})}else t.success&&y.push(t.success);if(t.success=function(e,i,n){for(var r=t.context||this,a=0,o=y.length;a0,C="multipart/form-data",S=d.attr("enctype")==C||d.attr("encoding")==C,k=r.fileapi&&r.formdata;n("fileAPI :"+k);var $,D=(j||S)&&!k;t.iframe!==!1&&(t.iframe||D)?t.closeKeepAlive?e.get(t.closeKeepAlive,function(){$=s(g)}):$=s(g):$=(j||S)&&k?o(g):e.ajax(t),d.removeData("jqxhr").data("jqxhr",$);for(var T=0;T").get(0).files,t.formdata=void 0!==window.FormData,e.fn.uploadFile=function(i){function n(){h.afterUploadAll&&!g&&(g=!0,function e(){0!=f.sCounter&&f.sCounter+f.fCounter==f.tCounter?(h.afterUploadAll(f),g=!1):window.setTimeout(e,100)}())}function r(t,i,n){n.on("dragenter",function(t){t.stopPropagation(),t.preventDefault(),e(this).css("border","2px dashed #ddd")}),n.on("dragover",function(e){e.stopPropagation(),e.preventDefault()}),n.on("drop",function(n){e(this).css("border","2px dashed #ddd"),n.preventDefault(),t.errorLog.html("");var r=n.originalEvent.dataTransfer.files;return!i.multiple&&r.length>1?void(i.showError&&e("
            "+i.multiDragErrorStr+"
            ").appendTo(t.errorLog)):void(0!=i.onSelect(r)&&o(i,t,r))}),e(document).on("dragenter",function(e){e.stopPropagation(),e.preventDefault()}),e(document).on("dragover",function(e){e.stopPropagation(),e.preventDefault(),n.css("border","2px dashed #ddd")}),e(document).on("drop",function(e){e.stopPropagation(),e.preventDefault(),n.css("border","2px dashed #ddd")})}function a(t){var i=[];i="string"==jQuery.type(t)?t.split("&"):e.param(t).split("&");var n,r,a=i.length,o=[];for(n=0;nt.maxFileSize)t.showError&&e("
            "+t.sizeErrorStr+"
            ").appendTo(i.errorLog);else if(t.maxFileCount!=-1&&i.selectedFiles>=t.maxFileCount)t.showError&&e("
            "+t.maxFileCountErrorStr+"
            ").appendTo(i.errorLog);else{i.selectedFiles++;var o=t,l=new FormData,u=t.fileName.replace("[]","");l.append(u,n[r]);var h=t.formData;if(h)for(var p=a(h),f=0;f");v.appendTo("body");var y=[];y.push(n[r].name),d(v,o,m,y,i),i.fileCounter++}else t.showError&&e("
            "+t.extErrorStr+"
            ").appendTo(i.errorLog)}function s(e,t,i){var n=t.allowedTypes.toLowerCase().split(","),r=i.split(".").pop().toLowerCase();return!("*"!=t.allowedTypes&&jQuery.inArray(r,n)<0)}function l(t,i){if(t.showFileCounter){var n=e(".upload-filename").length;i.fileCounter=n+1,e(".upload-filename").each(function(i,r){var a=e(this).html().split(t.fileCounterStyle),o=(parseInt(a[0])-1,n+t.fileCounterStyle+a[1]);e(this).html(o),n--})}}function u(i,n,r,a){var h="ajax-upload-id-"+(new Date).getTime(),p=e("
            "),f="";r.multiple&&(r.fileName.indexOf("[]")!=r.fileName.length-2&&(r.fileName+="[]"),f="");var m=e(f).appendTo(p);m.change(function(){i.errorLog.html("");var h=(r.allowedTypes.toLowerCase().split(","),[]);if(this.files){for(y=0;y"+r.extErrorStr+"
            ").appendTo(i.errorLog));if(m.push({name:f,size:"NA"}),0==r.onSelect(m))return}if(l(r,i),a.unbind("click"),p.hide(),u(i,n,r,a),p.addClass(n),t.fileapi&&t.formdata){p.removeClass(n);var g=this.files;o(r,i,g)}else{for(var v="",y=0;y":h[y]+"
            ",i.fileCounter++;if(r.maxFileCount!=-1&&i.selectedFiles+h.length>r.maxFileCount)return void(r.showError&&e("
            "+r.maxFileCountErrorStr+"
            ").appendTo(i.errorLog));i.selectedFiles+=h.length;var b=new c(i,r);b.filename.html(v),d(p,r,b,h,i)}}),p.css({margin:0,padding:0});var g=e(a).width()+10;10==g&&(g=120);var v=a.height()+10;10==v&&(v=35),a.css({position:"relative",overflow:"hidden",cursor:"default"}),m.css({position:"absolute",cursor:"pointer",top:"0px",width:"100%",height:"34px",left:"0px","z-index":"100",opacity:"0.0",filter:"alpha(opacity=0)","-ms-filter":"alpha(opacity=0)","-khtml-opacity":"0.0","-moz-opacity":"0.0"}),p.appendTo(a)}function c(t,i){return this.statusbar=e("
            "),this.filename=e("
            ").appendTo(this.statusbar),this.progressDiv=e("
            ").appendTo(this.statusbar).hide(),this.progressbar=e("
            ").appendTo(this.progressDiv),this.abort=e("
            "+i.abortStr+"
            ").appendTo(this.statusbar).hide(),this.cancel=e("
            "+i.cancelStr+"
            ").appendTo(this.statusbar).hide(),this.done=e("
            "+i.doneStr+"
            ").appendTo(this.statusbar).hide(),this.del=e("
            "+i.deletelStr+"
            ").appendTo(this.statusbar).hide(),t.errorLog.after(this.statusbar),this}function d(e,i,r,o,s){var u={cache:!1,contentType:!1,processData:!1,forceSync:!1,data:i.formData,formData:i.fileData,dataType:i.returnType,beforeSubmit:function(t,l,u){if(0!=i.onSubmit.call(this,o)){var c=i.dynamicFormData();if(c){var d=a(c);if(d)for(var h=0;h"+i.uploadErrorStr+"
            "),r.cancel.show(),e.remove(),r.cancel.click(function(){r.statusbar.remove()}),!1},beforeSend:function(e,n){r.progressDiv.show(),r.cancel.hide(),r.done.hide(),i.showAbort&&(r.abort.show(),r.abort.click(function(){e.abort(),s.selectedFiles-=o.length})),t.formdata?r.progressbar.width("1%"):r.progressbar.width("5%")},uploadProgress:function(e,t,n,a){a>98&&(a=98);var o=a+"%";a>1&&r.progressbar.width(o),i.showProgress&&(r.progressbar.html(o),r.progressbar.css("text-align","center"))},success:function(t,n,a){s.responses.push(t),r.progressbar.width("100%"),i.showProgress&&(r.progressbar.html("100%"),r.progressbar.css("text-align","center")),r.abort.hide(),i.onSuccess.call(this,o,t,a),i.showStatusAfterSuccess?(i.showDone?(r.done.show(),r.done.click(function(){r.statusbar.hide("slow"),r.statusbar.remove()})):r.done.hide(),i.showDelete?(r.del.show(),r.del.click(function(){r.statusbar.hide().remove(),i.deleteCallback&&i.deleteCallback.call(this,t,r),s.selectedFiles-=o.length,l(i,s)})):r.del.hide()):(r.statusbar.hide("slow"),r.statusbar.remove()),e.remove(),s.sCounter+=o.length},error:function(t,n,a){r.abort.hide(),"abort"==t.statusText?(r.statusbar.hide("slow").remove(),l(i,s)):(i.onError.call(this,o,n,a),i.showStatusAfterError?(r.progressDiv.hide(),r.statusbar.append("ERROR: "+a+"")):(r.statusbar.hide(),r.statusbar.remove()),s.selectedFiles-=o.length),e.remove(),s.fCounter+=o.length}};i.autoSubmit?e.ajaxSubmit(u):(i.showCancel&&(r.cancel.show(),r.cancel.click(function(){e.remove(),r.statusbar.remove(),s.selectedFiles-=o.length,l(i,s)})),e.ajaxForm(u))}var h=e.extend({url:"",method:"POST",enctype:"multipart/form-data",formData:null,returnType:null,allowedTypes:"*",fileName:"file",formData:{},dynamicFormData:function(){return{}},maxFileSize:-1,maxFileCount:-1,multiple:!0,dragDrop:!0,autoSubmit:!0,showCancel:!0,showAbort:!0,showDone:!0,showDelete:!1,showError:!0,showStatusAfterSuccess:!0,showStatusAfterError:!0,showFileCounter:!0,fileCounterStyle:"). ",showProgress:!1,onSelect:function(e){return!0},onSubmit:function(e,t){},onSuccess:function(e,t,i){},onError:function(e,t,i){},deleteCallback:!1,afterUploadAll:!1,uploadButtonClass:"upload",dragDropStr:"",abortStr:"Abort",cancelStr:"Cancel",deletelStr:"Delete",doneStr:"Done",multiDragErrorStr:"Multiple File Drag & Drop is not allowed.",extErrorStr:"",sizeErrorStr:"",uploadErrorStr:"Upload is not allowed",maxFileCountErrorStr:""},i);this.fileCounter=1,this.selectedFiles=0,this.fCounter=0,this.sCounter=0,this.tCounter=0;var p="upload-"+(new Date).getTime();this.formGroup=p,this.hide(),this.errorLog=e("
            "),this.after(this.errorLog),this.responses=[],t.formdata||(h.dragDrop=!1),t.formdata||(h.multiple=!1);var f=this,m=e("
            "+e(this).html()+"
            ");e(m).addClass(h.uploadButtonClass),function t(){if(e.fn.ajaxForm){if(h.dragDrop){var i=e('
            ');e(f).before(i),e(i).append(m),e(i).prepend(e(h.dragDropStr)),r(f,h,i)}else e(f).before(m);u(f,p,h,m)}else window.setTimeout(t,10)}(),this.startUpload=function(){e("."+this.formGroup).each(function(t,i){e(this).is("form")&&e(this).submit()})},this.stopUpload=function(){e(".upload-red").each(function(t,i){e(this).hasClass(f.formGroup)&&e(this).click()})},this.getResponses=function(){return this.responses};var g=!1;return this}}(jQuery),function(e){"function"==typeof define&&define.amd?define("picker",["jquery"],e):"object"==typeof exports?module.exports=e(require("jquery")):this.Picker=e(jQuery)}(function(e){function t(a,o,l,h){function p(){return t._.node("div",t._.node("div",t._.node("div",t._.node("div",$.component.nodes(x.open),C.box),C.wrap),C.frame),C.holder,'tabindex="-1"')}function f(){S.data(o,$).addClass(C.input).val(S.data("value")?$.get("select",j.format):a.value),j.editable||S.on("focus."+x.id+" click."+x.id,function(e){e.preventDefault(),$.open()}).on("keydown."+x.id,w),r(a,{haspopup:!0,expanded:!1,readonly:!1,owns:a.id+"_root"})}function m(){r($.$root[0],"hidden",!0)}function g(){$.$holder.on({keydown:w,"focus.toOpen":b,blur:function(){S.removeClass(C.target)},focusin:function(e){$.$root.removeClass(C.focused),e.stopPropagation()},"mousedown click":function(t){var i=t.target;i!=$.$holder[0]&&(t.stopPropagation(),"mousedown"!=t.type||e(i).is("input, select, textarea, button, option")||(t.preventDefault(),$.$holder[0].focus()))}}).on("click","[data-pick], [data-nav], [data-clear], [data-close]",function(){var t=e(this),i=t.data(),n=t.hasClass(C.navDisabled)||t.hasClass(C.disabled),r=s();r=r&&(r.type||r.href),(n||r&&!e.contains($.$root[0],r))&&$.$holder[0].focus(),!n&&i.nav?$.set("highlight",$.component.item.highlight,{nav:i.nav}):!n&&"pick"in i?($.set("select",i.pick),j.closeOnSelect&&$.close(!0)):i.clear?($.clear(),j.closeOnClear&&$.close(!0)):i.close&&$.close(!0)})}function v(){var t;j.hiddenName===!0?(t=a.name,a.name=""):(t=["string"==typeof j.hiddenPrefix?j.hiddenPrefix:"","string"==typeof j.hiddenSuffix?j.hiddenSuffix:"_submit"],t=t[0]+a.name+t[1]),$._hidden=e('")[0],S.on("change."+x.id,function(){$._hidden.value=a.value?$.get("select",j.formatSubmit):""})}function y(){_&&d?$.$holder.find("."+C.frame).one("transitionend",function(){$.$holder[0].focus()}):$.$holder[0].focus()}function b(e){e.stopPropagation(),S.addClass(C.target),$.$root.addClass(C.focused),$.open()}function w(e){var t=e.keyCode,i=/^(8|46)$/.test(t);return 27==t?($.close(!0),!1):void((32==t||i||!x.open&&$.component.key[t])&&(e.preventDefault(),e.stopPropagation(),i?$.clear().close():$.open()))}if(!a)return t;var _=!1,x={id:a.id||"P"+Math.abs(~~(Math.random()*new Date))},j=l?e.extend(!0,{},l.defaults,h):h||{},C=e.extend({},t.klasses(),j.klass),S=e(a),k=function(){return this.start()},$=k.prototype={constructor:k,$node:S,start:function(){return x&&x.start?$:(x.methods={},x.start=!0,x.open=!1,x.type=a.type,a.autofocus=a==s(),a.readOnly=!j.editable,a.id=a.id||x.id,"text"!=a.type&&(a.type="text"),$.component=new l($,j),$.$root=e('
            '),m(),$.$holder=e(p()).appendTo($.$root),g(),j.formatSubmit&&v(),f(),j.containerHidden?e(j.containerHidden).append($._hidden):S.after($._hidden),j.container?e(j.container).append($.$root):S.after($.$root),$.on({start:$.component.onStart,render:$.component.onRender,stop:$.component.onStop,open:$.component.onOpen,close:$.component.onClose,set:$.component.onSet}).on({start:j.onStart,render:j.onRender,stop:j.onStop,open:j.onOpen,close:j.onClose,set:j.onSet}),_=i($.$holder[0]),a.autofocus&&$.open(),$.trigger("start").trigger("render"))},render:function(t){return t?($.$holder=e(p()),g(),$.$root.html($.$holder)):$.$root.find("."+C.box).html($.component.nodes(x.open)),$.trigger("render")},stop:function(){return x.start?($.close(),$._hidden&&$._hidden.parentNode.removeChild($._hidden),$.$root.remove(),S.removeClass(C.input).removeData(o),setTimeout(function(){S.off("."+x.id)},0),a.type=x.type,a.readOnly=!1,$.trigger("stop"),x.methods={},x.start=!1,$):$},open:function(i){return x.open?$:(S.addClass(C.active),r(a,"expanded",!0),setTimeout(function(){$.$root.addClass(C.opened),r($.$root[0],"hidden",!1)},0),i!==!1&&(x.open=!0,_&&c.css("overflow","hidden").css("padding-right","+="+n()),y(),u.on("click."+x.id+" focusin."+x.id,function(e){var t=e.target;t!=a&&t!=document&&3!=e.which&&$.close(t===$.$holder[0])}).on("keydown."+x.id,function(i){var n=i.keyCode,r=$.component.key[n],a=i.target;27==n?$.close(!0):a!=$.$holder[0]||!r&&13!=n?e.contains($.$root[0],a)&&13==n&&(i.preventDefault(),a.click()):(i.preventDefault(),r?t._.trigger($.component.key.go,$,[t._.trigger(r)]):$.$root.find("."+C.highlighted).hasClass(C.disabled)||($.set("select",$.component.item.highlight),j.closeOnSelect&&$.close(!0)))})),$.trigger("open"))},close:function(e){return e&&(j.editable?a.focus():($.$holder.off("focus.toOpen").focus(),setTimeout(function(){$.$holder.on("focus.toOpen",b)},0))),S.removeClass(C.active),r(a,"expanded",!1),setTimeout(function(){$.$root.removeClass(C.opened+" "+C.focused),r($.$root[0],"hidden",!0)},0),x.open?(x.open=!1,_&&c.css("overflow","").css("padding-right","-="+n()),u.off("."+x.id),$.trigger("close")):$},clear:function(e){return $.set("clear",null,e)},set:function(t,i,n){var r,a,o=e.isPlainObject(t),s=o?t:{};if(n=o&&e.isPlainObject(i)?i:n||{},t){o||(s[t]=i);for(r in s)a=s[r],r in $.component.item&&(void 0===a&&(a=null),$.component.set(r,a,n)),"select"!=r&&"clear"!=r||S.val("clear"==r?"":$.get(r,j.format)).trigger("change");$.render()}return n.muted?$:$.trigger("set",s)},get:function(e,i){if(e=e||"value",null!=x[e])return x[e];if("valueSubmit"==e){if($._hidden)return $._hidden.value;e="value"}if("value"==e)return a.value;if(e in $.component.item){if("string"==typeof i){var n=$.component.get(e);return n?t._.trigger($.component.formats.toString,$.component,[i,n]):""}return $.component.get(e)}},on:function(t,i,n){var r,a,o=e.isPlainObject(t),s=o?t:{};if(t){o||(s[t]=i);for(r in s)a=s[r],n&&(r="_"+r),x.methods[r]=x.methods[r]||[],x.methods[r].push(a)}return $},off:function(){var e,t,i=arguments;for(e=0,namesCount=i.length;e').appendTo("body"),i=t[0].offsetWidth;t.css("overflow","scroll");var n=e('
            ').appendTo(t),r=n[0].offsetWidth;return t.remove(),i-r}function r(t,i,n){if(e.isPlainObject(i))for(var r in i)a(t,r,i[r]);else a(t,i,n)}function a(e,t,i){e.setAttribute(("role"==t?"":"aria-")+t,i)}function o(t,i){e.isPlainObject(t)||(t={attribute:i}),i="";for(var n in t){var r=("role"==n?"":"aria-")+n,a=t[n];i+=null==a?"":r+'="'+t[n]+'"'}return i}function s(){try{return document.activeElement}catch(e){}}var l=e(window),u=e(document),c=e(document.documentElement),d=null!=document.documentElement.style.transition;return t.klasses=function(e){return e=e||"picker",{picker:e,opened:e+"--opened",focused:e+"--focused",input:e+"__input",active:e+"__input--active",target:e+"__input--target",holder:e+"__holder",frame:e+"__frame",wrap:e+"__wrap",box:e+"__box"}},t._={group:function(e){for(var i,n="",r=t._.trigger(e.min,e);r<=t._.trigger(e.max,e,[r]);r+=e.i)i=t._.trigger(e.item,e,[r]),n+=t._.node(e.node,i[0],i[1],i[2]);return n},node:function(t,i,n,r){return i?(i=e.isArray(i)?i.join(""):i,n=n?' class="'+n+'"':"",r=r?" "+r:"","<"+t+n+r+">"+i+""):""},lead:function(e){return(e<10?"0":"")+e},trigger:function(e,t,i){return"function"==typeof e?e.apply(t,i||[]):e},digits:function(e){return/\d/.test(e[1])?2:1},isDate:function(e){return{}.toString.call(e).indexOf("Date")>-1&&this.isInteger(e.getDate())},isInteger:function(e){return{}.toString.call(e).indexOf("Number")>-1&&e%1===0},ariaAttr:o},t.extend=function(i,n){e.fn[i]=function(r,a){var o=this.data(i);return"picker"==r?o:o&&"string"==typeof r?t._.trigger(o[r],o,[a]):this.each(function(){var a=e(this);a.data(i)||new t(this,i,n,r)})},e.fn[i].defaults=n.defaults},t}),function(e){"function"==typeof define&&define.amd?define(["picker","jquery"],e):"object"==typeof exports?module.exports=e(require("./picker.js"),require("jquery")):e(Picker,jQuery)}(function(e,t){function i(e,t){var i=this,n=e.$node[0],r=n.value,a=e.$node.data("value"),o=a||r,s=a?t.formatSubmit:t.format,l=function(){return n.currentStyle?"rtl"==n.currentStyle.direction:"rtl"==getComputedStyle(e.$root[0]).direction};i.settings=t,i.$node=e.$node,i.queue={min:"measure create",max:"measure create",now:"now create",select:"parse create validate",highlight:"parse navigate create validate",view:"parse create validate viewset",disable:"deactivate",enable:"activate"},i.item={},i.item.clear=null,i.item.disable=(t.disable||[]).slice(0),i.item.enable=-function(e){return e[0]===!0?e.shift():-1}(i.item.disable),i.set("min",t.min).set("max",t.max).set("now"),o?i.set("select",o,{format:s,defaultValue:!0}):i.set("select",null).set("highlight",i.item.now),i.key={40:7,38:-7,39:function(){return l()?-1:1},37:function(){return l()?1:-1},go:function(e){var t=i.item.highlight,n=new Date(t.year,t.month,t.date+e);i.set("highlight",n,{interval:e}),this.render()}},e.on("render",function(){e.$root.find("."+t.klass.selectMonth).on("change",function(){var i=this.value;i&&(e.set("highlight",[e.get("view").year,i,e.get("highlight").date]),e.$root.find("."+t.klass.selectMonth).trigger("focus"))}),e.$root.find("."+t.klass.selectYear).on("change",function(){var i=this.value;i&&(e.set("highlight",[i,e.get("view").month,e.get("highlight").date]), +e.$root.find("."+t.klass.selectYear).trigger("focus"))})},1).on("open",function(){var n="";i.disabled(i.get("now"))&&(n=":not(."+t.klass.buttonToday+")"),e.$root.find("button"+n+", select").attr("disabled",!1)},1).on("close",function(){e.$root.find("button, select").attr("disabled",!0)},1)}var n=7,r=6,a=e._;i.prototype.set=function(e,t,i){var n=this,r=n.item;return null===t?("clear"==e&&(e="select"),r[e]=t,n):(r["enable"==e?"disable":"flip"==e?"enable":e]=n.queue[e].split(" ").map(function(r){return t=n[r](e,t,i)}).pop(),"select"==e?n.set("highlight",r.select,i):"highlight"==e?n.set("view",r.highlight,i):e.match(/^(flip|min|max|disable|enable)$/)&&(r.select&&n.disabled(r.select)&&n.set("select",r.select,i),r.highlight&&n.disabled(r.highlight)&&n.set("highlight",r.highlight,i)),n)},i.prototype.get=function(e){return this.item[e]},i.prototype.create=function(e,i,n){var r,o=this;return i=void 0===i?e:i,i==-(1/0)||i==1/0?r=i:t.isPlainObject(i)&&a.isInteger(i.pick)?i=i.obj:t.isArray(i)?(i=new Date(i[0],i[1],i[2]),i=a.isDate(i)?i:o.create().obj):i=a.isInteger(i)||a.isDate(i)?o.normalize(new Date(i),n):o.now(e,i,n),{year:r||i.getFullYear(),month:r||i.getMonth(),date:r||i.getDate(),day:r||i.getDay(),obj:r||i,pick:r||i.getTime()}},i.prototype.createRange=function(e,i){var n=this,r=function(e){return e===!0||t.isArray(e)||a.isDate(e)?n.create(e):e};return a.isInteger(e)||(e=r(e)),a.isInteger(i)||(i=r(i)),a.isInteger(e)&&t.isPlainObject(i)?e=[i.year,i.month,i.date+e]:a.isInteger(i)&&t.isPlainObject(e)&&(i=[e.year,e.month,e.date+i]),{from:r(e),to:r(i)}},i.prototype.withinRange=function(e,t){return e=this.createRange(e.from,e.to),t.pick>=e.from.pick&&t.pick<=e.to.pick},i.prototype.overlapRanges=function(e,t){var i=this;return e=i.createRange(e.from,e.to),t=i.createRange(t.from,t.to),i.withinRange(e,t.from)||i.withinRange(e,t.to)||i.withinRange(t,e.from)||i.withinRange(t,e.to)},i.prototype.now=function(e,t,i){return t=new Date,i&&i.rel&&t.setDate(t.getDate()+i.rel),this.normalize(t,i)},i.prototype.navigate=function(e,i,n){var r,a,o,s,l=t.isArray(i),u=t.isPlainObject(i),c=this.item.view;if(l||u){for(u?(a=i.year,o=i.month,s=i.date):(a=+i[0],o=+i[1],s=+i[2]),n&&n.nav&&c&&c.month!==o&&(a=c.year,o=c.month),r=new Date(a,o+(n&&n.nav?n.nav:0),1),a=r.getFullYear(),o=r.getMonth();new Date(a,o,s).getMonth()!==o;)s-=1;i=[a,o,s]}return i},i.prototype.normalize=function(e){return e.setHours(0,0,0,0),e},i.prototype.measure=function(e,t){var i=this;return t?"string"==typeof t?t=i.parse(e,t):a.isInteger(t)&&(t=i.now(e,t,{rel:t})):t="min"==e?-(1/0):1/0,t},i.prototype.viewset=function(e,t){return this.create([t.year,t.month,1])},i.prototype.validate=function(e,i,n){var r,o,s,l,u=this,c=i,d=n&&n.interval?n.interval:1,h=u.item.enable===-1,p=u.item.min,f=u.item.max,m=h&&u.item.disable.filter(function(e){if(t.isArray(e)){var n=u.create(e).pick;ni.pick&&(o=!0)}return a.isInteger(e)}).length;if((!n||!n.nav&&!n.defaultValue)&&(!h&&u.disabled(i)||h&&u.disabled(i)&&(m||r||o)||!h&&(i.pick<=p.pick||i.pick>=f.pick)))for(h&&!m&&(!o&&d>0||!r&&d<0)&&(d*=-1);u.disabled(i)&&(Math.abs(d)>1&&(i.monthc.month)&&(i=c,d=d>0?1:-1),i.pick<=p.pick?(s=!0,d=1,i=u.create([p.year,p.month,p.date+(i.pick===p.pick?0:-1)])):i.pick>=f.pick&&(l=!0,d=-1,i=u.create([f.year,f.month,f.date+(i.pick===f.pick?0:1)])),!s||!l);)i=u.create([i.year,i.month,i.date+d]);return i},i.prototype.disabled=function(e){var i=this,n=i.item.disable.filter(function(n){return a.isInteger(n)?e.day===(i.settings.firstDay?n:n-1)%7:t.isArray(n)||a.isDate(n)?e.pick===i.create(n).pick:t.isPlainObject(n)?i.withinRange(n,e):void 0});return n=n.length&&!n.filter(function(e){return t.isArray(e)&&"inverted"==e[3]||t.isPlainObject(e)&&e.inverted}).length,i.item.enable===-1?!n:n||e.picki.item.max.pick},i.prototype.parse=function(e,t,i){var n=this,r={};return t&&"string"==typeof t?(i&&i.format||(i=i||{},i.format=n.settings.format),n.formats.toArray(i.format).map(function(e){var i=n.formats[e],o=i?a.trigger(i,n,[t,r]):e.replace(/^!/,"").length;i&&(r[e]=t.substr(0,o)),t=t.substr(o)}),[r.yyyy||r.yy,+(r.mm||r.m)-1,r.dd||r.d]):t},i.prototype.formats=function(){function e(e,t,i){var n=e.match(/[^\x00-\x7F]+|\w+/)[0];return i.mm||i.m||(i.m=t.indexOf(n)+1),n.length}function t(e){return e.match(/\w+/)[0].length}return{d:function(e,t){return e?a.digits(e):t.date},dd:function(e,t){return e?2:a.lead(t.date)},ddd:function(e,i){return e?t(e):this.settings.weekdaysShort[i.day]},dddd:function(e,i){return e?t(e):this.settings.weekdaysFull[i.day]},m:function(e,t){return e?a.digits(e):t.month+1},mm:function(e,t){return e?2:a.lead(t.month+1)},mmm:function(t,i){var n=this.settings.monthsShort;return t?e(t,n,i):n[i.month]},mmmm:function(t,i){var n=this.settings.monthsFull;return t?e(t,n,i):n[i.month]},yy:function(e,t){return e?2:(""+t.year).slice(2)},yyyy:function(e,t){return e?4:t.year},toArray:function(e){return e.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g)},toString:function(e,t){var i=this;return i.formats.toArray(e).map(function(e){return a.trigger(i.formats[e],i,[0,t])||e.replace(/^!/,"")}).join("")}}}(),i.prototype.isDateExact=function(e,i){var n=this;return a.isInteger(e)&&a.isInteger(i)||"boolean"==typeof e&&"boolean"==typeof i?e===i:(a.isDate(e)||t.isArray(e))&&(a.isDate(i)||t.isArray(i))?n.create(e).pick===n.create(i).pick:!(!t.isPlainObject(e)||!t.isPlainObject(i))&&(n.isDateExact(e.from,i.from)&&n.isDateExact(e.to,i.to))},i.prototype.isDateOverlap=function(e,i){var n=this,r=n.settings.firstDay?1:0;return a.isInteger(e)&&(a.isDate(i)||t.isArray(i))?(e=e%7+r,e===n.create(i).day+1):a.isInteger(i)&&(a.isDate(e)||t.isArray(e))?(i=i%7+r,i===n.create(e).day+1):!(!t.isPlainObject(e)||!t.isPlainObject(i))&&n.overlapRanges(e,i)},i.prototype.flipEnable=function(e){var t=this.item;t.enable=e||(t.enable==-1?1:-1)},i.prototype.deactivate=function(e,i){var n=this,r=n.item.disable.slice(0);return"flip"==i?n.flipEnable():i===!1?(n.flipEnable(1),r=[]):i===!0?(n.flipEnable(-1),r=[]):i.map(function(e){for(var i,o=0;o=p.year&&c.month>=p.month||!e&&c.year<=h.year&&c.month<=h.month?" "+i.klass.navDisabled:""),"data-nav="+(e||-1)+" "+a.ariaAttr({role:"button",controls:t.$node[0].id+"_table"})+' title="'+(e?i.labelMonthNext:i.labelMonthPrev)+'"')},g=function(){var n=i.showMonthsShort?i.monthsShort:i.monthsFull;return i.selectMonths?a.node("select",a.group({min:0,max:11,i:1,node:"option",item:function(e){return[n[e],0,"value="+e+(c.month==e?" selected":"")+(c.year==h.year&&ep.month?" disabled":"")]}}),i.klass.selectMonth,(e?"":"disabled")+" "+a.ariaAttr({controls:t.$node[0].id+"_table"})+' title="'+i.labelMonthSelect+'"'):a.node("div",n[c.month],i.klass.month)},v=function(){var n=c.year,r=i.selectYears===!0?5:~~(i.selectYears/2);if(r){var o=h.year,s=p.year,l=n-r,u=n+r;if(o>l&&(u+=o-l,l=o),sf?f:d,u=s}return a.node("select",a.group({min:l,max:u,i:1,node:"option",item:function(e){return[e,0,"value="+e+(n==e?" selected":"")]}}),i.klass.selectYear,(e?"":"disabled")+" "+a.ariaAttr({controls:t.$node[0].id+"_table"})+' title="'+i.labelYearSelect+'"')}return a.node("div",n,i.klass.year)};return a.node("div",(i.selectYears?v()+g():g()+v())+m()+m(1),i.klass.header)+a.node("table",f+a.node("tbody",a.group({min:0,max:r-1,i:1,node:"tr",item:function(e){var r=i.firstDay&&0===t.create([c.year,c.month,1]).day?-7:0;return[a.group({min:n*e-c.day+r+1,max:function(){return this.min+n-1},i:1,node:"td",item:function(e){e=t.create([c.year,c.month,e+(i.firstDay?1:0)]);var n=l&&l.pick==e.pick,r=u&&u.pick==e.pick,o=d&&t.disabled(e)||e.pickp.pick,f=a.trigger(t.formats.toString,t,[i.format,e]);return[a.node("div",e.date,function(t){return t.push(c.month==e.month?i.klass.infocus:i.klass.outfocus),s.pick==e.pick&&t.push(i.klass.now),n&&t.push(i.klass.selected),r&&t.push(i.klass.highlighted),o&&t.push(i.klass.disabled),t.join(" ")}([i.klass.day]),"data-pick="+e.pick+" "+a.ariaAttr({role:"gridcell",label:f,selected:!(!n||t.$node.val()!==f)||null,activedescendant:!!r||null,disabled:!!o||null})),"",a.ariaAttr({role:"presentation"})]}})]}})),i.klass.table,'id="'+t.$node[0].id+'_table" '+a.ariaAttr({role:"grid",controls:t.$node[0].id,readonly:!0}))+a.node("div",a.node("button",i.today,i.klass.buttonToday,"type=button data-pick="+s.pick+(e&&!t.disabled(s)?"":" disabled")+" "+a.ariaAttr({controls:t.$node[0].id}))+a.node("button",i.clear,i.klass.buttonClear,"type=button data-clear=1"+(e?"":" disabled")+" "+a.ariaAttr({controls:t.$node[0].id}))+a.node("button",i.close,i.klass.buttonClose,"type=button data-close=true "+(e?"":" disabled")+" "+a.ariaAttr({controls:t.$node[0].id})),i.klass.footer)},i.defaults=function(e){return{labelMonthNext:"Next month",labelMonthPrev:"Previous month",labelMonthSelect:"Select a month",labelYearSelect:"Select a year",monthsFull:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],weekdaysFull:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekdaysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],today:"Today",clear:"Clear",close:"Close",closeOnSelect:!0,closeOnClear:!0,format:"d mmmm, yyyy",klass:{table:e+"table",header:e+"header",navPrev:e+"nav--prev",navNext:e+"nav--next",navDisabled:e+"nav--disabled",month:e+"month",year:e+"year",selectMonth:e+"select--month",selectYear:e+"select--year",weekdays:e+"weekday",day:e+"day",disabled:e+"day--disabled",selected:e+"day--selected",highlighted:e+"day--highlighted",now:e+"day--today",infocus:e+"day--infocus",outfocus:e+"day--outfocus",footer:e+"footer",buttonClear:e+"button--clear",buttonToday:e+"button--today",buttonClose:e+"button--close"}}}(e.klasses().picker+"__"),e.extend("pickadate",i)}),function(e){"function"==typeof define&&define.amd?define(["picker","jquery"],e):"object"==typeof exports?module.exports=e(require("./picker.js"),require("jquery")):e(Picker,jQuery)}(function(e,t){function i(e,t){var i=this,n=e.$node[0].value,r=e.$node.data("value"),a=r||n,o=r?t.formatSubmit:t.format;i.settings=t,i.$node=e.$node,i.queue={interval:"i",min:"measure create",max:"measure create",now:"now create",select:"parse create validate",highlight:"parse create validate",view:"parse create validate",disable:"deactivate",enable:"activate"},i.item={},i.item.clear=null,i.item.interval=t.interval||30,i.item.disable=(t.disable||[]).slice(0),i.item.enable=-function(e){return e[0]===!0?e.shift():-1}(i.item.disable),i.set("min",t.min).set("max",t.max).set("now"),a?i.set("select",a,{format:o}):i.set("select",null).set("highlight",i.item.now),i.key={40:1,38:-1,39:1,37:-1,go:function(e){i.set("highlight",i.item.highlight.pick+e*i.item.interval,{interval:e*i.item.interval}),this.render()}},e.on("render",function(){var i=e.$root.children(),n=i.find("."+t.klass.viewset),r=function(e){return["webkit","moz","ms","o",""].map(function(t){return(t?"-"+t+"-":"")+e})},a=function(e,t){r("transform").map(function(i){e.css(i,t)}),r("transition").map(function(i){e.css(i,t)})};n.length&&(a(i,"none"),i[0].scrollTop=~~n.position().top-2*n[0].clientHeight,a(i,""))},1).on("open",function(){e.$root.find("button").attr("disabled",!1)},1).on("close",function(){e.$root.find("button").attr("disabled",!0)},1)}var n=24,r=60,a=12,o=n*r,s=e._;i.prototype.set=function(e,t,i){var n=this,r=n.item;return null===t?("clear"==e&&(e="select"),r[e]=t,n):(r["enable"==e?"disable":"flip"==e?"enable":e]=n.queue[e].split(" ").map(function(r){return t=n[r](e,t,i)}).pop(),"select"==e?n.set("highlight",r.select,i):"highlight"==e?n.set("view",r.highlight,i):"interval"==e?n.set("min",r.min,i).set("max",r.max,i):e.match(/^(flip|min|max|disable|enable)$/)&&(r.select&&n.disabled(r.select)&&n.set("select",t,i),r.highlight&&n.disabled(r.highlight)&&n.set("highlight",t,i),"min"==e&&n.set("max",r.max,i)),n)},i.prototype.get=function(e){return this.item[e]},i.prototype.create=function(e,i,a){var l=this;return i=void 0===i?e:i,s.isDate(i)&&(i=[i.getHours(),i.getMinutes()]),t.isPlainObject(i)&&s.isInteger(i.pick)?i=i.pick:t.isArray(i)?i=+i[0]*r+ +i[1]:s.isInteger(i)||(i=l.now(e,i,a)),"max"==e&&i=e.from.pick&&t.pick<=e.to.pick},i.prototype.overlapRanges=function(e,t){var i=this;return e=i.createRange(e.from,e.to),t=i.createRange(t.from,t.to),i.withinRange(e,t.from)||i.withinRange(e,t.to)||i.withinRange(t,e.from)||i.withinRange(t,e.to)},i.prototype.now=function(e,t){var i,n=this.item.interval,a=new Date,o=a.getHours()*r+a.getMinutes(),l=s.isInteger(t);return o-=o%n,i=t<0&&n*t+o<=-n,o+="min"==e&&i?0:n,l&&(o+=n*(i&&"max"!=e?t+1:t)),o},i.prototype.normalize=function(e,t){var i=this.item.interval,n=this.item.min&&this.item.min.pick||0;return t-="min"==e?0:(t-n)%i},i.prototype.measure=function(e,i,a){var o=this;return i||(i="min"==e?[0,0]:[n-1,r-1]),"string"==typeof i?i=o.parse(e,i):i===!0||s.isInteger(i)?i=o.now(e,i,a):t.isPlainObject(i)&&s.isInteger(i.pick)&&(i=o.normalize(e,i.pick,a)),i},i.prototype.validate=function(e,t,i){var n=this,r=i&&i.interval?i.interval:n.item.interval;return n.disabled(t)&&(t=n.shift(t,r)),t=n.scope(t),n.disabled(t)&&(t=n.shift(t,r*-1)),t},i.prototype.disabled=function(e){var i=this,n=i.item.disable.filter(function(n){return s.isInteger(n)?e.hour==n:t.isArray(n)||s.isDate(n)?e.pick==i.create(n).pick:t.isPlainObject(n)?i.withinRange(n,e):void 0});return n=n.length&&!n.filter(function(e){return t.isArray(e)&&"inverted"==e[2]||t.isPlainObject(e)&&e.inverted}).length,i.item.enable===-1?!n:n||e.picki.item.max.pick},i.prototype.shift=function(e,t){var i=this,n=i.item.min.pick,r=i.item.max.pick;for(t=t||i.item.interval;i.disabled(e)&&(e=i.create(e.pick+=t),!(e.pick<=n||e.pick>=r)););return e},i.prototype.scope=function(e){var t=this.item.min.pick,i=this.item.max.pick;return this.create(e.pick>i?i:e.pickt.time%o?"a.m.":"p.m."},A:function(e,t){return e?2:o/2>t.time%o?"AM":"PM"},toArray:function(e){return e.split(/(h{1,2}|H{1,2}|i|a|A|!.)/g)},toString:function(e,t){var i=this;return i.formats.toArray(e).map(function(e){return s.trigger(i.formats[e],i,[0,t])||e.replace(/^!/,"")}).join("")}},i.prototype.isTimeExact=function(e,i){var n=this;return s.isInteger(e)&&s.isInteger(i)||"boolean"==typeof e&&"boolean"==typeof i?e===i:(s.isDate(e)||t.isArray(e))&&(s.isDate(i)||t.isArray(i))?n.create(e).pick===n.create(i).pick:!(!t.isPlainObject(e)||!t.isPlainObject(i))&&(n.isTimeExact(e.from,i.from)&&n.isTimeExact(e.to,i.to))},i.prototype.isTimeOverlap=function(e,i){var n=this;return s.isInteger(e)&&(s.isDate(i)||t.isArray(i))?e===n.create(i).hour:s.isInteger(i)&&(s.isDate(e)||t.isArray(e))?i===n.create(e).hour:!(!t.isPlainObject(e)||!t.isPlainObject(i))&&n.overlapRanges(e,i)},i.prototype.flipEnable=function(e){var t=this.item;t.enable=e||(t.enable==-1?1:-1)},i.prototype.deactivate=function(e,i){var n=this,r=n.item.disable.slice(0);return"flip"==i?n.flipEnable():i===!1?(n.flipEnable(1),r=[]):i===!0?(n.flipEnable(-1),r=[]):i.map(function(e){for(var i,a=0;a0?t:this.item.interval},i.prototype.nodes=function(e){var t=this,i=t.settings,n=t.item.select,r=t.item.highlight,a=t.item.view,o=t.item.disable;return s.node("ul",s.group({min:t.item.min.pick,max:t.item.max.pick,i:t.item.interval,node:"li",item:function(e){e=t.create(e);var l=e.pick,u=n&&n.pick==l,c=r&&r.pick==l,d=o&&t.disabled(e),h=s.trigger(t.formats.toString,t,[i.format,e]);return[s.trigger(t.formats.toString,t,[s.trigger(i.formatLabel,t,[e])||i.format,e]),function(e){return u&&e.push(i.klass.selected),c&&e.push(i.klass.highlighted),a&&a.pick==l&&e.push(i.klass.viewset),d&&e.push(i.klass.disabled),e.join(" ")}([i.klass.listItem]),"data-pick="+e.pick+" "+s.ariaAttr({role:"option",label:h,selected:!(!u||t.$node.val()!==h)||null,activedescendant:!!c||null,disabled:!!d||null})]}})+s.node("li",s.node("button",i.clear,i.klass.buttonClear,"type=button data-clear=1"+(e?"":" disabled")+" "+s.ariaAttr({controls:t.$node[0].id})),"",s.ariaAttr({role:"presentation"})),i.klass.list,s.ariaAttr({role:"listbox",controls:t.$node[0].id}))},i.defaults=function(e){return{clear:"Clear",format:"h:i A",interval:30,closeOnSelect:!0,closeOnClear:!0,klass:{picker:e+" "+e+"--time",holder:e+"__holder",list:e+"__list",listItem:e+"__list-item",disabled:e+"__list-item--disabled",selected:e+"__list-item--selected",highlighted:e+"__list-item--highlighted",viewset:e+"__list-item--viewset",now:e+"__list-item--now",buttonClear:e+"__button--clear"}}}(e.klasses().picker),e.extend("pickatime",i)}),[].map||(Array.prototype.map=function(e,t){for(var i=this,n=i.length,r=new Array(n),a=0;a>>0;if("function"!=typeof e)throw new TypeError;for(var n=[],r=arguments[1],a=0;a>>0;if(0===i)return-1;var n=0;if(arguments.length>1&&(n=Number(arguments[1]),n!=n?n=0:0!==n&&n!=1/0&&n!=-(1/0)&&(n=(n>0||-1)*Math.floor(Math.abs(n)))),n>=i)return-1;for(var r=n>=0?n:Math.max(i-Math.abs(n),0);r>>0:t>>>0;(r=e.exec(i))&&(a=r.index+r[0].length,!(a>u&&(s.push(i.slice(u,r.index)),!compliantExecNpcg&&r.length>1&&r[0].replace(n,function(){for(var e=1;e1&&r.index=t)));)e.lastIndex===r.index&&e.lastIndex++;return u===i.length?!o&&e.test("")||s.push(""):s.push(i.slice(u)),s.length>t?s.slice(0,t):s},function(e){"use strict";var t={init:function(i){return this.each(function(){this.self=e(this),t.destroy.call(this.self),this.opt=e.extend(!0,{},e.fn.raty.defaults,i),t._adjustCallback.call(this),t._adjustNumber.call(this),"img"!==this.opt.starType&&t._adjustStarType.call(this),t._adjustPath.call(this),t._createStars.call(this),this.opt.cancel&&t._createCancel.call(this),this.opt.precision&&t._adjustPrecision.call(this),t._createScore.call(this),t._apply.call(this,this.opt.score),t._target.call(this,this.opt.score),this.opt.readOnly?t._lock.call(this):(this.style.cursor="pointer",t._binds.call(this)),this.self.data("options",this.opt)})},_adjustCallback:function(){for(var e=["number","readOnly","score","scoreName","target"],t=0;t0&&this.score.val(t._between(e,0,this.opt.number)),t._roundStars.call(this,e))},_between:function(e,t,i){return Math.min(Math.max(parseFloat(e),t),i)},_binds:function(){this.cancel&&(t._bindOverCancel.call(this),t._bindClickCancel.call(this),t._bindOutCancel.call(this)),t._bindOver.call(this),t._bindClick.call(this),t._bindOut.call(this)},_bindClick:function(){var t=this;t.stars.on("click.raty",function(i){var n=e(this);t.score.val(t.opt.half||t.opt.precision?t.self.data("score"):this.alt||n.data("alt")),t.opt.click&&t.opt.click.call(t,+t.score.val(),i)})},_bindClickCancel:function(){var e=this;e.cancel.on("click.raty",function(t){e.score.removeAttr("value"),e.opt.click&&e.opt.click.call(e,null,t)})},_bindOut:function(){var e=this;e.self.on("mouseleave.raty",function(i){var n=+e.score.val()||void 0;t._apply.call(e,n),t._target.call(e,n,i),e.opt.mouseout&&e.opt.mouseout.call(e,n,i)})},_bindOutCancel:function(){var e=this;e.cancel.on("mouseleave.raty",function(i){var n=e.opt.cancelOff;if("img"!==e.opt.starType&&(n=e.opt.cancelClass+" "+n),t._setIcon.call(e,this,n),e.opt.mouseout){var r=+e.score.val()||void 0;e.opt.mouseout.call(e,r,i)}})},_bindOver:function(){var e=this,i=e.opt.half?"mousemove.raty":"mouseover.raty";e.stars.on(i,function(i){var n=t._getScoreByPosition.call(e,i,this);t._fill.call(e,n),e.opt.half&&(t._roundStars.call(e,n),e.self.data("score",n)),t._target.call(e,n,i),e.opt.mouseover&&e.opt.mouseover.call(e,n,i)})},_bindOverCancel:function(){var e=this;e.cancel.on("mouseover.raty",function(i){var n=e.opt.path+e.opt.starOff,r=e.opt.cancelOn;"img"===e.opt.starType?e.stars.attr("src",n):(r=e.opt.cancelClass+" "+r,e.stars.attr("class",n)),t._setIcon.call(e,this,r),t._target.call(e,null,i),e.opt.mouseover&&e.opt.mouseover.call(e,null)})},_buildScoreField:function(){return e("",{name:this.opt.scoreName,type:"hidden"}).appendTo(this)},_createCancel:function(){var t=this.opt.path+this.opt.cancelOff,i=e("<"+this.opt.starType+" />",{title:this.opt.cancelHint,class:this.opt.cancelClass});"img"===this.opt.starType?i.attr({src:t,alt:"x"}):i.attr("data-alt","x").addClass(t),"left"===this.opt.cancelPlace?this.self.prepend(" ").prepend(i):this.self.append(" ").append(i),this.cancel=i},_createScore:function(){var i=e(this.opt.targetScore);this.score=i.length?i:t._buildScoreField.call(this)},_createStars:function(){for(var i=1;i<=this.opt.number;i++){var n=t._nameForIndex.call(this,i),r={alt:i,src:this.opt.path+this.opt[n]};"img"!==this.opt.starType&&(r={"data-alt":i,class:r.src}),r.title=t._getHint.call(this,i),e("<"+this.opt.starType+" />",r).appendTo(this),this.opt.space&&this.self.append(ii){var s=this.opt.iconRange[i];r=t._getRangeIcon.call(this,s,o),n<=s.range&&t._setIcon.call(this,a,r),n===s.range&&i++}else r=this.opt[o?"starOn":"starOff"],t._setIcon.call(this,a,r)}},_getRangeIcon:function(e,t){return t?e.on||this.opt.starOn:e.off||this.opt.starOff},_getScoreByPosition:function(i,n){var r=parseInt(n.alt||n.getAttribute("data-alt"),10);if(this.opt.half){var a=t._getSize.call(this),o=parseFloat((i.pageX-e(n).offset().left)/a);r=this.opt.precision?r-1+o:r-1+(o>.5?1:.5)}return r},_getSize:function(){var e;return e="img"===this.opt.starType?this.stars[0].width:parseFloat(this.stars.eq(0).css("font-size")),e||t._error.call(this,"Could not be possible get the icon size!"),e},_turnOn:function(e,t){return this.opt.single?e===t:e<=t},_getHint:function(e){var t=this.opt.hints[e-1];return""===t?"":t||e},_lock:function(){var e=parseInt(this.score.val(),10),i=e?t._getHint.call(this,e):this.opt.noRatedMsg;this.style.cursor="",this.title=i,this.score.prop("readonly",!0),this.stars.prop("title",i),this.cancel&&this.cancel.hide(),this.self.data("readonly",!0)},_nameForIndex:function(e){return this.opt.score&&this.opt.score>=e?"starOn":"starOff"},_roundStars:function(e){var i=(e%1).toFixed(2);if(i>this.opt.round.down){var n="starOn";this.opt.halfShow&&i1?t:t[0]},move:function(i){return this.each(function(){var n=parseInt(i,10),r=e(this).data("options"),a=(+i).toFixed(1).split(".")[1];n>=r.number&&(n=r.number-1,a=10);var o=t._getSize.call(this),s=o/10,l=e(this.stars[n]),u=l.offset().left+s*parseInt(a,10),c=e.Event("mousemove",{pageX:u});l.trigger(c)})},readOnly:function(i){return this.each(function(){var n=e(this);n.data("readonly")!==i&&(i?(n.off(".raty").children("img").off(".raty"),t._lock.call(this)):(t._binds.call(this),t._unlock.call(this)),n.data("readonly",i))})},reload:function(){return t.set.call(this,{})},score:function(){var i=e(this);return arguments.length?t.setScore.apply(i,arguments):t.getScore.call(i)},set:function(t){return this.each(function(){var i=e(this),n=i.data("options"),r=e.extend({},n,t);i.raty(r)})},setScore:function(i){return this.each(function(){e(this).data("readonly")!==!0&&(t._apply.call(this,i),t._target.call(this,i))})}};e.fn.raty=function(i){return t[i]?t[i].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof i&&i?void e.error("Method "+i+" does not exist!"):t.init.apply(this,arguments)},e.fn.raty.defaults={cancel:!1,cancelClass:"raty-cancel",cancelHint:"Cancel this rating!",cancelOff:"cancel-off.png",cancelOn:"cancel-on.png",cancelPlace:"left",click:void 0,half:!1,halfShow:!0,hints:["bad","poor","regular","good","gorgeous"],iconRange:void 0,mouseout:void 0,mouseover:void 0,noRatedMsg:"Not rated yet!",number:5,numberMax:20,path:void 0,precision:!1,readOnly:!1,round:{down:.25,full:.6,up:.76},score:void 0,scoreName:"score",single:!1,space:!0,starHalf:"star-half.png",starOff:"star-off.png",starOn:"star-on.png",starType:"img",target:void 0,targetFormat:"{score}",targetKeep:!1,targetScore:void 0,targetText:"",targetType:"hint"}}(jQuery),function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):"undefined"!=typeof module&&module.exports?module.exports=e(require("jquery")):e(jQuery)}(function(e){"use strict";function t(t){return!t.nodeName||e.inArray(t.nodeName.toLowerCase(),["iframe","#document","html","body"])!==-1}function i(t){return e.isFunction(t)||e.isPlainObject(t)?t:{top:t,left:t}}var n=e.scrollTo=function(t,i,n){return e(window).scrollTo(t,i,n)};return n.defaults={axis:"xy",duration:0,limit:!0},e.fn.scrollTo=function(r,a,o){"object"==typeof a&&(o=a,a=0),"function"==typeof o&&(o={onAfter:o}),"max"===r&&(r=9e9),o=e.extend({},n.defaults,o),a=a||o.duration;var s=o.queue&&o.axis.length>1;return s&&(a/=2),o.offset=i(o.offset),o.over=i(o.over),this.each(function(){function l(t){var i=e.extend({},o,{queue:!0,duration:a,complete:t&&function(){t.call(d,p,o)}});h.animate(f,i)}if(null!==r){var u,c=t(this),d=c?this.contentWindow||window:this,h=e(d),p=r,f={};switch(typeof p){case"number":case"string":if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(p)){p=i(p);break}if(p=c?e(p):e(p,d),!p.length)return;case"object":(p.is||p.style)&&(u=(p=e(p)).offset()); +}var m=e.isFunction(o.offset)&&o.offset(d,p)||o.offset;e.each(o.axis.split(""),function(e,t){var i="x"===t?"Left":"Top",r=i.toLowerCase(),a="scroll"+i,g=h[a](),v=n.max(d,t);if(u)f[a]=u[r]+(c?0:g-h.offset()[r]),o.margin&&(f[a]-=parseInt(p.css("margin"+i),10)||0,f[a]-=parseInt(p.css("border"+i+"Width"),10)||0),f[a]+=m[r]||0,o.over[r]&&(f[a]+=p["x"===t?"width":"height"]()*o.over[r]);else{var y=p[r];f[a]=y.slice&&"%"===y.slice(-1)?parseFloat(y)/100*v:y}o.limit&&/^\d+$/.test(f[a])&&(f[a]=f[a]<=0?0:Math.min(f[a],v)),!e&&o.axis.length>1&&(g===f[a]?f={}:s&&(l(o.onAfterFirst),f={}))}),l(o.onAfter)}})},n.max=function(i,n){var r="x"===n?"Width":"Height",a="scroll"+r;if(!t(i))return i[a]-e(i)[r.toLowerCase()]();var o="client"+r,s=i.ownerDocument||i.document,l=s.documentElement,u=s.body;return Math.max(l[a],u[a])-Math.min(l[o],u[o])},e.Tween.propHooks.scrollLeft=e.Tween.propHooks.scrollTop={get:function(t){return e(t.elem)[t.prop]()},set:function(t){var i=this.get(t);if(t.options.interrupt&&t._last&&t._last!==i)return e(t.elem).stop();var n=Math.round(t.now);i!==n&&(e(t.elem)[t.prop](n),t._last=this.get(t))}},n}),!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof exports?module.exports=e:e(jQuery)}(function(e){function t(t){var o=t||window.event,s=l.call(arguments,1),u=0,d=0,h=0,p=0,f=0,m=0;if(t=e.event.fix(o),t.type="mousewheel","detail"in o&&(h=-1*o.detail),"wheelDelta"in o&&(h=o.wheelDelta),"wheelDeltaY"in o&&(h=o.wheelDeltaY),"wheelDeltaX"in o&&(d=-1*o.wheelDeltaX),"axis"in o&&o.axis===o.HORIZONTAL_AXIS&&(d=-1*h,h=0),u=0===h?d:h,"deltaY"in o&&(h=-1*o.deltaY,u=h),"deltaX"in o&&(d=o.deltaX,0===h&&(u=-1*d)),0!==h||0!==d){if(1===o.deltaMode){var g=e.data(this,"mousewheel-line-height");u*=g,h*=g,d*=g}else if(2===o.deltaMode){var v=e.data(this,"mousewheel-page-height");u*=v,h*=v,d*=v}if(p=Math.max(Math.abs(h),Math.abs(d)),(!a||a>p)&&(a=p,n(o,p)&&(a/=40)),n(o,p)&&(u/=40,d/=40,h/=40),u=Math[u>=1?"floor":"ceil"](u/a),d=Math[d>=1?"floor":"ceil"](d/a),h=Math[h>=1?"floor":"ceil"](h/a),c.settings.normalizeOffset&&this.getBoundingClientRect){var y=this.getBoundingClientRect();f=t.clientX-y.left,m=t.clientY-y.top}return t.deltaX=d,t.deltaY=h,t.deltaFactor=a,t.offsetX=f,t.offsetY=m,t.deltaMode=0,s.unshift(t,u,d,h),r&&clearTimeout(r),r=setTimeout(i,200),(e.event.dispatch||e.event.handle).apply(this,s)}}function i(){a=null}function n(e,t){return c.settings.adjustOldDeltas&&"mousewheel"===e.type&&t%120===0}var r,a,o=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],s="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],l=Array.prototype.slice;if(e.event.fixHooks)for(var u=o.length;u;)e.event.fixHooks[o[--u]]=e.event.mouseHooks;var c=e.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var i=s.length;i;)this.addEventListener(s[--i],t,!1);else this.onmousewheel=t;e.data(this,"mousewheel-line-height",c.getLineHeight(this)),e.data(this,"mousewheel-page-height",c.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var i=s.length;i;)this.removeEventListener(s[--i],t,!1);else this.onmousewheel=null;e.removeData(this,"mousewheel-line-height"),e.removeData(this,"mousewheel-page-height")},getLineHeight:function(t){var i=e(t),n=i["offsetParent"in e.fn?"offsetParent":"parent"]();return n.length||(n=e("body")),parseInt(n.css("fontSize"),10)||parseInt(i.css("fontSize"),10)||16},getPageHeight:function(t){return e(t).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};e.fn.extend({mousewheel:function(e){return e?this.bind("mousewheel",e):this.trigger("mousewheel")},unmousewheel:function(e){return this.unbind("mousewheel",e)}})}),!function(e){"undefined"!=typeof module&&module.exports?module.exports=e:e(jQuery,window,document)}(function(e){!function(t){var i="function"==typeof define&&define.amd,n="undefined"!=typeof module&&module.exports,r="https:"==document.location.protocol?"https:":"http:",a="cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.12/jquery.mousewheel.min.js";i||(n?require("jquery-mousewheel")(e):e.event.special.mousewheel||e("head").append(decodeURI("%3Cscript src="+r+"//"+a+"%3E%3C/script%3E"))),t()}(function(){var t,i="mCustomScrollbar",n="mCS",r=".mCustomScrollbar",a={setTop:0,setLeft:0,axis:"y",scrollbarPosition:"inside",scrollInertia:950,autoDraggerLength:!0,alwaysShowScrollbar:0,snapOffset:0,mouseWheel:{enable:!0,scrollAmount:"auto",axis:"y",deltaFactor:"auto",disableOver:["select","option","keygen","datalist","textarea"]},scrollButtons:{scrollType:"stepless",scrollAmount:"auto"},keyboard:{enable:!0,scrollType:"stepless",scrollAmount:"auto"},contentTouchScroll:25,advanced:{autoScrollOnFocus:"input,textarea,select,button,datalist,keygen,a[tabindex],area,object,[contenteditable='true']",updateOnContentResize:!0,updateOnImageLoad:!0},theme:"light",callbacks:{onTotalScrollOffset:0,onTotalScrollBackOffset:0,alwaysTriggerOffsets:!0}},o=0,s={},l=window.attachEvent&&!window.addEventListener?1:0,u=!1,c=["mCSB_dragger_onDrag","mCSB_scrollTools_onDrag","mCS_img_loaded","mCS_disabled","mCS_destroyed","mCS_no_scrollbar","mCS-autoHide","mCS-dir-rtl","mCS_no_scrollbar_y","mCS_no_scrollbar_x","mCS_y_hidden","mCS_x_hidden","mCSB_draggerContainer","mCSB_buttonUp","mCSB_buttonDown","mCSB_buttonLeft","mCSB_buttonRight"],d={init:function(t){var t=e.extend(!0,{},a,t),i=h.call(this);if(t.live){var l=t.liveSelector||this.selector||r,u=e(l);if("off"===t.live)return void f(l);s[l]=setTimeout(function(){u.mCustomScrollbar(t),"once"===t.live&&u.length&&f(l)},500)}else f(l);return t.setWidth=t.set_width?t.set_width:t.setWidth,t.setHeight=t.set_height?t.set_height:t.setHeight,t.axis=t.horizontalScroll?"x":m(t.axis),t.scrollInertia=t.scrollInertia>0&&t.scrollInertia<17?17:t.scrollInertia,"object"!=typeof t.mouseWheel&&1==t.mouseWheel&&(t.mouseWheel={enable:!0,scrollAmount:"auto",axis:"y",preventDefault:!1,deltaFactor:"auto",normalizeDelta:!1,invert:!1}),t.mouseWheel.scrollAmount=t.mouseWheelPixels?t.mouseWheelPixels:t.mouseWheel.scrollAmount,t.mouseWheel.normalizeDelta=t.advanced.normalizeMouseWheelDelta?t.advanced.normalizeMouseWheelDelta:t.mouseWheel.normalizeDelta,t.scrollButtons.scrollType=g(t.scrollButtons.scrollType),p(t),e(i).each(function(){var i=e(this);if(!i.data(n)){i.data(n,{idx:++o,opt:t,scrollRatio:{y:null,x:null},overflowed:null,contentReset:{y:null,x:null},bindEvents:!1,tweenRunning:!1,sequential:{},langDir:i.css("direction"),cbOffsets:null,trigger:null});var r=i.data(n),a=r.opt,s=i.data("mcs-axis"),l=i.data("mcs-scrollbar-position"),u=i.data("mcs-theme");s&&(a.axis=s),l&&(a.scrollbarPosition=l),u&&(a.theme=u,p(a)),v.call(this),e("#mCSB_"+r.idx+"_container img:not(."+c[2]+")").addClass(c[2]),d.update.call(null,i)}})},update:function(t,i){var r=t||h.call(this);return e(r).each(function(){var t=e(this);if(t.data(n)){var r=t.data(n),a=r.opt,o=e("#mCSB_"+r.idx+"_container"),s=[e("#mCSB_"+r.idx+"_dragger_vertical"),e("#mCSB_"+r.idx+"_dragger_horizontal")];if(!o.length)return;r.tweenRunning&&Y(t),t.hasClass(c[3])&&t.removeClass(c[3]),t.hasClass(c[4])&&t.removeClass(c[4]),_.call(this),b.call(this),"y"===a.axis||a.advanced.autoExpandHorizontalScroll||o.css("width",y(o.children())),r.overflowed=S.call(this),T.call(this),a.autoDraggerLength&&x.call(this),j.call(this),$.call(this);var l=[Math.abs(o[0].offsetTop),Math.abs(o[0].offsetLeft)];"x"!==a.axis&&(r.overflowed[0]?s[0].height()>s[0].parent().height()?k.call(this):(X(t,l[0].toString(),{dir:"y",dur:0,overwrite:"none"}),r.contentReset.y=null):(k.call(this),"y"===a.axis?D.call(this):"yx"===a.axis&&r.overflowed[1]&&X(t,l[1].toString(),{dir:"x",dur:0,overwrite:"none"}))),"y"!==a.axis&&(r.overflowed[1]?s[1].width()>s[1].parent().width()?k.call(this):(X(t,l[1].toString(),{dir:"x",dur:0,overwrite:"none"}),r.contentReset.x=null):(k.call(this),"x"===a.axis?D.call(this):"yx"===a.axis&&r.overflowed[0]&&X(t,l[0].toString(),{dir:"y",dur:0,overwrite:"none"}))),i&&r&&(2===i&&a.callbacks.onImageLoad&&"function"==typeof a.callbacks.onImageLoad?a.callbacks.onImageLoad.call(this):3===i&&a.callbacks.onSelectorChange&&"function"==typeof a.callbacks.onSelectorChange?a.callbacks.onSelectorChange.call(this):a.callbacks.onUpdate&&"function"==typeof a.callbacks.onUpdate&&a.callbacks.onUpdate.call(this)),U.call(this)}})},scrollTo:function(t,i){if("undefined"!=typeof t&&null!=t){var r=h.call(this);return e(r).each(function(){var r=e(this);if(r.data(n)){var a=r.data(n),o=a.opt,s={trigger:"external",scrollInertia:o.scrollInertia,scrollEasing:"mcsEaseInOut",moveDragger:!1,timeout:60,callbacks:!0,onStart:!0,onUpdate:!0,onComplete:!0},l=e.extend(!0,{},s,i),u=F.call(this,t),c=l.scrollInertia>0&&l.scrollInertia<17?17:l.scrollInertia;u[0]=W.call(this,u[0],"y"),u[1]=W.call(this,u[1],"x"),l.moveDragger&&(u[0]*=a.scrollRatio.y,u[1]*=a.scrollRatio.x),l.dur=c,setTimeout(function(){null!==u[0]&&"undefined"!=typeof u[0]&&"x"!==o.axis&&a.overflowed[0]&&(l.dir="y",l.overwrite="all",X(r,u[0].toString(),l)),null!==u[1]&&"undefined"!=typeof u[1]&&"y"!==o.axis&&a.overflowed[1]&&(l.dir="x",l.overwrite="none",X(r,u[1].toString(),l))},l.timeout)}})}},stop:function(){var t=h.call(this);return e(t).each(function(){var t=e(this);t.data(n)&&Y(t)})},disable:function(t){var i=h.call(this);return e(i).each(function(){var i=e(this);i.data(n)&&(i.data(n),U.call(this,"remove"),D.call(this),t&&k.call(this),T.call(this,!0),i.addClass(c[3]))})},destroy:function(){var t=h.call(this);return e(t).each(function(){var r=e(this);if(r.data(n)){var a=r.data(n),o=a.opt,s=e("#mCSB_"+a.idx),l=e("#mCSB_"+a.idx+"_container"),u=e(".mCSB_"+a.idx+"_scrollbar");o.live&&f(o.liveSelector||e(t).selector),U.call(this,"remove"),D.call(this),k.call(this),r.removeData(n),Z(this,"mcs"),u.remove(),l.find("img."+c[2]).removeClass(c[2]),s.replaceWith(l.contents()),r.removeClass(i+" _"+n+"_"+a.idx+" "+c[6]+" "+c[7]+" "+c[5]+" "+c[3]).addClass(c[4])}})}},h=function(){return"object"!=typeof e(this)||e(this).length<1?r:this},p=function(t){var i=["rounded","rounded-dark","rounded-dots","rounded-dots-dark"],n=["rounded-dots","rounded-dots-dark","3d","3d-dark","3d-thick","3d-thick-dark","inset","inset-dark","inset-2","inset-2-dark","inset-3","inset-3-dark"],r=["minimal","minimal-dark"],a=["minimal","minimal-dark"],o=["minimal","minimal-dark"];t.autoDraggerLength=!(e.inArray(t.theme,i)>-1)&&t.autoDraggerLength,t.autoExpandScrollbar=!(e.inArray(t.theme,n)>-1)&&t.autoExpandScrollbar,t.scrollButtons.enable=!(e.inArray(t.theme,r)>-1)&&t.scrollButtons.enable,t.autoHideScrollbar=e.inArray(t.theme,a)>-1||t.autoHideScrollbar,t.scrollbarPosition=e.inArray(t.theme,o)>-1?"outside":t.scrollbarPosition},f=function(e){s[e]&&(clearTimeout(s[e]),Z(s,e))},m=function(e){return"yx"===e||"xy"===e||"auto"===e?"yx":"x"===e||"horizontal"===e?"x":"y"},g=function(e){return"stepped"===e||"pixels"===e||"step"===e||"click"===e?"stepped":"stepless"},v=function(){var t=e(this),r=t.data(n),a=r.opt,o=a.autoExpandScrollbar?" "+c[1]+"_expand":"",s=["
            ","
            "],l="yx"===a.axis?"mCSB_vertical_horizontal":"x"===a.axis?"mCSB_horizontal":"mCSB_vertical",u="yx"===a.axis?s[0]+s[1]:"x"===a.axis?s[1]:s[0],d="yx"===a.axis?"
            ":"",h=a.autoHideScrollbar?" "+c[6]:"",p="x"!==a.axis&&"rtl"===r.langDir?" "+c[7]:"";a.setWidth&&t.css("width",a.setWidth),a.setHeight&&t.css("height",a.setHeight),a.setLeft="y"!==a.axis&&"rtl"===r.langDir?"989999px":a.setLeft,t.addClass(i+" _"+n+"_"+r.idx+h+p).wrapInner("
            ");var f=e("#mCSB_"+r.idx),m=e("#mCSB_"+r.idx+"_container");"y"===a.axis||a.advanced.autoExpandHorizontalScroll||m.css("width",y(m.children())),"outside"===a.scrollbarPosition?("static"===t.css("position")&&t.css("position","relative"),t.css("overflow","visible"),f.addClass("mCSB_outside").after(u)):(f.addClass("mCSB_inside").append(u),m.wrap(d)),w.call(this);var g=[e("#mCSB_"+r.idx+"_dragger_vertical"),e("#mCSB_"+r.idx+"_dragger_horizontal")];g[0].css("min-height",g[0].height()),g[1].css("min-width",g[1].width())},y=function(t){return Math.max.apply(Math,t.map(function(){return e(this).outerWidth(!0)}).get())},b=function(){var t=e(this),i=t.data(n),r=i.opt,a=e("#mCSB_"+i.idx+"_container");r.advanced.autoExpandHorizontalScroll&&"y"!==r.axis&&a.css({position:"absolute",width:"auto"}).wrap("
            ").css({width:Math.ceil(a[0].getBoundingClientRect().right+.4)-Math.floor(a[0].getBoundingClientRect().left),position:"relative"}).unwrap()},w=function(){var t=e(this),i=t.data(n),r=i.opt,a=e(".mCSB_"+i.idx+"_scrollbar:first"),o=te(r.scrollButtons.tabindex)?"tabindex='"+r.scrollButtons.tabindex+"'":"",s=["","","",""],l=["x"===r.axis?s[2]:s[0],"x"===r.axis?s[3]:s[1],s[2],s[3]];r.scrollButtons.enable&&a.prepend(l[0]).append(l[1]).next(".mCSB_scrollTools").prepend(l[2]).append(l[3])},_=function(){var t=e(this),i=t.data(n),r=e("#mCSB_"+i.idx),a=t.css("max-height")||"none",o=-1!==a.indexOf("%"),s=t.css("box-sizing");if("none"!==a){var l=o?t.parent().height()*parseInt(a)/100:parseInt(a);"border-box"===s&&(l-=t.innerHeight()-t.height()+(t.outerHeight()-t.innerHeight())),r.css("max-height",Math.round(l))}},x=function(){var t=e(this),i=t.data(n),r=e("#mCSB_"+i.idx),a=e("#mCSB_"+i.idx+"_container"),o=[e("#mCSB_"+i.idx+"_dragger_vertical"),e("#mCSB_"+i.idx+"_dragger_horizontal")],s=[r.height()/a.outerHeight(!1),r.width()/a.outerWidth(!1)],u=[parseInt(o[0].css("min-height")),Math.round(s[0]*o[0].parent().height()),parseInt(o[1].css("min-width")),Math.round(s[1]*o[1].parent().width())],c=l&&u[1]r.height(),s>r.width()]},k=function(){var t=e(this),i=t.data(n),r=i.opt,a=e("#mCSB_"+i.idx),o=e("#mCSB_"+i.idx+"_container"),s=[e("#mCSB_"+i.idx+"_dragger_vertical"),e("#mCSB_"+i.idx+"_dragger_horizontal")];if(Y(t),("x"!==r.axis&&!i.overflowed[0]||"y"===r.axis&&i.overflowed[0])&&(s[0].add(o).css("top",0),X(t,"_resetY")),"y"!==r.axis&&!i.overflowed[1]||"x"===r.axis&&i.overflowed[1]){var l=dx=0;"rtl"===i.langDir&&(l=a.width()-o.outerWidth(!1),dx=Math.abs(l/i.scrollRatio.x)),o.css("left",l),s[1].css("left",dx),X(t,"_resetX")}},$=function(){function t(){o=setTimeout(function(){e.event.special.mousewheel?(clearTimeout(o),E.call(i[0])):t()},100)}var i=e(this),r=i.data(n),a=r.opt;if(!r.bindEvents){if(O.call(this),a.contentTouchScroll&&A.call(this),M.call(this),a.mouseWheel.enable){var o;t()}L.call(this),H.call(this),a.advanced.autoScrollOnFocus&&R.call(this),a.scrollButtons.enable&&B.call(this),a.keyboard.enable&&z.call(this),r.bindEvents=!0}},D=function(){var t=e(this),i=t.data(n),r=i.opt,a=n+"_"+i.idx,o=".mCSB_"+i.idx+"_scrollbar",s=e("#mCSB_"+i.idx+",#mCSB_"+i.idx+"_container,#mCSB_"+i.idx+"_container_wrapper,"+o+" ."+c[12]+",#mCSB_"+i.idx+"_dragger_vertical,#mCSB_"+i.idx+"_dragger_horizontal,"+o+">a"),l=e("#mCSB_"+i.idx+"_container");r.advanced.releaseDraggableSelectors&&s.add(e(r.advanced.releaseDraggableSelectors)),i.bindEvents&&(e(document).unbind("."+a),s.each(function(){e(this).unbind("."+a)}),clearTimeout(t[0]._focusTimeout),Z(t[0],"_focusTimeout"),clearTimeout(i.sequential.step),Z(i.sequential,"step"),clearTimeout(l[0].onCompleteTimeout),Z(l[0],"onCompleteTimeout"),i.bindEvents=!1)},T=function(t){var i=e(this),r=i.data(n),a=r.opt,o=e("#mCSB_"+r.idx+"_container_wrapper"),s=o.length?o:e("#mCSB_"+r.idx+"_container"),l=[e("#mCSB_"+r.idx+"_scrollbar_vertical"),e("#mCSB_"+r.idx+"_scrollbar_horizontal")],u=[l[0].find(".mCSB_dragger"),l[1].find(".mCSB_dragger")];"x"!==a.axis&&(r.overflowed[0]&&!t?(l[0].add(u[0]).add(l[0].children("a")).css("display","block"),s.removeClass(c[8]+" "+c[10])):(a.alwaysShowScrollbar?(2!==a.alwaysShowScrollbar&&u[0].css("display","none"),s.removeClass(c[10])):(l[0].css("display","none"),s.addClass(c[10])),s.addClass(c[8]))),"y"!==a.axis&&(r.overflowed[1]&&!t?(l[1].add(u[1]).add(l[1].children("a")).css("display","block"),s.removeClass(c[9]+" "+c[11])):(a.alwaysShowScrollbar?(2!==a.alwaysShowScrollbar&&u[1].css("display","none"),s.removeClass(c[11])):(l[1].css("display","none"),s.addClass(c[11])),s.addClass(c[9]))),r.overflowed[0]||r.overflowed[1]?i.removeClass(c[5]):i.addClass(c[5])},Q=function(e){var t=e.type;switch(t){case"pointerdown":case"MSPointerDown":case"pointermove":case"MSPointerMove":case"pointerup":case"MSPointerUp":return e.target.ownerDocument!==document?[e.originalEvent.screenY,e.originalEvent.screenX,!1]:[e.originalEvent.pageY,e.originalEvent.pageX,!1];case"touchstart":case"touchmove":case"touchend":var i=e.originalEvent.touches[0]||e.originalEvent.changedTouches[0],n=e.originalEvent.touches.length||e.originalEvent.changedTouches.length;return e.target.ownerDocument!==document?[i.screenY,i.screenX,n>1]:[i.pageY,i.pageX,n>1];default:return[e.pageY,e.pageX,!1]}},O=function(){function t(e){var t=f.find("iframe");if(t.length){var i=e?"auto":"none";t.css("pointer-events",i)}}function i(e,t,i,n){if(f[0].idleTimer=d.scrollInertia<233?250:0,r.attr("id")===p[1])var a="x",o=(r[0].offsetLeft-t+n)*c.scrollRatio.x;else var a="y",o=(r[0].offsetTop-e+i)*c.scrollRatio.y;X(s,o.toString(),{dir:a,drag:!0})}var r,a,o,s=e(this),c=s.data(n),d=c.opt,h=n+"_"+c.idx,p=["mCSB_"+c.idx+"_dragger_vertical","mCSB_"+c.idx+"_dragger_horizontal"],f=e("#mCSB_"+c.idx+"_container"),m=e("#"+p[0]+",#"+p[1]),g=d.advanced.releaseDraggableSelectors?m.add(e(d.advanced.releaseDraggableSelectors)):m;m.bind("mousedown."+h+" touchstart."+h+" pointerdown."+h+" MSPointerDown."+h,function(i){if(i.stopImmediatePropagation(),i.preventDefault(),J(i)){u=!0,l&&(document.onselectstart=function(){return!1}),t(!1),Y(s),r=e(this);var n=r.offset(),c=Q(i)[0]-n.top,h=Q(i)[1]-n.left,p=r.height()+n.top,f=r.width()+n.left;p>c&&c>0&&f>h&&h>0&&(a=c,o=h),C(r,"active",d.autoExpandScrollbar)}}).bind("touchmove."+h,function(e){e.stopImmediatePropagation(),e.preventDefault();var t=r.offset(),n=Q(e)[0]-t.top,s=Q(e)[1]-t.left;i(a,o,n,s)}),e(document).bind("mousemove."+h+" pointermove."+h+" MSPointerMove."+h,function(e){if(r){var t=r.offset(),n=Q(e)[0]-t.top,s=Q(e)[1]-t.left;if(a===n)return;i(a,o,n,s)}}).add(g).bind("mouseup."+h+" touchend."+h+" pointerup."+h+" MSPointerUp."+h,function(){r&&(C(r,"active",d.autoExpandScrollbar),r=null),u=!1,l&&(document.onselectstart=null),t(!0)})},A=function(){function i(e){if(!ee(e)||u||Q(e)[2])return void(t=0);t=1,_=0,x=0;var i=D.offset();c=Q(e)[0]-i.top,d=Q(e)[1]-i.left,P=[Q(e)[0],Q(e)[1]]}function r(e){if(ee(e)&&!u&&!Q(e)[2]&&(e.stopImmediatePropagation(),!x||_)){m=K();var t=$.offset(),i=Q(e)[0]-t.top,n=Q(e)[1]-t.left,r="mcsLinearOut";if(O.push(i),A.push(n),P[2]=Math.abs(Q(e)[0]-P[0]),P[3]=Math.abs(Q(e)[1]-P[1]),C.overflowed[0])var a=T[0].parent().height()-T[0].height(),o=c-i>0&&i-c>-(a*C.scrollRatio.y)&&(2*P[3]0&&n-d>-(s*C.scrollRatio.x)&&(2*P[2]30)){y=1e3/(g-f);var r="mcsEaseOut",a=2.5>y,o=a?[O[O.length-2],A[A.length-2]]:[0,0];v=a?[i-o[0],n-o[1]]:[i-h,n-p];var c=[Math.abs(v[0]),Math.abs(v[1])];y=a?[Math.abs(v[0]/4),Math.abs(v[1]/4)]:[y,y];var d=[Math.abs(D[0].offsetTop)-v[0]*s(c[0]/y[0],y[0]),Math.abs(D[0].offsetLeft)-v[1]*s(c[1]/y[1],y[1])];b="yx"===S.axis?[d[0],d[1]]:"x"===S.axis?[null,d[1]]:[d[0],null],w=[4*c[0]+S.scrollInertia,4*c[1]+S.scrollInertia];var j=parseInt(S.contentTouchScroll)||0;b[0]=c[0]>j?b[0]:0,b[1]=c[1]>j?b[1]:0,C.overflowed[0]&&l(b[0],w[0],r,"y",E,!1),C.overflowed[1]&&l(b[1],w[1],r,"x",E,!1)}}}function s(e,t){var i=[1.5*t,2*t,t/1.5,t/2];return e>90?t>4?i[0]:i[3]:e>60?t>3?i[3]:i[2]:e>30?t>8?i[1]:t>6?i[0]:t>4?t:i[2]:t>8?t:i[3]}function l(e,t,i,n,r,a){e&&X(j,e.toString(),{dur:t,scrollEasing:i,dir:n,overwrite:r,drag:a})}var c,d,h,p,f,m,g,v,y,b,w,_,x,j=e(this),C=j.data(n),S=C.opt,k=n+"_"+C.idx,$=e("#mCSB_"+C.idx),D=e("#mCSB_"+C.idx+"_container"),T=[e("#mCSB_"+C.idx+"_dragger_vertical"),e("#mCSB_"+C.idx+"_dragger_horizontal")],O=[],A=[],M=0,E="yx"===S.axis?"none":"all",P=[],L=D.find("iframe"),R=["touchstart."+k+" pointerdown."+k+" MSPointerDown."+k,"touchmove."+k+" pointermove."+k+" MSPointerMove."+k,"touchend."+k+" pointerup."+k+" MSPointerUp."+k];D.bind(R[0],function(e){i(e)}).bind(R[1],function(e){r(e)}),$.bind(R[0],function(e){a(e)}).bind(R[2],function(e){o(e)}),L.length&&L.each(function(){e(this).load(function(){I(this)&&e(this.contentDocument||this.contentWindow.document).bind(R[0],function(e){i(e),a(e)}).bind(R[1],function(e){r(e)}).bind(R[2],function(e){o(e)})})})},M=function(){function i(){return window.getSelection?window.getSelection().toString():document.selection&&"Control"!=document.selection.type?document.selection.createRange().text:0}function r(e,t,i){c.type=i&&a?"stepped":"stepless",c.scrollAmount=10,q(o,e,t,"mcsLinearOut",i?60:null)}var a,o=e(this),s=o.data(n),l=s.opt,c=s.sequential,d=n+"_"+s.idx,h=e("#mCSB_"+s.idx+"_container"),p=h.parent();h.bind("mousedown."+d,function(){t||a||(a=1,u=!0)}).add(document).bind("mousemove."+d,function(e){if(!t&&a&&i()){var n=h.offset(),o=Q(e)[0]-n.top+h[0].offsetTop,u=Q(e)[1]-n.left+h[0].offsetLeft;o>0&&o0&&uo?r("on",38):o>p.height()&&r("on",40)),"y"!==l.axis&&s.overflowed[1]&&(0>u?r("on",37):u>p.width()&&r("on",39)))}}).bind("mouseup."+d,function(){t||(a&&(a=0,r("off",null)),u=!1)})},E=function(){function t(t,n){if(Y(i),!P(i,t.target)){var o="auto"!==a.mouseWheel.deltaFactor?parseInt(a.mouseWheel.deltaFactor):l&&t.deltaFactor<100?100:t.deltaFactor||100;if("x"===a.axis||"x"===a.mouseWheel.axis)var c="x",d=[Math.round(o*r.scrollRatio.x),parseInt(a.mouseWheel.scrollAmount)],h="auto"!==a.mouseWheel.scrollAmount?d[1]:d[0]>=s.width()?.9*s.width():d[0],p=Math.abs(e("#mCSB_"+r.idx+"_container")[0].offsetLeft),f=u[1][0].offsetLeft,m=u[1].parent().width()-u[1].width(),g=t.deltaX||t.deltaY||n;else var c="y",d=[Math.round(o*r.scrollRatio.y),parseInt(a.mouseWheel.scrollAmount)],h="auto"!==a.mouseWheel.scrollAmount?d[1]:d[0]>=s.height()?.9*s.height():d[0],p=Math.abs(e("#mCSB_"+r.idx+"_container")[0].offsetTop),f=u[0][0].offsetTop,m=u[0].parent().height()-u[0].height(),g=t.deltaY||n;"y"===c&&!r.overflowed[0]||"x"===c&&!r.overflowed[1]||(a.mouseWheel.invert&&(g=-g),a.mouseWheel.normalizeDelta&&(g=0>g?-1:1),(g>0&&0!==f||0>g&&f!==m||a.mouseWheel.preventDefault)&&(t.stopImmediatePropagation(),t.preventDefault()),X(i,(p-g*h).toString(),{dir:c}))}}var i=e(this),r=i.data(n),a=r.opt,o=n+"_"+r.idx,s=e("#mCSB_"+r.idx),u=[e("#mCSB_"+r.idx+"_dragger_vertical"),e("#mCSB_"+r.idx+"_dragger_horizontal")],c=e("#mCSB_"+r.idx+"_container").find("iframe");r&&(c.length&&c.each(function(){e(this).load(function(){I(this)&&e(this.contentDocument||this.contentWindow.document).bind("mousewheel."+o,function(e,i){t(e,i)})})}),s.bind("mousewheel."+o,function(e,i){t(e,i)}))},I=function(e){var t=null;try{var i=e.contentDocument||e.contentWindow.document;t=i.body.innerHTML}catch(e){}return null!==t},P=function(t,i){var r=i.nodeName.toLowerCase(),a=t.data(n).opt.mouseWheel.disableOver,o=["select","textarea"];return e.inArray(r,a)>-1&&!(e.inArray(r,o)>-1&&!e(i).is(":focus"))},L=function(){var t=e(this),i=t.data(n),r=n+"_"+i.idx,a=e("#mCSB_"+i.idx+"_container"),o=a.parent(),s=e(".mCSB_"+i.idx+"_scrollbar ."+c[12]);s.bind("touchstart."+r+" pointerdown."+r+" MSPointerDown."+r,function(){u=!0}).bind("touchend."+r+" pointerup."+r+" MSPointerUp."+r,function(){u=!1}).bind("click."+r,function(n){if(e(n.target).hasClass(c[12])||e(n.target).hasClass("mCSB_draggerRail")){Y(t);var r=e(this),s=r.find(".mCSB_dragger");if(r.parent(".mCSB_scrollTools_horizontal").length>0){if(!i.overflowed[1])return;var l="x",u=n.pageX>s.offset().left?-1:1,d=Math.abs(a[0].offsetLeft)-.9*u*o.width()}else{if(!i.overflowed[0])return;var l="y",u=n.pageY>s.offset().top?-1:1,d=Math.abs(a[0].offsetTop)-.9*u*o.height()}X(t,d.toString(),{dir:l,scrollEasing:"mcsEaseInOut"})}})},R=function(){var t=e(this),i=t.data(n),r=i.opt,a=n+"_"+i.idx,o=e("#mCSB_"+i.idx+"_container"),s=o.parent();o.bind("focusin."+a,function(){var i=e(document.activeElement),n=o.find(".mCustomScrollBox").length,a=0;i.is(r.advanced.autoScrollOnFocus)&&(Y(t),clearTimeout(t[0]._focusTimeout),t[0]._focusTimer=n?(a+17)*n:0,t[0]._focusTimeout=setTimeout(function(){var e=[ie(i)[0],ie(i)[1]],n=[o[0].offsetTop,o[0].offsetLeft],l=[n[0]+e[0]>=0&&n[0]+e[0]=0&&n[0]+e[1]a");l.bind("mousedown."+o+" touchstart."+o+" pointerdown."+o+" MSPointerDown."+o+" mouseup."+o+" touchend."+o+" pointerup."+o+" MSPointerUp."+o+" mouseout."+o+" pointerout."+o+" MSPointerOut."+o+" click."+o,function(n){function o(e,i){a.scrollAmount=r.snapAmount||r.scrollButtons.scrollAmount,q(t,e,i)}if(n.preventDefault(),J(n)){var s=e(this).attr("class");switch(a.type=r.scrollButtons.scrollType,n.type){case"mousedown":case"touchstart":case"pointerdown":case"MSPointerDown":if("stepped"===a.type)return;u=!0,i.tweenRunning=!1,o("on",s);break;case"mouseup":case"touchend":case"pointerup":case"MSPointerUp":case"mouseout":case"pointerout":case"MSPointerOut":if("stepped"===a.type)return;u=!1,a.dir&&o("off",s);break;case"click":if("stepped"!==a.type||i.tweenRunning)return;o("on",s)}}})},z=function(){function t(t){function n(e,t){o.type=a.keyboard.scrollType,o.scrollAmount=a.snapAmount||a.keyboard.scrollAmount,"stepped"===o.type&&r.tweenRunning||q(i,e,t)}switch(t.type){case"blur":r.tweenRunning&&o.dir&&n("off",null);break;case"keydown":case"keyup":var s=t.keyCode?t.keyCode:t.which,l="on";if("x"!==a.axis&&(38===s||40===s)||"y"!==a.axis&&(37===s||39===s)){if((38===s||40===s)&&!r.overflowed[0]||(37===s||39===s)&&!r.overflowed[1])return;"keyup"===t.type&&(l="off"),e(document.activeElement).is(d)||(t.preventDefault(),t.stopImmediatePropagation(),n(l,s))}else if(33===s||34===s){if((r.overflowed[0]||r.overflowed[1])&&(t.preventDefault(),t.stopImmediatePropagation()),"keyup"===t.type){Y(i);var h=34===s?-1:1;if("x"===a.axis||"yx"===a.axis&&r.overflowed[1]&&!r.overflowed[0])var p="x",f=Math.abs(u[0].offsetLeft)-.9*h*c.width();else var p="y",f=Math.abs(u[0].offsetTop)-.9*h*c.height();X(i,f.toString(),{dir:p,scrollEasing:"mcsEaseInOut"})}}else if((35===s||36===s)&&!e(document.activeElement).is(d)&&((r.overflowed[0]||r.overflowed[1])&&(t.preventDefault(),t.stopImmediatePropagation()),"keyup"===t.type)){if("x"===a.axis||"yx"===a.axis&&r.overflowed[1]&&!r.overflowed[0])var p="x",f=35===s?Math.abs(c.width()-u.outerWidth(!1)):0;else var p="y",f=35===s?Math.abs(c.height()-u.outerHeight(!1)):0;X(i,f.toString(),{dir:p,scrollEasing:"mcsEaseInOut"})}}}var i=e(this),r=i.data(n),a=r.opt,o=r.sequential,s=n+"_"+r.idx,l=e("#mCSB_"+r.idx),u=e("#mCSB_"+r.idx+"_container"),c=u.parent(),d="input,textarea,select,datalist,keygen,[contenteditable='true']",h=u.find("iframe"),p=["blur."+s+" keydown."+s+" keyup."+s];h.length&&h.each(function(){e(this).load(function(){I(this)&&e(this.contentDocument||this.contentWindow.document).bind(p[0],function(e){t(e)})})}),l.attr("tabindex","0").bind(p[0],function(e){t(e)})},q=function(t,i,r,a,o){function s(e){var i="stepped"!==h.type,n=o?o:e?i?m/1.5:g:1e3/60,r=e?i?7.5:40:2.5,l=[Math.abs(p[0].offsetTop),Math.abs(p[0].offsetLeft)],c=[u.scrollRatio.y>10?10:u.scrollRatio.y,u.scrollRatio.x>10?10:u.scrollRatio.x],d="x"===h.dir[0]?l[1]+h.dir[1]*c[1]*r:l[0]+h.dir[1]*c[0]*r,f="x"===h.dir[0]?l[1]+h.dir[1]*parseInt(h.scrollAmount):l[0]+h.dir[1]*parseInt(h.scrollAmount),v="auto"!==h.scrollAmount?f:d,y=a?a:e?i?"mcsLinearOut":"mcsEaseInOut":"mcsLinear",b=!!e;return e&&17>n&&(v="x"===h.dir[0]?l[1]:l[0]),X(t,v.toString(),{dir:h.dir[0],scrollEasing:y,dur:n,onComplete:b}),e?void(h.dir=!1):(clearTimeout(h.step),void(h.step=setTimeout(function(){s()},n)))}function l(){clearTimeout(h.step),Z(h,"step"),Y(t)}var u=t.data(n),d=u.opt,h=u.sequential,p=e("#mCSB_"+u.idx+"_container"),f="stepped"===h.type,m=d.scrollInertia<26?26:d.scrollInertia,g=d.scrollInertia<1?17:d.scrollInertia;switch(i){case"on":if(h.dir=[r===c[16]||r===c[15]||39===r||37===r?"x":"y",r===c[13]||r===c[15]||38===r||37===r?-1:1],Y(t),te(r)&&"stepped"===h.type)return;s(f);break;case"off":l(),(f||u.tweenRunning&&h.dir)&&s(!0)}},F=function(t){var i=e(this).data(n).opt,r=[];return"function"==typeof t&&(t=t()),t instanceof Array?r=t.length>1?[t[0],t[1]]:"x"===i.axis?[null,t[0]]:[t[0],null]:(r[0]=t.y?t.y:t.x||"x"===i.axis?null:t,r[1]=t.x?t.x:t.y||"y"===i.axis?null:t),"function"==typeof r[0]&&(r[0]=r[0]()),"function"==typeof r[1]&&(r[1]=r[1]()),r},W=function(t,i){if(null!=t&&"undefined"!=typeof t){var r=e(this),a=r.data(n),o=a.opt,s=e("#mCSB_"+a.idx+"_container"),l=s.parent(),u=typeof t;i||(i="x"===o.axis?"x":"y");var c="x"===i?s.outerWidth(!1):s.outerHeight(!1),h="x"===i?s[0].offsetLeft:s[0].offsetTop,p="x"===i?"left":"top"; +switch(u){case"function":return t();case"object":var f=t.jquery?t:e(t);if(!f.length)return;return"x"===i?ie(f)[1]:ie(f)[0];case"string":case"number":if(te(t))return Math.abs(t);if(-1!==t.indexOf("%"))return Math.abs(c*parseInt(t)/100);if(-1!==t.indexOf("-="))return Math.abs(h-parseInt(t.split("-=")[1]));if(-1!==t.indexOf("+=")){var m=h+parseInt(t.split("+=")[1]);return m>=0?0:Math.abs(m)}if(-1!==t.indexOf("px")&&te(t.split("px")[0]))return Math.abs(t.split("px")[0]);if("top"===t||"left"===t)return 0;if("bottom"===t)return Math.abs(l.height()-s.outerHeight(!1));if("right"===t)return Math.abs(l.width()-s.outerWidth(!1));if("first"===t||"last"===t){var f=s.find(":"+t);return"x"===i?ie(f)[1]:ie(f)[0]}return e(t).length?"x"===i?ie(e(t))[1]:ie(e(t))[0]:(s.css(p,t),void d.update.call(null,r[0]))}}},U=function(t){function i(){clearTimeout(p[0].autoUpdate),p[0].autoUpdate=setTimeout(function(){return h.advanced.updateOnSelectorChange&&(f=o(),f!==w)?(s(3),void(w=f)):(h.advanced.updateOnContentResize&&(m=[p.outerHeight(!1),p.outerWidth(!1),v.height(),v.width(),b()[0],b()[1]],(m[0]!==_[0]||m[1]!==_[1]||m[2]!==_[2]||m[3]!==_[3]||m[4]!==_[4]||m[5]!==_[5])&&(s(m[0]!==_[0]||m[1]!==_[1]),_=m)),h.advanced.updateOnImageLoad&&(g=r(),g!==x&&(p.find("img").each(function(){a(this)}),x=g)),void((h.advanced.updateOnSelectorChange||h.advanced.updateOnContentResize||h.advanced.updateOnImageLoad)&&i()))},60)}function r(){var e=0;return h.advanced.updateOnImageLoad&&(e=p.find("img").length),e}function a(t){function i(e,t){return function(){return t.apply(e,arguments)}}function n(){this.onload=null,e(t).addClass(c[2]),s(2)}if(e(t).hasClass(c[2]))return void s();var r=new Image;r.onload=i(r,n),r.src=t.src}function o(){h.advanced.updateOnSelectorChange===!0&&(h.advanced.updateOnSelectorChange="*");var t=0,i=p.find(h.advanced.updateOnSelectorChange);return h.advanced.updateOnSelectorChange&&i.length>0&&i.each(function(){t+=e(this).height()+e(this).width()}),t}function s(e){clearTimeout(p[0].autoUpdate),d.update.call(null,l[0],e)}var l=e(this),u=l.data(n),h=u.opt,p=e("#mCSB_"+u.idx+"_container");if(t)return clearTimeout(p[0].autoUpdate),void Z(p[0],"autoUpdate");var f,m,g,v=p.parent(),y=[e("#mCSB_"+u.idx+"_scrollbar_vertical"),e("#mCSB_"+u.idx+"_scrollbar_horizontal")],b=function(){return[y[0].is(":visible")?y[0].outerHeight(!0):0,y[1].is(":visible")?y[1].outerWidth(!0):0]},w=o(),_=[p.outerHeight(!1),p.outerWidth(!1),v.height(),v.width(),b()[0],b()[1]],x=r();i()},N=function(e,t,i){return Math.round(e/t)*t-i},Y=function(t){var i=t.data(n),r=e("#mCSB_"+i.idx+"_container,#mCSB_"+i.idx+"_container_wrapper,#mCSB_"+i.idx+"_dragger_vertical,#mCSB_"+i.idx+"_dragger_horizontal");r.each(function(){V.call(this)})},X=function(t,i,r){function a(e){return l&&u.callbacks[e]&&"function"==typeof u.callbacks[e]}function o(){return[u.callbacks.alwaysTriggerOffsets||b>=w[0]+x,u.callbacks.alwaysTriggerOffsets||-j>=b]}function s(){var e=[p[0].offsetTop,p[0].offsetLeft],i=[v[0].offsetTop,v[0].offsetLeft],n=[p.outerHeight(!1),p.outerWidth(!1)],a=[h.height(),h.width()];t[0].mcs={content:p,top:e[0],left:e[1],draggerTop:i[0],draggerLeft:i[1],topPct:Math.round(100*Math.abs(e[0])/(Math.abs(n[0])-a[0])),leftPct:Math.round(100*Math.abs(e[1])/(Math.abs(n[1])-a[1])),direction:r.dir}}var l=t.data(n),u=l.opt,c={trigger:"internal",dir:"y",scrollEasing:"mcsEaseOut",drag:!1,dur:u.scrollInertia,overwrite:"all",callbacks:!0,onStart:!0,onUpdate:!0,onComplete:!0},r=e.extend(c,r),d=[r.dur,r.drag?0:r.dur],h=e("#mCSB_"+l.idx),p=e("#mCSB_"+l.idx+"_container"),f=p.parent(),m=u.callbacks.onTotalScrollOffset?F.call(t,u.callbacks.onTotalScrollOffset):[0,0],g=u.callbacks.onTotalScrollBackOffset?F.call(t,u.callbacks.onTotalScrollBackOffset):[0,0];if(l.trigger=r.trigger,(0!==f.scrollTop()||0!==f.scrollLeft())&&(e(".mCSB_"+l.idx+"_scrollbar").css("visibility","visible"),f.scrollTop(0).scrollLeft(0)),"_resetY"!==i||l.contentReset.y||(a("onOverflowYNone")&&u.callbacks.onOverflowYNone.call(t[0]),l.contentReset.y=1),"_resetX"!==i||l.contentReset.x||(a("onOverflowXNone")&&u.callbacks.onOverflowXNone.call(t[0]),l.contentReset.x=1),"_resetY"!==i&&"_resetX"!==i){switch(!l.contentReset.y&&t[0].mcs||!l.overflowed[0]||(a("onOverflowY")&&u.callbacks.onOverflowY.call(t[0]),l.contentReset.x=null),!l.contentReset.x&&t[0].mcs||!l.overflowed[1]||(a("onOverflowX")&&u.callbacks.onOverflowX.call(t[0]),l.contentReset.x=null),u.snapAmount&&(i=N(i,u.snapAmount,u.snapOffset)),r.dir){case"x":var v=e("#mCSB_"+l.idx+"_dragger_horizontal"),y="left",b=p[0].offsetLeft,w=[h.width()-p.outerWidth(!1),v.parent().width()-v.width()],_=[i,0===i?0:i/l.scrollRatio.x],x=m[1],j=g[1],S=x>0?x/l.scrollRatio.x:0,k=j>0?j/l.scrollRatio.x:0;break;case"y":var v=e("#mCSB_"+l.idx+"_dragger_vertical"),y="top",b=p[0].offsetTop,w=[h.height()-p.outerHeight(!1),v.parent().height()-v.height()],_=[i,0===i?0:i/l.scrollRatio.y],x=m[0],j=g[0],S=x>0?x/l.scrollRatio.y:0,k=j>0?j/l.scrollRatio.y:0}_[1]<0||0===_[0]&&0===_[1]?_=[0,0]:_[1]>=w[1]?_=[w[0],w[1]]:_[0]=-_[0],t[0].mcs||(s(),a("onInit")&&u.callbacks.onInit.call(t[0])),clearTimeout(p[0].onCompleteTimeout),(l.tweenRunning||!(0===b&&_[0]>=0||b===w[0]&&_[0]<=w[0]))&&(G(v[0],y,Math.round(_[1]),d[1],r.scrollEasing),G(p[0],y,Math.round(_[0]),d[0],r.scrollEasing,r.overwrite,{onStart:function(){r.callbacks&&r.onStart&&!l.tweenRunning&&(a("onScrollStart")&&(s(),u.callbacks.onScrollStart.call(t[0])),l.tweenRunning=!0,C(v),l.cbOffsets=o())},onUpdate:function(){r.callbacks&&r.onUpdate&&a("whileScrolling")&&(s(),u.callbacks.whileScrolling.call(t[0]))},onComplete:function(){if(r.callbacks&&r.onComplete){"yx"===u.axis&&clearTimeout(p[0].onCompleteTimeout);var e=p[0].idleTimer||0;p[0].onCompleteTimeout=setTimeout(function(){a("onScroll")&&(s(),u.callbacks.onScroll.call(t[0])),a("onTotalScroll")&&_[1]>=w[1]-S&&l.cbOffsets[0]&&(s(),u.callbacks.onTotalScroll.call(t[0])),a("onTotalScrollBack")&&_[1]<=k&&l.cbOffsets[1]&&(s(),u.callbacks.onTotalScrollBack.call(t[0])),l.tweenRunning=!1,p[0].idleTimer=0,C(v,"hide")},e)}}}))}},G=function(e,t,i,n,r,a,o){function s(){_.stop||(y||f.call(),y=K()-v,l(),y>=_.time&&(_.time=y>_.time?y+h-(y-_.time):y+h-1,_.time0?(_.currVal=d(_.time,b,x,n,r),w[t]=Math.round(_.currVal)+"px"):w[t]=i+"px",m.call()}function u(){h=1e3/60,_.time=y+h,p=window.requestAnimationFrame?window.requestAnimationFrame:function(e){return l(),setTimeout(e,.01)},_.id=p(s)}function c(){null!=_.id&&(window.requestAnimationFrame?window.cancelAnimationFrame(_.id):clearTimeout(_.id),_.id=null)}function d(e,t,i,n,r){switch(r){case"linear":case"mcsLinear":return i*e/n+t;case"mcsLinearOut":return e/=n,e--,i*Math.sqrt(1-e*e)+t;case"easeInOutSmooth":return e/=n/2,1>e?i/2*e*e+t:(e--,-i/2*(e*(e-2)-1)+t);case"easeInOutStrong":return e/=n/2,1>e?i/2*Math.pow(2,10*(e-1))+t:(e--,i/2*(-Math.pow(2,-10*e)+2)+t);case"easeInOut":case"mcsEaseInOut":return e/=n/2,1>e?i/2*e*e*e+t:(e-=2,i/2*(e*e*e+2)+t);case"easeOutSmooth":return e/=n,e--,-i*(e*e*e*e-1)+t;case"easeOutStrong":return i*(-Math.pow(2,-10*e/n)+1)+t;case"easeOut":case"mcsEaseOut":default:var a=(e/=n)*e,o=a*e;return t+i*(.499999999999997*o*a+-2.5*a*a+5.5*o+-6.5*a+4*e)}}e._mTween||(e._mTween={top:{},left:{}});var h,p,o=o||{},f=o.onStart||function(){},m=o.onUpdate||function(){},g=o.onComplete||function(){},v=K(),y=0,b=e.offsetTop,w=e.style,_=e._mTween[t];"left"===t&&(b=e.offsetLeft);var x=i-b;_.stop=0,"none"!==a&&c(),u()},K=function(){return window.performance&&window.performance.now?window.performance.now():window.performance&&window.performance.webkitNow?window.performance.webkitNow():Date.now?Date.now():(new Date).getTime()},V=function(){var e=this;e._mTween||(e._mTween={top:{},left:{}});for(var t=["top","left"],i=0;i=0&&n[0]+ie(r)[0]=0&&n[1]+ie(r)[1]")[0].getContext)},init:function(){var t=this.defaults;e.each(t,function(e,i){switch(e){case"aspectRatio":t[e]=H(q(i))||s;break;case"autoCropArea":t[e]=H(q(i))||.8;break;case"minWidth":case"minHeight":t[e]=H(q(i))||0;break;case"maxWidth":case"maxHeight":t[e]=H(q(i))||l}}),this.image={rotate:0},this.load()},load:function(){var t,i,n=this,a=this.$element,o=this.element,s=this.image,l="";a.is("img")?i=a.prop("src"):a.is("canvas")&&this.support.canvas&&(i=o.toDataURL()),i&&(this.replaced&&(s.rotate=0),this.defaults.checkImageOrigin&&(a.prop("crossOrigin")||this.isCrossOriginURL(i))&&(l=" crossOrigin"),this.$clone=t=e("'),t.one("load",function(){s.naturalWidth=this.naturalWidth||t.width(),s.naturalHeight=this.naturalHeight||t.height(),s.aspectRatio=s.naturalWidth/s.naturalHeight,n.url=i,n.ready=r,n.build()}),t.addClass(v).prependTo("body"))},isCrossOriginURL:function(e){var t=e.match(/^(https?:)\/\/([^\:\/\?#]+):?(\d*)/i);return!t||t[1]===n.protocol&&t[2]===n.hostname&&t[3]===n.port?a:r},build:function(){var t,i,n=this.$element,o=this.defaults;this.ready&&(this.built&&this.unbuild(),n.one($,o.build),t=e.Event($),n.trigger(t),t.isDefaultPrevented()||(this.$cropper=i=e(I.TEMPLATE),n.addClass(g),this.$clone.removeClass(v).prependTo(i),this.rotated||(this.$original=this.$clone.clone(),this.$original.addClass(g).prependTo(this.$cropper),this.originalImage=e.extend({},this.image)),this.$container=n.parent(),this.$container.append(i),this.$canvas=i.find(".cropper-canvas"),this.$dragger=i.find(".cropper-dragger"),this.$viewer=i.find(".cropper-viewer"),o.autoCrop?this.cropped=r:this.$dragger.addClass(g),o.dragCrop&&this.setDragMode("crop"),o.modal&&this.$canvas.addClass(m),!o.dashed&&this.$dragger.find(".cropper-dashed").addClass(g),!o.movable&&this.$dragger.find(".cropper-face").data(c,"move"),!o.resizable&&this.$dragger.find(".cropper-line, .cropper-point").addClass(g),this.addListeners(),this.initPreview(),this.built=r,this.update(),this.replaced=a,n.one(D,o.built),n.trigger(D)))},unbuild:function(){this.built&&(this.built=a,this.removeListeners(),this.$preview.empty(),this.$preview=o,this.$dragger=o,this.$canvas=o,this.$container=o,this.$cropper.remove(),this.$cropper=o)},update:function(e){this.initContainer(),this.initCropper(),this.initImage(),this.initDragger(),e?(this.setData(e,r),this.setDragMode("crop")):this.setData(this.defaults.data)},resize:function(){clearTimeout(this.resizing),this.resizing=setTimeout(e.proxy(this.update,this,this.getData()),200)},preview:function(){var t=this.image,i=this.dragger,n=t.width,r=t.height,a=i.left-t.left,o=i.top-t.top;this.$viewer.find("img").css({width:n,height:r,marginLeft:-a,marginTop:-o}),this.$preview.each(function(){var t=e(this),s=t.width()/i.width;t.find("img").css({width:n*s,height:r*s,marginLeft:-a*s,marginTop:-o*s})})},addListeners:function(){var n=this.defaults;this.$element.on(T,n.dragstart).on(Q,n.dragmove).on(O,n.dragend),this.$cropper.on(_,e.proxy(this.dragstart,this)).on(k,e.proxy(this.dblclick,this)),n.zoomable&&this.$cropper.on(C,e.proxy(this.wheel,this)),n.multiple?this.$cropper.on(x,e.proxy(this.dragmove,this)).on(j,e.proxy(this.dragend,this)):i.on(x,this._dragmove=E(this.dragmove,this)).on(j,this._dragend=E(this.dragend,this)),t.on(S,this._resize=E(this.resize,this))},removeListeners:function(){var e=this.defaults;this.$element.off(T,e.dragstart).off(Q,e.dragmove).off(O,e.dragend),this.$cropper.off(_,this.dragstart).off(k,this.dblclick),e.zoomable&&this.$cropper.off(C,this.wheel),e.multiple?this.$cropper.off(x,this.dragmove).off(j,this.dragend):i.off(x,this._dragmove).off(j,this._dragend),t.off(S,this._resize)},initPreview:function(){var t='';this.$preview=e(this.defaults.preview),this.$viewer.html(t),this.$preview.html(t).find("img").css("cssText","min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important;")},initContainer:function(){var e=this.$container;e!==o&&(this.container={width:R(e.width(),300),height:R(e.height(),150)})},initCropper:function(){var e,t=this.container,i=this.image;i.naturalWidth*t.height/i.naturalHeight-t.width>=0?(e={width:t.width,height:t.width/i.aspectRatio,left:0},e.top=(t.height-e.height)/2):(e={width:t.height*i.aspectRatio,height:t.height,top:0},e.left=(t.width-e.width)/2),this.$cropper.css({width:e.width,height:e.height,left:e.left,top:e.top}),this.cropper=e},initImage:function(){var t=this.image,i=this.cropper,n={_width:i.width,_height:i.height,width:i.width,height:i.height,left:0,top:0,ratio:i.width/t.naturalWidth};this.defaultImage=e.extend({},t,n),t._width!==i.width||t._height!==i.height?e.extend(t,n):(t=e.extend({},n,t),this.replaced&&(t.ratio=n.ratio)),this.image=t,this.renderImage()},renderImage:function(e){var t=this.image;"zoom"===e&&(t.left-=(t.width-t.oldWidth)/2,t.top-=(t.height-t.oldHeight)/2),t.left=L(R(t.left,t._width-t.width),0),t.top=L(R(t.top,t._height-t.height),0),this.$clone.css({width:t.width,height:t.height,marginLeft:t.left,marginTop:t.top}),e&&(this.defaults.done(this.getData()),this.preview())},initDragger:function(){var t,i=this.defaults,n=this.cropper,r=i.aspectRatio||this.image.aspectRatio,a=this.image.ratio;t=n.height*r-n.width>=0?{height:n.width/r,width:n.width,left:0,top:(n.height-n.width/r)/2,maxWidth:n.width,maxHeight:n.width/r}:{height:n.height,width:n.height*r,left:(n.width-n.height*r)/2,top:0,maxWidth:n.height*r,maxHeight:n.height},t.minWidth=0,t.minHeight=0,i.aspectRatio?(isFinite(i.maxWidth)?(t.maxWidth=L(t.maxWidth,i.maxWidth*a),t.maxHeight=t.maxWidth/r):isFinite(i.maxHeight)&&(t.maxHeight=L(t.maxHeight,i.maxHeight*a),t.maxWidth=t.maxHeight*r),i.minWidth>0?(t.minWidth=R(0,i.minWidth*a),t.minHeight=t.minWidth/r):i.minHeight>0&&(t.minHeight=R(0,i.minHeight*a),t.minWidth=t.minHeight*r)):(t.maxWidth=L(t.maxWidth,i.maxWidth*a),t.maxHeight=L(t.maxHeight,i.maxHeight*a),t.minWidth=R(0,i.minWidth*a),t.minHeight=R(0,i.minHeight*a)),t.minWidth=L(t.maxWidth,t.minWidth),t.minHeight=L(t.maxHeight,t.minHeight),t.height*=i.autoCropArea,t.width*=i.autoCropArea,t.left=(n.width-t.width)/2,t.top=(n.height-t.height)/2,t.oldLeft=t.left,t.oldTop=t.top,this.defaultDragger=t,this.dragger=e.extend({},t)},renderDragger:function(){var e=this.dragger,t=this.cropper;e.width>e.maxWidth?(e.width=e.maxWidth,e.left=e.oldLeft):e.widthe.maxHeight?(e.height=e.maxHeight,e.top=e.oldTop):e.height').one("load",function(){l.width=this.width,l.height=this.height,n.clearRect(0,0,l.width,l.height),n.drawImage(this,0,0),o.load()})))},setData:function(t,i){var n=this.cropper,r=this.dragger,a=this.image,s=this.defaults.aspectRatio;this.built&&typeof t!==u&&((t===o||e.isEmptyObject(t))&&(r=e.extend({},this.defaultDragger)),e.isPlainObject(t)&&!e.isEmptyObject(t)&&(i||(this.defaults.data=t),t=this.transformData(t),A(t.x)&&t.x<=n.width-a.left&&(r.left=t.x+a.left),A(t.y)&&t.y<=n.height-a.top&&(r.top=t.y+a.top),s?A(t.width)&&t.width<=r.maxWidth&&t.width>=r.minWidth?(r.width=t.width,r.height=r.width/s):A(t.height)&&t.height<=r.maxHeight&&t.height>=r.minHeight&&(r.height=t.height,r.width=r.height*s):(A(t.width)&&t.width<=r.maxWidth&&t.width>=r.minWidth&&(r.width=t.width),A(t.height)&&t.height<=r.maxHeight&&t.height>=r.minHeight&&(r.height=t.height))),this.dragger=r,this.renderDragger())},getData:function(e){var t=this.dragger,i=this.image,n={};return this.built&&(n={x:t.left-i.left,y:t.top-i.top,width:t.width,height:t.height},n=this.transformData(n,r,e)),n},transformData:function(t,i,n){var r=this.image.ratio,a={};return e.each(t,function(e,t){t=q(t),p.test(e)&&!isNaN(t)&&(a[e]=i?n?Math.round(t/r):t/r:t*r)}),a},setAspectRatio:function(e){var t="auto"===e;e=q(e),(t||!isNaN(e)&&e>0)&&(this.defaults.aspectRatio=t?s:e,this.built&&(this.initDragger(),this.renderDragger()))},getImageData:function(){var t={};return this.ready&&e.each(this.image,function(e,i){f.test(e)&&(t[e]=i)}),t},getDataURL:function(t,i,n){var r,a=e("")[0],o=this.getData(),s="";return e.isPlainObject(t)||(n=i,i=t,t={}),t=e.extend({width:o.width,height:o.height},t),this.cropped&&this.support.canvas&&(a.width=t.width,a.height=t.height,r=a.getContext("2d"),"image/jpeg"===i&&(r.fillStyle="#fff",r.fillRect(0,0,t.width,t.height)),r.drawImage(this.$clone[0],o.x,o.y,o.width,o.height,0,0,t.width,t.height),s=a.toDataURL(i,n)),s},setDragMode:function(e){var t=this.$canvas,i=this.defaults,n=a,o=a;if(this.built&&!this.disabled){switch(e){case"crop":i.dragCrop&&(n=r,t.data(c,e));break;case"move":o=r,t.data(c,e);break;default:t.removeData(c)}t.toggleClass(b,n).toggleClass(y,o)}},enable:function(){this.built&&(this.disabled=a,this.$cropper.removeClass(w))},disable:function(){this.built&&(this.disabled=r,this.$cropper.addClass(w))},rotate:function(e){var t=this.image;e=q(e)||0,this.built&&0!==e&&!this.disabled&&this.defaults.rotatable&&this.support.canvas&&(this.rotated=r,e=t.rotate=(t.rotate+e)%360,this.replace(this.getRotatedDataURL(e),!0))},getRotatedDataURL:function(t){var i=e("")[0],n=i.getContext("2d"),r=t*Math.PI/180,a=H(t)%180,o=a>90?180-a:a,s=o*Math.PI/180,l=this.originalImage,u=l.naturalWidth,c=l.naturalHeight,d=H(u*z(s)+c*B(s)),h=H(u*B(s)+c*z(s));return i.width=d,i.height=h,n.save(),n.translate(d/2,h/2),n.rotate(r),n.drawImage(this.$original[0],-u/2,-c/2,u,c),n.restore(),i.toDataURL()},zoom:function(e){var t,i,n,r=this.image;e=q(e),this.built&&e&&!this.disabled&&this.defaults.zoomable&&(t=r.width*(1+e),i=r.height*(1+e),n=t/r._width,n>10||(n<1&&(t=r._width,i=r._height),n<=1?this.setDragMode("crop"):this.setDragMode("move"),r.oldWidth=r.width,r.oldHeight=r.height,r.width=t,r.height=i,r.ratio=r.width/r.naturalWidth,this.renderImage("zoom")))},dblclick:function(){this.disabled||(this.$canvas.hasClass(b)?this.setDragMode("move"):this.setDragMode("crop"))},wheel:function(e){var t,i=e.originalEvent,n=117.25,r=5,a=166.66665649414062,o=.1;this.disabled||(e.preventDefault(),i.deltaY?(t=i.deltaY,t=t%r===0?t/r:t%n===0?t/n:t/a):t=i.wheelDelta?-i.wheelDelta/120:i.detail?i.detail/3:0,this.zoom(t*o))},dragstart:function(t){var i,n,o,s=t.originalEvent.touches,l=t;if(!this.disabled){if(s){if(o=s.length,o>1){if(!this.defaults.zoomable||2!==o)return;l=s[1],this.startX2=l.pageX,this.startY2=l.pageY,i="zoom"}l=s[0]}if(i=i||e(l.target).data(c),h.test(i)){if(t.preventDefault(),n=e.Event(T),this.$element.trigger(n),n.isDefaultPrevented())return;this.directive=i,this.cropping=a,this.startX=l.pageX,this.startY=l.pageY,"crop"===i&&(this.cropping=r,this.$canvas.addClass(m))}}},dragmove:function(t){var i,n,r=t.originalEvent.touches,a=t;if(!this.disabled){if(r){if(n=r.length,n>1){if(!this.defaults.zoomable||2!==n)return;a=r[1],this.endX2=a.pageX,this.endY2=a.pageY}a=r[0]}if(this.directive){if(t.preventDefault(),i=e.Event(Q),this.$element.trigger(i),i.isDefaultPrevented())return;this.endX=a.pageX,this.endY=a.pageY,this.dragging()}}},dragend:function(t){var i;if(!this.disabled&&this.directive){if(t.preventDefault(),i=e.Event(O),this.$element.trigger(i),i.isDefaultPrevented())return;this.cropping&&(this.cropping=a,this.$canvas.toggleClass(m,this.cropped&&this.defaults.modal)),this.directive=""}},dragging:function(){var e,t=this.directive,i=this.image,n=this.cropper,o=n.width,s=n.height,l=this.dragger,u=l.width,c=l.height,d=l.left,h=l.top,p=d+u,f=h+c,m=r,v=this.defaults,y=v.aspectRatio,b={x:this.endX-this.startX,y:this.endY-this.startY};switch(y&&(b.X=b.y*y,b.Y=b.x/y),t){case"all":d+=b.x,h+=b.y;break;case"e":if(b.x>=0&&(p>=o||y&&(h<=0||f>=s))){m=a;break}u+=b.x,y&&(c=u/y,h-=b.Y/2),u<0&&(t="w",u=0);break;case"n":if(b.y<=0&&(h<=0||y&&(d<=0||p>=o))){m=a;break}c-=b.y,h+=b.y,y&&(u=c*y,d+=b.X/2),c<0&&(t="s",c=0);break;case"w":if(b.x<=0&&(d<=0||y&&(h<=0||f>=s))){m=a;break}u-=b.x,d+=b.x,y&&(c=u/y,h+=b.Y/2),u<0&&(t="e",u=0);break;case"s":if(b.y>=0&&(f>=s||y&&(d<=0||p>=o))){m=a;break}c+=b.y,y&&(u=c*y,d-=b.X/2),c<0&&(t="n",c=0);break;case"ne":if(y){if(b.y<=0&&(h<=0||p>=o)){m=a;break}c-=b.y,h+=b.y,u=c*y}else b.x>=0?p0&&(c-=b.y,h+=b.y):(c-=b.y,h+=b.y);c<0&&(t="sw",c=0,u=0);break;case"nw":if(y){if(b.y<=0&&(h<=0||d<=0)){m=a;break}c-=b.y,h+=b.y,u=c*y,d+=b.X}else b.x<=0?d>0?(u-=b.x,d+=b.x):b.y<=0&&h<=0&&(m=a):(u-=b.x,d+=b.x),b.y<=0?h>0&&(c-=b.y,h+=b.y):(c-=b.y,h+=b.y);c<0&&(t="se",c=0,u=0);break;case"sw":if(y){if(b.x<=0&&(d<=0||f>=s)){m=a;break}u-=b.x,d+=b.x,c=u/y}else b.x<=0?d>0?(u-=b.x,d+=b.x):b.y>=0&&f>=s&&(m=a):(u-=b.x,d+=b.x),b.y>=0?f=0&&(p>=o||f>=s)){m=a;break}u+=b.x,c=u/y}else b.x>=0?p=0&&f>=s&&(m=a):u+=b.x,b.y>=0?f0?b.y>0?t="se":(t="ne",h-=c):b.y>0?(t="sw",d-=u):(t="nw",d-=u,h-=c),this.cropped||(this.cropped=r,this.$dragger.removeClass(g)))}m&&(l.width=u,l.height=c,l.left=d,l.top=h,this.directive=t,this.renderDragger()),this.startX=this.endX,this.startY=this.endY}},I.TEMPLATE=function(e,t){return t=t.split(","),e.replace(/\d+/g,function(e){return t[e]})}('<0 6="5-container"><0 6="5-canvas"><0 6="5-dragger"><1 6="5-viewer"><1 6="5-8 8-h"><1 6="5-8 8-v"><1 6="5-face" 3-2="all"><1 6="5-7 7-e" 3-2="e"><1 6="5-7 7-n" 3-2="n"><1 6="5-7 7-w" 3-2="w"><1 6="5-7 7-s" 3-2="s"><1 6="5-4 4-e" 3-2="e"><1 6="5-4 4-n" 3-2="n"><1 6="5-4 4-w" 3-2="w"><1 6="5-4 4-s" 3-2="s"><1 6="5-4 4-ne" 3-2="ne"><1 6="5-4 4-nw" 3-2="nw"><1 6="5-4 4-sw" 3-2="sw"><1 6="5-4 4-se" 3-2="se">',"div,span,directive,data,point,cropper,class,line,dashed"),I.DEFAULTS={aspectRatio:"auto",autoCropArea:.8,data:{},done:e.noop,preview:"",multiple:a,autoCrop:r,dragCrop:r,dashed:r,modal:r,movable:r,resizable:r,zoomable:r,rotatable:r,checkImageOrigin:r,minWidth:0,minHeight:0,maxWidth:l,maxHeight:l,build:o,built:o,dragstart:o,dragmove:o,dragend:o},I.setDefaults=function(t){e.extend(I.DEFAULTS,t)},I.other=e.fn.cropper,e.fn.cropper=function(t){var i,n=M(arguments,1);return this.each(function(){var r,a=e(this),o=a.data("cropper");o||a.data("cropper",o=new I(this,t)),"string"==typeof t&&e.isFunction(r=o[t])&&(i=r.apply(o,n))}),typeof i!==u?i:this},e.fn.cropper.Constructor=I,e.fn.cropper.setDefaults=I.setDefaults,e.fn.cropper.noConflict=function(){return e.fn.cropper=I.other,this}}),function(e){function t(e,t){return"function"==typeof e?e.call(t):e}function i(e){for(;e=e.parentNode;)if(e==document)return!0;return!1}function n(t,i){this.$element=e(t),this.options=i,this.enabled=!0,this.fixTitle()}n.prototype={show:function(){var i=this.getTitle();if(i&&this.enabled){var n=this.tip();n.find(".tipsy-inner")[this.options.html?"html":"text"](i),n[0].className="tipsy",n.remove().css({top:0,left:0,visibility:"hidden",display:"block"}).prependTo(document.body);var r,a=e.extend({},this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight}),o=n[0].offsetWidth,s=n[0].offsetHeight,l=t(this.options.gravity,this.$element[0]);switch(l.charAt(0)){case"n":r={top:a.top+a.height+this.options.offset,left:a.left+a.width/2-o/2};break;case"s":r={top:a.top-s-this.options.offset,left:a.left+a.width/2-o/2};break;case"e":r={top:a.top+a.height/2-s/2,left:a.left-o-this.options.offset};break;case"w":extra_gap=0,e("body").css("position").length>0&&"relative"==e("body").css("position")&&e("#wpadminbar").length&&(extra_gap=e("#wpadminbar").height()),r={top:a.top+a.height/2-s/2-extra_gap,left:a.left+a.width+this.options.offset}}2==l.length&&("w"==l.charAt(1)?r.left=a.left+a.width/2-15:r.left=a.left+a.width/2-o+15),n.css(r).addClass("tipsy-"+l),n.find(".tipsy-arrow")[0].className="tipsy-arrow tipsy-arrow-"+l.charAt(0),this.options.className&&n.addClass(t(this.options.className,this.$element[0])),this.options.fade?n.stop().css({opacity:0,display:"block",visibility:"visible"}).animate({opacity:this.options.opacity}):n.css({visibility:"visible",opacity:this.options.opacity})}},hide:function(){this.options.fade?this.tip().stop().fadeOut(function(){e(this).remove()}):this.tip().remove()},fixTitle:function(){var e=this.$element;(e.attr("title")||"string"!=typeof e.attr("original-title"))&&e.attr("original-title",e.attr("title")||"").removeAttr("title")},getTitle:function(){var e,t=this.$element,i=this.options;this.fixTitle();var e,i=this.options;return"string"==typeof i.title?e=t.attr("title"==i.title?"original-title":i.title):"function"==typeof i.title&&(e=i.title.call(t[0])),e=(""+e).replace(/(^\s*|\s*$)/,""),e||i.fallback},tip:function(){return this.$tip||(this.$tip=e('
            ').html('
            '),this.$tip.data("tipsy-pointee",this.$element[0])),this.$tip},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled}},e.fn.tipsy=function(t){function i(i){var r=e.data(i,"tipsy");return r||(r=new n(i,e.fn.tipsy.elementOptions(i,t)),e.data(i,"tipsy",r)),r}function r(){var e=i(this);e.hoverState="in",0==t.delayIn?e.show():(e.fixTitle(),setTimeout(function(){"in"==e.hoverState&&e.show()},t.delayIn))}function a(){var e=i(this);e.hoverState="out",0==t.delayOut?e.hide():setTimeout(function(){"out"==e.hoverState&&e.hide()},t.delayOut)}if(t===!0)return this.data("tipsy");if("string"==typeof t){var o=this.data("tipsy");return o&&o[t](),this}if(t=e.extend({},e.fn.tipsy.defaults,t),t.live||this.each(function(){i(this)}),"manual"!=t.trigger){var s="hover"==t.trigger?"mouseenter":"focus",l="hover"==t.trigger?"mouseleave":"blur";t.live?e(document).on(s,this.selector,r).on(l,this.selector,a):this.bind(s,r).bind(l,a)}return this},e.fn.tipsy.defaults={className:null,delayIn:0,delayOut:0,fade:!1,fallback:"",gravity:"n",html:!1,live:!1,offset:0,opacity:.8,title:"title",trigger:"hover"},e.fn.tipsy.revalidate=function(){e(".tipsy").each(function(){var t=e.data(this,"tipsy-pointee");t&&i(t)||e(this).remove()})},e.fn.tipsy.elementOptions=function(t,i){return e.metadata?e.extend({},i,e(t).metadata()):i},e.fn.tipsy.autoNS=function(){return e(this).offset().top>e(document).scrollTop()+e(window).height()/2?"s":"n"},e.fn.tipsy.autoWE=function(){return e(this).offset().left>e(document).scrollLeft()+e(window).width()/2?"e":"w"},e.fn.tipsy.autoBounds=function(t,i){return function(){var n={ns:i[0],ew:i.length>1&&i[1]},r=e(document).scrollTop()+t,a=e(document).scrollLeft()+t,o=e(this);return o.offset().top0&&e.find(".um-field-group-body").length==t&&jQuery(this).addClass("disabled")}),jQuery(document).on("click",".um-field-group-cancel",function(e){e.preventDefault();var t=jQuery(this).parents(".um-field-group"),i=t.data("max_entries");return t.find(".um-field-group-body").length>1?jQuery(this).parents(".um-field-group-body").remove():jQuery(this).parents(".um-field-group-body").hide(),i>0&&t.find(".um-field-group-body").length
            '),jQuery(".um-dropdown").hide(),um_responsive(),user_id=jQuery(this).attr("data-user_id"),metakey="cover_photo",jQuery.ajax({url:um_scripts.ajaxurl,type:"post",data:{action:"ultimatemember_delete_cover_photo",metakey:metakey,user_id:user_id}})}),e(),jQuery("textarea[id=um-meta-bio]").change(e),jQuery("textarea[id=um-meta-bio]").keyup(e),jQuery(".um-profile-edit a.um_delete-item").click(function(e){e.preventDefault();var t=confirm("Are you sure that you want to delete this user?");if(!t)return!1})}),jQuery(document).ready(function(){var e=jQuery(".um-account-main").attr("data-current_tab");e&&jQuery(".um-account-tab[data-tab="+e+"]").show(),jQuery(document).on("touchstart click",".um-account-side li a",function(e){e.preventDefault();var t=jQuery(this);t.parents("ul").find("li a").removeClass("current"),t.addClass("current");var i=jQuery(this).attr("href"),n=jQuery(this).attr("data-tab");return jQuery("input[id=_um_account_tab]:hidden").val(n),window.history.pushState("","",i),jQuery(".um-account-tab").hide(),jQuery(".um-account-tab[data-tab="+n+"]").fadeIn(),jQuery(".um-account-nav a").removeClass("current"),jQuery(".um-account-nav a[data-tab="+n+"]").addClass("current"),!1})}),jQuery(document).on("touchstart click",".um-account-nav a",function(e){e.preventDefault();var t=jQuery(this).attr("data-tab"),i=jQuery(this).parents("div"),n=jQuery(this);return jQuery("input[id=_um_account_tab]:hidden").val(t),jQuery(".um-account-tab").hide(),n.hasClass("current")?(i.next(".um-account-tab").slideUp(),n.removeClass("current")):(i.next(".um-account-tab").slideDown(),n.parents("div").find("a").removeClass("current"),n.addClass("current")),jQuery(".um-account-side li a").removeClass("current"),jQuery(".um-account-side li a[data-tab="+t+"]").addClass("current"),!1}); \ No newline at end of file diff --git a/core/lib/mobiledetect/Mobile_Detect.php b/core/lib/mobiledetect/Mobile_Detect.php deleted file mode 100644 index 2be18a7f..00000000 --- a/core/lib/mobiledetect/Mobile_Detect.php +++ /dev/null @@ -1,1320 +0,0 @@ - array('matches' => array( - // Opera Mini; @reference: http://dev.opera.com/articles/view/opera-binary-markup-language/ - 'application/x-obml2d', - // BlackBerry devices. - 'application/vnd.rim.html', - 'text/vnd.wap.wml', - 'application/vnd.wap.xhtml+xml' - )), - 'HTTP_X_WAP_PROFILE' => null, - 'HTTP_X_WAP_CLIENTID' => null, - 'HTTP_WAP_CONNECTION' => null, - 'HTTP_PROFILE' => null, - // Reported by Opera on Nokia devices (eg. C3). - 'HTTP_X_OPERAMINI_PHONE_UA' => null, - 'HTTP_X_NOKIA_GATEWAY_ID' => null, - 'HTTP_X_ORANGE_ID' => null, - 'HTTP_X_VODAFONE_3GPDPCONTEXT' => null, - 'HTTP_X_HUAWEI_USERID' => null, - // Reported by Windows Smartphones. - 'HTTP_UA_OS' => null, - // Reported by Verizon, Vodafone proxy system. - 'HTTP_X_MOBILE_GATEWAY' => null, - // Seen this on HTC Sensation. SensationXE_Beats_Z715e. - 'HTTP_X_ATT_DEVICEID' => null, - // Seen this on a HTC. - 'HTTP_UA_CPU' => array('matches' => array('ARM')), - ); - - /** - * List of mobile devices (phones). - * - * @var array - */ - protected static $phoneDevices = array( - 'iPhone' => '\biPhone\b|\biPod\b', // |\biTunes - 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+', - 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m', - 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6', - // @todo: Is 'Dell Streak' a tablet or a phone? ;) - 'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b', - 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925', - 'Samsung' => 'Samsung|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750', - 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)', - 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533', - 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile', - // http://www.micromaxinfo.com/mobiles/smartphones - // Added because the codes might conflict with Acer Tablets. - 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b', - // @todo Complete the regex. - 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; - 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;) - // http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH) - // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android. - 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790', - // http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones. - 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250', - 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)', - // Added simvalley mobile just for fun. They have some interesting devices. - // http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html - 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b', - // Wolfgang - a brand that is sold by Aldi supermarkets. - // http://www.wolfgangmobile.com/ - 'Wolfgang' => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q', - 'Alcatel' => 'Alcatel', - 'Nintendo' => 'Nintendo 3DS', - // http://en.wikipedia.org/wiki/Amoi - 'Amoi' => 'Amoi', - // http://en.wikipedia.org/wiki/INQ - 'INQ' => 'INQ', - // @Tapatalk is a mobile app; http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039 - 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser', - ); - - /** - * List of tablet devices. - * - * @var array - */ - protected static $tabletDevices = array( - 'iPad' => 'iPad|iPad.*Mobile', // @todo: check for mobile friendly emails topic. - 'NexusTablet' => 'Android.*Nexus[\s]+(7|9|10)|^.*Android.*Nexus(?:(?!Mobile).)*$', - 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-I9205|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T707A|SM-T807A|SM-T237P|SM-T807P|SM-P607T|SM-T217T|SM-T337T', // SCH-P709|SCH-P729|SM-T2558 - Samsung Mega - treat them like a regular phone. - // http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html - 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI)\b', - // Only the Surface tablets with Windows RT are considered mobile. - // http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx - 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)', - // http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT - 'HPTablet' => 'HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10', - // Watch out for PadFone, see #132. - // http://www.asus.com/de/Tablets_Mobile/Memo_Pad_Products/ - 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG', - 'BlackBerryTablet' => 'PlayBook|RIM Tablet', - 'HTCtablet' => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410', - 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617', - 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2', - // http://www.acer.ro/ac/ro/RO/content/drivers - // http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer) - // http://us.acer.com/ac/en/US/content/group/tablets - // http://www.acer.de/ac/de/DE/content/models/tablets/ - // Can conflict with Micromax and Motorola phones codes. - 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b', - // http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/ - // http://us.toshiba.com/tablets/tablet-finder - // http://www.toshiba.co.jp/regza/tablet/ - 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO', - // http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html - // http://www.lg.com/us/tablets - 'LGTablet' => '\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b', - 'FujitsuTablet' => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b', - // Prestigio Tablets http://www.prestigio.com/support - 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD', - // http://support.lenovo.com/en_GB/downloads/default.page?# - 'LenovoTablet' => 'Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)', - // http://www.dell.com/support/home/us/en/04/Products/tab_mob/tablets - 'DellTablet' => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7', - // http://www.yarvik.com/en/matrix/tablets/ - 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b', - 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB', - 'ArnovaTablet' => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2', - // http://www.intenso.de/kategorie_en.php?kategorie=33 - // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate - 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004', - // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/ - 'IRUTablet' => 'M702pro', - 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b', - // http://www.e-boda.ro/tablete-pc.html - 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)', - // http://www.allview.ro/produse/droseries/lista-tablete-pc/ - 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)', - // http://wiki.archosfans.com/index.php?title=Main_Page - 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b', - // http://www.ainol.com/plugin.php?identifier=ainol&module=product - 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark', - // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER - // Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser - // http://www.sony.jp/support/tablet/ - 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551', - // http://www.support.philips.com/support/catalog/worldproducts.jsp?userLanguage=en&userCountry=cn&categoryid=3G_LTE_TABLET_SU_CN_CARE&title=3G%20tablets%20/%20LTE%20range&_dyncharset=UTF-8 - 'PhilipsTablet' => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b', - // db + http://www.cube-tablet.com/buy-products.html - 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT', - // http://www.cobyusa.com/?p=pcat&pcat_id=3001 - 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010', - // http://www.match.net.cn/products.asp - 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733', - // http://www.msi.com/support - // @todo Research the Windows Tablets. - 'MSITablet' => 'MSI \b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\b', - // @todo http://www.kyoceramobile.com/support/drivers/ - // 'KyoceraTablet' => null, - // @todo http://intexuae.com/index.php/category/mobile-devices/tablets-products/ - // 'IntextTablet' => null, - // http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets) - // http://www.imp3.net/14/show.php?itemid=20454 - 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)', - // http://www.rock-chips.com/index.php?do=prod&pid=2 - 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A', - // http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/ - 'FlyTablet' => 'IQ310|Fly Vision', - // http://www.bqreaders.com/gb/tablets-prices-sale.html - 'bqTablet' => 'bq.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant)|Maxwell.*Lite|Maxwell.*Plus', - // http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290 - // http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets) - 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim', - // Nec or Medias Tab - 'NecTablet' => '\bN-06D|\bN-08D', - // Pantech Tablets: http://www.pantechusa.com/phones/ - 'PantechTablet' => 'Pantech.*P4100', - // Broncho Tablets: http://www.broncho.cn/ (hard to find) - 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)', - // http://versusuk.com/support.html - 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b', - // http://www.zync.in/index.php/our-products/tablet-phablets - 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900', - // http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/ - 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA', - // https://www.nabitablet.com/ - 'NabiTablet' => 'Android.*\bNabi', - 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build', - // French Danew Tablets http://www.danew.com/produits-tablette.php - 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b', - // Texet Tablets and Readers http://www.texet.ru/tablet/ - 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE', - // Avoid detecting 'PLAYSTATION 3' as mobile. - 'PlaystationTablet' => 'Playstation.*(Portable|Vita)', - // http://www.trekstor.de/surftabs.html - 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab', - // http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets - 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b', - // http://www.advandigital.com/index.php?link=content-product&jns=JP001 - // because of the short codenames we have to include whitespaces to reduce the possible conflicts. - 'AdvanTablet' => 'Android.* \b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\b ', - // http://www.danytech.com/category/tablet-pc - 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1', - // http://www.galapad.net/product.html - 'GalapadTablet' => 'Android.*\bG1\b', - // http://www.micromaxinfo.com/tablet/funbook - 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b', - // http://www.karbonnmobiles.com/products_tablet.php - 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b', - // http://www.myallfine.com/Products.asp - 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide', - // http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr= - 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b', - // http://www.yonesnav.com/products/products.php - 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026', - // http://www.cjshowroom.com/eproducts.aspx?classcode=004001001 - // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html) - 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503', - // http://www.gloryunion.cn/products.asp - // http://www.allwinnertech.com/en/apply/mobile.html - // http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB) - // @todo: Softwiner tablets? - // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions. - 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G - // http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118 - 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10', - // http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/ - // @todo: add more tests. - 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)', - // http://hclmetablet.com/India/index.php - 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync', - // http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html - 'DPSTablet' => 'DPS Dream 9|DPS Dual 7', - // http://www.visture.com/index.asp - 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10', - // http://www.mijncresta.nl/tablet - 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989', - // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309 - 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b', - // Concorde tab - 'ConcordeTablet' => 'Concorde([ ]+)?Tab|ConCorde ReadMan', - // GoClever Tablets - http://www.goclever.com/uk/products,c1/tablet,c5/ - 'GoCleverTablet' => 'GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042', - // Modecom Tablets - http://www.modecom.eu/tablets/portal/ - 'ModecomTablet' => 'FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003', - // Vonino Tablets - http://www.vonino.eu/tablets - 'VoninoTablet' => '\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\bQ8\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\b', - // ECS Tablets - http://www.ecs.com.tw/ECSWebSite/Product/Product_Tablet_List.aspx?CategoryID=14&MenuID=107&childid=M_107&LanID=0 - 'ECSTablet' => 'V07OT2|TM105A|S10OT1|TR10CS1', - // Storex Tablets - http://storex.fr/espace_client/support.html - // @note: no need to add all the tablet codes since they are guided by the first regex. - 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab', - // Generic Vodafone tablets. - 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7', - // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb - // Aka: http://www.essentielb.fr/ - 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2', - // Ross & Moor - http://ross-moor.ru/ - 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711', - // i-mobile http://product.i-mobilephone.com/Mobile_Device - 'iMobileTablet' => 'i-mobile i-note', - // http://www.tolino.de/de/vergleichen/ - 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine', - // AudioSonic - a Kmart brand - // http://www.kmart.com.au/webapp/wcs/stores/servlet/Search?langId=-1&storeId=10701&catalogId=10001&categoryId=193001&pageSize=72¤tPage=1&searchCategory=193001%2b4294965664&sortBy=p_MaxPrice%7c1 - 'AudioSonicTablet' => '\bC-22Q|T7-QC|T-17B|T-17P\b', - // AMPE Tablets - http://www.ampe.com.my/product-category/tablets/ - // @todo: add them gradually to avoid conflicts. - 'AMPETablet' => 'Android.* A78 ', - // Skk Mobile - http://skkmobile.com.ph/product_tablets.php - 'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)', - // Tecno Mobile (only tablet) - http://www.tecno-mobile.com/index.php/product?filterby=smart&list_order=all&page=1 - 'TecnoTablet' => 'TECNO P9', - // JXD (consoles & tablets) - http://jxd.hk/products.asp?selectclassid=009008&clsid=3 - 'JXDTablet' => 'Android.*\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b', - // i-Joy tablets - http://www.i-joy.es/en/cat/products/tablets/ - 'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)', - // http://www.intracon.eu/tablet - 'FX2Tablet' => 'FX2 PAD7|FX2 PAD10', - // http://www.xoro.de/produkte/ - // @note: Might be the same brand with 'Simply tablets' - 'XoroTablet' => 'KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151', - // http://www1.viewsonic.com/products/computing/tablets/ - 'ViewsonicTablet' => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a', - // http://www.odys.de/web/internet-tablet_en.html - 'OdysTablet' => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10', - // http://www.captiva-power.de/products.html#tablets-en - 'CaptivaTablet' => 'CAPTIVA PAD', - // IconBIT - http://www.iconbit.com/products/tablets/ - 'IconbitTablet' => 'NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S', - // http://www.teclast.com/topic.php?channelID=70&topicID=140&pid=63 - 'TeclastTablet' => 'T98 4G|\bP80\b|\bX90HD\b|X98 Air|X98 Air 3G|\bX89\b|P80 3G|\bX80h\b|P98 Air|\bX89HD\b|P98 3G|\bP90HD\b|P89 3G|X98 3G|\bP70h\b|P79HD 3G|G18d 3G|\bP79HD\b|\bP89s\b|\bA88\b|\bP10HD\b|\bP19HD\b|G18 3G|\bP78HD\b|\bA78\b|\bP75\b|G17s 3G|G17h 3G|\bP85t\b|\bP90\b|\bP11\b|\bP98t\b|\bP98HD\b|\bG18d\b|\bP85s\b|\bP11HD\b|\bP88s\b|\bA80HD\b|\bA80se\b|\bA10h\b|\bP89\b|\bP78s\b|\bG18\b|\bP85\b|\bA70h\b|\bA70\b|\bG17\b|\bP18\b|\bA80s\b|\bA11s\b|\bP88HD\b|\bA80h\b|\bP76s\b|\bP76h\b|\bP98\b|\bA10HD\b|\bP78\b|\bP88\b|\bA11\b|\bA10t\b|\bP76a\b|\bP76t\b|\bP76e\b|\bP85HD\b|\bP85a\b|\bP86\b|\bP75HD\b|\bP76v\b|\bA12\b|\bP75a\b|\bA15\b|\bP76Ti\b|\bP81HD\b|\bA10\b|\bT760VE\b|\bT720HD\b|\bP76\b|\bP73\b|\bP71\b|\bP72\b|\bT720SE\b|\bC520Ti\b|\bT760\b|\bT720VE\b|T720-3GE|T720-WiFi', - 'JaytechTablet' => 'TPC-PA762', - 'BlaupunktTablet' => 'Endeavour 800NG|Endeavour 1010', - // http://www.digma.ru/support/download/ - // @todo: Ebooks also (if requested) - 'DigmaTablet' => '\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b', - // http://www.evolioshop.com/ro/tablete-pc.html - // http://www.evolio.ro/support/downloads_static.html?cat=2 - // @todo: Research some more - 'EvolioTablet' => 'ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b', - // @todo http://www.lavamobiles.com/tablets-data-cards - 'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY', - // https://www.celkonmobiles.com/?_a=categoryphones&sid=2 - 'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b', - // http://www.mi.com/en - 'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b', - // http://www.nbru.cn/index.html - 'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One', - // http://navroad.com/products/produkty/tablety/ - 'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI', - // http://www.datawind.com/ubislate/ - 'UbislateTablet' => 'UbiSlate[\s]?7C', - // http://www.pocketbook-int.com/ru/support - 'PocketBookTablet' => 'Pocketbook', - // http://www.tesco.com/direct/hudl/ - 'Hudl' => 'Hudl HT7S3', - // http://www.telstra.com.au/home-phone/thub-2/ - 'TelstraTablet' => 'T-Hub2', - 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bJolla\b' - ); - - /** - * List of mobile Operating Systems. - * - * @var array - */ - protected static $operatingSystems = array( - 'AndroidOS' => 'Android', - 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os', - 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino', - 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b', - // @reference: http://en.wikipedia.org/wiki/Windows_Mobile - 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;', - // @reference: http://en.wikipedia.org/wiki/Windows_Phone - // http://wifeng.cn/?r=blog&a=view&id=106 - // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx - // http://msdn.microsoft.com/library/ms537503.aspx - 'WindowsPhoneOS' => 'Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;', - 'iOS' => '\biPhone.*Mobile|\biPod|\biPad', - // http://en.wikipedia.org/wiki/MeeGo - // @todo: research MeeGo in UAs - 'MeeGoOS' => 'MeeGo', - // http://en.wikipedia.org/wiki/Maemo - // @todo: research Maemo in UAs - 'MaemoOS' => 'Maemo', - 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135 - 'webOS' => 'webOS|hpwOS', - 'badaOS' => '\bBada\b', - 'BREWOS' => 'BREW', - ); - - /** - * List of mobile User Agents. - * - * @var array - */ - protected static $browsers = array( - // @reference: https://developers.google.com/chrome/mobile/docs/user-agent - 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?', - 'Dolfin' => '\bDolfin\b', - 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+', - 'Skyfire' => 'Skyfire', - 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+ - 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile', - 'Bolt' => 'bolt', - 'TeaShark' => 'teashark', - 'Blazer' => 'Blazer', - // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3 - 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari', - // http://en.wikipedia.org/wiki/Midori_(web_browser) - //'Midori' => 'midori', - 'Tizen' => 'Tizen', - 'UCBrowser' => 'UC.*Browser|UCWEB', - 'baiduboxapp' => 'baiduboxapp', - 'baidubrowser' => 'baidubrowser', - // https://github.com/serbanghita/Mobile-Detect/issues/7 - 'DiigoBrowser' => 'DiigoBrowser', - // http://www.puffinbrowser.com/index.php - 'Puffin' => 'Puffin', - // http://mercury-browser.com/index.html - 'Mercury' => '\bMercury\b', - // http://en.wikipedia.org/wiki/Obigo_Browser - 'ObigoBrowser' => 'Obigo', - // http://en.wikipedia.org/wiki/NetFront - 'NetFront' => 'NF-Browser', - // @reference: http://en.wikipedia.org/wiki/Minimo - // http://en.wikipedia.org/wiki/Vision_Mobile_Browser - 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger', - ); - - /** - * Utilities. - * - * @var array - */ - protected static $utilities = array( - // Experimental. When a mobile device wants to switch to 'Desktop Mode'. - // http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/ - // https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011 - 'DesktopMode' => 'WPDesktop', - 'TV' => 'SonyDTV|HbbTV', // experimental - 'WebKit' => '(webkit)[ /]([\w.]+)', - 'Bot' => 'Googlebot|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|facebookexternalhit', - 'MobileBot' => 'Googlebot-Mobile|YahooSeeker/M1A1-R2D2', - // @todo: Include JXD consoles. - 'Console' => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\b', - 'Watch' => 'SM-V700', - ); - - /** - * All possible HTTP headers that represent the - * User-Agent string. - * - * @var array - */ - protected static $uaHttpHeaders = array( - // The default User-Agent string. - 'HTTP_USER_AGENT', - // Header can occur on devices using Opera Mini. - 'HTTP_X_OPERAMINI_PHONE_UA', - // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/ - 'HTTP_X_DEVICE_USER_AGENT', - 'HTTP_X_ORIGINAL_USER_AGENT', - 'HTTP_X_SKYFIRE_PHONE', - 'HTTP_X_BOLT_PHONE_UA', - 'HTTP_DEVICE_STOCK_UA', - 'HTTP_X_UCBROWSER_DEVICE_UA' - ); - - /** - * The individual segments that could exist in a User-Agent string. VER refers to the regular - * expression defined in the constant self::VER. - * - * @var array - */ - protected static $properties = array( - - // Build - 'Mobile' => 'Mobile/[VER]', - 'Build' => 'Build/[VER]', - 'Version' => 'Version/[VER]', - 'VendorID' => 'VendorID/[VER]', - - // Devices - 'iPad' => 'iPad.*CPU[a-z ]+[VER]', - 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]', - 'iPod' => 'iPod.*CPU[a-z ]+[VER]', - //'BlackBerry' => array('BlackBerry[VER]', 'BlackBerry [VER];'), - 'Kindle' => 'Kindle/[VER]', - - // Browser - 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'), - 'Coast' => array('Coast/[VER]'), - 'Dolfin' => 'Dolfin/[VER]', - // @reference: https://developer.mozilla.org/en-US/docs/User_Agent_Strings_Reference - 'Firefox' => 'Firefox/[VER]', - 'Fennec' => 'Fennec/[VER]', - // @reference: http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx - 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];'), - // http://en.wikipedia.org/wiki/NetFront - 'NetFront' => 'NetFront/[VER]', - 'NokiaBrowser' => 'NokiaBrowser/[VER]', - 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ), - 'Opera Mini' => 'Opera Mini/[VER]', - 'Opera Mobi' => 'Version/[VER]', - 'UC Browser' => 'UC Browser[VER]', - 'MQQBrowser' => 'MQQBrowser/[VER]', - 'MicroMessenger' => 'MicroMessenger/[VER]', - 'baiduboxapp' => 'baiduboxapp/[VER]', - 'baidubrowser' => 'baidubrowser/[VER]', - 'Iron' => 'Iron/[VER]', - // @note: Safari 7534.48.3 is actually Version 5.1. - // @note: On BlackBerry the Version is overwriten by the OS. - 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ), - 'Skyfire' => 'Skyfire/[VER]', - 'Tizen' => 'Tizen/[VER]', - 'Webkit' => 'webkit[ /][VER]', - - // Engine - 'Gecko' => 'Gecko/[VER]', - 'Trident' => 'Trident/[VER]', - 'Presto' => 'Presto/[VER]', - - // OS - 'iOS' => ' \bOS\b [VER] ', - 'Android' => 'Android [VER]', - 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'), - 'BREW' => 'BREW [VER]', - 'Java' => 'Java/[VER]', - // @reference: http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx - // @reference: http://en.wikipedia.org/wiki/Windows_NT#Releases - 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'), - 'Windows Phone' => 'Windows Phone [VER]', - 'Windows CE' => 'Windows CE/[VER]', - // http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd - 'Windows NT' => 'Windows NT [VER]', - 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'), - 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'), - ); - - /** - * Construct an instance of this class. - * - * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored. - * If left empty, will use the global _SERVER['HTTP_*'] vars instead. - * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT - * from the $headers array instead. - */ - public function __construct( - array $headers = null, - $userAgent = null - ) { - $this->setHttpHeaders($headers); - $this->setUserAgent($userAgent); - } - - /** - * Get the current script version. - * This is useful for the demo.php file, - * so people can check on what version they are testing - * for mobile devices. - * - * @return string The version number in semantic version format. - */ - public static function getScriptVersion() - { - return self::VERSION; - } - - /** - * Set the HTTP Headers. Must be PHP-flavored. This method will reset existing headers. - * - * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract - * the headers. The default null is left for backwards compatibilty. - */ - public function setHttpHeaders($httpHeaders = null) - { - //use global _SERVER if $httpHeaders aren't defined - if (!is_array($httpHeaders) || !count($httpHeaders)) { - $httpHeaders = $_SERVER; - } - - //clear existing headers - $this->httpHeaders = array(); - - //Only save HTTP headers. In PHP land, that means only _SERVER vars that - //start with HTTP_. - foreach ($httpHeaders as $key => $value) { - if (substr($key,0,5) == 'HTTP_') { - $this->httpHeaders[$key] = $value; - } - } - } - - /** - * Retrieves the HTTP headers. - * - * @return array - */ - public function getHttpHeaders() - { - return $this->httpHeaders; - } - - /** - * Retrieves a particular header. If it doesn't exist, no exception/error is caused. - * Simply null is returned. - * - * @param string $header The name of the header to retrieve. Can be HTTP compliant such as - * "User-Agent" or "X-Device-User-Agent" or can be php-esque with the - * all-caps, HTTP_ prefixed, underscore seperated awesomeness. - * - * @return string|null The value of the header. - */ - public function getHttpHeader($header) - { - //are we using PHP-flavored headers? - if (strpos($header, '_') === false) { - $header = str_replace('-', '_', $header); - $header = strtoupper($header); - } - - //test the alternate, too - $altHeader = 'HTTP_' . $header; - - //Test both the regular and the HTTP_ prefix - if (isset($this->httpHeaders[$header])) { - return $this->httpHeaders[$header]; - } elseif (isset($this->httpHeaders[$altHeader])) { - return $this->httpHeaders[$altHeader]; - } - - return null; - } - - public function getMobileHeaders() - { - return self::$mobileHeaders; - } - - /** - * Get all possible HTTP headers that - * can contain the User-Agent string. - * - * @return array List of HTTP headers. - */ - public function getUaHttpHeaders() - { - return self::$uaHttpHeaders; - } - - /** - * Set the User-Agent to be used. - * - * @param string $userAgent The user agent string to set. - * - * @return string|null - */ - public function setUserAgent($userAgent = null) - { - if (!empty($userAgent)) { - return $this->userAgent = $userAgent; - } else { - $this->userAgent = null; - foreach ($this->getUaHttpHeaders() as $altHeader) { - if (!empty($this->httpHeaders[$altHeader])) { // @todo: should use getHttpHeader(), but it would be slow. (Serban) - $this->userAgent .= $this->httpHeaders[$altHeader] . " "; - } - } - - return $this->userAgent = (!empty($this->userAgent) ? trim($this->userAgent) : null); - - } - } - - /** - * Retrieve the User-Agent. - * - * @return string|null The user agent if it's set. - */ - public function getUserAgent() - { - return $this->userAgent; - } - - /** - * Set the detection type. Must be one of self::DETECTION_TYPE_MOBILE or - * self::DETECTION_TYPE_EXTENDED. Otherwise, nothing is set. - * - * @deprecated since version 2.6.9 - * - * @param string $type The type. Must be a self::DETECTION_TYPE_* constant. The default - * parameter is null which will default to self::DETECTION_TYPE_MOBILE. - */ - public function setDetectionType($type = null) - { - if ($type === null) { - $type = self::DETECTION_TYPE_MOBILE; - } - - if ($type != self::DETECTION_TYPE_MOBILE && $type != self::DETECTION_TYPE_EXTENDED) { - return; - } - - $this->detectionType = $type; - } - - public function getMatchingRegex() - { - return $this->matchingRegex; - } - - public function getMatchesArray() - { - return $this->matchesArray; - } - - /** - * Retrieve the list of known phone devices. - * - * @return array List of phone devices. - */ - public static function getPhoneDevices() - { - return self::$phoneDevices; - } - - /** - * Retrieve the list of known tablet devices. - * - * @return array List of tablet devices. - */ - public static function getTabletDevices() - { - return self::$tabletDevices; - } - - /** - * Alias for getBrowsers() method. - * - * @return array List of user agents. - */ - public static function getUserAgents() - { - return self::getBrowsers(); - } - - /** - * Retrieve the list of known browsers. Specifically, the user agents. - * - * @return array List of browsers / user agents. - */ - public static function getBrowsers() - { - return self::$browsers; - } - - /** - * Retrieve the list of known utilities. - * - * @return array List of utilities. - */ - public static function getUtilities() - { - return self::$utilities; - } - - /** - * Method gets the mobile detection rules. This method is used for the magic methods $detect->is*(). - * - * @deprecated since version 2.6.9 - * - * @return array All the rules (but not extended). - */ - public static function getMobileDetectionRules() - { - static $rules; - - if (!$rules) { - $rules = array_merge( - self::$phoneDevices, - self::$tabletDevices, - self::$operatingSystems, - self::$browsers - ); - } - - return $rules; - - } - - /** - * Method gets the mobile detection rules + utilities. - * The reason this is separate is because utilities rules - * don't necessary imply mobile. This method is used inside - * the new $detect->is('stuff') method. - * - * @deprecated since version 2.6.9 - * - * @return array All the rules + extended. - */ - public function getMobileDetectionRulesExtended() - { - static $rules; - - if (!$rules) { - // Merge all rules together. - $rules = array_merge( - self::$phoneDevices, - self::$tabletDevices, - self::$operatingSystems, - self::$browsers, - self::$utilities - ); - } - - return $rules; - } - - /** - * Retrieve the current set of rules. - * - * @deprecated since version 2.6.9 - * - * @return array - */ - public function getRules() - { - if ($this->detectionType == self::DETECTION_TYPE_EXTENDED) { - return self::getMobileDetectionRulesExtended(); - } else { - return self::getMobileDetectionRules(); - } - } - - /** - * Retrieve the list of mobile operating systems. - * - * @return array The list of mobile operating systems. - */ - public static function getOperatingSystems() - { - return self::$operatingSystems; - } - - /** - * Check the HTTP headers for signs of mobile. - * This is the fastest mobile check possible; it's used - * inside isMobile() method. - * - * @return bool - */ - public function checkHttpHeadersForMobile() - { - - foreach ($this->getMobileHeaders() as $mobileHeader => $matchType) { - if ( isset($this->httpHeaders[$mobileHeader]) ) { - if ( is_array($matchType['matches']) ) { - foreach ($matchType['matches'] as $_match) { - if ( strpos($this->httpHeaders[$mobileHeader], $_match) !== false ) { - return true; - } - } - - return false; - } else { - return true; - } - } - } - - return false; - - } - - /** - * Magic overloading method. - * - * @method boolean is[...]() - * @param string $name - * @param array $arguments - * @return mixed - * @throws BadMethodCallException when the method doesn't exist and doesn't start with 'is' - */ - public function __call($name, $arguments) - { - //make sure the name starts with 'is', otherwise - if (substr($name, 0, 2) != 'is') { - throw new BadMethodCallException("No such method exists: $name"); - } - - $this->setDetectionType(self::DETECTION_TYPE_MOBILE); - - $key = substr($name, 2); - - return $this->matchUAAgainstKey($key); - } - - /** - * Find a detection rule that matches the current User-agent. - * - * @param null $userAgent deprecated - * @return boolean - */ - protected function matchDetectionRulesAgainstUA($userAgent = null) - { - // Begin general search. - foreach ($this->getRules() as $_regex) { - if (empty($_regex)) { - continue; - } - if ($this->match($_regex, $userAgent)) { - return true; - } - } - - return false; - } - - /** - * Search for a certain key in the rules array. - * If the key is found the try to match the corresponding - * regex agains the User-Agent. - * - * @param string $key - * @param null $userAgent deprecated - * @return mixed - */ - protected function matchUAAgainstKey($key, $userAgent = null) - { - // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc. - $key = strtolower($key); - - //change the keys to lower case - $_rules = array_change_key_case($this->getRules()); - - if (array_key_exists($key, $_rules)) { - if (empty($_rules[$key])) { - return null; - } - - return $this->match($_rules[$key], $userAgent); - } - - return false; - } - - /** - * Check if the device is mobile. - * Returns true if any type of mobile device detected, including special ones - * @param null $userAgent deprecated - * @param null $httpHeaders deprecated - * @return bool - */ - public function isMobile($userAgent = null, $httpHeaders = null) - { - - if ($httpHeaders) { - $this->setHttpHeaders($httpHeaders); - } - - if ($userAgent) { - $this->setUserAgent($userAgent); - } - - $this->setDetectionType(self::DETECTION_TYPE_MOBILE); - - if ($this->checkHttpHeadersForMobile()) { - return true; - } else { - return $this->matchDetectionRulesAgainstUA(); - } - - } - - /** - * Check if the device is a tablet. - * Return true if any type of tablet device is detected. - * - * @param string $userAgent deprecated - * @param array $httpHeaders deprecated - * @return bool - */ - public function isTablet($userAgent = null, $httpHeaders = null) - { - $this->setDetectionType(self::DETECTION_TYPE_MOBILE); - - foreach (self::$tabletDevices as $_regex) { - if ($this->match($_regex, $userAgent)) { - return true; - } - } - - return false; - } - - /** - * This method checks for a certain property in the - * userAgent. - * @todo: The httpHeaders part is not yet used. - * - * @param string $key - * @param string $userAgent deprecated - * @param string $httpHeaders deprecated - * @return bool|int|null - */ - public function is($key, $userAgent = null, $httpHeaders = null) - { - // Set the UA and HTTP headers only if needed (eg. batch mode). - if ($httpHeaders) { - $this->setHttpHeaders($httpHeaders); - } - - if ($userAgent) { - $this->setUserAgent($userAgent); - } - - $this->setDetectionType(self::DETECTION_TYPE_EXTENDED); - - return $this->matchUAAgainstKey($key); - } - - /** - * Some detection rules are relative (not standard), - * because of the diversity of devices, vendors and - * their conventions in representing the User-Agent or - * the HTTP headers. - * - * This method will be used to check custom regexes against - * the User-Agent string. - * - * @param $regex - * @param string $userAgent - * @return bool - * - * @todo: search in the HTTP headers too. - */ - public function match($regex, $userAgent = null) - { - // Escape the special character which is the delimiter. - $regex = str_replace('/', '\/', $regex); - $match = (bool) preg_match('/'.$regex.'/is', (!empty($userAgent) ? $userAgent : $this->userAgent), $matches); - // If positive match is found, store the results for debug. - if ($match) { - $this->matchingRegex = $regex; - $this->matchesArray = $matches; - } - - return $match; - } - - /** - * Get the properties array. - * - * @return array - */ - public static function getProperties() - { - return self::$properties; - } - - /** - * Prepare the version number. - * - * @todo Remove the error supression from str_replace() call. - * - * @param string $ver The string version, like "2.6.21.2152"; - * - * @return float - */ - public function prepareVersionNo($ver) - { - $ver = str_replace(array('_', ' ', '/'), '.', $ver); - $arrVer = explode('.', $ver, 2); - - if (isset($arrVer[1])) { - $arrVer[1] = @str_replace('.', '', $arrVer[1]); // @todo: treat strings versions. - } - - return (float) implode('.', $arrVer); - } - - /** - * Check the version of the given property in the User-Agent. - * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31) - * - * @param string $propertyName The name of the property. See self::getProperties() array - * keys for all possible properties. - * @param string $type Either self::VERSION_TYPE_STRING to get a string value or - * self::VERSION_TYPE_FLOAT indicating a float value. This parameter - * is optional and defaults to self::VERSION_TYPE_STRING. Passing an - * invalid parameter will default to the this type as well. - * - * @return string|float The version of the property we are trying to extract. - */ - public function version($propertyName, $type = self::VERSION_TYPE_STRING) - { - if (empty($propertyName)) { - return false; - } - - //set the $type to the default if we don't recognize the type - if ($type != self::VERSION_TYPE_STRING && $type != self::VERSION_TYPE_FLOAT) { - $type = self::VERSION_TYPE_STRING; - } - - $properties = self::getProperties(); - - // Check if the property exists in the properties array. - if (array_key_exists($propertyName, $properties)) { - - // Prepare the pattern to be matched. - // Make sure we always deal with an array (string is converted). - $properties[$propertyName] = (array) $properties[$propertyName]; - - foreach ($properties[$propertyName] as $propertyMatchString) { - - $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString); - - // Escape the special character which is the delimiter. - $propertyPattern = str_replace('/', '\/', $propertyPattern); - - // Identify and extract the version. - preg_match('/'.$propertyPattern.'/is', $this->userAgent, $match); - - if (!empty($match[1])) { - $version = ( $type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1] ); - - return $version; - } - - } - - } - - return false; - } - - /** - * Retrieve the mobile grading, using self::MOBILE_GRADE_* constants. - * - * @return string One of the self::MOBILE_GRADE_* constants. - */ - public function mobileGrade() - { - $isMobile = $this->isMobile(); - - if ( - // Apple iOS 4-7.0 – Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3 / 5.1 / 6.1), iPad 3 (5.1 / 6.0), iPad Mini (6.1), iPad Retina (7.0), iPhone 3GS (4.3), iPhone 4 (4.3 / 5.1), iPhone 4S (5.1 / 6.0), iPhone 5 (6.0), and iPhone 5S (7.0) - $this->isIOS() && $this->version('iPad', self::VERSION_TYPE_FLOAT)>=4.3 || - $this->isIOS() && $this->version('iPhone', self::VERSION_TYPE_FLOAT)>=4.3 || - $this->isIOS() && $this->version('iPod', self::VERSION_TYPE_FLOAT)>=4.3 || - - // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5) - // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM - // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices - // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7 - ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) || - - // Windows Phone 7.5-8 - Tested on the HTC Surround (7.5), HTC Trophy (7.5), LG-E900 (7.5), Nokia 800 (7.8), HTC Mazaa (7.8), Nokia Lumia 520 (8), Nokia Lumia 920 (8), HTC 8x (8) - $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT)>=7.5 || - - // Tested on the Torch 9800 (6) and Style 9670 (6), BlackBerry® Torch 9810 (7), BlackBerry Z10 (10) - $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=6.0 || - // Blackberry Playbook (1.0-2.0) - Tested on PlayBook - $this->match('Playbook.*Tablet') || - - // Palm WebOS (1.4-3.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0), HP TouchPad (3.0) - ( $this->version('webOS', self::VERSION_TYPE_FLOAT)>=1.4 && $this->match('Palm|Pre|Pixi') ) || - // Palm WebOS 3.0 - Tested on HP TouchPad - $this->match('hp.*TouchPad') || - - // Firefox Mobile 18 - Tested on Android 2.3 and 4.1 devices - ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=18 ) || - - // Chrome for Android - Tested on Android 4.0, 4.1 device - ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=4.0 ) || - - // Skyfire 4.1 - Tested on Android 2.3 device - ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT)>=4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) || - - // Opera Mobile 11.5-12: Tested on Android 2.3 - ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>=11.5 && $this->is('AndroidOS') ) || - - // Meego 1.2 - Tested on Nokia 950 and N9 - $this->is('MeeGoOS') || - - // Tizen (pre-release) - Tested on early hardware - $this->is('Tizen') || - - // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser - // @todo: more tests here! - $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT)>=2.0 || - - // UC Browser - Tested on Android 2.3 device - ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) || - - // Kindle 3 and Fire - Tested on the built-in WebKit browser for each - ( $this->match('Kindle Fire') || - $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT)>=3.0 ) || - - // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet - $this->is('AndroidOS') && $this->is('NookTablet') || - - // Chrome Desktop 16-24 - Tested on OS X 10.7 and Windows 7 - $this->version('Chrome', self::VERSION_TYPE_FLOAT)>=16 && !$isMobile || - - // Safari Desktop 5-6 - Tested on OS X 10.7 and Windows 7 - $this->version('Safari', self::VERSION_TYPE_FLOAT)>=5.0 && !$isMobile || - - // Firefox Desktop 10-18 - Tested on OS X 10.7 and Windows 7 - $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=10.0 && !$isMobile || - - // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7 - $this->version('IE', self::VERSION_TYPE_FLOAT)>=7.0 && !$isMobile || - - // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7 - $this->version('Opera', self::VERSION_TYPE_FLOAT)>=10 && !$isMobile - ){ - return self::MOBILE_GRADE_A; - } - - if ( - $this->isIOS() && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 || - $this->isIOS() && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<4.3 || - $this->isIOS() && $this->version('iPod', self::VERSION_TYPE_FLOAT)<4.3 || - - // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770 - $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 || - - //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3 - ($this->version('Opera Mini', self::VERSION_TYPE_FLOAT)>=5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT)<=7.0 && - ($this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 || $this->is('iOS')) ) || - - // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1) - $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') || - - // @todo: report this (tested on Nokia N71) - $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>=11 && $this->is('SymbianOS') - ){ - return self::MOBILE_GRADE_B; - } - - if ( - // Blackberry 4.x - Tested on the Curve 8330 - $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<=5.0 || - // Windows Mobile - Tested on the HTC Leo (WinMo 5.2) - $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT)<=5.2 || - - // Tested on original iPhone (3.1), iPhone 3 (3.2) - $this->isIOS() && $this->version('iPad', self::VERSION_TYPE_FLOAT)<=3.2 || - $this->isIOS() && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<=3.2 || - $this->isIOS() && $this->version('iPod', self::VERSION_TYPE_FLOAT)<=3.2 || - - // Internet Explorer 7 and older - Tested on Windows XP - $this->version('IE', self::VERSION_TYPE_FLOAT)<=7.0 && !$isMobile - ){ - return self::MOBILE_GRADE_C; - } - - //All older smartphone platforms and featurephones - Any device that doesn't support media queries - //will receive the basic, C grade experience. - return self::MOBILE_GRADE_C; - } -} - -} \ No newline at end of file diff --git a/core/um-access.php b/core/um-access.php deleted file mode 100644 index 6a65ee22..00000000 --- a/core/um-access.php +++ /dev/null @@ -1,87 +0,0 @@ -redirect_handler = false; - $this->allow_access = false; - - add_action('template_redirect', array(&$this, 'template_redirect'), 1000 ); - - } - - - /** - * Set custom access actions and redirection - */ - function template_redirect() { - global $post, $ultimatemember; - - do_action('um_access_global_settings'); - - do_action('um_access_user_custom_homepage'); - - do_action('um_access_frontpage_per_role'); - - do_action('um_access_homepage_per_role'); - - do_action('um_access_category_settings'); - - do_action('um_access_tags_settings'); - - do_action('um_access_post_settings'); - - if ( $this->redirect_handler && $this->allow_access == false && ( ! um_is_core_page('login') || um_is_core_page('login') && is_user_logged_in() ) ) { - - // login page add protected page automatically - - if ( strstr( $this->redirect_handler, um_get_core_page('login') ) ){ - $curr = $ultimatemember->permalinks->get_current_url(); - $this->redirect_handler = esc_url( add_query_arg('redirect_to', urlencode_deep($curr), $this->redirect_handler) ); - } - - wp_redirect( $this->redirect_handler ); - - } - - } - - - /** - * Get custom access settings meta - * @param integer $post_id - * @return array - */ - function get_meta( $post_id ) { - global $post; - $meta = get_post_custom( $post_id ); - if ( isset( $meta ) && is_array( $meta ) ) { - foreach ($meta as $k => $v){ - if ( strstr($k, '_um_') ) { - $k = str_replace('_um_', '', $k); - $array[$k] = $v[0]; - } - } - } - if ( isset( $array ) ) - return (array)$array; - else - return array(''); - } - - /** - * Sets a custom access referer in a redirect URL - * @param string $url - * @param string $referer - */ - function set_referer( $url, $referer ){ - - $enable_referer = apply_filters("um_access_enable_referer", false ); - if( ! $enable_referer ) return $url; - - $url = add_query_arg('um_ref',$referer, $url); - return $url; - } - -} \ No newline at end of file diff --git a/core/um-account.php b/core/um-account.php deleted file mode 100644 index 93889087..00000000 --- a/core/um-account.php +++ /dev/null @@ -1,364 +0,0 @@ -register_fields = array(); - - add_shortcode('ultimatemember_account', array(&$this, 'ultimatemember_account'), 1); - - add_filter('um_account_page_default_tabs_hook', array(&$this, 'core_tabs'), 1); - - add_action('template_redirect', array(&$this, 'account'), 10001 ); - - add_action('template_redirect', array(&$this, 'form_init'), 10002); - - add_filter('um_predefined_fields_hook', array(&$this,'predefined_fields_hook'),1 ); - - $this->current_tab = 'general'; - - } - - /** - * Get Core account tabs - * @return array - */ - function core_tabs() { - - $tabs[100]['general']['icon'] = 'um-faicon-user'; - $tabs[100]['general']['title'] = __('Account','ultimate-member'); - - $tabs[200]['password']['icon'] = 'um-faicon-asterisk'; - $tabs[200]['password']['title'] = __('Change Password','ultimate-member'); - - $tabs[300]['privacy']['icon'] = 'um-faicon-lock'; - $tabs[300]['privacy']['title'] = __('Privacy','ultimate-member'); - - $tabs[400]['notifications']['icon'] = 'um-faicon-envelope'; - $tabs[400]['notifications']['title'] = __('Notifications','ultimate-member'); - - $tabs[9999]['delete']['icon'] = 'um-faicon-trash-o'; - $tabs[9999]['delete']['title'] = __('Delete Account','ultimate-member'); - - return $tabs; - } - - /** - * Account page form - */ - function form_init() { - global $ultimatemember; - - if ( um_submitting_account_page() ) { - - $ultimatemember->form->post_form = $_POST; - - do_action('um_submit_account_errors_hook', $ultimatemember->form->post_form ); - - if ( !isset($ultimatemember->form->errors) ) { - - if ( get_query_var('um_tab') ) { - $this->current_tab = get_query_var('um_tab'); - } - - do_action('um_submit_account_details', $ultimatemember->form->post_form ); - - } - - } - - } - - /** - * Can access account page - */ - function account(){ - global $ultimatemember; - - if ( um_is_core_page('account') && !is_user_logged_in() ) { - - $redirect_to = add_query_arg( - 'redirect_to', - urlencode_deep( um_get_core_page('account') ) , - um_get_core_page('login') - ); - - exit( wp_redirect( $redirect_to ) ); - - } - - if ( um_is_core_page('account') ) { - - $ultimatemember->fields->set_mode = 'account'; - - $ultimatemember->fields->editing = true; - - if ( get_query_var('um_tab') ) { - $this->current_tab = get_query_var('um_tab'); - } - - } - - } - - /** - * Get Tab Link - * @param integer $id - * @return string - */ - function tab_link( $id ) { - - if ( get_option('permalink_structure') ) { - - $url = trailingslashit( untrailingslashit( um_get_core_page('account') ) ); - $url = $url . $id . '/'; - - } else { - - $url = add_query_arg( 'um_tab', $id, um_get_core_page('account') ); - - } - - return $url; - } - - /** - * Add class based on shortcode - * @param string $mode - * @return string - */ - function get_class( $mode ){ - - global $ultimatemember; - - $classes = 'um-'.$mode; - - if ( is_admin() ) { - $classes .= ' um-in-admin'; - } - - if ( $ultimatemember->fields->editing == true ) { - $classes .= ' um-editing'; - } - - if ( $ultimatemember->fields->viewing == true ) { - $classes .= ' um-viewing'; - } - - $classes = apply_filters('um_form_official_classes__hook', $classes); - return $classes; - } - - /** - * Get Tab Output - * @param integer $id - * @return string - */ - function get_tab_output( $id ) { - global $ultimatemember; - - $output = null; - - switch( $id ) { - - case 'notifications': - - $output = apply_filters("um_account_content_hook_{$id}", $output); - return $output; - - break; - - case 'privacy': - - $args = 'profile_privacy,hide_in_members'; - $args = apply_filters('um_account_tab_privacy_fields', $args ); - - $fields = $ultimatemember->builtin->get_specific_fields( $args ); - - $fields = apply_filters('um_account_secure_fields', $fields, $id ); - - foreach( $fields as $key => $data ){ - $output .= $ultimatemember->fields->edit_field( $key, $data ); - } - - return $output; - - break; - - case 'delete': - - $args = 'single_user_password'; - - $fields = $ultimatemember->builtin->get_specific_fields( $args ); - - $fields = apply_filters('um_account_secure_fields', $fields, $id ); - - foreach( $fields as $key => $data ){ - $output .= $ultimatemember->fields->edit_field( $key, $data ); - } - - return $output; - - break; - - case 'general': - - $args = 'user_login,first_name,last_name,user_email'; - - if ( !um_get_option('account_name') ) { - $args = 'user_login,user_email'; - } - - if ( !um_get_option('account_email') && !um_user('can_edit_everyone') ) { - $args = str_replace(',user_email','', $args ); - } - - $fields = $ultimatemember->builtin->get_specific_fields( $args ); - - $fields = apply_filters('um_account_secure_fields', $fields, $id ); - - foreach( $fields as $key => $data ){ - $output .= $ultimatemember->fields->edit_field( $key, $data ); - } - - return $output; - - break; - - case 'password': - - $args = 'user_password'; - - $fields = $ultimatemember->builtin->get_specific_fields( $args ); - - $fields = apply_filters('um_account_secure_fields', $fields, $id ); - - foreach( $fields as $key => $data ){ - $output .= $ultimatemember->fields->edit_field( $key, $data ); - } - - return $output; - - break; - - default : - - $output = apply_filters("um_account_content_hook_{$id}", $output); - return $output; - - break; - - } - } - - /** - * Shortcode - * @param array $args - * @return string - */ - function ultimatemember_account( $args = array() ) { - return $this->load( $args ); - } - - /** - * Load module with global function - * @param array $args - * @return string - */ - function load( $args ) { - - global $ultimatemember; - - $ultimatemember->user->set( get_current_user_id() ); - - ob_start(); - - $defaults = array( - 'template' => 'account', - 'mode' => 'account', - 'form_id' => 'um_account_id', - ); - $args = wp_parse_args( $args, $defaults ); - - if ( isset( $args['use_globals'] ) && $args['use_globals'] == 1 ) { - $args = array_merge( $args, $this->get_css_args( $args ) ); - } else { - $args = array_merge( $this->get_css_args( $args ), $args ); - } - - $args = apply_filters('um_account_shortcode_args_filter', $args); - - extract( $args, EXTR_SKIP ); - - do_action("um_pre_{$mode}_shortcode", $args); - - do_action("um_before_form_is_loaded", $args); - - do_action("um_before_{$mode}_form_is_loaded", $args); - - $this->template_load( $template, $args ); - - if ( !is_admin() && !defined( 'DOING_AJAX' ) ) { - $this->dynamic_css( $args ); - } - - $output = ob_get_contents(); - ob_end_clean(); - return $output; - - } - - /** - * Get dynamic css args - * @param array $args - * @return array - */ - function get_css_args( $args ) { - $arr = um_styling_defaults( $args['mode'] ); - $arr = array_merge( $arr, array( 'form_id' => $args['form_id'], 'mode' => $args['mode'] ) ); - return $arr; - } - - /** - * Load dynamic css - * @param array $args - */ - function dynamic_css( $args=array() ) { - extract($args); - $global = um_path . 'assets/dynamic_css/dynamic_global.php'; - $file = um_path . 'assets/dynamic_css/dynamic_'.$mode.'.php'; - include $global; - if ( file_exists( $file ) ) - include $file; - } - - /** - * Loads a template file - * @param string $template - * @param array $args - */ - function template_load( $template, $args=array() ) { - global $ultimatemember; - if ( is_array( $args ) ) { - $ultimatemember->shortcodes->set_args = $args; - } - $ultimatemember->shortcodes->load_template( $template ); - } - - /** - * Filter account fields - * @param array $predefined_fields - * @return array - */ - function predefined_fields_hook( $predefined_fields ){ - - $account_hide_in_directory = um_get_option('account_hide_in_directory'); - if( ! $account_hide_in_directory ){ - unset( $predefined_fields['hide_in_members'] ); - } - - return $predefined_fields; - } -} diff --git a/core/um-actions-access.php b/core/um-actions-access.php deleted file mode 100644 index 3b3fe3c7..00000000 --- a/core/um-actions-access.php +++ /dev/null @@ -1,876 +0,0 @@ -permalinks->get_current_url( get_option('permalink_structure') ); - $current_url = untrailingslashit( $current_url ); - $current_url_slash = trailingslashit( $current_url ); - - if ( ( isset( $post->ID ) ) && ( in_array( $current_url, $redirects ) || in_array( $current_url_slash, $redirects ) ) ) { - // allow - }else { - $ultimatemember->access->redirect_handler = $ultimatemember->access->set_referer( $redirect, "global" ); - } - - // Disallow access in homepage - if( is_front_page() || is_home() ){ - $home_page_accessible = um_get_option("home_page_accessible"); - if( $home_page_accessible == 0 ){ - $ultimatemember->access->redirect_handler = $ultimatemember->access->set_referer( $redirect, "global" ); - - wp_redirect( $ultimatemember->access->redirect_handler ); exit; - } - - } - - // Disallow access in category pages - if( is_category() ){ - $category_page_accessible = um_get_option("category_page_accessible"); - if( $category_page_accessible == 0 ){ - $ultimatemember->access->redirect_handler = $ultimatemember->access->set_referer( $redirect, "global" ); - wp_redirect( $ultimatemember->access->redirect_handler ); exit; - } - } - } - - - $current_page_type = um_get_current_page_type(); - - do_action("um_access_post_type",$current_page_type); - do_action("um_access_post_type_{$current_page_type}"); - } - - /** - * Custom User homepage redirection - */ - add_action("um_access_user_custom_homepage","um_access_user_custom_homepage"); - function um_access_user_custom_homepage(){ - global $ultimatemember; - - if( ! is_user_logged_in() ) return; - if( ! is_front_page() ) return; - - $role_meta = $ultimatemember->query->role_data( um_user('role') ); - - if( isset( $role_meta['default_homepage'] ) && $role_meta['default_homepage'] == 0 ){ - $redirect_to = null; - - if( ! empty( $role_meta['redirect_homepage'] ) ){ - $redirect_to = $role_meta['redirect_homepage']; - }else{ - $redirect_to = um_get_core_page('user'); - } - - $redirect_to = $ultimatemember->access->set_referer( $redirect_to, "custom_homepage" ); - wp_redirect( $redirect_to ); exit; - - } - } - - /** - * Front page access settings - */ - add_action('um_access_frontpage_per_role','um_access_frontpage_per_role'); - function um_access_frontpage_per_role() { - global $ultimatemember, $post; - - if ( is_admin() ) return; - if ( ! is_front_page() ) return; - if( is_404() ) return; - - if ( ! isset( $um_post_id ) && isset( $post->ID ) ){ - $um_post_id = $post->ID; - } - - if( ! isset( $um_post_id ) ){ - return; - } - - $args = $ultimatemember->access->get_meta( $um_post_id ); - extract( $args ); - - if ( !isset( $args['custom_access_settings'] ) || $args['custom_access_settings'] == 0 ) { - - $um_post_id = apply_filters('um_access_control_for_parent_posts', $um_post_id ); - - $args = $ultimatemember->access->get_meta( $um_post_id ); - extract( $args ); - - if ( !isset( $args['custom_access_settings'] ) || $args['custom_access_settings'] == 0 ) { - return; - } - - } - - $redirect_to = null; - - if ( !isset( $accessible ) ) return; - - switch( $accessible ) { - - case 0: - $ultimatemember->access->allow_access = true; - $ultimatemember->access->redirect_handler = false; // open to everyone - - break; - - case 1: - - $redirect_to = $access_redirect2; - - if ( is_user_logged_in() ){ - $ultimatemember->access->allow_access = false; - } - - if ( ! is_user_logged_in() ){ - $ultimatemember->access->allow_access = true; - } - - if( ! empty( $redirect_to ) ){ - $redirect_to = $ultimatemember->access->set_referer( $redirect_to, "frontpage_per_role_1a" ); - $ultimatemember->access->redirect_handler = esc_url( $redirect_to ); - }else{ - if ( ! is_user_logged_in() ){ - $redirect_to = um_get_core_page("login"); - }else{ - $redirect_to = um_get_core_page("user"); - } - - $redirect_to = $ultimatemember->access->set_referer( $redirect_to, "frontpage_per_role_1b" ); - $ultimatemember->access->redirect_handler = esc_url( $redirect_to ); - } - - - break; - - case 2: - - if ( ! is_user_logged_in() ){ - - if ( empty( $access_redirect ) ) { - $access_redirect = um_get_core_page('login'); - } - - $redirect_to = $access_redirect; - $redirect_to = $ultimatemember->access->set_referer( $redirect_to, "frontpage_per_role_2a" ); - - } - - if ( is_user_logged_in() && isset( $access_roles ) && !empty( $access_roles ) ){ - $access_roles = unserialize( $access_roles ); - $access_roles = array_filter($access_roles); - - if ( !empty( $access_roles ) && !in_array( um_user('role'), $access_roles ) ) { - if ( empty( $access_redirect ) ) { - if ( is_user_logged_in() ) { - $access_redirect = site_url(); - } else { - $access_redirect = um_get_core_page('login'); - } - } - $redirect_to = esc_url( $access_redirect ); - $redirect_to = $ultimatemember->access->set_referer( $redirect_to, "frontpage_per_role_2b" ); - - } - } - - - $ultimatemember->access->redirect_handler = esc_url( $redirect_to ); - - break; - - } - - } - - /** - * Posts page access settings - */ - add_action('um_access_homepage_per_role','um_access_homepage_per_role'); - function um_access_homepage_per_role() { - global $ultimatemember, $post; - - if ( is_admin() ) return; - if ( ! is_home() ) return; - if ( is_404() ) return; - - $access = um_get_option('accessible'); - - $show_on_front = get_option( 'show_on_front' ); - - if( $show_on_front == "page" ){ - - $um_post_id = get_option( 'page_for_posts' ); - - if ( $access == 2 && ! is_user_logged_in() ) { - $ultimatemember->access->allow_access = false; - }else{ - $ultimatemember->access->allow_access = true; - } - - }else if( $show_on_front == "posts" ){ - $ultimatemember->access->allow_access = true; - } - - - - if ( isset( $um_post_id ) ){ - - $args = $ultimatemember->access->get_meta( $um_post_id ); - extract( $args ); - - if ( !isset( $args['custom_access_settings'] ) || $args['custom_access_settings'] == 0 ) { - - $um_post_id = apply_filters('um_access_control_for_parent_posts', $um_post_id ); - - $args = $ultimatemember->access->get_meta( $um_post_id ); - extract( $args ); - - if ( !isset( $args['custom_access_settings'] ) || $args['custom_access_settings'] == 0 ) { - return; - } - - } - - $redirect_to = null; - - if ( !isset( $accessible ) ) return; - - switch( $accessible ) { - - case 0: - $ultimatemember->access->allow_access = true; - $ultimatemember->access->redirect_handler = false; // open to everyone - - break; - - case 1: - - $redirect_to = esc_url( $access_redirect2 ); - - if ( is_user_logged_in() ){ - $ultimatemember->access->allow_access = false; - } - - if ( ! is_user_logged_in() ){ - $ultimatemember->access->allow_access = true; - } - - if( ! empty( $redirect_to ) ){ - $redirect_to = $ultimatemember->access->set_referer( $redirect_to, "homepage_per_role_1a" ); - $ultimatemember->access->redirect_handler = esc_url( $redirect_to ); - }else{ - $redirect_to = null; - if ( ! is_user_logged_in() ){ - $redirect_to = um_get_core_page("login"); - }else{ - $redirect_to = um_get_core_page("user"); - } - $redirect_to = $ultimatemember->access->set_referer( $redirect_to, "homepage_per_role_1b" ); - $ultimatemember->access->redirect_handler = esc_url( $redirect_to ); - } - - - break; - - case 2: - - if ( ! is_user_logged_in() ){ - - if ( empty( $access_redirect ) ) { - $access_redirect = um_get_core_page('login'); - } - - $redirect_to = $access_redirect; - $redirect_to = $ultimatemember->access->set_referer( $redirect_to, "homepage_per_role_2a" ); - } - - if ( is_user_logged_in() && isset( $access_roles ) && !empty( $access_roles ) ){ - $access_roles = unserialize( $access_roles ); - $access_roles = array_filter($access_roles); - - if ( !empty( $access_roles ) && !in_array( um_user('role'), $access_roles ) ) { - if ( !$access_redirect ) { - if ( is_user_logged_in() ) { - $access_redirect = site_url(); - } else { - $access_redirect = um_get_core_page('login'); - } - } - - $redirect_to = $access_redirect; - $redirect_to = $ultimatemember->access->set_referer( $redirect_to, "homepage_per_role_2b" ); - - } - } - $ultimatemember->access->redirect_handler = esc_url( $redirect_to ); - - break; - - } - } - } - - - /** - * Archives/Taxonomies/Categories access settings - */ - add_action('um_access_category_settings','um_access_category_settings'); - function um_access_category_settings() { - global $post, $wp_query, $ultimatemember; - - if ( is_front_page() || - is_home() || - is_feed() || - is_page() || - is_404() - ) { - - return; - - } - - $access = um_get_option('accessible'); - $current_page_type = um_get_current_page_type(); - - - if( is_category() && ! in_array( $current_page_type , array( 'day','month','year','author','archive' ) ) ){ - - $um_category = get_the_category(); - $um_category = current( $um_category ); - $term_id = ''; - - if( isset( $um_category->term_id ) ){ - $term_id = $um_category->term_id; - } - - if( isset( $term_id ) && ! empty( $term_id ) ){ - - $opt = get_option("category_$term_id"); - - if ( isset( $opt['_um_accessible'] ) ) { - - $redirect = false; - - switch( $opt['_um_accessible'] ) { - - case 0: - - $ultimatemember->access->allow_access = true; - $ultimatemember->access->redirect_handler = ''; // open to everyone - - break; - - case 1: - - if ( is_user_logged_in() ){ - - if( isset( $opt['_um_redirect2'] ) && ! empty( $opt['_um_redirect2'] ) ) { - $redirect = $opt['_um_redirect2']; - }else{ - $redirect = site_url(); - } - } - - $ultimatemember->access->allow_access = false; - - $redirect = $ultimatemember->access->set_referer( $redirect, "category_1" ); - - $ultimatemember->access->redirect_handler = esc_url( $redirect ); - - if ( ! is_user_logged_in() && ! empty( $redirect ) ){ - $ultimatemember->access->allow_access = true; - } - - break; - - case 2: - - if ( ! is_user_logged_in() ){ - - if( isset( $opt['_um_redirect'] ) && ! empty( $opt['_um_redirect'] ) ){ - $redirect = $opt['_um_redirect']; - }else{ - $redirect = um_get_core_page('login'); - } - - $ultimatemember->access->allow_access = false; - - $redirect = $ultimatemember->access->set_referer( $redirect, "category_2a" ); - - $ultimatemember->access->redirect_handler = esc_url( $redirect ); - } - - if ( is_user_logged_in() && isset( $opt['_um_roles'] ) && !empty( $opt['_um_roles'] ) ){ - if ( ! in_array( um_user('role'), $opt['_um_roles'] ) ) { - - - if( isset( $opt['_um_redirect'] ) ){ - $redirect = $opt['_um_redirect']; - } - $redirect = $ultimatemember->access->set_referer( $redirect, "category_2b" ); - - $ultimatemember->access->redirect_handler = esc_url( $redirect ); - - } - } - - } - } - } - - } else if ( $access == 2 && ! is_user_logged_in() && is_archive() ) { - - $ultimatemember->access->allow_access = false; - $redirect = um_get_core_page('login'); - $redirect = $ultimatemember->access->set_referer( $redirect, "category_archive" ); - - $ultimatemember->access->redirect_handler = $redirect; - - } else if ( is_tax() && get_post_taxonomies( $post ) ) { - - $taxonomies = get_post_taxonomies( $post ); - $categories_ids = array(); - - foreach ($taxonomies as $key => $value) { - $term_list = wp_get_post_terms($post->ID, $value, array("fields" => "ids")); - foreach( $term_list as $term_id ){ - array_push( $categories_ids , $term_id); - } - } - - foreach( $categories_ids as $term => $term_id ) { - - $opt = get_option("category_$term_id"); - - if ( isset( $opt['_um_accessible'] ) ) { - switch( $opt['_um_accessible'] ) { - - case 0: - $ultimatemember->access->allow_access = true; - $ultimatemember->access->redirect_handler = false; // open to everyone - break; - - case 1: - - if ( is_user_logged_in() ) - $redirect = ( isset( $opt['_um_redirect2'] ) && !empty( $opt['_um_redirect2'] ) ) ? $opt['_um_redirect2'] : site_url(); - $redirect = $ultimatemember->access->set_referer( $redirect, "categories_1" ); - $ultimatemember->access->redirect_handler = $redirect; - if ( !is_user_logged_in() ) - $ultimatemember->access->allow_access = true; - - break; - - case 2: - - if ( ! is_user_logged_in() ){ - - $redirect = ( isset( $opt['_um_redirect'] ) && ! empty( $opt['_um_redirect'] ) ) ? $opt['_um_redirect'] : um_get_core_page('login'); - $redirect = $ultimatemember->access->set_referer( $redirect, "categories_2a" ); - - $ultimatemember->access->redirect_handler = $redirect; - } - - if ( is_user_logged_in() && isset( $opt['_um_roles'] ) && !empty( $opt['_um_roles'] ) ){ - if ( !in_array( um_user('role'), $opt['_um_roles'] ) ) { - $redirect = null; - if ( is_user_logged_in() ){ - $redirect = ( isset( $opt['_um_redirect'] ) ) ? $opt['_um_redirect'] : site_url(); - } - - if ( !is_user_logged_in() ){ - $redirect = um_get_core_page('login'); - } - - $redirect = $ultimatemember->access->set_referer( $redirect, "categories_2b" ); - $ultimatemember->access->redirect_handler = $redirect; - } - } - - } - } - - } - } - - } - - /** - * Tags access settings - */ - add_action('um_access_tags_settings','um_access_tags_settings'); - function um_access_tags_settings() { - global $post, $wp_query, $ultimatemember; - - if ( is_front_page() || - is_home() || - is_feed() || - is_page() || - is_404() - ) { - - return; - - } - - $access = um_get_option('accessible'); - $current_page_type = um_get_current_page_type(); - - $tag_id = get_query_var( 'tag_id' ); - - if( is_tag() && $current_page_type == 'tag' && $tag_id ){ - - if( isset( $tag_id ) && ! empty( $tag_id ) ){ - - $opt = get_option("category_$tag_id"); - - if ( isset( $opt['_um_accessible'] ) ) { - - $redirect = false; - - switch( $opt['_um_accessible'] ) { - - case 0: - - $ultimatemember->access->allow_access = true; - $ultimatemember->access->redirect_handler = ''; // open to everyone - - break; - - case 1: - - if ( is_user_logged_in() ){ - - if( isset( $opt['_um_redirect2'] ) && ! empty( $opt['_um_redirect2'] ) ) { - $redirect = $opt['_um_redirect2']; - }else{ - $redirect = site_url(); - } - } - - $ultimatemember->access->allow_access = false; - - $redirect = $ultimatemember->access->set_referer( $redirect, "tag_1" ); - - $ultimatemember->access->redirect_handler = esc_url( $redirect ); - - if ( ! is_user_logged_in() && ! empty( $redirect ) ){ - $ultimatemember->access->allow_access = true; - } - - break; - - case 2: - - if ( ! is_user_logged_in() ){ - - if( isset( $opt['_um_redirect'] ) && ! empty( $opt['_um_redirect'] ) ){ - $redirect = $opt['_um_redirect']; - }else{ - $redirect = um_get_core_page('login'); - } - - $ultimatemember->access->allow_access = false; - - $redirect = $ultimatemember->access->set_referer( $redirect, "tag_2" ); - - $ultimatemember->access->redirect_handler = esc_url( $redirect ); - } - - if ( is_user_logged_in() && isset( $opt['_um_roles'] ) && !empty( $opt['_um_roles'] ) ){ - if ( ! in_array( um_user('role'), $opt['_um_roles'] ) ) { - - - if( isset( $opt['_um_redirect'] ) ){ - $redirect = $opt['_um_redirect']; - } - $redirect = $ultimatemember->access->set_referer( $redirect, "tag_2b" ); - - $ultimatemember->access->redirect_handler = esc_url( $redirect ); - - } - } - - } - } - } - - } else if ( $access == 2 && ! is_user_logged_in() && is_tag() ) { - - $ultimatemember->access->allow_access = false; - $redirect = um_get_core_page('login'); - $redirect = $ultimatemember->access->set_referer( $redirect, "tag" ); - - $ultimatemember->access->redirect_handler = $redirect; - - } - - } - - /** - * Posts/Page access settings - */ - add_action('um_access_post_settings','um_access_post_settings'); - function um_access_post_settings() { - global $post, $ultimatemember; - - // woo commerce shop ID - if( function_exists('is_shop') && is_shop() ) { - - $um_post_id = get_option('woocommerce_shop_page_id'); - - } else if ( - is_category() || - is_archive() || - is_search() || - in_the_loop() || - is_feed() || - is_tax() || - ! get_post_type() || - ! isset( $post->ID ) || - is_home() || - is_front_page() || - is_404() - ) { - - return; - - } - - if ( !isset( $um_post_id ) ){ - $um_post_id = $post->ID; - } - - $args = $ultimatemember->access->get_meta( $um_post_id ); - - - extract( $args ); - - // Check for parent page's custom access settings - if ( !isset( $args['custom_access_settings'] ) || $args['custom_access_settings'] == 0 ) { - - $um_post_id = apply_filters('um_access_control_for_parent_posts', $um_post_id ); - - $args = $ultimatemember->access->get_meta( $um_post_id ); - extract( $args ); - - } - - if( isset( $post->ID ) ){ - $post_type = get_post_type( $post->ID ); - - // post's category restriction - if ( $post_type != 'page' && isset( $args['custom_access_settings'] ) && $args['custom_access_settings'] == 0 ) { - - $categories = get_the_category( $post->ID ); - foreach( $categories as $cat ){ - - $opt = get_option("category_{$cat->term_id}"); - - if ( isset( $opt['_um_accessible'] ) ) { - switch( $opt['_um_accessible'] ) { - - case 0: // Open to everyone - $ultimatemember->access->allow_access = true; - $ultimatemember->access->redirect_handler = false; // open to everyone - break; - - case 1: // Logged out users only - - if ( is_user_logged_in() ){ - $redirect = ( isset( $opt['_um_redirect2'] ) && ! empty( $opt['_um_redirect2'] ) ) ? $opt['_um_redirect2'] : site_url(); - $redirect = $ultimatemember->access->set_referer( $redirect, "page_cat_1a_t{$cat->term_id}_pt{$post_type}" ); - $ultimatemember->access->redirect_handler = $redirect; - $ultimatemember->access->allow_access = false; - } - - if ( !is_user_logged_in() ){ - $ultimatemember->access->allow_access = true; - } - - break; - - case 2: // Logged in users only - - if ( ! is_user_logged_in() ){ - - $redirect = ( isset( $opt['_um_redirect'] ) && ! empty( $opt['_um_redirect'] ) ) ? $opt['_um_redirect'] : um_get_core_page('login'); - - $redirect = $ultimatemember->access->set_referer( $redirect, "page_cat_2a_t{$cat->term_id}_pt{$post_type}" ); - $ultimatemember->access->redirect_handler = $redirect; - - $ultimatemember->access->allow_access = false; - } - - if ( is_user_logged_in() ){ - - if( isset( $opt['_um_roles'] ) && !empty( $opt['_um_roles'] ) ){ - - if ( in_array( um_user('role'), $opt['_um_roles'] ) ) { - - $ultimatemember->access->allow_access = true; - - }else{ - - $redirect = ( isset( $opt['_um_redirect'] ) && ! empty( $opt['_um_redirect'] ) ) ? $opt['_um_redirect'] : site_url(); - $redirect = $ultimatemember->access->set_referer( $redirect, "page_cat_2b_t{$cat->term_id}_pt{$post_type}" ); - $ultimatemember->access->redirect_handler = $redirect; - - $ultimatemember->access->allow_access = false; - - } - - }else{ // if allowed all roles - $ultimatemember->access->allow_access = true; - } - - } - - } - - - } // end if isset( $opt['_um_accessible'] ) - - // if one of the categories has enabled restriction, apply its settings to the current post - if( $ultimatemember->access->allow_access == false ){ - return; - } - - } // end foreach - } - } - - // post restriction - if ( isset( $args['custom_access_settings'] ) && $args['custom_access_settings'] == 1 ) { - - $redirect_to = null; - - if ( !isset( $accessible ) ) return; - - switch( $accessible ) { - - case 0: - $ultimatemember->access->allow_access = true; - $ultimatemember->access->redirect_handler = false; // open to everyone - - break; - - case 1: - - $redirect_to = esc_url( $access_redirect2 ); - - if ( is_user_logged_in() ){ - $ultimatemember->access->allow_access = false; - } - - if ( ! is_user_logged_in() ){ - $ultimatemember->access->allow_access = true; - } - - if( ! empty( $redirect_to ) ){ - $redirect_to = $ultimatemember->access->set_referer( $redirect_to, "post_1a" ); - $ultimatemember->access->redirect_handler = esc_url( $redirect_to ); - }else{ - if ( ! is_user_logged_in() ){ - $redirect_to = um_get_core_page("login"); - }else{ - $redirect_to = um_get_core_page("user"); - } - - $redirect_to = $ultimatemember->access->set_referer( $redirect_to, "post_1b" ); - $ultimatemember->access->redirect_handler = esc_url( $redirect_to ); - } - - - break; - - case 2: - - if ( ! is_user_logged_in() ){ - - if ( empty( $access_redirect ) ) { - $access_redirect = um_get_core_page('login'); - } - - $access_redirect = $ultimatemember->access->set_referer( $access_redirect, "post_2a" ); - - $redirect_to = esc_url( $access_redirect ); - } - - if ( is_user_logged_in() && isset( $access_roles ) && !empty( $access_roles ) ){ - $access_roles = unserialize( $access_roles ); - $access_roles = array_filter($access_roles); - - if ( !empty( $access_roles ) && !in_array( um_user('role'), $access_roles ) ) { - if ( !$access_redirect ) { - if ( is_user_logged_in() ) { - $access_redirect = esc_url( site_url() ); - } else { - $access_redirect = esc_url( um_get_core_page('login') ); - } - } - $access_redirect = $ultimatemember->access->set_referer( $access_redirect, "post_2b" ); - $redirect_to = esc_url( $access_redirect ); - } - } - - $ultimatemember->access->redirect_handler = esc_url( $redirect_to ); - - break; - - } - } - - if( um_is_core_page('user') && ! is_user_logged_in() && ! empty( $access_redirect ) && isset( $args['custom_access_settings'] ) && $args['custom_access_settings'] != 0 ){ - $ultimatemember->access->allow_access = false; - $access_redirect = $ultimatemember->access->set_referer( $access_redirect, "user_page" ); - $ultimatemember->access->redirect_handler = esc_url( $access_redirect ); - wp_redirect( $ultimatemember->access->redirect_handler ); - exit; - } - - } - - /** - * Profile Access - */ - add_action('um_access_profile','um_access_profile'); - function um_access_profile( $user_id ){ - - if( ! um_is_myprofile() && um_is_core_page('user') && ! current_user_can('edit_users') ){ - - um_fetch_user( $user_id ); - - if( ! in_array( um_user('account_status'), array('approved') ) ){ - um_redirect_home(); - } - - um_reset_user(); - - } - } diff --git a/core/um-actions-ajax.php b/core/um-actions-ajax.php deleted file mode 100644 index 3e13d753..00000000 --- a/core/um-actions-ajax.php +++ /dev/null @@ -1,222 +0,0 @@ - - - - - files->delete_file( $src ); - } - - /** - * Removes profile photo silently - * @uses action hooks: wp_ajax_nopriv_ultimatemember_delete_profile_photo, wp_ajax_ultimatemember_delete_profile_photo - */ - add_action('wp_ajax_nopriv_ultimatemember_delete_profile_photo', 'ultimatemember_delete_profile_photo'); - add_action('wp_ajax_ultimatemember_delete_profile_photo', 'ultimatemember_delete_profile_photo'); - function ultimatemember_delete_profile_photo(){ - global $ultimatemember; - extract($_REQUEST); - - if ( !um_current_user_can('edit', $user_id ) ) die( __('You can not edit this user') ); - - $ultimatemember->files->delete_core_user_photo( $user_id, 'profile_photo' ); - - } - - /** - * Remove cover photo silently - * @uses action hooks: wp_ajax_nopriv_ultimatemember_delete_cover_photo, wp_ajax_ultimatemember_delete_cover_photo - */ - add_action('wp_ajax_nopriv_ultimatemember_delete_cover_photo', 'ultimatemember_delete_cover_photo'); - add_action('wp_ajax_ultimatemember_delete_cover_photo', 'ultimatemember_delete_cover_photo'); - function ultimatemember_delete_cover_photo(){ - global $ultimatemember; - extract($_REQUEST); - - if ( !um_current_user_can('edit', $user_id ) ) die( __('You can not edit this user') ); - - $ultimatemember->files->delete_core_user_photo( $user_id, 'cover_photo' ); - - } - - /** - * Resampling/crop images - * @uses action hooks: wp_ajax_nopriv_ultimatemember_resize_image, wp_ajax_ultimatemember_resize_image - */ - add_action('wp_ajax_nopriv_ultimatemember_resize_image', 'ultimatemember_resize_image'); - add_action('wp_ajax_ultimatemember_resize_image', 'ultimatemember_resize_image'); - function ultimatemember_resize_image(){ - global $ultimatemember; - $output = 0; - - extract($_REQUEST); - - if ( !isset($src) || !isset($coord) ) die( __('Invalid parameters') ); - - $coord_n = substr_count($coord, ","); - if ( $coord_n != 3 ) die( __('Invalid coordinates') ); - - $um_is_temp_image = um_is_temp_image( $src ); - if ( !$um_is_temp_image ) die( __('Invalid Image file') ); - - $crop = explode(',', $coord ); - $crop = array_map('intval', $crop); - - $uri = $ultimatemember->files->resize_image( $um_is_temp_image, $crop ); - - // If you're updating a user - if ( isset( $user_id ) && $user_id > 0 ) { - $uri = $ultimatemember->files->new_user_upload( $user_id, $um_is_temp_image, $key ); - } - - $output = $uri; - - delete_option( "um_cache_userdata_{$user_id}" ); - - if(is_array($output)){ print_r($output); }else{ echo $output; } die; - - } - - /** - * Run an ajax action on the fly - * @uses action hooks: wp_ajax_nopriv_ultimatemember_muted_action, wp_ajax_ultimatemember_muted_action - */ - add_action('wp_ajax_nopriv_ultimatemember_muted_action', 'ultimatemember_muted_action'); - add_action('wp_ajax_ultimatemember_muted_action', 'ultimatemember_muted_action'); - function ultimatemember_muted_action(){ - global $ultimatemember; - extract($_REQUEST); - - if ( !um_current_user_can('edit', $user_id ) ) die( __('You can not edit this user') ); - - switch( $hook ) { - default: - do_action("um_run_ajax_function__{$hook}", $_REQUEST); - break; - } - - } - - /** - * Run an ajax pagination on the fly - * @uses action hooks: wp_ajax_nopriv_ultimatemember_ajax_paginate, wp_ajax_ultimatemember_ajax_paginate - */ - add_action('wp_ajax_nopriv_ultimatemember_ajax_paginate', 'ultimatemember_ajax_paginate'); - add_action('wp_ajax_ultimatemember_ajax_paginate', 'ultimatemember_ajax_paginate'); - function ultimatemember_ajax_paginate(){ - global $ultimatemember; - extract($_REQUEST); - - ob_start(); - - do_action("um_ajax_load_posts__{$hook}", $args); - - $output = ob_get_contents(); - ob_end_clean(); - - die($output); - - } - - /** - * Run check if username exists - * @uses action hooks: wp_ajax_nopriv_ultimatemember_check_username_exists, wp_ajax_ultimatemember_check_username_exists - * @return boolean - */ - add_action('wp_ajax_nopriv_ultimatemember_check_username_exists', 'ultimatemember_check_username_exists'); - add_action('wp_ajax_ultimatemember_check_username_exists', 'ultimatemember_check_username_exists'); - function ultimatemember_check_username_exists() { - $username = isset($_REQUEST['username']) ? $_REQUEST['username'] : ''; - $exists = username_exists( $username ); - $exists = apply_filters( 'um_validate_username_exists', $exists, $username ); - - if( $exists ) { - echo 1; - } else { - echo 0; - } - - die(); - } - - /** - * Run an ajax to retrieve select options from a callback function - * @uses action hooks: wp_ajax_nopriv_ultimatemember_ajax_select_options, wp_ajax_ultimatemember_ajax_select_options - * @return json - */ - add_action('wp_ajax_nopriv_ultimatemember_ajax_select_options', 'ultimatemember_ajax_select_options'); - add_action('wp_ajax_ultimatemember_ajax_select_options', 'ultimatemember_ajax_select_options'); - function ultimatemember_ajax_select_options() { - - global $ultimatemember; - - $arr_options = array(); - $arr_options['status'] = 'success'; - $arr_options['post'] = $_POST; - - $ultimatemember->fields->set_id = intval( $_POST['form_id'] ); - $ultimatemember->fields->set_mode = 'profile'; - $form_fields = $ultimatemember->fields->get_fields(); - $arr_options['fields'] = $form_fields; - - $debug = apply_filters('um_ajax_select_options__debug_mode', false ); - if( $debug ){ - $arr_options['debug'] = array( - $_POST, - $form_fields, - ); - } - - if( isset( $_POST['child_callback'] ) && ! empty( $_POST['child_callback'] ) && isset( $form_fields[ $_POST['child_name'] ] ) ){ - - $ajax_source_func = $_POST['child_callback']; - - // If the requested callback function is added in the form or added in the field option, execute it with call_user_func. - if( isset( $form_fields[ $_POST['child_name'] ]['custom_dropdown_options_source'] ) && - ! empty( $form_fields[ $_POST['child_name'] ]['custom_dropdown_options_source'] ) && - $form_fields[ $_POST['child_name'] ]['custom_dropdown_options_source'] == $ajax_source_func ){ - - $arr_options['field'] = $form_fields[ $_POST['child_name'] ]; - if( function_exists( $ajax_source_func ) ){ - $arr_options['items'] = call_user_func( $ajax_source_func ); - } - - }else{ - $arr_options['status'] = 'error'; - $arr_options['message'] = __( 'This is not possible for security reasons.','ultimate-member'); - } - - } - - wp_send_json( $arr_options ); - } diff --git a/core/um-actions-register.php b/core/um-actions-register.php deleted file mode 100644 index 0a56f7db..00000000 --- a/core/um-actions-register.php +++ /dev/null @@ -1,370 +0,0 @@ -user->approve(); - } - - /** - * Account needs email validation - */ - add_action('um_post_registration_checkmail_hook', 'um_post_registration_checkmail_hook', 10, 2); - function um_post_registration_checkmail_hook($user_id, $args){ - global $ultimatemember; - - um_fetch_user( $user_id ); - - $ultimatemember->user->email_pending(); - } - - /** - * Account needs admin review - */ - add_action('um_post_registration_pending_hook', 'um_post_registration_pending_hook', 10, 2); - function um_post_registration_pending_hook($user_id, $args){ - global $ultimatemember; - - um_fetch_user( $user_id ); - - $ultimatemember->user->pending(); - - } - - /** - * Add user to wordpress - */ - add_action('um_add_user_frontend', 'um_add_user_frontend', 10); - function um_add_user_frontend($args){ - global $ultimatemember; - - unset( $args['user_id'] ); - - extract($args); - - - if ( isset( $username ) && !isset($args['user_login']) ) { - $user_login = $username; - } - - if ( ! empty( $first_name ) && ! empty( $last_name ) && ! isset( $user_login ) ) { - - if ( um_get_option('permalink_base') == 'name' ) { - $user_login = rawurlencode( strtolower( str_replace(" ",".",$first_name." ".$last_name ) ) ); - }else if ( um_get_option('permalink_base') == 'name_dash' ) { - $user_login = rawurlencode( strtolower( str_replace(" ","-",$first_name." ".$last_name ) ) ); - }else if ( um_get_option('permalink_base') == 'name_plus' ) { - $user_login = strtolower( str_replace(" ","+",$first_name." ".$last_name ) ); - }else{ - $user_login = strtolower( str_replace(" ","",$first_name." ".$last_name ) ); - } - - // if full name exists - $count = 1; - while( username_exists( $user_login ) ) { - $user_login .= $count; - $count++; - } - } - - if( !isset( $user_login ) && isset( $user_email ) && $user_email ) - { - $user_login = $user_email; - } - - $unique_userID = $ultimatemember->query->count_users() + 1; - - if ( ! isset( $user_login ) || strlen( $user_login ) > 30 && ! is_email( $user_login ) ) { - $user_login = 'user' . $unique_userID; - } - - if ( isset( $username ) && is_email( $username ) ) { - $user_email = $username; - } - - if ( ! isset( $user_password ) ){ - $user_password = $ultimatemember->validation->generate( 8 ); - } - - - if( ! isset( $user_email ) ) { - $site_url = @$_SERVER['SERVER_NAME']; - $user_email = 'nobody' . $unique_userID . '@' . $site_url; - $user_email = apply_filters("um_user_register_submitted__email", $user_email ); - } - - - $creds['user_login'] = $user_login; - $creds['user_password'] = $user_password; - $creds['user_email'] = trim( $user_email ); - - $args = apply_filters('um_add_user_frontend_submitted', $args ); - - $args['submitted'] = array_merge( $args['submitted'], $creds); - $args = array_merge($args, $creds); - - unset( $args['user_id'] ); - - - do_action('um_before_new_user_register', $args); - - $user_id = wp_create_user( $user_login, $user_password, $user_email ); - - do_action('um_after_new_user_register', $user_id, $args); - - return $user_id; - } - - /** - * After adding a new user - */ - add_action('um_after_new_user_register', 'um_after_new_user_register', 10, 2); - function um_after_new_user_register( $user_id, $args ){ - global $ultimatemember, $pagenow; - extract( $args ); - - um_fetch_user( $user_id ); - - if ( !isset( $args['role'] ) ) { - $role = um_get_option('default_role'); - } - - if ( $pagenow != 'user-new.php' && !array_key_exists( $role, $ultimatemember->query->get_roles( false, array('admin') ) ) ) { - $role = um_get_option('default_role'); - } - - $ultimatemember->user->set_role( $role ); - - $ultimatemember->user->set_registration_details( $args['submitted'] ); - - $ultimatemember->user->set_last_login(); - - do_action('um_new_user_registration_plain'); - - do_action('um_post_registration_save', $user_id, $args); - - do_action('um_post_registration_listener', $user_id, $args); - - do_action('um_update_profile_full_name', $args ); - - do_action('um_post_registration', $user_id, $args); - - if( ! is_admin() ){ - do_action('user_register', $user_id ); - } - - } - - /** - * Update user's profile after registration - */ - add_action('um_post_registration_save', 'um_post_registration_save', 10, 2); - function um_post_registration_save( $user_id, $args ){ - global $ultimatemember; - - unset( $args['user_id'] ); - $args['_user_id'] = $user_id; - $args['is_signup'] = 1; - - do_action('um_user_edit_profile', $args); - - } - - /** - * Post-registration admin listener - */ - add_action('um_post_registration_listener', 'um_post_registration_listener', 10, 2); - function um_post_registration_listener( $user_id, $args ){ - global $ultimatemember; - - if ( um_user('status') != 'pending' ) { - $ultimatemember->mail->send( um_admin_email(), 'notification_new_user', array('admin' => true ) ); - } else { - $ultimatemember->mail->send( um_admin_email(), 'notification_review', array('admin' => true ) ); - } - - } - - /** - * Post-registration procedure - */ - add_action('um_post_registration', 'um_post_registration', 10, 2); - function um_post_registration( $user_id, $args ){ - global $ultimatemember; - unset( $args['user_id'] ); - extract($args); - - $status = um_user('status'); - - do_action("um_post_registration_global_hook", $user_id, $args); - - do_action("um_post_registration_{$status}_hook", $user_id, $args); - - if ( !is_admin() ) { - - do_action("track_{$status}_user_registration"); - - // Priority redirect - if ( isset( $args['redirect_to'] ) ) { - exit( wp_redirect( urldecode( $args['redirect_to'] ) ) ); - } - - if ( $status == 'approved' ) { - - $ultimatemember->user->auto_login( $user_id ); - $ultimatemember->permalinks->profile_url( true ); - - do_action('um_registration_after_auto_login', $user_id ); - - if ( um_user('auto_approve_act') == 'redirect_url' && um_user('auto_approve_url') !== '' ){ - exit( wp_redirect( um_user('auto_approve_url') ) ); - } - if ( um_user('auto_approve_act') == 'redirect_profile' ){ - exit( wp_redirect( um_user_profile_url() ) ); - } - - } - - if ( $status != 'approved' ) { - - if ( um_user( $status . '_action' ) == 'redirect_url' && um_user( $status . '_url' ) != '' ) { - exit( wp_redirect( um_user( $status . '_url' ) ) ); - } - - if ( um_user( $status . '_action' ) == 'show_message' && um_user( $status . '_message' ) != '' ) { - - $role_id = $ultimatemember->user->get_role_name( um_user('role'), true ); - $url = $ultimatemember->permalinks->get_current_url(); - $url = add_query_arg( 'message', esc_attr( $status ), $url ); - $url = add_query_arg( 'um_role', esc_attr( $role_id ), $url ); - $url = add_query_arg( 'um_form_id', esc_attr( $form_id ), $url ); - - exit( wp_redirect( $url ) ); - } - - } - - } - - } - - /** - * New user registration - */ - add_action('um_user_registration', 'um_user_registration', 10); - function um_user_registration($args){ - global $ultimatemember; - - unset( $args['user_id'] ); - do_action('um_add_user_frontend', $args); - - } - - /** - * Form Processing - */ - add_action('um_submit_form_register', 'um_submit_form_register', 10); - function um_submit_form_register($args){ - global $ultimatemember; - - if ( !isset($ultimatemember->form->errors) ) do_action('um_user_registration', $args); - - do_action('um_user_registration_extra_hook', $args ); - - } - - /** - * Register user with predefined role in options - */ - add_action('um_after_register_fields', 'um_add_user_role'); - function um_add_user_role( $args ){ - - global $ultimatemember; - - if ( isset( $args['custom_fields']['role_select'] ) || isset( $args['custom_fields']['role_radio'] ) ) return; - - $use_global_settings = get_post_meta( $args['form_id'], '_um_register_use_globals', true); - - if (isset($args['role']) && !empty($args['role']) && $use_global_settings == 0 ) { - $role = $args['role']; - } else if( $use_global_settings == 1 ) { - $role = um_get_option('default_role'); - } - - if( empty( $role ) ) return; - - $role = apply_filters('um_register_hidden_role_field', $role ); - if( $role ){ - echo ''; - } - - } - - /** - * Show the submit button - */ - add_action('um_after_register_fields', 'um_add_submit_button_to_register', 1000); - function um_add_submit_button_to_register($args){ - global $ultimatemember; - - // DO NOT add when reviewing user's details - if ( isset( $ultimatemember->user->preview ) && $ultimatemember->user->preview == true && is_admin() ) return; - - $primary_btn_word = $args['primary_btn_word']; - $primary_btn_word = apply_filters('um_register_form_button_one', $primary_btn_word, $args ); - - $secondary_btn_word = $args['secondary_btn_word']; - $secondary_btn_word = apply_filters('um_register_form_button_two', $secondary_btn_word, $args ); - - $secondary_btn_url = ( isset( $args['secondary_btn_url'] ) && $args['secondary_btn_url'] ) ? $args['secondary_btn_url'] : um_get_core_page('login'); - $secondary_btn_url = apply_filters('um_register_form_button_two_url', $secondary_btn_url, $args ); - - ?> - -
            - - - -
            -
            - - - -
            - - - -
            - -
            - - fields->display( 'register', $args ); - - } - - /** - * Set user gravatar with user_email - */ - add_action('user_register','um_user_register_generate_gravatar'); - function um_user_register_generate_gravatar( $user_id ){ - global $ultimatemember; - - $ultimatemember->user->set_gravatar( $user_id ); - - } diff --git a/core/um-api.php b/core/um-api.php deleted file mode 100644 index cf6dbdc3..00000000 --- a/core/um-api.php +++ /dev/null @@ -1,870 +0,0 @@ -pretty_print = defined( 'JSON_PRETTY_PRINT' ) ? JSON_PRETTY_PRINT : null; - - // Allow API request logging to be turned off - $this->log_requests = apply_filters( 'um_api_log_requests', $this->log_requests ); - - } - - /** - * Registers a new rewrite endpoint for accessing the API - */ - public function add_endpoint( $rewrite_rules ) { - add_rewrite_endpoint( 'um-api', EP_ALL ); - } - - /** - * Registers query vars for API access - */ - public function query_vars( $vars ) { - - $vars[] = 'key'; - $vars[] = 'token'; - $vars[] = 'format'; - $vars[] = 'query'; - $vars[] = 'type'; - $vars[] = 'data'; - $vars[] = 'fields'; - $vars[] = 'value'; - $vars[] = 'number'; - $vars[] = 'id'; - $vars[] = 'email'; - $vars[] = 'orderby'; - $vars[] = 'order'; - $vars[] = 'include'; - $vars[] = 'exclude'; - - $this->vars = $vars; - - return $vars; - } - - /** - * Validate the API request - */ - private function validate_request() { - global $wp_query; - - $this->override = false; - - // Make sure we have both user and api key - if ( ! empty( $wp_query->query_vars['um-api'] ) ) { - - if ( empty( $wp_query->query_vars['token'] ) || empty( $wp_query->query_vars['key'] ) ) - $this->missing_auth(); - - // Retrieve the user by public API key and ensure they exist - if ( ! ( $user = $this->get_user( $wp_query->query_vars['key'] ) ) ) : - $this->invalid_key(); - else : - $token = urldecode( $wp_query->query_vars['token'] ); - $secret = get_user_meta( $user, 'um_user_secret_key', true ); - $public = urldecode( $wp_query->query_vars['key'] ); - - if ( hash_equals( md5( $secret . $public ), $token ) ) - $this->is_valid_request = true; - else - $this->invalid_auth(); - endif; - } - } - - /** - * Retrieve the user ID based on the public key provided - */ - public function get_user( $key = '' ) { - global $wpdb, $wp_query; - - if( empty( $key ) ) - $key = urldecode( $wp_query->query_vars['key'] ); - - if ( empty( $key ) ) { - return false; - } - - $user = get_transient( md5( 'um_api_user_' . $key ) ); - - if ( false === $user ) { - $user = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'um_user_public_key' AND meta_value = %s LIMIT 1", $key ) ); - set_transient( md5( 'um_api_user_' . $key ) , $user, DAY_IN_SECONDS ); - } - - if ( $user != NULL ) { - $this->user_id = $user; - return $user; - } - - return false; - } - - /** - * Displays a missing authentication error if all the parameters aren't - * provided - */ - private function missing_auth() { - $error = array(); - $error['error'] = __( 'You must specify both a token and API key!', 'ultimate-member'); - - $this->data = $error; - $this->output( 401 ); - } - - /** - * Displays an authentication failed error if the user failed to provide valid credentials - */ - private function invalid_auth() { - $error = array(); - $error['error'] = __( 'Your request could not be authenticated', 'ultimate-member'); - - $this->data = $error; - $this->output( 401 ); - } - - /** - * Displays an invalid API key error if the API key provided couldn't be validated - */ - private function invalid_key() { - $error = array(); - $error['error'] = __( 'Invalid API key', 'ultimate-member'); - - $this->data = $error; - $this->output( 401 ); - } - - - /** - * Listens for the API and then processes the API requests - */ - public function process_query() { - global $wp_query; - - // Check for um-api var. Get out if not present - if ( ! isset( $wp_query->query_vars['um-api'] ) ) - return; - - // Check for a valid user and set errors if necessary - $this->validate_request(); - - // Only proceed if no errors have been noted - if( ! $this->is_valid_request ) - return; - - if( ! defined( 'UM_DOING_API' ) ) { - define( 'UM_DOING_API', true ); - } - - // Determine the kind of query - $query_mode = $this->get_query_mode(); - foreach( $this->vars as $k ) { - $args[ $k ] = isset( $wp_query->query_vars[ $k ] ) ? $wp_query->query_vars[ $k ] : null; - } - - $data = array(); - - switch( $query_mode ) : - - case 'get.stats': - $data = $this->get_stats( $args ); - break; - - case 'get.users': - $data = $this->get_users( $args ); - break; - - case 'get.user': - $data = $this->get_auser( $args ); - break; - - case 'update.user': - $data = $this->update_user( $args ); - break; - - case 'delete.user': - $data = $this->delete_user( $args ); - break; - - case 'get.following': - $data = $this->get_following( $args ); - break; - - case 'get.followers': - $data = $this->get_followers( $args ); - break; - - endswitch; - - // Allow extensions to setup their own return data - $this->data = apply_filters( 'um_api_output_data', $data, $query_mode, $this ); - - // Log this API request, if enabled. We log it here because we have access to errors. - $this->log_request( $this->data ); - - // Send out data to the output function - $this->output(); - } - - /** - * Get some stats - */ - public function get_stats( $args ) { - global $wpdb, $ultimatemember; - extract( $args ); - - $response = array(); - $error = array(); - - $query = "SELECT COUNT(*) FROM {$wpdb->prefix}users"; - $count = absint( $wpdb->get_var($query) ); - $response['stats']['total_users'] = $count; - - include_once um_path . 'admin/core/um-admin-dashboard.php'; - $pending = $um_dashboard->get_pending_users_count(); - $response['stats']['pending_users'] = absint( $pending ); - - if ( class_exists( 'UM_Notifications_API') ) { - $query = "SELECT COUNT(*) FROM {$wpdb->prefix}um_notifications"; - $total_notifications = absint( $wpdb->get_var( $query ) ); - $response['stats']['total_notifications'] = $total_notifications; - } - - if ( class_exists( 'UM_Messaging_API') ) { - $query = "SELECT COUNT(*) FROM {$wpdb->prefix}um_conversations"; - $total_conversations = absint( $wpdb->get_var( $query ) ); - $response['stats']['total_conversations'] = $total_conversations; - - $query = "SELECT COUNT(*) FROM {$wpdb->prefix}um_messages"; - $total_messages = absint( $wpdb->get_var( $query ) ); - $response['stats']['total_messages'] = $total_messages; - } - - if ( class_exists( 'UM_Online_API') ) { - global $um_online; - $total_online = count( $um_online->get_users() ); - $response['stats']['total_online'] = $total_online; - } - - if ( class_exists( 'UM_Reviews_API') ) { - $query = "SELECT COUNT(*) FROM {$wpdb->prefix}posts WHERE post_status='publish' AND post_type='um_review'"; - $total_reviews = absint( $wpdb->get_var( $query ) ); - $response['stats']['total_reviews'] = $total_reviews; - } - - return $response; - } - - /** - * Update user API query - */ - public function update_user( $args ) { - global $ultimatemember; - extract( $args ); - - $response = array(); - $error = array(); - - if ( !$id ) { - $error['error'] = __('You must provide a user ID','ultimate-member'); - return $error; - } - - if ( !$data ) { - $error['error'] = __('You need to provide data to update','ultimate-member'); - return $error; - } - - um_fetch_user( $id ); - - switch ( $data ) { - case 'status': - $ultimatemember->user->set_status( $value ); - $response['success'] = __('User status has been changed.','ultimate-member'); - break; - case 'role': - $ultimatemember->user->set_role( $value ); - $response['success'] = __('User level has been changed.','ultimate-member'); - break; - case 'wp_role': - $wp_user_object = new WP_User( $id ); - $wp_user_object->set_role( $value ); - $response['success'] = __('User WordPress role has been changed.','ultimate-member'); - break; - default: - update_user_meta( $id, $data, esc_attr( $value ) ); - $response['success'] = __('User meta has been changed.','ultimate-member'); - break; - } - - return $response; - } - - /** - * Process Get followers users API Request - */ - public function get_followers( $args ) { - global $ultimatemember; - extract( $args ); - - $response = array(); - $error = array(); - - if ( !$id ) { - $error['error'] = __('You must provide a user ID','ultimate-member'); - return $error; - } - - if ( class_exists( 'UM_Followers_API' ) ) { - global $um_followers; - $results = $um_followers->api->followers( $id ); - if ( !$results ) { - $error['error'] = __('No users were found','ultimate-member'); - return $error; - } - $response['followers']['count'] = $um_followers->api->count_followers_plain( $id ); - foreach( $results as $k => $v ) { - $user = get_userdata( $v['user_id2'] ); - $response['followers']['users'][$k]['ID'] = $v['user_id2']; - $response['followers']['users'][$k]['username'] = $user->user_login; - $response['followers']['users'][$k]['display_name'] = $user->display_name; - } - } else { - $error['error'] = __('Invalid request','ultimate-member'); - return $error; - } - - return $response; - } - - /** - * Process Get following users API Request - */ - public function get_following( $args ) { - global $ultimatemember; - extract( $args ); - - $response = array(); - $error = array(); - - if ( !$id ) { - $error['error'] = __('You must provide a user ID','ultimate-member'); - return $error; - } - - if ( class_exists( 'UM_Followers_API' ) ) { - global $um_followers; - $results = $um_followers->api->following( $id ); - if ( !$results ) { - $error['error'] = __('No users were found','ultimate-member'); - return $error; - } - $response['following']['count'] = $um_followers->api->count_following_plain( $id ); - foreach( $results as $k => $v ) { - $user = get_userdata( $v['user_id1'] ); - $response['following']['users'][$k]['ID'] = $v['user_id1']; - $response['following']['users'][$k]['username'] = $user->user_login; - $response['following']['users'][$k]['display_name'] = $user->display_name; - } - } else { - $error['error'] = __('Invalid request','ultimate-member'); - return $error; - } - - return $response; - } - - /** - * Process Get users API Request - */ - public function get_users( $args ) { - global $ultimatemember; - extract( $args ); - - $response = array(); - $error = array(); - - if ( !$number ) - $number = 10; - - if ( !$orderby ) - $orderby = 'user_registered'; - - if ( !$order ) - $order = 'desc'; - - $loop_a = array('number' => $number, 'orderby' => $orderby, 'order' => $order ); - - if ( $include ) { - $include = explode(',', $include ); - $loop_a['include'] = $include; - } - - if ( $exclude ) { - $exclude = explode(',', $exclude ); - $loop_a['exclude'] = $exclude; - } - - $loop = get_users( $loop_a ); - - foreach( $loop as $user ) { - - unset( $user->data->user_status ); - unset( $user->data->user_activation_key ); - unset( $user->data->user_pass ); - - um_fetch_user( $user->ID ); - - foreach( $user as $key => $val ) { - if ( $key != 'data' ) continue; - if ( $key == 'data' ) { - $key = 'profile'; - $val->roles = $user->roles; - $val->first_name = um_user('first_name'); - $val->last_name = um_user('last_name'); - $val->community_role = um_user('role'); - $val->account_status = um_user('account_status'); - $val->profile_pic_original = $this->getsrc( um_user('profile_photo', 'original') ); - $val->profile_pic_normal = $this->getsrc( um_user('profile_photo', 200) ); - $val->profile_pic_small = $this->getsrc( um_user('profile_photo', 40) ); - $val->cover_photo = $this->getsrc( um_user('cover_photo', 1000) ); - - if ( class_exists('UM_Followers_API') ) { - global $um_followers; - $val->followers_count = $um_followers->api->count_followers_plain( $user->ID ); - $val->following_count = $um_followers->api->count_following_plain( $user->ID ); - } - - } - $response[ $user->ID ] = $val; - } - - } - - return $response; - } - - /** - * Process delete user via API - */ - public function delete_user( $args ) { - global $ultimatemember; - extract( $args ); - - $response = array(); - $error = array(); - - if ( !isset( $id ) ) { - $error['error'] = __('You must provide a user ID','ultimate-member'); - return $error; - } - - $user = get_userdata( $id ); - if ( !$user ) { - $error['error'] = __('Invalid user specified','ultimate-member'); - return $error; - } - - um_fetch_user( $id ); - $ultimatemember->user->delete(); - - $response['success'] = __('User has been successfully deleted.','ultimate-member'); - - return $response; - } - - /** - * Process Get user API Request - */ - public function get_auser( $args ) { - global $ultimatemember; - extract( $args ); - - $response = array(); - $error = array(); - - if ( !isset( $id ) ) { - $error['error'] = __('You must provide a user ID','ultimate-member'); - return $error; - } - - $user = get_userdata( $id ); - if ( !$user ) { - $error['error'] = __('Invalid user specified','ultimate-member'); - return $error; - } - - unset( $user->data->user_status ); - unset( $user->data->user_activation_key ); - unset( $user->data->user_pass ); - - um_fetch_user( $user->ID ); - - if ( isset( $fields ) && $fields ) { - $fields = explode(',', $fields ); - $response['ID'] = $user->ID; - $response['username'] = $user->user_login; - foreach( $fields as $field ) { - - switch( $field ) { - - default: - $response[$field] = ( um_profile( $field ) ) ? um_profile( $field ) : ''; - break; - - case 'mycred_points': - $response['mycred_points'] = number_format( (int)get_user_meta( $user->ID, 'mycred_default', true ), 2 ); - break; - - case 'cover_photo': - $response['cover_photo'] = $this->getsrc( um_user('cover_photo', 1000) ); - break; - - case 'profile_pic': - $response['profile_pic_original'] = $this->getsrc( um_user('profile_photo', 'original') ); - $response['profile_pic_normal'] = $this->getsrc( um_user('profile_photo', 200) ); - $response['profile_pic_small'] = $this->getsrc( um_user('profile_photo', 40) ); - break; - - case 'status': - $response['status'] = um_user('account_status'); - break; - - case 'role': - $response['role'] = um_user('role'); - break; - - case 'email': - case 'user_email': - $response['email'] = um_user('user_email'); - break; - - case 'followers': - if ( class_exists('UM_Followers_API') ) { - global $um_followers; - $response['followers_count'] = $um_followers->api->count_followers_plain( $user->ID ); - $response['following_count'] = $um_followers->api->count_following_plain( $user->ID ); - } - break; - - } - - } - } else { - - foreach( $user as $key => $val ) { - if ( $key != 'data' ) continue; - if ( $key == 'data' ) { - $key = 'profile'; - $val->roles = $user->roles; - $val->first_name = um_user('first_name'); - $val->last_name = um_user('last_name'); - $val->community_role = um_user('role'); - $val->account_status = um_user('account_status'); - $val->profile_pic_original = $this->getsrc( um_user('profile_photo', 'original') ); - $val->profile_pic_normal = $this->getsrc( um_user('profile_photo', 200) ); - $val->profile_pic_small = $this->getsrc( um_user('profile_photo', 40) ); - $val->cover_photo = $this->getsrc( um_user('cover_photo', 1000) ); - - if ( class_exists('UM_Followers_API') ) { - global $um_followers; - $val->followers_count = $um_followers->api->count_followers_plain( $user->ID ); - $val->following_count = $um_followers->api->count_following_plain( $user->ID ); - } - - } - $response = $val; - } - - } - - return $response; - } - - /** - * Get source - */ - public function getsrc( $image ) { - if (preg_match('/query_vars['um-api'] ) ? $wp_query->query_vars['um-api'] : null; - $error = array(); - // Make sure our query is valid - if ( ! in_array( $query, $accepted ) ) { - $error['error'] = __( 'Invalid query!', 'ultimate-member'); - - $this->data = $error; - $this->output(); - } - - return $query; - } - - /** - * Get page number - */ - public function get_paged() { - global $wp_query; - - return isset( $wp_query->query_vars['page'] ) ? $wp_query->query_vars['page'] : 1; - } - - /** - * Retrieve the output format - */ - public function get_output_format() { - global $wp_query; - - $format = isset( $wp_query->query_vars['format'] ) ? $wp_query->query_vars['format'] : 'json'; - - return apply_filters( 'um_api_output_format', $format ); - } - - /** - * Log each API request, if enabled - */ - private function log_request( $data = array() ) { - if ( ! $this->log_requests ) - return; - - } - - - /** - * Retrieve the output data - */ - public function get_output() { - return $this->data; - } - - /** - * Output Query in either JSON/XML. The query data is outputted as JSON - * by default - */ - public function output( $status_code = 200 ) { - global $wp_query; - - $format = $this->get_output_format(); - - status_header( $status_code ); - - do_action( 'um_api_output_before', $this->data, $this, $format ); - - switch ( $format ) : - - case 'xml' : - - require_once um_path . 'core/lib/array2xml.php'; - $xml = Array2XML::createXML( 'um', $this->data ); - echo $xml->saveXML(); - - break; - - case 'json' : - case '' : - - header( 'Content-Type: application/json' ); - if ( ! empty( $this->pretty_print ) ) - echo json_encode( $this->data, $this->pretty_print ); - else - echo json_encode( $this->data ); - - break; - - - default : - - // Allow other formats to be added via extensions - do_action( 'um_api_output_' . $format, $this->data, $this ); - - break; - - endswitch; - - do_action( 'um_api_output_after', $this->data, $this, $format ); - - die(); - } - - /** - * Modify User Profile - */ - function user_key_field( $user ) { - - if( ! isset( $user->ID ) ) return; - - if ( current_user_can( 'edit_users' ) && current_user_can( 'edit_user', $user->ID ) ) { - $user = get_userdata( $user->ID ); - ?> -
            '; - - // delete the tr afterwards - ?> - - parent->args['dev_mode'] ) { - wp_enqueue_style( - 'redux-field-section-css', - ReduxFramework::$_url . 'inc/fields/section/field_section.css', - array(), - time(), - 'all' - ); - } - } - } - } \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/section/field_section.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/section/field_section.scss deleted file mode 100755 index 2a70c87e..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/section/field_section.scss +++ /dev/null @@ -1,24 +0,0 @@ -.redux-main { - .form-table-section-indented { - width: 95%; - margin-left: 5%; - } - - .form-table-section tr:first-of-type th:first-of-type { - padding: 0px !important; - } - - h3 { - margin-top: 10px; - } - - .form-table-section-indented > tbody > tr{ - &:first-child { - display: none; - } - - &:nth-last-child(2) { - border-bottom: 0; - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/elusive-icons.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/elusive-icons.php deleted file mode 100755 index a10d6761..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/elusive-icons.php +++ /dev/null @@ -1,312 +0,0 @@ - 0 ) { - var select2_params = $( this ).siblings( '.select2_params' ).val(); - select2_params = JSON.parse( select2_params ); - default_params = $.extend( {}, default_params, select2_params ); - } - - if ( $( this ).hasClass( 'font-icons' ) ) { - default_params = $.extend( - {}, { - formatResult: redux.field_objects.select.addIcon, - formatSelection: redux.field_objects.select.addIcon, - escapeMarkup: function( m ) { - return m; - } - }, default_params - ); - } - - $( this ).select2( default_params ); - - if ( $( this ).hasClass( 'select2-sortable' ) ) { - default_params = {}; - default_params.bindOrder = 'sortableStop'; - default_params.sortableOptions = {placeholder: 'ui-state-highlight'}; - $( this ).select2Sortable( default_params ); - } - - $( this ).on( - "change", function() { - redux_change( $( $( this ) ) ); - $( this ).select2SortableOrder(); - } - ); - } - ); - } - ); - }; - - redux.field_objects.select.addIcon = function( icon ) { - if ( icon.hasOwnProperty( 'id' ) ) { - return "" + "  " + icon.text + ""; - } - }; -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/field_select.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/field_select.min.js deleted file mode 100755 index ed53d030..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/field_select.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.select=redux.field_objects.select||{},redux.field_objects.select.init=function(b){b||(b=a(document).find(".redux-container-select:visible")),a(b).each(function(){var b=a(this),c=b;b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),c.is(":hidden")||c.hasClass("redux-field-init")&&(c.removeClass("redux-field-init"),b.find("select.redux-select-item").each(function(){var b={width:"resolve",triggerChange:!0,allowClear:!0};if("multiple"==a(this).attr("multiple")&&(b.width="100%"),a(this).siblings(".select2_params").size()>0){var c=a(this).siblings(".select2_params").val();c=JSON.parse(c),b=a.extend({},b,c)}a(this).hasClass("font-icons")&&(b=a.extend({},{formatResult:redux.field_objects.select.addIcon,formatSelection:redux.field_objects.select.addIcon,escapeMarkup:function(a){return a}},b)),a(this).select2(b),a(this).hasClass("select2-sortable")&&(b={},b.bindOrder="sortableStop",b.sortableOptions={placeholder:"ui-state-highlight"},a(this).select2Sortable(b)),a(this).on("change",function(){redux_change(a(a(this))),a(this).select2SortableOrder()})}))})},redux.field_objects.select.addIcon=function(a){return a.hasOwnProperty("id")?"  "+a.text+"":void 0}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/field_select.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/field_select.php deleted file mode 100755 index 6d3f7aea..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/field_select.php +++ /dev/null @@ -1,180 +0,0 @@ -parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since ReduxFramework 1.0.0 - */ - public function render() { - $sortable = ( isset( $this->field['sortable'] ) && $this->field['sortable'] ) ? ' select2-sortable"' : ""; - - if ( ! empty( $sortable ) ) { // Dummy proofing :P - $this->field['multi'] = true; - } - - if ( ! empty( $this->field['data'] ) && empty( $this->field['options'] ) ) { - if ( empty( $this->field['args'] ) ) { - $this->field['args'] = array(); - } - - if ( $this->field['data'] == "elusive-icons" || $this->field['data'] == "elusive-icon" || $this->field['data'] == "elusive" ) { - $icons_file = ReduxFramework::$_dir . 'inc/fields/select/elusive-icons.php'; - /** - * filter 'redux-font-icons-file}' - * - * @param array $icon_file File for the icons - */ - $icons_file = apply_filters( 'redux-font-icons-file', $icons_file ); - - /** - * filter 'redux/{opt_name}/field/font/icons/file' - * - * @param array $icon_file File for the icons - */ - $icons_file = apply_filters( "redux/{$this->parent->args['opt_name']}/field/font/icons/file", $icons_file ); - if ( file_exists( $icons_file ) ) { - require_once $icons_file; - } - } - - $this->field['options'] = $this->parent->get_wordpress_data( $this->field['data'], $this->field['args'] ); - } - - if ( ! empty( $this->field['data'] ) && ( $this->field['data'] == "elusive-icons" || $this->field['data'] == "elusive-icon" || $this->field['data'] == "elusive" ) ) { - $this->field['class'] .= " font-icons"; - } - //if - - if ( ! empty( $this->field['options'] ) ) { - $multi = ( isset( $this->field['multi'] ) && $this->field['multi'] ) ? ' multiple="multiple"' : ""; - - if ( ! empty( $this->field['width'] ) ) { - $width = ' style="' . $this->field['width'] . '"'; - } else { - $width = ' style="width: 40%;"'; - } - - $nameBrackets = ""; - if ( ! empty( $multi ) ) { - $nameBrackets = "[]"; - } - - $placeholder = ( isset( $this->field['placeholder'] ) ) ? esc_attr( $this->field['placeholder'] ) : __( 'Select an item', 'redux-framework' ); - - if ( isset( $this->field['select2'] ) ) { // if there are any let's pass them to js - $select2_params = json_encode( $this->field['select2'] ); - $select2_params = htmlspecialchars( $select2_params, ENT_QUOTES ); - - echo ''; - } - - if ( isset( $this->field['multi'] ) && $this->field['multi'] && isset( $this->field['sortable'] ) && $this->field['sortable'] && ! empty( $this->value ) && is_array( $this->value ) ) { - $origOption = $this->field['options']; - $this->field['options'] = array(); - - foreach ( $this->value as $value ) { - $this->field['options'][ $value ] = $origOption[ $value ]; - } - - if ( count( $this->field['options'] ) < count( $origOption ) ) { - foreach ( $origOption as $key => $value ) { - if ( ! in_array( $key, $this->field['options'] ) ) { - $this->field['options'][ $key ] = $value; - } - } - } - } - - $sortable = ( isset( $this->field['sortable'] ) && $this->field['sortable'] ) ? ' select2-sortable"' : ""; - - echo ''; - } else { - echo '' . __( 'No items of this type were found.', 'redux-framework' ) . ''; - } - } //function - - private function make_option($id, $value, $group_name = '') { - if ( is_array( $this->value ) ) { - $selected = ( is_array( $this->value ) && in_array( $id, $this->value ) ) ? ' selected="selected"' : ''; - } else { - $selected = selected( $this->value, $id, false ); - } - - echo ''; - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since ReduxFramework 1.0.0 - */ - public function enqueue() { - wp_enqueue_style( 'select2-css' ); - - if (isset($this->field['sortable']) && $this->field['sortable']) { - wp_enqueue_script('jquery-ui-sortable'); - } - - wp_enqueue_script( - 'redux-field-select-js', - ReduxFramework::$_url . 'inc/fields/select/field_select' . Redux_Functions::isMin() . '.js', - array( 'jquery', 'select2-js', 'redux-js' ), - time(), - true - ); - - if ($this->parent->args['dev_mode']) { - wp_enqueue_style( - 'redux-field-select-css', - ReduxFramework::$_url . 'inc/fields/select/field_select.css', - array(), - time(), - 'all' - ); - } - } //function - } //class -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/field_select.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/field_select.scss deleted file mode 100755 index 066386e7..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select/field_select.scss +++ /dev/null @@ -1,9 +0,0 @@ -.redux-container-select { - li.ui-state-highlight { - height: 20px; - margin-top: 2px; - margin-left: 5px; - width: 64px; - margin-bottom: 0; - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.css deleted file mode 100755 index b4a9459c..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.css +++ /dev/null @@ -1 +0,0 @@ -.redux-container-select_image{margin-top:2px;margin-left:5px;width:100%;margin-bottom:0}.redux-preview-image{max-height:250px;max-width:250px;padding:5px;margin-top:10px;border:1px solid #e3e3e3;background:#f7f7f7;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.js deleted file mode 100755 index 296f41ec..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.js +++ /dev/null @@ -1,72 +0,0 @@ -/*global redux_change, redux*/ - -(function( $ ) { - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.select_image = redux.field_objects.select_image || {}; - - $( document ).ready( - function() { - //redux.field_objects.select_image.init(); - } - ); - - redux.field_objects.select_image.init = function( selector ) { - - if ( !selector ) { - selector = $( document ).find( ".redux-group-tab:visible" ).find( '.redux-container-select_image:visible' ); - } - - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - var default_params = { - width: 'resolve', - triggerChange: true, - allowClear: true - }; - - var select2_handle = el.find( '.redux-container-select_image' ).find( '.select2_params' ); - - if ( select2_handle.size() > 0 ) { - var select2_params = select2_handle.val(); - - select2_params = JSON.parse( select2_params ); - default_params = $.extend( {}, default_params, select2_params ); - } - - el.find( 'select.redux-select-images' ).select2( default_params ); - - el.find( '.redux-select-images' ).on( - 'change', function() { - var preview = $( this ).parents( '.redux-field:first' ).find( '.redux-preview-image' ); - - if ( $( this ).val() === "" ) { - preview.fadeOut( - 'medium', function() { - preview.attr( 'src', '' ); - } - ); - } else { - preview.attr( 'src', $( this ).val() ); - preview.fadeIn().css( 'visibility', 'visible' ); - } - } - ); - } - ); - }; -})( jQuery ); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.min.js deleted file mode 100755 index 613a6d88..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.select_image=redux.field_objects.select_image||{},a(document).ready(function(){}),redux.field_objects.select_image.init=function(b){b||(b=a(document).find(".redux-group-tab:visible").find(".redux-container-select_image:visible")),a(b).each(function(){var b=a(this),c=b;if(b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),!c.is(":hidden")&&c.hasClass("redux-field-init")){c.removeClass("redux-field-init");var d={width:"resolve",triggerChange:!0,allowClear:!0},e=b.find(".redux-container-select_image").find(".select2_params");if(e.size()>0){var f=e.val();f=JSON.parse(f),d=a.extend({},d,f)}b.find("select.redux-select-images").select2(d),b.find(".redux-select-images").on("change",function(){var b=a(this).parents(".redux-field:first").find(".redux-preview-image");""===a(this).val()?b.fadeOut("medium",function(){b.attr("src","")}):(b.attr("src",a(this).val()),b.fadeIn().css("visibility","visible"))})}})}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.php deleted file mode 100755 index 4f7c2eaa..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.php +++ /dev/null @@ -1,176 +0,0 @@ - - */ - -// Exit if accessed directly -if ( ! defined( 'ABSPATH' ) ) { - exit; -} - -if ( ! class_exists( 'ReduxFramework_select_image' ) ) { - class ReduxFramework_select_image { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since ReduxFramework 1.0.0 - */ - function __construct( $field = array(), $value = '', $parent ) { - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - } - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since ReduxFramework 1.0.0 - */ - function render() { - - // If options is NOT empty, the process - if ( ! empty( $this->field['options'] ) ) { - - // Strip off the file ext - if ( isset( $this->value ) ) { - $name = explode( ".", $this->value ); - $name = str_replace( '.' . end( $name ), '', $this->value ); - $name = basename( $name ); - //$this->value = trim( $name ); - $filename = trim($name); - } - - // beancounter - $x = 1; - - // Process width - if ( ! empty( $this->field['width'] ) ) { - $width = ' style="width:' . $this->field['width'] . ';"'; - } else { - $width = ' style="width: 40%;"'; - } - - // Process placeholder - $placeholder = ( isset( $this->field['placeholder'] ) ) ? esc_attr( $this->field['placeholder'] ) : __( 'Select an item', 'redux-framework' ); - - if ( isset( $this->field['select2'] ) ) { // if there are any let's pass them to js - $select2_params = json_encode( $this->field['select2'] ); - $select2_params = htmlspecialchars( $select2_params, ENT_QUOTES ); - - echo ''; - } - - // Begin the '; - echo ''; - - - // Enum through the options array - foreach ( $this->field['options'] as $k => $v ) { - - // No array? No problem! - if ( ! is_array( $v ) ) { - $v = array( 'img' => $v ); - } - - // No title set? Make it blank. - if ( ! isset( $v['title'] ) ) { - $v['title'] = ''; - } - - // No alt? Set it to title. We do this so the alt tag shows - // something. It also makes HTML/SEO purists happy. - if ( ! isset( $v['alt'] ) ) { - $v['alt'] = $v['title']; - } - - // Set the selected entry - $selected = selected( $this->value, $v['img'], false ); - - // If selected returns something other than a blank space, we - // found our default/saved name. Save the array number in a - // variable to use later on when we want to extract its associted - // url. - if ( '' != $selected ) { - $arrNum = $x; - } - - // Add the option tag, with values. - echo ''; - - // Add a bean - $x ++; - } - - // Close the '; - - // Some space - echo '

            '; - - // Show the preview image. - echo '
            '; - - // just in case. You never know. - if ( ! isset( $arrNum ) ) { - $this->value = ''; - } - - // Set the default image. To get the url from the default name, - // we save the array count from the for/each loop, when the default image - // is mark as selected. Since the for/each loop starts at one, we must - // substract one from the saved array number. We then pull the url - // out of the options array, and there we go. - if ( '' == $this->value ) { - echo ''; - } else { - echo ''; - } - - // Close the
            tag. - echo '
            '; - } else { - - // No options specified. Really? - echo '' . __( 'No items of this type were found.', 'redux-framework' ) . ''; - } - } //function - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since ReduxFramework 1.0.0 - */ - function enqueue() { - wp_enqueue_style( 'select2-css' ); - - wp_enqueue_script( - 'field-select-image-js', - ReduxFramework::$_url . 'inc/fields/select_image/field_select_image' . Redux_Functions::isMin() . '.js', - array('jquery', 'select2-js', 'redux-js'), - time(), - true - ); - - if ($this->parent->args['dev_mode']) { - wp_enqueue_style( - 'redux-field-select-image-css', - ReduxFramework::$_url . 'inc/fields/select_image/field_select_image.css', - array(), - time(), - 'all' - ); - } - } //function - } //class -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.scss deleted file mode 100755 index 97e85972..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/select_image/field_select_image.scss +++ /dev/null @@ -1,19 +0,0 @@ -.redux-container-select_image { - margin-top: 2px; - margin-left: 5px; - width: 100%; - margin-bottom: 0; -} - -.redux-preview-image { - max-height: 250px; - max-width: 250px; - padding: 5px; - margin-top: 10px; - border: 1px solid #e3e3e3; - background: #f7f7f7; - -moz-border-radius: 3px; - -khtml-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.css deleted file mode 100755 index 6991456f..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.css +++ /dev/null @@ -1 +0,0 @@ -.redux-container-slider .redux-slider-container{margin-left:25px;margin-right:25px;width:200px;display:inline-block;vertical-align:middle}.redux-container-slider .redux-slider-input,.redux-container-slider .redux-slider-select-one,.redux-container-slider .redux-slider-select-two{width:100px !important;text-align:center}.redux-container-slider .redux-slider-label{position:absolute;margin-left:-5px}.redux-container-slider .redux-slider-label-one{position:absolute;margin-left:-22px}.redux-container-slider .redux-slider-label-two{position:absolute;margin-top:-21px;margin-left:245px}@media screen and (max-width: 782px){.redux-container-slider input{display:inline-block !important}}@media screen and (max-width: 570px){.redux-container-slider{text-align:center}.redux-container-slider input,.redux-container-slider select,.redux-container-slider .redux-slider-label,.redux-container-slider .select2-container{display:block !important;position:inherit;margin:10px auto}.redux-container-slider .redux-slider-container{margin-top:3px;width:80%}}.wp-customizer .redux-container-slider .redux-slider-label{float:left;position:inherit;width:25%;text-align:center;margin-left:0}.wp-customizer .redux-container-slider .redux-slider-input,.wp-customizer .redux-container-slider .redux-slider-select-one,.wp-customizer .redux-container-slider .redux-slider-select-two{width:25% !important}.wp-customizer .redux-container-slider .redux-slider-container{width:70%;margin-right:0;margin-left:5%} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.js deleted file mode 100755 index 14040862..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.js +++ /dev/null @@ -1,269 +0,0 @@ -/*global redux_change, redux*/ - -(function( $ ) { - "use strict"; - - redux.field_objects = redux.field_objects || {}; - redux.field_objects.slider = redux.field_objects.slider || {}; - - $( document ).ready( - function() { - - } - ); - - redux.field_objects.slider.init = function( selector ) { - - if ( !selector ) { - selector = $( document ).find( ".redux-group-tab:visible" ).find( '.redux-container-slider:visible' ); - } - - $( selector ).each( - function() { - var el = $( this ); - var parent = el; - - if ( !el.hasClass( 'redux-field-container' ) ) { - parent = el.parents( '.redux-field-container:first' ); - } - if ( parent.is( ":hidden" ) ) { // Skip hidden fields - return; - } - if ( parent.hasClass( 'redux-field-init' ) ) { - parent.removeClass( 'redux-field-init' ); - } else { - return; - } - - el.find( 'div.redux-slider-container' ).each( - function() { - - var start, toClass, defClassOne, defClassTwo, connectVal; - var DISPLAY_NONE = 0; - var DISPLAY_LABEL = 1; - var DISPLAY_TEXT = 2; - var DISPLAY_SELECT = 3; - - var mainID = $( this ).data( 'id' ); - var minVal = $( this ).data( 'min' ); - var maxVal = $( this ).data( 'max' ); - var stepVal = $( this ).data( 'step' ); - var handles = $( this ).data( 'handles' ); - var defValOne = $( this ).data( 'default-one' ); - var defValTwo = $( this ).data( 'default-two' ); - var resVal = $( this ).data( 'resolution' ); - var displayValue = parseInt( ($( this ).data( 'display' )) ); - var rtlVal = Boolean( $( this ).data( 'rtl' ) ); - var floatMark = ($( this ).data( 'float-mark' )); - var forced = Boolean($( this ).data( 'forced' )); - - var rtl; - if ( rtlVal === true ) { - rtl = 'rtl'; - } else { - rtl = 'ltr'; - } - - // range array - var range = [minVal, maxVal]; - - // Set default values for dual slides. - var startTwo = [defValOne, defValTwo]; - - // Set default value for single slide - var startOne = [defValOne]; - - var inputOne, inputTwo; - if ( displayValue == DISPLAY_TEXT ) { - defClassOne = el.find( '.redux-slider-input-one-' + mainID ); - defClassTwo = el.find( '.redux-slider-input-two-' + mainID ); - - inputOne = defClassOne; - inputTwo = defClassTwo; - } else if ( displayValue == DISPLAY_SELECT ) { - defClassOne = el.find( '.redux-slider-select-one-' + mainID ); - defClassTwo = el.find( '.redux-slider-select-two-' + mainID ); - - redux.field_objects.slider.loadSelect( defClassOne, minVal, maxVal, resVal, stepVal ); - - if ( handles === 2 ) { - redux.field_objects.slider.loadSelect( defClassTwo, minVal, maxVal, resVal, stepVal ); - } - - } else if ( displayValue == DISPLAY_LABEL ) { - defClassOne = el.find( '#redux-slider-label-one-' + mainID ); - defClassTwo = el.find( '#redux-slider-label-two-' + mainID ); - } else if ( displayValue == DISPLAY_NONE ) { - defClassOne = el.find( '.redux-slider-value-one-' + mainID ); - defClassTwo = el.find( '.redux-slider-value-two-' + mainID ); - } - - var classOne, classTwo; - if ( displayValue == DISPLAY_LABEL ) { - var x = [defClassOne, 'html']; - var y = [defClassTwo, 'html']; - - classOne = [x]; - classTwo = [x, y]; - } else { - classOne = [defClassOne]; - classTwo = [defClassOne, defClassTwo]; - } - - if ( handles === 2 ) { - start = startTwo; - toClass = classTwo; - connectVal = true; - } else { - start = startOne; - toClass = classOne; - connectVal = 'lower'; - } - - var slider = $( this ).noUiSlider( - { - range: range, - start: start, - handles: handles, - step: stepVal, - connect: connectVal, - behaviour: "tap-drag", - direction: rtl, - serialization: { - resolution: resVal, - to: toClass, - mark: floatMark, - }, - slide: function() { - if ( displayValue == DISPLAY_LABEL ) { - if ( handles === 2 ) { - var inpSliderVal = slider.val(); - el.find( 'input.redux-slider-value-one-' + mainID ).attr( - 'value', inpSliderVal[0] - ); - el.find( 'input.redux-slider-value-two-' + mainID ).attr( - 'value', inpSliderVal[1] - ); - } else { - el.find( 'input.redux-slider-value-one-' + mainID ).attr( - 'value', slider.val() - ); - } - } - - if ( displayValue == DISPLAY_SELECT ) { - if ( handles === 2 ) { - el.find( '.redux-slider-select-one' ).select2( 'val', slider.val()[0] ); - el.find( '.redux-slider-select-two' ).select2( 'val', slider.val()[1] ); - } else { - el.find( '.redux-slider-select-one' ).select2( 'val', slider.val() ); - } - } - - redux_change( $( this ).parents( '.redux-field-container:first' ).find( 'input' ) ); - } - } - ); - - if ( displayValue === DISPLAY_TEXT ) { - inputOne.keydown( - function( e ) { - - var sliderOne = slider.val(); - var value = parseInt( sliderOne[0] ); - - switch ( e.which ) { - case 38: - slider.val( [value + 1, null] ); - break; - case 40: - slider.val( [value - 1, null] ); - break; - case 13: - e.preventDefault(); - break; - } - } - ); - - if ( handles === 2 ) { - inputTwo.keydown( - function( e ) { - var sliderTwo = slider.val(); - var value = parseInt( sliderTwo[1] ); - - switch ( e.which ) { - case 38: - slider.val( [null, value + 1] ); - break; - case 40: - slider.val( [null, value - 1] ); - break; - case 13: - e.preventDefault(); - break; - } - } - ); - } - } - } - ); - - var default_params = { - width: 'resolve', - triggerChange: true, - allowClear: true - }; - - var select2_handle = el.find( '.select2_params' ); - if ( select2_handle.size() > 0 ) { - var select2_params = select2_handle.val(); - - select2_params = JSON.parse( select2_params ); - default_params = $.extend( {}, default_params, select2_params ); - } - - el.find( 'select.redux-slider-select-one, select.redux-slider-select-two' ).select2( default_params ); - - } - ); - - }; - - // Return true for float value, false otherwise - redux.field_objects.slider.isFloat = function( mixed_var ) { - return +mixed_var === mixed_var && (!(isFinite( mixed_var ))) || Boolean( (mixed_var % 1) ); - }; - - // Return number of integers after the decimal point. - redux.field_objects.slider.decimalCount = function( res ) { - var q = res.toString().split( '.' ); - return q[1].length; - }; - - redux.field_objects.slider.loadSelect = function( myClass, min, max, res, step ) { - - //var j = step + ((decCount ) - (step )); // 18; - - for ( var i = min; i <= max; i = i + res ) { - //var step = 2; - - //if (j === (step + ((decCount ) - (step )))) { - var n = i; - if ( redux.field_objects.slider.isFloat( res ) ) { - var decCount = redux.field_objects.slider.decimalCount( res ); - n = i.toFixed( decCount ); - } - - $( myClass ).append( - '' - ); - //j = 0; - //} - //j++; - } - }; - - -})( jQuery ); diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.min.js deleted file mode 100755 index a343cbe4..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.slider=redux.field_objects.slider||{},a(document).ready(function(){}),redux.field_objects.slider.init=function(b){b||(b=a(document).find(".redux-group-tab:visible").find(".redux-container-slider:visible")),a(b).each(function(){var b=a(this),c=b;if(b.hasClass("redux-field-container")||(c=b.parents(".redux-field-container:first")),!c.is(":hidden")&&c.hasClass("redux-field-init")){c.removeClass("redux-field-init"),b.find("div.redux-slider-container").each(function(){var c,d,e,f,g,h,i=0,j=1,k=2,l=3,m=a(this).data("id"),n=a(this).data("min"),o=a(this).data("max"),p=a(this).data("step"),q=a(this).data("handles"),r=a(this).data("default-one"),s=a(this).data("default-two"),t=a(this).data("resolution"),u=parseInt(a(this).data("display")),v=Boolean(a(this).data("rtl")),w=a(this).data("float-mark");Boolean(a(this).data("forced"));h=v===!0?"rtl":"ltr";var x,y,z=[n,o],A=[r,s],B=[r];u==k?(e=b.find(".redux-slider-input-one-"+m),f=b.find(".redux-slider-input-two-"+m),x=e,y=f):u==l?(e=b.find(".redux-slider-select-one-"+m),f=b.find(".redux-slider-select-two-"+m),redux.field_objects.slider.loadSelect(e,n,o,t,p),2===q&&redux.field_objects.slider.loadSelect(f,n,o,t,p)):u==j?(e=b.find("#redux-slider-label-one-"+m),f=b.find("#redux-slider-label-two-"+m)):u==i&&(e=b.find(".redux-slider-value-one-"+m),f=b.find(".redux-slider-value-two-"+m));var C,D;if(u==j){var E=[e,"html"],F=[f,"html"];C=[E],D=[E,F]}else C=[e],D=[e,f];2===q?(c=A,d=D,g=!0):(c=B,d=C,g="lower");var G=a(this).noUiSlider({range:z,start:c,handles:q,step:p,connect:g,behaviour:"tap-drag",direction:h,serialization:{resolution:t,to:d,mark:w},slide:function(){if(u==j)if(2===q){var c=G.val();b.find("input.redux-slider-value-one-"+m).attr("value",c[0]),b.find("input.redux-slider-value-two-"+m).attr("value",c[1])}else b.find("input.redux-slider-value-one-"+m).attr("value",G.val());u==l&&(2===q?(b.find(".redux-slider-select-one").select2("val",G.val()[0]),b.find(".redux-slider-select-two").select2("val",G.val()[1])):b.find(".redux-slider-select-one").select2("val",G.val())),redux_change(a(this).parents(".redux-field-container:first").find("input"))}});u===k&&(x.keydown(function(a){var b=G.val(),c=parseInt(b[0]);switch(a.which){case 38:G.val([c+1,null]);break;case 40:G.val([c-1,null]);break;case 13:a.preventDefault()}}),2===q&&y.keydown(function(a){var b=G.val(),c=parseInt(b[1]);switch(a.which){case 38:G.val([null,c+1]);break;case 40:G.val([null,c-1]);break;case 13:a.preventDefault()}}))});var d={width:"resolve",triggerChange:!0,allowClear:!0},e=b.find(".select2_params");if(e.size()>0){var f=e.val();f=JSON.parse(f),d=a.extend({},d,f)}b.find("select.redux-slider-select-one, select.redux-slider-select-two").select2(d)}})},redux.field_objects.slider.isFloat=function(a){return+a===a&&!isFinite(a)||Boolean(a%1)},redux.field_objects.slider.decimalCount=function(a){var b=a.toString().split(".");return b[1].length},redux.field_objects.slider.loadSelect=function(b,c,d,e,f){for(var g=c;d>=g;g+=e){var h=g;if(redux.field_objects.slider.isFloat(e)){var i=redux.field_objects.slider.decimalCount(e);h=g.toFixed(i)}a(b).append('")}}}(jQuery); \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.php b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.php deleted file mode 100755 index 5b25e490..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.php +++ /dev/null @@ -1,414 +0,0 @@ -. - * - * @package ReduxFramework - * @subpackage Field_Slider - * @author Kevin Provance (kprovance) - * @version 2.0.0 - */ - -// Exit if accessed directly -if ( ! defined( 'ABSPATH' ) ) { - exit; -} - -if ( ! class_exists( 'ReduxFramework_slider' ) ) { - class ReduxFramework_slider { - - /** - * Field Constructor. - * Required - must call the parent constructor, then assign field and value to vars, and obviously call the render field function - * - * @since ReduxFramework 3.1.8 - */ - private $display_none = 0; - private $display_label = 1; - private $display_text = 2; - private $display_select = 3; - - function __construct( $field = array(), $value = '', $parent ) { - - //parent::__construct( $parent->sections, $parent->args ); - $this->parent = $parent; - $this->field = $field; - $this->value = $value; - - // Set defaults - $defaults = array( - 'handles' => 1, - 'resolution' => 1, - 'display_value' => 'text', - 'float_mark' => '.', - 'forced' => true - ); - - $this->field = wp_parse_args( $this->field, $defaults ); - - // Sanitize float mark - switch ( $this->field['float_mark'] ) { - case ',': - case '.': - break; - default: - $this->field['float_mark'] = '.'; - break; - } - - // Sanitize resolution value - $this->field['resolution'] = $this->cleanVal( $this->field['resolution'] ); - - // Sanitize handle value - switch ( $this->field['handles'] ) { - case 0: - case 1: - $this->field['handles'] = 1; - break; - default: - $this->field['handles'] = 2; - break; - } - - // Sanitize display value - switch ( $this->field['display_value'] ) { - case 'label': - $this->field['display_value'] = $this->display_label; - break; - case 'text': - default: - $this->field['display_value'] = $this->display_text; - break; - case 'select': - $this->field['display_value'] = $this->display_select; - break; - case 'none': - $this->field['display_value'] = $this->display_none; - break; - } - } - - private function cleanVal( $var ) { - if ( is_float( $var ) ) { - $cleanVar = floatval( $var ); - } else { - $cleanVar = intval( $var ); - } - - return $cleanVar; - } - - private function cleanDefault( $val ) { - if ( empty( $val ) && ! empty( $this->field['default'] ) && $this->cleanVal( $this->field['min'] ) >= 1 ) { - $val = $this->cleanVal( $this->field['default'] ); - } - - if ( empty( $val ) && $this->cleanVal( $this->field['min'] ) >= 1 ) { - $val = $this->cleanVal( $this->field['min'] ); - } - - if ( empty( $val ) ) { - $val = 0; - } - - // Extra Validation - if ( $val < $this->field['min'] ) { - $val = $this->cleanVal( $this->field['min'] ); - } else if ( $val > $this->field['max'] ) { - $val = $this->cleanVal( $this->field['max'] ); - } - - return $val; - } - - private function cleanDefaultArray( $val ) { - $one = $this->value[1]; - $two = $this->value[2]; - - if ( empty( $one ) && ! empty( $this->field['default'][1] ) && $this->cleanVal( $this->field['min'] ) >= 1 ) { - $one = $this->cleanVal( $this->field['default'][1] ); - } - - if ( empty( $one ) && $this->cleanVal( $this->field['min'] ) >= 1 ) { - $one = $this->cleanVal( $this->field['min'] ); - } - - if ( empty( $one ) ) { - $one = 0; - } - - if ( empty( $two ) && ! empty( $this->field['default'][2] ) && $this->cleanVal( $this->field['min'] ) >= 1 ) { - $two = $this->cleanVal( $this->field['default'][1] + 1 ); - } - - if ( empty( $two ) && $this->cleanVal( $this->field['min'] ) >= 1 ) { - $two = $this->cleanVal( $this->field['default'][1] + 1 ); - } - - if ( empty( $two ) ) { - $two = $this->field['default'][1] + 1; - } - - $val[0] = $one; - $val[1] = $two; - - return $val; - } - - - /** - * Clean the field data to the fields defaults given the parameters. - * - * @since Redux_Framework 3.1.8 - */ - function clean() { - - // Set min to 0 if no value is set. - $this->field['min'] = empty( $this->field['min'] ) ? 0 : $this->cleanVal( $this->field['min'] ); - - // Set max to min + 1 if empty. - $this->field['max'] = empty( $this->field['max'] ) ? $this->field['min'] + 1 : $this->cleanVal( $this->field['max'] ); - - // Set step to 1 if step is empty ot step > max. - $this->field['step'] = empty( $this->field['step'] ) || $this->field['step'] > $this->field['max'] ? 1 : $this->cleanVal( $this->field['step'] ); - - if ( 2 == $this->field['handles'] ) { - if ( ! is_array( $this->value ) ) { - $this->value[1] = 0; - $this->value[2] = 1; - } - $this->value = $this->cleanDefaultArray( $this->value ); - } else { - if ( is_array( $this->value ) ) { - $this->value = 0; - } - $this->value = $this->cleanDefault( $this->value ); - } - - // More dummy checks - //if ( ! is_array( $this->field['default'] ) && 2 == $this->field['handles'] ) { - if ( ! is_array( $this->value ) && 2 == $this->field['handles'] ) { - $this->value[0] = $this->field['min']; - $this->value[1] = $this->field['min'] + 1; - } - - //if ( is_array( $this->field['default'] ) && 1 == $this->field['handles'] ) { - if ( is_array( $this->value ) && 1 == $this->field['handles'] ) { - $this->value = $this->field['min']; - } - - } - - /** - * Enqueue Function. - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css - * - * @since ReduxFramework 3.1.8 - */ - function enqueue() { - - $min = Redux_Functions::isMin(); - - wp_enqueue_style( 'select2-css' ); - - wp_enqueue_style( - 'redux-nouislider-css', - ReduxFramework::$_url . 'inc/fields/slider/vendor/nouislider/redux.jquery.nouislider.css', - array(), - '5.0.0', - 'all' - ); - - wp_register_script( - 'redux-nouislider-js', - ReduxFramework::$_url . 'inc/fields/slider/vendor/nouislider/redux.jquery.nouislider' . $min . '.js', - array( 'jquery' ), - '5.0.0', - true - ); - - wp_enqueue_script( - 'redux-field-slider-js', - ReduxFramework::$_url . 'inc/fields/slider/field_slider' . $min . '.js', - array( 'jquery', 'redux-nouislider-js', 'redux-js', 'select2-js' ), - time(), - true - ); - - if ($this->parent->args['dev_mode']) { - wp_enqueue_style( - 'redux-field-slider-css', - ReduxFramework::$_url . 'inc/fields/slider/field_slider.css', - array(), - time(), - 'all' - ); - } - } - - //function - - /** - * Field Render Function. - * Takes the vars and outputs the HTML for the field in the settings - * - * @since ReduxFramework 0.0.4 - */ - function render() { - - $this->clean(); - - $fieldID = $this->field['id']; - $fieldName = $this->field['name'] . $this->field['name_suffix']; - //$fieldName = $this->parent->args['opt_name'] . '[' . $this->field['id'] . ']'; - - // Set handle number variable. - $twoHandles = false; - if ( 2 == $this->field['handles'] ) { - $twoHandles = true; - } - - // Set default values(s) - if ( true == $twoHandles ) { - $valOne = $this->value[0]; - $valTwo = $this->value[1]; - - $html = 'data-default-one="' . $valOne . '" '; - $html .= 'data-default-two="' . $valTwo . '" '; - - $nameOne = $fieldName . '[1]'; - $nameTwo = $fieldName . '[2]'; - - $idOne = $fieldID . '[1]'; - $idTwo = $fieldID . '[2]'; - } else { - $valOne = $this->value; - $valTwo = ''; - - $html = 'data-default-one="' . $valOne . '"'; - - $nameOne = $fieldName; - $nameTwo = ''; - - $idOne = $fieldID; - $idTwo = ''; - } - - $showInput = false; - $showLabel = false; - $showSelect = false; - - // TEXT output - if ( $this->display_text == $this->field['display_value'] ) { - $showInput = true; - echo ''; - - // LABEL output - } elseif ( $this->display_label == $this->field['display_value'] ) { - $showLabel = true; - - $labelNum = $twoHandles ? '-one' : ''; - - echo '
            -
            '; - - // SELECT output - } elseif ( $this->display_select == $this->field['display_value'] ) { - $showSelect = true; - - if ( isset( $this->field['select2'] ) ) { // if there are any let's pass them to js - $select2_params = json_encode( $this->field['select2'] ); - $select2_params = htmlspecialchars( $select2_params, ENT_QUOTES ); - - echo ''; - } - - - echo ''; - } - - // DIV output - echo - '
            -
            '; - - // Double slider output - if ( true == $twoHandles ) { - - // TEXT - if ( true == $showInput ) { - echo ''; - } - - // LABEL - if ( true == $showLabel ) { - echo '
            -
            '; - } - - // SELECT - if ( true == $showSelect ) { - echo ''; - - } - } - - // NO output (input hidden) - if ( $this->display_none == $this->field['display_value'] || $this->display_label == $this->field['display_value'] ) { - echo ''; - - // double slider hidden output - if ( true == $twoHandles ) { - echo ''; - } - } - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.scss b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.scss deleted file mode 100755 index a5f7a2ba..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/field_slider.scss +++ /dev/null @@ -1,81 +0,0 @@ -.redux-container-slider { - .redux-slider-container { - margin-left: 25px; - margin-right: 25px; - width: 200px; - display: inline-block; - vertical-align: middle; - } - - .redux-slider-input, - .redux-slider-select-one, - .redux-slider-select-two { - width: 100px !important; - text-align: center; - } - - .redux-slider-label { - position: absolute; - margin-left: -5px; - } - - .redux-slider-label-one { - position: absolute; - margin-left: -22px; - } - - .redux-slider-label-two { - position: absolute; - margin-top: -21px; - margin-left: 245px; - } -} - -@media screen and (max-width: 782px) { - .redux-container-slider { - input { - display: inline-block !important; - } - } -} - -// Select Slider -@media screen and (max-width: 570px) { - .redux-container-slider { - text-align: center; - - input, - select, - .redux-slider-label, - .select2-container { - display: block !important; - position: inherit; - margin: 10px auto; - } - - .redux-slider-container { - margin-top: 3px; - width: 80%; - } - } -} - -.wp-customizer { - .redux-container-slider { - .redux-slider-label { - float: left; - position: inherit; - width: 25%; - text-align: center; - margin-left:0; - } - .redux-slider-input, .redux-slider-select-one, .redux-slider-select-two { - width: 25% !important; - } - .redux-slider-container { - width: 70%; - margin-right: 0; - margin-left: 5%; - } - } -} \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/vendor/nouislider/redux.jquery.nouislider.css b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/vendor/nouislider/redux.jquery.nouislider.css deleted file mode 100755 index 995bbd10..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/vendor/nouislider/redux.jquery.nouislider.css +++ /dev/null @@ -1,172 +0,0 @@ - -/* Functional styling; - * These styles are required for noUiSlider to function. - * You don't need to change these rules to apply your design. - */ -.noUi-target, -.noUi-target * { --webkit-touch-callout: none; --webkit-user-select: none; --ms-touch-action: none; --ms-user-select: none; --moz-user-select: none; --moz-box-sizing: border-box; - box-sizing: border-box; -} -.noUi-base { - width: 100%; - height: 100%; - position: relative; -} -.noUi-origin { - position: absolute; - right: 0; - top: 0; - left: 0; - bottom: 0; -} -.noUi-handle { - position: relative; - z-index: 1; -} -.noUi-stacking .noUi-handle { -/* This class is applied to the lower origin when - its values is > 50%. */ - z-index: 10; -} -.noUi-stacking + .noUi-origin { -/* Fix stacking order in IE7, which incorrectly - creates a new context for the origins. */ - *z-index: -1; -} -.noUi-state-tap .noUi-origin { --webkit-transition: left 0.3s, top 0.3s; - transition: left 0.3s, top 0.3s; -} -.noUi-state-drag * { - cursor: inherit !important; -} - -/* Slider size and handle placement; - */ -.noUi-horizontal { - height: 18px; -} -.noUi-horizontal .noUi-handle { - width: 34px; - height: 28px; - left: -17px; - top: -6px; -} -.noUi-horizontal.noUi-extended { - padding: 0 15px; -} -.noUi-horizontal.noUi-extended .noUi-origin { - right: -15px; -} -.noUi-vertical { - width: 18px; -} -.noUi-vertical .noUi-handle { - width: 28px; - height: 34px; - left: -6px; - top: -17px; -} -.noUi-vertical.noUi-extended { - padding: 15px 0; -} -.noUi-vertical.noUi-extended .noUi-origin { - bottom: -15px; -} - -/* Styling; - */ -.noUi-background { - background: #FAFAFA; - box-shadow: inset 0 1px 1px #f0f0f0; -} -.noUi-connect { - background: #3FB8AF; - box-shadow: inset 0 0 3px rgba(51,51,51,0.45); --webkit-transition: background 450ms; - transition: background 450ms; -} -.noUi-origin { - border-radius: 2px; -} -.noUi-target { - border-radius: 4px; - border: 1px solid #D3D3D3; - box-shadow: inset 0 1px 1px #F0F0F0, 0 3px 6px -5px #BBB; -} -.noUi-target.noUi-connect { - box-shadow: inset 0 0 3px rgba(51,51,51,0.45), 0 3px 6px -5px #BBB; -} - -/* Handles and cursors; - */ -.noUi-dragable { - cursor: w-resize; -} -.noUi-vertical .noUi-dragable { - cursor: n-resize; -} -.noUi-handle { - border: 1px solid #D9D9D9; - border-radius: 3px; - background: #FFF; - cursor: default; - box-shadow: inset 0 0 1px #FFF, - inset 0 1px 7px #EBEBEB, - 0 3px 6px -3px #BBB; -} -.noUi-active { - box-shadow: inset 0 0 1px #FFF, - inset 0 1px 7px #DDD, - 0 3px 6px -3px #BBB; -} - -/* Handle stripes; - */ -.noUi-handle:before, -.noUi-handle:after { - content: ""; - display: block; - position: absolute; - height: 14px; - width: 1px; - background: #E8E7E6; - left: 14px; - top: 6px; -} -.noUi-handle:after { - left: 17px; -} -.noUi-vertical .noUi-handle:before, -.noUi-vertical .noUi-handle:after { - width: 14px; - height: 1px; - left: 6px; - top: 14px; -} -.noUi-vertical .noUi-handle:after { - top: 17px; -} - -/* Disabled state; - */ -[disabled].noUi-connect, -[disabled] .noUi-connect { - background: #B8B8B8; -} -[disabled] .noUi-handle { - cursor: not-allowed; -} - -/* Blocked state; - */ -.noUi-state-blocked.noUi-connect, -.noUi-state-blocked .noUi-connect { - background: #4FDACF; -} diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/vendor/nouislider/redux.jquery.nouislider.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/vendor/nouislider/redux.jquery.nouislider.js deleted file mode 100755 index 4c05d20f..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/vendor/nouislider/redux.jquery.nouislider.js +++ /dev/null @@ -1,1420 +0,0 @@ -/*! $.noUiSlider - @version 5.0.0 - @author Leon Gersen https://twitter.com/LeonGersen - @license WTFPL http://www.wtfpl.net/about/ - @documentation http://refreshless.com/nouislider/ -*/ - -// ==ClosureCompiler== -// @externs_url http://refreshless.com/externs/jquery-1.8.js -// @compilation_level ADVANCED_OPTIMIZATIONS -// @warning_level VERBOSE -// ==/ClosureCompiler== - -/*jshint laxcomma: true */ -/*jshint smarttabs: true */ -/*jshint sub: true */ - -/*jslint browser: true */ -/*jslint continue: true */ -/*jslint plusplus: true */ -/*jslint white: true */ -/*jslint sub: true */ - -(function( $ ){ - - 'use strict'; - - if ( $['zepto'] && !$.fn.removeData ) { - throw new ReferenceError('Zepto is loaded without the data module.'); - } - - $.fn['noUiSlider'] = function( options, rebuild ){ - - var - // Cache the document and body selectors; - doc = $(document) - ,body = $('body') - - // Namespace for binding and unbinding slider events; - ,namespace = '.nui' - - // Copy of the current value function; - ,$VAL = $.fn.val - - // Re-usable list of classes; - ,clsList = [ - /* 0 */ 'noUi-base' - /* 1 */ ,'noUi-origin' - /* 2 */ ,'noUi-handle' - /* 3 */ ,'noUi-input' - /* 4 */ ,'noUi-active' - /* 5 */ ,'noUi-state-tap' - /* 6 */ ,'noUi-target' - /* 7 */ ,'-lower' - /* 8 */ ,'-upper' - /* 9 */ ,'noUi-connect' - /* 10 */ ,'noUi-horizontal' - /* 11 */ ,'noUi-vertical' - /* 12 */ ,'noUi-background' - /* 13 */ ,'noUi-stacking' - /* 14 */ ,'noUi-block' - /* 15 */ ,'noUi-state-blocked' - /* 16 */ ,'noUi-ltr' - /* 17 */ ,'noUi-rtl' - /* 18 */ ,'noUi-dragable' - /* 19 */ ,'noUi-extended' - /* 20 */ ,'noUi-state-drag' - ] - - // Determine the events to bind. IE11 implements pointerEvents without - // a prefix, which breaks compatibility with the IE10 implementation. - ,actions = window.navigator['pointerEnabled'] ? { - start: 'pointerdown' - ,move: 'pointermove' - ,end: 'pointerup' - } : window.navigator['msPointerEnabled'] ? { - start: 'MSPointerDown' - ,move: 'MSPointerMove' - ,end: 'MSPointerUp' - } : { - start: 'mousedown touchstart' - ,move: 'mousemove touchmove' - ,end: 'mouseup touchend' - }; - - -// Percentage calculation - - // (percentage) How many percent is this value of this range? - function fromPercentage ( range, value ) { - return (value * 100) / ( range[1] - range[0] ); - } - - // (percentage) Where is this value on this range? - function toPercentage ( range, value ) { - return fromPercentage( range, range[0] < 0 ? - value + Math.abs(range[0]) : - value - range[0] ); - } - - // (value) How much is this percentage on this range? - function isPercentage ( range, value ) { - return ((value * ( range[1] - range[0] )) / 100) + range[0]; - } - - -// Type tests - - // Test in an object is an instance of jQuery or Zepto. - function isInstance ( a ) { - return a instanceof $ || ( $['zepto'] && $['zepto']['isZ'](a) ); - } - - // Checks whether a value is numerical. - function isNumeric ( a ) { - return !isNaN( parseFloat( a ) ) && isFinite( a ); - } - - -// General helper functions - - // Test an array of objects, and calls them if they are a function. - function call ( functions, scope ) { - - // Allow the passing of an unwrapped function. - // Leaves other code a more comprehensible. - if( !$.isArray( functions ) ){ - functions = [ functions ]; - } - - $.each( functions, function(){ - if (typeof this === 'function') { - this.call(scope); - } - }); - } - - // Returns a proxy to set a target using the public value method. - function setN ( target, number ) { - - return function(){ - - // Determine the correct position to set, - // leave the other one unchanged. - var val = [null, null]; - val[ number ] = $(this).val(); - - // Trigger the 'set' callback - target.val(val, true); - }; - } - - // Round a value to the closest 'to'. - function closest ( value, to ){ - return Math.round(value / to) * to; - } - - // Format output value to specified standards. - function format ( value, options ) { - - // Round the value to the resolution that was set - // with the serialization options. - value = value.toFixed( options['decimals'] ); - - // Rounding away decimals might cause a value of -0 - // when using very small ranges. Remove those cases. - if ( parseFloat(value) === 0 ) { - value = value.replace('-0', '0'); - } - - // Apply the proper decimal mark to the value. - return value.replace( '.', options['serialization']['mark'] ); - } - - // Determine the handle closest to an event. - function closestHandle ( handles, location, style ) { - - if ( handles.length === 1 ) { - return handles[0]; - } - - var total = handles[0].offset()[style] + - handles[1].offset()[style]; - - return handles[ location < total / 2 ? 0 : 1 ]; - } - - // Round away small numbers in floating point implementation. - function digits ( value, round ) { - return parseFloat(value.toFixed(round)); - } - -// Event abstraction - - // Provide a clean event with standardized offset values. - function fixEvent ( e ) { - - // Prevent scrolling and panning on touch events, while - // attempting to slide. The tap event also depends on this. - e.preventDefault(); - - // Filter the event to register the type, which can be - // touch, mouse or pointer. Offset changes need to be - // made on an event specific basis. - var touch = e.type.indexOf('touch') === 0 - ,mouse = e.type.indexOf('mouse') === 0 - ,pointer = e.type.indexOf('pointer') === 0 - ,x,y, event = e; - - // IE10 implemented pointer events with a prefix; - if ( e.type.indexOf('MSPointer') === 0 ) { - pointer = true; - } - - // Get the originalEvent, if the event has been wrapped - // by jQuery. Zepto doesn't wrap the event. - if ( e.originalEvent ) { - e = e.originalEvent; - } - - if ( touch ) { - // noUiSlider supports one movement at a time, - // so we can select the first 'changedTouch'. - x = e.changedTouches[0].pageX; - y = e.changedTouches[0].pageY; - } - if ( mouse || pointer ) { - - // Polyfill the pageXOffset and pageYOffset - // variables for IE7 and IE8; - if( !pointer && window.pageXOffset === undefined ){ - window.pageXOffset = document.documentElement.scrollLeft; - window.pageYOffset = document.documentElement.scrollTop; - } - - x = e.clientX + window.pageXOffset; - y = e.clientY + window.pageYOffset; - } - - return $.extend( event, { - 'pointX': x - ,'pointY': y - ,cursor: mouse - }); - } - - // Handler for attaching events trough a proxy - function attach ( events, element, callback, pass ) { - - var target = pass.target; - - // Add the noUiSlider namespace to all events. - events = events.replace( /\s/g, namespace + ' ' ) + namespace; - - // Bind a closure on the target. - return element.on( events, function( e ){ - - // jQuery and Zepto handle unset attributes differently. - var disabled = target.attr('disabled'); - disabled = !( disabled === undefined || disabled === null ); - - // Test if there is anything that should prevent an event - // from being handled, such as a disabled state or an active - // 'tap' transition. - if( target.hasClass('noUi-state-tap') || disabled ) { - return false; - } - - // Call the event handler with three arguments: - // - The event; - // - An object with data for the event; - // - The slider options; - // Having the slider options as a function parameter prevents - // getting it in every function, which muddies things up. - callback ( - fixEvent( e ) - ,pass - ,target.data('base').data('options') - ); - }); - } - - -// Serialization and value storage - - // Store a value on all serialization targets, or get the current value. - function serialize ( a ) { - - /*jshint validthis: true */ - - // Re-scope target for availability within .each; - var target = this.target; - - // Get the value for this handle - if ( a === undefined ) { - return this.element.data('value'); - } - - // Write the value to all serialization objects - // or store a new value on the handle - if ( a === true ) { - a = this.element.data('value'); - } else { - this.element.data('value', a); - } - - // Prevent a serialization call if the value wasn't initialized. - if ( a === undefined ) { - return; - } - - // If the provided element was a function, - // call it with the slider as scope. Otherwise, - // simply call the function on the object. - $.each( this.elements, function() { - if ( typeof this === 'function' ) { - this.call(target, a); - } else { - this[0][this[1]](a); - } - }); - } - - // Map serialization to [ element, method ]. Attach events where required. - function storeElement ( handle, item, number ) { - - // Add a change event to the supplied jQuery objects, - // which triggers the value-setting function on the target. - if ( isInstance( item ) ) { - - var elements = [], target = handle.data('target'); - - // Link the field to the other handle if the - // slider is inverted. - if ( handle.data('options').direction ) { - number = number ? 0 : 1; - } - - // Loop all items so the change event is properly bound, - // and the items can individually be added to the array. - item.each(function(){ - - // Bind the change event. - $(this).on('change' + namespace, setN( target, number )); - - // Store the element with the proper handler. - elements.push([ $(this), 'val' ]); - }); - - return elements; - } - - // Append a new input to the noUiSlider base. - // Prevent the change event from flowing upward. - if ( typeof item === 'string' ) { - - item = [ $('') - .appendTo(handle) - .addClass(clsList[3]) - .change(function ( e ) { - e.stopPropagation(); - }), 'val']; - } - - return [item]; - } - - // Access point and abstraction for serialization. - function store ( handle, i, serialization ) { - - var elements = []; - - // Loops all items in the provided serialization setting, - // add the proper events to them or create new input fields, - // and add them as data to the handle so they can be kept - // in sync with the slider value. - $.each( serialization['to'][i], function( index ){ - elements = elements.concat( - storeElement( handle, serialization['to'][i][index], i ) - ); - }); - - return { - element: handle - ,elements: elements - ,target: handle.data('target') - ,'val': serialize - }; - } - - -// Handle placement - - // Fire callback on unsuccessful handle movement. - function block ( base, stateless ) { - - var target = base.data('target'); - - if ( !target.hasClass(clsList[14]) ){ - - // The visual effects should not always be applied. - if ( !stateless ) { - target.addClass(clsList[15]); - setTimeout(function(){ - target.removeClass(clsList[15]); - }, 450); - } - - target.addClass(clsList[14]); - call( base.data('options').block, target ); - } - } - - // Change inline style and apply proper classes. - function placeHandle ( handle, to ) { - - var settings = handle.data('options'); - - to = digits(to, 7); - - // If the slider can move, remove the class - // indicating the block state. - handle.data('target').removeClass(clsList[14]); - - // Set handle to new location - handle.css( settings['style'], to + '%' ).data('pct', to); - - // Force proper handle stacking - if ( handle.is(':first-child') ) { - handle.toggleClass(clsList[13], to > 50 ); - } - - if ( settings['direction'] ) { - to = 100 - to; - } - - // Write the value to the serialization object. - handle.data('store').val( - format ( isPercentage( settings['range'], to ), settings ) - ); - } - - // Test suggested values and apply margin, step. - function setHandle ( handle, to ) { - - var base = handle.data('base'), settings = base.data('options'), - handles = base.data('handles'), lower = 0, upper = 100; - - // Catch invalid user input - if ( !isNumeric( to ) ){ - return false; - } - - // Handle the step option. - if ( settings['step'] ){ - to = closest( to, settings['step'] ); - } - - if ( handles.length > 1 ){ - if ( handle[0] !== handles[0][0] ) { - lower = digits(handles[0].data('pct')+settings['margin'],7); - } else { - upper = digits(handles[1].data('pct')-settings['margin'],7); - } - } - - // Limit position to boundaries. When the handles aren't set yet, - // they return -1 as a percentage value. - to = Math.min( Math.max( to, lower ), upper < 0 ? 100 : upper ); - - // Stop handling this call if the handle can't move past another. - // Return an array containing the hit limit, so the caller can - // provide feedback. ( block callback ). - if ( to === handle.data('pct') ) { - return [!lower ? false : lower, upper === 100 ? false : upper]; - } - - placeHandle ( handle, to ); - return true; - } - - // Handles movement by tapping - function jump ( base, handle, to, callbacks ) { - - // Flag the slider as it is now in a transitional state. - // Transition takes 300 ms, so re-enable the slider afterwards. - base.addClass(clsList[5]); - setTimeout(function(){ - base.removeClass(clsList[5]); - }, 300); - - // Move the handle to the new position. - setHandle( handle, to ); - - // Trigger the 'slide' and 'set' callbacks, - // pass the target so that it is 'this'. - call( callbacks, base.data('target') ); - - base.data('target').change(); - } - - -// Event handlers - - // Handle movement on document for handle and range drag. - function move ( event, Dt, Op ) { - - // Map event movement to a slider percentage. - var handles = Dt.handles, limits, - proposal = event[ Dt.point ] - Dt.start[ Dt.point ]; - - proposal = ( proposal * 100 ) / Dt.size; - - if ( handles.length === 1 ) { - - // Run handle placement, receive true for success or an - // array with potential limits. - limits = setHandle( handles[0], Dt.positions[0] + proposal ); - - if ( limits !== true ) { - - if ( $.inArray ( handles[0].data('pct'), limits ) >= 0 ){ - block ( Dt.base, !Op['margin'] ); - } - return; - } - - } else { - - // Dragging the range could be implemented by forcing the - // 'move' event on both handles, but this solution proved - // lagging on slower devices, resulting in range errors. The - // slightly ugly solution below is considerably faster, and - // it can't move the handle out of sync. Bypass the standard - // setting method, as other checks are needed. - - var l1, u1, l2, u2; - - // Round the proposal to the step setting. - if ( Op['step'] ) { - proposal = closest( proposal, Op['step'] ); - } - - // Determine the new position, store it twice. Once for - // limiting, once for checking whether placement should occur. - l1 = l2 = Dt.positions[0] + proposal; - u1 = u2 = Dt.positions[1] + proposal; - - // Round the values within a sensible range. - if ( l1 < 0 ) { - u1 += -1 * l1; - l1 = 0; - } else if ( u1 > 100 ) { - l1 -= ( u1 - 100 ); - u1 = 100; - } - - // Don't perform placement if no handles are to be changed. - // Check if the lowest value is set to zero. - if ( l2 < 0 && !l1 && !handles[0].data('pct') ) { - return; - } - // The highest value is limited to 100%. - if ( u1 === 100 && u2 > 100 && handles[1].data('pct') === 100 ){ - return; - } - - placeHandle ( handles[0], l1 ); - placeHandle ( handles[1], u1 ); - } - - // Trigger the 'slide' event, if the handle was moved. - call( Op['slide'], Dt.target ); - } - - // Unbind move events on document, call callbacks. - function end ( event, Dt, Op ) { - - // The handle is no longer active, so remove the class. - if ( Dt.handles.length === 1 ) { - Dt.handles[0].data('grab').removeClass(clsList[4]); - } - - // Remove cursor styles and text-selection events bound to the body. - if ( event.cursor ) { - body.css('cursor', '').off( namespace ); - } - - // Unbind the move and end events, which are added on 'start'. - doc.off( namespace ); - - // Trigger the change event. - Dt.target.removeClass( clsList[14] +' '+ clsList[20]).change(); - - // Trigger the 'end' callback. - call( Op['set'], Dt.target ); - } - - // Bind move events on document. - function start ( event, Dt, Op ) { - - // Mark the handle as 'active' so it can be styled. - if( Dt.handles.length === 1 ) { - Dt.handles[0].data('grab').addClass(clsList[4]); - } - - // A drag should never propagate up to the 'tap' event. - event.stopPropagation(); - - // Attach the move event. - attach ( actions.move, doc, move, { - start: event - ,base: Dt.base - ,target: Dt.target - ,handles: Dt.handles - ,positions: [ Dt.handles[0].data('pct') - ,Dt.handles[ Dt.handles.length - 1 ].data('pct') ] - ,point: Op['orientation'] ? 'pointY' : 'pointX' - ,size: Op['orientation'] ? Dt.base.height() : Dt.base.width() - }); - - // Unbind all movement when the drag ends. - attach ( actions.end, doc, end, { - target: Dt.target - ,handles: Dt.handles - }); - - // Text selection isn't an issue on touch devices, - // so adding additional callbacks isn't required. - if ( event.cursor ) { - - // Prevent the 'I' cursor and extend the range-drag cursor. - body.css('cursor', $(event.target).css('cursor')); - - // Mark the target with a dragging state. - if ( Dt.handles.length > 1 ) { - Dt.target.addClass(clsList[20]); - } - - // Prevent text selection when dragging the handles. - body.on('selectstart' + namespace, function( ){ - return false; - }); - } - } - - // Move closest handle to tapped location. - function tap ( event, Dt, Op ) { - - var base = Dt.base, handle, to, point, size; - - // The tap event shouldn't propagate up to trigger 'edge'. - event.stopPropagation(); - - // Determine the direction of the slider. - if ( Op['orientation'] ) { - point = event['pointY']; - size = base.height(); - } else { - point = event['pointX']; - size = base.width(); - } - - // Find the closest handle and calculate the tapped point. - handle = closestHandle( base.data('handles'), point, Op['style'] ); - to = (( point - base.offset()[ Op['style'] ] ) * 100 ) / size; - - // The set handle to the new position. - jump( base, handle, to, [ Op['slide'], Op['set'] ]); - } - - // Move handle to edges when target gets tapped. - function edge ( event, Dt, Op ) { - - var handles = Dt.base.data('handles'), to, i; - - i = Op['orientation'] ? event['pointY'] : event['pointX']; - i = i < Dt.base.offset()[Op['style']]; - - to = i ? 0 : 100; - i = i ? 0 : handles.length - 1; - - jump ( Dt.base, handles[i], to, [ Op['slide'], Op['set'] ]); - } - -// API - - // Validate and standardize input. - function test ( input, sliders ){ - - /* Every input option is tested and parsed. This'll prevent - endless validation in internal methods. These tests are - structured with an item for every option available. An - option can be marked as required by setting the 'r' flag. - The testing function is provided with three arguments: - - The provided value for the option; - - A reference to the options object; - - The name for the option; - - The testing function returns false when an error is detected, - or true when everything is OK. It can also modify the option - object, to make sure all values can be correctly looped elsewhere. */ - - function values ( a ) { - - if ( a.length !== 2 ){ - return false; - } - - // Convert the array to floats - a = [ parseFloat(a[0]), parseFloat(a[1]) ]; - - // Test if all values are numerical - if( !isNumeric(a[0]) || !isNumeric(a[1]) ){ - return false; - } - - // The lowest value must really be the lowest value. - if( a[1] < a[0] ){ - return false; - } - - return a; - } - - var serialization = { - resolution: function(q,o){ - - // Parse the syntactic sugar that is the serialization - // resolution option to a usable integer. - // Checking for a string '1', since the resolution needs - // to be cast to a string to split in on the period. - switch( q ){ - case 1: - case 0.1: - case 0.01: - case 0.001: - case 0.0001: - case 0.00001: - q = q.toString().split('.'); - o['decimals'] = q[0] === '1' ? 0 : q[1].length; - break; - case undefined: - o['decimals'] = 2; - break; - default: - return false; - } - - return true; - } - ,mark: function(q,o,w){ - - if ( !q ) { - o[w]['mark'] = '.'; - return true; - } - - switch( q ){ - case '.': - case ',': - return true; - default: - return false; - } - } - ,to: function(q,o,w){ - - // Checks whether a variable is a candidate to be a - // valid serialization target. - function ser(r){ - return isInstance ( r ) || - typeof r === 'string' || - typeof r === 'function' || - r === false || - ( isInstance ( r[0] ) && - typeof r[0][r[1]] === 'function' ); - } - - // Flatten the serialization array into a reliable - // set of elements, which can be tested and looped. - function filter ( value ) { - - var items = [[],[]]; - - // If a single value is provided it can be pushed - // immediately. - if ( ser(value) ) { - items[0].push(value); - } else { - - // Otherwise, determine whether this is an - // array of single elements or sets. - $.each(value, function(i, val) { - - // Don't handle an overflow of elements. - if( i > 1 ){ - return; - } - - // Decide if this is a group or not - if( ser(val) ){ - items[i].push(val); - } else { - items[i] = items[i].concat(val); - } - }); - } - - return items; - } - - if ( !q ) { - o[w]['to'] = [[],[]]; - } else { - - var i, j; - - // Flatten the serialization array - q = filter ( q ); - - // Reverse the API for RTL sliders. - if ( o['direction'] && q[1].length ) { - q.reverse(); - } - - // Test all elements in the flattened array. - for ( i = 0; i < o['handles']; i++ ) { - for ( j = 0; j < q[i].length; j++ ) { - - // Return false on invalid input - if( !ser(q[i][j]) ){ - return false; - } - - // Remove 'false' elements, since those - // won't be handled anyway. - if( !q[i][j] ){ - q[i].splice(j, 1); - } - } - } - - // Write the new values back - o[w]['to'] = q; - } - - return true; - } - }, tests = { - /* Handles. - * Has default, can be 1 or 2. - */ - 'handles': { - 'r': true - ,'t': function(q){ - q = parseInt(q, 10); - return ( q === 1 || q === 2 ); - } - } - /* Range. - * Must be an array of two numerical floats, - * which can't be identical. - */ - ,'range': { - 'r': true - ,'t': function(q,o,w){ - - o[w] = values(q); - - // The values can't be identical. - return o[w] && o[w][0] !== o[w][1]; - } - } - /* Start. - * Must be an array of two numerical floats when handles = 2; - * Uses 'range' test. - * When handles = 1, a single float is also allowed. - */ - ,'start': { - 'r': true - ,'t': function(q,o,w){ - if( o['handles'] === 1 ){ - if( $.isArray(q) ){ - q = q[0]; - } - q = parseFloat(q); - o.start = [q]; - return isNumeric(q); - } - - o[w] = values(q); - return !!o[w]; - } - } - /* Connect. - * Must be true or false when handles = 2; - * Can use 'lower' and 'upper' when handles = 1. - */ - ,'connect': { - 'r': true - ,'t': function(q,o,w){ - - if ( q === 'lower' ) { - o[w] = 1; - } else if ( q === 'upper' ) { - o[w] = 2; - } else if ( q === true ) { - o[w] = 3; - } else if ( q === false ) { - o[w] = 0; - } else { - return false; - } - - return true; - } - } - /* Connect. - * Will default to horizontal, not required. - */ - ,'orientation': { - 't': function(q,o,w){ - switch (q){ - case 'horizontal': - o[w] = 0; - break; - case 'vertical': - o[w] = 1; - break; - default: return false; - } - return true; - } - } - /* Margin. - * Must be a float, has a default value. - */ - ,'margin': { - 'r': true - ,'t': function(q,o,w){ - q = parseFloat(q); - o[w] = fromPercentage(o['range'], q); - return isNumeric(q); - } - } - /* Direction. - * Required, can be 'ltr' or 'rtl'. - */ - ,'direction': { - 'r': true - ,'t': function(q,o,w){ - - switch ( q ) { - case 'ltr': o[w] = 0; - break; - case 'rtl': o[w] = 1; - // Invert connection for RTL sliders; - o['connect'] = [0,2,1,3][o['connect']]; - break; - default: - return false; - } - - return true; - } - } - /* Behaviour. - * Required, defines responses to tapping and - * dragging elements. - */ - ,'behaviour': { - 'r': true - ,'t': function(q,o,w){ - - o[w] = { - 'tap': q !== (q = q.replace('tap', '')) - ,'extend': q !== (q = q.replace('extend', '')) - ,'drag': q !== (q = q.replace('drag', '')) - ,'fixed': q !== (q = q.replace('fixed', '')) - }; - - return !q.replace('none','').replace(/\-/g,''); - } - } - /* Serialization. - * Required, but has default. Must be an array - * when using two handles, can be a single value when using - * one handle. 'mark' can be period (.) or comma (,). - */ - ,'serialization': { - 'r': true - ,'t': function(q,o,w){ - - return serialization.to( q['to'], o, w ) && - serialization.resolution( q['resolution'], o ) && - serialization.mark( q['mark'], o, w ); - } - } - /* Slide. - * Not required. Must be a function. - */ - ,'slide': { - 't': function(q){ - return $.isFunction(q); - } - } - /* Set. - * Not required. Must be a function. - * Tested using the 'slide' test. - */ - ,'set': { - 't': function(q){ - return $.isFunction(q); - } - } - /* Block. - * Not required. Must be a function. - * Tested using the 'slide' test. - */ - ,'block': { - 't': function(q){ - return $.isFunction(q); - } - } - /* Step. - * Not required. - */ - ,'step': { - 't': function(q,o,w){ - q = parseFloat(q); - o[w] = fromPercentage ( o['range'], q ); - return isNumeric(q); - } - } - }; - - $.each( tests, function( name, test ){ - - /*jslint devel: true */ - - var value = input[name], isSet = value !== undefined; - - // If the value is required but not set, fail. - if( ( test['r'] && !isSet ) || - // If the test returns false, fail. - ( isSet && !test['t']( value, input, name ) ) ){ - - // For debugging purposes it might be very useful to know - // what option caused the trouble. Since throwing an error - // will prevent further script execution, log the error - // first. Test for console, as it might not be available. - if( console && console.log && console.group ){ - console.group( 'Invalid noUiSlider initialisation:' ); - console.log( 'Option:\t', name ); - console.log( 'Value:\t', value ); - console.log( 'Slider(s):\t', sliders ); - console.groupEnd(); - } - - throw new RangeError('noUiSlider'); - } - }); - } - - // Parse options, add classes, attach events, create HTML. - function create ( options ) { - - /*jshint validthis: true */ - - // Store the original set of options on all targets, - // so they can be re-used and re-tested later. - // Make sure to break the relation with the options, - // which will be changed by the 'test' function. - this.data('options', $.extend(true, {}, options)); - - // Set defaults where applicable; - options = $.extend({ - 'handles': 2 - ,'margin': 0 - ,'connect': false - ,'direction': 'ltr' - ,'behaviour': 'tap' - ,'orientation': 'horizontal' - }, options); - - // Make sure the test for serialization runs. - options['serialization'] = options['serialization'] || {}; - - // Run all options through a testing mechanism to ensure correct - // input. The test function will throw errors, so there is - // no need to capture the result of this call. It should be noted - // that options might get modified to be handled properly. E.g. - // wrapping integers in arrays. - test( options, this ); - - // Pre-define the styles. - options['style'] = options['orientation'] ? 'top' : 'left'; - - return this.each(function(){ - - var target = $(this), i, dragable, handles = [], handle, - base = $('
            ').appendTo(target); - - // Throw an error if the slider was already initialized. - if ( target.data('base') ) { - throw new Error('Slider was already initialized.'); - } - - // Apply classes and data to the target. - target.data('base', base).addClass([ - clsList[6] - ,clsList[16 + options['direction']] - ,clsList[10 + options['orientation']] ].join(' ')); - - for (i = 0; i < options['handles']; i++ ) { - - handle = $('
            ').appendTo(base); - - // Add all default and option-specific classes to the - // origins and handles. - handle.addClass( clsList[1] ); - - handle.children().addClass([ - clsList[2] - ,clsList[2] + clsList[ 7 + options['direction'] + - ( options['direction'] ? -1 * i : i ) ]].join(' ') ); - - // Make sure every handle has access to all variables. - handle.data({ - 'base': base - ,'target': target - ,'options': options - ,'grab': handle.children() - ,'pct': -1 - }).attr('data-style', options['style']); - - // Every handle has a storage point, which takes care - // of triggering the proper serialization callbacks. - handle.data({ - 'store': store(handle, i, options['serialization']) - }); - - // Store handles on the base - handles.push(handle); - } - - // Apply the required connection classes to the elements - // that need them. Some classes are made up for several - // segments listed in the class list, to allow easy - // renaming and provide a minor compression benefit. - switch ( options['connect'] ) { - case 1: target.addClass( clsList[9] ); - handles[0].addClass( clsList[12] ); - break; - case 3: handles[1].addClass( clsList[12] ); - /* falls through */ - case 2: handles[0].addClass( clsList[9] ); - /* falls through */ - case 0: target.addClass(clsList[12]); - break; - } - - // Merge base classes with default, - // and store relevant data on the base element. - base.addClass( clsList[0] ).data({ - 'target': target - ,'options': options - ,'handles': handles - }); - - // Use the public value method to set the start values. - target.val( options['start'] ); - - // Attach the standard drag event to the handles. - if ( !options['behaviour']['fixed'] ) { - for ( i = 0; i < handles.length; i++ ) { - - // These events are only bound to the visual handle - // element, not the 'real' origin element. - attach ( actions.start, handles[i].children(), start, { - base: base - ,target: target - ,handles: [ handles[i] ] - }); - } - } - - // Attach the tap event to the slider base. - if ( options['behaviour']['tap'] ) { - attach ( actions.start, base, tap, { - base: base - ,target: target - }); - } - - // Extend tapping behaviour to target - if ( options['behaviour']['extend'] ) { - - target.addClass( clsList[19] ); - - if ( options['behaviour']['tap'] ) { - attach ( actions.start, target, edge, { - base: base - ,target: target - }); - } - } - - // Make the range dragable. - if ( options['behaviour']['drag'] ){ - - dragable = base.find('.'+clsList[9]).addClass(clsList[18]); - - // When the range is fixed, the entire range can - // be dragged by the handles. The handle in the first - // origin will propagate the start event upward, - // but it needs to be bound manually on the other. - if ( options['behaviour']['fixed'] ) { - dragable = dragable - .add( base.children().not(dragable).data('grab') ); - } - - attach ( actions.start, dragable, start, { - base: base - ,target: target - ,handles: handles - }); - } - }); - } - - // Return value for the slider, relative to 'range'. - function getValue ( ) { - - /*jshint validthis: true */ - - var base = $(this).data('base'), answer = []; - - // Loop the handles, and get the value from the input - // for every handle on its' own. - $.each( base.data('handles'), function(){ - answer.push( $(this).data('store').val() ); - }); - - // If the slider has just one handle, return a single value. - // Otherwise, return an array, which is in reverse order - // if the slider is used RTL. - if ( answer.length === 1 ) { - return answer[0]; - } - - if ( base.data('options').direction ) { - return answer.reverse(); - } - - return answer; - } - - // Set value for the slider, relative to 'range'. - function setValue ( args, set ) { - - /*jshint validthis: true */ - - // If the value is to be set to a number, which is valid - // when using a one-handle slider, wrap it in an array. - if( !$.isArray(args) ){ - args = [args]; - } - - // Setting is handled properly for each slider in the data set. - return this.each(function(){ - - var b = $(this).data('base'), to, i, - handles = Array.prototype.slice.call(b.data('handles'),0), - settings = b.data('options'); - - // If there are multiple handles to be set run the setting - // mechanism twice for the first handle, to make sure it - // can be bounced of the second one properly. - if ( handles.length > 1) { - handles[2] = handles[0]; - } - - // The RTL settings is implemented by reversing the front-end, - // internal mechanisms are the same. - if ( settings['direction'] ) { - args.reverse(); - } - - for ( i = 0; i < handles.length; i++ ){ - - // Calculate a new position for the handle. - to = args[ i%2 ]; - - // The set request might want to ignore this handle. - // Test for 'undefined' too, as a two-handle slider - // can still be set with an integer. - if( to === null || to === undefined ) { - continue; - } - - // Add support for the comma (,) as a decimal symbol. - // Replace it by a period so it is handled properly by - // parseFloat. Omitting this would result in a removal - // of decimals. This way, the developer can also - // input a comma separated string. - if( $.type(to) === 'string' ) { - to = to.replace(',', '.'); - } - - // Calculate the new handle position - to = toPercentage( settings['range'], parseFloat( to ) ); - - // Invert the value if this is an right-to-left slider. - if ( settings['direction'] ) { - to = 100 - to; - } - - // If the value of the input doesn't match the slider, - // reset it. Sometimes the input is changed to a value the - // slider has rejected. This can occur when using 'select' - // or 'input[type="number"]' elements. In this case, set - // the value back to the input. - if ( setHandle( handles[i], to ) !== true ){ - handles[i].data('store').val( true ); - } - - // Optionally trigger the 'set' event. - if( set === true ) { - call( settings['set'], $(this) ); - } - } - }); - } - - // Unbind all attached events, remove classed and HTML. - function destroy ( target ) { - - // Start the list of elements to be unbound with the target. - var elements = [[target,'']]; - - // Get the fields bound to both handles. - $.each(target.data('base').data('handles'), function(){ - elements = elements.concat( $(this).data('store').elements ); - }); - - // Remove all events added by noUiSlider. - $.each(elements, function(){ - if( this.length > 1 ){ - this[0].off( namespace ); - } - }); - - // Remove all classes from the target. - target.removeClass(clsList.join(' ')); - - // Empty the target and remove all data. - target.empty().removeData('base options'); - } - - // Merge options with current initialization, destroy slider - // and reinitialize. - function build ( options ) { - - /*jshint validthis: true */ - - return this.each(function(){ - - // When uninitialised, jQuery will return '', - // Zepto returns undefined. Both are falsy. - var values = $(this).val() || false, - current = $(this).data('options'), - // Extend the current setup with the new options. - setup = $.extend( {}, current, options ); - - // If there was a slider initialised, remove it first. - if ( values !== false ) { - destroy( $(this) ); - } - - // Make the destroy method publicly accessible. - if( !options ) { - return; - } - - // Create a new slider - $(this)['noUiSlider']( setup ); - - // Set the slider values back. If the start options changed, - // it gets precedence. - if ( values !== false && setup.start === current.start ) { - $(this).val( values ); - } - }); - } - - // Overwrite the native jQuery value function - // with a simple handler. noUiSlider will use the internal - // value method, anything else will use the standard method. - $.fn.val = function(){ - - // If the function is called without arguments, - // act as a 'getter'. Call the getValue function - // in the same scope as this call. - if ( this.hasClass( clsList[6] ) ){ - return arguments.length ? - setValue.apply( this, arguments ) : - getValue.apply( this ); - } - - // If this isn't noUiSlider, continue with jQuery's - // original method. - return $VAL.apply( this, arguments ); - }; - - return ( rebuild ? build : create ).call( this, options ); - }; - -}( window['jQuery'] || window['Zepto'] )); diff --git a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/vendor/nouislider/redux.jquery.nouislider.min.js b/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/vendor/nouislider/redux.jquery.nouislider.min.js deleted file mode 100755 index 73dfa3ce..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/inc/fields/slider/vendor/nouislider/redux.jquery.nouislider.min.js +++ /dev/null @@ -1,20 +0,0 @@ -(function(f){if(f.zepto&&!f.fn.removeData)throw new ReferenceError("Zepto is loaded without the data module.");f.fn.noUiSlider=function(C,D){function s(a,b){return 100*b/(a[1]-a[0])}function E(a,b){return b*(a[1]-a[0])/100+a[0]}function t(a){return a instanceof f||f.zepto&&f.zepto.isZ(a)}function n(a){return!isNaN(parseFloat(a))&&isFinite(a)}function r(a,b){f.isArray(a)||(a=[a]);f.each(a,function(){"function"===typeof this&&this.call(b)})}function F(a,b){return function(){var c=[null,null];c[b]=f(this).val(); -a.val(c,!0)}}function G(a,b){a=a.toFixed(b.decimals);0===parseFloat(a)&&(a=a.replace("-0","0"));return a.replace(".",b.serialization.mark)}function u(a){return parseFloat(a.toFixed(7))}function p(a,b,c,d){var e=d.target;a=a.replace(/\s/g,h+" ")+h;b.on(a,function(a){var b=e.attr("disabled");if(e.hasClass("noUi-state-tap")||void 0!==b&&null!==b)return!1;var g;a.preventDefault();var b=0===a.type.indexOf("touch"),h=0===a.type.indexOf("mouse"),l=0===a.type.indexOf("pointer"),v,H=a;0===a.type.indexOf("MSPointer")&& -(l=!0);a.originalEvent&&(a=a.originalEvent);b&&(g=a.changedTouches[0].pageX,v=a.changedTouches[0].pageY);if(h||l)l||void 0!==window.pageXOffset||(window.pageXOffset=document.documentElement.scrollLeft,window.pageYOffset=document.documentElement.scrollTop),g=a.clientX+window.pageXOffset,v=a.clientY+window.pageYOffset;g=f.extend(H,{pointX:g,pointY:v,cursor:h});c(g,d,e.data("base").data("options"))})}function I(a){var b=this.target;if(void 0===a)return this.element.data("value");!0===a?a=this.element.data("value"): -this.element.data("value",a);void 0!==a&&f.each(this.elements,function(){if("function"===typeof this)this.call(b,a);else this[0][this[1]](a)})}function J(a,b,c){if(t(b)){var d=[],e=a.data("target");a.data("options").direction&&(c=c?0:1);b.each(function(){f(this).on("change"+h,F(e,c));d.push([f(this),"val"])});return d}"string"===typeof b&&(b=[f('').appendTo(a).addClass(g[3]).change(function(a){a.stopPropagation()}),"val"]);return[b]}function K(a,b,c){var d=[];f.each(c.to[b], -function(e){d=d.concat(J(a,c.to[b][e],b))});return{element:a,elements:d,target:a.data("target"),val:I}}function L(a,b){var c=a.data("target");c.hasClass(g[14])||(b||(c.addClass(g[15]),setTimeout(function(){c.removeClass(g[15])},450)),c.addClass(g[14]),r(a.data("options").h,c))}function w(a,b){var c=a.data("options");b=u(b);a.data("target").removeClass(g[14]);a.css(c.style,b+"%").data("pct",b);a.is(":first-child")&&a.toggleClass(g[13],50k?100:k);if(b===a.data("pct"))return[e?e:!1,100===k?!1:k];w(a,b);return!0}function A(a,b,c,d){a.addClass(g[5]);setTimeout(function(){a.removeClass(g[5])},300);x(b,c);r(d,a.data("target"));a.data("target").change()}function M(a,b,c){var d= -b.a,e=a[b.d]-b.start[b.d],e=100*e/b.size;if(1===d.length){if(a=x(d[0],b.c[0]+e),!0!==a){0<=f.inArray(d[0].data("pct"),a)&&L(b.b,!c.margin);return}}else{var k,m;c.step&&(a=c.step,e=Math.round(e/a)*a);a=k=b.c[0]+e;e=m=b.c[1]+e;0>a?(e+=-1*a,a=0):100k&&!a&&!d[0].data("pct")||100===e&&100").appendTo(b);if(b.data("base"))throw Error("Slider was already initialized.");b.data("base",k).addClass([g[6],g[16+a.direction],g[10+a.orientation]].join(" "));for(c=0;c
            ").appendTo(k),e.addClass(g[1]),e.children().addClass([g[2], -g[2]+g[7+a.direction+(a.direction?-1*c:c)]].join(" ")),e.data({base:k,target:b,options:a,grab:e.children(),pct:-1}).attr("data-style",a.style),e.data({store:K(e,c,a.serialization)}),d.push(e);switch(a.connect){case 1:b.addClass(g[9]);d[0].addClass(g[12]);break;case 3:d[1].addClass(g[12]);case 2:d[0].addClass(g[9]);case 0:b.addClass(g[12])}k.addClass(g[0]).data({target:b,options:a,handles:d});b.val(a.start);if(!a.behaviour.fixed)for(c=0;ch[0]?d+Math.abs(h[0]):d-h[0]);g.direction&&(d=100-d);!0!==x(e[c],d)&&e[c].data("store").val(!0);!0===b&&r(g.set,f(this))}})}function U(a){var b=[[a,""]];f.each(a.data("base").data("handles"), -function(){b=b.concat(f(this).data("store").elements)});f.each(b,function(){1
            '; - - require_once 'views/about.php'; - - } - - /** - * Render Changelog Screen - * - * @access public - * @since 2.0.3 - * @return void - */ - public function changelog_screen() { - // Stupid hack for Wordpress alerts and warnings - echo '

            '; - - require_once 'views/changelog.php'; - - } - - /** - * Render Changelog Screen - * - * @access public - * @since 2.0.3 - * @return void - */ - public function redux_extensions() { - // Stupid hack for Wordpress alerts and warnings - echo '

            '; - - require_once 'views/extensions.php'; - - } - - - /** - * Render Get Support Screen - * - * @access public - * @since 1.9 - * @return void - */ - public function get_support() { - // Stupid hack for Wordpress alerts and warnings - echo '

            '; - - require_once 'views/support.php'; - - } - - /** - * Render Credits Screen - * - * @access public - * @since 1.4 - * @return void - */ - public function credits_screen() { - // Stupid hack for Wordpress alerts and warnings - echo '

            '; - - require_once 'views/credits.php'; - - } - - /** - * Render Status Report Screen - * - * @access public - * @since 1.4 - * @return void - */ - public function status_screen() { - // Stupid hack for Wordpress alerts and warnings - echo '

            '; - - require_once 'views/status_report.php'; - - } - - /** - * Parse the Redux readme.txt file - * - * @since 2.0.3 - * @return string $readme HTML formatted readme file - */ - public function parse_readme() { - if ( file_exists( ReduxFramework::$_dir . 'inc/fields/raw/parsedown.php' ) ) { - require_once ReduxFramework::$_dir . 'inc/fields/raw/parsedown.php'; - $Parsedown = new Parsedown(); - $data = @wp_remote_get( ReduxFramework::$_url . '../CHANGELOG.md' ); - if ( isset( $data ) && ! empty( $data ) ) { - $data = @wp_remote_retrieve_body( $data ); - return $Parsedown->text( trim( str_replace( '# Redux Framework Changelog', '', $data ) ) ); - } - } - - return ''; - - } - - public function actions() { - ?> -

            - Docs - Review Us - Donate - - -

            - get_contributors(); - - if ( empty ( $contributors ) ) { - return ''; - } - - $contributor_list = ''; - - return $contributor_list; - } - - /** - * Retreive list of contributors from GitHub. - * - * @access public - * @since 1.4 - * @return array $contributors List of contributors - */ - public function get_contributors() { - $contributors = get_transient( 'redux_contributors' ); - - if ( false !== $contributors ) { - return $contributors; - } - - $response = wp_remote_get( 'https://api.github.com/repos/ReduxFramework/redux-framework/contributors', array( 'sslverify' => false ) ); - - if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) { - return array(); - } - - $contributors = json_decode( wp_remote_retrieve_body( $response ) ); - - if ( ! is_array( $contributors ) ) { - return array(); - } - - set_transient( 'redux_contributors', $contributors, 3600 ); - - return $contributors; - } - } - - new Redux_Welcome(); - diff --git a/admin/core/lib/ReduxFramework/ReduxCore/languages/README.txt b/admin/core/lib/ReduxFramework/ReduxCore/languages/README.txt deleted file mode 100755 index 57b2f194..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/languages/README.txt +++ /dev/null @@ -1 +0,0 @@ -Please visit: https://github.com/ReduxFramework/ReduxFramework/wiki/Translate for details on how you can help. diff --git a/admin/core/lib/ReduxFramework/ReduxCore/languages/redux-framework.pot b/admin/core/lib/ReduxFramework/ReduxCore/languages/redux-framework.pot deleted file mode 100755 index 93d09c31..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/languages/redux-framework.pot +++ /dev/null @@ -1,1556 +0,0 @@ -# Copyright (C) 2015 Team Redux -# This file is distributed under the GPL3+. -msgid "" -msgstr "" -"Project-Id-Version: Redux Framework 3.5.3\n" -"Report-Msgid-Bugs-To: " -"https://github.com/ReduxFramework/ReduxFramework/issues\n" -"POT-Creation-Date: 2015-04-15 23:15:00+00:00\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2015-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"X-Generator: grunt-wp-i18n 0.4.9\n" -"X-Poedit-KeywordsList: " -"__;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;_nx_noop:1,2,3c;esc_" -"attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;esc_html_x:1,2c;\n" -"Language: en\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Poedit-Country: United States\n" -"X-Poedit-SourceCharset: UTF-8\n" -"X-Poedit-Basepath: ../\n" -"X-Poedit-SearchPath-0: .\n" -"X-Poedit-Bookmarks: \n" -"X-Textdomain-Support: yes\n" - -#: ReduxCore/core/enqueue.php:397 -#: ReduxCore/inc/extensions/customizer/extension_customizer.php:566 -msgid "You have changes that are not saved. Would you like to save them now?" -msgstr "" - -#: ReduxCore/core/enqueue.php:405 -#: ReduxCore/inc/extensions/customizer/extension_customizer.php:567 -msgid "Are you sure? Resetting will lose all custom values." -msgstr "" - -#: ReduxCore/core/enqueue.php:413 -msgid "Are you sure? Resetting will lose all custom values in this section." -msgstr "" - -#: ReduxCore/core/enqueue.php:421 -#: ReduxCore/inc/extensions/customizer/extension_customizer.php:568 -msgid "" -"Your current options will be replaced with the values of this preset. Would " -"you like to proceed?" -msgstr "" - -#: ReduxCore/core/enqueue.php:428 -msgid "Please Wait" -msgstr "" - -#: ReduxCore/core/enqueue.php:439 -msgid "There was an error saving. Here is the result of your action:" -msgstr "" - -#: ReduxCore/core/enqueue.php:440 -msgid "There was a problem with your action. Please try again or reload the page." -msgstr "" - -#: ReduxCore/core/panel.php:65 -msgid "Warning- This options panel will not work properly without javascript!" -msgstr "" - -#: ReduxCore/core/panel.php:141 -msgid "Settings Imported!" -msgstr "" - -#: ReduxCore/core/panel.php:156 -msgid "All Defaults Restored!" -msgstr "" - -#: ReduxCore/core/panel.php:170 -msgid "Section Defaults Restored!" -msgstr "" - -#: ReduxCore/core/panel.php:184 -msgid "Settings Saved!" -msgstr "" - -#: ReduxCore/core/panel.php:204 -msgid "Settings have changed, you should save them!" -msgstr "" - -#: ReduxCore/core/panel.php:212 -msgid "error(s) were found!" -msgstr "" - -#: ReduxCore/core/panel.php:220 -msgid "warning(s) were found!" -msgstr "" - -#: ReduxCore/core/panel.php:340 -msgid "" -"Your panel has bundled outdated copies of Redux Framework template " -"files – if you encounter functionality issues this could be " -"the reason. Ensure you update or remove them." -msgstr "" - -#: ReduxCore/framework.php:220 -msgid "Options panel created using %1$s" -msgstr "" - -#. Plugin Name of the plugin/theme -msgid "Redux Framework" -msgstr "" - -#: ReduxCore/framework.php:224 ReduxCore/framework.php:228 -msgid "Options" -msgstr "" - -#: ReduxCore/framework.php:1389 -#: ReduxCore/templates/panel/menu_container.tpl.php:63 -msgid "System Info" -msgstr "" - -#: ReduxCore/framework.php:1692 -msgid "Enable" -msgstr "" - -#: ReduxCore/framework.php:1697 -msgid "Disable" -msgstr "" - -#: ReduxCore/framework.php:1703 -msgid "moving the mouse over" -msgstr "" - -#: ReduxCore/framework.php:1705 -msgid "clicking" -msgstr "" - -#: ReduxCore/framework.php:1709 -msgid "" -"Hints are tooltips that popup when %d the hint icon, offering addition " -"information about the field in which they appear. They can be %d d by " -"using the link below." -msgstr "" - -#: ReduxCore/framework.php:1714 -msgid "Hints" -msgstr "" - -#: ReduxCore/framework.php:1841 -msgid "Default" -msgstr "" - -#: ReduxCore/framework.php:2680 -msgid "Invalid security credential, please reload the page and try again." -msgstr "" - -#: ReduxCore/framework.php:2766 -msgid "Your panel has no fields. Nothing to save." -msgstr "" - -#: ReduxCore/inc/class.redux_filesystem.php:23 -msgid "Unable to modify required files. Please ensure that" -msgstr "" - -#: ReduxCore/inc/class.redux_filesystem.php:25 -msgid "has the proper read/write permissions or enter your FTP information below." -msgstr "" - -#: ReduxCore/inc/class.redux_functions.php:237 -msgid "Dismiss" -msgstr "" - -#: ReduxCore/inc/class.redux_helpers.php:589 -msgid "" -"%s version %s is out of " -"date. The core version is %s" -msgstr "" - -#: ReduxCore/inc/class.redux_themecheck.php:61 -msgid "" -"The theme you are testing has %s embedded. We invite you to read the " -"%sTheme-Check Documentation%s to understand some warnings you will see " -"because of Redux." -msgstr "" - -#: ReduxCore/inc/class.redux_themecheck.php:109 -msgid "" -"The following directories & files are still located in your " -"Redux directory. They may cause errors in Theme-Check." -msgstr "" - -#: ReduxCore/inc/debug.php:41 ReduxCore/inc/debug.php:69 -#: ReduxCore/inc/debug.php:76 ReduxCore/inc/debug.php:77 -msgid "Options Object" -msgstr "" - -#: ReduxCore/inc/debug.php:54 -msgid "Show Object in Javascript Console Object" -msgstr "" - -#: ReduxCore/inc/extensions/customizer/extension_customizer.php:601 -msgid "You have changes that are not saved. Would you like to save them now?" -msgstr "" - -#: ReduxCore/inc/extensions/customizer/extension_customizer.php:602 -msgid "Are you sure? Resetting will lose all custom values." -msgstr "" - -#: ReduxCore/inc/extensions/customizer/extension_customizer.php:603 -msgid "" -"Your current options will be replaced with the values of this preset. " -"Would you like to proceed?" -msgstr "" - -#: ReduxCore/inc/extensions/import_export/extension_import_export.php:120 -msgid "Import / Export" -msgstr "" - -#: ReduxCore/inc/extensions/import_export/import_export/field_import_export.php:103 -msgid "Import Options" -msgstr "" - -#: ReduxCore/inc/extensions/import_export/import_export/field_import_export.php:104 -msgid "Import from File" -msgstr "" - -#: ReduxCore/inc/extensions/import_export/import_export/field_import_export.php:104 -msgid "Import from URL" -msgstr "" - -#: ReduxCore/inc/extensions/import_export/import_export/field_import_export.php:107 -msgid "" -"Input your backup file below and hit Import to restore your sites options " -"from a backup." -msgstr "" - -#: ReduxCore/inc/extensions/import_export/import_export/field_import_export.php:112 -msgid "" -"Input the URL to another sites options set and hit Import to load the " -"options from that site." -msgstr "" - -#: ReduxCore/inc/extensions/import_export/import_export/field_import_export.php:116 -msgid "Import" -msgstr "" - -#: ReduxCore/inc/extensions/import_export/import_export/field_import_export.php:116 -msgid "" -"WARNING! This will overwrite all existing option values, please proceed " -"with caution!" -msgstr "" - -#: ReduxCore/inc/extensions/import_export/import_export/field_import_export.php:119 -msgid "Export Options" -msgstr "" - -#: ReduxCore/inc/extensions/import_export/import_export/field_import_export.php:121 -msgid "" -"Here you can copy/download your current option settings. Keep this safe as " -"you can use it as a backup should anything go wrong, or you can use it to " -"restore your settings on this site (or any other site)." -msgstr "" - -#: ReduxCore/inc/extensions/import_export/import_export/field_import_export.php:126 -msgid "Copy Data" -msgstr "" - -#: ReduxCore/inc/extensions/import_export/import_export/field_import_export.php:126 -msgid "Download Data File" -msgstr "" - -#: ReduxCore/inc/extensions/import_export/import_export/field_import_export.php:126 -msgid "Copy Export URL" -msgstr "" - -#: ReduxCore/inc/fields/background/field_background.php:124 -#: ReduxCore/inc/fields/color/field_color.php:73 -#: ReduxCore/inc/fields/color_gradient/field_color_gradient.php:79 -#: ReduxCore/inc/fields/color_gradient/field_color_gradient.php:91 -msgid "Transparent" -msgstr "" - -#: ReduxCore/inc/fields/background/field_background.php:141 -msgid "Background Repeat" -msgstr "" - -#: ReduxCore/inc/fields/background/field_background.php:157 -msgid "Background Clip" -msgstr "" - -#: ReduxCore/inc/fields/background/field_background.php:173 -msgid "Background Origin" -msgstr "" - -#: ReduxCore/inc/fields/background/field_background.php:188 -msgid "Background Size" -msgstr "" - -#: ReduxCore/inc/fields/background/field_background.php:203 -msgid "Background Attachment" -msgstr "" - -#: ReduxCore/inc/fields/background/field_background.php:223 -msgid "Background Position" -msgstr "" - -#: ReduxCore/inc/fields/background/field_background.php:277 -#: ReduxCore/inc/fields/media/field_media.php:149 -msgid "No media selected" -msgstr "" - -#: ReduxCore/inc/fields/background/field_background.php:314 -#: ReduxCore/inc/fields/media/field_media.php:198 -#: ReduxCore/inc/fields/slides/field_slides.php:126 -#: ReduxCore/inc/fields/slides/field_slides.php:188 -msgid "Upload" -msgstr "" - -#: ReduxCore/inc/fields/background/field_background.php:321 -#: ReduxCore/inc/fields/media/field_media.php:205 -#: ReduxCore/inc/fields/multi_text/field_multi_text.php:69 -#: ReduxCore/inc/fields/multi_text/field_multi_text.php:73 -#: ReduxCore/inc/fields/multi_text/field_multi_text.php:76 -#: ReduxCore/inc/fields/slides/field_slides.php:133 -#: ReduxCore/inc/fields/slides/field_slides.php:190 -msgid "Remove" -msgstr "" - -#: ReduxCore/inc/fields/border/field_border.php:125 -#: ReduxCore/inc/fields/spacing/field_spacing.php:191 -msgid "All" -msgstr "" - -#: ReduxCore/inc/fields/border/field_border.php:138 -#: ReduxCore/inc/fields/spacing/field_spacing.php:215 -msgid "Top" -msgstr "" - -#: ReduxCore/inc/fields/border/field_border.php:145 -#: ReduxCore/inc/fields/spacing/field_spacing.php:222 -msgid "Right" -msgstr "" - -#: ReduxCore/inc/fields/border/field_border.php:152 -#: ReduxCore/inc/fields/spacing/field_spacing.php:229 -msgid "Bottom" -msgstr "" - -#: ReduxCore/inc/fields/border/field_border.php:159 -#: ReduxCore/inc/fields/spacing/field_spacing.php:236 -msgid "Left" -msgstr "" - -#: ReduxCore/inc/fields/border/field_border.php:173 -msgid "Border style" -msgstr "" - -#: ReduxCore/inc/fields/color_gradient/field_color_gradient.php:68 -msgid "From " -msgstr "" - -#: ReduxCore/inc/fields/color_gradient/field_color_gradient.php:82 -msgid "To " -msgstr "" - -#: ReduxCore/inc/fields/dimensions/field_dimensions.php:162 -msgid "Width" -msgstr "" - -#: ReduxCore/inc/fields/dimensions/field_dimensions.php:178 -#: ReduxCore/inc/fields/typography/field_typography.php:442 -msgid "Height" -msgstr "" - -#: ReduxCore/inc/fields/dimensions/field_dimensions.php:189 -#: ReduxCore/inc/fields/dimensions/field_dimensions.php:190 -#: ReduxCore/inc/fields/spacing/field_spacing.php:245 -#: ReduxCore/inc/fields/spacing/field_spacing.php:246 -msgid "Units" -msgstr "" - -#: ReduxCore/inc/fields/gallery/field_gallery.php:73 -msgid "Add/Edit Gallery" -msgstr "" - -#: ReduxCore/inc/fields/gallery/field_gallery.php:74 -msgid "Clear Gallery" -msgstr "" - -#: ReduxCore/inc/fields/link_color/field_link_color.php:87 -msgid "Regular" -msgstr "" - -#: ReduxCore/inc/fields/link_color/field_link_color.php:91 -msgid "Hover" -msgstr "" - -#: ReduxCore/inc/fields/link_color/field_link_color.php:95 -msgid "Visited" -msgstr "" - -#: ReduxCore/inc/fields/link_color/field_link_color.php:99 -msgid "Active" -msgstr "" - -#: ReduxCore/inc/fields/multi_text/field_multi_text.php:61 -msgid "Add More" -msgstr "" - -#: ReduxCore/inc/fields/password/field_password.php:62 -msgid "Password" -msgstr "" - -#: ReduxCore/inc/fields/password/field_password.php:63 -msgid "Username" -msgstr "" - -#: ReduxCore/inc/fields/select/field_select.php:83 -#: ReduxCore/inc/fields/select_image/field_select_image.php:63 -msgid "Select an item" -msgstr "" - -#: ReduxCore/inc/fields/select/field_select.php:134 -#: ReduxCore/inc/fields/select_image/field_select_image.php:144 -msgid "No items of this type were found." -msgstr "" - -#: ReduxCore/inc/fields/slides/field_slides.php:68 -msgid "Slide" -msgstr "" - -#: ReduxCore/inc/fields/slides/field_slides.php:73 -#: ReduxCore/inc/fields/slides/field_slides.php:174 -msgid "New %s" -msgstr "" - -#: ReduxCore/inc/fields/slides/field_slides.php:145 -#: ReduxCore/inc/fields/slides/field_slides.php:200 -msgid "Title" -msgstr "" - -#: ReduxCore/inc/fields/slides/field_slides.php:149 -#: ReduxCore/inc/fields/slides/field_slides.php:204 -msgid "Description" -msgstr "" - -#: ReduxCore/inc/fields/slides/field_slides.php:153 -#: ReduxCore/inc/fields/slides/field_slides.php:207 -msgid "URL" -msgstr "" - -#: ReduxCore/inc/fields/slides/field_slides.php:167 -#: ReduxCore/inc/fields/slides/field_slides.php:220 -msgid "Delete" -msgstr "" - -#: ReduxCore/inc/fields/slides/field_slides.php:223 -msgid "Add %s" -msgstr "" - -#: ReduxCore/inc/fields/switch/field_switch.php:41 -msgid "On" -msgstr "" - -#: ReduxCore/inc/fields/switch/field_switch.php:44 -msgid "Off" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:231 -msgid "Font Family" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:232 -msgid "Font family" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:258 -#: ReduxCore/inc/fields/typography/field_typography.php:259 -msgid "Backup Font Family" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:273 -#: ReduxCore/inc/fields/typography/field_typography.php:281 -msgid "Font style" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:274 -msgid "Font Weight & Style" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:281 -msgid "Style" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:321 -msgid "Font subsets" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:323 -msgid "Font Subsets" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:325 -msgid "Subsets" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:325 -msgid "Font script" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:342 -#: ReduxCore/inc/fields/typography/field_typography.php:343 -#: ReduxCore/inc/fields/typography/field_typography.php:344 -msgid "Text Align" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:365 -#: ReduxCore/inc/fields/typography/field_typography.php:366 -#: ReduxCore/inc/fields/typography/field_typography.php:367 -msgid "Text Transform" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:388 -#: ReduxCore/inc/fields/typography/field_typography.php:389 -#: ReduxCore/inc/fields/typography/field_typography.php:390 -msgid "Font Variant" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:408 -#: ReduxCore/inc/fields/typography/field_typography.php:409 -#: ReduxCore/inc/fields/typography/field_typography.php:410 -msgid "Text Decoration" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:432 -#: ReduxCore/inc/fields/typography/field_typography.php:433 -msgid "Font Size" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:433 -msgid "Size" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:441 -#: ReduxCore/inc/fields/typography/field_typography.php:442 -msgid "Line Height" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:450 -#: ReduxCore/inc/fields/typography/field_typography.php:451 -msgid "Word Spacing" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:459 -#: ReduxCore/inc/fields/typography/field_typography.php:460 -msgid "Letter Spacing" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:478 -msgid "Font Color" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:480 -msgid "Font color" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:879 -msgid "Standard Fonts" -msgstr "" - -#: ReduxCore/inc/fields/typography/field_typography.php:980 -msgid "Google Webfonts" -msgstr "" - -#: ReduxCore/inc/tracking.php:129 -msgid "Help improve Our Panel" -msgstr "" - -#: ReduxCore/inc/tracking.php:130 -msgid "" -"Please helps us improve our panel by allowing us to gather anonymous usage " -"stats so we know which configurations, plugins and themes to test to ensure " -"compatibility." -msgstr "" - -#: ReduxCore/inc/tracking.php:135 -msgid "Allow tracking" -msgstr "" - -#: ReduxCore/inc/tracking.php:140 -msgid "Do not allow tracking" -msgstr "" - -#: ReduxCore/inc/tracking.php:151 -msgid "Welcome to the Redux Demo Panel" -msgstr "" - -#: ReduxCore/inc/tracking.php:152 -msgid "Getting Started" -msgstr "" - -#: ReduxCore/inc/tracking.php:152 -msgid "" -"This panel demonstrates the many features of Redux. Before digging in, we " -"suggest you get up to speed by reviewing %1$s." -msgstr "" - -#: ReduxCore/inc/tracking.php:152 -msgid "our documentation" -msgstr "" - -#: ReduxCore/inc/tracking.php:153 -msgid "Redux Generator" -msgstr "" - -#: ReduxCore/inc/tracking.php:153 -msgid "" -"Want to get a head start? Use the %1$s. It will create a customized " -"boilerplate theme or a standalone admin folder complete with all things " -"Redux (with the help of Underscores and TGM). Save yourself a headache and " -"try it today." -msgstr "" - -#: ReduxCore/inc/tracking.php:154 ReduxCore/inc/welcome/welcome.php:214 -msgid "Redux Extensions" -msgstr "" - -#: ReduxCore/inc/tracking.php:154 -msgid "" -"Did you know we have extensions, which greatly enhance the features of " -"Redux? Visit our %1$s to learn more!" -msgstr "" - -#: ReduxCore/inc/tracking.php:154 -msgid "extensions directory" -msgstr "" - -#: ReduxCore/inc/tracking.php:155 -msgid "Like Redux?" -msgstr "" - -#: ReduxCore/inc/tracking.php:155 -msgid "" -"If so, please %1$s and consider making a %2$s to keep development of Redux " -"moving forward." -msgstr "" - -#: ReduxCore/inc/tracking.php:155 -msgid "leave us a favorable review on WordPress.org" -msgstr "" - -#: ReduxCore/inc/tracking.php:155 -msgid "donation" -msgstr "" - -#: ReduxCore/inc/tracking.php:156 -msgid "Newsletter" -msgstr "" - -#: ReduxCore/inc/tracking.php:156 -msgid "" -"If you'd like to keep up to with all things Redux, please subscribe to our " -"newsletter" -msgstr "" - -#: ReduxCore/inc/tracking.php:157 -msgid "Email address" -msgstr "" - -#: ReduxCore/inc/tracking.php:157 -msgid "Subscribe" -msgstr "" - -#: ReduxCore/inc/tracking.php:166 -msgid "Close" -msgstr "" - -#: ReduxCore/inc/validation/color/validation_color.php:15 -#: ReduxCore/inc/validation/color_rgba/validation_color_rgba.php:14 -#: ReduxCore/inc/validation/colorrgba/validation_colorrgba.php:16 -msgid "This field must be a valid color value." -msgstr "" - -#: ReduxCore/inc/validation/comma_numeric/validation_comma_numeric.php:16 -msgid "You must provide a comma separated list of numerical values for this option." -msgstr "" - -#: ReduxCore/inc/validation/css/validation_css.php:38 -msgid "Unsafe strings were found in your CSS and have been filtered out." -msgstr "" - -#: ReduxCore/inc/validation/date/validation_date.php:16 -msgid "This field must be a valid date." -msgstr "" - -#: ReduxCore/inc/validation/email/validation_email.php:16 -#: ReduxCore/inc/validation/email_not_empty/validation_email_not_empty.php:16 -msgid "You must provide a valid email for this option." -msgstr "" - -#: ReduxCore/inc/validation/no_html/validation_no_html.php:15 -msgid "You must not enter any HTML in this field, all HTML tags have been removed." -msgstr "" - -#: ReduxCore/inc/validation/no_special_chars/validation_no_special_chars.php:16 -msgid "" -"You must not enter any special characters in this field, all special " -"characters have been removed." -msgstr "" - -#: ReduxCore/inc/validation/not_empty/validation_not_empty.php:16 -msgid "This field cannot be empty. Please provide a value." -msgstr "" - -#: ReduxCore/inc/validation/numeric/validation_numeric.php:16 -#: ReduxCore/inc/validation/numeric_not_empty/validation_numeric_not_empty.php:16 -msgid "You must provide a numerical value for this option." -msgstr "" - -#: ReduxCore/inc/validation/unique_slug/validation_unique_slug.php:16 -msgid "" -"That URL slug is in use, please choose another. %s is open for " -"use." -msgstr "" - -#: ReduxCore/inc/validation/url/validation_url.php:16 -msgid "You must provide a valid URL for this option." -msgstr "" - -#: ReduxCore/inc/welcome/views/about.php:2 -msgid "Welcome to Redux Framework %s" -msgstr "" - -#: ReduxCore/inc/welcome/views/about.php:5 -msgid "" -"Thank you for updating to the latest version! Redux Framework %s is a huge " -"step forward in Redux Development. Look at all that's new." -msgstr "" - -#: ReduxCore/inc/welcome/views/about.php:8 -#: ReduxCore/inc/welcome/views/changelog.php:8 -#: ReduxCore/inc/welcome/views/credits.php:8 -#: ReduxCore/inc/welcome/views/extensions.php:82 -#: ReduxCore/inc/welcome/views/status_report.php:31 -#: ReduxCore/inc/welcome/views/support.php:8 -msgid "Version %s" -msgstr "" - -#: ReduxCore/inc/welcome/views/about.php:15 -msgid "What is Redux Framework?" -msgstr "" - -#: ReduxCore/inc/welcome/views/about.php:17 -msgid "" -"Redux Framework is the core of many products on the web. It is an option " -"framework which developers use to\n" -" enhance their products." -msgstr "" - -#: ReduxCore/inc/welcome/views/about.php:22 -msgid "Learn More" -msgstr "" - -#: ReduxCore/inc/welcome/views/about.php:28 -msgid "New in this Release" -msgstr "" - -#: ReduxCore/inc/welcome/views/changelog.php:2 -msgid "Redux Framework - Changelog" -msgstr "" - -#: ReduxCore/inc/welcome/views/changelog.php:5 -#: ReduxCore/inc/welcome/views/status_report.php:28 -msgid "" -"Our core mantra at Redux is backwards compatibility. With hundreds of " -"thousands of instances worldwide, you can be assured that we will take care " -"of you and your clients." -msgstr "" - -#: ReduxCore/inc/welcome/views/credits.php:2 -msgid "Redux Framework - A Community Effort" -msgstr "" - -#: ReduxCore/inc/welcome/views/credits.php:5 -msgid "" -"We recognize we are nothing without our community. We would like to thank " -"all of those who help Redux to be what it is. Thank you for your " -"involvement." -msgstr "" - -#: ReduxCore/inc/welcome/views/credits.php:14 -msgid "" -"Redux is created by a community of developers world wide. Want to have your " -"name listed too? Contribute to Redux." -msgstr "" - -#: ReduxCore/inc/welcome/views/extensions.php:76 -msgid "Redux Framework - Extensions" -msgstr "" - -#: ReduxCore/inc/welcome/views/extensions.php:79 -msgid "" -"Supercharge your Redux experience. Our extensions provide you with features " -"that will take your products to the next level." -msgstr "" - -#: ReduxCore/inc/welcome/views/extensions.php:88 -msgid "" -"While some are built specificially for developers, extensions such as " -"Custom Fonts are sure to make any user happy." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:25 -msgid "Redux Framework - System Status" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:38 -msgid "" -"Please copy and paste this information in your ticket when contacting " -"support:" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:41 -msgid "Get System Report" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:44 -msgid "Understanding the Status Report" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:51 -msgid "Copied!" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:51 -msgid "Copy for Support" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:60 -msgid "WordPress Environment" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:65 -msgid "Home URL" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:66 -msgid "The URL of your site's homepage." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:70 -msgid "Site URL" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:71 -msgid "The root URL of your site." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:75 -msgid "Redux Version" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:76 -msgid "The version of Redux Framework installed on your site." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:80 -msgid "Redux Data Directory Writable" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:83 -msgid "" -"Redux and its extensions write data to the uploads directory. " -"This directory must be writable." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:88 -msgid "To allow data saving, make %s writable." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:93 -msgid "WP Content URL" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:96 -msgid "The location of Wordpress's content URL." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:102 -msgid "WP Version" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:103 -msgid "The version of WordPress installed on your site." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:107 -msgid "WP Multisite" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:108 -msgid "Whether or not you have WordPress Multisite enabled." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:116 -msgid "Permalink Structure" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:117 -msgid "" -"The current permalink structure as defined in Wordpress " -"Settings->Permalinks." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:122 -msgid "Front Page Display" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:123 -msgid "The current Reading mode of Wordpress." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:131 -msgid "Front Page" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:132 -msgid "The currently selected page which acts as the site's Front Page." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:136 -msgid "Posts Page" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:137 -msgid "The currently selected page in where blog posts are displayed." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:144 -msgid "WP Memory Limit" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:145 -msgid "The maximum amount of memory (RAM) that your site can use at one time." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:150 -msgid "" -"%s - We recommend setting memory to at least 40MB. See: Increasing memory allocated to PHP" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:157 -msgid "Database Table Prefix" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:159 -msgid "The prefix structure of the current Wordpress database." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:163 -msgid "WP Debug Mode" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:164 -msgid "Displays whether or not WordPress is in Debug Mode." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:172 -msgid "Language" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:173 -msgid "The current language used by WordPress. Default = English" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:181 -msgid "Browser" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:186 -msgid "Browser Info" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:187 -msgid "Information about web browser current in use." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:202 -msgid "Server Environment" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:207 -msgid "Server Info" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:208 -msgid "Information about the web server that is currently hosting your site." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:212 -msgid "Localhost Environment" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:213 -msgid "Is the server running in a localhost environment." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:223 -msgid "PHP Version" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:224 -msgid "The version of PHP installed on your hosting server." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:228 -msgid "ABSPATH" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:229 -msgid "The ABSPATH variable on the server." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:235 -msgid "PHP Memory Limit" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:236 -#: ReduxCore/inc/welcome/views/status_report.php:241 -msgid "The largest filesize that can be contained in one post." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:240 -msgid "PHP Post Max Size" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:245 -msgid "PHP Time Limit" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:246 -msgid "" -"The amount of time (in seconds) that your site will spend on a single " -"operation before timing out (to avoid server lockups)" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:250 -msgid "PHP Max Input Vars" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:251 -msgid "" -"The maximum number of variables your server can use for a single function " -"to avoid overloads." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:255 -msgid "PHP Display Errors" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:256 -msgid "Determines if PHP will display errors within the browser." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:267 -msgid "SUHOSIN Installed" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:268 -msgid "" -"Suhosin is an advanced protection system for PHP installations. It was " -"designed to protect your servers on the one hand against a number of well " -"known problems in PHP applications and on the other hand against potential " -"unknown vulnerabilities within these applications or the PHP core itself. " -"If enabled on your server, Suhosin may need to be configured to increase " -"its data submission limits." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:277 -msgid "MySQL Version" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:278 -msgid "The version of MySQL installed on your hosting server." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:282 -msgid "Max Upload Size" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:283 -msgid "The largest filesize that can be uploaded to your WordPress installation." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:287 -msgid "Default Timezone is UTC" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:290 -msgid "The default timezone for your server." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:293 -msgid "Default timezone is %s - it should be UTC" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:304 -msgid "Used when communicating with remote services with PHP." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:310 -msgid "" -"Your server does not have fsockopen or cURL enabled - cURL is used to " -"communicate with other servers. Please contact your hosting provider." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:349 -msgid "Remote Post" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:350 -msgid "Used to send data to remote servers." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:355 -msgid "" -"wp_remote_post() failed. Many advanced features may not function. Contact " -"your hosting provider." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:358 -#: ReduxCore/inc/welcome/views/status_report.php:373 -msgid "Error: %s" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:365 -msgid "Remote Get" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:366 -msgid "Used to grab information from remote servers for updates updates." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:371 -msgid "" -"wp_remote_get() failed. This is needed to get information from remote " -"servers. Contact your hosting provider." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:405 -msgid "Active Plugins" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:421 -msgid "Visit plugin homepage" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:445 -msgid "Redux Instance: " -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:452 -msgid "The opt_name argument for this instance of Redux." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:460 -msgid "The global_variable argument for this instance of Redux." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:468 -msgid "Indicates if developer mode is enabled for this instance of Redux." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:473 -msgid "Indicates if ajax based saving is enabled for this instance of Redux." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:478 -msgid "" -"The page slug denotes the string used for the options panel page for this " -"instance of Redux." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:483 -msgid "" -"The page permissions variable sets the permission level required to access " -"the options panel for this instance of Redux." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:488 -msgid "" -"This variable set whether or not the menu is displayed as an admin menu " -"item for this instance of Redux." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:493 -msgid "" -"The page parent variable sets where the options menu will be placed on the " -"WordPress admin sidebar for this instance of Redux." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:499 -msgid "Indicates if the compiler flag is enabled for this instance of Redux." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:504 -msgid "" -"Indicates if output flag for globally shutting off all CSS output is " -"enabled for this instance of Redux." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:509 -msgid "" -"The output_tag variable sets whether or not dynamic CSS will be generated " -"for the customizer and Google fonts for this instance of Redux." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:518 -msgid "" -"The specified template path containing custom template files for this " -"instance of Redux." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:523 -msgid "List of template files overriding the default Redux template files." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:546 -msgid "Indicates the installed Redux extensions and their version numbers." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:577 -msgid "Theme" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:582 -msgid "Name" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:583 -msgid "The name of the current active theme." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:587 -msgid "Version" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:588 -msgid "The installed version of the current active theme." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:593 -msgid "is available" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:598 -msgid "Author URL" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:599 -msgid "The theme developers URL." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:603 -msgid "Child Theme" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:604 -msgid "Displays whether or not the current theme is a child theme." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:606 -msgid "" -"If you're modifying Redux Framework or a parent theme you didn't build " -"personally, we recommend using a child theme. See: How to create a child theme" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:614 -msgid "Parent Theme Name" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:616 -msgid "The name of the parent theme." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:620 -msgid "Parent Theme Version" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:623 -msgid "The installed version of the parent theme." -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:627 -msgid "Parent Theme Author URL" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:630 -msgid "The parent theme developers URL." -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:2 -msgid "Redux Framework - Support" -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:5 -msgid "" -"We are an open source project used by developers to make powerful control " -"panels." -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:20 -msgid "Generate a Support URL" -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:21 -msgid "Select Support Type" -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:22 -#: ReduxCore/inc/welcome/views/support.php:65 -msgid "How to Get Support" -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:27 -msgid "Submit a Support Request" -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:30 -msgid "To get started, we will need to generate a support hash." -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:33 -msgid "" -"This will provide to your developer all the information they may need to " -"remedy your issue. This action WILL send information securely to a remote " -"server. To see the type of information sent, please look at the Status tab." -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:37 -msgid "" -"Generate\n" -" a Support URL" -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:44 -msgid "Select Your Support Type" -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:47 -msgid "What type of user are you?" -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:52 -msgid "User" -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:53 -msgid "I am a user, using a pre-built product." -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:56 -msgid "Developer" -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:57 -msgid "I am a developer, building a product using Redux." -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:68 -msgid "" -"Please proceed to the Redux Framework issue tracker and supply us with your " -"support URL below. Please also provide any information that will help us to " -"reproduce your issue." -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:74 -msgid "" -"Listed below are the Wordpress plugins and/or theme installed on your site " -"that utilize Redux Framework. We do not directly support products created " -"with our framework. It is the responsibility of the plugin or theme " -"developer to support their work. You will need to contact the author(s) of " -"the products listed below with your support questions." -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:77 -msgid "" -"Please be sure to include for your developer - via cut and paste - the " -"Support URL in the box below." -msgstr "" - -#: ReduxCore/inc/welcome/views/support.php:215 -msgid "" -"Should the developer not be responsive, read the following article before asking for support from us " -"directly." -msgstr "" - -#: ReduxCore/inc/welcome/welcome.php:170 -msgid "Support hash could not be generated. Please try again later." -msgstr "" - -#: ReduxCore/inc/welcome/welcome.php:190 -msgid "Welcome to Redux Framework" -msgstr "" - -#: ReduxCore/inc/welcome/welcome.php:198 -msgid "Redux Framework Changelog" -msgstr "" - -#: ReduxCore/inc/welcome/welcome.php:206 class.redux-plugin.php:411 -msgid "Get Support" -msgstr "" - -#: ReduxCore/inc/welcome/welcome.php:223 -msgid "The people that develop Redux Framework" -msgstr "" - -#: ReduxCore/inc/welcome/welcome.php:231 -msgid "Redux Framework Status" -msgstr "" - -#: ReduxCore/inc/welcome/welcome.php:336 -msgid "What's New" -msgstr "" - -#: ReduxCore/inc/welcome/welcome.php:340 -msgid "Extensions" -msgstr "" - -#: ReduxCore/inc/welcome/welcome.php:344 -msgid "Changelog" -msgstr "" - -#: ReduxCore/inc/welcome/welcome.php:348 -msgid "Credits" -msgstr "" - -#: ReduxCore/inc/welcome/welcome.php:352 -msgid "Support" -msgstr "" - -#: ReduxCore/inc/welcome/welcome.php:356 -msgid "Status" -msgstr "" - -#: ReduxCore/inc/welcome/welcome.php:513 -msgid "View %s" -msgstr "" - -#: ReduxCore/templates/panel/footer.tpl.php:47 -#: ReduxCore/templates/panel/header_stickybar.tpl.php:20 -msgid "Save Changes" -msgstr "" - -#: ReduxCore/templates/panel/footer.tpl.php:50 -#: ReduxCore/templates/panel/header_stickybar.tpl.php:22 -msgid "Reset Section" -msgstr "" - -#: ReduxCore/templates/panel/footer.tpl.php:51 -#: ReduxCore/templates/panel/header_stickybar.tpl.php:23 -msgid "Reset All" -msgstr "" - -#: ReduxCore/templates/panel/footer.tpl.php:56 -#: ReduxCore/templates/panel/header_stickybar.tpl.php:26 -msgid "Working..." -msgstr "" - -#: ReduxCore/templates/panel/header.tpl.php:18 -msgid "Developer Mode Enabled" -msgstr "" - -#: ReduxCore/templates/panel/header_stickybar.tpl.php:16 -msgid "Expand" -msgstr "" - -#: class.redux-plugin.php:307 -msgid "Redux Framework has an embedded demo." -msgstr "" - -#: class.redux-plugin.php:307 -msgid "Click here to activate the sample config file." -msgstr "" - -#: class.redux-plugin.php:408 -msgid "Docs" -msgstr "" - -#: class.redux-plugin.php:409 -msgid "Repo" -msgstr "" - -#: class.redux-plugin.php:410 -msgid "Builder" -msgstr "" - -#: class.redux-plugin.php:416 -msgid "Deactivate Demo Mode" -msgstr "" - -#: class.redux-plugin.php:418 -msgid "Activate Demo Mode" -msgstr "" - -#: tests/includes/class-tivwp-dm-controller.php:28 -msgid "Must call in of after the \"plugins_loaded\" action." -msgstr "" - -#: tests/includes/class-tivwp-dm-controller.php:138 -msgid "Unknown action \"%1$s\" specified for %2$s" -msgstr "" - -#: tests/includes/class-tivwp-dm-controller.php:143 -msgid "The unknown action has been replaced with \"%s\"" -msgstr "" - -#: tests/includes/class-tivwp-dm-controller.php:158 -msgid "Automatic action performed: \"%s\"" -msgstr "" - -#: tests/includes/class-tivwp-dm.php:112 -msgid "Activate Development Plugins" -msgstr "" - -#: tests/includes/class-tivwp-dm.php:119 -msgid "Deactivate Development Plugins" -msgstr "" - -#: tests/includes/class-tivwp-dm.php:131 -msgid "You do not have sufficient permissions to access this page." -msgstr "" - -#. Plugin URI of the plugin/theme -msgid "http://wordpress.org/plugins/redux-framework" -msgstr "" - -#. Description of the plugin/theme -msgid "" -"Redux is a simple, truly extensible options framework for WordPress themes " -"and plugins." -msgstr "" - -#. Author of the plugin/theme -msgid "Team Redux" -msgstr "" - -#. Author URI of the plugin/theme -msgid "http://reduxframework.com" -msgstr "" - -#: ReduxCore/inc/welcome/views/status_report.php:427 -msgctxt "by author" -msgid "by %s" -msgstr "" \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/container.tpl.php b/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/container.tpl.php deleted file mode 100755 index 31549ff4..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/container.tpl.php +++ /dev/null @@ -1,58 +0,0 @@ -parent->args['open_expanded'] ) ? ' fully-expanded' : '' . ( ! empty( $this->parent->args['class'] ) ? ' ' . esc_attr( $this->parent->args['class'] ) : '' ); - $nonce = wp_create_nonce( "redux_ajax_nonce" . $this->parent->args['opt_name'] ); -?> -
            - parent->args['database'] == "network" && $this->parent->args['network_admin'] && is_network_admin() ? './edit.php?action=redux_' . $this->parent->args['opt_name'] : './options.php' ) ?> -
            - parent->args['opt_name'] is sanitized in the Framework class, no need to re-sanitize it. ?> - - parent->args['opt_name'] is sanitized in the Framework class, no need to re-sanitize it. ?> - - parent->args['opt_name'] is sanitized in the Framework class, no need to re-sanitize it. ?> - parent->no_panel ) ) { ?> - - - init_settings_fields(); - - // Last tab? - $this->parent->options['last_tab'] = ( isset( $_GET['tab'] ) && ! isset( $this->parent->transients['last_save_mode'] ) ) ? esc_attr( $_GET['tab'] ) : ''; - ?> - parent->args['opt_name'] is sanitized in the Framework class, no need to re-sanitize it. ?> - - - get_template( 'content.tpl.php' ); ?> - -
            -
            - -parent->args['footer_text'] ) ) { ?> - - diff --git a/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/content.tpl.php b/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/content.tpl.php deleted file mode 100755 index 8af928fc..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/content.tpl.php +++ /dev/null @@ -1,99 +0,0 @@ - - -get_template( 'header.tpl.php' ); ?> - - -parent->args['intro_text'] ) ) { ?> -
            parent->args['intro_text'] ); ?>
            - - -get_template( 'menu_container.tpl.php' ); ?> - -
            - - get_template( 'header_stickybar.tpl.php' ); ?> -
             
            - parent->sections as $k => $section) { - if ( isset( $section['customizer_only'] ) && $section['customizer_only'] == true ) { - continue; - } - - //$active = ( ( is_numeric($this->parent->current_tab) && $this->parent->current_tab == $k ) || ( !is_numeric($this->parent->current_tab) && $this->parent->current_tab === $k ) ) ? ' style="display: block;"' : ''; - $section['class'] = isset( $section['class'] ) ? ' ' . $section['class'] : ''; - echo '
            '; - //echo '
            '; - - echo '
              '; - - foreach ($section['tab'] as $subkey => $subsection) { - //echo '-=' . $subkey . '=-'; - echo '
            • ' . $subsection['title'] . '
            • '; - } - - echo '
            '; - foreach ($section['tab'] as $subkey => $subsection) { - echo '
            '; - echo '
            '; - echo "hello ".$subkey; - do_settings_sections( $this->parent->args['opt_name'] . $k . '_tab_' . $subkey . '_section_group' ); - echo "
            "; - echo "
            "; - } - echo "
            "; - } else { - */ - - // Don't display in the - $display = true; - if ( isset( $_GET['page'] ) && $_GET['page'] == $this->parent->args['page_slug'] ) { - if ( isset( $section['panel'] ) && $section['panel'] == "false" ) { - $display = false; - } - } - - if ( $display ) { - do_action( "redux/page/{$this->parent->args['opt_name']}/section/before", $section ); - $this->output_section( $k ); - do_action( "redux/page/{$this->parent->args['opt_name']}/section/after", $section ); - } - //} - ?>
            '; - } - - /** - * action 'redux/page-after-sections-{opt_name}' - * - * @deprecated - * - * @param object $this ReduxFramework - */ - do_action( "redux/page-after-sections-{$this->parent->args['opt_name']}", $this ); // REMOVE LATER - - /** - * action 'redux/page/{opt_name}/sections/after' - * - * @param object $this ReduxFramework - */ - do_action( "redux/page/{$this->parent->args['opt_name']}/sections/after", $this ); -?> -
            - -get_template( 'footer.tpl.php' ); ?> - -
            -
            \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/footer.tpl.php b/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/footer.tpl.php deleted file mode 100755 index 6b3e95c9..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/footer.tpl.php +++ /dev/null @@ -1,71 +0,0 @@ - - - diff --git a/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/header.tpl.php b/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/header.tpl.php deleted file mode 100755 index 2fcbc8d0..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/header.tpl.php +++ /dev/null @@ -1,73 +0,0 @@ -parent->dev_mode_forced ) { - $is_debug = false; - $is_localhost = false; - - $debug_bit = ''; - if ( Redux_Helpers::isWpDebug() ) { - $is_debug = true; - $debug_bit = __( 'WP_DEBUG is enabled', 'redux-framework' ); - } - - $localhost_bit = ''; - if ( Redux_Helpers::isLocalHost() ) { - $is_localhost = true; - $localhost_bit = __( 'you are working in a localhost environment', 'redux-framework' ); - } - - $conjunction_bit = ''; - if ( $is_localhost && $is_debug ) { - $conjunction_bit = ' ' . __( 'and', 'redux-framework' ) . ' '; - } - - $tip_msg = __( 'This has been automatically enabled because', 'redux-framework' ) . ' ' . $debug_bit . $conjunction_bit . $localhost_bit . '.'; - } else { - $tip_msg = __( 'If you are not a developer, your theme/plugin author shipped with developer mode enabled. Contact them directly to fix it.', 'redux-framework' ); - } - -?> -
            - parent->args['display_name'] ) ) { ?> -
            - - parent->args['dev_mode'] ) && $this->parent->args['dev_mode'] ) { ?> -
            - -
            - parent->args['forced_dev_mode_off']) && $this->parent->args['forced_dev_mode_off'] == true ) { ?> - - -
            - -
            - - - -

            parent->args['display_name'] ); ?>

            - - parent->args['display_version'] ) ) { ?> - parent->args['display_version'] ); ?> - - -
            - - -
            -
            \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/header_stickybar.tpl.php b/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/header_stickybar.tpl.php deleted file mode 100755 index afd2557f..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/header_stickybar.tpl.php +++ /dev/null @@ -1,39 +0,0 @@ - -
            -
            - - parent->args['hide_expand'] ? ' style="display: none;"' : '' ?>> - - - -
            - - parent->args['hide_save'] ) { ?> - - - - parent->args['hide_reset'] ) { ?> - parent->args['opt_name'] . '[defaults-section]', false, array( 'id' => 'redux-defaults-section' ) ); ?> - parent->args['opt_name'] . '[defaults]', false, array( 'id' => 'redux-defaults' ) ); ?> - -
            -
             
            -
            -
            - - -
            - notification_bar(); ?> -
            - - -
            \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/menu_container.tpl.php b/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/menu_container.tpl.php deleted file mode 100755 index 0fb39436..00000000 --- a/admin/core/lib/ReduxFramework/ReduxCore/templates/panel/menu_container.tpl.php +++ /dev/null @@ -1,51 +0,0 @@ - -
            -
              -parent->sections as $k => $section ) { - $title = isset ( $section[ 'title' ] ) ? $section[ 'title' ] : ''; - - $skip_sec = false; - foreach ( $this->parent->hidden_perm_sections as $num => $section_title ) { - if ( $section_title == $title ) { - $skip_sec = true; - } - } - - if ( isset ( $section[ 'customizer_only' ] ) && $section[ 'customizer_only' ] == true ) { - continue; - } - - if ( false == $skip_sec ) { - echo $this->parent->section_menu ( $k, $section ); - $skip_sec = false; - } - } - - /** - * action 'redux-page-after-sections-menu-{opt_name}' - * - * @param object $this ReduxFramework - */ - do_action ( "redux-page-after-sections-menu-{$this->parent->args[ 'opt_name' ]}", $this ); - - /** - * action 'redux/page/{opt_name}/menu/after' - * - * @param object $this ReduxFramework - */ - do_action ( "redux/page/{$this->parent->args[ 'opt_name' ]}/menu/after", $this ); -?> -
            -
            \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/bootstrap_tests.php b/admin/core/lib/ReduxFramework/bootstrap_tests.php deleted file mode 100755 index c4434e14..00000000 --- a/admin/core/lib/ReduxFramework/bootstrap_tests.php +++ /dev/null @@ -1,31 +0,0 @@ - array( "ReduxFramework/redux-framework.php" ), -); - -/** - * If the wordpress-tests repo location has been customized (and specified - * with WP_TESTS_DIR), use that location. This will most commonly be the case - * when configured for use with Travis CI. - * - * Otherwise, we'll just assume that this plugin is installed in the WordPress - * SVN external checkout configured in the wordpress-tests repo. - */ -if( false !== getenv( 'WP_TESTS_DIR' ) ) { - require getenv( 'WP_TESTS_DIR' ) . '/bootstrap.php'; -} else { - require dirname( dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) ) . '/bootstrap.php'; -} diff --git a/admin/core/lib/ReduxFramework/class.redux-plugin.php b/admin/core/lib/ReduxFramework/class.redux-plugin.php deleted file mode 100755 index 38ee2a10..00000000 --- a/admin/core/lib/ReduxFramework/class.redux-plugin.php +++ /dev/null @@ -1,433 +0,0 @@ -get_redux_options(); - self::$instance->includes(); - self::$instance->hooks(); - } - - return self::$instance; - } - - // Shim since we changed the function name. Deprecated. - public static function get_instance() { - if ( ! self::$instance ) { - self::$instance = new self; - self::$instance->get_redux_options(); - self::$instance->includes(); - self::$instance->hooks(); - } - - return self::$instance; - } - - /** - * Get Redux options - * - * @access public - * @since 3.1.3 - * @return void - */ - public function get_redux_options() { - - // Setup defaults - $defaults = array( - 'demo' => false, - ); - - // If multisite is enabled - if ( is_multisite() ) { - - // Get network activated plugins - $plugins = get_site_option( 'active_sitewide_plugins' ); - - foreach ( $plugins as $file => $plugin ) { - if ( strpos( $file, 'redux-framework.php' ) !== false ) { - $this->plugin_network_activated = true; - $this->options = get_site_option( 'ReduxFrameworkPlugin', $defaults ); - } - } - } - - // If options aren't set, grab them now! - if ( empty( $this->options ) ) { - $this->options = get_option( 'ReduxFrameworkPlugin', $defaults ); - } - } - - /** - * Include necessary files - * - * @access public - * @since 3.1.3 - * @return void - */ - public function includes() { - // Include ReduxCore - if ( file_exists( dirname( __FILE__ ) . '/ReduxCore/framework.php' ) ) { - require_once dirname( __FILE__ ) . '/ReduxCore/framework.php'; - } - - if ( isset( ReduxFramework::$_as_plugin ) ) { - ReduxFramework::$_as_plugin = true; - } - - if ( file_exists( dirname( __FILE__ ) . '/ReduxCore/redux-extensions/config.php' ) ) { - require_once dirname( __FILE__ ) . '/ReduxCore/redux-extensions/config.php'; - } - - // Include demo config, if demo mode is active - if ( $this->options['demo'] && file_exists( dirname( __FILE__ ) . '/sample/sample-config.php' ) ) { - require_once dirname( __FILE__ ) . '/sample/sample-config.php'; - } - } - - /** - * Run action and filter hooks - * - * @access private - * @since 3.1.3 - * @return void - */ - private function hooks() { - add_action( 'wp_loaded', array( $this, 'options_toggle_check' ) ); - - // Activate plugin when new blog is added - add_action( 'wpmu_new_blog', array( $this, 'activate_new_site' ) ); - - // Display admin notices - add_action( 'admin_notices', array( $this, 'admin_notices' ) ); - - // Edit plugin metalinks - add_filter( 'plugin_row_meta', array( $this, 'plugin_metalinks' ), null, 2 ); - - add_action( 'activated_plugin', array( $this, 'load_first' ) ); - - do_action( 'redux/plugin/hooks', $this ); - } - - public function load_first() { - $plugin_dir = Redux_Helpers::cleanFilePath( WP_PLUGIN_DIR ) . '/'; - $self_file = Redux_Helpers::cleanFilePath( __FILE__ ); - - $path = str_replace( $plugin_dir, '', $self_file ); - $path = str_replace( 'class.redux-plugin.php', 'redux-framework.php', $path ); - - if ( $plugins = get_option( 'active_plugins' ) ) { - if ( $key = array_search( $path, $plugins ) ) { - array_splice( $plugins, $key, 1 ); - array_unshift( $plugins, $path ); - update_option( 'active_plugins', $plugins ); - } - } - } - - /** - * Fired on plugin activation - * - * @access public - * @since 3.0.0 - * - * @param boolean $network_wide True if plugin is network activated, false otherwise - * - * @return void - */ - public static function activate( $network_wide ) { - if ( function_exists( 'is_multisite' ) && is_multisite() ) { - if ( $network_wide ) { - // Get all blog IDs - $blog_ids = self::get_blog_ids(); - - foreach ( $blog_ids as $blog_id ) { - switch_to_blog( $blog_id ); - self::single_activate(); - } - restore_current_blog(); - } else { - self::single_activate(); - } - } else { - self::single_activate(); - } - - delete_site_transient( 'update_plugins' ); - } - - /** - * Fired when plugin is deactivated - * - * @access public - * @since 3.0.0 - * - * @param boolean $network_wide True if plugin is network activated, false otherwise - * - * @return void - */ - public static function deactivate( $network_wide ) { - if ( function_exists( 'is_multisite' ) && is_multisite() ) { - if ( $network_wide ) { - // Get all blog IDs - $blog_ids = self::get_blog_ids(); - - foreach ( $blog_ids as $blog_id ) { - switch_to_blog( $blog_id ); - self::single_deactivate(); - } - restore_current_blog(); - } else { - self::single_deactivate(); - } - } else { - self::single_deactivate(); - } - - delete_option( 'ReduxFrameworkPlugin' ); - } - - /** - * Fired when a new WPMU site is activated - * - * @access public - * @since 3.0.0 - * - * @param int $blog_id The ID of the new blog - * - * @return void - */ - public function activate_new_site( $blog_id ) { - if ( 1 !== did_action( 'wpmu_new_blog' ) ) { - return; - } - - switch_to_blog( $blog_id ); - self::single_activate(); - restore_current_blog(); - } - - /** - * Get all IDs of blogs that are not activated, not spam, and not deleted - * - * @access private - * @since 3.0.0 - * @global object $wpdb - * @return array|false Array of IDs or false if none are found - */ - private static function get_blog_ids() { - global $wpdb; - - // Get an array of IDs - $sql = "SELECT blog_id FROM $wpdb->blogs - WHERE archived = '0' AND spam = '0' - AND deleted = '0'"; - - return $wpdb->get_col( $sql ); - } - - /** - * Fired for each WPMS blog on plugin activation - * - * @access private - * @since 3.0.0 - * @return void - */ - private static function single_activate() { - $notices = get_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES', array() ); - $notices[] = __( 'Redux Framework has an embedded demo.', 'redux-framework' ) . ' ' . __( 'Click here to activate the sample config file.', 'redux-framework' ) . ''; - - update_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES', $notices ); - } - - /** - * Display admin notices - * - * @access public - * @since 3.0.0 - * @return void - */ - public function admin_notices() { - do_action( 'ReduxFrameworkPlugin_admin_notice' ); - $notices = get_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES', '' ); - if ( !empty( $notices ) ) { - foreach ( $notices as $notice ) { - echo '

            ' . $notice . '

            '; - } - - delete_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES' ); - } - } - - /** - * Fired for each blog when the plugin is deactivated - * - * @access private - * @since 3.0.0 - * @return void - */ - private static function single_deactivate() { - delete_option( 'ReduxFrameworkPlugin_ACTIVATED_NOTICES' ); - } - - /** - * Turn on or off - * - * @access public - * @since 3.0.0 - * @global string $pagenow The current page being displayed - * @return void - */ - public function options_toggle_check() { - global $pagenow; - - if ( $pagenow == 'plugins.php' && is_admin() && ! empty( $_GET['ReduxFrameworkPlugin'] ) ) { - $url = './plugins.php'; - - if ( $_GET['ReduxFrameworkPlugin'] == 'demo' ) { - if ( $this->options['demo'] == false ) { - $this->options['demo'] = true; - } else { - $this->options['demo'] = false; - } - } - - if ( is_multisite() && is_network_admin() && $this->plugin_network_activated ) { - update_site_option( 'ReduxFrameworkPlugin', $this->options ); - } else { - update_option( 'ReduxFrameworkPlugin', $this->options ); - } - - wp_redirect( $url ); - } - } - - /** - * Add settings action link to plugins page - * - * @access public - * @since 3.0.0 - * @return void - */ - public function add_action_links( $links ) { - // In case we ever want to do this... - return $links; - - /** - * return array_merge( - * array( 'redux_plugin_settings' => '' . __( 'Settings', 'redux-framework' ) . '' ), - * $links - * ); - */ - } - - /** - * Edit plugin metalinks - * - * @access public - * @since 3.0.0 - * - * @param array $links The current array of links - * @param string $file A specific plugin row - * - * @return array The modified array of links - */ - public function plugin_metalinks( $links, $file ) { - if ( strpos( $file, 'redux-framework.php' ) !== false && is_plugin_active( $file ) ) { - - $new_links = array( - '' . __( 'Docs', 'redux-framework' ) . '', - '' . __( 'Repo', 'redux-framework' ) . '', - '' . __( 'Builder', 'redux-framework' ) . '', - '' . __( 'Get Support', 'redux-framework' ) . '', - ); - - if ( ( is_multisite() && $this->plugin_network_activated ) || ! is_network_admin() || ! is_multisite() ) { - if ( $this->options['demo'] ) { - $new_links[3] .= '
            ' . __( 'Deactivate Demo Mode', 'redux-framework' ) . ''; - } else { - $new_links[3] .= '
            ' . __( 'Activate Demo Mode', 'redux-framework' ) . ''; - } - } - - $links = array_merge( $links, $new_links ); - } - - return $links; - } - } - } diff --git a/admin/core/lib/ReduxFramework/index.php b/admin/core/lib/ReduxFramework/index.php deleted file mode 100755 index 7e914158..00000000 --- a/admin/core/lib/ReduxFramework/index.php +++ /dev/null @@ -1,2 +0,0 @@ - - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -The source code for any program binaries or compressed scripts that are -included with ReduxFramework can be freely obtained at the following URL: - - https://github.com/ReduxFramework/ReduxFramework - \ No newline at end of file diff --git a/admin/core/lib/ReduxFramework/redux-framework.php b/admin/core/lib/ReduxFramework/redux-framework.php deleted file mode 100755 index 9e8eabce..00000000 --- a/admin/core/lib/ReduxFramework/redux-framework.php +++ /dev/null @@ -1,49 +0,0 @@ - - * @author Kevin Provance - * @license GNU General Public License, version 3 - * @copyright 2012-2016 Redux.io - */ - -// Exit if accessed directly -if( !defined( 'ABSPATH' ) ) { - die; -} - -// Require the main plugin class -require_once plugin_dir_path( __FILE__ ) . 'class.redux-plugin.php'; - -// Register hooks that are fired when the plugin is activated and deactivated, respectively. -register_activation_hook( __FILE__, array( 'ReduxFrameworkPlugin', 'activate' ) ); -register_deactivation_hook( __FILE__, array( 'ReduxFrameworkPlugin', 'deactivate' ) ); - -// Get plugin instance -//add_action( 'plugins_loaded', array( 'ReduxFrameworkPlugin', 'instance' ) ); - -// The above line prevents ReduxFramework from instancing until all plugins have loaded. -// While this does not matter for themes, any plugin using Redux will not load properly. -// Waiting until all plugins have been loaded prevents the ReduxFramework class from -// being created, and fails the !class_exists('ReduxFramework') check in the sample_config.php, -// and thus prevents any plugin using Redux from loading their config file. -ReduxFrameworkPlugin::instance(); diff --git a/admin/core/lib/ReduxFramework/uninstall.php b/admin/core/lib/ReduxFramework/uninstall.php deleted file mode 100755 index 097f175f..00000000 --- a/admin/core/lib/ReduxFramework/uninstall.php +++ /dev/null @@ -1,16 +0,0 @@ - - * @since 3.0.0 - */ - - -// If uninstall, not called from WordPress, then exit -if( !defined( 'WP_UNINSTALL_PLUGIN' ) ) { - exit; -} - -// TODO: Define uninstall functionality here diff --git a/admin/core/lib/ReduxFramework/wpml-config.xml b/admin/core/lib/ReduxFramework/wpml-config.xml deleted file mode 100755 index 54f5786f..00000000 --- a/admin/core/lib/ReduxFramework/wpml-config.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/admin/core/um-admin-access.php b/admin/core/um-admin-access.php deleted file mode 100644 index 11ab9ffe..00000000 --- a/admin/core/um-admin-access.php +++ /dev/null @@ -1,146 +0,0 @@ -slug = 'ultimatemember'; - - add_action( 'load-post.php', array(&$this, 'add_metabox'), 9 ); - add_action( 'load-post-new.php', array(&$this, 'add_metabox'), 9 ); - - } - - /*** - *** @add a helper tooltip - ***/ - function tooltip( $text, $e = false ){ - - ?> - - - - - - - - - - form_id = get_the_ID(); - } - - preg_match('#\{.*?\}#s', $box['id'], $matches); - - if ( isset($matches[0]) ){ - $path = $matches[0]; - $box['id'] = preg_replace('~(\\{[^}]+\\})~','', $box['id'] ); - } else { - $path = um_path; - } - - $path = str_replace('{','', $path ); - $path = str_replace('}','', $path ); - - include_once $path . 'admin/templates/access/'. $box['id'] . '.php'; - wp_nonce_field( basename( __FILE__ ), 'um_admin_save_metabox_access_nonce' ); - } - - /*** - *** @add form metabox - ***/ - function add_metabox_form() { - global $ultimatemember; - - if ( um_get_option('access_widget_admin_only') && !current_user_can( 'edit_users' ) ) return; - - $types = $ultimatemember->query->get_post_types; - foreach($types as $post_type) { - - if ( !$this->core_post_type( $post_type ) ) { - - $current_screen = get_current_screen(); - - if( ! in_array( $current_screen->id, array("upload","media","attachment") ) ) { - add_meta_box('um-admin-access-settings', __('Ultimate Member'), array(&$this, 'load_metabox_form'), $post_type, 'side', 'default'); - } - - } - - do_action('um_admin_custom_access_metaboxes'); - - } - - } - - /*** - *** @save form metabox - ***/ - function save_metabox_form( $post_id, $post ) { - global $wpdb; - - // validate nonce - if ( !isset( $_POST['um_admin_save_metabox_access_nonce'] ) || !wp_verify_nonce( $_POST['um_admin_save_metabox_access_nonce'], basename( __FILE__ ) ) ) return $post_id; - - // validate user - $post_type = get_post_type_object( $post->post_type ); - if ( !current_user_can( $post_type->cap->edit_post, $post_id ) ) return $post_id; - - // save - $multi_choice_keys = apply_filters('um_admin_multi_choice_keys', array() ); - if ( $multi_choice_keys ) { - foreach( $multi_choice_keys as $k ) { - delete_post_meta( $post_id, $k ); - } - } - foreach( $_POST as $k => $v ) { - if (strstr($k, '_um_')){ - update_post_meta( $post_id, $k, $v); - } - } - - } - -} \ No newline at end of file diff --git a/admin/core/um-admin-actions-ajax.php b/admin/core/um-admin-actions-ajax.php deleted file mode 100644 index 9cf4bb02..00000000 --- a/admin/core/um-admin-actions-ajax.php +++ /dev/null @@ -1,82 +0,0 @@ -fields->duplicate_field( $arg1, $arg2 ); - break; - - case 'um_admin_remove_field_global': - $ultimatemember->fields->delete_field_from_db( $arg1 ); - break; - - case 'um_admin_remove_field': - $ultimatemember->fields->delete_field_from_form( $arg1, $arg2 ); - break; - - case 'um_admin_add_field_from_predefined': - $ultimatemember->fields->add_field_from_predefined( $arg1, $arg2, $position ); - break; - - case 'um_admin_add_field_from_list': - $ultimatemember->fields->add_field_from_list( $arg1, $arg2, $position ); - break; - - } - - if(is_array($output)){ print_r($output); }else{ echo $output; } die; - - } - - /** - * Retrieves dropdown/multi-select options from a callback function - */ - add_action('wp_ajax_nopriv_ultimatemember_populate_dropdown_options', 'ultimatemember_populate_dropdown_options'); - add_action('wp_ajax_ultimatemember_populate_dropdown_options', 'ultimatemember_populate_dropdown_options'); - function ultimatemember_populate_dropdown_options(){ - - $arr_options = array(); - - if( ! current_user_can('manage_options') ){ - wp_die( __( 'This is not possible for security reasons.','ultimate-member') ); - } - - $um_callback_func = $_POST['um_option_callback']; - if( empty( $um_callback_func ) ){ - $arr_options['status'] = 'empty'; - $arr_options['function_name'] = $um_callback_func; - $arr_options['function_exists'] = function_exists( $um_callback_func ); - } - - $arr_options['data'] = array(); - - if( function_exists( $um_callback_func ) ){ - $arr_options['data'] = call_user_func( $um_callback_func ); - } - - wp_send_json( $arr_options ); - } - - \ No newline at end of file diff --git a/admin/core/um-admin-actions-fields.php b/admin/core/um-admin-actions-fields.php deleted file mode 100644 index c701f716..00000000 --- a/admin/core/um-admin-actions-fields.php +++ /dev/null @@ -1,67 +0,0 @@ - $_POST['_type'], - 'form_id' => $_POST['post_id'], - 'args' => $ultimatemember->builtin->get_core_field_attrs( $_POST['_type'] ), - 'post' => $_POST - ); - - $array = apply_filters("um_admin_pre_save_fields_hook", $array ); - $output['error'] = apply_filters( 'um_admin_field_update_error_handling', $output['error'], $array ); - - extract( $array['post'] ); - if ( empty( $output['error'] ) ){ - - $save = array(); - $save[ $_metakey ] = null; - foreach( $array['post'] as $key => $val){ - - if ( substr( $key, 0, 1) === '_' && $val != '' ) { // field attribute - $new_key = ltrim ($key,'_'); - - if ( $new_key == 'options' ) { - //$save[ $_metakey ][$new_key] = explode(PHP_EOL, $val); - $save[ $_metakey ][$new_key] = preg_split('/[\r\n]+/', $val, -1, PREG_SPLIT_NO_EMPTY); - } else { - $save[ $_metakey ][$new_key] = $val; - } - - } else if ( strstr( $key, 'um_editor' ) ) { - $save[ $_metakey ]['content'] = $val; - } - - } - - $field_ID = $_metakey; - $field_args = $save[ $_metakey ]; - - $field_args = apply_filters("um_admin_pre_save_field_to_form", $field_args ); - - $ultimatemember->fields->update_field( $field_ID, $field_args, $post_id ); - - $field_args = apply_filters("um_admin_pre_save_field_to_db", $field_args ); - - if ( !isset( $array['args']['form_only'] ) ) { - if ( !isset( $ultimatemember->builtin->predefined_fields[ $field_ID ] ) ) { - $ultimatemember->fields->globally_update_field( $field_ID, $field_args ); - } - } - - } - - $output=json_encode($output); - if(is_array($output)){ print_r($output); }else{ echo $output; } die; - } \ No newline at end of file diff --git a/admin/core/um-admin-actions-modal.php b/admin/core/um-admin-actions-modal.php deleted file mode 100644 index 01746004..00000000 --- a/admin/core/um-admin-actions-modal.php +++ /dev/null @@ -1,369 +0,0 @@ -
            - -
            - - in_edit = true; $metabox->edit_array = $edit_array; ?> - tooltip('Here you can setup conditional logic to show/hide this field based on specific fields value or conditions'); ?> - - tooltip('Here you can setup conditional logic to show/hide this field based on specific fields value or conditions'); ?> - - -
            - -

            -
            - - $arr ) { - - if ( $k == 0 ) $k = ''; - ?> - -
            - - field_input( '_conditional_action' . $k, $form_id ); ?> - field_input( '_conditional_field' . $k , $form_id ); ?> - field_input( '_conditional_operator' . $k, $form_id ); ?> - field_input( '_conditional_value' . $k, $form_id ); ?> - - -

            - -

            - - -
            -
            - - - -
            - - field_input( '_conditional_action', $form_id ); ?> - field_input( '_conditional_field', $form_id ); ?> - field_input( '_conditional_operator', $form_id ); ?> - field_input( '_conditional_value', $form_id ); ?> - -

            - -
            -
            - - - -
            - -
            - - - -
            - -
            - -
            - icons->all as $icon){ ?> - - -
            - - query->get_attr( 'custom_fields', $arg2 ); - $form_fields = array_values( array_filter( array_keys( $form_fields ) ) ); - ?> - -

            -
            - - builtin->core_fields ) { - foreach ($ultimatemember->builtin->core_fields as $field_type => $array) { - - if ( isset( $array['in_fields'] ) && $array['in_fields'] == false ) { } else { - ?> - - - - - -
            - -

            -
            - - builtin->predefined_fields ) { - foreach ($ultimatemember->builtin->predefined_fields as $field_key => $array) { - - if ( !isset( $array['account_only'] ) && !isset( $array['private_use'] ) ) { - ?> - - data-silent_action="um_admin_add_field_from_predefined" data-arg1="" data-arg2=""> - - ' . __('None','ultimate-member') . '

            '; } ?> - -
            - -

            -
            - - builtin->custom_fields ) { - foreach ($ultimatemember->builtin->custom_fields as $field_key => $array) { - ?> - - () - - ' . __('You did not create any custom fields', 'ultimate-member') . '

            '; } ?> - -
            - - builtin->get_core_field_attrs( $arg1 ); - - $form_fields = $ultimatemember->query->get_attr( 'custom_fields', $arg2 ); - - $metabox->set_field_type = $arg1; - $metabox->in_edit = true; - $metabox->edit_array = $form_fields[ $arg3 ]; - - if ( !isset( $metabox->edit_array['metakey'] ) ){ - $metabox->edit_array['metakey'] = $metabox->edit_array['id']; - } - - if ( !isset( $metabox->edit_array['position'] ) ){ - $metabox->edit_array['position'] = $metabox->edit_array['id']; - } - - extract( $args ); - - if ( !isset( $col1 ) ) { - - echo '

            '. __('This field type is not setup correcty.', 'ultimate-member') . '

            '; - - } else { - - ?> - - edit_array['in_group'] ) ) { ?> - - - - - - - - - - - - - - - - - - -
            edit_array['content']; ?>
            - - - -
            - - field_input ( $opt, null, $metabox->edit_array ); } ?> - -
            - -
            - - field_input ( $opt, null, $metabox->edit_array ); } ?> - -
            - - field_input ( $opt, null, $metabox->edit_array ); } ?> - -
            - - field_input ( $opt, null, $metabox->edit_array ); } ?> - - in_edit, (isset( $metabox->edit_array ) ) ? $metabox->edit_array : '' ); ?> - - builtin->get_core_field_attrs( $arg1 ); - - $metabox->set_field_type = $arg1; - - extract( $args ); - - if ( !isset( $col1 ) ) { - - echo '

            '. __('This field type is not setup correcty.', 'ultimate-member') . '

            '; - - } else { - - ?> - - - - - - - - - - - - - - - - -
            - - field_input ( $opt ); } ?> - -
            - -
            - - field_input ( $opt ); } ?> - -
            - - field_input ( $opt ); } ?> - -
            - - field_input ( $opt ); } ?> - - in_edit, (isset( $metabox->edit_array ) ) ? $metabox->edit_array : '' ); ?> - - query->get_attr('mode', $arg1 ); - - if ( $mode == 'profile' ) { - $ultimatemember->fields->editing = true; - } - - $output = do_shortcode('[ultimatemember form_id='.$arg1.']'); - - break; - - case 'um_admin_review_registration': - - um_fetch_user( $arg1 ); - - $ultimatemember->user->preview = true; - - $submitted = um_user('submitted'); - - $output = um_user_submitted_registration( true ); - - break; - - } - - if(is_array($output)){ print_r($output); }else{ echo $output; } die; - - } diff --git a/admin/core/um-admin-actions.php b/admin/core/um-admin-actions.php deleted file mode 100644 index 881d02aa..00000000 --- a/admin/core/um-admin-actions.php +++ /dev/null @@ -1,452 +0,0 @@ - - - - - - - - - $taxonomy) { - if( ! in_array( $key , $exclude_taxonomies ) ){ - add_action( $taxonomy.'_add_form_fields', 'um_category_access_fields_create' ); - add_action( $taxonomy.'_edit_form_fields', 'um_category_access_fields_edit' ); - add_action( 'create_'.$taxonomy, 'um_category_access_fields_save' ); - add_action( 'edited_'.$taxonomy, 'um_category_access_fields_save' ); - } - } - - - function um_category_access_fields_create( $term ){ - global $ultimatemember; - - echo '
            '; - echo ''; - echo ' - - '; - echo '

            Who can see content/posts in this category.

            '; - echo '
            '; - - echo '
            '; - echo ''; - foreach($ultimatemember->query->get_roles() as $role_id => $role) { - echo ''; - } - echo '

            ' . __('This is applicable only if you restrict the content to logged-in users.','ultimate-member') . '

            '; - echo ''; - echo ''; - echo '

            ' . __('Users who cannot see content will get redirected to that URL.','ultimate-member') . '

            '; - echo '
            '; - - echo '
            '; - echo ''; - echo ''; - echo '

            ' . __('Users who cannot see content will get redirected to that URL.','ultimate-member') . '

            '; - echo '
            '; - - } - - function um_category_access_fields_edit( $term ){ - global $ultimatemember; - - $termID = $term->term_id; - $termMeta = get_option( "category_$termID" ); - $_um_accessible= (isset( $termMeta['_um_accessible'] ) )? $termMeta['_um_accessible'] : ''; - $_um_redirect= (isset( $termMeta['_um_redirect'] ) )? $termMeta['_um_redirect'] : ''; - $_um_redirect2= (isset( $termMeta['_um_redirect2'] ) )? $termMeta['_um_redirect2'] : ''; - $_um_roles= (isset( $termMeta['_um_roles'] ) )? $termMeta['_um_roles'] : ''; - - echo '

            -
            - '; - echo '

            Who can see content/posts in this category.

            '; - echo "
            '; - foreach($ultimatemember->query->get_roles() as $role_id => $role) { - if ( ( isset( $_um_roles ) && is_array( $_um_roles ) && in_array($role_id, $_um_roles ) ) || ( isset( $_um_roles ) && $role_id == $_um_roles ) ) { - $checked = 'checked'; - } else { - $checked = ''; - } - echo '  '; - } - echo '

            ' . __('This is applicable only if you restrict the content to logged-in users.','ultimate-member') . '

            '; - echo "
            '; - echo ''; - echo '

            ' . __('Users who cannot see content will get redirected to that URL.','ultimate-member') . '

            '; - echo "
            '; - echo ''; - echo '

            ' . __('Users who cannot see content will get redirected to that URL.','ultimate-member') . '

            '; - echo "
            - - - - - - -
            - - - um_user_public_key ) ) { ?> -

            -

            - -

            -  um_user_public_key; ?>
            -  um_user_secret_key; ?>
            -  get_token( $user->ID ); ?> -

            -

            -

            - -
            - um_user_public_key ) ) { - update_user_meta( $user_id, 'um_user_public_key', $this->generate_public_key( $user->user_email ) ); - update_user_meta( $user_id, 'um_user_secret_key', $this->generate_private_key( $user->ID ) ); - } elseif( $regenerate == true ) { - $this->revoke_api_key( $user->ID ); - update_user_meta( $user_id, 'um_user_public_key', $this->generate_public_key( $user->user_email ) ); - update_user_meta( $user_id, 'um_user_secret_key', $this->generate_private_key( $user->ID ) ); - } else { - return false; - } - - return true; - } - - /** - * Revoke a users API keys - */ - public function revoke_api_key( $user_id = 0 ) { - - if( empty( $user_id ) ) { - return false; - } - - $user = get_userdata( $user_id ); - - if( ! $user ) { - return false; - } - - if ( ! empty( $user->um_user_public_key ) ) { - delete_transient( md5( 'um_api_user_' . $user->um_user_public_key ) ); - delete_user_meta( $user_id, 'um_user_public_key' ); - delete_user_meta( $user_id, 'um_user_secret_key' ); - } else { - return false; - } - - return true; - } - - - /** - * Generate and Save API key - */ - public function update_key( $user_id ) { - if ( current_user_can( 'edit_user', $user_id ) && isset( $_POST['um_set_api_key'] ) ) { - - $user = get_userdata( $user_id ); - - if ( empty( $user->um_user_public_key ) ) { - update_user_meta( $user_id, 'um_user_public_key', $this->generate_public_key( $user->user_email ) ); - update_user_meta( $user_id, 'um_user_secret_key', $this->generate_private_key( $user->ID ) ); - } else { - $this->revoke_api_key( $user_id ); - } - } - } - - /** - * Generate the public key for a user - */ - private function generate_public_key( $user_email = '' ) { - $auth_key = defined( 'AUTH_KEY' ) ? AUTH_KEY : ''; - $public = hash( 'md5', $user_email . $auth_key . date( 'U' ) ); - return $public; - } - - /** - * Generate the secret key for a user - */ - private function generate_private_key( $user_id = 0 ) { - $auth_key = defined( 'AUTH_KEY' ) ? AUTH_KEY : ''; - $secret = hash( 'md5', $user_id . $auth_key . date( 'U' ) ); - return $secret; - } - - /** - * Retrieve the user's token - */ - private function get_token( $user_id = 0 ) { - $user = get_userdata( $user_id ); - return hash( 'md5', $user->um_user_secret_key . $user->um_user_public_key ); - } - -} diff --git a/core/um-builtin.php b/core/um-builtin.php deleted file mode 100644 index 2f3755f5..00000000 --- a/core/um-builtin.php +++ /dev/null @@ -1,1625 +0,0 @@ -saved_fields = get_option('um_fields'); - - } - - /*** - *** @regular or multi-select/options - ***/ - function is_dropdown_field( $field, $attrs ) { - - if ( isset( $attrs['options'] ) ) - return true; - - $fields = $this->all_user_fields; - - if ( isset($fields[$field]['options']) ) - return true; - - return false; - } - - /*** - *** @get a field - ***/ - function get_a_field( $field ) { - $fields = $this->all_user_fields; - if ( isset( $fields[$field] ) ) { - return $fields[$field]; - } - return ''; - } - - /*** - *** @get specific fields - ***/ - function get_specific_fields( $fields ) { - $fields = explode(',', $fields); - $array=array(); - foreach ($fields as $field ) { - if ( isset( $this->predefined_fields[$field] ) ) { - $array[$field] = $this->predefined_fields[$field]; - } - } - return $array; - } - - /*** - *** @get specific field - ***/ - function get_specific_field( $fields ) { - $fields = explode(',', $fields); - $array=array(); - foreach ($fields as $field ) { - if ( isset( $this->predefined_fields[$field] ) ) { - $array = $this->predefined_fields[$field]; - } else if ( isset( $this->saved_fields[$field] ) ) { - $array = $this->saved_fields[$field]; - } - } - return $array; - } - - /*** - *** @Checks for a unique field error - ***/ - function unique_field_err( $key ){ - global $ultimatemember; - if ( empty( $key ) ) return 'Please provide a meta key'; - if ( isset( $this->core_fields[ $key ] ) ) return __('Your meta key is a reserved core field and cannot be used','ultimate-member'); - if ( isset( $this->predefined_fields[ $key ] ) ) return __('Your meta key is a predefined reserved key and cannot be used','ultimate-member'); - if ( isset( $this->saved_fields[ $key ] ) ) return __('Your meta key already exists in your fields list','ultimate-member'); - if ( !$ultimatemember->validation->safe_string( $key ) ) return __('Your meta key contains illegal characters. Please correct it.','ultimate-member'); - return 0; - } - - /*** - *** @check date range errors (start date) - ***/ - function date_range_start_err( $date ) { - global $ultimatemember; - if ( empty( $date ) ) return __('Please provide a date range beginning','ultimate-member'); - if ( !$ultimatemember->validation->validate_date( $date ) ) return __('Please enter a valid start date in the date range','ultimate-member'); - return 0; - } - - /*** - *** @check date range errors (end date) - ***/ - function date_range_end_err( $date, $start_date ) { - global $ultimatemember; - if ( empty( $date ) ) return __('Please provide a date range end','ultimate-member'); - if ( !$ultimatemember->validation->validate_date( $date ) ) return __('Please enter a valid end date in the date range','ultimate-member'); - if ( strtotime( $date ) <= strtotime( $start_date ) ) return __('The end of date range must be greater than the start of date range','ultimate-member'); - return 0; - } - - /*** - *** @Get a core field attrs - ***/ - function get_core_field_attrs( $type ) { - return ( isset( $this->core_fields[$type] ) ) ? $this->core_fields[$type] : array(''); - } - - /*** - *** @Core Fields - ***/ - function set_core_fields(){ - - $this->core_fields = array( - - 'row' => array( - 'name' => 'Row', - 'in_fields' => false, - 'form_only' => true, - 'conditional_support' => 0, - 'icon' => 'um-faicon-pencil', - 'col1' => array('_id','_background','_text_color','_padding','_margin','_border','_borderradius','_borderstyle','_bordercolor'), - 'col2' => array('_heading','_heading_text','_heading_background_color','_heading_text_color','_icon','_icon_color','_css_class'), - ), - - 'text' => array( - 'name' => 'Text Box', - 'col1' => array('_title','_metakey','_help','_default','_min_chars','_visibility'), - 'col2' => array('_label','_placeholder','_public','_roles','_validate','_custom_validate','_max_chars'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - ) - ), - - 'number' => array( - 'name' => __('Number','ultimate-member'), - 'col1' => array('_title','_metakey','_help','_default','_min','_visibility'), - 'col2' => array('_label','_placeholder','_public','_roles','_validate','_custom_validate','_max'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - ) - ), - - 'textarea' => array( - 'name' => 'Textarea', - 'col1' => array('_title','_metakey','_help','_height','_max_chars','_max_words','_visibility'), - 'col2' => array('_label','_placeholder','_public','_roles','_default','_html'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - ) - ), - - 'select' => array( - 'name' => 'Dropdown', - 'col1' => array('_title','_metakey','_help','_default','_options','_visibility'), - 'col2' => array('_label','_placeholder','_public','_roles','_custom_dropdown_options_source','_parent_dropdown_relationship'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - '_options' => array( - 'mode' => 'required', - 'error' => __('You have not added any choices yet.','ultimate-member') - ), - ) - ), - - 'multiselect' => array( - 'name' => 'Multi-Select', - 'col1' => array('_title','_metakey','_help','_default','_options','_visibility'), - 'col2' => array('_label','_placeholder','_public','_roles','_min_selections','_max_selections','_custom_dropdown_options_source'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - '_options' => array( - 'mode' => 'required', - 'error' => __('You have not added any choices yet.','ultimate-member') - ), - ) - ), - - 'radio' => array( - 'name' => 'Radio', - 'col1' => array('_title','_metakey','_help','_default','_options','_visibility'), - 'col2' => array('_label','_public','_roles'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - '_options' => array( - 'mode' => 'required', - 'error' => __('You have not added any choices yet.','ultimate-member') - ), - ) - ), - - 'checkbox' => array( - 'name' => 'Checkbox', - 'col1' => array('_title','_metakey','_help','_default','_options','_visibility'), - 'col2' => array('_label','_public','_roles','_max_selections'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - '_options' => array( - 'mode' => 'required', - 'error' => __('You have not added any choices yet.','ultimate-member') - ), - ) - ), - - 'url' => array( - 'name' => 'URL', - 'col1' => array('_title','_metakey','_help','_default','_url_text','_visibility'), - 'col2' => array('_label','_placeholder','_url_target','_url_rel','_public','_roles','_validate','_custom_validate'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - ) - ), - - 'password' => array( - 'name' => 'Password', - 'col1' => array('_title','_metakey','_help','_min_chars','_max_chars','_visibility'), - 'col2' => array('_label','_placeholder','_public','_roles','_force_good_pass','_force_confirm_pass'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - ) - ), - - 'image' => array( - 'name' => 'Image Upload', - 'col1' => array('_title','_metakey','_help','_allowed_types','_max_size','_crop','_visibility'), - 'col2' => array('_label','_public','_roles','_upload_text','_upload_help_text','_button_text'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - '_max_size' => array( - 'mode' => 'numeric', - 'error' => __('Please enter a valid size','ultimate-member') - ), - ) - ), - - 'file' => array( - 'name' => 'File Upload', - 'col1' => array('_title','_metakey','_help','_allowed_types','_max_size','_visibility'), - 'col2' => array('_label','_public','_roles','_upload_text','_upload_help_text','_button_text'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - '_max_size' => array( - 'mode' => 'numeric', - 'error' => __('Please enter a valid size','ultimate-member') - ), - ) - ), - - 'date' => array( - 'name' => 'Date Picker', - 'col1' => array('_title','_metakey','_help','_range','_years','_years_x','_range_start','_range_end','_visibility'), - 'col2' => array('_label','_placeholder','_public','_roles','_format','_pretty_format','_disabled_weekdays'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - '_years' => array( - 'mode' => 'numeric', - 'error' => __('Number of years is not valid','ultimate-member') - ), - '_range_start' => array( - 'mode' => 'range-start', - ), - '_range_end' => array( - 'mode' => 'range-end', - ), - ) - ), - - 'time' => array( - 'name' => 'Time Picker', - 'col1' => array('_title','_metakey','_help','_format','_visibility'), - 'col2' => array('_label','_placeholder','_public','_roles','_intervals'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - ) - ), - - 'rating' => array( - 'name' => 'Rating', - 'col1' => array('_title','_metakey','_help','_visibility'), - 'col2' => array('_label','_public','_roles','_number','_default'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - ) - ), - - 'block' => array( - 'name' => 'Content Block', - 'col1' => array('_title','_visibility'), - 'col2' => array('_public','_roles'), - 'col_full' => array('_content'), - 'mce_content' => true, - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - ) - ), - - 'shortcode' => array( - 'name' => 'Shortcode', - 'col1' => array('_title','_visibility'), - 'col2' => array('_public','_roles'), - 'col_full' => array('_content'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_content' => array( - 'mode' => 'required', - 'error' => __('You must add a shortcode to the content area','ultimate-member') - ), - ) - ), - - 'spacing' => array( - 'name' => 'Spacing', - 'col1' => array('_title','_visibility'), - 'col2' => array('_spacing'), - 'form_only' => true, - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - ) - ), - - 'divider' => array( - 'name' => 'Divider', - 'col1' => array('_title','_width','_divider_text','_visibility'), - 'col2' => array('_style','_color'), - 'form_only' => true, - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - ) - ), - - 'googlemap' => array( - 'name' => 'Google Map', - 'col1' => array('_title','_metakey','_help','_visibility'), - 'col2' => array('_label','_placeholder','_public','_roles','_validate','_custom_validate'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - ) - ), - - 'youtube_video' => array( - 'name' => 'YouTube Video', - 'col1' => array('_title','_metakey','_help','_visibility'), - 'col2' => array('_label','_placeholder','_public','_roles','_validate','_custom_validate'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - ) - ), - - 'vimeo_video' => array( - 'name' => 'Vimeo Video', - 'col1' => array('_title','_metakey','_help','_visibility'), - 'col2' => array('_label','_placeholder','_public','_roles','_validate','_custom_validate'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - ) - ), - - 'soundcloud_track' => array( - 'name' => 'SoundCloud Track', - 'col1' => array('_title','_metakey','_help','_visibility'), - 'col2' => array('_label','_placeholder','_public','_roles','_validate','_custom_validate'), - 'col3' => array('_required','_editable','_icon'), - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => __('You must provide a title','ultimate-member') - ), - '_metakey' => array( - 'mode' => 'unique', - ), - ) - ), - - /*'group' => array( - 'name' => 'Field Group', - 'col1' => array('_title','_max_entries'), - 'col2' => array('_label','_public','_roles'), - 'form_only' => true, - 'validate' => array( - '_title' => array( - 'mode' => 'required', - 'error' => 'You must provide a title' - ), - '_label' => array( - 'mode' => 'required', - 'error' => 'You must provide a label' - ), - ) - ),*/ - - ); - - $this->core_fields = apply_filters('um_core_fields_hook', $this->core_fields ); - - } - - /*** - *** @Predefined Fields - ***/ - function set_predefined_fields(){ - - global $ultimatemember; - - if ( !isset( $ultimatemember->query ) || ! method_exists( $ultimatemember->query, 'get_roles' ) ) { - return; - } else { - //die('Method loaded!'); - } - - $um_roles = $ultimatemember->query->get_roles( false, array('admin') ); - - $profile_privacy = apply_filters('um_profile_privacy_options', array( __('Everyone','ultimate-member'), __('Only me','ultimate-member') ) ); - - $this->predefined_fields = array( - - 'user_login' => array( - 'title' => __('Username','ultimate-member'), - 'metakey' => 'user_login', - 'type' => 'text', - 'label' => __('Username','ultimate-member'), - 'required' => 1, - 'public' => 1, - 'editable' => 0, - 'validate' => 'unique_username', - 'min_chars' => 3, - 'max_chars' => 24 - ), - - 'username' => array( - 'title' => __('Username or E-mail','ultimate-member'), - 'metakey' => 'username', - 'type' => 'text', - 'label' => __('Username or E-mail','ultimate-member'), - 'required' => 1, - 'public' => 1, - 'editable' => 0, - 'validate' => 'unique_username_or_email', - ), - - 'user_password' => array( - 'title' => __('Password','ultimate-member'), - 'metakey' => 'user_password', - 'type' => 'password', - 'label' => __('Password','ultimate-member'), - 'required' => 1, - 'public' => 1, - 'editable' => 1, - 'min_chars' => 8, - 'max_chars' => 30, - 'force_good_pass' => 1, - 'force_confirm_pass' => 1, - ), - - 'first_name' => array( - 'title' => __('First Name','ultimate-member'), - 'metakey' => 'first_name', - 'type' => 'text', - 'label' => __('First Name','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - ), - - 'last_name' => array( - 'title' => __('Last Name','ultimate-member'), - 'metakey' => 'last_name', - 'type' => 'text', - 'label' => __('Last Name','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - ), - - 'nickname' => array( - 'title' => __('Nickname','ultimate-member'), - 'metakey' => 'nickname', - 'type' => 'text', - 'label' => __('Nickname','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - ), - - 'user_registered' => array( - 'title' => __('Registration Date','ultimate-member'), - 'metakey' => 'user_registered', - 'type' => 'text', - 'label' => __('Registration Date','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'edit_forbidden' => 1, - ), - - 'last_login' => array( - 'title' => __('Last Login','ultimate-member'), - 'metakey' => '_um_last_login', - 'type' => 'text', - 'label' => __('Last Login','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'edit_forbidden' => 1, - ), - - 'user_email' => array( - 'title' => __('E-mail Address','ultimate-member'), - 'metakey' => 'user_email', - 'type' => 'text', - 'label' => __('E-mail Address','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'validate' => 'unique_email', - 'autocomplete' => 'off' - ), - - 'secondary_user_email' => array( - 'title' => __('Secondary E-mail Address','ultimate-member'), - 'metakey' => 'secondary_user_email', - 'type' => 'text', - 'label' => __('Secondary E-mail Address','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'validate' => 'unique_email', - 'autocomplete' => 'off' - ), - - 'description' => array( - 'title' => __('Biography','ultimate-member'), - 'metakey' => 'description', - 'type' => 'textarea', - 'label' => __('Biography','ultimate-member'), - 'html' => 0, - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'max_words' => 40, - 'placeholder' => 'Enter a bit about yourself...', - ), - - 'birth_date' => array( - 'title' => __('Birth Date','ultimate-member'), - 'metakey' => 'birth_date', - 'type' => 'date', - 'label' => __('Birth Date','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'pretty_format' => 1, - 'years' => 115, - 'years_x' => 'past', - 'icon' => 'um-faicon-calendar' - ), - - 'gender' => array( - 'title' => __('Gender','ultimate-member'), - 'metakey' => 'gender', - 'type' => 'radio', - 'label' => __('Gender','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'options' => array( __('Male','ultimate-member'), __('Female','ultimate-member') ) - ), - - 'country' => array( - 'title' => __('Country','ultimate-member'), - 'metakey' => 'country', - 'type' => 'select', - 'label' => __('Country','ultimate-member'), - 'placeholder' => __('Choose a Country','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'options' => $this->get('countries') - ), - - 'facebook' => array( - 'title' => __('Facebook','ultimate-member'), - 'metakey' => 'facebook', - 'type' => 'url', - 'label' => __('Facebook','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'url_target' => '_blank', - 'url_rel' => 'nofollow', - 'icon' => 'um-faicon-facebook', - 'validate' => 'facebook_url', - 'url_text' => 'Facebook', - 'advanced' => 'social', - 'color' => '#3B5999', - 'match' => 'https://facebook.com/', - ), - - 'twitter' => array( - 'title' => __('Twitter','ultimate-member'), - 'metakey' => 'twitter', - 'type' => 'url', - 'label' => __('Twitter','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'url_target' => '_blank', - 'url_rel' => 'nofollow', - 'icon' => 'um-faicon-twitter', - 'validate' => 'twitter_url', - 'url_text' => 'Twitter', - 'advanced' => 'social', - 'color' => '#4099FF', - 'match' => 'https://twitter.com/', - ), - - 'linkedin' => array( - 'title' => __('LinkedIn','ultimate-member'), - 'metakey' => 'linkedin', - 'type' => 'url', - 'label' => __('LinkedIn','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'url_target' => '_blank', - 'url_rel' => 'nofollow', - 'icon' => 'um-faicon-linkedin', - 'validate' => 'linkedin_url', - 'url_text' => 'LinkedIn', - 'advanced' => 'social', - 'color' => '#0976b4', - 'match' => 'https://linkedin.com/in/', - ), - - 'googleplus' => array( - 'title' => __('Google+','ultimate-member'), - 'metakey' => 'googleplus', - 'type' => 'url', - 'label' => __('Google+','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'url_target' => '_blank', - 'url_rel' => 'nofollow', - 'icon' => 'um-faicon-google-plus', - 'validate' => 'google_url', - 'url_text' => 'Google+', - 'advanced' => 'social', - 'color' => '#dd4b39', - 'match' => 'https://google.com/+', - ), - - 'instagram' => array( - 'title' => __('Instagram','ultimate-member'), - 'metakey' => 'instagram', - 'type' => 'url', - 'label' => __('Instagram','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'url_target' => '_blank', - 'url_rel' => 'nofollow', - 'icon' => 'um-faicon-instagram', - 'validate' => 'instagram_url', - 'url_text' => 'Instagram', - 'advanced' => 'social', - 'color' => '#3f729b', - 'match' => 'https://instagram.com/', - ), - - 'skype' => array( - 'title' => __('Skype ID','ultimate-member'), - 'metakey' => 'skype', - 'type' => 'url', - 'label' => __('Skype ID','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'url_target' => '_blank', - 'url_rel' => 'nofollow', - 'icon' => 'um-faicon-skype', - 'validate' => 'skype', - 'url_text' => 'Skype', - ), - - 'youtube' => array( - 'title' => __('YouTube','ultimate-member'), - 'metakey' => 'youtube', - 'type' => 'url', - 'label' => __('YouTube','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'url_target' => '_blank', - 'url_rel' => 'nofollow', - 'icon' => 'um-faicon-youtube', - 'validate' => 'youtube_url', - 'url_text' => 'YouTube', - 'advanced' => 'social', - 'color' => '#e52d27', - 'match' => 'https://youtube.com/', - ), - - 'soundcloud' => array( - 'title' => __('SoundCloud','ultimate-member'), - 'metakey' => 'soundcloud', - 'type' => 'url', - 'label' => __('SoundCloud','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'url_target' => '_blank', - 'url_rel' => 'nofollow', - 'icon' => 'um-faicon-soundcloud', - 'validate' => 'soundcloud_url', - 'url_text' => 'SoundCloud', - 'advanced' => 'social', - 'color' => '#f50', - 'match' => 'https://soundcloud.com/', - ), - - 'vk' => array( - 'title' => __('VKontakte','ultimate-member'), - 'metakey' => 'vkontakte', - 'type' => 'url', - 'label' => __('VKontakte','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'url_target' => '_blank', - 'url_rel' => 'nofollow', - 'icon' => 'um-faicon-vk', - 'validate' => 'vk_url', - 'url_text' => 'VKontakte', - 'advanced' => 'social', - 'color' => '#2B587A', - 'match' => 'https://vk.com/', - ), - - 'role_select' => array( - 'title' => __('Roles (Dropdown)','ultimate-member'), - 'metakey' => 'role_select', - 'type' => 'select', - 'label' => __('Account Type','ultimate-member'), - 'placeholder' => 'Choose account type', - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'options' => $um_roles, - ), - - 'role_radio' => array( - 'title' => __('Roles (Radio)','ultimate-member'), - 'metakey' => 'role_radio', - 'type' => 'radio', - 'label' => __('Account Type','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'options' => $um_roles, - ), - - 'languages' => array( - 'title' => __('Languages','ultimate-member'), - 'metakey' => 'languages', - 'type' => 'multiselect', - 'label' => __('Languages Spoken','ultimate-member'), - 'placeholder' => __('Select languages','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'options' => $this->get('languages'), - ), - - 'phone_number' => array( - 'title' => __('Phone Number','ultimate-member'), - 'metakey' => 'phone_number', - 'type' => 'text', - 'label' => __('Phone Number','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'validate' => 'phone_number', - 'icon' => 'um-faicon-phone', - ), - - 'mobile_number' => array( - 'title' => __('Mobile Number','ultimate-member'), - 'metakey' => 'mobile_number', - 'type' => 'text', - 'label' => __('Mobile Number','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'validate' => 'phone_number', - 'icon' => 'um-faicon-mobile', - ), - - // private use ( not public list ) - - 'profile_photo' => array( - 'title' => __('Profile Photo','ultimate-member'), - 'metakey' => 'profile_photo', - 'type' => 'image', - 'label' => __('Change your profile photo','ultimate-member'), - 'upload_text' => __('Upload your photo here','ultimate-member'), - 'icon' => 'um-faicon-camera', - 'crop' => 1, - 'max_size' => ( um_get_option('profile_photo_max_size') ) ? um_get_option('profile_photo_max_size') : 999999999, - 'min_width' => str_replace('px','',um_get_option('profile_photosize')), - 'min_height' => str_replace('px','',um_get_option('profile_photosize')), - 'private_use' => true, - ), - - 'cover_photo' => array( - 'title' => __('Cover Photo','ultimate-member'), - 'metakey' => 'cover_photo', - 'type' => 'image', - 'label' => __('Change your cover photo','ultimate-member'), - 'upload_text' => __('Upload profile cover here','ultimate-member'), - 'icon' => 'um-faicon-picture-o', - 'crop' => 2, - 'max_size' => ( um_get_option('cover_photo_max_size') ) ? um_get_option('cover_photo_max_size') : 999999999, - 'modal_size' => 'large', - 'ratio' => str_replace(':1','',um_get_option('profile_cover_ratio')), - 'min_width' => um_get_option('cover_min_width'), - 'private_use' => true, - ), - - 'password_reset_text' => array( - 'title' => __('Password Reset','ultimate-member'), - 'type' => 'block', - 'content' => '
            ' . __('To reset your password, please enter your email address or username below','ultimate-member'). '
            ', - 'private_use' => true, - ), - - 'username_b' => array( - 'title' => __('Username or E-mail','ultimate-member'), - 'metakey' => 'username_b', - 'type' => 'text', - 'placeholder' => __('Enter your username or email','ultimate-member'), - 'required' => 1, - 'public' => 1, - 'editable' => 0, - 'private_use' => true, - ), - - // account page use ( not public ) - - 'profile_privacy' => array( - 'title' => __('Profile Privacy','ultimate-member'), - 'metakey' => 'profile_privacy', - 'type' => 'select', - 'label' => __('Profile Privacy','ultimate-member'), - 'help' => __('Who can see your public profile?','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'default' => __('Everyone','ultimate-member'), - 'options' => $profile_privacy, - 'allowclear' => 0, - 'account_only' => true, - 'required_perm' => 'can_make_private_profile', - ), - - 'hide_in_members' => array( - 'title' => __('Hide my profile from directory','ultimate-member'), - 'metakey' => 'hide_in_members', - 'type' => 'radio', - 'label' => __('Hide my profile from directory','ultimate-member'), - 'help' => __('Here you can hide yourself from appearing in public directory','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'default' => __('No','ultimate-member'), - 'options' => array( __('No','ultimate-member'), __('Yes','ultimate-member') ), - 'account_only' => true, - 'required_opt' => array( 'members_page', 1 ), - ), - - 'delete_account' => array( - 'title' => __('Delete Account','ultimate-member'), - 'metakey' => 'delete_account', - 'type' => 'radio', - 'label' => __('Delete Account','ultimate-member'), - 'help' => __('If you confirm, everything related to your profile will be deleted permanently from the site','ultimate-member'), - 'required' => 0, - 'public' => 1, - 'editable' => 1, - 'default' => __('No','ultimate-member'), - 'options' => array( __('Yes','ultimate-member') , __('No','ultimate-member') ), - 'account_only' => true, - ), - - 'single_user_password' => array( - 'title' => __('Password','ultimate-member'), - 'metakey' => 'single_user_password', - 'type' => 'password', - 'label' => __('Password','ultimate-member'), - 'required' => 1, - 'public' => 1, - 'editable' => 1, - 'account_only' => true, - ), - - ); - - $this->predefined_fields = apply_filters('um_predefined_fields_hook', $this->predefined_fields ); - - } - - /*** - *** @Custom Fields - ***/ - function set_custom_fields(){ - - if ( is_array( $this->saved_fields ) ) { - - $this->custom_fields = $this->saved_fields; - - } else { - - $this->custom_fields = ''; - - } - - $custom = $this->custom_fields; - $predefined = $this->predefined_fields; - - if ( is_array( $custom ) ){ - $this->all_user_fields = array_merge( $predefined, $custom ); - } else { - $this->all_user_fields = $predefined; - } - - } - - /*** - *** @may be used to show a dropdown, or source for user meta - ***/ - function all_user_fields( $exclude_types = null, $show_all = false ) { - - global $ultimatemember; - - $fields_without_metakey = array('block','shortcode','spacing','divider','group'); - remove_filter('um_fields_without_metakey', 'um_user_tags_requires_no_metakey'); - $fields_without_metakey = apply_filters('um_fields_without_metakey', $fields_without_metakey ); - - if ( !$show_all ) { - $this->fields_dropdown = array('image','file','password','rating'); - $this->fields_dropdown = array_merge( $this->fields_dropdown, $fields_without_metakey ); - } else { - $this->fields_dropdown = $fields_without_metakey; - } - - $custom = $this->custom_fields; - $predefined = $this->predefined_fields; - - if ( $exclude_types ) { - $exclude_types = explode(',', $exclude_types); - } - - $all = array( 0 => '' ); - - if ( is_array( $custom ) ){ - $all = $all + array_merge( $predefined, $custom ); - } else { - $all = $all + $predefined; - } - - foreach( $all as $k => $arr ) { - - if ( $k == 0 ) { - unset($all[$k]); - } - - if ( isset( $arr['title'] ) ){ - $all[$k]['title'] = stripslashes( $arr['title'] ); - } - - if ( $exclude_types && isset( $arr['type'] ) && in_array( $arr['type'], $exclude_types ) ) { - unset( $all[$k] ); - } - if ( isset( $arr['account_only'] ) || isset( $arr['private_use'] ) ) { - if ( !$show_all ) { - unset( $all[$k] ); - } - } - if ( isset( $arr['type'] ) && in_array( $arr['type'], $this->fields_dropdown ) ) { - unset( $all[$k] ); - } - } - - $all = $ultimatemember->fields->array_sort_by_column( $all, 'title'); - - $all = array( 0 => '') + $all; - - return $all; - } - - /*** - *** @Possible validation types for fields - ***/ - function validation_types(){ - - $array[0] = __('None','ultimate-member'); - $array['alphabetic'] = __('Alphabetic value only','ultimate-member'); - $array['alpha_numeric'] = __('Alpha-numeric value','ultimate-member'); - $array['english'] = __('English letters only','ultimate-member'); - $array['facebook_url'] = __('Facebook URL','ultimate-member'); - $array['google_url'] = __('Google+ URL','ultimate-member'); - $array['instagram_url'] = __('Instagram URL','ultimate-member'); - $array['linkedin_url'] = __('LinkedIn URL','ultimate-member'); - $array['vk_url'] = __('VKontakte URL','ultimate-member'); - $array['lowercase'] = __('Lowercase only','ultimate-member'); - $array['numeric'] = __('Numeric value only','ultimate-member'); - $array['phone_number'] = __('Phone Number','ultimate-member'); - $array['skype'] = __('Skype ID','ultimate-member'); - $array['soundcloud'] = __('SoundCloud Profile','ultimate-member'); - $array['twitter_url'] = __('Twitter URL','ultimate-member'); - $array['unique_email'] = __('Unique E-mail','ultimate-member'); - $array['unique_value'] = __('Unique Metakey value','ultimate-member'); - $array['unique_username'] = __('Unique Username','ultimate-member'); - $array['unique_username_or_email'] = __('Unique Username/E-mail','ultimate-member'); - $array['url'] = __('Website URL','ultimate-member'); - $array['youtube_url'] = __('YouTube Profile','ultimate-member'); - $array['custom'] = __('Custom Validation','ultimate-member'); - - $array = apply_filters('um_admin_field_validation_hook', $array ); - return $array; - } - - /*** - *** @Get predefined options - ***/ - function get( $data ){ - switch($data) { - - case 'languages': - $array = array( - "aa" => __("Afar",'ultimate-member'), - "ab" => __("Abkhazian",'ultimate-member'), - "ae" => __("Avestan",'ultimate-member'), - "af" => __("Afrikaans",'ultimate-member'), - "ak" => __("Akan",'ultimate-member'), - "am" => __("Amharic",'ultimate-member'), - "an" => __("Aragonese",'ultimate-member'), - "ar" => __("Arabic",'ultimate-member'), - "as" => __("Assamese",'ultimate-member'), - "av" => __("Avaric",'ultimate-member'), - "ay" => __("Aymara",'ultimate-member'), - "az" => __("Azerbaijani",'ultimate-member'), - "ba" => __("Bashkir",'ultimate-member'), - "be" => __("Belarusian",'ultimate-member'), - "bg" => __("Bulgarian",'ultimate-member'), - "bh" => __("Bihari",'ultimate-member'), - "bi" => __("Bislama",'ultimate-member'), - "bm" => __("Bambara",'ultimate-member'), - "bn" => __("Bengali",'ultimate-member'), - "bo" => __("Tibetan",'ultimate-member'), - "br" => __("Breton",'ultimate-member'), - "bs" => __("Bosnian",'ultimate-member'), - "ca" => __("Catalan",'ultimate-member'), - "ce" => __("Chechen",'ultimate-member'), - "ch" => __("Chamorro",'ultimate-member'), - "co" => __("Corsican",'ultimate-member'), - "cr" => __("Cree",'ultimate-member'), - "cs" => __("Czech",'ultimate-member'), - "cu" => __("Church Slavic",'ultimate-member'), - "cv" => __("Chuvash",'ultimate-member'), - "cy" => __("Welsh",'ultimate-member'), - "da" => __("Danish",'ultimate-member'), - "de" => __("German",'ultimate-member'), - "dv" => __("Divehi",'ultimate-member'), - "dz" => __("Dzongkha",'ultimate-member'), - "ee" => __("Ewe",'ultimate-member'), - "el" => __("Greek",'ultimate-member'), - "en" => __("English",'ultimate-member'), - "eo" => __("Esperanto",'ultimate-member'), - "es" => __("Spanish",'ultimate-member'), - "et" => __("Estonian",'ultimate-member'), - "eu" => __("Basque",'ultimate-member'), - "fa" => __("Persian",'ultimate-member'), - "ff" => __("Fulah",'ultimate-member'), - "fi" => __("Finnish",'ultimate-member'), - "fj" => __("Fijian",'ultimate-member'), - "fo" => __("Faroese",'ultimate-member'), - "fr" => __("French",'ultimate-member'), - "fy" => __("Western Frisian",'ultimate-member'), - "ga" => __("Irish",'ultimate-member'), - "gd" => __("Scottish Gaelic",'ultimate-member'), - "gl" => __("Galician",'ultimate-member'), - "gn" => __("Guarani",'ultimate-member'), - "gu" => __("Gujarati",'ultimate-member'), - "gv" => __("Manx",'ultimate-member'), - "ha" => __("Hausa",'ultimate-member'), - "he" => __("Hebrew",'ultimate-member'), - "hi" => __("Hindi",'ultimate-member'), - "ho" => __("Hiri Motu",'ultimate-member'), - "hr" => __("Croatian",'ultimate-member'), - "ht" => __("Haitian",'ultimate-member'), - "hu" => __("Hungarian",'ultimate-member'), - "hy" => __("Armenian",'ultimate-member'), - "hz" => __("Herero",'ultimate-member'), - "ia" => __("Interlingua (International Auxiliary Language Association)",'ultimate-member'), - "id" => __("Indonesian",'ultimate-member'), - "ie" => __("Interlingue",'ultimate-member'), - "ig" => __("Igbo",'ultimate-member'), - "ii" => __("Sichuan Yi",'ultimate-member'), - "ik" => __("Inupiaq",'ultimate-member'), - "io" => __("Ido",'ultimate-member'), - "is" => __("Icelandic",'ultimate-member'), - "it" => __("Italian",'ultimate-member'), - "iu" => __("Inuktitut",'ultimate-member'), - "ja" => __("Japanese",'ultimate-member'), - "jv" => __("Javanese",'ultimate-member'), - "ka" => __("Georgian",'ultimate-member'), - "kg" => __("Kongo",'ultimate-member'), - "ki" => __("Kikuyu",'ultimate-member'), - "kj" => __("Kwanyama",'ultimate-member'), - "kk" => __("Kazakh",'ultimate-member'), - "kl" => __("Kalaallisut",'ultimate-member'), - "km" => __("Khmer",'ultimate-member'), - "kn" => __("Kannada",'ultimate-member'), - "ko" => __("Korean",'ultimate-member'), - "kr" => __("Kanuri",'ultimate-member'), - "ks" => __("Kashmiri",'ultimate-member'), - "ku" => __("Kurdish",'ultimate-member'), - "kv" => __("Komi",'ultimate-member'), - "kw" => __("Cornish",'ultimate-member'), - "ky" => __("Kirghiz",'ultimate-member'), - "la" => __("Latin",'ultimate-member'), - "lb" => __("Luxembourgish",'ultimate-member'), - "lg" => __("Ganda",'ultimate-member'), - "li" => __("Limburgish",'ultimate-member'), - "ln" => __("Lingala",'ultimate-member'), - "lo" => __("Lao",'ultimate-member'), - "lt" => __("Lithuanian",'ultimate-member'), - "lu" => __("Luba-Katanga",'ultimate-member'), - "lv" => __("Latvian",'ultimate-member'), - "mg" => __("Malagasy",'ultimate-member'), - "mh" => __("Marshallese",'ultimate-member'), - "mi" => __("Maori",'ultimate-member'), - "mk" => __("Macedonian",'ultimate-member'), - "ml" => __("Malayalam",'ultimate-member'), - "mn" => __("Mongolian",'ultimate-member'), - "mr" => __("Marathi",'ultimate-member'), - "ms" => __("Malay",'ultimate-member'), - "mt" => __("Maltese",'ultimate-member'), - "my" => __("Burmese",'ultimate-member'), - "na" => __("Nauru",'ultimate-member'), - "nb" => __("Norwegian Bokmal",'ultimate-member'), - "nd" => __("North Ndebele",'ultimate-member'), - "ne" => __("Nepali",'ultimate-member'), - "ng" => __("Ndonga",'ultimate-member'), - "nl" => __("Dutch",'ultimate-member'), - "nn" => __("Norwegian Nynorsk",'ultimate-member'), - "no" => __("Norwegian",'ultimate-member'), - "nr" => __("South Ndebele",'ultimate-member'), - "nv" => __("Navajo",'ultimate-member'), - "ny" => __("Chichewa",'ultimate-member'), - "oc" => __("Occitan",'ultimate-member'), - "oj" => __("Ojibwa",'ultimate-member'), - "om" => __("Oromo",'ultimate-member'), - "or" => __("Oriya",'ultimate-member'), - "os" => __("Ossetian",'ultimate-member'), - "pa" => __("Panjabi",'ultimate-member'), - "pi" => __("Pali",'ultimate-member'), - "pl" => __("Polish",'ultimate-member'), - "ps" => __("Pashto",'ultimate-member'), - "pt" => __("Portuguese",'ultimate-member'), - "qu" => __("Quechua",'ultimate-member'), - "rm" => __("Raeto-Romance",'ultimate-member'), - "rn" => __("Kirundi",'ultimate-member'), - "ro" => __("Romanian",'ultimate-member'), - "ru" => __("Russian",'ultimate-member'), - "rw" => __("Kinyarwanda",'ultimate-member'), - "sa" => __("Sanskrit",'ultimate-member'), - "sc" => __("Sardinian",'ultimate-member'), - "sd" => __("Sindhi",'ultimate-member'), - "se" => __("Northern Sami",'ultimate-member'), - "sg" => __("Sango",'ultimate-member'), - "si" => __("Sinhala",'ultimate-member'), - "sk" => __("Slovak",'ultimate-member'), - "sl" => __("Slovenian",'ultimate-member'), - "sm" => __("Samoan",'ultimate-member'), - "sn" => __("Shona",'ultimate-member'), - "so" => __("Somali",'ultimate-member'), - "sq" => __("Albanian",'ultimate-member'), - "sr" => __("Serbian",'ultimate-member'), - "ss" => __("Swati",'ultimate-member'), - "st" => __("Southern Sotho",'ultimate-member'), - "su" => __("Sundanese",'ultimate-member'), - "sv" => __("Swedish",'ultimate-member'), - "sw" => __("Swahili",'ultimate-member'), - "ta" => __("Tamil",'ultimate-member'), - "te" => __("Telugu",'ultimate-member'), - "tg" => __("Tajik",'ultimate-member'), - "th" => __("Thai",'ultimate-member'), - "ti" => __("Tigrinya",'ultimate-member'), - "tk" => __("Turkmen",'ultimate-member'), - "tl" => __("Tagalog",'ultimate-member'), - "tn" => __("Tswana",'ultimate-member'), - "to" => __("Tonga",'ultimate-member'), - "tr" => __("Turkish",'ultimate-member'), - "ts" => __("Tsonga",'ultimate-member'), - "tt" => __("Tatar",'ultimate-member'), - "tw" => __("Twi",'ultimate-member'), - "ty" => __("Tahitian",'ultimate-member'), - "ug" => __("Uighur",'ultimate-member'), - "uk" => __("Ukrainian",'ultimate-member'), - "ur" => __("Urdu",'ultimate-member'), - "uz" => __("Uzbek",'ultimate-member'), - "ve" => __("Venda",'ultimate-member'), - "vi" => __("Vietnamese",'ultimate-member'), - "vo" => __("Volapuk",'ultimate-member'), - "wa" => __("Walloon",'ultimate-member'), - "wo" => __("Wolof",'ultimate-member'), - "xh" => __("Xhosa",'ultimate-member'), - "yi" => __("Yiddish",'ultimate-member'), - "yo" => __("Yoruba",'ultimate-member'), - "za" => __("Zhuang",'ultimate-member'), - "zh" => __("Chinese",'ultimate-member'), - "zu" => __("Zulu",'ultimate-member') - ); - break; - - case 'countries': - $array = array ( - 'AF' => __('Afghanistan','ultimate-member'), - 'AX' => __('Åland Islands','ultimate-member'), - 'AL' => __('Albania','ultimate-member'), - 'DZ' => __('Algeria','ultimate-member'), - 'AS' => __('American Samoa','ultimate-member'), - 'AD' => __('Andorra','ultimate-member'), - 'AO' => __('Angola','ultimate-member'), - 'AI' => __('Anguilla','ultimate-member'), - 'AQ' => __('Antarctica','ultimate-member'), - 'AG' => __('Antigua and Barbuda','ultimate-member'), - 'AR' => __('Argentina','ultimate-member'), - 'AM' => __('Armenia','ultimate-member'), - 'AW' => __('Aruba','ultimate-member'), - 'AU' => __('Australia','ultimate-member'), - 'AT' => __('Austria','ultimate-member'), - 'AZ' => __('Azerbaijan','ultimate-member'), - 'BS' => __('Bahamas','ultimate-member'), - 'BH' => __('Bahrain','ultimate-member'), - 'BD' => __('Bangladesh','ultimate-member'), - 'BB' => __('Barbados','ultimate-member'), - 'BY' => __('Belarus','ultimate-member'), - 'BE' => __('Belgium','ultimate-member'), - 'BZ' => __('Belize','ultimate-member'), - 'BJ' => __('Benin','ultimate-member'), - 'BM' => __('Bermuda','ultimate-member'), - 'BT' => __('Bhutan','ultimate-member'), - 'BO' => __('Bolivia, Plurinational State of','ultimate-member'), - 'BA' => __('Bosnia and Herzegovina','ultimate-member'), - 'BW' => __('Botswana','ultimate-member'), - 'BV' => __('Bouvet Island','ultimate-member'), - 'BR' => __('Brazil','ultimate-member'), - 'IO' => __('British Indian Ocean Territory','ultimate-member'), - 'BN' => __('Brunei Darussalam','ultimate-member'), - 'BG' => __('Bulgaria','ultimate-member'), - 'BF' => __('Burkina Faso','ultimate-member'), - 'BI' => __('Burundi','ultimate-member'), - 'KH' => __('Cambodia','ultimate-member'), - 'CM' => __('Cameroon','ultimate-member'), - 'CA' => __('Canada','ultimate-member'), - 'CV' => __('Cape Verde','ultimate-member'), - 'KY' => __('Cayman Islands','ultimate-member'), - 'CF' => __('Central African Republic','ultimate-member'), - 'TD' => __('Chad','ultimate-member'), - 'CL' => __('Chile','ultimate-member'), - 'CN' => __('China','ultimate-member'), - 'CX' => __('Christmas Island','ultimate-member'), - 'CC' => __('Cocos (Keeling) Islands','ultimate-member'), - 'CO' => __('Colombia','ultimate-member'), - 'KM' => __('Comoros','ultimate-member'), - 'CG' => __('Congo','ultimate-member'), - 'CD' => __('Congo, the Democratic Republic of the','ultimate-member'), - 'CK' => __('Cook Islands','ultimate-member'), - 'CR' => __('Costa Rica','ultimate-member'), - 'CI' => __("Côte d'Ivoire",'ultimate-member'), - 'HR' => __('Croatia','ultimate-member'), - 'CU' => __('Cuba','ultimate-member'), - 'CY' => __('Cyprus','ultimate-member'), - 'CZ' => __('Czech Republic','ultimate-member'), - 'DK' => __('Denmark','ultimate-member'), - 'DJ' => __('Djibouti','ultimate-member'), - 'DM' => __('Dominica','ultimate-member'), - 'DO' => __('Dominican Republic','ultimate-member'), - 'EC' => __('Ecuador','ultimate-member'), - 'EG' => __('Egypt','ultimate-member'), - 'SV' => __('El Salvador','ultimate-member'), - 'GQ' => __('Equatorial Guinea','ultimate-member'), - 'ER' => __('Eritrea','ultimate-member'), - 'EE' => __('Estonia','ultimate-member'), - 'ET' => __('Ethiopia','ultimate-member'), - 'FK' => __('Falkland Islands (Malvinas)','ultimate-member'), - 'FO' => __('Faroe Islands','ultimate-member'), - 'FJ' => __('Fiji','ultimate-member'), - 'FI' => __('Finland','ultimate-member'), - 'FR' => __('France','ultimate-member'), - 'GF' => __('French Guiana','ultimate-member'), - 'PF' => __('French Polynesia','ultimate-member'), - 'TF' => __('French Southern Territories','ultimate-member'), - 'GA' => __('Gabon','ultimate-member'), - 'GM' => __('Gambia','ultimate-member'), - 'GE' => __('Georgia','ultimate-member'), - 'DE' => __('Germany','ultimate-member'), - 'GH' => __('Ghana','ultimate-member'), - 'GI' => __('Gibraltar','ultimate-member'), - 'GR' => __('Greece','ultimate-member'), - 'GL' => __('Greenland','ultimate-member'), - 'GD' => __('Grenada','ultimate-member'), - 'GP' => __('Guadeloupe','ultimate-member'), - 'GU' => __('Guam','ultimate-member'), - 'GT' => __('Guatemala','ultimate-member'), - 'GG' => __('Guernsey','ultimate-member'), - 'GN' => __('Guinea','ultimate-member'), - 'GW' => __('Guinea-Bissau','ultimate-member'), - 'GY' => __('Guyana','ultimate-member'), - 'HT' => __('Haiti','ultimate-member'), - 'HM' => __('Heard Island and McDonald Islands','ultimate-member'), - 'VA' => __('Holy See (Vatican City State)','ultimate-member'), - 'HN' => __('Honduras','ultimate-member'), - 'HK' => __('Hong Kong','ultimate-member'), - 'HU' => __('Hungary','ultimate-member'), - 'IS' => __('Iceland','ultimate-member'), - 'IN' => __('India','ultimate-member'), - 'ID' => __('Indonesia','ultimate-member'), - 'IR' => __('Iran, Islamic Republic of','ultimate-member'), - 'IQ' => __('Iraq','ultimate-member'), - 'IE' => __('Ireland','ultimate-member'), - 'IM' => __('Isle of Man','ultimate-member'), - 'IL' => __('Israel','ultimate-member'), - 'IT' => __('Italy','ultimate-member'), - 'JM' => __('Jamaica','ultimate-member'), - 'JP' => __('Japan','ultimate-member'), - 'JE' => __('Jersey','ultimate-member'), - 'JO' => __('Jordan','ultimate-member'), - 'KZ' => __('Kazakhstan','ultimate-member'), - 'KE' => __('Kenya','ultimate-member'), - 'KI' => __('Kiribati','ultimate-member'), - 'KP' => __("Korea, Democratic People's Republic of",'ultimate-member'), - 'KR' => __('Korea, Republic of','ultimate-member'), - 'KW' => __('Kuwait','ultimate-member'), - 'KG' => __('Kyrgyzstan','ultimate-member'), - 'LA' => __("Lao People's Democratic Republic",'ultimate-member'), - 'LV' => __('Latvia','ultimate-member'), - 'LB' => __('Lebanon','ultimate-member'), - 'LS' => __('Lesotho','ultimate-member'), - 'LR' => __('Liberia','ultimate-member'), - 'LY' => __('Libyan Arab Jamahiriya','ultimate-member'), - 'LI' => __('Liechtenstein','ultimate-member'), - 'LT' => __('Lithuania','ultimate-member'), - 'LU' => __('Luxembourg','ultimate-member'), - 'MO' => __('Macao','ultimate-member'), - 'MK' => __('Macedonia, the former Yugoslav Republic of','ultimate-member'), - 'MG' => __('Madagascar','ultimate-member'), - 'MW' => __('Malawi','ultimate-member'), - 'MY' => __('Malaysia','ultimate-member'), - 'MV' => __('Maldives','ultimate-member'), - 'ML' => __('Mali','ultimate-member'), - 'MT' => __('Malta','ultimate-member'), - 'MH' => __('Marshall Islands','ultimate-member'), - 'MQ' => __('Martinique','ultimate-member'), - 'MR' => __('Mauritania','ultimate-member'), - 'MU' => __('Mauritius','ultimate-member'), - 'YT' => __('Mayotte','ultimate-member'), - 'MX' => __('Mexico','ultimate-member'), - 'FM' => __('Micronesia, Federated States of','ultimate-member'), - 'MD' => __('Moldova, Republic of','ultimate-member'), - 'MC' => __('Monaco','ultimate-member'), - 'MN' => __('Mongolia','ultimate-member'), - 'ME' => __('Montenegro','ultimate-member'), - 'MS' => __('Montserrat','ultimate-member'), - 'MA' => __('Morocco','ultimate-member'), - 'MZ' => __('Mozambique','ultimate-member'), - 'MM' => __('Myanmar','ultimate-member'), - 'NA' => __('Namibia','ultimate-member'), - 'NR' => __('Nauru','ultimate-member'), - 'NP' => __('Nepal','ultimate-member'), - 'NL' => __('Netherlands','ultimate-member'), - 'AN' => __('Netherlands Antilles','ultimate-member'), - 'NC' => __('New Caledonia','ultimate-member'), - 'NZ' => __('New Zealand','ultimate-member'), - 'NI' => __('Nicaragua','ultimate-member'), - 'NE' => __('Niger','ultimate-member'), - 'NG' => __('Nigeria','ultimate-member'), - 'NU' => __('Niue','ultimate-member'), - 'NF' => __('Norfolk Island','ultimate-member'), - 'MP' => __('Northern Mariana Islands','ultimate-member'), - 'NO' => __('Norway','ultimate-member'), - 'OM' => __('Oman','ultimate-member'), - 'PK' => __('Pakistan','ultimate-member'), - 'PW' => __('Palau','ultimate-member'), - 'PS' => __('Palestine','ultimate-member'), - 'PA' => __('Panama','ultimate-member'), - 'PG' => __('Papua New Guinea','ultimate-member'), - 'PY' => __('Paraguay','ultimate-member'), - 'PE' => __('Peru','ultimate-member'), - 'PH' => __('Philippines','ultimate-member'), - 'PN' => __('Pitcairn','ultimate-member'), - 'PL' => __('Poland','ultimate-member'), - 'PT' => __('Portugal','ultimate-member'), - 'PR' => __('Puerto Rico','ultimate-member'), - 'QA' => __('Qatar','ultimate-member'), - 'RE' => __('Réunion','ultimate-member'), - 'RO' => __('Romania','ultimate-member'), - 'RU' => __('Russian Federation','ultimate-member'), - 'RW' => __('Rwanda','ultimate-member'), - 'BL' => __('Saint Barthélemy','ultimate-member'), - 'SH' => __('Saint Helena','ultimate-member'), - 'KN' => __('Saint Kitts and Nevis','ultimate-member'), - 'LC' => __('Saint Lucia','ultimate-member'), - 'MF' => __('Saint Martin (French part)','ultimate-member'), - 'PM' => __('Saint Pierre and Miquelon','ultimate-member'), - 'VC' => __('Saint Vincent and the Grenadines','ultimate-member'), - 'WS' => __('Samoa','ultimate-member'), - 'SM' => __('San Marino','ultimate-member'), - 'ST' => __('Sao Tome and Principe','ultimate-member'), - 'SA' => __('Saudi Arabia','ultimate-member'), - 'SN' => __('Senegal','ultimate-member'), - 'RS' => __('Serbia','ultimate-member'), - 'SC' => __('Seychelles','ultimate-member'), - 'SL' => __('Sierra Leone','ultimate-member'), - 'SG' => __('Singapore','ultimate-member'), - 'SK' => __('Slovakia','ultimate-member'), - 'SI' => __('Slovenia','ultimate-member'), - 'SB' => __('Solomon Islands','ultimate-member'), - 'SO' => __('Somalia','ultimate-member'), - 'ZA' => __('South Africa','ultimate-member'), - 'GS' => __('South Georgia and the South Sandwich Islands','ultimate-member'), - 'SS' => __('South Sudan','ultimate-member'), - 'ES' => __('Spain','ultimate-member'), - 'LK' => __('Sri Lanka','ultimate-member'), - 'SD' => __('Sudan','ultimate-member'), - 'SR' => __('Suriname','ultimate-member'), - 'SJ' => __('Svalbard and Jan Mayen','ultimate-member'), - 'SZ' => __('Swaziland','ultimate-member'), - 'SE' => __('Sweden','ultimate-member'), - 'CH' => __('Switzerland','ultimate-member'), - 'SY' => __('Syrian Arab Republic','ultimate-member'), - 'TW' => __('Taiwan, Province of China','ultimate-member'), - 'TJ' => __('Tajikistan','ultimate-member'), - 'TZ' => __('Tanzania, United Republic of','ultimate-member'), - 'TH' => __('Thailand','ultimate-member'), - 'TL' => __('Timor-Leste','ultimate-member'), - 'TG' => __('Togo','ultimate-member'), - 'TK' => __('Tokelau','ultimate-member'), - 'TO' => __('Tonga','ultimate-member'), - 'TT' => __('Trinidad and Tobago','ultimate-member'), - 'TN' => __('Tunisia','ultimate-member'), - 'TR' => __('Turkey','ultimate-member'), - 'TM' => __('Turkmenistan','ultimate-member'), - 'TC' => __('Turks and Caicos Islands','ultimate-member'), - 'TV' => __('Tuvalu','ultimate-member'), - 'UG' => __('Uganda','ultimate-member'), - 'UA' => __('Ukraine','ultimate-member'), - 'AE' => __('United Arab Emirates','ultimate-member'), - 'GB' => __('United Kingdom','ultimate-member'), - 'US' => __('United States','ultimate-member'), - 'UM' => __('United States Minor Outlying Islands','ultimate-member'), - 'UY' => __('Uruguay','ultimate-member'), - 'UZ' => __('Uzbekistan','ultimate-member'), - 'VU' => __('Vanuatu','ultimate-member'), - 'VE' => __('Venezuela, Bolivarian Republic of','ultimate-member'), - 'VN' => __('Viet Nam','ultimate-member'), - 'VG' => __('Virgin Islands, British','ultimate-member'), - 'VI' => __('Virgin Islands, U.S.','ultimate-member'), - 'WF' => __('Wallis and Futuna','ultimate-member'), - 'EH' => __('Western Sahara','ultimate-member'), - 'YE' => __('Yemen','ultimate-member'), - 'ZM' => __('Zambia','ultimate-member'), - 'ZW' => __('Zimbabwe','ultimate-member'), - ); - break; - - } - - $array = apply_filters("um_{$data}_predefined_field_options", $array); - - return $array; - - } - -} diff --git a/core/um-chart.php b/core/um-chart.php deleted file mode 100644 index 732772f2..00000000 --- a/core/um-chart.php +++ /dev/null @@ -1,130 +0,0 @@ - 0, - 'type' => 'LineChart', - 'data' => null, - 'x_label' => null, - 'y_label' => null, - 'vertical_max_lines' => 6, - 'colors' => '#3ba1da', - 'backgroundcolor' => 'transparent', - 'basetextcolor' => '#666', - 'basebordercolor' => '#bbb', - 'days' => 30 - ); - - $args = wp_parse_args( $args, $defaults ); - extract($args); - - if ($type == 'LineChart'){ - $this->linechart( $args ); - } - - } - - /*** - *** @LineChart - ***/ - function linechart( $args ){ - - global $ultimatemember; - extract($args); - - ?> - - - -
            - -
            - - 604800, - 'display' => __( 'Once Weekly', 'ultimate-member') - ); - - return $schedules; - } - - public function schedule_Events() { - $this->weekly_events(); - $this->daily_events(); - $this->twicedaily_events(); - $this->hourly_events(); - } - - private function weekly_events() { - if ( ! wp_next_scheduled( 'um_weekly_scheduled_events' ) ) { - wp_schedule_event( current_time( 'timestamp' ), 'weekly', 'um_weekly_scheduled_events' ); - } - } - - private function daily_events() { - if ( ! wp_next_scheduled( 'um_daily_scheduled_events' ) ) { - wp_schedule_event( current_time( 'timestamp' ), 'daily', 'um_daily_scheduled_events' ); - } - } - - private function twicedaily_events() { - if ( ! wp_next_scheduled( 'um_twicedaily_scheduled_events' ) ) { - wp_schedule_event( current_time( 'timestamp' ), 'twicedaily', 'um_twicedaily_scheduled_events' ); - } - } - - private function hourly_events() { - if ( ! wp_next_scheduled( 'um_hourly_scheduled_events' ) ) { - wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'um_hourly_scheduled_events' ); - } - } - -} \ No newline at end of file diff --git a/core/um-datetime.php b/core/um-datetime.php deleted file mode 100644 index 15baa715..00000000 --- a/core/um-datetime.php +++ /dev/null @@ -1,119 +0,0 @@ -= HOUR_IN_SECONDS ) { - - $hours = round( $diff / HOUR_IN_SECONDS ); - if ( $hours <= 1 ) - $hours = 1; - if ( $hours == 1 ) { - $since = sprintf( __('%s hr','ultimate-member'), $hours ); - } else { - $since = sprintf( __('%s hrs','ultimate-member'), $hours ); - } - - } elseif ( $diff < WEEK_IN_SECONDS && $diff >= DAY_IN_SECONDS ) { - - $days = round( $diff / DAY_IN_SECONDS ); - if ( $days <= 1 ) - $days = 1; - if ( $days == 1 ) { - $since = sprintf( __('Yesterday at %s','ultimate-member'), date('g:ia', $from ) ); - } else { - $since = sprintf(__('%s at %s','ultimate-member'), date('F d', $from ), date('g:ia', $from ) ); - } - - } elseif ( $diff < 30 * DAY_IN_SECONDS && $diff >= WEEK_IN_SECONDS ) { - - $since = sprintf(__('%s at %s','ultimate-member'), date('F d', $from ), date('g:ia', $from ) ); - - } elseif ( $diff < YEAR_IN_SECONDS && $diff >= 30 * DAY_IN_SECONDS ) { - - $since = sprintf(__('%s at %s','ultimate-member'), date('F d', $from ), date('g:ia', $from ) ); - - } elseif ( $diff >= YEAR_IN_SECONDS ) { - - $since = sprintf(__('%s at %s','ultimate-member'), date( 'F d, Y', $from ), date('g:ia', $from ) ); - - } - - return apply_filters( 'um_human_time_diff', $since, $diff, $from, $to ); - } - - /*** - *** @Get age - ***/ - function get_age($then) { - if ( !$then ) return ''; - $then_ts = strtotime($then); - $then_year = date('Y', $then_ts); - $age = date('Y') - $then_year; - if( strtotime('+' . $age . ' years', $then_ts) > current_time( 'timestamp' ) ) $age--; - if ( $age == 1 ) - return sprintf(__('%s year old','ultimate-member'), $age ); - if ( $age > 1 ) - return sprintf(__('%s years old','ultimate-member'), $age ); - if ( $age == 0 ) - return __('Less than 1 year old','ultimate-member'); - } - - /*** - *** @Reformat dates - ***/ - function format($old, $new){ - $datetime = new DateTime($old); - $output = $datetime->format( $new ); - return $output; - } - - /*** - *** @Get last 30 days as array - ***/ - function get_last_days($num = 30, $reverse = true) { - $d = array(); - for($i = 0; $i < $num; $i++) { - $d[ date('Y-m-d', strtotime('-'. $i .' days')) ] = date('m/d', strtotime('-'. $i .' days')); - } - if ($reverse == true){ - return array_reverse($d); - } else { - return $d; - } - } - -} \ No newline at end of file diff --git a/core/um-enqueue.php b/core/um-enqueue.php deleted file mode 100644 index da2ff655..00000000 --- a/core/um-enqueue.php +++ /dev/null @@ -1,396 +0,0 @@ -permalinks->get_current_url( get_option('permalink_structure') ); - - foreach( $exclude as $match ) { - if ( ! empty( $c_url ) && strstr( $c_url, untrailingslashit( $match ) ) ) { - return; - } - } - - } - - $include = um_get_option('js_css_include'); - if ( is_array( $include ) ) { - array_filter( $include ); - } - if ( $include && !is_admin() && is_array( $include ) ) { - - $c_url = $ultimatemember->permalinks->get_current_url( get_option('permalink_structure') ); - - foreach( $include as $match ) { - if ( strstr( $c_url, untrailingslashit( $match ) ) ) { - $force_load = true; - } else { - if ( !isset( $force_load ) ) { - $force_load = false; - } - } - } - - } - - if ( isset($force_load) && $force_load == false ) return; - - // enqueue styles - if ( um_get_option('disable_minify') ) { - - $this->load_original(); - - wp_localize_script( 'um_scripts', 'um_scripts', array( - 'ajaxurl' => admin_url( 'admin-ajax.php' ), - 'fileupload' => um_url . 'core/lib/upload/um-file-upload.php', - 'imageupload' => um_url . 'core/lib/upload/um-image-upload.php' - ) ); - - } else { - - wp_register_script('um_minified', um_url . 'assets/js/um.min.js', array('jquery', 'jquery-masonry'), ultimatemember_version, true ); - wp_enqueue_script('um_minified'); - - wp_localize_script( 'um_minified', 'um_scripts', array( - 'ajaxurl' => admin_url( 'admin-ajax.php' ), - 'fileupload' => um_url . 'core/lib/upload/um-file-upload.php', - 'imageupload' => um_url . 'core/lib/upload/um-image-upload.php' - ) ); - - wp_register_style('um_minified', um_url . 'assets/css/um.min.css', '', ultimatemember_version, 'all' ); - wp_enqueue_style('um_minified'); - - } - - // rtl style - if ( is_rtl() ) { - wp_register_style('um_rtl', um_url . 'assets/css/um.rtl.css', '', ultimatemember_version, 'all' ); - wp_enqueue_style('um_rtl'); - } - - // load a localized version for date/time - $locale = get_locale(); - if ( $locale && file_exists( um_path . 'assets/js/pickadate/translations/' . $locale . '.js' ) ) { - wp_register_script('um_datetime_locale', um_url . 'assets/js/pickadate/translations/' . $locale . '.js', '', ultimatemember_version, true ); - wp_enqueue_script('um_datetime_locale'); - } - - if(is_object($post) && has_shortcode($post->post_content,'ultimatemember' )) { - wp_dequeue_script('jquery-form'); - } - } - - /*** - *** @This will load original files (not minified) - ***/ - function load_original() { - - $this->load_google_charts(); - - $this->load_fonticons(); - - $this->load_selectjs(); - - $this->load_modal(); - - $this->load_css(); - - $this->load_fileupload(); - - $this->load_datetimepicker(); - - $this->load_raty(); - - $this->load_scrollto(); - - $this->load_scrollbar(); - - $this->load_imagecrop(); - - $this->load_tipsy(); - - $this->load_functions(); - - $this->load_responsive(); - - $this->load_customjs(); - - } - - /*** - *** @Include Google charts - ***/ - function load_google_charts(){ - - wp_register_script('um_gchart', 'https://www.google.com/jsapi' ); - wp_enqueue_script('um_gchart'); - - } - - /*** - *** @Load plugin css - ***/ - function load_css(){ - - wp_register_style('um_styles', um_url . 'assets/css/um-styles.css' ); - wp_enqueue_style('um_styles'); - - wp_register_style('um_members', um_url . 'assets/css/um-members.css' ); - wp_enqueue_style('um_members'); - - wp_register_style('um_profile', um_url . 'assets/css/um-profile.css' ); - wp_enqueue_style('um_profile'); - - wp_register_style('um_account', um_url . 'assets/css/um-account.css' ); - wp_enqueue_style('um_account'); - - wp_register_style('um_misc', um_url . 'assets/css/um-misc.css' ); - wp_enqueue_style('um_misc'); - - } - - /*** - *** @Load select-dropdowns JS - ***/ - function load_selectjs(){ - - if ( class_exists( 'WooCommerce' ) ) { - wp_dequeue_style( 'select2' ); - wp_deregister_style( 'select2' ); - - wp_dequeue_script( 'select2'); - wp_deregister_script('select2'); - } - - wp_register_script('select2', um_url . 'assets/js/select2/select2.full.min.js', array('jquery', 'jquery-masonry') ); - wp_enqueue_script('select2'); - - wp_register_style('select2', um_url . 'assets/css/select2/select2.min.css' ); - wp_enqueue_style('select2'); - - } - - /*** - *** @Load Fonticons - ***/ - function load_fonticons(){ - - wp_register_style('um_fonticons_ii', um_url . 'assets/css/um-fonticons-ii.css' ); - wp_enqueue_style('um_fonticons_ii'); - - wp_register_style('um_fonticons_fa', um_url . 'assets/css/um-fonticons-fa.css' ); - wp_enqueue_style('um_fonticons_fa'); - - } - - /*** - *** @Load fileupload JS - ***/ - function load_fileupload() { - - wp_register_script('um_jquery_form', um_url . 'assets/js/um-jquery-form.js' ); - wp_enqueue_script('um_jquery_form'); - - wp_register_script('um_fileupload', um_url . 'assets/js/um-fileupload.js' ); - wp_enqueue_script('um_fileupload'); - - wp_register_style('um_fileupload', um_url . 'assets/css/um-fileupload.css' ); - wp_enqueue_style('um_fileupload'); - - } - - /*** - *** @Load JS functions - ***/ - function load_functions(){ - - wp_register_script('um_functions', um_url . 'assets/js/um-functions.js' ); - wp_enqueue_script('um_functions'); - - } - - /*** - *** @Load custom JS - ***/ - function load_customjs(){ - - wp_register_script('um_conditional', um_url . 'assets/js/um-conditional.js' ); - wp_enqueue_script('um_conditional'); - - wp_register_script('um_scripts', um_url . 'assets/js/um-scripts.js' ); - wp_enqueue_script('um_scripts'); - - wp_register_script('um_members', um_url . 'assets/js/um-members.js' ); - wp_enqueue_script('um_members'); - - wp_register_script('um_profile', um_url . 'assets/js/um-profile.js' ); - wp_enqueue_script('um_profile'); - - wp_register_script('um_account', um_url . 'assets/js/um-account.js' ); - wp_enqueue_script('um_account'); - - } - - /*** - *** @Load date & time picker - ***/ - function load_datetimepicker(){ - - wp_register_script('um_datetime', um_url . 'assets/js/pickadate/picker.js' ); - wp_enqueue_script('um_datetime'); - - wp_register_script('um_datetime_date', um_url . 'assets/js/pickadate/picker.date.js' ); - wp_enqueue_script('um_datetime_date'); - - wp_register_script('um_datetime_time', um_url . 'assets/js/pickadate/picker.time.js' ); - wp_enqueue_script('um_datetime_time'); - - wp_register_script('um_datetime_legacy', um_url . 'assets/js/pickadate/legacy.js' ); - wp_enqueue_script('um_datetime_legacy'); - - wp_register_style('um_datetime', um_url . 'assets/css/pickadate/default.css' ); - wp_enqueue_style('um_datetime'); - - wp_register_style('um_datetime_date', um_url . 'assets/css/pickadate/default.date.css' ); - wp_enqueue_style('um_datetime_date'); - - wp_register_style('um_datetime_time', um_url . 'assets/css/pickadate/default.time.css' ); - wp_enqueue_style('um_datetime_time'); - - } - - /*** - *** @Load scrollto - ***/ - function load_scrollto(){ - - wp_register_script('um_scrollto', um_url . 'assets/js/um-scrollto.js' ); - wp_enqueue_script('um_scrollto'); - - } - - /*** - *** @Load scrollbar - ***/ - function load_scrollbar(){ - - wp_register_script('um_scrollbar', um_url . 'assets/js/um-scrollbar.js' ); - wp_enqueue_script('um_scrollbar'); - - wp_register_style('um_scrollbar', um_url . 'assets/css/um-scrollbar.css' ); - wp_enqueue_style('um_scrollbar'); - - } - - /*** - *** @Load rating - ***/ - function load_raty(){ - - wp_register_script('um_raty', um_url . 'assets/js/um-raty.js' ); - wp_enqueue_script('um_raty'); - - wp_register_style('um_raty', um_url . 'assets/css/um-raty.css' ); - wp_enqueue_style('um_raty'); - - } - - /*** - *** @Load crop script - ***/ - function load_imagecrop(){ - - wp_register_script('um_crop', um_url . 'assets/js/um-crop.js' ); - wp_enqueue_script('um_crop'); - - wp_register_style('um_crop', um_url . 'assets/css/um-crop.css' ); - wp_enqueue_style('um_crop'); - - } - - /*** - *** @Load tipsy - ***/ - function load_tipsy(){ - - wp_register_script('um_tipsy', um_url . 'assets/js/um-tipsy.js' ); - wp_enqueue_script('um_tipsy'); - - wp_register_style('um_tipsy', um_url . 'assets/css/um-tipsy.css' ); - wp_enqueue_style('um_tipsy'); - - } - - /*** - *** @Load modal - ***/ - function load_modal(){ - - wp_register_style('um_modal', um_url . 'assets/css/um-modal.css' ); - wp_enqueue_style('um_modal'); - - wp_register_script('um_modal', um_url . 'assets/js/um-modal.js' ); - wp_enqueue_script('um_modal'); - - } - - /*** - *** @Load responsive styles - ***/ - function load_responsive(){ - - wp_register_script('um_responsive', um_url . 'assets/js/um-responsive.js' ); - wp_enqueue_script('um_responsive'); - - wp_register_style('um_responsive', um_url . 'assets/css/um-responsive.css' ); - wp_enqueue_style('um_responsive'); - - } - -} diff --git a/core/um-fields.php b/core/um-fields.php deleted file mode 100644 index d8ddfd30..00000000 --- a/core/um-fields.php +++ /dev/null @@ -1,2910 +0,0 @@ -editing = false; - $this->viewing = false; - $this->timestamp = current_time('timestamp'); - - } - - /** - * Standard checkbox field - * @param integer $id - * @param string $title - */ - function checkbox( $id, $title ) { - ?> - -
            -
            - -
            -
            - - builtin->all_user_fields; - foreach( $fields as $field => $args ) { - if ( isset( $args['advanced'] ) && $args['advanced'] == 'social' ) { - $social[$field] = $args; - } - } - foreach( $social as $k => $arr ) { - if ( um_profile( $k ) ) { ?> - - - - '; - - $fields = $ultimatemember->builtin->get_specific_fields( $field ); - - $output = null; - - foreach( $fields as $key => $data ) { - $output .= $ultimatemember->fields->edit_field( $key, $data ); - } - - echo $output; - - echo '
            '; - } - - /** - * Get hidden field - * @param string $key - * @param string $value - * @return string - */ - function disabled_hidden_field( $key, $value ){ - - return ''; - } - - - /** - * Updates a field globally - * @param integer $id - * @param array $args - */ - function globally_update_field( $id, $args ){ - global $ultimatemember; - $fields = $ultimatemember->builtin->saved_fields; - - $fields[$id] = $args; - - unset( $fields[ $id ]['in_row'] ); - unset( $fields[ $id ]['in_sub_row'] ); - unset( $fields[ $id ]['in_column'] ); - unset( $fields[ $id ]['in_group'] ); - unset( $fields[ $id ]['position'] ); - - update_option('um_fields', $fields ); - } - - - /** - * Updates a field in form only - * @param integer $id - * @param array $args - * @param integer $form_id - */ - function update_field($id, $args, $form_id){ - global $ultimatemember; - $fields = $ultimatemember->query->get_attr( 'custom_fields', $form_id ); - - if ( $args['type'] == 'row' ) { - if ( isset( $fields[$id] ) ){ - $old_args = $fields[$id]; - foreach( $old_args as $k => $v ) { - if (!in_array($k, array('sub_rows','cols')) ) { - unset($old_args[$k]); - } - } - $args = array_merge( $old_args, $args ); - } - } - - // custom fields support - if ( isset( $ultimatemember->builtin->predefined_fields[$id] ) && isset( $ultimatemember->builtin->predefined_fields[$id]['custom'] ) ) { - $args = array_merge( $ultimatemember->builtin->predefined_fields[$id], $args); - } - - $fields[$id] = $args; - - // for group field only - if ( $args['type'] == 'group' ){ - $fields[$id]['in_group'] = ''; - } - - $ultimatemember->query->update_attr( 'custom_fields', $form_id, $fields ); - } - - - /** - * Deletes a field in form only - * @param integer $id - * @param integer $form_id - */ - function delete_field_from_form( $id, $form_id ) { - global $ultimatemember; - $fields = $ultimatemember->query->get_attr( 'custom_fields', $form_id ); - if ( isset( $fields[ $id ] ) ) { - unset( $fields[ $id ] ); - $ultimatemember->query->update_attr( 'custom_fields', $form_id, $fields ); - } - } - - - /** - * Deletes a field from custom fields - * @param integer $id - */ - function delete_field_from_db( $id ) { - global $ultimatemember; - $fields = $ultimatemember->builtin->saved_fields; - if ( isset( $fields[$id] ) ){ - unset( $fields[$id] ); - update_option('um_fields', $fields ); - } - } - - /** - * Quickly adds a field from custom fields - * @param integer $global_id - * @param integer $form_id - * @param array $position - */ - function add_field_from_list( $global_id, $form_id, $position = array() ) { - global $ultimatemember; - $fields = $ultimatemember->query->get_attr( 'custom_fields', $form_id ); - $field_scope = $ultimatemember->builtin->saved_fields; - - if ( !isset( $fields[ $global_id ] ) ) { - - $count = 1; - if ( isset( $fields ) && !empty( $fields ) ) $count = count( $fields ) + 1; - - $fields[ $global_id ] = $field_scope[ $global_id ]; - $fields[ $global_id ]['position'] = $count; - - // set position - if ( $position ) { - foreach( $position as $key => $val ) { - $fields[ $global_id ][ $key ] = $val; - } - } - - // add field to form - $ultimatemember->query->update_attr( 'custom_fields', $form_id, $fields ); - - } - } - - /** - * Quickly adds a field from pre-defined fields - * @param integer $global_id - * @param integer $form_id - * @param array $position - */ - function add_field_from_predefined( $global_id, $form_id, $position = array() ) { - global $ultimatemember; - - $fields = $ultimatemember->query->get_attr( 'custom_fields', $form_id ); - $field_scope = $ultimatemember->builtin->predefined_fields; - - if ( !isset( $fields[ $global_id ] ) ) { - - $count = 1; - if ( isset( $fields ) && !empty( $fields) ) $count = count( $fields ) + 1; - - $fields[ $global_id ] = $field_scope[ $global_id ]; - $fields[ $global_id ]['position'] = $count; - - // set position - if ( $position ) { - foreach( $position as $key => $val ) { - $fields[ $global_id ][ $key ] = $val; - } - } - - // add field to form - $ultimatemember->query->update_attr( 'custom_fields', $form_id, $fields ); - - // add field to db - //$this->globally_update_field( $global_id, $fields[$global_id] ); - - } - } - - /** - * Duplicates a frield by meta key - * @param integer $id - * @param integer $form_id - */ - function duplicate_field( $id, $form_id ) { - global $ultimatemember; - $fields = $ultimatemember->query->get_attr( 'custom_fields', $form_id ); - $all_fields = $ultimatemember->builtin->saved_fields; - - $inc = count( $fields ) + 1; - - $duplicate = $fields[ $id ]; - - $new_metakey = $id . "_" . $inc; - $new_title = $fields[ $id ]['title'] . " #" . $inc; - $new_position = $inc; - - $duplicate['title'] = $new_title; - $duplicate['metakey'] = $new_metakey; - $duplicate['position'] = $new_position; - - $fields[ $new_metakey ] = $duplicate; - $all_fields[ $new_metakey ] = $duplicate; - - // not global attributes - unset( $all_fields[ $new_metakey ]['in_row'] ); - unset( $all_fields[ $new_metakey ]['in_sub_row'] ); - unset( $all_fields[ $new_metakey ]['in_column'] ); - unset( $all_fields[ $new_metakey ]['in_group'] ); - unset( $all_fields[ $new_metakey ]['position'] ); - - $ultimatemember->query->update_attr( 'custom_fields', $form_id, $fields ); - update_option('um_fields', $all_fields ); - - } - - /** - * Print field error - * @param string $text - * @param boolean $force_show - */ - function field_error($text, $force_show = false ) { - global $ultimatemember; - if ( $force_show ) { - $output = '
            '.$text.'
            '; - return $output; - } - if ( isset( $this->set_id ) && $ultimatemember->form->processing == $this->set_id ) { - $output = '
            '.$text.'
            '; - } else { - $output = ''; - } - - if ( !$ultimatemember->form->processing ) { - $output = '
            '.$text.'
            '; - } - return $output; - } - - /** - * Checks if field has a server-side error - * @param string $key - * @return boolean - */ - function is_error($key) { - global $ultimatemember; - return $ultimatemember->form->has_error($key); - } - - /** - * Returns field error - * @param string $key - * @return string - */ - function show_error($key) { - global $ultimatemember; - return $ultimatemember->form->errors[$key]; - } - - /** - * Display field label - * @param string $label - * @param string $key - * @param data $data - * @return string - */ - function field_label( $label, $key, $data ) { - global $ultimatemember; - $output = null; - $output .= '
            '; - - if ( isset($data['icon']) && $data['icon'] != '' && isset( $this->field_icons ) && $this->field_icons != 'off' && ( $this->field_icons == 'label' || $this->viewing == true ) ) { - $output .= '
            '; - } - - if ( $this->viewing == true ) { - $label = apply_filters("um_view_label_{$key}", $label ); - } else { - $label = apply_filters("um_edit_label_{$key}", $label ); - $label = apply_filters("um_edit_label_all_fields", $label, $data ); - } - - $output .= ''; - - if ( isset( $data['help'] ) && !empty( $data['help'] ) && $this->viewing == false && !strstr($key, 'confirm_user_pass') ) { - - if ( !$ultimatemember->mobile->isMobile() ) { - if ( !isset( $this->disable_tooltips ) ) { - $output .= ''; - } - } - - if ( $ultimatemember->mobile->isMobile() || isset( $this->disable_tooltips ) ) { - $output .= ''.__( $data['help'], UM_TEXTDOMAIN ). ''; - } - - } - - $output .= '
            '; - - return $output; - } - - - /** - * Output field classes - * @param string $key - * @param array $data - * @param string $add - * @return string - */ - function get_class($key, $data, $add = null) { - $classes = null; - - $classes .= 'um-form-field '; - - if ( $this->is_error($key) ) { - $classes .= 'um-error '; - } else { - $classes .= 'valid '; - } - - if ( !isset($data['required']) ) { - $classes .= 'not-required '; - } - - if ( $data['type'] == 'date' ) { - $classes .= 'um-datepicker '; - } - - if ( $data['type'] == 'time' ) { - $classes .= 'um-timepicker '; - } - - if ( isset($data['icon']) && $data['icon'] && isset( $this->field_icons ) && $this->field_icons == 'field' ) { - $classes .= 'um-iconed '; - } - - if ($add) { - $classes .= $add . ' '; - } - - return $classes; - } - - - /** - * Gets field value - * @param string $key - * @param boolean $default - * @param array $data - * @return mixed - */ - function field_value( $key, $default = false, $data = null ) { - global $ultimatemember; - - - if ( isset( $_SESSION ) && isset( $_SESSION['um_social_profile'][ $key ] ) && isset( $this->set_mode ) && $this->set_mode == 'register' ) - return $_SESSION['um_social_profile'][ $key ]; - - $type = ( isset( $data['type'] ) ) ? $data['type'] : ''; - - // preview in backend - if ( isset( $ultimatemember->user->preview ) && $ultimatemember->user->preview ) { - $submitted = um_user('submitted'); - if ( isset( $submitted[ $key ] ) && ! empty( $submitted[ $key ] ) ) { - return $submitted[ $key ]; - } else { - return 'Undefined'; - } - } - - // normal state - if ( isset( $ultimatemember->form->post_form[ $key ] ) ) { - - if ( strstr( $key, 'user_pass' ) && $this->set_mode != 'password' ) return ''; - - return stripslashes_deep( $ultimatemember->form->post_form[ $key ] ); - - } else if ( um_user( $key ) && $this->editing == true ) { - - if ( strstr( $key, 'user_pass' ) ) return ''; - $value = um_user( $key ); - $value = apply_filters( "um_edit_{$key}_field_value", $value, $key ); - $value = apply_filters( "um_edit_{$type}_field_value", $value, $key ); - - return $value; - - } else if ( ( um_user( $key ) || isset( $data['show_anyway'] ) ) && $this->viewing == true ) { - - $value = um_filtered_value( $key, $data ); - return $value; - - } else if ( $default ) { - - $default = apply_filters( "um_field_default_value", $default, $data, $type ); - $default = apply_filters( "um_field_{$key}_default_value", $default, $data ); - $default = apply_filters( "um_field_{$type}_default_value", $default, $data ); - - return $default; - - } else if ( $this->editing == true ) { - - return apply_filters( "um_edit_{$key}_field_value", '', $key); - - } - - return ''; - } - - - /** - * Checks if an option is selected - * @param string $key - * @param string $value - * @param array $data - * @return boolean - */ - function is_selected($key, $value, $data){ - global $ultimatemember; - - $key = apply_filters('um_is_selected_filter_key', $key ); - - if ( isset( $ultimatemember->form->post_form[ $key ] ) && is_array( $ultimatemember->form->post_form[ $key ] ) ) { - - if ( in_array( $value, $ultimatemember->form->post_form[ $key ] ) ){ - return true; - } - - if ( in_array( html_entity_decode( $value ), $ultimatemember->form->post_form[ $key ] ) ){ - return true; - } - - } else { - - if ( !isset( $ultimatemember->form->post_form ) ) { - - $field_value = um_user( $key ); - $field_value = apply_filters('um_is_selected_filter_value', $field_value, $key ); - $data = apply_filters('um_is_selected_filter_data', $data, $key, $field_value ); - - if ( $field_value && $this->editing == true && is_array( $field_value ) && ( in_array( $value, $field_value ) || in_array( html_entity_decode( $value ), $field_value ) ) ) { - return true; - } - - if ( $field_value && $this->editing == true && !is_array( $field_value ) && $field_value == $value ) { - return true; - } - - if ( $field_value && $this->editing == true && !is_array( $field_value ) && html_entity_decode( $field_value ) == html_entity_decode( $value ) ) { - return true; - } - - if ( strstr( $data['default'], ', ') ) { - $data['default'] = explode(', ', $data['default']); - } - - if ( isset( $data['default'] ) && !is_array( $data['default'] ) && $data['default'] == $value ) { - return true; - } - - if ( isset( $data['default'] ) && is_array( $data['default'] ) && in_array( $value, $data['default'] ) ){ - return true; - } - - } else { - - if ( isset( $ultimatemember->form->post_form[ $key ] ) && $value == $ultimatemember->form->post_form[ $key ] ) { - return true; - } - - - - } - - } - - return false; - } - - - /** - * Checks if a radio button is selected - * @param string $key - * @param string $value - * @param array $data - * @return boolean - */ - function is_radio_checked($key, $value, $data){ - global $ultimatemember; - - if ( isset( $ultimatemember->form->post_form[$key] ) && is_array( $ultimatemember->form->post_form[$key] ) ) { - - if ( in_array( $value, $ultimatemember->form->post_form[$key] ) ){ - return true; - } - - } else { - - if ( !isset( $ultimatemember->form->post_form ) ) { - - if ( um_user( $key ) && $this->editing == true ) { - - if ( strstr($key, 'role_') ) { - $key = 'role'; - } - - $um_user_value = um_user( $key ); - - if( $key == 'role' ){ - $um_user_value = strtolower( $um_user_value ); - } - - if ( $um_user_value == $value ) { - return true; - } - - if ( is_array( $um_user_value ) && in_array( $value, $um_user_value ) ) { - return true; - } - - if ( is_array( $um_user_value ) ){ - foreach( $um_user_value as $u) { - if( $u == html_entity_decode( $value ) ){ - return true; - } - } - } - - - } else { - - if ( isset($data['default']) && $data['default'] == $value ) { - return true; - } - - } - - } else { - - if ( isset( $ultimatemember->form->post_form[$key] ) && $value == $ultimatemember->form->post_form[$key] ) { - return true; - } - - } - - } - - return false; - } - - - /** - * Get field icon - * @param string $key - * @return string - */ - function get_field_icon( $key ) { - global $ultimatemember; - $fields = $ultimatemember->builtin->all_user_fields; - if ( isset( $fields[$key]['icon'] ) ) - return $fields[$key]['icon']; - return ''; - } - - - /** - * Gets selected option value from a callback function - * @param string $value - * @param array $data - * @param string $type - * @return json - */ - function get_option_value_from_callback( $value, $data, $type ){ - - global $ultimatemember; - - if( in_array( $type , array('select','multiselect') ) && isset( $data['custom_dropdown_options_source'] ) && ! empty( $data['custom_dropdown_options_source'] ) ){ - - if( function_exists( $data['custom_dropdown_options_source'] ) ){ - - $arr_options = call_user_func( $data['custom_dropdown_options_source'] ); - - if( $type == 'select' ){ - if( isset( $arr_options[ $value ] ) && ! empty( $arr_options[ $value ] ) ) { - return $arr_options[ $value ]; - }else if( isset( $data['default'] ) && ! empty( $data['default'] ) && empty( $arr_options[ $value ] ) ) { - return $arr_options[ $data['default'] ]; - }else{ - return ''; - } - } - - if( $type == 'multiselect' ){ - - if( is_array( $value ) ){ - $values = $value; - }else{ - $values = explode(', ', $value ); - } - - $arr_paired_options = array(); - - foreach ( $values as $option ) { - if( isset( $arr_options[ $option ] ) ){ - $arr_paired_options[] = $arr_options[ $option ]; - } - } - - return implode( ', ' , $arr_paired_options ); - } - - } - - - } - - return $value; - } - - /** - * Get select options from a callback function - * @param array $data - * @param string $type - * @return array $arr_options - */ - function get_options_from_callback( $data, $type ){ - - - if( in_array( $type , array('select','multiselect') ) && isset( $data['custom_dropdown_options_source'] ) && ! empty( $data['custom_dropdown_options_source'] ) ){ - - if( function_exists( $data['custom_dropdown_options_source'] ) ){ - - $arr_options = call_user_func( $data['custom_dropdown_options_source'] ); - - } - - - } - - return $arr_options; - } - - /** - * Get field type - * @param string $key - * @return string - */ - function get_field_type( $key ) { - global $ultimatemember; - $fields = $ultimatemember->builtin->all_user_fields; - if ( isset( $fields[$key]['type'] ) ) - return $fields[$key]['type']; - return ''; - } - - /** - * Get field label - * @param string $key - * @return string - */ - function get_label( $key ) { - global $ultimatemember; - $fields = $ultimatemember->builtin->all_user_fields; - if ( isset( $fields[$key]['label'] ) ) - return $fields[$key]['label']; - if ( isset( $fields[$key]['title'] ) ) - return $fields[$key]['title']; - return ''; - } - - - /** - * Get field title - * @param string $key - * @return string - */ - function get_field_title( $key ) { - global $ultimatemember; - $fields = $ultimatemember->builtin->all_user_fields; - if ( isset( $fields[$key]['title'] ) ) - return $fields[$key]['title']; - if ( isset( $fields[$key]['label'] ) ) - return $fields[$key]['label']; - return __('Custom Field','ultimate-member'); - } - - /** - * Get form fields - * @return array - */ - function get_fields() { - $this->fields = array(); - $this->fields = apply_filters("um_get_form_fields", $this->fields ); - return $this->fields; - } - - - /** - * Get specific field - * @param string $key - * @return array - */ - function get_field( $key ) { - global $ultimatemember; - - $fields = $this->get_fields(); - - if ( isset( $fields ) && is_array( $fields ) && isset( $fields[$key] ) ) { - $array = $fields[$key]; - } else { - if ( !isset( $ultimatemember->builtin->predefined_fields[$key] ) && !isset( $ultimatemember->builtin->all_user_fields[$key] ) ) { - return ''; - } - $array = (isset( $ultimatemember->builtin->predefined_fields[$key] ) ) ? $ultimatemember->builtin->predefined_fields[$key] : $ultimatemember->builtin->all_user_fields[$key]; - } - - $array['classes'] = null; - - if (!isset($array['placeholder'])) $array['placeholder'] = null; - if (!isset($array['required'])) $array['required'] = null; - if (!isset($array['validate'])) $array['validate'] = null; - if (!isset($array['default'])) $array['default'] = null; - - if ( isset( $array['conditions'] ) && is_array( $array['conditions'] ) && !$this->viewing ) { - $array['conditional'] = ''; - - foreach( $array['conditions'] as $cond_id => $cond ) { - $array['conditional'] .= ' data-cond-'.$cond_id.'-action="'. $cond[0] . '" data-cond-'.$cond_id.'-field="'. $cond[1] . '" data-cond-'.$cond_id.'-operator="'. $cond[2] . '" data-cond-'.$cond_id.'-value="'. $cond[3] . '"'; - } - - $array['classes'] .= ' um-is-conditional'; - - } else { - $array['conditional'] = null; - } - - $array['classes'] .= ' um-field-' . $key; - $array['classes'] .= ' um-field-' . $array['type']; - $array['classes'] .= ' um-field-type_' . $array['type']; - - switch( $array['type'] ) { - - case 'googlemap': - case 'youtube_video': - case 'vimeo_video': - case 'soundcloud_track': - $array['disabled'] = ''; - $array['input'] = 'text'; - break; - - case 'text': - - $array['disabled'] = ''; - - if ( $key == 'user_login' && isset( $this->set_mode ) && $this->set_mode == 'account' ) { - $array['disabled'] = 'disabled="disabled"'; - } - - $array['input'] = 'text'; - - break; - - case 'password': - - $array['input'] = 'password'; - - break; - - case 'number': - - $array['disabled'] = ''; - - break; - - case 'url': - - $array['input'] = 'text'; - - break; - - case 'date': - - $array['input'] = 'text'; - - if ( !isset( $array['format'] ) ) $array['format'] = 'j M Y'; - - switch( $array['format'] ) { - case 'j M Y': - $js_format = 'd mmm yyyy'; - break; - case 'j F Y': - $js_format = 'd mmmm yyyy'; - break; - case 'M j Y': - $js_format = 'mmm d yyyy'; - break; - case 'F j Y': - $js_format = 'mmmm d yyyy'; - break; - } - - $array['js_format'] = $js_format; - - if ( !isset( $array['range'] ) ) $array['range'] = 'years'; - if ( !isset( $array['years'] ) ) $array['years'] = 100; - if ( !isset( $array['years_x'] ) ) $array['years_x'] = 'past'; - if ( !isset( $array['disabled_weekdays'] ) ) $array['disabled_weekdays'] = ''; - - if ( !empty( $array['disabled_weekdays'] ) ) { - $array['disabled_weekdays'] = '[' . implode(',',$array['disabled_weekdays']) . ']'; - } - - // When date range is strictly defined - if ( $array['range'] == 'date_range' ) { - - $array['date_min'] = str_replace('/',',',$array['range_start']); - $array['date_max'] = str_replace('/',',',$array['range_end']); - - } else { - - if ( $array['years_x'] == 'past' ) { - - $date = new DateTime( date('Y-n-d') ); - $past = $date->modify('-'.$array['years'].' years'); - $past = $date->format('Y,n,d'); - - $array['date_min'] = $past; - $array['date_max'] = date('Y,n,d'); - - } else if ( $array['years_x'] == 'future' ) { - - $date = new DateTime( date('Y-n-d') ); - $future = $date->modify('+'.$array['years'].' years'); - $future = $date->format('Y,n,d'); - - $array['date_min'] = date('Y,n,d'); - $array['date_max'] = $future; - - } else { - - $date = new DateTime( date('Y-n-d') ); - $date_f = new DateTime( date('Y-n-d') ); - $past = $date->modify('-'. ( $array['years'] / 2 ).' years'); - $past = $date->format('Y,n,d'); - $future = $date_f->modify('+'. ( $array['years'] / 2 ).' years'); - $future = $date_f->format('Y,n,d'); - - $array['date_min'] = $past; - $array['date_max'] = $future; - - } - - } - - break; - - case 'time': - - $array['input'] = 'text'; - - if ( !isset( $array['format'] ) ) $array['format'] = 'g:i a'; - - switch( $array['format'] ) { - case 'g:i a': - $js_format = 'h:i a'; - break; - case 'g:i A': - $js_format = 'h:i A'; - break; - case 'H:i': - $js_format = 'HH:i'; - break; - } - - $array['js_format'] = $js_format; - - if ( !isset( $array['intervals'] ) ) $array['intervals'] = 60; - - break; - - case 'textarea': - - if (!isset($array['height'])) $array['height'] = '100px'; - - break; - - case 'rating': - - if (!isset($array['number'])) $array['number'] = 5; - - break; - - case 'spacing': - - if ( !isset($array['spacing'])){ - $array['spacing'] = '20px'; - } - - break; - - case 'divider': - - if (isset($array['width'])){ - $array['borderwidth'] = $array['width']; - } else { - $array['borderwidth'] = 4; - } - - if (isset($array['color'])){ - $array['bordercolor'] = $array['color']; - } else { - $array['bordercolor'] = '#eee'; - } - - if (isset($array['style'])){ - $array['borderstyle'] = $array['style']; - } else { - $array['borderstyle'] = 'solid'; - } - - if ( !isset( $array['divider_text'] ) ) { - $array['divider_text'] = ''; - } - - break; - - case 'image': - - if ( !isset( $array['crop'] ) ) $array['crop'] = 0; - - if ( $array['crop'] == 0 ) { - $array['crop_data'] = 0; - } else if ( $array['crop'] == 1 ) { - $array['crop_data'] = 'square'; - } else if ( $array['crop'] == 2 ) { - $array['crop_data'] = 'cover'; - } else { - $array['crop_data'] = 'user'; - } - - if ( !isset( $array['modal_size'] ) ) $array['modal_size'] = 'normal'; - - if ( $array['crop'] > 0 ) { - $array['crop_class'] = 'crop'; - } else { - $array['crop_class'] = ''; - } - - if ( !isset( $array['ratio'] ) ) $array['ratio'] = 1.0; - - if ( !isset( $array['min_width'] ) ) $array['min_width'] = ''; - if ( !isset( $array['min_height'] ) ) $array['min_height'] = ''; - - if ( $array['min_width'] == '' && $array['crop'] == 1 ) $array['min_width'] = 600; - if ( $array['min_height'] == '' && $array['crop'] == 1 ) $array['min_height'] = 600; - - if ( $array['min_width'] == '' && $array['crop'] == 3 ) $array['min_width'] = 600; - if ( $array['min_height'] == '' && $array['crop'] == 3 ) $array['min_height'] = 600; - - if (!isset($array['invalid_image'])) $array['invalid_image'] = __("Please upload a valid image!",'ultimate-member'); - if (!isset($array['allowed_types'])) { - $array['allowed_types'] = "gif,jpg,jpeg,png"; - } else { - $array['allowed_types'] = implode(',',$array['allowed_types']); - } - if (!isset($array['upload_text'])) $array['upload_text'] = ''; - if (!isset($array['button_text'])) $array['button_text'] = __('Upload','ultimate-member'); - if (!isset($array['extension_error'])) $array['extension_error'] = __("Sorry this is not a valid image.",'ultimate-member'); - if (!isset($array['max_size_error'])) $array['max_size_error'] = __("This image is too large!",'ultimate-member'); - if (!isset($array['min_size_error'])) $array['min_size_error'] = __("This image is too small!",'ultimate-member'); - if (!isset($array['max_files_error'])) $array['max_files_error'] = __("You can only upload one image",'ultimate-member'); - if (!isset($array['max_size'])) $array['max_size'] = 999999999; - if (!isset($array['upload_help_text'])) $array['upload_help_text'] = ''; - if (!isset($array['icon']) ) $array['icon'] = ''; - - break; - - case 'file': - - if ( !isset( $array['modal_size'] ) ) $array['modal_size'] = 'normal'; - - if (!isset($array['allowed_types'])) { - $array['allowed_types'] = "pdf,txt"; - } else { - $array['allowed_types'] = implode(',',$array['allowed_types']); - } - if (!isset($array['upload_text'])) $array['upload_text'] = ''; - if (!isset($array['button_text'])) $array['button_text'] = __('Upload','ultimate-member'); - if (!isset($array['extension_error'])) $array['extension_error'] = __("Sorry this is not a valid file.",'ultimate-member'); - if (!isset($array['max_size_error'])) $array['max_size_error'] = __("This file is too large!",'ultimate-member'); - if (!isset($array['min_size_error'])) $array['min_size_error'] = __("This file is too small!",'ultimate-member'); - if (!isset($array['max_files_error'])) $array['max_files_error'] = __("You can only upload one file",'ultimate-member'); - if (!isset($array['max_size'])) $array['max_size'] = 999999999; - if (!isset($array['upload_help_text'])) $array['upload_help_text'] = ''; - if (!isset($array['icon']) ) $array['icon'] = ''; - - break; - - case 'select': - - break; - - case 'multiselect': - - break; - - case 'group': - - if ( !isset( $array['max_entries'] ) ) $array['max_entries'] = 0; - - break; - - } - - if ( !isset( $array['visibility'] ) ) $array['visibility'] = 'all'; - - $array = apply_filters("um_get_field__{$key}", $array ); - - - return $array; - } - - /** - * Gets a field in 'input mode' - * @param string $key - * @param array $data - * @param boolean $rule - * @return string - */ - function edit_field( $key, $data, $rule=false ) { - global $ultimatemember; - - $output = null; - $disabled = ''; - - // get whole field data - if ( isset( $data ) && is_array( $data ) ) { - $data = $this->get_field($key); - if( is_array( $data ) ){ - extract($data); - } - } - - if ( !isset( $data['type'] ) ) return; - - if ( isset( $data['in_group'] ) && $data['in_group'] != '' && $rule != 'group' ) return; - - if ( $visibility == 'view' && $this->set_mode != 'register' ) return; - - if ( ( $visibility == 'view' && $this->set_mode == 'register' ) || - ( isset( $data['editable'] ) && $data['editable'] == 0 && $this->set_mode == 'profile' ) ){ - - if( ! um_user_can('can_edit_everyone') ){ - $disabled = ' disabled="disabled" '; - } - - if ( isset( $data['public'] ) && $data['public'] == '-2' && $data['roles'] ){ - if ( in_array( $ultimatemember->query->get_role_by_userid( get_current_user_id() ), $data['roles'] ) ){ - $disabled = ''; - } - } - - } - - if( ! isset( $data['autocomplete'] ) ){ - $autocomplete = 'off'; - } - - - if ( !um_can_view_field( $data ) ) return; - if ( !um_can_edit_field( $data ) ) return; - - - // fields that need to be disabled in edit mode (profile) - $arr_restricted_fields = array('user_email','username','user_login','user_password'); - - if( um_get_option('editable_primary_email_in_profile') == 1 ){ - unset( $arr_restricted_fields[0] ); // remove user_email - } - - if ( in_array( $key, $arr_restricted_fields ) && $this->editing == true && $this->set_mode == 'profile' ) { - return; - } - - // forbidden in edit mode? - if ( isset( $data['edit_forbidden'] ) ) return; - - // required option - if ( isset( $data['required_opt'] ) ) { - $opt = $data['required_opt']; - if ( um_get_option( $opt[0] ) != $opt[1] ) { - return; - } - } - - // required user permission - if ( isset( $data['required_perm'] ) ) { - if ( !um_user( $data['required_perm'] ) ) { - return; - } - } - - // do not show passwords - if ( isset( $ultimatemember->user->preview ) && $ultimatemember->user->preview ) { - if ( $data['type'] == 'password' ){ - return; - } - } - - $type = apply_filters("um_hook_for_field_{$type}", $type ); - - /* Begin by field type */ - switch( $type ) { - - /* Default: Integration */ - default: - $mode = (isset($this->set_mode))?$this->set_mode:'no_mode'; - $output .= apply_filters("um_edit_field_{$mode}_{$type}", $output, $data); - break; - - /* Other fields */ - case 'googlemap': - case 'youtube_video': - case 'vimeo_video': - case 'soundcloud_track': - - $output .= '
            '; - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $output .= '
            '; - - if ( isset($icon) && $icon && isset( $this->field_icons ) && $this->field_icons == 'field' ) { - - $output .= '
            '; - - } - - $field_name = $key.$ultimatemember->form->form_suffix; - $field_value = htmlspecialchars( $this->field_value( $key, $default, $data ) ); - - $output .= ' - -
            '; - - if( ! empty( $disabled ) ){ - $output .= $this->disabled_hidden_field( $field_name, $field_value ); - } - - if ( $this->is_error($key) ) { - $output .= $this->field_error( $this->show_error($key) ); - } - - $output .= '
            '; - break; - - /* Text */ - case 'text': - - $output .= '
            '; - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $output .= '
            '; - - if ( isset($icon) && $icon && isset( $this->field_icons ) && $this->field_icons == 'field' ) { - - $output .= '
            '; - - } - - $field_name = $key.$ultimatemember->form->form_suffix; - $field_value = htmlspecialchars( $this->field_value( $key, $default, $data ) ); - - $output .= ' - -
            '; - - if( ! empty( $disabled ) ){ - $output .= $this->disabled_hidden_field( $field_name, $field_value ); - } - - if ( $this->is_error($key) ) { - $output .= $this->field_error( $this->show_error($key) ); - } - - $output .= '
            '; - break; - - /* Number */ - case 'number': - - $output .= '
            '; - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $output .= '
            '; - - if ( isset($icon) && $icon && isset( $this->field_icons ) && $this->field_icons == 'field' ) { - - $output .= '
            '; - - } - - $number_limit = ''; - - if( isset( $min ) ){ - $number_limit .= " min=\"{$min}\" "; - } - - if( isset( $max ) ){ - $number_limit .= " max=\"{$max}\" "; - } - - $output .= ' - -
            '; - - if ( $this->is_error($key) ) { - $output .= $this->field_error( $this->show_error($key) ); - } - - $output .= '
            '; - break; - - /* Password */ - case 'password': - - $original_key = $key; - - if ( $key == 'single_user_password' ) { - - $key = $original_key; - - $output .= '
            '; - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $output .= '
            '; - - if ( isset($icon) && $icon && $this->field_icons == 'field' ) { - - $output .= '
            '; - - } - - $output .= ' - -
            '; - - if ( $this->is_error($key) ) { - $output .= $this->field_error( $this->show_error($key) ); - } - - $output .= '
            '; - - } else { - - if ( $this->set_mode == 'account' && um_is_core_page('account') ) { - - $key = 'current_' . $original_key; - $output .= '
            '; - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label( __('Current Password','ultimate-member'), $key, $data); - } - - $output .= '
            '; - - if ( isset($icon) && $icon && $this->field_icons == 'field' ) { - - $output .= '
            '; - - } - - $output .= ' - -
            '; - - if ( $this->is_error($key) ) { - $output .= $this->field_error( $this->show_error($key) ); - } - - $output .= '
            '; - - } - - $key = $original_key; - - $output .= '
            '; - - if ( $this->set_mode == 'account' && um_is_core_page('account') || $this->set_mode == 'password' && um_is_core_page('password-reset') ) { - - $output .= $this->field_label( __('New Password','ultimate-member'), $key, $data); - - } else if ( isset( $data['label'] ) ) { - - $output .= $this->field_label($label, $key, $data); - - } - - $output .= '
            '; - - if ( isset($icon) && $icon && $this->field_icons == 'field' ) { - - $output .= '
            '; - - } - - $output .= ' - -
            '; - - if ( $this->is_error($key) ) { - $output .= $this->field_error( $this->show_error($key) ); - } - - $output .= '
            '; - - if ( $this->set_mode != 'login' && isset( $data['force_confirm_pass'] ) && $data['force_confirm_pass'] == 1 ) { - - $key = 'confirm_' . $original_key; - $output .= '
            '; - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label( sprintf(__('Confirm %s','ultimate-member'), $data['label'] ), $key, $data); - } - - $output .= '
            '; - - if ( isset($icon) && $icon && $this->field_icons == 'field' ) { - - $output .= '
            '; - - } - - $output .= ' - -
            '; - - if ( $this->is_error($key) ) { - $output .= $this->field_error( $this->show_error($key) ); - } - - $output .= '
            '; - - } - - } - - break; - - /* URL */ - case 'url': - - $output .= '
            '; - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $output .= '
            '; - - if ( isset($icon) && $icon && isset($this->field_icons) && $this->field_icons == 'field' ) { - - $output .= '
            '; - - } - - $output .= ' - -
            '; - - if ( $this->is_error($key) ) { - $output .= $this->field_error( $this->show_error($key) ); - } - - $output .= '
            '; - break; - - /* Date */ - case 'date': - - $output .= '
            '; - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $output .= '
            '; - - if ( isset($icon) && $icon && isset( $this->field_icons ) && $this->field_icons == 'field' ) { - - $output .= '
            '; - - } - - $output .= ' - -
            '; - - if ( $this->is_error($key) ) { - $output .= $this->field_error( $this->show_error($key) ); - } - - $output .= '
            '; - break; - - /* Time */ - case 'time': - - $output .= '
            '; - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $output .= '
            '; - - if ( isset($icon) && $icon && $this->field_icons == 'field' ) { - - $output .= '
            '; - - } - - $output .= ' - -
            '; - - if ( $this->is_error($key) ) { - $output .= $this->field_error( $this->show_error($key) ); - } - - $output .= '
            '; - break; - - /* Row */ - case 'row': - $output .= ''; - break; - - /* Textarea */ - case 'textarea': - $output .= '
            '; - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $output .= '
            '; - $field_name = $key; - $field_value = $this->field_value( $key, $default, $data ); - - if ( isset( $data['html'] ) && $data['html'] != 0 && $key != "description" ) { - - - $textarea_settings = array( - 'media_buttons' => false, - 'wpautop' => false, - 'editor_class' => $this->get_class($key, $data), - 'editor_height' => $height, - 'tinymce'=> array( - 'toolbar1' => 'formatselect,bullist,numlist,bold,italic,underline,forecolor,blockquote,hr,removeformat,link,unlink,undo,redo', - 'toolbar2' => '', - ) - ); - - if( ! empty( $disabled ) ){ - $textarea_settings['tinymce']['readonly'] = true; - } - - $textarea_settings = apply_filters('um_form_fields_textarea_settings', $textarea_settings ); - - // turn on the output buffer - ob_start(); - - // echo the editor to the buffer - wp_editor( $field_value , $key, $textarea_settings ); - - // add the contents of the buffer to the output variable - $output .= ob_get_clean(); - - } - else $output .= ''; - - $output .= ' -
            '; - - if( ! empty( $disabled ) ){ - $output .= $this->disabled_hidden_field( $field_name, $field_value ); - } - - if ( $this->is_error($key) ) { - $output .= $this->field_error( $this->show_error($key) ); - } - - $output .= '
            '; - break; - - /* Rating */ - case 'rating': - $output .= '
            '; - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $output .= '
            '; - - $output .= '
            '; - - $output .= '
            '; - - $output .= '
            '; - - break; - - /* Gap/Space */ - case 'spacing': - $output .= '
            '; - break; - - /* A line divider */ - case 'divider': - $output .= '
            '; - if ( $divider_text ) { - $output .= '
            ' . $divider_text . '
            '; - } - $output .= '
            '; - break; - - /* Single Image Upload */ - case 'image': - $output .= '
            '; - - if ( in_array( $key, array('profile_photo','cover_photo') ) ) { - $field_value = ''; - } else { - $field_value = $this->field_value( $key, $default, $data ); - } - - $output .= ''; - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $modal_label = ( isset( $data['label'] ) ) ? $data['label'] : __('Upload Photo','ultimate-member'); - - $output .= '
            '; - - if ( $this->field_value( $key, $default, $data ) ) { - - if ( !in_array( $key, array('profile_photo','cover_photo') ) ) { - if ( isset( $this->set_mode ) && $this->set_mode == 'register' ) { - $imgValue = $this->field_value( $key, $default, $data ); - } else { - $imgValue = um_user_uploads_uri() . $this->field_value( $key, $default, $data ); - } - $img = ''; - } else { - $img = ''; - } - - $output .= '
            - ' . $img . ' -
            '. __('Change photo','ultimate-member') . ''; - - } else { - - $output .= '
            - - -
            '. $button_text . ''; - - } - - $output .= '
            '; - - /* modal hidden */ - $output .= '
            '; - - $output .= '
            ' . $modal_label . '
            '; - - $output .= '
            '; - - if ( isset( $this->set_id ) ) { - $set_id = $this->set_id; - $set_mode = $this->set_mode; - } else { - $set_id = 0; - $set_mode = ''; - } - - $nonce = wp_create_nonce( 'um_upload_nonce-'.$this->timestamp ); - - $output .= '
            '; - $output .= '
            '.$button_text.'
            '; - - $output .= ''; - - $output .= '
            '; - - $output .= '
            '; - - /* end */ - - if ( $this->is_error($key) ) { - $output .= $this->field_error( $this->show_error($key) ); - } - - $output .= '
            '; - - break; - - /* Single File Upload */ - case 'file': - $output .= '
            '; - - $output .= ''; - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $modal_label = ( isset( $data['label'] ) ) ? $data['label'] : __('Upload Photo','ultimate-member'); - - $output .= '
            '; - - if ( $this->field_value( $key, $default, $data ) ) { - - $extension = pathinfo( $this->field_value( $key, $default, $data ), PATHINFO_EXTENSION); - - $output .= ''. __('Change file','ultimate-member') . ''; - - } else { - - $output .= '
            -
            '. $button_text . ''; - - } - - $output .= '
            '; - - /* modal hidden */ - $output .= '
            '; - - $output .= '
            ' . $modal_label . '
            '; - - $output .= '
            '; - - if ( isset( $this->set_id ) ) { - $set_id = $this->set_id; - $set_mode = $this->set_mode; - } else { - $set_id = 0; - $set_mode = ''; - } - - $output .= '
            - - -
            '; - - $nonce = wp_create_nonce( 'um_upload_nonce-'.$this->timestamp ); - - $output .= '
            '.$button_text.'
            '; - - $output .= ''; - - $output .= '
            '; - - $output .= '
            '; - - /* end */ - - if ( $this->is_error($key) ) { - $output .= $this->field_error( $this->show_error($key) ); - } - - $output .= '
            '; - - break; - - /* Select dropdown */ - case 'select': - - $form_key = str_replace('role_select','role',$key); - - $output .= '
            '; - - - if ( isset( $data['allowclear'] ) && $data['allowclear'] == 0 ) { - $class = 'um-s2'; - } else { - $class = 'um-s1'; - } - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $output .= '
            '; - if ( isset( $icon ) && $icon && isset( $this->field_icons ) && $this->field_icons == 'field' ) { - $output .= '
            '; - } - - $has_parent_option = false; - $disabled_by_parent_option = ''; - $atts_ajax = ''; - $select_original_option_value = ''; - - if( isset( $data['parent_dropdown_relationship'] ) && ! empty( $data['parent_dropdown_relationship'] ) && ! $ultimatemember->user->preview ){ - - $disabled_by_parent_option = 'disabled = disabled'; - - $has_parent_option = true; - - $parent_dropdown_relationship = apply_filters("um_custom_dropdown_options_parent__{$form_key}", $data['parent_dropdown_relationship'], $data ); - $atts_ajax .= " data-um-parent='{$parent_dropdown_relationship}' "; - - if( isset( $data['custom_dropdown_options_source'] ) && ! empty( $data['custom_dropdown_options_source'] ) && - $has_parent_option && function_exists( $data['custom_dropdown_options_source'] ) && - um_user( $data['parent_dropdown_relationship'] ) ){ - $options = call_user_func( $data['custom_dropdown_options_source'] ); - $disabled_by_parent_option = ''; - if( um_user( $form_key ) ){ - $select_original_option_value = " data-um-original-value='".um_user( $form_key )."' "; - } - } - - } - - if( isset( $data['custom_dropdown_options_source'] ) && ! empty( $data['custom_dropdown_options_source'] ) ){ - - $ajax_source = apply_filters("um_custom_dropdown_options_source__{$form_key}", $data['custom_dropdown_options_source'], $data ); - $atts_ajax .= " data-um-ajax-source='{$ajax_source}' "; - - $ajax_source_url = apply_filters("um_custom_dropdown_options_source_url__{$form_key}", admin_url('admin-ajax.php'), $data ); - $atts_ajax .= " data-um-ajax-url='{$ajax_source_url}' "; - - - } - - $output .= ''; - - $output .= '
            '; - - - if ( $this->is_error($form_key) ) { - $output .= $this->field_error( $this->show_error($form_key) ); - } - - $output .= '
            '; - break; - - /* Multi-Select dropdown */ - case 'multiselect': - - $max_selections = ( isset( $max_selections ) ) ? absint( $max_selections ) : 0; - - $output .= '
            '; - - if ( isset( $data['allowclear'] ) && $data['allowclear'] == 0 ) { - $class = 'um-s2'; - } else { - $class = 'um-s1'; - } - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $field_icon = false; - $field_icon_output = ''; - - $use_keyword = apply_filters('um_multiselect_option_value', 0, $data['type'] ); - - $output .= '
            '; - if ( isset( $icon ) && $icon && isset( $this->field_icons ) && $this->field_icons == 'field' ) { - $output .= '
            '; - } - - $output .= ''; - - if( ! empty( $disabled ) && ! empty( $arr_selected ) ){ - foreach( $arr_selected as $item ){ - $output .= $this->disabled_hidden_field( $key.'[]', $item ); - } - } - - $output .= '
            '; - - - if ( $this->is_error($key) ) { - $output .= $this->field_error( $this->show_error( $key ) ); - } - - $output .= '
            '; - break; - - /* Radio */ - case 'radio': - - $form_key = str_replace('role_radio','role',$key); - - if ( isset( $options ) ) { - $options = apply_filters('um_radio_field_options', $options, $data ); - $options = apply_filters("um_radio_field_options_{$key}", $options ); - } - - $output .= '
            '; - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $output .= '
            '; - - // role field - if ( $form_key == 'role' ) { - - global $wpdb; - foreach($options as $rkey => $val ) { - $val = (string) $val; - $val = trim( $val ); - $post_id = $wpdb->get_var( - $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'um_role' AND ( post_name = %s OR post_title = %s )", $rkey, $val ) - ); - $_role = get_post($post_id); - $new_roles[$_role->post_name] = $_role->post_title; - wp_reset_postdata(); - } - - $options = $new_roles; - } - - // add options - $i = 0; - $field_value = array(); - - foreach($options as $k => $v) { - - $v = rtrim($v); - - $um_field_checkbox_item_title = $v; - $option_value = $v; - - if ( !is_numeric( $k ) && in_array($form_key, array('role') ) ) { - $um_field_checkbox_item_title = $v; - $option_value = $k; - } - - $i++; - if ($i % 2 == 0 ) { - $col_class = 'right'; - } else { - $col_class = ''; - } - - if ( $this->is_radio_checked($key, $option_value, $data) ) { - $active = 'active'; - $class = "um-icon-android-radio-button-on"; - } else { - $active = ''; - $class = "um-icon-android-radio-button-off"; - } - - if( isset( $data['editable'] ) && $data['editable'] == 0 ){ - $col_class .= " um-field-radio-state-disabled"; - } - - - - $output .= ''; - - if ($i % 2 == 0) { - $output .= '
            '; - } - - } - - if( ! empty( $disabled ) ){ - foreach( $field_value as $item ){ - $output .= $this->disabled_hidden_field( $form_key , $item ); - } - } - - $output .= '
            '; - - $output .= '
            '; - - if ( $this->is_error($form_key) ) { - $output .= $this->field_error( $this->show_error($form_key) ); - } - - $output .= '
            '; - break; - - /* Checkbox */ - case 'checkbox': - - if ( isset( $options ) ) { - $options = apply_filters('um_checkbox_field_options', $options, $data ); - $options = apply_filters("um_checkbox_field_options_{$key}", $options ); - } - - $output .= '
            '; - - if ( isset( $data['label'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $output .= '
            '; - - // add options - $i = 0; - - foreach($options as $k => $v) { - - $v = rtrim($v); - - $i++; - if ($i % 2 == 0 ) { - $col_class = 'right'; - } else { - $col_class = ''; - } - - if ( $this->is_selected($key, $v, $data) ) { - $active = 'active'; - $class = "um-icon-android-checkbox-outline"; - } else { - $active = ''; - $class = "um-icon-android-checkbox-outline-blank"; - } - - if( isset( $data['editable'] ) && $data['editable'] == 0 ){ - $col_class .= " um-field-radio-state-disabled"; - } - - $output .= ''; - - if ($i % 2 == 0) { - $output .= '
            '; - } - - } - - $output .= '
            '; - - $output .= '
            '; - - - if ( $this->is_error($key) ) { - $output .= $this->field_error( $this->show_error($key) ); - } - - $output .= '
            '; - break; - - /* HTML */ - case 'block': - $output .= '
            -
            '.$content.'
            -
            '; - break; - - /* Shortcode */ - case 'shortcode': - - $content = str_replace('{profile_id}', um_profile_id(), $content ); - - $output .= '
            -
            ' . do_shortcode($content) . '
            -
            '; - break; - - /* Unlimited Group */ - case 'group': - - $fields = $this->get_fields_in_group( $key ); - if ( !empty( $fields ) ) { - - $output .= '
            -
            '.__($label,UM_TEXTDOMAIN).'
            '; - $output .= '
            '; - - foreach($fields as $subkey => $subdata) { - $output .= $this->edit_field( $subkey, $subdata, 'group' ); - } - - $output .= '
            '; - $output .= '
            '; - - } - - break; - - } - - // Custom filter for field output - if ( isset( $this->set_mode ) ) { - $output = apply_filters("um_{$key}_form_edit_field", $output, $this->set_mode); - } - - return $output; - } - - /** - * Sorts columns array - * @param array $arr - * @param string $col - * @param string $dir - * @return array $arr - */ - function array_sort_by_column($arr, $col, $dir = SORT_ASC) { - $sort_col = array(); - foreach ($arr as $key=> $row) { - if ( isset( $row[$col] ) ) { - $sort_col[$key] = $row[$col]; - } - } - - array_multisort($sort_col, $dir, $arr); - return $arr; - } - - - /** - * Get fields in row - * @param integer $row_id - * @return string - */ - function get_fields_by_row( $row_id ) { - foreach( $this->get_fields as $key => $array ) { - if ( !isset( $array['in_row'] ) || ( isset( $array['in_row'] ) && $array['in_row'] == $row_id ) ) { - $results[$key] = $array; - } - } - return ( isset ( $results ) ) ? $results : ''; - } - - - /** - * Get fields by sub row - * @param string $row_fields - * @param integer $subrow_id - * @return mixed - */ - function get_fields_in_subrow( $row_fields, $subrow_id ) { - if ( !is_array( $row_fields ) ) return ''; - foreach( $row_fields as $key => $array ) { - if ( !isset( $array['in_sub_row'] ) || ( isset( $array['in_sub_row'] ) && $array['in_sub_row'] == $subrow_id ) ) { - $results[$key] = $array; - } - } - return ( isset ( $results ) ) ? $results : ''; - } - - /** - * Get fields in group - * @param integer $group_id - * @return mixed - */ - function get_fields_in_group( $group_id ) { - foreach( $this->get_fields as $key => $array ) { - if ( isset( $array['in_group'] ) && $array['in_group'] == $group_id ) { - $results[$key] = $array; - } - } - return ( isset ( $results ) ) ? $results : ''; - } - - - /** - * Get fields in column - * @param array $fields - * @param integer $col_number - * @return mixed - */ - function get_fields_in_column( $fields, $col_number ) { - foreach( $fields as $key => $array ) { - if ( isset( $array['in_column'] ) && $array['in_column'] == $col_number ) { - $results[$key] = $array; - } - } - return ( isset ( $results ) ) ? $results : ''; - } - - - /** - * Display fields - * @param string $mode - * @param array $args - * @return string - */ - function display( $mode, $args ) { - global $ultimatemember; - $output = null; - - $this->global_args = $args; - - $ultimatemember->form->form_suffix = '-' . $this->global_args['form_id']; - - $this->set_mode = $mode; - $this->set_id = $this->global_args['form_id']; - - $this->field_icons = ( isset( $this->global_args['icons'] ) ) ? $this->global_args['icons'] : 'label'; - - // start output here - $this->get_fields = $this->get_fields(); - - if ( !empty( $this->get_fields ) ) { - - // find rows - foreach( $this->get_fields as $key => $array ) { - if ( $array['type'] == 'row' ) { - $this->rows[$key] = $array; - unset( $this->get_fields[ $key ] ); // not needed anymore - } - } - - // rows fallback - if ( !isset( $this->rows ) ){ - $this->rows = array( '_um_row_1' => array( - 'type' => 'row', - 'id' => '_um_row_1', - 'sub_rows' => 1, - 'cols' => 1 - ) - ); - } - - // master rows - foreach ( $this->rows as $row_id => $row_array ) { - - $row_fields = $this->get_fields_by_row( $row_id ); - if ( $row_fields ) { - - $output .= $this->new_row_output( $row_id, $row_array ); - - $sub_rows = ( isset( $row_array['sub_rows'] ) ) ? $row_array['sub_rows'] : 1; - for( $c = 0; $c < $sub_rows; $c++ ) { - - // cols - $cols = ( isset( $row_array['cols'] ) ) ? $row_array['cols'] : 1; - if ( strstr( $cols, ':' ) ) { - $col_split = explode( ':', $cols ); - } else { - $col_split = array( $cols ); - } - $cols_num = $col_split[$c]; - - // sub row fields - $subrow_fields = null; - $subrow_fields = $this->get_fields_in_subrow( $row_fields, $c ); - - if ( is_array( $subrow_fields ) ) { - - $subrow_fields = $this->array_sort_by_column( $subrow_fields, 'position'); - - if ( $cols_num == 1 ) { - - $output .= '
            '; - $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); - if ( $col1_fields ) { - foreach( $col1_fields as $key => $data ) {$output .= $this->edit_field( $key, $data );} - } - $output .= '
            '; - - } else if ( $cols_num == 2 ) { - - $output .= '
            '; - $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); - if ( $col1_fields ) { - foreach( $col1_fields as $key => $data ) {$output .= $this->edit_field( $key, $data );} - } - $output .= '
            '; - - $output .= '
            '; - $col2_fields = $this->get_fields_in_column( $subrow_fields, 2 ); - if ( $col2_fields ) { - foreach( $col2_fields as $key => $data ) {$output .= $this->edit_field( $key, $data );} - } - $output .= '
            '; - - } else { - - $output .= '
            '; - $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); - if ( $col1_fields ) { - foreach( $col1_fields as $key => $data ) {$output .= $this->edit_field( $key, $data );} - } - $output .= '
            '; - - $output .= '
            '; - $col2_fields = $this->get_fields_in_column( $subrow_fields, 2 ); - if ( $col2_fields ) { - foreach( $col2_fields as $key => $data ) {$output .= $this->edit_field( $key, $data );} - } - $output .= '
            '; - - $output .= '
            '; - $col3_fields = $this->get_fields_in_column( $subrow_fields, 3 ); - if ( $col3_fields ) { - foreach( $col3_fields as $key => $data ) {$output .= $this->edit_field( $key, $data );} - } - $output .= '
            '; - - } - - } - - } - - $output .= '
            '; - - } - - } - - } - - return $output; - } - - /** - * Gets a field in `view mode` - * @param string $key - * @param array $data - * @param boolean $rule - * @return string - */ - function view_field( $key, $data, $rule=false ) { - global $ultimatemember; - - $output = null; - - // get whole field data - if (is_array($data)) { - $data = $this->get_field($key); - extract($data); - } - - if ( !isset( $data['type'] ) ) return; - - if ( isset( $data['in_group'] ) && $data['in_group'] != '' && $rule != 'group' ) return; - - if ( $visibility == 'edit' ) return; - - if ( in_array( $type, array('block','shortcode','spacing','divider','group') ) ) { - - } else { - if ( ! $this->field_value( $key, $default, $data ) ) return; - } - - if ( !um_can_view_field( $data ) ) return; - - // disable these fields in profile view only - if ( in_array( $key, array('user_password') ) && $this->set_mode == 'profile' ) { - return; - } - - if ( !um_field_conditions_are_met( $data ) ) return; - - switch( $type ) { - - /* Default */ - default: - - $output .= '
            '; - - if ( isset( $data['label'] ) || isset( $data['icon'] ) && ! empty( $data['icon'] ) ) { - - if( ! isset( $data['label'] ) ) $data['label'] = ''; - - $output .= $this->field_label( $data['label'], $key, $data); - } - - $res = $this->field_value( $key, $default, $data ); - - if( ! empty( $res ) ){ - $res = stripslashes( $res ); - } - - $data['is_view_field'] = true; - $res = apply_filters("um_view_field", $res, $data, $type ); - $res = apply_filters("um_view_field_value_{$type}", $res, $data ); - - $output .= '
            '; - $output .= '
            ' . $res . '
            '; - $output .= '
            '; - - $output .= '
            '; - - break; - - /* HTML */ - case 'block': - $output .= '
            -
            '.$content.'
            -
            '; - break; - - /* Shortcode */ - case 'shortcode': - - $content = str_replace('{profile_id}', um_profile_id(), $content ); - - $output .= '
            -
            ' . do_shortcode($content) . '
            -
            '; - break; - - /* Gap/Space */ - case 'spacing': - $output .= '
            '; - break; - - /* A line divider */ - case 'divider': - $output .= '
            '; - if ( $divider_text ) { - $output .= '
            ' . $divider_text . '
            '; - } - $output .= '
            '; - break; - - /* Rating */ - case 'rating': - - $output .= '
            '; - - if ( isset( $data['label'] ) || isset( $data['icon'] ) && ! empty( $data['icon'] ) ) { - $output .= $this->field_label($label, $key, $data); - } - - $output .= '
            '; - $output .= '
            -
            -
            '; - $output .= '
            '; - - $output .= '
            '; - - break; - - } - - // Custom filter for field output - if ( isset( $this->set_mode ) ) { - $output = apply_filters("um_{$key}_form_show_field", $output, $this->set_mode); - $output = apply_filters("um_{$type}_form_show_field", $output, $this->set_mode); - - } - - return $output; - } - - /** - * Display fields ( view mode ) - * @param string $mode - * @param array $args - * @return string - */ - function display_view( $mode, $args ) { - global $ultimatemember; - $output = null; - - $this->global_args = $args; - - $ultimatemember->form->form_suffix = '-' . $this->global_args['form_id']; - - $this->set_mode = $mode; - $this->set_id = $this->global_args['form_id']; - - $this->field_icons = ( isset( $this->global_args['icons'] ) ) ? $this->global_args['icons'] : 'label'; - - // start output here - $this->get_fields = $this->get_fields(); - - if ( um_get_option('profile_empty_text') ) { - - $emo = um_get_option('profile_empty_text_emo'); - if ( $emo ) { - $emo = ''; - } else { - $emo = false; - } - - if ( um_is_myprofile() ) { - $output .= '

            ' . $emo .'' . sprintf(__('Your profile is looking a little empty. Why not add some information!','ultimate-member'), um_edit_profile_url() ) . '

            '; - } else { - $output .= '

            '. $emo . '' . __('This user has not added any information to their profile yet.','ultimate-member') . '

            '; - } - } - - if ( !empty( $this->get_fields ) ) { - - // find rows - foreach( $this->get_fields as $key => $array ) { - if ( $array['type'] == 'row' ) { - $this->rows[$key] = $array; - unset( $this->get_fields[ $key ] ); // not needed anymore - } - } - - // rows fallback - if ( !isset( $this->rows ) ){ - $this->rows = array( '_um_row_1' => array( - 'type' => 'row', - 'id' => '_um_row_1', - 'sub_rows' => 1, - 'cols' => 1 - ) - ); - } - - // master rows - foreach ( $this->rows as $row_id => $row_array ) { - - $row_fields = $this->get_fields_by_row( $row_id ); - if ( $row_fields ) { - - $output .= $this->new_row_output( $row_id, $row_array ); - - $sub_rows = ( isset( $row_array['sub_rows'] ) ) ? $row_array['sub_rows'] : 1; - for( $c = 0; $c < $sub_rows; $c++ ) { - - // cols - $cols = ( isset( $row_array['cols'] ) ) ? $row_array['cols'] : 1; - if ( strstr( $cols, ':' ) ) { - $col_split = explode( ':', $cols ); - } else { - $col_split = array( $cols ); - } - $cols_num = $col_split[$c]; - - // sub row fields - $subrow_fields = null; - $subrow_fields = $this->get_fields_in_subrow( $row_fields, $c ); - - if ( is_array( $subrow_fields ) ) { - - $subrow_fields = $this->array_sort_by_column( $subrow_fields, 'position'); - - if ( $cols_num == 1 ) { - - $output .= '
            '; - $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); - if ( $col1_fields ) { - foreach( $col1_fields as $key => $data ) { - - $data = apply_filters("um_view_field_output_".$data['type'], $data); - - $output .= $this->view_field( $key, $data ); - - - } - } - $output .= '
            '; - - } else if ( $cols_num == 2 ) { - - $output .= '
            '; - $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); - if ( $col1_fields ) { - foreach( $col1_fields as $key => $data ) { - - $data = apply_filters("um_view_field_output_".$data['type'], $data); - - $output .= $this->view_field( $key, $data ); - - } - } - $output .= '
            '; - - $output .= '
            '; - $col2_fields = $this->get_fields_in_column( $subrow_fields, 2 ); - if ( $col2_fields ) { - foreach( $col2_fields as $key => $data ) { - - $data = apply_filters("um_view_field_output_".$data['type'], $data); - - $output .= $this->view_field( $key, $data ); - - } - } - $output .= '
            '; - - } else { - - $output .= '
            '; - $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); - if ( $col1_fields ) { - foreach( $col1_fields as $key => $data ) { - - $data = apply_filters("um_view_field_output_".$data['type'], $data); - - $output .= $this->view_field( $key, $data ); - - } - } - $output .= '
            '; - - $output .= '
            '; - $col2_fields = $this->get_fields_in_column( $subrow_fields, 2 ); - if ( $col2_fields ) { - foreach( $col2_fields as $key => $data ) { - - $data = apply_filters("um_view_field_output_".$data['type'], $data); - - $output .= $this->view_field( $key, $data ); - - } - } - $output .= '
            '; - - $output .= '
            '; - $col3_fields = $this->get_fields_in_column( $subrow_fields, 3 ); - if ( $col3_fields ) { - foreach( $col3_fields as $key => $data ) { - - $data = apply_filters("um_view_field_output_".$data['type'], $data); - - $output .= $this->view_field( $key, $data ); - - } - } - $output .= '
            '; - - } - - } - - } - - $output .= '
            '; - - } - - } - - } - - return $output; - } - - /** - * Get new row in form - * @param string $row_id - * @param array $row_array - * @return array - */ - function new_row_output( $row_id, $row_array ) { - $output = null; - extract($row_array); - - $padding = (isset($padding))?$padding:''; - $margin = (isset($margin))?$margin:''; - $background = (isset($background))?$background:''; - $text_color = (isset($text_color))?$text_color:''; - $borderradius = (isset($borderradius))?$borderradius:''; - $border = (isset($border))?$border:''; - $bordercolor = (isset($bordercolor))?$bordercolor:''; - $borderstyle = (isset($borderstyle))?$borderstyle:''; - $heading = (isset($heading))?$heading:''; - $css_class = (isset($css_class))?$css_class:''; - - $css_padding = ''; - $css_margin = ''; - $css_background = ''; - $css_borderradius = ''; - $css_border = ''; - $css_bordercolor = ''; - $css_borderstyle = ''; - $css_heading_background_color = ''; - $css_heading_padding = ''; - $css_heading_text_color = ''; - $css_heading_borderradius = ''; - $css_text_color = ''; - - // row css rules - if ( $padding ) $css_padding = 'padding: ' . $padding .';'; - if ( $margin ) { - $css_margin = 'margin: ' . $margin .';'; - } else { - $css_margin = 'margin: 0 0 30px 0;'; - } - - if ( $background ) $css_background = 'background-color: ' . $background .';'; - if ( $borderradius ) $css_borderradius = 'border-radius: 0px 0px ' . $borderradius . ' ' . $borderradius . ';'; - if ( $border ) $css_border = 'border-width: ' . $border . ';'; - if ( $bordercolor ) $css_bordercolor = 'border-color: ' . $bordercolor . ';'; - if ( $borderstyle ) $css_borderstyle = 'border-style: ' . $borderstyle . ';'; - if ( $text_color ) $css_text_color = 'color: ' . $text_color . ' !important;'; - - // show the heading - if ( $heading ) { - - $heading_background_color = (isset($heading_background_color))?$heading_background_color:''; - $heading_text_color = (isset($heading_text_color))?$heading_text_color:''; - - if ( $heading_background_color ) { - $css_heading_background_color = 'background-color: ' . $heading_background_color .';'; - $css_heading_padding = 'padding: 10px 15px;'; - } - - if ( $heading_text_color ) $css_heading_text_color = 'color: ' . $heading_text_color .';'; - if ( $borderradius ) $css_heading_borderradius = 'border-radius: ' . $borderradius . ' ' . $borderradius . ' 0px 0px;'; - - $output .= '
            '; - - if ( isset( $icon ) ) { - $output .= ''; - } - - $output .= ( ! empty( $heading_text ) ? $heading_text: '') .'
            '; - - } else { - - // no heading - if ( $borderradius ) $css_borderradius = 'border-radius: ' . $borderradius . ';'; - - } - - $output .= '
            '; - - return $output; - } - - - -} diff --git a/core/um-files.php b/core/um-files.php deleted file mode 100644 index 9244e699..00000000 --- a/core/um-files.php +++ /dev/null @@ -1,704 +0,0 @@ -fonticon = array( - 'pdf' => array('icon' => 'um-faicon-file-pdf-o', 'color' => '#D24D4D' ), - 'txt' => array('icon' => 'um-faicon-file-text-o' ), - 'csv' => array('icon' => 'um-faicon-file-text-o' ), - 'doc' => array('icon' => 'um-faicon-file-text-o', 'color' => '#2C95D5' ), - 'docx' => array('icon' => 'um-faicon-file-text-o', 'color' => '#2C95D5' ), - 'odt' => array('icon' => 'um-faicon-file-text-o', 'color' => '#2C95D5' ), - 'ods' => array('icon' => 'um-faicon-file-excel-o', 'color' => '#51BA6A' ), - 'xls' => array('icon' => 'um-faicon-file-excel-o', 'color' => '#51BA6A' ), - 'xlsx' => array('icon' => 'um-faicon-file-excel-o', 'color' => '#51BA6A' ), - 'zip' => array('icon' => 'um-faicon-file-zip-o' ), - 'rar' => array('icon' => 'um-faicon-file-zip-o' ), - 'mp3' => array('icon' => 'um-faicon-file-audio-o' ), - 'jpg' => array('icon' => 'um-faicon-picture-o' ), - 'jpeg' => array('icon' => 'um-faicon-picture-o' ), - 'png' => array('icon' => 'um-icon-image' ), - 'gif' => array('icon' => 'um-icon-images' ), - 'eps' => array('icon' => 'um-icon-images' ), - 'psd' => array('icon' => 'um-icon-images' ), - 'tif' => array('icon' => 'um-icon-image' ), - 'tiff' => array('icon' => 'um-icon-image' ), - ); - - $this->default_file_fonticon = 'um-faicon-file-o'; - - } - - /*** - *** @allowed image types - ***/ - function allowed_image_types() { - - $array['png'] = 'PNG'; - $array['jpeg'] = 'JPEG'; - $array['jpg'] = 'JPG'; - $array['gif'] = 'GIF'; - - $array = apply_filters('um_allowed_image_types', $array); - return $array; - } - - /*** - *** @allowed file types - ***/ - function allowed_file_types() { - - $array['pdf'] = 'PDF'; - $array['txt'] = 'Text'; - $array['csv'] = 'CSV'; - $array['doc'] = 'DOC'; - $array['docx'] = 'DOCX'; - $array['odt'] = 'ODT'; - $array['ods'] = 'ODS'; - $array['xls'] = 'XLS'; - $array['xlsx'] = 'XLSX'; - $array['zip'] = 'ZIP'; - $array['rar'] = 'RAR'; - $array['mp3'] = 'MP3'; - $array['jpg'] = 'JPG'; - $array['jpeg'] = 'JPEG'; - $array['png'] = 'PNG'; - $array['gif'] = 'GIF'; - $array['eps'] = 'EPS'; - $array['psd'] = 'PSD'; - $array['tif'] = 'TIF'; - $array['tiff'] = 'TIFF'; - - $array = apply_filters('um_allowed_file_types', $array); - return $array; - } - - /*** - *** @Get extension icon - ***/ - function get_fonticon_by_ext( $extension ) { - if (isset($this->fonticon[$extension]['icon'])){ - return $this->fonticon[$extension]['icon']; - } else { - return $this->default_file_fonticon; - } - } - - /*** - *** @Get extension icon background - ***/ - function get_fonticon_bg_by_ext( $extension ) { - if (isset($this->fonticon[$extension]['color'])){ - return $this->fonticon[$extension]['color']; - } else { - return '#666'; - } - } - - /*** - *** @Setup upload directory - ***/ - function setup_paths(){ - - $this->upload_dir = wp_upload_dir(); - - $this->upload_basedir = $this->upload_dir['basedir'] . '/ultimatemember/'; - $this->upload_baseurl = $this->upload_dir['baseurl'] . '/ultimatemember/'; - - $this->upload_basedir = apply_filters('um_upload_basedir_filter', $this->upload_basedir ); - $this->upload_baseurl = apply_filters('um_upload_baseurl_filter', $this->upload_baseurl ); - - // @note : is_ssl() doesn't work properly for some sites running with load balancers - // Check the links for more info about this bug - // https://codex.wordpress.org/Function_Reference/is_ssl - // http://snippets.webaware.com.au/snippets/wordpress-is_ssl-doesnt-work-behind-some-load-balancers/ - if( is_ssl() || stripos( get_option( 'siteurl' ), 'https://' ) !== false - || ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) - && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) ) { - $this->upload_baseurl = str_replace("http://", "https://", $this->upload_baseurl); - } - - $this->upload_temp = $this->upload_basedir . 'temp/'; - $this->upload_temp_url = $this->upload_baseurl . 'temp/'; - - if (!file_exists( $this->upload_basedir )) { - $old = umask(0); - @mkdir( $this->upload_basedir, 0755, true); - umask($old); - } - - if (!file_exists( $this->upload_temp )) { - $old = umask(0); - @mkdir( $this->upload_temp , 0755, true); - umask($old); - } - - } - - /*** - *** @Generate unique temp directory - ***/ - function unique_dir(){ - global $ultimatemember; - $unique_number = $ultimatemember->validation->generate(); - $array['dir'] = $this->upload_temp . $unique_number . '/'; - $array['url'] = $this->upload_temp_url . $unique_number . '/'; - return $array; - } - - /*** - *** @get path only without file name - ***/ - function path_only( $file ) { - return trailingslashit( dirname( $file ) ); - } - - /*** - *** @fix image orientation - ***/ - function fix_image_orientation($rotate, $source){ - if ( extension_loaded('exif') ){ - $exif = @exif_read_data($source); - - if (isset($exif['Orientation'])) { - switch ($exif['Orientation']) { - case 3: - $rotate = imagerotate($rotate, 180, 0); - break; - - case 6: - $rotate = imagerotate($rotate, -90, 0); - break; - - case 8: - $rotate = imagerotate($rotate, 90, 0); - break; - } - } - } - return $rotate; - } - - /*** - *** @Process an image - ***/ - function create_and_copy_image($source, $destination, $quality = 100) { - - $info = @getimagesize($source); - - if ($info['mime'] == 'image/jpeg'){ - - $image = imagecreatefromjpeg( $source ); - - } else if ($info['mime'] == 'image/gif'){ - - $image = imagecreatefromgif( $source ); - - } else if ($info['mime'] == 'image/png'){ - - $image = imagecreatefrompng( $source ); - imagealphablending( $image, false ); - imagesavealpha( $image, true ); - - } - - list($w, $h) = @getimagesize( $source ); - if ( $w > um_get_option('image_max_width') ) { - - $ratio = round( $w / $h, 2 ); - $new_w = um_get_option('image_max_width'); - $new_h = round( $new_w / $ratio, 2 ); - - if ( $info['mime'] == 'image/jpeg' || $info['mime'] == 'image/gif' ){ - - $image_p = imagecreatetruecolor( $new_w, $new_h ); - imagecopyresampled( $image_p, $image, 0, 0, 0, 0, $new_w, $new_h, $w, $h ); - $image_p = $this->fix_image_orientation( $image_p, $source ); - - }else if( $info['mime'] == 'image/png' ){ - - $srcImage = $image; - $targetImage = imagecreatetruecolor( $new_w, $new_h ); - imagealphablending( $targetImage, false ); - imagesavealpha( $targetImage, true ); - imagecopyresampled( $targetImage, $srcImage, 0, 0, 0, 0, $new_w, $new_h, $w, $h ); - - } - - if ( $info['mime'] == 'image/jpeg' ){ - $has_copied = imagejpeg( $image_p, $destination, $quality ); - }else if ( $info['mime'] == 'image/gif' ){ - $has_copied = imagegif( $image_p, $destination ); - }else if ( $info['mime'] == 'image/png' ){ - $has_copied = imagepng( $targetImage, $destination, 0 ,PNG_ALL_FILTERS); - } - - $info['um_has_max_width'] = 'custom'; - $info['um_has_copied'] = $has_copied ? 'yes':'no'; - - } else { - - $image = $this->fix_image_orientation( $image, $source ); - - if ( $info['mime'] == 'image/jpeg' ){ - $has_copied = imagejpeg( $image, $destination, $quality ); - }else if ( $info['mime'] == 'image/gif' ){ - $has_copied = imagegif( $image, $destination ); - }else if ( $info['mime'] == 'image/png' ){ - $has_copied = imagepng( $image , $destination , 0 ,PNG_ALL_FILTERS); - } - - $info['um_has_max_width'] = 'default'; - $info['um_has_copied'] = $has_copied ? 'yes':'no'; - } - - - - return $info; - } - - /*** - *** @Process a file - ***/ - function upload_temp_file( $source, $destination ) { - - move_uploaded_file( $source, $destination ); - - } - - /*** - *** @Process a temp upload - ***/ - function new_image_upload_temp( $source, $destination, $quality = 100 ){ - - $unique_dir = $this->unique_dir(); - - $this->make_dir( $unique_dir['dir'] ); - - $info = $this->create_and_copy_image( $source, $unique_dir['dir'] . $destination, $quality ); - - $url = $unique_dir['url'] . $destination ; - - return $url; - - } - - /*** - *** @Process a temp upload for files - ***/ - function new_file_upload_temp( $source, $destination ){ - - $unique_dir = $this->unique_dir(); - - $this->make_dir( $unique_dir['dir'] ); - - $this->upload_temp_file( $source, $unique_dir['dir'] . $destination ); - - $url = $unique_dir['url'] . $destination; - - return $url; - - } - - /*** - *** @Make a Folder - ***/ - function make_dir( $dir ){ - - $old = umask(0); - @mkdir( $dir, 0755, true); - umask( $old ); - - } - - /*** - *** @Get extension by mime type - ***/ - function get_extension_by_mime_type( $mime ){ - $split = explode('/', $mime ); - return $split[1]; - } - - /*** - *** @Get file data - ***/ - function get_file_data( $file ){ - - $array['size'] = filesize( $file ); - - return $array; - } - - /*** - *** @Get image data - ***/ - function get_image_data( $file ){ - - $array['size'] = filesize( $file ); - - $array['image'] = @getimagesize( $file ); - - if ( $array['image'] > 0 ) { - - $array['invalid_image'] = false; - - list($width, $height, $type, $attr) = @getimagesize( $file ); - - $array['width'] = $width; - $array['height'] = $height; - $array['ratio'] = $width / $height; - - $array['extension'] = $this->get_extension_by_mime_type( $array['image']['mime'] ); - - } else { - - $array['invalid_image'] = true; - - } - - return $array; - } - - /*** - *** @Check image upload and handle errors - ***/ - function check_image_upload( $file, $field ) { - global $ultimatemember; - $error = null; - - $fileinfo = $this->get_image_data( $file ); - $data = $ultimatemember->fields->get_field( $field ); - - if ( $data == null ) { - $data = apply_filters("um_custom_image_handle_{$field}", '' ); - if ( !$data ) { - $error = __('This media type is not recognized.','ultimate-member'); - } - } - - $data = apply_filters("um_image_handle_global__option", $data ); - $data = apply_filters("um_image_handle_{$field}__option", $data ); - - if ( $fileinfo['invalid_image'] == true ) { - $error = sprintf(__('Your image is invalid or too large!','ultimate-member') ); - } elseif ( isset( $data['allowed_types'] ) && !$this->in_array( $fileinfo['extension'], $data['allowed_types'] ) ) { - $error = ( isset( $data['extension_error'] ) && !empty( $data['extension_error'] ) ) ? $data['extension_error'] : 'not allowed'; - } elseif ( isset($data['min_size']) && ( $fileinfo['size'] < $data['min_size'] ) ) { - $error = $data['min_size_error']; - } elseif ( isset($data['min_width']) && ( $fileinfo['width'] < $data['min_width'] ) ) { - $error = sprintf(__('Your photo is too small. It must be at least %spx wide.','ultimate-member'), $data['min_width']); - } elseif ( isset($data['min_height']) && ( $fileinfo['height'] < $data['min_height'] ) ) { - $error = sprintf(__('Your photo is too small. It must be at least %spx wide.','ultimate-member'), $data['min_height']); - } - - return $error; - } - - /*** - *** @Check file upload and handle errors - ***/ - function check_file_upload( $file, $extension, $field ) { - global $ultimatemember; - $error = null; - - $fileinfo = $this->get_file_data( $file ); - $data = $ultimatemember->fields->get_field( $field ); - - if ( !$this->in_array( $extension, $data['allowed_types'] ) ) { - $error = ( isset( $data['extension_error'] ) && !empty( $data['extension_error'] ) ) ? $data['extension_error'] : 'not allowed'; - } elseif ( isset($data['min_size']) && ( $fileinfo['size'] < $data['min_size'] ) ) { - $error = $data['min_size_error']; - } - - return $error; - } - - /*** - *** @If a value exists in comma seperated list - ***/ - function in_array( $value, $array ){ - - if ( in_array( $value, explode(',', $array ) ) ){ - return true; - } - - return false; - } - - /*** - *** @This function will delete file upload from server - ***/ - function delete_file( $src ) { - - if ( strstr( $src, '?' ) ){ - $splitted = explode('?', $src ); - $src = $splitted[0]; - } - - $is_temp = um_is_temp_upload( $src ); - if ( $is_temp ) { - unlink( $is_temp ); - rmdir( dirname( $is_temp ) ); - } else { - wp_die( __('Ultimate Member: Not a valid temp file','ultimate-member') ); - } - } - - /*** - *** @delete a main user photo - ***/ - function delete_core_user_photo( $user_id, $type ) { - - delete_user_meta( $user_id, $type ); - - do_action("um_after_remove_{$type}", $user_id); - - $dir = $this->upload_basedir . $user_id . '/'; - $prefix = $type; - chdir($dir); - $matches = glob($prefix.'*',GLOB_MARK); - - if( is_array($matches) && !empty($matches)) { - foreach($matches as $match) { - if( is_file($dir.$match) ) unlink($dir.$match); - } - } - - if ( count(glob("$dir/*")) === 0) { - rmdir( $dir ); - } - - } - - /*** - *** @resize a local image - ***/ - function resize_image( $file, $crop ) { - - $targ_x1 = $crop[0]; - $targ_y1 = $crop[1]; - $targ_x2 = $crop[2]; - $targ_y2 = $crop[3]; - - - $info = @getimagesize( $file ); - - if ( $info['mime'] == 'image/gif' ){ - - $img_r = imagecreatefromgif( $file ); - $dst_r = imagecreatetruecolor( $targ_x2, $targ_y2 ); - imagecopy( $dst_r, $img_r, 0, 0, $targ_x1, $targ_y1, $targ_x2, $targ_y2 ); - imagegif( $dst_r, $this->path_only( $file ) . basename( $file ) ); - - } else if ( $info['mime'] == 'image/png' ){ - - $img_r = imagecreatefrompng( $file ); - $dst_r = imagecreatetruecolor( $targ_x2, $targ_y2 ); - imagealphablending( $dst_r, false); - imagesavealpha( $dst_r, true); - imagecopy( $dst_r, $img_r, 0, 0, $targ_x1, $targ_y1, $targ_x2, $targ_y2 ); - imagepng( $dst_r, $this->path_only( $file ) . basename( $file ) ); - - }else{ - - $img_r = imagecreatefromjpeg( $file ); - $dst_r = imagecreatetruecolor( $targ_x2, $targ_y2 ); - imagecopy( $dst_r, $img_r, 0, 0, $targ_x1, $targ_y1, $targ_x2, $targ_y2 ); - imagejpeg( $dst_r, $this->path_only( $file ) . basename( $file ), 100 ); - - } - - $split = explode('/ultimatemember/temp/', $file ); - return $this->upload_temp_url . $split[1]; - - } - - /*** - *** @make a user folder for uploads - ***/ - function new_user( $user_id ) { - if ( !file_exists( $this->upload_basedir . $user_id . '/' ) ) { - $old = umask(0); - @mkdir( $this->upload_basedir . $user_id . '/' , 0755, true); - umask($old); - } - } - - /*** - *** @new user upload - ***/ - function new_user_upload( $user_id, $source, $key ) { - - if( ! is_numeric( $user_id ) ){ - wp_die( __("Invalid user ID: ".json_encode( $user_id )." ",'ultimate-member') ); - } - - $user_id = trim( $user_id ); - - // if he does not have uploads dir yet - $this->new_user( $user_id ); - - if ( is_user_logged_in() && ( get_current_user_id() != $user_id ) && !um_user_can('can_edit_everyone') ) { - wp_die( __('Unauthorized to do this attempt.','ultimate-member') ); - } - - $allow_frontend_image_uploads = apply_filters('um_allow_frontend_image_uploads', false, $user_id, $key ); - - if ( $allow_frontend_image_uploads == false && !is_user_logged_in() && ( $key == 'profile_photo' || $key == 'cover_photo' ) ) { - wp_die( __('Unauthorized to do this attempt.','ultimate-member') ); - } - - $ext = '.' . pathinfo($source, PATHINFO_EXTENSION); - - // copy & overwrite file - - if( in_array( $key , array('profile_photo','cover_photo') ) ){ - $filename = $key . $ext; - $name = $key; - }else{ - $filename = basename( $source ); - } - - - - if ( file_exists( $this->upload_basedir . $user_id . '/' . $filename ) ) { - unlink( $this->upload_basedir . $user_id . '/' . $filename ); - } - copy( $source, $this->upload_basedir . $user_id . '/' . $filename ); - - $info = @getimagesize( $source ); - - // thumbs - if ( $key == 'profile_photo' ) { - - list($w, $h) = @getimagesize( $source ); - - - $sizes = um_get_option('photo_thumb_sizes'); - foreach( $sizes as $size ) { - - $ratio = round( $w / $h, 2 ); - $height = round( $size / $ratio, 2 ); - - if ( file_exists( $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext ) ) { - unlink( $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext ); - } - - if ( $size < $w ) { - - if ( $info['mime'] == 'image/jpeg' ){ - $thumb_s = imagecreatefromjpeg( $source ); - $thumb = imagecreatetruecolor( $size, $size ); - imagecopyresampled( $thumb, $thumb_s, 0, 0, 0, 0, $size, $size, $w, $h ); - imagejpeg( $thumb, $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext, 100); - imagejpeg( $thumb, $this->upload_basedir . $user_id . '/' . $name . $ext, 100); - }else if ( $info['mime'] == 'image/png' ){ - $thumb_s = imagecreatefrompng( $source ); - $thumb = imagecreatetruecolor( $size, $size ); - imagealphablending( $thumb, false); - imagesavealpha( $thumb, true); - imagecopyresampled( $thumb, $thumb_s, 0, 0, 0, 0, $size, $size, $w, $h ); - imagepng( $thumb, $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext ); - }else if ( $info['mime'] == 'image/gif' ){ - $thumb_s = imagecreatefromgif( $source ); - $thumb = imagecreatetruecolor( $size, $size ); - imagecopyresampled( $thumb, $thumb_s, 0, 0, 0, 0, $size, $size, $w, $h ); - imagegif( $thumb, $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext); - imagegif( $thumb, $this->upload_basedir . $user_id . '/' . $name . $ext); - } - } - - } - - // removes a synced profile photo - delete_user_meta( $user_id, 'synced_profile_photo' ); - - }else if ( $key == 'cover_photo' ) { - - list($w, $h) = @getimagesize( $source ); - - $sizes = um_get_option('cover_thumb_sizes'); - foreach( $sizes as $size ) { - - $ratio = round( $w / $h, 2 ); - $height = round( $size / $ratio, 2 ); - - if ( file_exists( $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext ) ) { - unlink( $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext ); - } - - if ( $size < $w ) { - - if ( $info['mime'] == 'image/jpeg' ){ - $thumb = imagecreatetruecolor( $size, $height ); - $thumb_s = imagecreatefromjpeg( $source ); - imagecopyresampled( $thumb, $thumb_s, 0, 0, 0, 0, $size, $height, $w, $h ); - imagejpeg( $thumb, $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext, 100); - }else if ( $info['mime'] == 'image/png' ){ - $thumb_s = imagecreatefrompng( $source ); - $thumb = imagecreatetruecolor( $size, $height ); - imagealphablending( $thumb, false); - imagesavealpha( $thumb, true); - imagecopyresampled( $thumb, $thumb_s, 0, 0, 0, 0, $size, $height, $w, $h ); - imagepng( $thumb, $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext ); - }else if ( $info['mime'] == 'image/gif' ){ - $thumb = imagecreatetruecolor( $size, $height ); - $thumb_s = imagecreatefromgif( $source ); - imagecopyresampled( $thumb, $thumb_s, 0, 0, 0, 0, $size, $height, $w, $h ); - imagegif( $thumb, $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext); - } - } - - } - - } - - // clean up temp - $dir = dirname( $source ); - unlink( $source ); - rmdir( $dir ); - - // update user's meta - do_action('um_before_upload_db_meta', $user_id, $key ); - do_action("um_before_upload_db_meta_{$key}", $user_id ); - - update_user_meta( $user_id, $key, $filename ); - - do_action('um_after_upload_db_meta', $user_id, $key ); - do_action("um_after_upload_db_meta_{$key}", $user_id ); - - // the url of upload - return $this->upload_baseurl . $user_id . '/' . $filename; - - } - - /*** - *** @Remove a directory - ***/ - function remove_dir($dir) { - if ( file_exists( $dir ) ) { - foreach(glob($dir . '/*') as $file) { - if(is_dir($file)) $this->remove_dir($file); else unlink($file); - } rmdir($dir); - } - } - - /*** - *** @Format Bytes - ****/ - function format_bytes( $size , $precision = 1 ) { - - $base = log($size, 1024); - $suffixes = array('', 'kb', 'MB', 'GB', 'TB'); - $computed_size = round(pow(1024, $base - floor($base)), $precision); - $unit = $suffixes[ floor($base) ]; - - return $computed_size.' '.$unit; - - } - -} diff --git a/core/um-filters-addons.php b/core/um-filters-addons.php deleted file mode 100644 index f9f99002..00000000 --- a/core/um-filters-addons.php +++ /dev/null @@ -1,67 +0,0 @@ -addons as $addon_id => $addon ) { - $array[] = array( - 'id' => 'addon_' . $addon_id, - 'type' => 'switch', - 'title' => $addon[0], - 'desc' => $addon[1], - 'on' => __('Activated','ultimate-member'), - 'off' => __('Deactivated','ultimate-member'), - ); - } - - $array = apply_filters('um_builtin_addons_options', $array ); - - $sections[] = array( - - 'icon' => 'um-faicon-plug', - 'title' => __( 'Extensions','ultimate-member'), - - ); - - $sections[] = array( - - 'subsection' => true, - 'title' => __( 'Tools','ultimate-member'), - 'fields' => $array, - - ); - - return $sections; - - } - - /*** - *** @licenses - ***/ - add_filter("redux/options/um_options/sections", 'um_add_licenses_tab', 9999 ); - function um_add_licenses_tab($sections){ - global $ultimatemember; - - $fields = array(); - $fields = apply_filters('um_licensed_products_settings', $fields ); - - if ( $fields ) { - - $sections[] = array( - - 'icon' => 'um-faicon-key', - 'title' => __( 'Licenses','ultimate-member'), - 'fields' => $fields, - 'subsection' => false, - - ); - - } - - return $sections; - - } \ No newline at end of file diff --git a/core/um-filters-commenting.php b/core/um-filters-commenting.php deleted file mode 100644 index 4ea063e5..00000000 --- a/core/um-filters-commenting.php +++ /dev/null @@ -1,32 +0,0 @@ -user_id ) && ! empty( $comment->user_id ) ){ - if ( isset( $ultimatemember->user->cached_user[ $comment->user_id ] ) && $ultimatemember->user->cached_user[ $comment->user_id ] ) { - - $return = '' . $ultimatemember->user->cached_user[$comment->user_id]['name'] . ''; - - } else { - - um_fetch_user( $comment->user_id ); - - $ultimatemember->user->cached_user[ $comment->user_id ] = array('url' => um_user_profile_url(), 'name' => um_user('display_name') ); - $return = '' . $ultimatemember->user->cached_user[$comment->user_id]['name'] . ''; - - um_reset_user(); - - } - } - - return $return; - } - - \ No newline at end of file diff --git a/core/um-fonticons.php b/core/um-fonticons.php deleted file mode 100644 index 1647c122..00000000 --- a/core/um-fonticons.php +++ /dev/null @@ -1,37 +0,0 @@ - $file ) { - - $css = file_get_contents($file); - - if ( $c == 'fa' ) { - preg_match_all('/(um-faicon-.*?)\s?\{/', $css, $matches); - } else { - preg_match_all('/(um-icon-.*?)\s?\{/', $css, $matches); - } - - unset($matches[1][0]); - foreach($matches[1] as $match) { - $icon = str_replace(':before','',$match); - $array[] = $icon; - } - - } - - update_option('um_cache_fonticons', $array); - } - - $this->all = get_option('um_cache_fonticons'); - - } - -} \ No newline at end of file diff --git a/core/um-form.php b/core/um-form.php deleted file mode 100644 index 0dcbf6a3..00000000 --- a/core/um-form.php +++ /dev/null @@ -1,283 +0,0 @@ -post_form = null; - - $this->form_suffix = null; - - $this->errors = null; - - $this->processing = null; - - add_action('template_redirect', array(&$this, 'form_init'), 2); - - add_action('init', array(&$this, 'field_declare'), 10); - - } - - /** - * Count the form errors. - * @return integer - */ - function count_errors() { - $errors = $this->errors; - - if( $errors && is_array( $errors ) ) { - return count( $errors ); - } - - return 0; - } - - - /** - * Appends field errors - * @param string $key - * @param string $error - */ - function add_error( $key, $error ) { - if ( ! isset( $this->errors[ $key ] ) ){ - - $error = apply_filters('um_submit_form_error', $error , $key ); - - $this->errors[ $key ] = $error; - } - } - - - /** - * If a form has errors - * @param string $key - * @return boolean - */ - function has_error( $key ) { - if ( isset($this->errors[$key]) ) - return true; - return false; - } - - - /** - * Declare all fields - */ - function field_declare(){ - global $ultimatemember; - if ( isset( $ultimatemember->builtin->custom_fields ) ) { - $this->all_fields = $ultimatemember->builtin->custom_fields; - } else { - $this->all_fields = null; - } - } - - - /** - * Validate form - */ - function form_init(){ - global $ultimatemember; - - if ( isset( $_SERVER['REQUEST_METHOD'] ) ) { - $http_post = ('POST' == $_SERVER['REQUEST_METHOD']); - } else { - $http_post = 'POST'; - } - - - if ( $http_post && !is_admin() && isset( $_POST['form_id'] ) && is_numeric($_POST['form_id']) ) { - - do_action("um_before_submit_form_post", $_POST ); - - $this->form_id = $_POST['form_id']; - $this->form_status = get_post_status( $this->form_id ); - - - if ( $this->form_status == 'publish' ) { - - /* save entire form as global */ - $this->post_form = apply_filters('um_submit_post_form' ,$_POST ); - - $this->post_form = $this->beautify( $this->post_form ); - - $this->form_data = $ultimatemember->query->post_data( $this->form_id ); - - $this->post_form['submitted'] = $this->post_form; - - $this->post_form = array_merge( $this->form_data, $this->post_form ); - - - if( isset( $this->form_data['custom_fields'] ) && strstr( $this->form_data['custom_fields'], 'role_' ) ){ // Secure selected role - - $custom_field_roles = $this->custom_field_roles( $this->form_data['custom_fields'] ); - - if( isset( $_POST['role'] ) ){ - $role = $_POST['role']; - - if( is_array( $_POST['role'] ) ){ - $role = current( $_POST['role'] ); - } - - if ( isset( $custom_field_roles ) && is_array( $custom_field_roles ) && ! empty( $role ) && ! in_array( $role , $custom_field_roles ) ) { - wp_die( __( 'This is not possible for security reasons.','ultimate-member') ); - } - - $this->post_form['role'] = $role; - $this->post_form['submitted']['role'] = $role; - } - - - - }else if( isset( $this->post_form['mode'] ) && $this->post_form['mode'] == 'register' ) { - $role = $this->assigned_role( $this->form_id ); - $this->post_form['role'] = $role; - $this->post_form['submitted']['role'] = $role; - } - - if ( isset( $_POST[ $ultimatemember->honeypot ] ) && $_POST[ $ultimatemember->honeypot ] != '' ){ - wp_die('Hello, spam bot!','ultimate-member'); - } - - if ( !in_array( $this->form_data['mode'], array('login') ) ) { - - $form_timestamp = trim($_POST['timestamp']); - $live_timestamp = current_time( 'timestamp' ); - - if ( $form_timestamp == '' && um_get_option('enable_timebot') == 1 ) - wp_die( __('Hello, spam bot!','ultimate-member') ); - - if ( !current_user_can('manage_options') && $live_timestamp - $form_timestamp < 6 && um_get_option('enable_timebot') == 1 ) - wp_die( __('Whoa, slow down! You\'re seeing this message because you tried to submit a form too fast and we think you might be a spam bot. If you are a real human being please wait a few seconds before submitting the form. Thanks!','ultimate-member') ); - - } - - $this->post_form = apply_filters('um_submit_form_data', $this->post_form, $this->post_form['mode'] ); - - /* Continue based on form mode - pre-validation */ - - do_action('um_submit_form_errors_hook', $this->post_form ); - - do_action("um_submit_form_{$this->post_form['mode']}", $this->post_form ); - - } - - } - - } - - - /** - * Beautify form data - * @param array $form - * @return array $form - */ - function beautify( $form ){ - - if (isset($form['form_id'])){ - - $this->form_suffix = '-' . $form['form_id']; - - $this->processing = $form['form_id']; - - foreach( $form as $key => $value ){ - if ( strstr( $key, $this->form_suffix ) ) { - $a_key = str_replace( $this->form_suffix, '', $key ); - $form[ $a_key ] = $value; - unset( $form[ $key ] ); - } - } - - } - - return $form; - } - - - /** - * Display form type as Title - * @param string $mode - * @param integer $post_id - * @return string $output - */ - function display_form_type( $mode, $post_id ){ - $output = null; - switch( $mode ){ - case 'login': - $output = 'Login'; - break; - case 'profile': - $output = 'Profile'; - break; - case 'register': - $output = 'Register'; - break; - } - return $output; - } - - /** - * Assigned roles to a form - * @param integer $post_id - * @return string $role - */ - function assigned_role( $post_id ){ - - $mode = $this->form_type( $post_id ); - $use_globals = get_post_meta( $post_id, "_um_{$mode}_use_globals", true); - - $global_role = um_get_option('default_role'); // Form Global settings - - if( $use_globals == 0 ){ // Non-Global settings - $role = get_post_meta( $post_id, "_um_{$mode}_role", true ); - } - - if( empty( $role ) ){ // custom role is default, return default role's slug - $role = $global_role; - } - - return $role; - - } - - /** - * Get form type - * @param integer $post_id - * @return string - */ - function form_type( $post_id ){ - - $mode = get_post_meta( $post_id, '_um_mode', true ); - - return $mode; - } - - /** - * Get custom field roles - * @param string $custom_fields serialized - * @return array roles - */ - function custom_field_roles( $custom_fields ){ - - if( is_serialized( $custom_fields ) ){ - $fields = unserialize( $custom_fields ); - - if( ! is_array( $fields ) ) return false; - - foreach ( $fields as $field_key => $field_settings ) { - - if( strstr( $field_key , 'role_') ){ - if( is_array( $field_settings['options'] ) ){ - return array_keys( $field_settings['options'] ); - } - } - - } - - } - - return false; - } -} diff --git a/core/um-login.php b/core/um-login.php deleted file mode 100644 index dcf92d72..00000000 --- a/core/um-login.php +++ /dev/null @@ -1,5 +0,0 @@ -permalinks->core['logout']; - $has_translation = false; - $trid = 0; - $not_default_lang = false; - - if( is_home() || is_front_page() ){ - return; - } - - if ( function_exists('icl_object_id') || function_exists('icl_get_current_language') ) { - - if( function_exists('icl_get_current_language') ){ - $language_code = icl_get_current_language(); - }else if( function_exists('icl_object_id') && defined('ICL_LANGUAGE_CODE') ){ // checks if WPML exists - $language_code = ICL_LANGUAGE_CODE; - } - - $has_translation = true; - - if( function_exists('icl_object_id') && defined('ICL_LANGUAGE_CODE') && isset( $sitepress ) ){ // checks if WPML exists - $trid = $sitepress->get_element_trid( $current_page_ID ); - } - - if( icl_get_default_language() !== $language_code ){ - $not_default_lang = true; - }else{ - $language_code = ''; - } - - } - - - - if ( um_is_core_page('logout') || ( $trid > 0 && $has_translation && $trid == $logout_page_id && $not_default_lang ) ) { - - if ( is_user_logged_in() ) { - - if ( isset( $_REQUEST['redirect_to'] ) && $_REQUEST['redirect_to'] !== '' ) { - wp_logout(); - session_unset(); - exit( wp_redirect( $_REQUEST['redirect_to'] ) ); - } else if ( um_user('after_logout') == 'redirect_home' ) { - wp_logout(); - session_unset(); - exit( wp_redirect( home_url( $language_code ) ) ); - } else { - wp_logout(); - session_unset(); - exit( wp_redirect( um_user('logout_redirect_url') ) ); - - } - - } else { - exit( wp_redirect( home_url( $language_code ) ) ); - } - - } - - } - -} \ No newline at end of file diff --git a/core/um-mail.php b/core/um-mail.php deleted file mode 100644 index 2a7a3f2b..00000000 --- a/core/um-mail.php +++ /dev/null @@ -1,123 +0,0 @@ -force_plain_text = ''; - - } - - /*** - *** @mandrill compatibility - ***/ - function mandrill_nl2br($nl2br, $message = '') { - - // text emails - if ( !um_get_option('email_html') ) { - $nl2br = true; - } - - return $nl2br; - - } - - /*** - *** @check If template exists - ***/ - function email_template( $template, $args = array() ) { - $lang = ''; - $template_path = false; - - if ( function_exists('icl_get_current_language') ) { - if ( icl_get_current_language() != 'en' ) { - $lang = icl_get_current_language() . '/'; - } - } else { - - $lang = get_locale(); - $arr_english_lang = array('en','en_US','en_NZ','en_ZA','en_AU','en_GB'); - - if( in_array( $lang, $arr_english_lang ) || strpos( $lang , 'en_' ) > -1 || empty( $lang ) || $lang == 0 ){ - $lang = ''; - } else { - $lang .= '/'; - } - - } - - if ( file_exists( get_stylesheet_directory() . '/ultimate-member/templates/email/' . $lang . $template . '.html' ) ) { - $template_path = get_stylesheet_directory() . '/ultimate-member/templates/email/' . $lang . $template . '.html'; - } else { - if ( isset( $args['path'] ) ) { - $path = $args['path'] . $lang; - } else { - $path = um_path . 'templates/email/' . $lang; - } - - if ( file_exists( $path . $template . '.html' ) ) { - $template_path = $path . $template . '.html'; - } - } - - return apply_filters( 'um_email_template_path', $template_path, $template, $args ); - - } - - /*** - *** @sends an email to any user - ***/ - function send( $email, $template=null, $args = array() ) { - - if ( !$template ) return; - if ( um_get_option( $template . '_on' ) != 1 ) return; - if ( !is_email( $email ) ) return; - - $this->attachments = null; - $this->headers = 'From: '. um_get_option('mail_from') .' <'. um_get_option('mail_from_addr') .'>' . "\r\n"; - - $this->subject = um_get_option( $template . '_sub' ); - $this->subject = um_convert_tags( $this->subject, $args ); - - if ( isset( $args['admin'] ) || isset( $args['plain_text'] ) ) { - $this->force_plain_text = 'forced'; - } - - - // HTML e-mail or text - if ( um_get_option('email_html') && $this->email_template( $template, $args ) ) { - add_filter( 'wp_mail_content_type', array(&$this, 'set_content_type') ); - $this->message = file_get_contents( $this->email_template( $template, $args ) ); - } else { - $this->message = um_get_option( $template ); - } - - // Convert tags in body - $this->message = um_convert_tags( $this->message, $args ); - - // Send mail - wp_mail( $email, $this->subject, $this->message, $this->headers, $this->attachments ); - remove_filter( 'wp_mail_content_type', array(&$this, 'set_content_type') ); - - // reset globals - $this->force_plain_text = ''; - - } - - /*** - *** @maybe sending HTML emails - ***/ - function set_content_type( $content_type ) { - if ( $this->force_plain_text == 'forced' ) - return 'text/plain'; - - if ( um_get_option('email_html') ) - return 'text/html'; - - return 'text/plain'; - } - - -} diff --git a/core/um-members.php b/core/um-members.php deleted file mode 100644 index a78f6bbb..00000000 --- a/core/um-members.php +++ /dev/null @@ -1,372 +0,0 @@ -core_search_fields = array( - 'user_login', - 'username', - 'display_name', - 'user_email', - ); - - add_filter( 'um_search_select_fields', array(&$this, 'um_search_select_fields'), 10, 1 ); - - } - - /*** - *** @user_search_columns - ***/ - function user_search_columns( $search_columns ){ - if ( is_admin() ) { - $search_columns[] = 'display_name'; - } - return $search_columns; - } - - /*** - *** @Members page allowed? - ***/ - function access_members() { - - if ( um_get_option('members_page') == 0 && um_is_core_page('members') ) { - um_redirect_home(); - } - - } - - /*** - *** @tag conversion for member directory - ***/ - function convert_tags( $string, $array ) { - - $search = array( - '{total_users}', - ); - - $replace = array( - $array['total_users'], - ); - - $string = str_replace($search, $replace, $string); - return $string; - } - - /*** - *** @show filter - ***/ - function show_filter( $filter ) { - global $ultimatemember; - - $fields = $ultimatemember->builtin->all_user_fields; - - if ( isset( $fields[ $filter ] ) ) { - $attrs = $fields[ $filter ]; - } else { - $attrs = apply_filters("um_custom_search_field_{$filter}", array() ); - } - - // additional filter for search field attributes - $attrs = apply_filters("um_search_field_{$filter}", $attrs); - - if ( $ultimatemember->builtin->is_dropdown_field( $filter, $attrs ) ) { - $type = 'select'; - } else if ( 'user_tags' == $attrs['type'] ) { - $attrs['options'] = apply_filters('um_multiselect_options_user_tags', array(), $attrs); - $attrs['custom'] = 1; - $type = 'select'; - } else { - $type = 'text'; - } - - // filter all search fields - $attrs = apply_filters( 'um_search_fields', $attrs ); - - if( $type == 'select' ){ - $attrs = apply_filters( 'um_search_select_fields', $attrs ); - } - - switch( $type ) { - - case 'select': - - ?> - - - - - - - - shortcodes->form_id, '_um_roles', true ); - $um_roles = $ultimatemember->query->get_roles( false ); - - if( ! empty( $shortcode_roles ) && is_array( $shortcode_roles ) ){ - - $attrs['options'] = array(); - - foreach ( $um_roles as $key => $value ) { - if ( in_array( $key, $shortcode_roles ) ) { - $attrs['options'][ $key ] = $value; - } - } - - } - - } - - return $attrs; - } - - - - - /*** - *** @Generate a loop of results - ***/ - function get_members( $args ){ - - global $ultimatemember, $wpdb, $post; - - extract($args); - - $query_args = array(); - $query_args = apply_filters( 'um_prepare_user_query_args', $query_args, $args ); - - // Prepare for BIG SELECT query - $wpdb->query('SET SQL_BIG_SELECTS=1'); - - // number of profiles for mobile - if ( $ultimatemember->mobile->isMobile() && isset( $profiles_per_page_mobile ) ){ - $profiles_per_page = $profiles_per_page_mobile; - } - - $query_args['number'] = $profiles_per_page; - - if( isset( $args['number'] ) ){ - $query_args['number'] = $args['number']; - } - - if( isset( $args['page'] ) ){ - $members_page = $args['page']; - }else{ - $members_page = isset( $_REQUEST['members_page'] ) ? $_REQUEST['members_page'] : 1; - } - - $query_args['paged'] = $members_page; - - if( ! um_user('can_view_all') && is_user_logged_in() ){ - unset( $query_args ); - } - - do_action('um_user_before_query', $query_args ); - - $users = new WP_User_Query( $query_args ); - - do_action('um_user_after_query', $query_args, $users ); - - - $array['users'] = isset( $users->results ) && ! empty( $users->results ) ? array_unique( $users->results ) : array(); - - $array['total_users'] = (isset( $max_users ) && $max_users && $max_users <= $users->total_users ) ? $max_users : $users->total_users; - - $array['page'] = $members_page; - - $array['total_pages'] = ceil( $array['total_users'] / $profiles_per_page ); - - $array['header'] = $this->convert_tags( $header, $array ); - $array['header_single'] = $this->convert_tags( $header_single, $array ); - - $array['users_per_page'] = $array['users']; - - for( $i = $array['page']; $i <= $array['page'] + 2; $i++ ) { - if ( $i <= $array['total_pages'] ) { - $pages_to_show[] = $i; - } - } - - if ( isset( $pages_to_show ) && count( $pages_to_show ) < 5 ) { - $pages_needed = 5 - count( $pages_to_show ); - - for ( $c = $array['page']; $c >= $array['page'] - 2; $c-- ) { - if ( !in_array( $c, $pages_to_show ) && $c > 0 ) { - $pages_to_add[] = $c; - } - } - } - - if ( isset( $pages_to_add ) ) { - - asort( $pages_to_add ); - $pages_to_show = array_merge( (array)$pages_to_add, $pages_to_show ); - - if ( count( $pages_to_show ) < 5 ) { - if ( max($pages_to_show) - $array['page'] >= 2 ) { - $pages_to_show[] = max($pages_to_show) + 1; - if ( count( $pages_to_show ) < 5 ) { - $pages_to_show[] = max($pages_to_show) + 1; - } - } else if ( $array['page'] - min($pages_to_show) >= 2 ) { - $pages_to_show[] = min($pages_to_show) - 1; - if ( count( $pages_to_show ) < 5 ) { - $pages_to_show[] = min($pages_to_show) - 1; - } - } - } - - asort( $pages_to_show ); - - $array['pages_to_show'] = $pages_to_show; - - } else { - - if ( isset( $pages_to_show ) && count( $pages_to_show ) < 5 ) { - if ( max($pages_to_show) - $array['page'] >= 2 ) { - $pages_to_show[] = max($pages_to_show) + 1; - if ( count( $pages_to_show ) < 5 ) { - $pages_to_show[] = max($pages_to_show) + 1; - } - } else if ( $array['page'] - min($pages_to_show) >= 2 ) { - $pages_to_show[] = min($pages_to_show) - 1; - if ( count( $pages_to_show ) < 5 ) { - $pages_to_show[] = min($pages_to_show) - 1; - } - } - } - - if ( isset( $pages_to_show ) && is_array( $pages_to_show ) ) { - - asort( $pages_to_show ); - - $array['pages_to_show'] = $pages_to_show; - - } - - } - - if ( isset( $array['pages_to_show'] ) ) { - - if ( $array['total_pages'] < count( $array['pages_to_show'] ) ) { - foreach( $array['pages_to_show'] as $k => $v ) { - if ( $v > $array['total_pages'] ) unset( $array['pages_to_show'][$k] ); - } - } - - foreach( $array['pages_to_show'] as $k => $v ) { - if ( (int)$v <= 0 ) { - unset( $array['pages_to_show'][$k] ); - } - } - - } - - return apply_filters('um_prepare_user_results_array', $array ); - - } - - - /** - * Optimizes Member directory with multiple LEFT JOINs - * @param object $vars - * @return object $var - */ - public function um_optimize_member_query( $vars ) { - - global $wpdb; - - $arr_where = explode("\n", $vars->query_where ); - $arr_left_join = explode("LEFT JOIN", $vars->query_from ); - $arr_user_photo_key = array('synced_profile_photo','profile_photo','synced_gravatar_hashed_id'); - - foreach ( $arr_where as $where ) { - - foreach( $arr_user_photo_key as $key ){ - - if( strpos( $where , "'".$key."'" ) > -1 ){ - - // find usermeta key - preg_match("#mt[0-9]+.#", $where, $meta_key ); - - // remove period from found meta_key - $meta_key = str_replace(".","", current( $meta_key ) ); - - // remove matched LEFT JOIN clause - $vars->query_from = str_replace('LEFT JOIN wp_usermeta AS '.$meta_key.' ON ( wp_users.ID = '.$meta_key.'.user_id )', '', $vars->query_from ); - - // prepare EXISTS replacement for LEFT JOIN clauses - $where_exists = 'um_exist EXISTS( SELECT '.$wpdb->usermeta.'.umeta_id FROM '.$wpdb->usermeta.' WHERE '.$wpdb->usermeta.'.user_id = '.$wpdb->users.'.ID AND '.$wpdb->usermeta.'.meta_key IN("'.implode('","', $arr_user_photo_key ).'") AND '.$wpdb->usermeta.'.meta_value != "" )'; - - // Replace LEFT JOIN clauses with EXISTS and remove duplicates - if( strpos( $vars->query_where, 'um_exist' ) === FALSE ){ - $vars->query_where = str_replace( $where , $where_exists, $vars->query_where ); - }else{ - $vars->query_where = str_replace( $where , '1=0', $vars->query_where ); - } - } - - } - - } - - $vars->query_where = str_replace("\n", "", $vars->query_where ); - $vars->query_where = str_replace("um_exist", "", $vars->query_where ); - - return $vars; - - } - - -} diff --git a/core/um-menu.php b/core/um-menu.php deleted file mode 100644 index 87454f66..00000000 --- a/core/um-menu.php +++ /dev/null @@ -1,33 +0,0 @@ - - -
            -
            -
            -
              - $v ) { ?> - -
            • - - -
            -
            -
            - - user->profile['reset_pass_hash_token'] = current_time( 'timestamp' ); - $ultimatemember->user->update_usermeta_info('reset_pass_hash_token'); - - $this->change_password = true; - - um_reset_user(); - - } - - } - - /*** - *** @reset url - ***/ - function reset_url(){ - global $ultimatemember; - - if ( !um_user('reset_pass_hash') ) return false; - - $user_id = um_user('ID'); - - delete_option( "um_cache_userdata_{$user_id}" ); - - $url = add_query_arg( 'act', 'reset_password', um_get_core_page('password-reset') ); - $url = add_query_arg( 'hash', esc_attr( um_user('reset_pass_hash') ), $url ); - $url = add_query_arg( 'user_id', esc_attr( um_user('ID') ), $url ); - - return $url; - - } - - /*** - *** @we are on password reset page - ***/ - function password_reset(){ - global $ultimatemember; - - if ( um_is_core_page('password-reset') ) { - - $ultimatemember->fields->set_mode = 'password'; - - } - - } - - /*** - *** @password page form - ***/ - function form_init() { - global $ultimatemember; - - if ( um_requesting_password_reset() ) { - - $ultimatemember->form->post_form = $_POST; - - do_action('um_reset_password_errors_hook', $ultimatemember->form->post_form ); - - if ( !isset($ultimatemember->form->errors) ) { - - do_action('um_reset_password_process_hook', $ultimatemember->form->post_form ); - - } - - } - - if ( um_requesting_password_change() ) { - - $ultimatemember->form->post_form = $_POST; - - do_action('um_change_password_errors_hook', $ultimatemember->form->post_form ); - - if ( !isset($ultimatemember->form->errors) ) { - - do_action('um_change_password_process_hook', $ultimatemember->form->post_form ); - - } - - } - - } - - /*** - *** @Add class based on shortcode - ***/ - function get_class( $mode ){ - - global $ultimatemember; - - $classes = 'um-'.$mode; - - if ( is_admin() ) { - $classes .= ' um-in-admin'; - } - - if ( $ultimatemember->fields->editing == true ) { - $classes .= ' um-editing'; - } - - if ( $ultimatemember->fields->viewing == true ) { - $classes .= ' um-viewing'; - } - - $classes = apply_filters('um_form_official_classes__hook', $classes); - return $classes; - } - - /*** - *** @Shortcode - ***/ - function ultimatemember_password( $args = array() ) { - return $this->load( $args ); - } - - /*** - *** @Load a module with global function - ***/ - function load( $args ) { - - global $ultimatemember; - - ob_start(); - - $defaults = array( - 'template' => 'password-reset', - 'mode' => 'password', - 'form_id' => 'um_password_id', - 'max_width' => '450px', - 'align' => 'center', - ); - $args = wp_parse_args( $args, $defaults ); - - if ( isset( $args['use_globals'] ) && $args['use_globals'] == 1 ) { - $args = array_merge( $args, $this->get_css_args( $args ) ); - } else { - $args = array_merge( $this->get_css_args( $args ), $args ); - } - - $args = apply_filters('um_reset_password_shortcode_args_filter', $args); - - if ( isset( $this->change_password ) ) { - - $args['user_id'] = $_REQUEST['user_id']; - $args['template'] = 'password-change'; - - } - - extract( $args, EXTR_SKIP ); - - do_action("um_pre_{$mode}_shortcode", $args); - - do_action("um_before_form_is_loaded", $args); - - do_action("um_before_{$mode}_form_is_loaded", $args); - - $this->template_load( $template, $args ); - - if ( !is_admin() && !defined( 'DOING_AJAX' ) ) { - $this->dynamic_css( $args ); - } - - $output = ob_get_contents(); - ob_end_clean(); - return $output; - - } - - /*** - *** @Get dynamic css args - ***/ - function get_css_args( $args ) { - $arr = um_styling_defaults( $args['mode'] ); - $arr = array_merge( $arr, array( 'form_id' => $args['form_id'], 'mode' => $args['mode'] ) ); - return $arr; - } - - /*** - *** @Load dynamic css - ***/ - function dynamic_css( $args=array() ) { - extract($args); - $global = um_path . 'assets/dynamic_css/dynamic_global.php'; - $file = um_path . 'assets/dynamic_css/dynamic_'.$mode.'.php'; - include $global; - if ( file_exists( $file ) ) - include $file; - } - - /*** - *** @Loads a template file - ***/ - function template_load( $template, $args=array() ) { - global $ultimatemember; - if ( is_array( $args ) ) { - $ultimatemember->shortcodes->set_args = $args; - } - $ultimatemember->shortcodes->load_template( $template ); - } - -} \ No newline at end of file diff --git a/core/um-permalinks.php b/core/um-permalinks.php deleted file mode 100644 index ba23937b..00000000 --- a/core/um-permalinks.php +++ /dev/null @@ -1,513 +0,0 @@ -core = get_option('um_core_pages'); - - add_action('init', array(&$this, 'check_for_querystrings'), 1); - - add_action('init', array(&$this, 'activate_account_via_email_link'), 1); - - add_action('um_user_after_updating_profile', array(&$this, 'profile_url'), 1 ); - - remove_action( 'wp_head', 'rel_canonical' ); - - add_action('wp_head', array(&$this, 'um_rel_canonical_'), 9 ); - - $this->current_url = $this->get_current_url(); - - } - - /*** - *** @SEO canonical href bugfix - ***/ - function um_rel_canonical_() { - global $ultimatemember, $wp_the_query; - - if ( !is_singular() ) - return; - - $enable_canonical = apply_filters("um_allow_canonical__filter", true ); - - if( ! $enable_canonical ) - return; - - if ( !$id = $wp_the_query->get_queried_object_id() ) - return; - - if( $this->core['user'] == $id ) { - $link = $this->get_current_url(); - echo "\n"; - return; - } - - $link = get_permalink( $id ); - if ( $page = get_query_var('cpage') ){ - $link = get_comments_pagenum_link( $page ); - echo "\n"; - } - - } - - /*** - *** @Get query as array - ***/ - function get_query_array() { - $parts = parse_url( $this->get_current_url() ); - if ( isset( $parts['query'] ) ) { - parse_str($parts['query'], $query); - return $query; - } - } - - /*** - *** @Get current URL anywhere - ***/ - function get_current_url( $no_query_params = false ) { - global $post; - - $um_get_option = get_option('um_options'); - - $server_name_method = isset( $um_get_option['current_url_method'] ) ? $um_get_option['current_url_method'] : 'SERVER_NAME'; - - $um_port_forwarding_url = ( isset( $um_get_option['um_port_forwarding_url'] ) ) ? $um_get_option['um_port_forwarding_url']: ''; - - if ( is_multisite() ) { - - $page_url = ''; - $blog_id = get_current_blog_id(); - $siteurl = get_site_url( $blog_id ); - - if ( is_front_page() ) { - $page_url = $siteurl; - - if( isset( $_SERVER['QUERY_STRING'] ) && trim( $_SERVER['QUERY_STRING'] ) ) { - $page_url .= '?' . $_SERVER['QUERY_STRING']; - } - }else { - - $network_permalink_structure = um_get_option("network_permalink_structure"); - - if( $network_permalink_structure == "sub-directory" ){ - - $page_url = 'http'; - - if ( isset( $_SERVER["HTTPS"] ) && $_SERVER["HTTPS"] == "on" ) { - $page_url .= "s"; - } - - $page_url .= "://"; - - $page_url .= $_SERVER[ $server_name_method ]; - }else{ - $page_url .= $siteurl; - } - - if ( $um_port_forwarding_url == 1 && isset( $_SERVER["SERVER_PORT"] ) ) { - $page_url .= ":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; - - } else { - $page_url .= $_SERVER["REQUEST_URI"]; - } - - } - - - }else{ - if ( !isset( $_SERVER['SERVER_NAME'] ) ) - return ''; - - if ( is_front_page() ) { - $page_url = home_url(); - - if( isset( $_SERVER['QUERY_STRING'] ) && trim( $_SERVER['QUERY_STRING'] ) ) { - $page_url .= '?' . $_SERVER['QUERY_STRING']; - } - } else { - $page_url = 'http'; - - if ( isset( $_SERVER["HTTPS"] ) && $_SERVER["HTTPS"] == "on" ) { - $page_url .= "s"; - } - $page_url .= "://"; - - if ( $um_port_forwarding_url == 1 && isset( $_SERVER["SERVER_PORT"] ) ) { - $page_url .= $_SERVER[ $server_name_method ].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; - - } else { - $page_url .= $_SERVER[ $server_name_method ].$_SERVER["REQUEST_URI"]; - } - - } - - - } - - if ( $no_query_params == true ) { - $page_url = strtok( $page_url, '?' ); - } - - return apply_filters( 'um_get_current_page_url', $page_url ); - } - - /*** - *** @activates an account via email - ***/ - function activate_account_via_email_link(){ - global $ultimatemember; - - if ( isset($_REQUEST['act']) && $_REQUEST['act'] == 'activate_via_email' && isset($_REQUEST['hash']) && is_string($_REQUEST['hash']) && strlen($_REQUEST['hash']) == 40 && - isset($_REQUEST['user_id']) && is_numeric($_REQUEST['user_id']) ) { // valid token - - $user_id = absint( $_REQUEST['user_id'] ); - delete_option( "um_cache_userdata_{$user_id}" ); - - um_fetch_user( $user_id ); - - if ( strtolower($_REQUEST['hash']) !== strtolower( um_user('account_secret_hash') ) ) - wp_die( __( 'This activation link is expired or have already been used.','ultimate-member') ); - - $ultimatemember->user->approve(); - $redirect = ( um_user('url_email_activate') ) ? um_user('url_email_activate') : um_get_core_page('login', 'account_active'); - $login = (bool) um_user('login_email_activate'); - - // log in automatically - if ( !is_user_logged_in() && $login ) { - $user = get_userdata($user_id); - $user_id = $user->ID; - - // update wp user - wp_set_current_user( $user_id, $user->user_login ); - wp_set_auth_cookie( $user_id ); - - ob_start(); - do_action( 'wp_login', $user->user_login, $user ); - ob_end_clean(); - } - - um_reset_user(); - - do_action('um_after_email_confirmation', $user_id ); - - exit( wp_redirect( $redirect ) ); - - } - - } - - /*** - *** @makes an activate link for any user - ***/ - function activate_url(){ - global $ultimatemember; - - if ( !um_user('account_secret_hash') ) return false; - $url = apply_filters( 'um_activate_url', home_url() ); - $url = add_query_arg( 'act', 'activate_via_email', $url ); - $url = add_query_arg( 'hash', um_user('account_secret_hash'), $url ); - $url = add_query_arg( 'user_id', um_user('ID'), $url ); - - return $url; - } - - /*** - *** @checks for UM query strings - ***/ - function check_for_querystrings(){ - global $ultimatemember; - if ( isset($_REQUEST['message']) ) - $ultimatemember->shortcodes->message_mode = true; - } - - /*** - *** @add a query param to url - ***/ - function add_query( $key, $value ) { - $this->current_url = add_query_arg( $key, $value, $this->get_current_url() ); - return $this->current_url; - } - /*** - *** @remove a query param from url - ***/ - function remove_query( $key, $value ) { - $this->current_url = remove_query_arg( $key, $this->current_url ); - return $this->current_url; - } - - /*** - *** @get profile url for set user - ***/ - function profile_url( $update_slug = false ) { - global $ultimatemember, $wpdb; - - // Permalink base - $permalink_base = um_get_option('permalink_base'); - - // Get user slug - $profile_slug = get_user_meta( um_user('ID'), "um_user_profile_url_slug_{$permalink_base}", true ); - $generate_slug = um_get_option('um_generate_slug_in_directory'); - - // Return existing profile slug - if( $generate_slug && $update_slug == false && $profile_slug ){ - return $this->profile_permalink( $profile_slug ); - } - - // Reset cache - if( $update_slug == true ){ - - $user_id = um_user('ID'); - - delete_option( "um_cache_userdata_{$user_id}" ); - - um_fetch_user( $user_id ); - - } - - // Username - if ( $permalink_base == 'user_login' ) { - $user_in_url = um_user('user_login'); - - if ( is_email( $user_in_url ) ) { - $user_email = $user_in_url; - $user_in_url = str_replace('@','',$user_in_url); - - if( ( $pos = strrpos( $user_in_url , '.' ) ) !== false ) { - $search_length = strlen( '.' ); - $user_in_url = substr_replace( $user_in_url , '-' , $pos , $search_length ); - } - update_user_meta( um_user('ID') , "um_email_as_username_{$user_in_url}" , $user_email ); - - } else { - - $user_in_url = sanitize_title( $user_in_url ); - - } - - } - - // User ID - if ( $permalink_base == 'user_id' ) { - $user_in_url = um_user('ID'); - } - - // Fisrt and Last name - $full_name_permalinks = array( 'name', 'name_dash', 'name_plus' ); - if( in_array( $permalink_base, $full_name_permalinks ) ) - { - $opt_display_name = um_get_option('display_name'); - $first_name = um_user( 'first_name' ); - $last_name = um_user( 'last_name' ); - $full_name = um_user( 'display_name' ); - $full_name = preg_replace('/\s+/', ' ', $full_name); // Remove double spaces - - $profile_slug = $this->profile_slug( $full_name, $first_name, $last_name ); - - $duplicate_slug_hash = md5( $profile_slug ); - - $args = array( - 'meta_query' => array( - 'relation' => 'AND', - array( - 'key' => "um_user_profile_url_slug_{$permalink_base}", - 'value' => $profile_slug, - 'compare' => '=' - ), - ), - 'orderby' => 'registered', - 'order' => 'ASC', - 'fields' => array('user_registered','ID'), - ); - - $user_query = new WP_User_Query( $args ); - - if( $user_query->total_users > 1 ){ - - $duplicate_names = $user_query->get_results(); - - $current = end( $duplicate_names ); - - update_option("um_duplicate_name_{$duplicate_slug_hash}", $current->ID ); - - } - - $duplicate_id = get_option("um_duplicate_name_{$duplicate_slug_hash}"); - - if( ! empty( $duplicate_id ) && $duplicate_id != um_user('ID') ){ - $full_name = $full_name.' ' . um_user( 'ID' ); - } - - $user_in_url = $this->profile_slug( $full_name, $first_name, $last_name ); - - } - - update_user_meta( um_user('ID'), "um_user_profile_url_slug_{$permalink_base}", $user_in_url ); - - $profile_url = $this->profile_permalink( $user_in_url ); - - return $profile_url; - } - - /** - * Get Profile Permalink - * @param string $slug - * @return string $profile_url - */ - function profile_permalink( $slug ){ - - $page_id = $this->core['user']; - $profile_url = get_permalink( $page_id ); - - $profile_url = apply_filters('um_localize_permalink_filter', $this->core, $page_id, $profile_url ); - - if ( get_option('permalink_structure') ) { - - $profile_url = trailingslashit( untrailingslashit( $profile_url ) ); - $profile_url = $profile_url . strtolower( $slug ). '/'; - - } else { - - $profile_url = add_query_arg( 'um_user', $slug, $profile_url ); - - } - - return ! empty( $profile_url ) ? strtolower( $profile_url ) : ''; - - } - - /** - * Generate profile slug - * @param string $full_name - * @param string $first_name - * @param string $last_name - * @return string - */ - function profile_slug( $full_name, $first_name, $last_name ){ - - $permalink_base = um_get_option('permalink_base'); - - $user_in_url = ''; - - $full_name = str_replace("'", "", $full_name ); - $full_name = str_replace("&", "", $full_name ); - $full_name = str_replace("/", "", $full_name ); - - switch( $permalink_base ) - { - case 'name': // dotted - - $full_name_slug = $full_name; - $difficulties = 0; - - - if( strpos( $full_name, '.' ) > -1 ){ - $full_name = str_replace(".", "_", $full_name ); - $difficulties++; - } - - $full_name = strtolower( str_replace( " ", ".", $full_name ) ); - - if( strpos( $full_name, '_.' ) > -1 ){ - $full_name = str_replace('_.', '_', $full_name ); - $difficulties++; - } - - $full_name_slug = str_replace( '-' , '.', $full_name_slug ); - $full_name_slug = str_replace( ' ' , '.', $full_name_slug ); - $full_name_slug = str_replace( '..' , '.', $full_name_slug ); - - if( strpos( $full_name, '.' ) > -1 ){ - $full_name = str_replace('.', ' ', $full_name ); - $difficulties++; - } - - $user_in_url = rawurlencode( $full_name_slug ); - - break; - - case 'name_dash': // dashed - - $difficulties = 0; - - $full_name_slug = strtolower( $full_name ); - - // if last name has dashed replace with underscore - if( strpos( $last_name, '-') > -1 && strpos( $full_name, '-' ) > -1 ){ - $difficulties++; - $full_name = str_replace('-', '_', $full_name ); - } - // if first name has dashed replace with underscore - if( strpos( $first_name, '-') > -1 && strpos( $full_name, '-' ) > -1 ){ - $difficulties++; - $full_name = str_replace('-', '_', $full_name ); - } - // if name has space, replace with dash - $full_name_slug = str_replace( ' ' , '-', $full_name_slug ); - - // if name has period - if( strpos( $last_name, '.') > -1 && strpos( $full_name, '.' ) > -1 ){ - $difficulties++; - } - - $full_name_slug = str_replace( '.' , '-', $full_name_slug ); - $full_name_slug = str_replace( '--' , '-', $full_name_slug ); - - $user_in_url = rawurlencode( $full_name_slug ); - - break; - - case 'name_plus': // plus - - $difficulties = 0; - - $full_name_slug = strtolower( $full_name ); - - // if last name has dashed replace with underscore - if( strpos( $last_name, '+') > -1 && strpos( $full_name, '+' ) > -1 ){ - $difficulties++; - $full_name = str_replace('-', '_', $full_name ); - } - // if first name has dashed replace with underscore - if( strpos( $first_name, '+') > -1 && strpos( $full_name, '+' ) > -1 ){ - $difficulties++; - $full_name = str_replace('-', '_', $full_name ); - } - if( strpos( $last_name, '-') > -1 || strpos( $first_name, '-') > -1 || strpos( $full_name, '-') > -1 ){ - $difficulties++; - } - // if name has space, replace with dash - $full_name_slug = str_replace( ' ' , '+', $full_name_slug ); - $full_name_slug = str_replace( '-' , '+', $full_name_slug ); - - // if name has period - if( strpos( $last_name, '.') > -1 && strpos( $full_name, '.' ) > -1 ){ - $difficulties++; - } - - $full_name_slug = str_replace( '.' , '+', $full_name_slug ); - $full_name_slug = str_replace( '++' , '+', $full_name_slug ); - - $user_in_url = $full_name_slug; - - break; - } - - return $user_in_url ; - - } - - /*** - *** @get action url for admin use - ***/ - function admin_act_url( $action, $subaction ) { - $url = $this->get_current_url(); - $url = add_query_arg( 'um_adm_action', $action, $url ); - $url = add_query_arg( 'sub', $subaction, $url ); - $url = add_query_arg( 'user_id', um_user('ID'), $url ); - return $url; - } - -} diff --git a/core/um-profile.php b/core/um-profile.php deleted file mode 100644 index b2bc6b72..00000000 --- a/core/um-profile.php +++ /dev/null @@ -1,207 +0,0 @@ - $tab ) { - if( !$this->can_view_tab( $id ) ) { - unset( $tabs[$id] ); - } - } - } - - return $tabs; - } - - /*** - *** @tabs that are active - ***/ - function tabs_active(){ - $tabs = $this->tabs(); - foreach( $tabs as $id => $info ) { - if ( !um_get_option('profile_tab_'.$id) && !isset( $info['_builtin'] ) && !isset( $info['custom'] ) ) - unset( $tabs[$id] ); - } - return $tabs; - } - - /*** - *** @primary tabs only - ***/ - function tabs_primary(){ - $tabs = $this->tabs(); - foreach( $tabs as $id => $info ){ - if ( isset( $info['name'] ) ) { - $primary[$id] = $info['name']; - } - } - return $primary; - } - - /*** - *** @Activated tabs in backend - ***/ - function tabs_enabled(){ - $tabs = $this->tabs(); - foreach( $tabs as $id => $info ){ - if ( isset( $info['name'] ) ) { - if ( um_get_option('profile_tab_'.$id) || isset( $info['_builtin'] ) ) { - $primary[$id] = $info['name']; - } - } - } - return ( isset( $primary ) ) ? $primary : ''; - } - - /*** - *** @Privacy options - ***/ - function tabs_privacy() { - $privacy = array( - 0 => 'Anyone', - 1 => 'Guests only', - 2 => 'Members only', - 3 => 'Only the owner', - 4 => 'Specific roles' - ); - - return $privacy; - } - - /*** - *** @Check if the user can view the current tab - ***/ - function can_view_tab( $tab ) { - global $ultimatemember; - - $privacy = intval( um_get_option( 'profile_tab_' . $tab . '_privacy' ) ); - $can_view = false; - - switch( $privacy ) { - case 1: - $can_view = is_user_logged_in() ? false : true; - break; - - case 2: - $can_view = is_user_logged_in() ? true : false; - break; - - case 3: - $can_view = get_current_user_id() == um_user( 'ID' ) ? true : false; - break; - - case 4: - $can_view = false; - if( is_user_logged_in() ) { - $roles = um_get_option( 'profile_tab_' . $tab . '_roles' ); - if( is_array( $roles ) - && in_array( $ultimatemember->user->get_role(), $roles ) ) { - $can_view = true; - } - } - break; - - default: - $can_view = true; - break; - } - - return $can_view; - } - - /*** - *** @Get active_tab - ***/ - function active_tab() { - - $this->active_tab = um_get_option('profile_menu_default_tab'); - - if ( get_query_var('profiletab') ) { - $this->active_tab = get_query_var('profiletab'); - } - - $this->active_tab = apply_filters( 'um_profile_active_tab', $this->active_tab ); - - return $this->active_tab; - } - - /*** - *** @Get active active_subnav - ***/ - function active_subnav() { - - $this->active_subnav = null; - - if ( get_query_var('subnav') ) { - $this->active_subnav = get_query_var('subnav'); - } - - return $this->active_subnav; - } - - /*** - *** @Show meta in profile - ***/ - function show_meta( $array ) { - global $ultimatemember; - $output = ''; - - if( isset( $array ) ){ - foreach( $array as $key ) { - $data = ''; - if ( $key && um_filtered_value( $key ) ) { - - if ( isset( $ultimatemember->builtin->all_user_fields[ $key ] ) ){ - $data = $ultimatemember->builtin->all_user_fields[ $key ]; - } - - if ( isset( $data['icon'] ) ) { - $icon = $data['icon']; - } else { - $icon = ''; - } - - $data['in_profile_meta'] = true; - - $icon = ( isset( $icon ) && !empty( $icon ) ) ? '' : ''; - - if ( !um_get_option('profile_show_metaicon') ){ - $icon = ''; - } - - $value = um_filtered_value( $key, $data ); - - $items[] = '' . $icon . $value . ''; - $items[] = ''; - - } - } - } - if ( isset( $items ) ) { - array_pop($items); - foreach( $items as $item ) { - $output .= $item; - } - } - - return $output; - } - -} diff --git a/core/um-query.php b/core/um-query.php deleted file mode 100644 index bbd646ef..00000000 --- a/core/um-query.php +++ /dev/null @@ -1,428 +0,0 @@ -wp_pages ) && ! empty( $this->wp_pages ) ){ - return $this->wp_pages; - } - - $count_pages = wp_count_posts('page'); - - if ( $count_pages->publish > 300 ){ - return 'reached_maximum_limit'; - } - - - $pages = $wpdb->get_results('SELECT * FROM '.$wpdb->posts.' WHERE post_type = "page" AND post_status = "publish" ', OBJECT); - - $array = array(); - if( $wpdb->num_rows > 0 ){ - foreach ($pages as $page_data) { - $array[ $page_data->ID ] = $page_data->post_title; - } - } - - $this->wp_pages = $array; - - return $array; - } - - /*** - *** @get all forms - ***/ - function forms() { - - $args = array( - 'post_type' => 'um_form', - 'posts_per_page' => 200, - 'post_status' => array('publish') - ); - - $query = new WP_Query( $args ); - foreach( $query->posts as $post ) { - setup_postdata( $post ); - $results[ $post->ID ] = $post->post_title; - } - return $results; - - } - - /*** - *** @get all post types - ***/ - function get_post_types() { - $array = get_post_types(); - foreach( $array as $k => $v ) { - $this->get_post_types[] = $k; - } - } - - /*** - *** @Do custom queries - ***/ - function make( $args ) { - - $defaults = array( - 'post_type' => 'post', - 'post_status' => array('publish') - ); - $args = wp_parse_args( $args, $defaults ); - - if ( isset( $args['post__in'] ) && empty( $args['post__in'] ) ) - return false; - - extract( $args ); - - if ( $post_type == 'comment' ) { // comments - - unset( $args['post_type'] ); - - $args['type__not_in'] = apply_filters( 'um_excluded_comment_types', array('') ); - - $comments = get_comments($args); - return $comments; - - } else { - - $custom_posts = new WP_Query(); - $custom_posts->query( $args ); - return $custom_posts; - - } - - } - - /*** - *** @Get last users - ***/ - function get_recent_users($number = 5){ - global $wpdb; - - $args = array( 'fields' => 'ID', 'number' => $number, 'orderby' => 'user_registered', 'order' => 'desc' ); - - $users = new WP_User_Query( $args ); - return $users->results; - } - - /*** - *** @Count users by status - ***/ - function count_users_by_status( $status ) { - $args = array( 'fields' => 'ID', 'number' => 0 ); - if ( $status == 'unassigned' ) { - $args['meta_query'][] = array(array('key' => 'account_status','compare' => 'NOT EXISTS')); - $users = new WP_User_Query( $args ); - foreach( $users->results as $user ) { - update_user_meta( $user, 'account_status', 'approved' ); - } - } else { - $args['meta_query'][] = array(array('key' => 'account_status','value' => $status,'compare' => '=')); - } - $users = new WP_User_Query( $args ); - return count($users->results); - } - - /*** - *** @Get users by status - ***/ - function get_users_by_status($status, $number = 5){ - global $wpdb; - - $args = array( 'fields' => 'ID', 'number' => $number, 'orderby' => 'user_registered', 'order' => 'desc' ); - - $args['meta_query'][] = array( - array( - 'key' => 'account_status', - 'value' => $status, - 'compare' => '=' - ) - ); - - $users = new WP_User_Query( $args ); - return $users->results; - } - - /*** - *** @get user's role - ***/ - function get_role_by_userid( $user_id ) { - $role = get_user_meta( $user_id, 'role', true ); - if ( !$role ) { - if ( $user_id == get_current_user_id() && current_user_can('edit_users') ) { - $role = 'admin'; - } else { - $role = 'member'; - } - } - return $role; - } - - /*** - *** @Count all users - ***/ - function count_users(){ - $result = count_users(); - return $result['total_users']; - } - - /*** - *** @Count users of specific role - ***/ - function count_users_by_role($role){ - global $wpdb; - - $args['fields'] = 'ID'; - $args['meta_query'] = array( - array( - 'key' => 'role', - 'value' => $role, - 'compare' => '=' - ) - ); - - $users = new WP_User_Query( $args ); - - return count($users->results); - } - - /*** - *** @Using wpdb instead of update_post_meta - ***/ - function update_attr( $key, $post_id, $new_value ){ - update_post_meta( $post_id, '_um_' . $key, $new_value ); - } - - /*** - *** @get data - ***/ - function get_attr( $key, $post_id ){ - $meta = get_post_meta( $post_id, '_um_' . $key, true ); - return $meta; - } - - /*** - *** @delete data - ***/ - function delete_attr( $key, $post_id ){ - $meta = delete_post_meta( $post_id, '_um_' . $key ); - return $meta; - } - - /*** - *** @Checks if post has a specific meta key - ***/ - function has_post_meta($key, $value=null, $post_id=null ){ - if (!$post_id){ - global $post; - $post_id = $post->ID; - } - if ($value ){ - if ( get_post_meta($post_id, $key, true) == $value ) - return true; - } else { - if ( get_post_meta($post_id, $key, true) ) - return true; - } - return false; - } - - /*** - *** @Get posts with specific meta key/value - ***/ - function find_post_id($post_type, $key, $value){ - $posts = get_posts( array( 'post_type' => $post_type, 'meta_key' => $key, 'meta_value' => $value ) ); - if ( isset($posts[0]) && !empty($posts) ) - return $posts[0]->ID; - return false; - } - - /*** - *** @Get role data - ***/ - function role_data( $role_slug ) { - global $wpdb, $ultimatemember; - - if ( get_option("um_cached_role_{$role_slug}") ) { - return get_option("um_cached_role_{$role_slug}"); - } - - if ($role_slug == 'admin' || $role_slug == 'member'){ - $try = $this->find_post_id('um_role','_um_core',$role_slug); - if ( isset( $try ) ){ - $post_id = $try; - $real_role_slug = $role_slug; - } - } else { - $post_id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'um_role' AND post_name = '$role_slug'"); - $real_role_slug = $role_slug; - } - - if ( isset($post_id) && $post_id != '' ){ - $meta = get_post_custom( $post_id ); - $array['role'] = $real_role_slug; - foreach ($meta as $k => $v){ - if ( strstr($k, '_um_') ) { - $k = str_replace('_um_', '', $k); - $array[$k] = $v[0]; - } - - } - } else { - - // no permissions, something wrong - $array = $ultimatemember->setup->get_initial_permissions( $role_slug ); - - } - - if ( !get_option("um_cached_role_{$role_slug}") ) { - update_option("um_cached_role_{$role_slug}", $array ); - } - - return $array; - } - - /*** - *** @Get post data - ***/ - function post_data( $post_id ) { - $array['form_id'] = $post_id; - $mode = $this->get_attr('mode', $post_id); - $meta = get_post_custom( $post_id ); - foreach ($meta as $k => $v){ - if ( strstr($k, '_um_'.$mode.'_' ) ) { - $k = str_replace('_um_'.$mode.'_', '', $k); - $array[$k] = $v[0]; - } elseif ($k == '_um_mode'){ - $k = str_replace('_um_', '', $k); - $array[$k] = $v[0]; - } elseif ( strstr($k, '_um_') ) { - $k = str_replace('_um_', '', $k); - $array[$k] = $v[0]; - } - - } - - foreach( $array as $k => $v ) { - if ( strstr( $k, 'login_') || strstr( $k, 'register_' ) || strstr( $k, 'profile_' ) ){ - if ( $mode != 'directory' ) { - unset($array[$k]); - } - } - } - return $array; - } - - /*** - *** @Capture selected value - ***/ - function get_meta_value($key, $array_key=null, $fallback = null){ - global $post; - $post_id = get_the_ID(); - $try = get_post_meta( $post_id, $key, true); - - if (isset($try) && !empty($try)) - if (is_array($try) && in_array($array_key, $try) ){ - return $array_key; - } else if ( is_array( $try ) ) { - return ''; - } else { - return $try; - } - - if ($fallback == 'na') { - $fallback = 0; - $none = ''; - } else { - $none = 0; - } - return (!empty($fallback)) ? $fallback : $none; - } - - /*** - *** @Checks if its a core page of UM - ***/ - function is_core( $post_id ){ - $is_core = get_post_meta($post_id, '_um_core', true); - if ( $is_core != '' ) { - return $is_core; - } else { - return false; - } - } - - /*** - *** @Query for UM roles - ***/ - function get_roles( $add_default = false, $exclude = null ){ - - $exclude_str = ''; - - if( ! is_null( $exclude ) && is_array( $exclude ) ){ - $exclude_str = implode('_', $exclude ); - } - - if( isset( $this->roles['is_add_default_'.$add_default ][ 'is_exclude_'.$exclude_str ] ) ){ - return $this->roles['is_add_default_'.$add_default ][ 'is_exclude_'.$exclude_str ]; - } - - $roles = array(); - - if ( $add_default ) { - $roles[0] = $add_default; - } - - $args = array( - 'post_type' => 'um_role', - 'posts_per_page' => -1, - 'post_status' => array('publish') - ); - - $posts = get_posts($args); - - if ( $posts ){ - - foreach($posts as $post) { - - if ( $this->is_core( $post->ID ) ){ - $roles[ $this->is_core( $post->ID ) ] = $post->post_title; - } else { - $roles[ $post->post_name ] = $post->post_title; - } - - } - - } else { - - $roles['member'] = 'Member'; - $roles['admin'] = 'Admin'; - - } - - if ( $exclude ) { - foreach( $exclude as $role ) { - unset($roles[$role]); - } - } - - $this->roles['is_add_default_'.$add_default ][ 'is_exclude_'.$exclude_str ] = $roles; - - return $roles; - - } - -} diff --git a/core/um-register.php b/core/um-register.php deleted file mode 100644 index 8194e027..00000000 --- a/core/um-register.php +++ /dev/null @@ -1,31 +0,0 @@ -permalinks->core['user'] ) ) { - - $user_page_id = $ultimatemember->permalinks->core['user']; - $account_page_id = $ultimatemember->permalinks->core['account']; - $user = get_post($user_page_id); - - if ( isset( $user->post_name ) ) { - - $user_slug = $user->post_name; - $account = get_post($account_page_id); - $account_slug = $account->post_name; - - $add_lang_code = ''; - $language_code = ''; - - if ( function_exists('icl_object_id') || function_exists('icl_get_current_language') ) { - - if( function_exists('icl_get_current_language') ){ - $language_code = icl_get_current_language(); - }else if( function_exists('icl_object_id') && defined('ICL_LANGUAGE_CODE') ){ - $language_code = ICL_LANGUAGE_CODE; - } - - // User page translated slug - $lang_post_id = icl_object_id( $user->ID, 'post', FALSE, $language_code ); - $lang_post_obj = get_post( $lang_post_id ); - if( isset( $lang_post_obj->post_name ) ){ - $user_slug = $lang_post_obj->post_name; - } - - // Account page translated slug - $lang_post_id = icl_object_id( $account->ID, 'post', FALSE, $language_code ); - $lang_post_obj = get_post( $lang_post_id ); - if( isset( $lang_post_obj->post_name ) ){ - $account_slug = $lang_post_obj->post_name; - } - - if( $language_code != icl_get_default_language() ){ - $add_lang_code = $language_code; - } - - } - - add_rewrite_rule( $user_slug.'/([^/]+)/?$', - 'index.php?page_id='.$user_page_id.'&um_user=$matches[1]&lang='.$add_lang_code, - 'top' - ); - - add_rewrite_rule( $account_slug.'/([^/]+)?$', - 'index.php?page_id='.$account_page_id.'&um_tab=$matches[1]&lang='.$add_lang_code, - 'top' - ); - - if( !apply_filters('um_rewrite_flush_rewrite_rules', um_get_option('um_flush_stop') ) ) - flush_rewrite_rules( true ); - - } - - } - - } - - /*** - *** @author page to user profile redirect - ***/ - function redirect_author_page() { - if ( um_get_option('author_redirect') && is_author() ) { - $id = get_query_var( 'author' ); - um_fetch_user( $id ); - exit( wp_redirect( um_user_profile_url() ) ); - } - } - - /*** - *** @locate/display a profile - ***/ - function locate_user_profile() { - global $post, $ultimatemember; - - if ( um_queried_user() && um_is_core_page('user') ) { - - if ( um_get_option('permalink_base') == 'user_login' ) { - - $user_id = username_exists( um_queried_user() ); - - // Try nice name - if ( !$user_id ) { - $slug = um_queried_user(); - $slug = str_replace('.','-',$slug); - $the_user = get_user_by( 'slug', $slug ); - if ( isset( $the_user->ID ) ){ - $user_id = $the_user->ID; - } - - if( !$user_id ){ - $user_id = $ultimatemember->user->user_exists_by_email_as_username( um_queried_user() ); - } - - if( !$user_id ){ - $user_id = $ultimatemember->user->user_exists_by_email_as_username( $slug ); - } - - } - - } - - if ( um_get_option('permalink_base') == 'user_id' ) { - $user_id = $ultimatemember->user->user_exists_by_id( um_queried_user() ); - - } - - if ( in_array( um_get_option('permalink_base'), array('name','name_dash','name_dot','name_plus') ) ) { - $user_id = $ultimatemember->user->user_exists_by_name( um_queried_user() ); - - } - - /** USER EXISTS SET USER AND CONTINUE **/ - - if ( $user_id ) { - - um_set_requested_user( $user_id ); - - do_action('um_access_profile', $user_id ); - - } else { - - exit( wp_redirect( um_get_core_page('user') ) ); - - } - - } else if ( um_is_core_page('user') ) { - - if ( is_user_logged_in() ) { // just redirect to their profile - - $query = $ultimatemember->permalinks->get_query_array(); - - $url = um_user_profile_url(); - - if ( $query ) { - foreach( $query as $key => $val ) { - $url = add_query_arg($key, $val, $url); - } - } - - exit( wp_redirect( $url ) ); - }else{ - - $redirect_to = apply_filters('um_locate_user_profile_not_loggedin__redirect', home_url() ); - if( ! empty( $redirect_to ) ){ - exit( wp_redirect( $redirect_to ) ); - } - - } - - } - - } - - -} diff --git a/core/um-setup.php b/core/um-setup.php deleted file mode 100644 index ee9fc079..00000000 --- a/core/um-setup.php +++ /dev/null @@ -1,492 +0,0 @@ -core_forms = array( - 'register', - 'login', - 'profile', - ); - - $this->core_directories = array( - 'members', - ); - - $this->core_pages = array( - 'user' => array( 'title' => 'User' ), - 'login' => array( 'title' => 'Login' ), - 'register' => array( 'title' => 'Register' ), - 'members' => array( 'title' => 'Members' ), - 'logout' => array( 'title' => 'Logout' ), - 'account' => array( 'title' => 'Account' ), - 'password-reset' => array( 'title' => 'Password Reset'), - ); - - $this->core_directory_meta['members'] = array( - '_um_template' => 'members', - '_um_mode' => 'directory', - '_um_has_profile_photo' => 0, - '_um_has_cover_photo' => 0, - '_um_show_social' => 0, - '_um_show_userinfo' => 0, - '_um_show_tagline' => 0, - '_um_search' => 0, - '_um_userinfo_animate' => '1', - '_um_sortby' => 'user_registered_desc', - '_um_profile_photo' => '1', - '_um_cover_photos' => '1', - '_um_show_name' => '1', - '_um_directory_header' => __('{total_users} Members','ultimate-member'), - '_um_directory_header_single' => __('{total_users} Member','ultimate-member'), - '_um_directory_no_users' => __('We are sorry. We cannot find any users who match your search criteria.','ultimate-member'), - '_um_profiles_per_page' => 12, - '_um_profiles_per_page_mobile' => 6, - '_um_core' => 'members', - ); - - $this->core_global_meta_all = array( - '_um_primary_btn_color', - '_um_primary_btn_hover', - '_um_primary_btn_text', - '_um_secondary_btn_color', - '_um_secondary_btn_hover', - '_um_secondary_btn_text', - '_um_form_border', - '_um_form_border_hover', - '_um_form_bg_color', - '_um_form_bg_color_focus', - '_um_form_placeholder', - '_um_form_icon_color', - '_um_form_asterisk_color', - '_um_form_field_label', - '_um_form_text_color', - '_um_active_color', - '_um_help_tip_color', - '_um_secondary_color', - ); - - $this->core_form_meta_all = array( - '_um_help_tip_color' => '#ccc', - '_um_active_color' => '#3ba1da', - '_um_secondary_color' => '#44b0ec', - '_um_form_text_color' => '#666', - '_um_form_field_label' => '#555', - '_um_form_icon_color' => '#aaa', - '_um_form_asterisk_color' => '#aaa', - '_um_form_bg_color' => '#fff', - '_um_form_bg_color_focus' => '#fff', - '_um_form_placeholder' => '#aaa', - '_um_form_border' => '2px solid #ddd', - '_um_form_border_hover' => '2px solid #bbb', - '_um_primary_btn_color' => '#3ba1da', - '_um_primary_btn_hover' => '#44b0ec', - '_um_primary_btn_text' => '#fff', - '_um_secondary_btn_color' => '#eee', - '_um_secondary_btn_hover' => '#e5e5e5', - '_um_secondary_btn_text' => '#666', - '_um_profile_show_name' => 1, - '_um_profile_show_social_links' => 0, - '_um_profile_show_bio' => 1, - 'profile_show_html_bio' => 0, - '_um_profile_bio_maxchars' => 180, - '_um_profile_header_menu' => 'bc', - '_um_profile_empty_text' => 1, - '_um_profile_empty_text_emo' => 1, - '_um_profile_role' => '0', - '_um_profile_template' => 'profile', - '_um_profile_max_width' => '1000px', - '_um_profile_area_max_width' => '600px', - '_um_profile_align' => 'center', - '_um_profile_icons' => 'label', - '_um_profile_cover_enabled' => 1, - '_um_profile_cover_ratio' => '2.7:1', - '_um_profile_photosize' => '190px', - '_um_profile_photocorner' => '1', - '_um_profile_header_bg' => '', - '_um_profile_header_text' => '#999', - '_um_profile_header_link_color' => '#555', - '_um_profile_header_link_hcolor' => '#444', - '_um_profile_header_icon_color' => '#aaa', - '_um_profile_header_icon_hcolor' => '#3ba1da', - '_um_profile_primary_btn_word' => 'Update Profile', - '_um_profile_primary_btn_color' => '#3ba1da', - '_um_profile_primary_btn_hover' => '#44b0ec', - '_um_profile_primary_btn_text' => '#fff', - '_um_profile_secondary_btn' => '1', - '_um_profile_secondary_btn_word' => 'Cancel', - '_um_profile_secondary_btn_color' => '#eee', - '_um_profile_secondary_btn_hover' => '#e5e5e5', - '_um_profile_secondary_btn_text' => '#666', - '_um_profile_main_bg' => '', - '_um_profile_main_text_color' => '#555555', - '_um_register_role' => '0', - '_um_register_template' => 'register', - '_um_register_max_width' => '450px', - '_um_register_align' => 'center', - '_um_register_icons' => 'label', - '_um_register_primary_btn_word' => __('Register','ultimate-member'), - '_um_register_primary_btn_color' => '#3ba1da', - '_um_register_primary_btn_hover' => '#44b0ec', - '_um_register_primary_btn_text' => '#fff', - '_um_register_secondary_btn' => 1, - '_um_register_secondary_btn_word' => __('Login','ultimate-member'), - '_um_register_secondary_btn_color' => '#eee', - '_um_register_secondary_btn_hover' => '#e5e5e5', - '_um_register_secondary_btn_text' => '#666', - '_um_register_secondary_btn_url' => '', - '_um_login_template' => 'login', - '_um_login_max_width' => '450px', - '_um_login_align' => 'center', - '_um_login_icons' => 'label', - '_um_login_primary_btn_word' => __('Login','ultimate-member'), - '_um_login_primary_btn_color' => '#3ba1da', - '_um_login_primary_btn_hover' => '#44b0ec', - '_um_login_primary_btn_text' => '#fff', - '_um_login_forgot_pass_link' => 1, - '_um_login_show_rememberme' => 1, - '_um_login_secondary_btn' => 1, - '_um_login_secondary_btn_word' => __('Register','ultimate-member'), - '_um_login_secondary_btn_color' => '#eee', - '_um_login_secondary_btn_hover' => '#e5e5e5', - '_um_login_secondary_btn_text' => '#666', - '_um_login_secondary_btn_url' => '', - '_um_directory_template' => 'members', - '_um_directory_header' => __('{total_users} Members','ultimate-member'), - '_um_directory_header_single' => __('{total_users} Member','ultimate-member'), - ); - - $this->core_form_meta_all = apply_filters('um_core_form_meta_all', $this->core_form_meta_all ); - - $this->core_form_meta['register'] = array( - '_um_custom_fields' => 'a:6:{s:10:"user_login";a:15:{s:5:"title";s:8:"Username";s:7:"metakey";s:10:"user_login";s:4:"type";s:4:"text";s:5:"label";s:8:"Username";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";i:0;s:8:"validate";s:15:"unique_username";s:9:"min_chars";i:3;s:9:"max_chars";i:24;s:8:"position";s:1:"1";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:10:"user_email";a:13:{s:5:"title";s:14:"E-mail Address";s:7:"metakey";s:10:"user_email";s:4:"type";s:4:"text";s:5:"label";s:14:"E-mail Address";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";i:1;s:8:"validate";s:12:"unique_email";s:8:"position";s:1:"4";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:13:"user_password";a:16:{s:5:"title";s:8:"Password";s:7:"metakey";s:13:"user_password";s:4:"type";s:8:"password";s:5:"label";s:8:"Password";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";i:1;s:9:"min_chars";i:8;s:9:"max_chars";i:30;s:15:"force_good_pass";i:1;s:18:"force_confirm_pass";i:1;s:8:"position";s:1:"5";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:10:"first_name";a:12:{s:5:"title";s:10:"First Name";s:7:"metakey";s:10:"first_name";s:4:"type";s:4:"text";s:5:"label";s:10:"First Name";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";i:1;s:8:"position";s:1:"2";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"last_name";a:12:{s:5:"title";s:9:"Last Name";s:7:"metakey";s:9:"last_name";s:4:"type";s:4:"text";s:5:"label";s:9:"Last Name";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";i:1;s:8:"position";s:1:"3";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}', - '_um_mode' => 'register', - '_um_core' => 'register', - '_um_register_use_globals' => 1, - ); - - $this->core_form_meta['login'] = array( - '_um_custom_fields' => 'a:3:{s:8:"username";a:13:{s:5:"title";s:18:"Username or E-mail";s:7:"metakey";s:8:"username";s:4:"type";s:4:"text";s:5:"label";s:18:"Username or E-mail";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";i:0;s:8:"validate";s:24:"unique_username_or_email";s:8:"position";s:1:"1";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:13:"user_password";a:16:{s:5:"title";s:8:"Password";s:7:"metakey";s:13:"user_password";s:4:"type";s:8:"password";s:5:"label";s:8:"Password";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";i:1;s:9:"min_chars";i:8;s:9:"max_chars";i:30;s:15:"force_good_pass";i:1;s:18:"force_confirm_pass";i:1;s:8:"position";s:1:"2";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}', - '_um_mode' => 'login', - '_um_core' => 'login', - '_um_login_use_globals' => 1, - ); - - $this->core_form_meta['profile'] = array( - '_um_custom_fields' => 'a:1:{s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}', - '_um_mode' => 'profile', - '_um_core' => 'profile', - '_um_profile_use_globals' => 1, - ); - - // admin permissions - $this->perms = array( - 'core' => 'admin', - 'can_access_wpadmin' => 1, - 'can_not_see_adminbar' => 0, - 'can_edit_everyone' => 1, - 'can_delete_everyone' => 1, - 'can_edit_profile' => 1, - 'can_delete_profile' => 1, - 'can_view_all' => 1, - 'can_make_private_profile' => 1, - 'can_access_private_profile' => 1, - 'default_homepage' => 1, - 'status' => 'approved', - 'auto_approve_act' => 'redirect_profile', - 'after_login' => 'redirect_admin', - 'after_logout' => 'redirect_home', - ); - - // non-admin permissions - $this->nonadmin_perms = array( - 'core' => 'member', - 'can_access_wpadmin' => 0, - 'can_not_see_adminbar' => 1, - 'can_edit_everyone' => 0, - 'can_delete_everyone' => 0, - 'can_make_private_profile' => 0, - 'can_access_private_profile' => 0, - 'after_login' => 'redirect_profile', - ); - - } - - /*** - *** @Get default permissions - ***/ - function get_initial_permissions( $role ) { - if ( $role == 'admin' ) { - $perms = $this->perms; - return $perms; - } else { - $perms = $this->perms; - $perms = array_merge($this->perms, $this->nonadmin_perms); - return $perms; - } - } - - /*** - *** @Basics - ***/ - function install_basics() { - if ( !get_option('__ultimatemember_sitekey') ) - update_option('__ultimatemember_sitekey', str_replace( array('http://','https://'), '', sanitize_user( get_bloginfo('url') ) ) . '-' . wp_generate_password( 20, false ) ); - } - - /*** - *** @Default Forms - ***/ - function install_default_forms(){ - global $wpdb, $ultimatemember; - - if ( current_user_can('manage_options') && um_user('ID') && !get_option('um_is_installed') ) { - - update_option('um_is_installed', 1); - - // Install Core Forms - foreach($this->core_forms as $id ) { - - /** - If page does not exist - Create it - **/ - $page_exists = $ultimatemember->query->find_post_id('um_form','_um_core', $id); - if ( !$page_exists ) { - - if ( $id == 'register' ) { - $title = 'Default Registration'; - } else if ( $id == 'login' ) { - $title = 'Default Login'; - } else { - $title = 'Default Profile'; - } - - $form = array( - 'post_type' => 'um_form', - 'post_title' => $title, - 'post_status' => 'publish', - 'post_author' => um_user('ID'), - ); - - $form_id = wp_insert_post( $form ); - - foreach( $this->core_form_meta[$id] as $key => $value ) { - if ( $key == '_um_custom_fields' ) { - $array = unserialize( $value ); - update_post_meta( $form_id, $key, $array ); - } else { - update_post_meta($form_id, $key, $value); - } - } - - $this->setup_shortcode[$id] = '[ultimatemember form_id='.$form_id.']'; - - $core_forms[ $form_id ] = $form_id; - - } - /** DONE **/ - - } - if ( isset( $core_forms ) ) update_option('um_core_forms', $core_forms); - - // Install Core Directories - foreach($this->core_directories as $id ) { - - /** - If page does not exist - Create it - **/ - $page_exists = $ultimatemember->query->find_post_id('um_directory','_um_core', $id); - if ( !$page_exists ) { - - $title = 'Members'; - - $form = array( - 'post_type' => 'um_directory', - 'post_title' => $title, - 'post_status' => 'publish', - 'post_author' => um_user('ID'), - ); - - $form_id = wp_insert_post( $form ); - - foreach( $this->core_directory_meta[$id] as $key => $value ) { - if ( $key == '_um_custom_fields' ) { - $array = unserialize( $value ); - update_post_meta( $form_id, $key, $array ); - } else { - update_post_meta($form_id, $key, $value); - } - } - - $this->setup_shortcode[$id] = '[ultimatemember form_id='.$form_id.']'; - - $core_directories[ $form_id ] = $form_id; - - } - /** DONE **/ - - } - if ( isset( $core_directories ) ) update_option('um_core_directories', $core_directories); - - // Install Core Pages - foreach($this->core_pages as $slug => $array ) { - - /** - If page does not exist - Create it - **/ - $page_exists = $ultimatemember->query->find_post_id('page','_um_core', $slug); - if ( !$page_exists ) { - - if ( $slug == 'logout' ) { - $content = ''; - } else if ( $slug == 'account' ) { - $content = '[ultimatemember_account]'; - } else if ( $slug == 'password-reset' ) { - $content = '[ultimatemember_password]'; - } else if ( $slug == 'user' ){ - $content = $this->setup_shortcode['profile']; - } else { - $content = $this->setup_shortcode[$slug]; - } - - $user_page = array( - 'post_title' => $array['title'], - 'post_content' => $content, - 'post_name' => $slug, - 'post_type' => 'post', - 'post_status' => 'publish', - 'post_author' => um_user('ID'), - 'comment_status' => 'closed' - ); - - $post_id = wp_insert_post( $user_page ); - wp_update_post( array('ID' => $post_id, 'post_type' => 'page' ) ); - - update_post_meta($post_id, '_um_core', $slug); - - $core_pages[ $slug ] = $post_id; - - } - /** DONE **/ - - } - if ( isset( $core_pages ) ) { - update_option('um_core_pages', $core_pages); - $options = get_option('um_options'); - foreach( $core_pages as $o_slug => $page_id ) { - $options['core_' . $o_slug] = $page_id; - } - if ( isset( $options ) ) { - update_option('um_options', $options ); - } - } - - } - - } - - /*** - *** @First setup of core roles - ***/ - function install_default_roles(){ - - if ( !get_option('um_first_setup_roles') ) { - - update_option('um_first_setup_roles', 1); - - $users = get_users( array('fields' => 'ID') ); - foreach( $users as $id ) { - - delete_user_meta( $id, 'account_status' ); - delete_user_meta( $id, 'role' ); - - update_user_meta( $id, 'account_status', 'approved' ); - - if ( !is_super_admin( $id ) ) { - if ( is_numeric( $id ) ) { - update_user_meta( $id, 'role', 'member' ); - } - } else { - if ( is_numeric( $id ) ) { - update_user_meta( $id, 'role', 'admin' ); - } - } - - } - - } - - if ( !get_option('um_hashed_passwords_fix') ) { - update_option('um_hashed_passwords_fix', 1); - $users = get_users( array('fields' => 'ID') ); - foreach( $users as $id ) { - delete_user_meta( $id, '_um_cool_but_hard_to_guess_plain_pw' ); - } - } - - } - - /*** - *** @Build default roles - ***/ - function install_posts_roles(){ - - global $wpdb, $ultimatemember; - - if ( !isset( $ultimatemember->query ) || ! method_exists( $ultimatemember->query, 'get_roles' ) ) { - return; - } else { - //die('Method loaded!'); - } - - $admin = $ultimatemember->query->find_post_id('um_role','_um_core','admin'); - - if ( !$admin && current_user_can('manage_options') && um_user('ID') ){ - - $admin_role = array( - 'post_title' => 'Admin', - 'post_name' => 'admin', - 'post_type' => 'um_role', - 'post_status' => 'publish', - 'post_author' => um_user('ID'), - ); - - $post_id = wp_insert_post( $admin_role ); - - foreach( $this->get_initial_permissions('admin') as $key => $value ) update_post_meta($post_id, "_um_" . $key, $value); - - } - - $member = $ultimatemember->query->find_post_id('um_role','_um_core','member'); - - if ( !$member && current_user_can('manage_options') && um_user('ID') ){ - - $member_role = array( - 'post_title' => 'Member', - 'post_name' => 'member', - 'post_type' => 'um_role', - 'post_status' => 'publish', - 'post_author' => um_user('ID'), - ); - - $post_id = wp_insert_post( $member_role ); - - foreach( $this->get_initial_permissions('member') as $key => $value ) update_post_meta($post_id, "_um_" . $key, $value); - - } - - } - -} diff --git a/core/um-shortcodes.php b/core/um-shortcodes.php deleted file mode 100644 index a6b49f3c..00000000 --- a/core/um-shortcodes.php +++ /dev/null @@ -1,609 +0,0 @@ -message_mode = false; - - $this->loop = ''; - - add_shortcode('ultimatemember', array(&$this, 'ultimatemember' ), 1); - - add_shortcode('um_loggedin', array(&$this, 'um_loggedin')); - add_shortcode('um_loggedout', array(&$this, 'um_loggedout')); - add_shortcode('um_show_content', array(&$this, 'um_shortcode_show_content_for_role') ); - add_shortcode('ultimatemember_searchform', array(&$this, 'ultimatemember_searchform') ); - - - add_filter('body_class', array(&$this, 'body_class'), 0); - - $base_uri = apply_filters('um_emoji_base_uri', 'https://s.w.org/images/core/emoji/'); - - $this->emoji[':)'] = $base_uri . '72x72/1f604.png'; - $this->emoji[':smiley:'] = $base_uri . '72x72/1f603.png'; - $this->emoji[':D'] = $base_uri . '72x72/1f600.png'; - $this->emoji[':$'] = $base_uri . '72x72/1f60a.png'; - $this->emoji[':relaxed:'] = $base_uri . '72x72/263a.png'; - $this->emoji[';)'] = $base_uri . '72x72/1f609.png'; - $this->emoji[':heart_eyes:'] = $base_uri . '72x72/1f60d.png'; - $this->emoji[':kissing_heart:'] = $base_uri . '72x72/1f618.png'; - $this->emoji[':kissing_closed_eyes:'] = $base_uri . '72x72/1f61a.png'; - $this->emoji[':kissing:'] = $base_uri . '72x72/1f617.png'; - $this->emoji[':kissing_smiling_eyes:'] = $base_uri . '72x72/1f619.png'; - $this->emoji[';P'] = $base_uri . '72x72/1f61c.png'; - $this->emoji[':P'] = $base_uri . '72x72/1f61b.png'; - $this->emoji[':stuck_out_tongue_closed_eyes:'] = $base_uri . '72x72/1f61d.png'; - $this->emoji[':flushed:'] = $base_uri . '72x72/1f633.png'; - $this->emoji[':grin:'] = $base_uri . '72x72/1f601.png'; - $this->emoji[':pensive:'] = $base_uri . '72x72/1f614.png'; - $this->emoji[':relieved:'] = $base_uri . '72x72/1f60c.png'; - $this->emoji[':unamused'] = $base_uri . '72x72/1f612.png'; - $this->emoji[':('] = $base_uri . '72x72/1f61e.png'; - $this->emoji[':persevere:'] = $base_uri . '72x72/1f623.png'; - $this->emoji[":'("] = $base_uri . '72x72/1f622.png'; - $this->emoji[':joy:'] = $base_uri . '72x72/1f602.png'; - $this->emoji[':sob:'] = $base_uri . '72x72/1f62d.png'; - $this->emoji[':sleepy:'] = $base_uri . '72x72/1f62a.png'; - $this->emoji[':disappointed_relieved:'] = $base_uri . '72x72/1f625.png'; - $this->emoji[':cold_sweat:'] = $base_uri . '72x72/1f630.png'; - $this->emoji[':sweat_smile:'] = $base_uri . '72x72/1f605.png'; - $this->emoji[':sweat:'] = $base_uri . '72x72/1f613.png'; - $this->emoji[':weary:'] = $base_uri . '72x72/1f629.png'; - $this->emoji[':tired_face:'] = $base_uri . '72x72/1f62b.png'; - $this->emoji[':fearful:'] = $base_uri . '72x72/1f628.png'; - $this->emoji[':scream:'] = $base_uri . '72x72/1f631.png'; - $this->emoji[':angry:'] = $base_uri . '72x72/1f620.png'; - $this->emoji[':rage:'] = $base_uri . '72x72/1f621.png'; - $this->emoji[':triumph'] = $base_uri . '72x72/1f624.png'; - $this->emoji[':confounded:'] = $base_uri . '72x72/1f616.png'; - $this->emoji[':laughing:'] = $base_uri . '72x72/1f606.png'; - $this->emoji[':yum:'] = $base_uri . '72x72/1f60b.png'; - $this->emoji[':mask:'] = $base_uri . '72x72/1f637.png'; - $this->emoji[':cool:'] = $base_uri . '72x72/1f60e.png'; - $this->emoji[':sleeping:'] = $base_uri . '72x72/1f634.png'; - $this->emoji[':dizzy_face:'] = $base_uri . '72x72/1f635.png'; - $this->emoji[':astonished:'] = $base_uri . '72x72/1f632.png'; - $this->emoji[':worried:'] = $base_uri . '72x72/1f61f.png'; - $this->emoji[':frowning:'] = $base_uri . '72x72/1f626.png'; - $this->emoji[':anguished:'] = $base_uri . '72x72/1f627.png'; - $this->emoji[':smiling_imp:'] = $base_uri . '72x72/1f608.png'; - $this->emoji[':imp:'] = $base_uri . '72x72/1f47f.png'; - $this->emoji[':open_mouth:'] = $base_uri . '72x72/1f62e.png'; - $this->emoji[':grimacing:'] = $base_uri . '72x72/1f62c.png'; - $this->emoji[':neutral_face:'] = $base_uri . '72x72/1f610.png'; - $this->emoji[':confused:'] = $base_uri . '72x72/1f615.png'; - $this->emoji[':hushed:'] = $base_uri . '72x72/1f62f.png'; - $this->emoji[':no_mouth:'] = $base_uri . '72x72/1f636.png'; - $this->emoji[':innocent:'] = $base_uri . '72x72/1f607.png'; - $this->emoji[':smirk:'] = $base_uri . '72x72/1f60f.png'; - $this->emoji[':expressionless:'] = $base_uri . '72x72/1f611.png'; - - } - - /*** - *** @emoji support - */ - function emotize($content) { - $content = stripslashes($content); - foreach ($this->emoji as $code => $val) { - $regex = str_replace(array('(', ')'), array("\\" . '(', "\\" . ')'), $code); - $content = preg_replace('/(' . $regex . ')(\s|$)/', '' . $code . '$2', $content); - } - return $content; - } - - /*** - *** @extend body classes - */ - function body_class($classes) { - global $ultimatemember; - - $array = $ultimatemember->permalinks->core; - if (!$array) { - return $classes; - } - - foreach ($array as $slug => $info) { - if (um_is_core_page($slug)) { - - $classes[] = 'um-page-' . $slug; - - if (is_user_logged_in()) { - $classes[] = 'um-page-loggedin'; - } else { - $classes[] = 'um-page-loggedout'; - } - - } - } - - if( um_is_core_page('user') && um_is_user_himself() ){ - $classes[] = 'um-own-profile'; - } - - return $classes; - } - - /*** - *** @Retrieve core login form - */ - function core_login_form() { - $forms = get_posts(array('post_type' => 'um_form', 'posts_per_page' => 1, 'meta_key' => '_um_core', 'meta_value' => 'login')); - $form_id = isset( $forms[0]->ID ) ? $forms[0]->ID: 0; - - return $form_id; - } - - /*** - *** @load a compatible template - */ - function load_template($tpl) { - global $ultimatemember; - - $loop = ($this->loop) ? $this->loop : ''; - - if (isset($this->set_args) && is_array($this->set_args)) { - $args = $this->set_args; - extract($args); - } - - $file = um_path . 'templates/' . $tpl . '.php'; - $theme_file = get_stylesheet_directory() . '/ultimate-member/templates/' . $tpl . '.php'; - - if (file_exists($theme_file)) { - $file = $theme_file; - } - - if (file_exists($file)) { - include $file; - } - - } - - /*** - *** @Add class based on shortcode - */ - function get_class($mode, $args = array()) { - - global $ultimatemember; - - $classes = 'um-' . $mode; - - if (is_admin()) { - $classes .= ' um-in-admin'; - } - - if (isset($ultimatemember->form->errors) && $ultimatemember->form->errors) { - $classes .= ' um-err'; - } - - if ($ultimatemember->fields->editing == true) { - $classes .= ' um-editing'; - } - - if ($ultimatemember->fields->viewing == true) { - $classes .= ' um-viewing'; - } - - if (isset($args['template']) && $args['template'] != $args['mode']) { - $classes .= ' um-' . $args['template']; - } - - $classes = apply_filters('um_form_official_classes__hook', $classes); - return $classes; - } - - /*** - *** @Logged-in only content - */ - function um_loggedin($args = array(), $content = "") { - global $ultimatemember; - ob_start(); - - $defaults = array( - 'lock_text' => __('This content has been restricted to logged in users only. Please login to view this content.', 'ultimate-member'), - 'show_lock' => 'yes', - ); - - $args = wp_parse_args($args, $defaults); - - $args['lock_text'] = $this->convert_locker_tags($args['lock_text']); - - if (!is_user_logged_in()) { - if ($args['show_lock'] == 'no') { - echo ''; - } else { - $ultimatemember->shortcodes->set_args = $args; - $ultimatemember->shortcodes->load_template('login-to-view'); - } - } else { - echo do_shortcode($this->convert_locker_tags(wpautop($content))); - } - - $output = ob_get_contents(); - ob_end_clean(); - return $output; - } - - /*** - *** @Logged-out only content - */ - function um_loggedout($args = array(), $content = "") { - global $ultimatemember; - ob_start(); - - // Hide for logged in users - if (is_user_logged_in()) { - echo ''; - } else { - echo do_shortcode(wpautop($content)); - } - - $output = ob_get_contents(); - ob_end_clean(); - return $output; - } - - /*** - *** @Shortcode - */ - function ultimatemember($args = array()) { - return $this->load($args); - } - - /*** - *** @Load a module with global function - */ - function load($args) { - global $ultimatemember; - ob_start(); - - $defaults = array(); - $args = wp_parse_args($args, $defaults); - - // when to not continue - $this->form_id = (isset($args['form_id'])) ? $args['form_id'] : null; - if (!$this->form_id) { - return; - } - - $this->form_status = get_post_status($this->form_id); - if ($this->form_status != 'publish') { - return; - } - - // get data into one global array - $post_data = $ultimatemember->query->post_data($this->form_id); - - $args = apply_filters('um_pre_args_setup', $post_data); - - if (!isset($args['template'])) { - $args['template'] = ''; - } - - if (isset($post_data['template']) && $post_data['template'] != $args['template']) { - $args['template'] = $post_data['template']; - } - - if (!$this->template_exists($args['template'])) { - $args['template'] = $post_data['mode']; - } - - if (!isset($post_data['template'])) { - $post_data['template'] = $post_data['mode']; - } - - $args = array_merge($post_data, $args); - - if (isset($args['use_globals']) && $args['use_globals'] == 1) { - $args = array_merge($args, $this->get_css_args($args)); - } else { - $args = array_merge($this->get_css_args($args), $args); - } - - // filter for arguments - $args = apply_filters('um_shortcode_args_filter', $args); - - extract($args, EXTR_SKIP); - - // for profiles only - if ($mode == 'profile' && um_profile_id() && isset($args['role']) && $args['role'] && - $args['role'] != $ultimatemember->query->get_role_by_userid(um_profile_id())) { - return; - } - - // start loading the template here - do_action("um_pre_{$mode}_shortcode", $args); - - do_action("um_before_form_is_loaded", $args); - - do_action("um_before_{$mode}_form_is_loaded", $args); - - $this->template_load($template, $args); - - $this->dynamic_css($args); - - if (um_get_requested_user() || $mode == 'logout') { - um_reset_user(); - } - - do_action('um_after_everything_output'); - - $output = ob_get_contents(); - ob_end_clean(); - return $output; - } - - /*** - *** @Get dynamic css args - */ - function get_css_args($args) { - $arr = um_styling_defaults($args['mode']); - $arr = array_merge($arr, array('form_id' => $args['form_id'], 'mode' => $args['mode'])); - return $arr; - } - - /*** - *** @Load dynamic css - */ - function dynamic_css($args = array()) { - global $ultimatemember; - extract($args); - - $global = um_path . 'assets/dynamic_css/dynamic_global.php'; - - if (isset($mode)) { - $file = um_path . 'assets/dynamic_css/dynamic_' . $mode . '.php'; - } - - include $global; - - if (isset($file) && file_exists($file)) { - include $file; - } - - if (isset($args['custom_css'])) { - $css = $args['custom_css']; - ?>shortcodes->set_args = $args; - } - $ultimatemember->shortcodes->load_template($template); - } - - /*** - *** @Checks if a template file exists - */ - function template_exists($template) { - - $file = um_path . 'templates/' . $template . '.php'; - $theme_file = get_stylesheet_directory() . '/ultimate-member/templates/' . $template . '.php'; - - if (file_exists($theme_file) || file_exists($file)) { - return true; - } - - return false; - } - - /*** - *** @Get File Name without path and extension - */ - function get_template_name($file) { - $file = basename($file); - $file = preg_replace('/\\.[^.\\s]{3,4}$/', '', $file); - return $file; - } - - /*** - *** @Get Templates - */ - function get_templates($excluded = null) { - - if ($excluded) { - $array[$excluded] = __('Default Template', 'ultimate-member'); - } - - $paths[] = glob(um_path . 'templates/' . '*.php'); - - if (file_exists(get_stylesheet_directory() . '/ultimate-member/templates/')) { - $paths[] = glob(get_stylesheet_directory() . '/ultimate-member/templates/' . '*.php'); - } - - if( isset( $paths ) && ! empty( $paths ) ){ - - foreach ($paths as $k => $files) { - - if( isset( $files ) && ! empty( $files ) ){ - - foreach ($files as $file) { - - $clean_filename = $this->get_template_name( $file ); - - if ( 0 === strpos( $clean_filename, $excluded ) ) { - - $source = file_get_contents( $file ); - $tokens = token_get_all( $source ); - $comment = array( - T_COMMENT, // All comments since PHP5 - T_DOC_COMMENT, // PHPDoc comments - ); - foreach ( $tokens as $token ) { - if ( in_array( $token[0], $comment ) && strstr( $token[1], '/* Template:' ) && $clean_filename != $excluded ) { - $txt = $token[1]; - $txt = str_replace('/* Template: ', '', $txt ); - $txt = str_replace(' */', '', $txt ); - $array[ $clean_filename ] = $txt; - } - } - - } - - } - - } - - } - - } - - return $array; - - } - - /*** - *** @Get Shortcode for given form ID - */ - function get_shortcode($post_id) { - $shortcode = '[ultimatemember form_id=' . $post_id . ']'; - return $shortcode; - } - - /*** - *** @convert access lock tags - */ - function convert_locker_tags($str) { - $str = um_convert_tags($str); - return $str; - } - - /*** - *** @convert user tags in a string - */ - function convert_user_tags($str) { - - $value = ''; - - $pattern_array = array( - '{first_name}', - '{last_name}', - '{display_name}', - '{user_avatar_small}', - '{username}', - ); - - $pattern_array = apply_filters('um_allowed_user_tags_patterns', $pattern_array); - - $matches = false; - foreach ($pattern_array as $pattern) { - - if (preg_match($pattern, $str)) { - - $usermeta = str_replace('{', '', $pattern); - $usermeta = str_replace('}', '', $usermeta); - - if ($usermeta == 'user_avatar_small') { - $value = get_avatar(um_user('ID'), 40); - } elseif (um_user($usermeta)) { - $value = um_user($usermeta); - } - - if ($usermeta == 'username') { - $value = um_user('user_login'); - } - - $value = apply_filters("um_profile_tag_hook__{$usermeta}", $value, um_user('ID')); - - if ($value) { - $str = preg_replace('/' . $pattern . '/', $value, $str); - } - - } - - } - - return $str; - } - - /** - * Shortcode: Show custom content to specific role - * - * Show content to specific roles - * [um_show_content roles='member'] [/um_show_content] - * You can add multiple target roles, just use ',' e.g. [um_show_content roles='member,candidates,pets'] - * - * Hide content from specific roles - * [um_show_content not='contributors'] [/um_show_content] - * You can add multiple target roles, just use ',' e.g. [um_show_content roles='member,candidates,pets'] - * - * @param array $atts - * @param string $content - * @return string - */ - function um_shortcode_show_content_for_role( $atts = array() , $content = '' ) { - - global $user_ID; - - if( ! is_user_logged_in() ) { - return; - } - - $a = shortcode_atts( array( - 'roles' => '', - 'not' => '', - 'is_profile' => false, - ), $atts ); - - if( $a['is_profile'] ){ - um_fetch_user( um_profile_id() ); - }else{ - um_fetch_user( $user_ID ); - } - - - - $current_user_role = um_user('role'); - - if( isset( $a['not'] ) && ! empty( $a['not'] ) && isset( $a['roles'] ) && ! empty( $a['roles'] ) ){ - return do_shortcode( $content ); - } - - if( isset( $a['not'] ) && ! empty( $a['not'] ) ){ - - $not_in_roles = explode(",", $a['not'] ); - - if( is_array( $not_in_roles ) && ! in_array( $current_user_role, $not_in_roles ) ){ - return do_shortcode( $content ); - } - - }else{ - - $roles = explode(",", $a['roles'] ); - - if(is_array( $roles ) && in_array( $current_user_role, $roles ) ){ - return do_shortcode( $content ); - } - - - } - - return ''; - } - - public function ultimatemember_searchform($args = array(), $content = "") { - // turn off buffer - ob_start(); - - // load template - $this->load_template( 'searchform' ); - - // get the buffer - $template = ob_get_contents(); - - // clear the buffer - ob_end_clean(); - - return $template; - } - -} diff --git a/core/um-taxonomies.php b/core/um-taxonomies.php deleted file mode 100644 index ce49acfa..00000000 --- a/core/um-taxonomies.php +++ /dev/null @@ -1,76 +0,0 @@ - array( - 'name' => __( 'Forms' ), - 'singular_name' => __( 'Form' ), - 'add_new' => __( 'Add New' ), - 'add_new_item' => __('Add New Form' ), - 'edit_item' => __('Edit Form'), - 'not_found' => __('You did not create any forms yet'), - 'not_found_in_trash' => __('Nothing found in Trash'), - 'search_items' => __('Search Forms') - ), - 'show_ui' => true, - 'show_in_menu' => false, - 'public' => false, - 'supports' => array('title') - ) - ); - - register_post_type( 'um_role', array( - 'labels' => array( - 'name' => __( 'User Roles' ), - 'singular_name' => __( 'User Role' ), - 'add_new' => __( 'Add New' ), - 'add_new_item' => __('Add New User Role' ), - 'edit_item' => __('Edit User Role'), - 'not_found' => __('You did not create any user roles yet'), - 'not_found_in_trash' => __('Nothing found in Trash'), - 'search_items' => __('Search User Roles') - ), - 'show_ui' => true, - 'show_in_menu' => false, - 'public' => false, - 'supports' => array('title') - ) - ); - - if ( um_get_option('members_page') || !get_option('um_options') ){ - - register_post_type( 'um_directory', array( - 'labels' => array( - 'name' => __( 'Member Directories' ), - 'singular_name' => __( 'Member Directory' ), - 'add_new' => __( 'Add New' ), - 'add_new_item' => __('Add New Member Directory' ), - 'edit_item' => __('Edit Member Directory'), - 'not_found' => __('You did not create any member directories yet'), - 'not_found_in_trash' => __('Nothing found in Trash'), - 'search_items' => __('Search Member Directories') - ), - 'show_ui' => true, - 'show_in_menu' => false, - 'public' => false, - 'supports' => array('title') - ) - ); - - } - - } - -} \ No newline at end of file diff --git a/core/um-tracking.php b/core/um-tracking.php deleted file mode 100644 index 0dd4a2ff..00000000 --- a/core/um-tracking.php +++ /dev/null @@ -1,156 +0,0 @@ -schedule_send(); - - add_action( 'admin_notices', array( $this, 'admin_notices' ), 10 ); - - } - - /*** - *** @setup info array - ***/ - private function setup_data() { - global $ultimatemember; - - $data = array(); - - // Retrieve current theme info - if ( get_bloginfo( 'version' ) < '3.4' ) { - $theme_data = get_theme_data( get_stylesheet_directory() . '/style.css' ); - $theme = $theme_data['Name']; - $theme_ver = $theme_data['Version']; - } else { - $theme_data = wp_get_theme(); - $theme = $theme_data->Name; - $theme_ver = $theme_data->Version; - } - - $data['url'] = home_url(); - $data['theme'] = $theme; - $data['theme_version'] = $theme_ver; - $data['wp_version'] = get_bloginfo( 'version' ); - $data['version'] = ultimatemember_version; - - // Retrieve current plugin information - if( ! function_exists( 'get_plugins' ) ) { - include ABSPATH . '/wp-admin/includes/plugin.php'; - } - - $plugins = array_keys( get_plugins() ); - $active_plugins = get_option( 'active_plugins', array() ); - - foreach ( $plugins as $key => $plugin ) { - if ( in_array( $plugin, $active_plugins ) ) { - // Remove active plugins from list so we can show active and inactive separately - unset( $plugins[ $key ] ); - } - } - - $data['active_plugins'] = $active_plugins; - $data['inactive_plugins'] = $plugins; - $data['language'] = get_bloginfo('language'); - $data['multisite'] = ( is_multisite() ) ? 1 : 0; - - if ( !get_option('__ultimatemember_sitekey') ) { - $ultimatemember->setup->install_basics(); - } - - $data['email'] = get_option('admin_email'); - $data['unique_sitekey'] = get_option('__ultimatemember_sitekey'); - - $this->data = $data; - - } - - /*** - *** @check if tracking is allowed - ***/ - private function tracking_allowed() { - if ( !um_get_option('allow_tracking') ) - return 0; - return 1; - } - - /*** - *** @get last send time - ***/ - private function get_last_send() { - return get_option( 'um_tracking_last_send' ); - } - - /*** - *** @send a report - ***/ - public function send_checkin( $override = false ) { - - if( ! $this->tracking_allowed() && ! $override ) - return; - - // Send a maximum of once per period - $last_send = $this->get_last_send(); - if( $last_send && $last_send > strtotime( '-1 day' ) ) - return; - - $this->setup_data(); - - if ( !get_option('__ultimatemember_coupon_sent') ) { - $this->data['send_discount'] = 1; - } else { - $this->data['send_discount'] = 0; - } - - $request = wp_remote_post( 'https://ultimatemember.com/?um_action=checkin', array( - 'method' => 'POST', - 'timeout' => 20, - 'redirection' => 5, - 'httpversion' => '1.0', - 'blocking' => true, - 'body' => $this->data, - 'user-agent' => 'UM/' . ultimatemember_version . '; ' . get_bloginfo( 'url' ), - ) ); - - update_option( 'um_tracking_last_send', time() ); - update_option( '__ultimatemember_coupon_sent', 1 ); - } - - /*** - *** @run a scheduled report - ***/ - private function schedule_send() { - add_action( 'um_daily_scheduled_events', array( $this, 'send_checkin' ) ); - } - - /*** - *** @show admin notices - ***/ - public function admin_notices() { - - if( ! current_user_can( 'manage_options' ) ) - return; - - $hide_notice = get_option('um_tracking_notice'); - - if ( $hide_notice ) - return; - - $optin_url = esc_url( add_query_arg( 'um_adm_action', 'opt_into_tracking' ) ); - $optout_url = esc_url( add_query_arg( 'um_adm_action', 'opt_out_of_tracking' ) ); - - echo '

            '; - - echo __( 'Allow Ultimate Member to track plugin usage? Opt-in to tracking and our newsletter and we will immediately e-mail you a 20% discount which you can use to purchase our core extensions bundle. No sensitive data is tracked.', 'ultimate-member'); - - echo '

            '; - - echo '

            ' . __( 'Allow tracking', 'ultimate-member') . ''; - echo ' ' . __( 'Do not allow tracking', 'ultimate-member') . '

            '; - - } - -} \ No newline at end of file diff --git a/core/um-uninstall.php b/core/um-uninstall.php deleted file mode 100644 index 2f6b0a4e..00000000 --- a/core/um-uninstall.php +++ /dev/null @@ -1,49 +0,0 @@ - $v ) { - - if ( substr( $k, 0, 3 ) == 'um_' ) { - - if ( $k == 'um_core_pages' ) { - $v = unserialize( $v ); - foreach( $v as $post_id ) { - wp_delete_post( $post_id, 1 ); - } - } - - delete_option( $k ); - - } - - } - - $forms = get_posts( array( 'post_type' => 'um_form', 'numberposts' => -1 ) ); - foreach( $forms as $form ) {wp_delete_post( $form->ID, 1 );} - - $directories = get_posts( array( 'post_type' => 'um_directory', 'numberposts' => -1 ) ); - foreach( $directories as $directory ) {wp_delete_post( $directory->ID, 1 );} - - $roles = get_posts( array( 'post_type' => 'um_role', 'numberposts' => -1 ) ); - foreach( $roles as $role ) {wp_delete_post( $role->ID, 1 );} - - if ( is_plugin_active( um_plugin ) ) { - deactivate_plugins( um_plugin ); - } - - exit( wp_redirect( admin_url('plugins.php') ) ); - - } - -} \ No newline at end of file diff --git a/core/um-user-posts.php b/core/um-user-posts.php deleted file mode 100644 index cf426682..00000000 --- a/core/um-user-posts.php +++ /dev/null @@ -1,127 +0,0 @@ -shortcodes->modified_args = "$post_type,$posts_per_page,$offset_n,$author"; - - $ultimatemember->shortcodes->loop = $ultimatemember->query->make("post_type=$post_type&posts_per_page=$posts_per_page&offset=$offset&author=$author"); - - $ultimatemember->shortcodes->load_template('profile/posts-single'); - - } - - /*** - *** @dynamic load of comments - ***/ - function load_comments( $args ) { - global $ultimatemember; - - $array = explode(',', $args ); - $post_type = $array[0]; - $posts_per_page = $array[1]; - $offset = $array[2]; - $author = $array[3]; - - $offset_n = $posts_per_page + $offset; - - $ultimatemember->shortcodes->modified_args = "$post_type,$posts_per_page,$offset_n,$author"; - - $ultimatemember->shortcodes->loop = $ultimatemember->query->make("post_type=$post_type&number=$posts_per_page&offset=$offset&user_id=$author"); - - $ultimatemember->shortcodes->load_template('profile/comments-single'); - - } - - /*** - *** @adds a tab - ***/ - function add_tab( $tabs ){ - - $tabs['posts'] = array( - 'name' => __('Posts','ultimate-member'), - 'icon' => 'um-faicon-pencil', - ); - - $tabs['comments'] = array( - 'name' => __('Comments','ultimate-member'), - 'icon' => 'um-faicon-comment', - ); - - return $tabs; - } - - /*** - *** @add posts - ***/ - function add_posts() { - global $ultimatemember; - $ultimatemember->shortcodes->load_template('profile/posts'); - - } - - /*** - *** @add comments - ***/ - function add_comments() { - global $ultimatemember; - $ultimatemember->shortcodes->load_template('profile/comments'); - } - - /*** - *** @count posts - ***/ - function count_user_posts_by_type( $user_id= '', $post_type = 'post' ) { - global $wpdb; - if ( !$user_id ) - $user_id = um_user('ID'); - - if ( !$user_id ) return 0; - - $where = get_posts_by_author_sql( $post_type, true, $user_id ); - $count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" ); - - return apply_filters('um_pretty_number_formatting', $count); - } - - /*** - *** @count comments - ***/ - function count_user_comments( $user_id = null ) { - global $wpdb; - if ( !$user_id ) - $user_id = um_user('ID'); - - if ( !$user_id ) return 0; - - $count = $wpdb->get_var("SELECT COUNT(comment_ID) FROM " . $wpdb->comments. " WHERE user_id = " . $user_id . " AND comment_approved = '1'"); - - return apply_filters('um_pretty_number_formatting', $count); - } - -} \ No newline at end of file diff --git a/core/um-user.php b/core/um-user.php deleted file mode 100644 index d3e81da8..00000000 --- a/core/um-user.php +++ /dev/null @@ -1,1130 +0,0 @@ -id = 0; - $this->usermeta = null; - $this->data = null; - $this->profile = null; - - $this->banned_keys = array( - 'metabox','postbox','meta-box', - 'dismissed_wp_pointers', 'session_tokens', - 'screen_layout', 'wp_user-', 'dismissed', - 'cap_key', 'wp_capabilities', - 'managenav', 'nav_menu','user_activation_key', - 'level_', 'wp_user_level' - ); - - add_action('init', array(&$this, 'set'), 1); - - $this->preview = false; - - // a list of keys that should never be in wp_usermeta - $this->update_user_keys = array( - 'user_email', - 'user_pass', - 'user_password', - 'display_name', - ); - - $this->target_id = null; - - // When the cache should be cleared - add_action('um_delete_user_hook', array(&$this, 'remove_cached_queue') ); - add_action('um_new_user_registration_plain', array(&$this, 'remove_cached_queue') ); - add_action('um_after_user_status_is_changed_hook', array(&$this, 'remove_cached_queue') ); - - // When user cache should be cleared - add_action('um_after_user_updated', array(&$this, 'remove_cache') ); - add_action('um_after_user_account_updated', array(&$this, 'remove_cache') ); - add_action('personal_options_update', array(&$this, 'remove_cache') ); - add_action('edit_user_profile_update', array(&$this, 'remove_cache') ); - add_action('um_when_role_is_set', array(&$this, 'remove_cache') ); - add_action('um_when_status_is_set', array(&$this, 'remove_cache') ); - - add_action( 'show_user_profile', array( $this, 'community_role_edit' ) ); - add_action( 'edit_user_profile', array( $this, 'community_role_edit' ) ); - add_action( 'personal_options_update', array( $this, 'community_role_save' ) ); - add_action( 'edit_user_profile_update', array( $this, 'community_role_save' ) ); - - } - - /** - * Allow changing community role - */ - function community_role_edit( $user ) { - global $ultimatemember; - if ( current_user_can( 'edit_users' ) && current_user_can( 'edit_user', $user->ID ) ) { - - $um_user_role = get_user_meta($user->ID,'role',true); - ?> -

            - - - - - - - -
            - - - - -
            - $val) { - $new[$key] = $this->toArray($val); - } - } else { - $new = $obj; - } - - return $new; - } - - function get_cached_data( $user_id ) { - - $disallow_cache = um_get_option('um_profile_object_cache_stop'); - if( $disallow_cache ){ - return ''; - } - - if ( is_numeric( $user_id ) && $user_id > 0 ) { - $find_user = get_option("um_cache_userdata_{$user_id}"); - if ( $find_user ) { - $find_user = apply_filters('um_user_permissions_filter', $find_user, $user_id); - return $find_user; - } - } - return ''; - } - - function setup_cache( $user_id, $profile ) { - - $disallow_cache = um_get_option('um_profile_object_cache_stop'); - if( $disallow_cache ){ - return ''; - } - - update_option( "um_cache_userdata_{$user_id}", $profile ); - } - - function remove_cache( $user_id ) { - delete_option( "um_cache_userdata_{$user_id}" ); - } - - /** - * @function set() - * - * @description This method lets you set a user. For example, to retrieve a profile or anything related to that user. - * - * @usage user->set( $user_id, $clean = false ); ?> - * - * @param $user_id (numeric) (optional) Which user to retrieve. A numeric user ID - * @param $clean (boolean) (optional) Should be true or false. Basically, if you did not provide a user ID It will set the current logged in user as a profile - * - * @returns This API method does not return anything. It sets user profile and permissions and allow you to retrieve any details for that user. - * - * @example The following example makes you set a user and retrieve their display name after that using the user API. - - user->set( 12 ); - $display_name = $ultimatemember->user->profile['display_name']; // Should print user display name - - ?> - - * - * - */ - function set( $user_id = null, $clean = false ) { - global $ultimatemember; - - if ( isset( $this->profile ) ) { - unset( $this->profile ); - } - - if ($user_id) { - $this->id = $user_id; - } elseif (is_user_logged_in() && $clean == false ){ - $this->id = get_current_user_id(); - } else { - $this->id = 0; - } - - if ( $this->get_cached_data( $this->id ) ) { - $this->profile = $this->get_cached_data( $this->id ); - } else { - - if ($user_id) { - - $this->id = $user_id; - $this->usermeta = get_user_meta($user_id); - $this->data = get_userdata($this->id); - - } elseif (is_user_logged_in() && $clean == false ){ - - $this->id = get_current_user_id(); - $this->usermeta = get_user_meta($this->id); - $this->data = get_userdata($this->id); - - } else { - - $this->id = 0; - $this->usermeta = null; - $this->data = null; - - } - - // we have a user, populate a profile - if ( $this->id && $this->toArray($this->data) ) { - - // add user data - $this->data = $this->toArray($this->data); - - foreach( $this->data as $k=>$v ) { - if ($k == 'roles') { - $this->profile['wp_roles'] = implode(',',$v); - } else if (is_array($v)){ - foreach($v as $k2 => $v2){ - $this->profile[$k2] = $v2; - } - } else { - $this->profile[$k] = $v; - } - } - - // add account status - if ( !isset( $this->usermeta['account_status'][0] ) ) { - $this->usermeta['account_status'][0] = 'approved'; - } - - if ( $this->usermeta['account_status'][0] == 'approved' ) { - $this->usermeta['account_status_name'][0] = __('Approved','ultimate-member'); - } - - if ( $this->usermeta['account_status'][0] == 'awaiting_email_confirmation' ) { - $this->usermeta['account_status_name'][0] = __('Awaiting E-mail Confirmation','ultimate-member'); - } - - if ( $this->usermeta['account_status'][0] == 'awaiting_admin_review' ) { - $this->usermeta['account_status_name'][0] = __('Pending Review','ultimate-member'); - } - - if ( $this->usermeta['account_status'][0] == 'rejected' ) { - $this->usermeta['account_status_name'][0] = __('Membership Rejected','ultimate-member'); - } - - if ( $this->usermeta['account_status'][0] == 'inactive' ) { - $this->usermeta['account_status_name'][0] = __('Membership Inactive','ultimate-member'); - } - - // add user meta - foreach($this->usermeta as $k=>$v){ - if ( $k == 'display_name') continue; - $this->profile[$k] = $v[0]; - } - - // add permissions - $user_role = $this->get_role(); - $this->role_meta = $ultimatemember->query->role_data( $user_role ); - $this->role_meta = apply_filters('um_user_permissions_filter', $this->role_meta, $this->id); - - $this->profile = array_merge( $this->profile, (array)$this->role_meta); - - $this->profile['super_admin'] = ( is_super_admin( $this->id ) ) ? 1 : 0; - - // clean profile - $this->clean(); - - // Setup cache - $this->setup_cache( $this->id, $this->profile ); - - } - - } - - } - - /*** - *** @reset user data - ***/ - function reset( $clean = false ){ - $this->set(0, $clean); - } - - /*** - *** @Clean user profile - ***/ - function clean(){ - foreach($this->profile as $key => $value){ - foreach($this->banned_keys as $ban){ - if (strstr($key, $ban) || is_numeric($key) ) - unset($this->profile[$key]); - } - } - } - - /** - * @function auto_login() - * - * @description This method lets you auto sign-in a user to your site. - * - * @usage user->auto_login( $user_id, $rememberme = false ); ?> - * - * @param $user_id (numeric) (required) Which user ID to sign in automatically - * @param $rememberme (boolean) (optional) Should be true or false. If you want the user sign in session to use cookies, use true - * - * @returns Sign in the specified user automatically. - * - * @example The following example lets you sign in a user automatically by their ID. - - user->auto_login( 2 ); ?> - - * - * - * @example The following example lets you sign in a user automatically by their ID and makes the plugin remember their session. - - user->auto_login( 10, true ); ?> - - * - * - */ - function auto_login( $user_id, $rememberme = 0 ) { - - wp_set_current_user( $user_id ); - - wp_set_auth_cookie( $user_id, $rememberme ); - - $user = get_user_by('ID', $user_id ); - - do_action( 'wp_login', $user->user_login, $user ); - - } - - /*** - *** @Set user's registration details - ***/ - function set_registration_details( $submitted ) { - - if ( isset( $submitted['user_pass'] ) ) { - unset( $submitted['user_pass'] ); - } - - if ( isset( $submitted['user_password'] ) ) { - unset( $submitted['user_password'] ); - } - - if ( isset( $submitted['confirm_user_password'] ) ) { - unset( $submitted['confirm_user_password'] ); - } - - $submitted = apply_filters('um_before_save_filter_submitted', $submitted ); - - do_action('um_before_save_registration_details', $this->id, $submitted ); - - update_user_meta( $this->id, 'submitted', $submitted ); - - do_action('um_after_save_registration_details', $this->id, $submitted ); - - } - - /*** - *** @A plain version of password - ***/ - function set_plain_password( $plain ) { - update_user_meta( $this->id, '_um_cool_but_hard_to_guess_plain_pw', $plain ); - } - - /** - * Set last login for new registered users - */ - function set_last_login(){ - update_user_meta( $this->id, '_um_last_login', current_time( 'timestamp' ) ); - } - - function set_role( $role ){ - - do_action('um_when_role_is_set', um_user('ID') ); - - do_action('um_before_user_role_is_changed'); - - $this->profile['role'] = $role; - - do_action('um_member_role_upgrade', $role, $this->profile['role'] ); - - $this->update_usermeta_info('role'); - - do_action('um_after_user_role_is_changed'); - - do_action('um_after_user_role_is_updated', um_user('ID'), $role ); - - } - - /*** - *** @Set user's account status - ***/ - function set_status( $status ){ - - do_action( 'um_when_status_is_set', um_user('ID') ); - - $this->profile['account_status'] = $status; - - $this->update_usermeta_info('account_status'); - - do_action( 'um_after_user_status_is_changed_hook' ); - - do_action( 'um_after_user_status_is_changed', $status); - - } - - /*** - *** @Set user's hash for password reset - ***/ - function password_reset_hash(){ - global $ultimatemember; - - $this->profile['reset_pass_hash'] = $ultimatemember->validation->generate(); - $this->update_usermeta_info('reset_pass_hash'); - - } - - /*** - *** @Set user's hash - ***/ - function assign_secretkey(){ - global $ultimatemember; - - do_action('um_before_user_hash_is_changed'); - - $this->profile['account_secret_hash'] = $ultimatemember->validation->generate(); - $this->update_usermeta_info('account_secret_hash'); - - do_action('um_after_user_hash_is_changed'); - - } - - /*** - *** @password reset email - ***/ - function password_reset(){ - global $ultimatemember; - $this->password_reset_hash(); - $ultimatemember->mail->send( um_user('user_email'), 'resetpw_email' ); - } - - - /*** - *** @password changed email - ***/ - function password_changed(){ - global $ultimatemember; - $ultimatemember->mail->send( um_user('user_email'), 'changedpw_email' ); - } - - /** - * @function approve() - * - * @description This method approves a user membership and sends them an optional welcome/approval e-mail. - * - * @usage user->approve(); ?> - * - * @returns Approves a user membership. - * - * @example Approve a pending user and allow him to sign-in to your site. - - user->approve(); - - ?> - - * - * - */ - function approve(){ - global $ultimatemember; - - $user_id = um_user('ID'); - delete_option( "um_cache_userdata_{$user_id}" ); - - if ( um_user('account_status') == 'awaiting_admin_review' ) { - $this->password_reset_hash(); - $ultimatemember->mail->send( um_user('user_email'), 'approved_email' ); - - } else { - $this->password_reset_hash(); - $ultimatemember->mail->send( um_user('user_email'), 'welcome_email'); - } - - $this->set_status('approved'); - $this->delete_meta('account_secret_hash'); - $this->delete_meta('_um_cool_but_hard_to_guess_plain_pw'); - - do_action('um_after_user_is_approved', um_user('ID') ); - - } - - /*** - *** @pending email - ***/ - function email_pending() { - global $ultimatemember; - $this->assign_secretkey(); - $this->set_status('awaiting_email_confirmation'); - $ultimatemember->mail->send( um_user('user_email'), 'checkmail_email' ); - } - - /** - * @function pending() - * - * @description This method puts a user under manual review by administrator and sends them an optional e-mail. - * - * @usage user->pending(); ?> - * - * @returns Puts a user under review and sends them an email optionally. - * - * @example An example of putting a user pending manual review - - user->pending(); - - ?> - - * - * - */ - function pending(){ - global $ultimatemember; - $this->set_status('awaiting_admin_review'); - $ultimatemember->mail->send( um_user('user_email'), 'pending_email' ); - } - - /** - * @function reject() - * - * @description This method rejects a user membership and sends them an optional e-mail. - * - * @usage user->reject(); ?> - * - * @returns Rejects a user membership. - * - * @example Reject a user membership example - - user->reject(); - - ?> - - * - * - */ - function reject(){ - global $ultimatemember; - $this->set_status('rejected'); - $ultimatemember->mail->send( um_user('user_email'), 'rejected_email' ); - } - - /** - * @function deactivate() - * - * @description This method deactivates a user membership and sends them an optional e-mail. - * - * @usage user->deactivate(); ?> - * - * @returns Deactivates a user membership. - * - * @example Deactivate a user membership with the following example - - user->deactivate(); - - ?> - - * - * - */ - function deactivate(){ - global $ultimatemember; - $this->set_status('inactive'); - - do_action('um_after_user_is_inactive', um_user('ID') ); - - $ultimatemember->mail->send( um_user('user_email'), 'inactive_email' ); - } - - /*** - *** @delete user - ***/ - function delete( $send_mail = true ) { - global $ultimatemember; - - do_action( 'um_delete_user_hook' ); - do_action( 'um_delete_user', um_user('ID') ); - - // send email notifications - if ( $send_mail ) { - $ultimatemember->mail->send( um_user('user_email'), 'deletion_email' ); - $ultimatemember->mail->send( um_admin_email(), 'notification_deletion', array('admin' => true ) ); - } - - // remove uploads - $ultimatemember->files->remove_dir( um_user_uploads_dir() ); - - // remove user - if ( is_multisite() ) { - - if ( !function_exists('wpmu_delete_user') ) { - require_once( ABSPATH . 'wp-admin/includes/ms.php' ); - } - - wpmu_delete_user( $this->id ); - - } else { - - if ( !function_exists('wp_delete_user') ) { - require_once( ABSPATH . 'wp-admin/includes/user.php' ); - } - - wp_delete_user( $this->id ); - - } - - } - - /** - * @function get_role() - * - * @description This method gets a user role in slug format. e.g. member - * - * @usage user->get_role(); ?> - * - * @returns The user role's slug. - * - * @example Do something if the user's role is paid-member - - user->get_role() == 'paid-member' ) { - // Show this to paid customers - } else { - // You are a free member - } - - ?> - - * - * - */ - function get_role() { - global $ultimatemember; - - if (isset($this->profile['role']) && !empty( $this->profile['role'] ) ) { - return $this->profile['role']; - } else { - if ( $this->profile['wp_roles'] == 'administrator' ) { - return 'admin'; - } else { - return 'member'; - } - } - } - - function get_role_name( $slug, $return_role_id = false ) { - global $wpdb, $ultimatemember; - - if( isset( $ultimatemember->profile->arr_user_roles[ 'is_'.$return_role_id ][ $slug ] ) ){ - return $ultimatemember->profile->arr_user_roles[ 'is_'.$return_role_id ][ $slug ]; - } - - $args = array( - 'posts_per_page' => 1, - 'post_type' => 'um_role', - 'name' => $slug, - 'post_status' => array('publish'), - ); - - $roles = new WP_Query( $args ); - $role_id = 0; - $role_title = ''; - - if ( $roles->have_posts() ) { - while ( $roles->have_posts() ) { - $roles->the_post(); - $role_id = get_the_ID(); - $role_title = get_the_title(); - } - } - - wp_reset_query(); - - $ultimatemember->profile->arr_user_roles[ 'is_1' ][ $slug ] = $role_id; - $ultimatemember->profile->arr_user_roles[ 'is_' ][ $slug ] = $role_title; - - if( $return_role_id ){ - return $role_id; - } - - return $role_title; - } - - /** - * Get role slug by ID - * @param integer $id - * @return string - */ - function get_role_slug_by_id( $id ) { - global $wpdb, $ultimatemember; - - - $args = array( - 'posts_per_page' => 1, - 'post_type' => 'um_role', - 'page_id' => $id, - 'post_status' => array('publish'), - ); - - $roles = new WP_Query( $args ); - $role_slug = ''; - - if ( $roles->have_posts() ) { - $role_slug = $roles->post->post_name; - } - - wp_reset_query(); - - return $role_slug; - } - - /*** - *** @Update one key in user meta - ***/ - function update_usermeta_info( $key ) { - // delete the key first just in case - delete_user_meta( $this->id, $key ); - update_user_meta( $this->id, $key, $this->profile[$key] ); - } - - /** - * @function delete_meta() - * - * @description This method can be used to delete user's meta key. - * - * @usage user->delete_meta( $key ); ?> - * - * @param $key (string) (required) The meta field key to remove from user - * - * @returns This method will not return anything. The specified meta key will be deleted from database for the specified user. - * - * @example Delete user's age field - - user->delete_meta( 'age' ); - - ?> - - * - * - */ - function delete_meta( $key ){ - delete_user_meta( $this->id, $key ); - } - - /*** - *** @Get all bulk actions - ***/ - function get_bulk_admin_actions() { - $output = ''; - $actions = array(); - $actions = apply_filters('um_admin_bulk_user_actions_hook', $actions ); - foreach($actions as $id => $arr ) { - if ( isset($arr['disabled'])){ - $arr['disabled'] = 'disabled'; - } else { - $arr['disabled'] = ''; - } - - $output .= ''; - } - return $output; - } - - /*** - *** @Get admin actions for individual user - ***/ - function get_admin_actions() { - $items = array(); - $actions = array(); - $actions = apply_filters('um_admin_user_actions_hook', $actions ); - if ( !isset( $actions ) || empty( $actions ) ) return false; - foreach($actions as $id => $arr ) { - $url = add_query_arg('um_action', $id ); - $url = add_query_arg('uid', um_profile_id(), $url ); - $items[] = '' . $arr['label'] . ''; - } - return $items; - } - - /** - * @function is_private_profile() - * - * @description This method checks if give user profile is private. - * - * @usage user->is_private_profile( $user_id ); ?> - * - * @param $user_id (numeric) (required) A user ID must be passed to check if the user profile is private - * - * @returns Returns true if user profile is private and false if user profile is public. - * - * @example This example display a specific user's name If his profile is public - - user->is_private_profile( 60 ); - if ( !$is_private ) { - echo 'User is public and his name is ' . um_user('display_name'); - } - - ?> - - * - * - */ - function is_private_profile( $user_id ) { - $privacy = get_user_meta( $user_id, 'profile_privacy', true ); - if ( $privacy == __('Only me','ultimate-member') ) { - return true; - } - return false; - } - - /** - * @function is_approved() - * - * @description This method can be used to determine If a certain user is approved or not. - * - * @usage user->is_approved( $user_id ); ?> - * - * @param $user_id (numeric) (required) The user ID to check approval status for - * - * @returns True if user is approved and false if user is not approved. - * - * @example Do something If a user's membership is approved - - user->is_approved( 55 ) { - // User account is approved - } else { - // User account is not approved - } - - ?> - - * - * - */ - function is_approved( $user_id ) { - $status = get_user_meta( $user_id, 'account_status', true ); - if ( $status == 'approved' || $status == '' ) { - return true; - } - return false; - } - - /*** - *** @Is private - ***/ - function is_private_case( $user_id, $case ) { - $privacy = get_user_meta( $user_id, 'profile_privacy', true ); - - if ( $privacy == $case ) { - $bool = apply_filters('um_is_private_filter_hook', false, $privacy, $user_id ); - return $bool; - } - - return false; - } - - /*** - *** @update files - ***/ - function update_files( $changes ) { - - global $ultimatemember; - - foreach( $changes as $key => $uri ) { - $src = um_is_temp_upload( $uri ); - $ultimatemember->files->new_user_upload( $this->id, $src, $key ); - } - - } - - /*** - *** @update profile - ***/ - function update_profile( $changes ) { - - global $ultimatemember; - - $args['ID'] = $this->id; - $changes = apply_filters('um_before_update_profile', $changes, $this->id); - - // save or update profile meta - foreach( $changes as $key => $value ) { - if ( !in_array( $key, $this->update_user_keys ) ) { - - update_user_meta( $this->id, $key, $value ); - - } else { - - $args[$key] = esc_attr( $changes[$key] ); - - } - - } - - - // update user - if ( count( $args ) > 1 ) { - wp_update_user( $args ); - } - - } - - /*** - *** @user exists by meta key and value - ***/ - function user_has_metadata( $key, $value ) { - - global $ultimatemember; - $value = $ultimatemember->validation->safe_name_in_url( $value ); - - $ids = get_users(array( 'fields' => 'ID', 'meta_key' => $key,'meta_value' => $value,'meta_compare' => '=') ); - if ( !isset( $ids ) || empty( $ids ) ) return false; - foreach( $ids as $k => $id ) { - if ( $id == um_user('ID') ){ - unset( $ids[$k] ); - } else { - $duplicates[] = $id; - } - } - if ( isset( $duplicates ) && !empty( $duplicates ) ) - return count( $duplicates ); - return false; - } - - - /*** - *** @user exists by name - ***/ - function user_exists_by_name( $value ) { - - global $ultimatemember; - - // Permalink base - $permalink_base = um_get_option('permalink_base'); - - $raw_value = $value; - $value = $ultimatemember->validation->safe_name_in_url( $value ); - $value = um_clean_user_basename( $value ); - - // Search by Profile Slug - $args = array( - "fields" => array("ID"), - 'meta_query' => array( - 'relation' => 'OR', - array( - 'key' => 'um_user_profile_url_slug_'.$permalink_base, - 'value' => strtolower( $raw_value ), - 'compare' => '=' - - ) - - ) - ); - - - $ids = new WP_User_Query( $args ); - - if( $ids->total_users > 0 ){ - $um_user_query = current( $ids->get_results() ); - return $um_user_query->ID; - } - - // Search by Display Name or ID - $args = array( - "fields" => array("ID"), - "search" => $value, - 'search_columns' => array( 'display_name','ID' ) - ); - - $ids = new WP_User_Query( $args ); - - if( $ids->total_users > 0 ){ - $um_user_query = current( $ids->get_results() ); - return $um_user_query->ID; - } - - - // Search By User Login - $value = str_replace(".", "_", $value ); - $value = str_replace(" ", "", $value ); - - $args = array( - "fields" => array("ID"), - "search" => $value, - 'search_columns' => array( - 'user_login', - ) - ); - - $ids = new WP_User_Query( $args ); - - if( $ids->total_users > 0 ){ - $um_user_query = current( $ids->get_results() ); - return $um_user_query->ID; - } - - return false; - } - - - /** - * @function user_exists_by_id() - * - * @description This method checks if a user exists or not in your site based on the user ID. - * - * @usage user->user_exists_by_id( $user_id ); ?> - * - * @param $user_id (numeric) (required) A user ID must be passed to check if the user exists - * - * @returns Returns true if user exists and false if user does not exist. - * - * @example Basic Usage - - user->user_exists_by_id( 15 ); - if ( $boolean ) { - // That user exists - } - - ?> - - * - * - */ - function user_exists_by_id( $user_id ) { - $aux = get_userdata( intval( $user_id ) ); - if($aux==false){ - return false; - } else { - return $user_id; - } - } - /** - * @function user_exists_by_email_as_username() - * - * @description This method checks if a user exists or not in your site based on the user email as username - * - * @usage user->user_exists_by_email_as_username( $slug ); ?> - * - * @param $slug (string) (required) A user slug must be passed to check if the user exists - * - * @returns Returns true if user exists and false if user does not exist. - * - * @example Basic Usage - - user->user_exists_by_email_as_username( 'calumgmail-com' ); - if ( $boolean ) { - // That user exists - } - - ?> - - * - * - */ - function user_exists_by_email_as_username( $slug ){ - - $user_id = false; - - $ids = get_users( array( 'fields' => 'ID', 'meta_key' => 'um_email_as_username_'.$slug ) ); - if ( isset( $ids[0] ) && ! empty( $ids[0] ) ){ - $user_id = $ids[0]; - } - - return $user_id; - } - - /** - * Set gravatar hash id - */ - function set_gravatar( $user_id ){ - - um_fetch_user( $user_id ); - $email_address = um_user('user_email'); - $hash_email_address = ''; - - if( $email_address ){ - $hash_email_address = md5( $email_address ); - $this->profile['synced_gravatar_hashed_id'] = $hash_email_address; - $this->update_usermeta_info('synced_gravatar_hashed_id'); - } - - return $hash_email_address; - } - -} diff --git a/core/um-validation.php b/core/um-validation.php deleted file mode 100644 index 3a505976..00000000 --- a/core/um-validation.php +++ /dev/null @@ -1,210 +0,0 @@ -regex_safe = '/\A[\w\-\.]+\z/'; - $this->regex_phone_number = '/\A[\d\-\.\+\(\)\ ]+\z/'; - - } - - /*** - *** @removes html from any string - ***/ - function remove_html($string) { - return wp_strip_all_tags( $string ); - } - - /*** - *** @normalize a string - ***/ - function normalize($string) { - $string = preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8')); - return $string; - } - - /*** - *** @safe name usage ( for url purposes ) - ***/ - function safe_name_in_url( $name ) { - $name = strtolower( $name ); - $name = preg_replace("/'/","", $name ); - $name = stripslashes( $name ); - $name = $this->normalize($name); - $name = rawurldecode( $name ); - return $name; - } - - /*** - *** @password test - ***/ - function strong_pass($candidate) { - $r1='/[A-Z]/'; - $r2='/[a-z]/'; - $r3='/[0-9]/'; - if(preg_match_all($r1,$candidate, $o)<1) return false; - if(preg_match_all($r2,$candidate, $o)<1) return false; - if(preg_match_all($r3,$candidate, $o)<1) return false; - return true; - } - - /*** - *** @space, dash, underscore - ***/ - function safe_username( $string ) { - - $regex_safe_username = apply_filters('um_validation_safe_username_regex',$this->regex_safe ); - - if ( is_email( $string ) ) - return true; - if ( !is_email( $string) && !preg_match( $regex_safe_username, $string ) ) - return false; - return true; - } - - /*** - *** @dash and underscore (metakey) - ***/ - function safe_string($string){ - - $regex_safe_string = apply_filters('um_validation_safe_string_regex',$this->regex_safe ); - - if ( !preg_match( $regex_safe_string, $string) ){ - return false; - } - return true; - } - - /*** - *** @is phone number - ***/ - function is_phone_number( $string ){ - if ( !$string ) - return true; - if ( !preg_match( $this->regex_phone_number, $string) ) - return false; - return true; - } - - /*** - *** @is url - ***/ - function is_url( $url, $social = false ){ - if ( !$url ) return true; - - if ( $social ) { - - if ( !filter_var($url, FILTER_VALIDATE_URL) && strstr( $url, $social ) ) { // starts with social requested - return true; - } else { - - if ( filter_var($url, FILTER_VALIDATE_URL) && strstr( $url, $social ) ) { - return true; - } elseif ( preg_match( $this->regex_safe, $url) ) { - - if ( strstr( $url, '.com' ) ){ - return false; - } else { - return true; - } - - } - - } - - } else { - - if ( strstr( $url, 'http://') || strstr( $url, 'https://') ) - return true; - - } - - return false; - } - - /*** - *** @get a random string - ***/ - function randomize( $length = 10 ) { - $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - $result = ''; - for ($i = 0; $i < $length; $i++) { - $result .= $characters[rand(0, strlen($characters) - 1)]; - } - return $result; - } - - /*** - *** @generate a password, hash, or similar - ***/ - function generate( $length = 40 ) { - return wp_generate_password( $length, false ); - } - - /*** - *** @random numbers only - ***/ - function random_number($len = false) { - $ints = array(); - $len = $len ? $len : rand(2,9); - if($len > 9) - { - trigger_error('Maximum length should not exceed 9'); - return 0; - } - while(true) - { - $current = rand(0,9); - if(!in_array($current,$ints)) - { - $ints[] = $current; - } - if(count($ints) == $len) - { - return implode($ints); - } - } - } - - /*** - *** @To validate given date input - ***/ - function validate_date( $date, $format='YYYY/MM/D' ) { - if ( strlen( $date ) < strlen($format) ) return false; - if ( $date[4] != '/' ) return false; - if ( $date[7] != '/' ) return false; - if ( false === strtotime($date) ) return false; - return true; - } - - /*** - *** @checks if data is serialized - ***/ - function is_serialized( $data ) { - // if it isn't a string, it isn't serialized - if ( !is_string( $data ) ) - return false; - $data = trim( $data ); - if ( 'N;' == $data ) - return true; - if ( !preg_match( '/^([adObis]):/', $data, $badions ) ) - return false; - switch ( $badions[1] ) { - case 'a' : - case 'O' : - case 's' : - if ( preg_match( "/^{$badions[1]}:[0-9]+:.*[;}]\$/s", $data ) ) - return true; - break; - case 'b' : - case 'i' : - case 'd' : - if ( preg_match( "/^{$badions[1]}:[0-9.E-]+;\$/", $data ) ) - return true; - break; - } - return false; - } - -} \ No newline at end of file diff --git a/admin/assets/css/um-admin-builder.css b/includes/admin/assets/css/um-admin-builder.css similarity index 95% rename from admin/assets/css/um-admin-builder.css rename to includes/admin/assets/css/um-admin-builder.css index 89d6d331..c1cfee39 100644 --- a/admin/assets/css/um-admin-builder.css +++ b/includes/admin/assets/css/um-admin-builder.css @@ -29,7 +29,7 @@ text-decoration: none; } -.um-admin-drag-add-field:hover {color: #3ba1da} +.um-admin-drag-add-field:hover {color: #0085ba} .um-admin-drag-add-field i { font-size: 23px !important; @@ -69,7 +69,8 @@ .um-admin-drag-ctrls a.active, .um-admin-drag-ctrls a.active:hover { - background-color: #3ba1da; + /*background-color: #3ba1da;*/ + background-color: #0085ba; color: #fff; } @@ -160,7 +161,7 @@ font-size: 23px !important; margin: 0 !important; } -.um-admin-drag-addrow:hover {color: #3ba1da} +.um-admin-drag-addrow:hover {color: #0085ba} /* - Fields @@ -251,7 +252,8 @@ text-align: center; display: block !important; float: left; - background: #44b0ec; + /*background: #44b0ec;*/ + background: #0085ba; padding: 0 4px; transition: all .2s linear; border-left: 1px solid #379dd5; @@ -265,7 +267,7 @@ .um-admin-drag-row-icons span:hover, .um-admin-drag-rowsub-icons a:hover, .um-admin-drag-rowsub-icons span:hover, -.um-admin-drag-fld-icons a:hover {background: #3396cd;} +.um-admin-drag-fld-icons a:hover {background: #008ec2;/*background: #3396cd;*/} .um-admin-drag-row-icons i, .um-admin-drag-rowsub-icons i, diff --git a/admin/assets/css/um-admin-columns.css b/includes/admin/assets/css/um-admin-columns.css similarity index 98% rename from admin/assets/css/um-admin-columns.css rename to includes/admin/assets/css/um-admin-columns.css index 676dd15d..5f8730dc 100644 --- a/admin/assets/css/um-admin-columns.css +++ b/includes/admin/assets/css/um-admin-columns.css @@ -38,7 +38,7 @@ width: 100%; box-sizing: border-box; text-align: center; - background: #3ba1da; + background: #0085ba; color: #fff; font-size: 14px; height: 34px; diff --git a/admin/assets/css/um-admin-dashboard.css b/includes/admin/assets/css/um-admin-dashboard.css similarity index 95% rename from admin/assets/css/um-admin-dashboard.css rename to includes/admin/assets/css/um-admin-dashboard.css index 9915fc96..648855df 100644 --- a/admin/assets/css/um-admin-dashboard.css +++ b/includes/admin/assets/css/um-admin-dashboard.css @@ -1,11 +1,11 @@ -#um-extensions-wrap a.plugin-image, +#um-extensions-wrap a.plugin-image, #um-extensions-wrap a.plugin-image img { max-width: 100%; display: block; } #um-extensions-wrap .plugin-card { - width: calc( 33% - 8px ); + width: calc( 33% - 8px ); clear: none !important; margin-right: 8px !important; margin-left: 0 !important; @@ -76,7 +76,7 @@ #um-extensions-wrap .plugin-card-top { - min-height: 140px; + min-height: 140px; } @media screen and (max-width: 782px) { @@ -98,11 +98,10 @@ font-size: 14px; position: relative; font-weight: 400; - background: #3ba1da; + background: #0085ba; color: #fff !important; padding: 2px 4px !important; border-radius: 3px; - position: relative; top: 5px; left: 3px; border: none !important; @@ -210,4 +209,4 @@ color: #777 !important; font-size: 22px !important; } -.um-admin-dash-share a:hover {color: #3ba1da !important} \ No newline at end of file +.um-admin-dash-share a:hover {color: #0085ba !important} \ No newline at end of file diff --git a/admin/assets/css/um-admin-form.css b/includes/admin/assets/css/um-admin-form.css similarity index 100% rename from admin/assets/css/um-admin-form.css rename to includes/admin/assets/css/um-admin-form.css diff --git a/includes/admin/assets/css/um-admin-forms.css b/includes/admin/assets/css/um-admin-forms.css new file mode 100644 index 00000000..0176f3d3 --- /dev/null +++ b/includes/admin/assets/css/um-admin-forms.css @@ -0,0 +1,174 @@ +.um-form-table.um-third-column .um-forms-line th { + width: 33%; +} + +.um-form-table.um-half-column .um-forms-line th { + width: 50%; +} + +.um-form-table.um-two-thirds-column .um-forms-line th { + width: 83%; +} + +.um-form-table.um-top-label .um-forms-line td { + padding: 0 0 15px 0; +} + +input[type=text].um-forms-field.um-long-field, +select.um-forms-field.um-long-field, +textarea.um-forms-field.um-long-field { + width:100% !important; +} + +input[type=text].um-forms-field.um-medium-field, +select.um-forms-field.um-medium-field, +textarea.um-forms-field.um-medium-field { + width:50% !important; +} + +input[type=text].um-forms-field.um-small-field, +select.um-forms-field.um-small-field, +textarea.um-forms-field.um-small-field { + width:25% !important; +} + + + +.um-multi-text-list, +.um-multi-selects-list { + float: left; + width:100%; + margin: 0 0 10px 0; +} + +.um-hidden-multi-text, +.um-hidden-multi-selects { + display: none !important; +} + +.um-multi-text-option-line, +.um-multi-selects-option-line { + float:left; + width:100%; + margin: 0; + padding: 0; + clear:both; +} + +.um-multi-text-option-line .um-field-wrapper, +.um-multi-selects-option-line .um-field-wrapper { + float:left; + width: calc( 100% - 60px ); + line-height: 30px; + box-sizing: border-box; +} + +.um-multi-text-option-line .um-field-wrapper input, +.um-multi-selects-option-line .um-field-wrapper select { + float:left; + width: 100%; + margin:0; +} + + +.um-multi-text-option-line .um-field-control, +.um-multi-selects-option-line .um-field-control { + float:left; + width: 60px; + line-height: 30px; + padding: 0 10px; + box-sizing: border-box; +} + +.um-form-table .description { + font-style: italic; +} + + +.um-form-fields-section { + float:left; + clear: none; + margin:0; + padding: 0 10px 0 0; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} + +.um-form-fields-section label { + float:left; + width:100%; + margin:0; + padding:0; +} + +.um-form-fields-section label input { + float:left; + margin-top:0; +} + +.um-form-fields-section label span { + float:left; + width:calc( 100% - 20px ); +} + + +@media screen and (max-width: 782px) { + .um-form-fields-section { + width:100% !important; + } + .um-admin-metabox .um-form-fields-section label { + line-height: 22px !important; + margin: 0 0 12px 0 !important; + } + .um-form-fields-section label span { + width:calc( 100% - 30px ); + } + + .um-multi-text-option-line, + .um-multi-selects-option-line { + margin: 0 0 6px 0; + } + + .um-forms-line label { + float:left; + width:100%; + } + + + .um-form-table.um-third-column .um-forms-line th, + .um-form-table.um-half-column .um-forms-line th, + .um-form-table.um-two-thirds-column .um-forms-line th { + width: 100%; + } +} + + +/*Multi text filed */ +.um-forms-line .um-text-delete { + color: #a00; + float:left; +} + +.um-forms-line .um-text-delete:hover { + color: red; +} + +.um-forms-line .um-multi-text-add-option { + margin-bottom: 14px; +} + + +/* Media uploader */ +.um-forms-line .icon_preview { + display: none; + max-width: 200px; + max-height: 200px; + padding: 5px; + cursor: pointer; + border: 1px solid #e3e3e3; + background: #f7f7f7; + border-radius: 3px; + height: auto; + width: auto !important; +} \ No newline at end of file diff --git a/includes/admin/assets/css/um-admin-global.css b/includes/admin/assets/css/um-admin-global.css new file mode 100644 index 00000000..4f233bbc --- /dev/null +++ b/includes/admin/assets/css/um-admin-global.css @@ -0,0 +1,181 @@ +.um-admin-notice { + border-color: #0085ba !important; + color: #555; +} + +.um-admin-notice a.button-primary { + background-color: #0085ba !important; + border-color: #0085ba !important; +} + +.um-admin-notice a.button-primary:hover { + background-color: #008ec2 !important; + border-color: #008ec2 !important; +} + +.um-admin-notice a.button-secondary {opacity: 0.7} +.um-admin-notice a.button-secondary:hover {opacity: 0.9} +.um-admin-notice a {text-decoration: none;color: #0085ba} +.um-admin-notice a:hover {color: #44b0ec} + +.um-filter { + padding: 12px; + border-color: #ddd !important; + margin: 20px 0 0 0 !important; + font-size: 14px; + line-height: 24px; +} + +/* + - General metabox styling +*/ + +#um-admin-access-settings h3 { + padding: 10px 20px 10px 60px; + color: #fff; + background: #0085ba url(../img/logo-small.png) no-repeat 12px center; + font-weight: bold; + font-size: 14px !important; + -webkit-font-smoothing: antialiased !important; + -moz-osx-font-smoothing: grayscale !important; +} + +#um-admin-access-settings h4 { margin: 10px 0 4px 0!important} + +#um-admin-access-settings div.handlediv { + color: #fff !important; + -webkit-font-smoothing: antialiased !important; + -moz-osx-font-smoothing: grayscale !important; +} + +#um-admin-access-settings p {font-size: 13px} + +#um-admin-access-settings input[type=text] {font-size: 13px} + +/* + - Nav Menu +*/ + +.um-nav-edit * { + -webkit-font-smoothing: antialiased !important; + -moz-osx-font-smoothing: grayscale !important; +} + +.um-nav-edit-h2 { + padding: 10px 20px 10px 60px; + margin: 14px 12px 0 0; + border-radius: 3px; + color: #fff; + background: #0085ba url(../img/logo-small.png) no-repeat 12px center; + font-weight: bold; +} + +.um-nav-mode {margin-top:10px} +.um-nav-roles {display: none;margin-top:5px} + +/* + - jQuery Tooltips +*/ + +.um-admin-tip { + margin: 0 0 0 2px; + color: #0085ba !important; + vertical-align: middle; + position: relative; + top: -3px; + opacity: 0.8; +} +.um-admin-tip.n {margin-left: 5px} +.um-admin-tip i {cursor: pointer; vertical-align: middle; font-size: 20px; line-height: 20px;color: #0085ba !important;} +a.um-delete{ color: #a00; } + + + +/* Roles metabox + table features */ +.um-metabox-section .description { + font-style: italic; +} + +.um-metabox-section th { + width: 35%; +} + +.wp-list-table.roles .column-core, +.wp-list-table.roles .column-users, +.wp-list-table.roles .column-admin_access { + width:15%; + text-align: center !important; +} + +@media screen and (max-width: 782px) { + .wp-list-table.roles .column-core, + .wp-list-table.roles .column-users, + .wp-list-table.roles .column-admin_access { + text-align: left !important; + } +} + +#um-admin-form-wp-capabilities .um-metadata-line th { + width: auto; +} + +#um-admin-form-wp-capabilities .um-metadata-line td { + width: 20px; +} + +#um_edit_role #titlewrap > span { + width: 40px; + font-size: 24px; + float:left; + display: block; + line-height: 37px; +} + +#um_edit_role #title { + width: calc( 100% - 40px ); + float:left; +} + +#um-roles .row-actions .reset a { + color:#a00; +} + +#um-roles .row-actions .reset a:hover { + color:red; +} + + +/*Tooltip*/ +.ui-tooltip.um_tooltip { + padding: 8px; + color: #eeeeee; + background-color: #333; + position: absolute; + z-index: 1000000; + max-width: 300px; + font-size: 12px; + border-radius: 5px; +} + +.um_tooltip.dashicons, +.um_tooltip.dashicons:before { + height:22px; +} + +.um_tooltip.dashicons-editor-help::before { + float: left; + font-size: 20px; + line-height: 20px; + color: #333 !important; +} +.um_tooltip { + cursor: pointer; + vertical-align: middle; +} +.um_tooltip:hover { + opacity: 1; +} + +.um_tooltip:hover:before { + opacity: 0.8; +} \ No newline at end of file diff --git a/admin/assets/css/um-admin-menu.css b/includes/admin/assets/css/um-admin-menu.css similarity index 100% rename from admin/assets/css/um-admin-menu.css rename to includes/admin/assets/css/um-admin-menu.css diff --git a/admin/assets/css/um-admin-misc.css b/includes/admin/assets/css/um-admin-misc.css similarity index 95% rename from admin/assets/css/um-admin-misc.css rename to includes/admin/assets/css/um-admin-misc.css index cbbe9603..6aeb7869 100644 --- a/admin/assets/css/um-admin-misc.css +++ b/includes/admin/assets/css/um-admin-misc.css @@ -15,12 +15,12 @@ font-size: 22px !important; } -.um-about-wrap a.um-about-icon:hover {color: #3ba1da !important} +.um-about-wrap a.um-about-icon:hover {color: #0085ba !important} .um-badge { color: #fff; background: none !important; - background: #3ba1da url(../img/logo_small.png) no-repeat center 0px !important; + background: #0085ba url(../img/logo_small.png) no-repeat center 0px !important; } .um-about-wrap .ultimatemember-actions a.button-primary, @@ -76,7 +76,8 @@ body.um-admin-modal-open { .um-admin a.um-admin-activebg, .um-admin a.um-admin-activebg:hover{ - background: #3ba1da; + /*background: #3ba1da;*/ + background: #0085ba; color: #fff; } @@ -237,7 +238,7 @@ p.disabled-on-off .um-admin-yesno *{ } .um-admin-yesno .yes { - background: #3ba1da; + background: #0085ba; border-radius: 3px 0 0 3px; border: 1px solid rgba(0,0,0,.2); } diff --git a/admin/assets/css/um-admin-modal.css b/includes/admin/assets/css/um-admin-modal.css similarity index 98% rename from admin/assets/css/um-admin-modal.css rename to includes/admin/assets/css/um-admin-modal.css index 9f970b06..0bad1be0 100644 --- a/admin/assets/css/um-admin-modal.css +++ b/includes/admin/assets/css/um-admin-modal.css @@ -68,7 +68,7 @@ .um-admin-modal-head { padding: 4px 20px; - background: #3ba1da; + background: #0085ba; position: relative; border-radius: 3px 3px 0 0; } @@ -156,7 +156,7 @@ } .um-admin-btn-toggle a.active, .um-admin-btn-toggle a.active:hover { - color: #3ba1da; + color: #0085ba; } .um-admin-btn-toggle i { @@ -272,7 +272,7 @@ p._icon_search input[type=text]{padding-right: 40px!important} } .um-admin-icons span:hover, .um-admin-icons span.highlighted -{color: #3ba1da;border-color: #3ba1da} +{color: #0085ba;border-color: #0085ba} .um-admin-icons i{vertical-align: middle !important;font-size: 24px;width: 24px;text-align: center;padding: 15px 20px;display: inline-block;} @@ -282,7 +282,7 @@ span.um-admin-icon-value { } span.um-admin-icon-value i { font-size: 28px; - color: #3ba1da; + color: #0085ba; position: relative; top: 5px; } diff --git a/admin/assets/css/um-admin-rtl.css b/includes/admin/assets/css/um-admin-rtl.css similarity index 71% rename from admin/assets/css/um-admin-rtl.css rename to includes/admin/assets/css/um-admin-rtl.css index ce02029d..3518122f 100644 --- a/admin/assets/css/um-admin-rtl.css +++ b/includes/admin/assets/css/um-admin-rtl.css @@ -43,19 +43,6 @@ margin: 0 20px 0 0; } -.redux-main { - margin-left: 0!important; - margin-right: 201px !important; -} - -#redux-header h2 { - padding: 2px 0 4px 15px; -} - -.redux-container #redux-header .display_header {float: right} - -.admin-color-fresh .redux-sidebar .redux-group-menu li.hasSubSections a .extraIconSubsections {float: left} - .select2-container .select2-choice > .select2-chosen { text-align: right !important; } @@ -69,6 +56,4 @@ .select2-container .select2-choice > .select2-chosen { margin-right: 10px !important; margin-left: 26px !important; -} - -.redux-container-switch .switch-options {float: right;margin-right:0!important} \ No newline at end of file +} \ No newline at end of file diff --git a/admin/assets/css/um-admin-select2.css b/includes/admin/assets/css/um-admin-select2.css similarity index 100% rename from admin/assets/css/um-admin-select2.css rename to includes/admin/assets/css/um-admin-select2.css diff --git a/includes/admin/assets/css/um-admin-settings.css b/includes/admin/assets/css/um-admin-settings.css new file mode 100644 index 00000000..d6829751 --- /dev/null +++ b/includes/admin/assets/css/um-admin-settings.css @@ -0,0 +1,216 @@ +.um-settings-section .description { + font-style: italic; +} + + + + + + +.um-notification-status { + margin-right: 18px; + font-size: 28px; + line-height: 22px; +} + +.um-notification-status { + color: #a00; + float:left; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} + +.um-notification-status.um-notification-is-active { + color: #46b450; +} + +.um-email-configure span { + line-height: 24px; +} + +.um-long-field { + width:100%; +} + +.um-medium-field { + width:50%; +} + +.um-small-field { + width:25%; +} + +.column-configure { + width: 60px; + text-align: center; +} + +th.column-email.column-primary { + padding-left: 48px; +} + +.um-nav-tab-wrapper { + margin-right: 20px; +} + +#um-settings-emails { + float:left; + width:calc( 100% - 20px ); + margin-right: 20px; +} +#um-settings-form { + float:left; + width:calc( 100% - 10px ); + margin-right: 10px; +} + +#um-settings-form .subsubsub { + float:left; + width:100%; +} + + +.um-settings-line .multi-checkbox-line { + float:left; + width:100%; + clear: both; + margin: 0 0 10px 0; + padding: 0; +} + +.um-settings-line .multi-checkbox-column { + float:left; + margin: 0; + padding:0; +} + +.um-settings-line .multi-checkbox-column label { + float:left; + width:100%; +} + + +.wrap-licenses .form-table, +.wrap-licenses thead, +.wrap-licenses tbody, +.wrap-licenses tfoot, +.wrap-licenses tr, +.wrap-licenses td, +.wrap-licenses th, +.wrap-licenses caption { + display: block; +} +.wrap-licenses .form-table tr { + float: left; + margin: 0 15px 15px 0; + background: #fff; + border: 1px solid #ccc; + width: 30.5%; + max-width: 350px; + padding: 14px; + min-height: 220px; + position: relative; + box-sizing: border-box; +} +.wrap-licenses .form-table th { + background: #f9f9f9; + padding: 14px; + border-bottom: 1px solid #ccc; + margin: -14px -14px 20px; + width: 100%; +} +.wrap-licenses .form-table td { + padding: 0; +} +.wrap-licenses td input.regular-text { + margin: 0 0 8px; + width: 100%; +} +.wrap-licenses .edd-license-data[class*="edd-license-"] { + position: absolute; + background: #fafafa; + padding: 14px; + border-top: 1px solid #eee; + margin: 20px -14px -14px; + min-height: 67px; + width: 100%; + bottom: 14px; + box-sizing: border-box; +} +.wrap-licenses .edd-license-data[class*="edd-license-"] a { + color: #444; +} +.wrap-licenses .edd-license-data[class*="edd-license-"] a:hover { + text-decoration: none; +} +.wrap-licenses .edd-license-data.license-expires-soon-notice { + background-color: #00a0d2; + color: #fff; + border-color: #00a0d2; +} +.wrap-licenses .edd-license-data.edd-license-expired { + background-color: #e24e4e; + color: #fff; + border-color: #e24e4e; +} + +.wrap-licenses .edd-license-data.edd-license-valid { + background-color: #5abc55; + color: #fff; + border-color: #5abc55; +} +.wrap-licenses .edd-license-data.edd-license-error, +.wrap-licenses .edd-license-data.edd-license-missing, +.wrap-licenses .edd-license-data.edd-license-invalid, +.wrap-licenses .edd-license-data.edd-license-site_inactive, +.wrap-licenses .edd-license-data.edd-license-item_name_mismatch { + background-color: #ffebcd; + border-color: #ffebcd; +} +.wrap-licenses .edd-license-data p { + font-size: 13px; + margin-top: 0; +} +.wrap-licenses .edd-license-data.license-expires-soon-notice a, +.wrap-licenses .edd-license-data.edd-license-expired a { + color: #fff; +} +.wrap-licenses .edd-license-data.license-expires-soon-notice a:hover, +.wrap-licenses .edd-license-data.edd-license-expired a:hover { + text-decoration: none; +} +.wrap-licenses ~ p.submit { + clear: both; +} + +@media screen and (max-width: 980px) { + .wrap-licenses .form-table tr { + width:calc( 50% - 15px ); + max-width: none; + } +} + +@media screen and (max-width: 782px) { + .wrap-licenses .form-table tr { + width:100%; + margin-right: 0; + max-width: none; + } + + + .um-settings-line .multi-checkbox-column { + width:100% !important; + } + .um-settings-line .multi-checkbox-column label { + line-height: 30px !important; + } + + .um-medium-field { + width:100%; + } + + .um-small-field { + width:50%; + } +} \ No newline at end of file diff --git a/admin/assets/img/1-column-active.gif b/includes/admin/assets/img/1-column-active.gif similarity index 100% rename from admin/assets/img/1-column-active.gif rename to includes/admin/assets/img/1-column-active.gif diff --git a/admin/assets/img/1-column.gif b/includes/admin/assets/img/1-column.gif similarity index 100% rename from admin/assets/img/1-column.gif rename to includes/admin/assets/img/1-column.gif diff --git a/admin/assets/img/2-columns-active.gif b/includes/admin/assets/img/2-columns-active.gif similarity index 100% rename from admin/assets/img/2-columns-active.gif rename to includes/admin/assets/img/2-columns-active.gif diff --git a/admin/assets/img/2-columns.gif b/includes/admin/assets/img/2-columns.gif similarity index 100% rename from admin/assets/img/2-columns.gif rename to includes/admin/assets/img/2-columns.gif diff --git a/admin/assets/img/3-columns-active.gif b/includes/admin/assets/img/3-columns-active.gif similarity index 100% rename from admin/assets/img/3-columns-active.gif rename to includes/admin/assets/img/3-columns-active.gif diff --git a/admin/assets/img/3-columns.gif b/includes/admin/assets/img/3-columns.gif similarity index 100% rename from admin/assets/img/3-columns.gif rename to includes/admin/assets/img/3-columns.gif diff --git a/admin/assets/img/ajax-loader.gif b/includes/admin/assets/img/ajax-loader.gif similarity index 100% rename from admin/assets/img/ajax-loader.gif rename to includes/admin/assets/img/ajax-loader.gif diff --git a/admin/assets/img/logo-header.png b/includes/admin/assets/img/logo-header.png similarity index 100% rename from admin/assets/img/logo-header.png rename to includes/admin/assets/img/logo-header.png diff --git a/admin/assets/img/logo-small.png b/includes/admin/assets/img/logo-small.png similarity index 100% rename from admin/assets/img/logo-small.png rename to includes/admin/assets/img/logo-small.png diff --git a/admin/assets/img/logo.png b/includes/admin/assets/img/logo.png similarity index 100% rename from admin/assets/img/logo.png rename to includes/admin/assets/img/logo.png diff --git a/admin/assets/img/logo_small.png b/includes/admin/assets/img/logo_small.png similarity index 100% rename from admin/assets/img/logo_small.png rename to includes/admin/assets/img/logo_small.png diff --git a/admin/assets/js/um-admin-ajax.js b/includes/admin/assets/js/um-admin-ajax.js similarity index 86% rename from admin/assets/js/um-admin-ajax.js rename to includes/admin/assets/js/um-admin-ajax.js index 41f72cfb..a1df562d 100644 --- a/admin/assets/js/um-admin-ajax.js +++ b/includes/admin/assets/js/um-admin-ajax.js @@ -30,9 +30,9 @@ jQuery(document).ready(function() { um_admin_remove_modal(); jQuery.ajax({ - url: ultimatemember_ajax_url, + url: um_admin_ajax_data.ajax_url, type: 'POST', - data: {action: 'ultimatemember_do_ajax_action', act_id : act_id, arg1 : arg1, arg2 : arg2, in_row: in_row, in_sub_row: in_sub_row, in_column: in_column, in_group: in_group }, + data: { act_id : act_id, arg1 : arg1, arg2 : arg2, in_row: in_row, in_sub_row: in_sub_row, in_column: in_column, in_group: in_group }, success: function(data){ jQuery('.um-col-demon-settings').data('in_row', ''); diff --git a/admin/assets/js/um-admin-builder.js b/includes/admin/assets/js/um-admin-builder.js similarity index 84% rename from admin/assets/js/um-admin-builder.js rename to includes/admin/assets/js/um-admin-builder.js index 5d7c22fc..380a1e0a 100644 --- a/admin/assets/js/um-admin-builder.js +++ b/includes/admin/assets/js/um-admin-builder.js @@ -3,16 +3,18 @@ builder area with fields **/ -function um_admin_update_builder(){ +function um_admin_update_builder() { form_id = jQuery('.um-admin-builder').data('form_id'); jQuery('.tipsy').hide(); jQuery.ajax({ - url: ultimatemember_ajax_url, + url: um_admin_builder_data.ajax_url, type: 'POST', - data: {action: 'update_builder', form_id: form_id }, + data: { + form_id: form_id + }, success: function(data){ jQuery('.um-admin-drag-ajax').html(data); diff --git a/admin/assets/js/um-admin-dashboard.js b/includes/admin/assets/js/um-admin-dashboard.js similarity index 100% rename from admin/assets/js/um-admin-dashboard.js rename to includes/admin/assets/js/um-admin-dashboard.js diff --git a/admin/assets/js/um-admin-dragdrop.js b/includes/admin/assets/js/um-admin-dragdrop.js similarity index 99% rename from admin/assets/js/um-admin-dragdrop.js rename to includes/admin/assets/js/um-admin-dragdrop.js index ac063805..b282d1ab 100644 --- a/admin/assets/js/um-admin-dragdrop.js +++ b/includes/admin/assets/js/um-admin-dragdrop.js @@ -244,9 +244,9 @@ function UM_Rows_Refresh(){ UM_Add_Icon(); jQuery.ajax({ - url: ultimatemember_ajax_url, + url: um_admin_dragdrop_data.ajax_url, type: 'POST', - data: jQuery('.um_update_order').serialize(), + data: jQuery( '.um_update_order' ).serialize(), success: function(){ jQuery('#publish').removeAttr('disabled'); } diff --git a/admin/assets/js/um-admin-field.js b/includes/admin/assets/js/um-admin-field.js similarity index 90% rename from admin/assets/js/um-admin-field.js rename to includes/admin/assets/js/um-admin-field.js index e6a32cb4..a677ec53 100644 --- a/admin/assets/js/um-admin-field.js +++ b/includes/admin/assets/js/um-admin-field.js @@ -11,9 +11,9 @@ jQuery(document).ready(function() { arg1 = jQuery(this).parents('a').data('arg1'); jQuery.ajax({ - url: ultimatemember_ajax_url, + url: um_admin_field_data.do_ajax_url, type: 'POST', - data: {action: 'ultimatemember_do_ajax_action', act_id : 'um_admin_remove_field_global', arg1 : arg1 }, + data: {act_id : 'um_admin_remove_field_global', arg1 : arg1 }, success: function(data){ }, @@ -36,7 +36,7 @@ jQuery(document).ready(function() { var form = jQuery(this); jQuery.ajax({ - url: ultimatemember_ajax_url, + url: um_admin_field_data.ajax_url, type: 'POST', dataType: 'json', data: form.serialize(), diff --git a/admin/assets/js/um-admin-form.js b/includes/admin/assets/js/um-admin-form.js similarity index 100% rename from admin/assets/js/um-admin-form.js rename to includes/admin/assets/js/um-admin-form.js diff --git a/includes/admin/assets/js/um-admin-forms.js b/includes/admin/assets/js/um-admin-forms.js new file mode 100644 index 00000000..21d236f5 --- /dev/null +++ b/includes/admin/assets/js/um-admin-forms.js @@ -0,0 +1,241 @@ +jQuery(document).ready( function() { + + /** + * Multi-selects field + */ + jQuery( 'body' ).on( 'click', '.um-select-delete', function() { + jQuery( this ).parents( 'li.um-multi-selects-option-line' ).remove(); + }); + + + jQuery( '.um-multi-selects-add-option' ).click( function() { + var list = jQuery(this).siblings('ul.um-multi-selects-list'); + + var field_id = list.data('field_id'); + var k = 0; + if ( list.find( 'li:last select.um-forms-field' ).length > 0 ) { + k = list.find( 'li:last select.um-forms-field' ).attr('id').split("-"); + k = k[1]*1 + 1; + } + + var selector_html = jQuery( '
            ' ).append( list.siblings('.um-hidden-multi-selects').clone() ).html(); + + var classes = list.find('li:last').attr('class'); + + list.append( + '
          • ' + selector_html + + '' + php_data.texts.remove + '
          • ' + ); + + list.find('li:last .um-hidden-multi-selects').attr('name', jQuery(this).data('name') ). + addClass('um-forms-field um-long-field').removeClass('um-hidden-multi-selects').attr('id', list.data('id_attr') + '-' + k); + + }); + + + /** + * Multi-text field + */ + jQuery( 'body' ).on( 'click', '.um-text-delete', function() { + jQuery(this).parents('li.um-multi-text-option-line').remove(); + }); + + + jQuery( '.um-multi-text-add-option' ).click( function() { + var list = jQuery(this).siblings( 'ul.um-multi-text-list' ); + + var field_id = list.data( 'field_id' ); + var k = 0; + if ( list.find( 'li:last input.um-forms-field' ).length > 0 ) { + k = list.find( 'li:last input.um-forms-field' ).attr('id').split("-"); + k = k[1]*1 + 1; + } + + var text_html = jQuery( '
            ' ).append( list.siblings('.um-hidden-multi-text').clone() ).html(); + + var classes = list.find('li:last').attr('class'); + + list.append( + '
          • ' + text_html + + '' + php_data.texts.remove + '
          • ' + ); + + list.find('li:last .um-hidden-multi-text').attr('name', jQuery(this).data('name') ). + addClass('um-forms-field um-long-field').removeClass('um-hidden-multi-text').attr('id', list.data('id_attr') + '-' + k); + }); + + + /** + * Media uploader + */ + jQuery( '.um-media-upload' ).each( function() { + var field = jQuery(this).find( '.um-forms-field' ); + var default_value = field.data('default'); + + if ( field.val() != '' && field.val() != default_value ) { + field.siblings('.um-set-image').hide(); + field.siblings('.um-clear-image').show(); + field.siblings('.icon_preview').show(); + } else { + if ( field.val() == default_value ) { + field.siblings('.icon_preview').show(); + } + field.siblings('.um-set-image').show(); + field.siblings('.um-clear-image').hide(); + } + }); + + + if ( typeof wp !== 'undefined' && wp.media && wp.media.editor ) { + var frame; + + jQuery( '.um-set-image' ).click( function(e) { + var button = jQuery(this); + + e.preventDefault(); + + // If the media frame already exists, reopen it. + if ( frame ) { + frame.remove(); + /*frame.open(); + return;*/ + } + + // Create a new media frame + frame = wp.media({ + title: button.data('upload_frame'), + button: { + text: php_data.texts.select + }, + multiple: false // Set to true to allow multiple files to be selected + }); + + // When an image is selected in the media frame... + frame.on( 'select', function() { + // Get media attachment details from the frame state + var attachment = frame.state().get('selection').first().toJSON(); + + // Send the attachment URL to our custom image input field. + button.siblings('.icon_preview').attr( 'src', attachment.url ).show(); + + button.siblings('.um-forms-field').val( attachment.url ); + button.siblings('.um-media-upload-data-id').val(attachment.id); + button.siblings('.um-media-upload-data-width').val(attachment.width); + button.siblings('.um-media-upload-data-height').val(attachment.height); + button.siblings('.um-media-upload-data-thumbnail').val(attachment.thumbnail); + button.siblings('.um-media-upload-url').val(attachment.url); + + button.siblings('.um-clear-image').show(); + button.hide(); + }); + + frame.open(); + }); + + jQuery('.icon_preview').click( function(e) { + jQuery(this).siblings('.um-set-image').trigger('click'); + }); + + jQuery('.um-clear-image').click( function(e) { + var default_image_url = jQuery(this).siblings('.um-forms-field').data('default'); + jQuery(this).siblings('.um-set-image').show(); + jQuery(this).hide(); + jQuery(this).siblings('.icon_preview').attr( 'src', default_image_url ); + jQuery(this).siblings('.um-media-upload-data-id').val(''); + jQuery(this).siblings('.um-media-upload-data-width').val(''); + jQuery(this).siblings('.um-media-upload-data-height').val(''); + jQuery(this).siblings('.um-media-upload-data-thumbnail').val(''); + jQuery(this).siblings('.um-forms-field').val( default_image_url ); + jQuery(this).siblings('.um-media-upload-url').val( default_image_url ); + }); + } + + + /** + * On option fields change + */ + jQuery('body').on('change', '.um-forms-field', function() { + if ( jQuery('.um-forms-line[data-conditional*=\'"' + jQuery(this).data('field_id') + '",\']').length > 0 ) { + run_check_conditions(); + } + }); + + + //first load hide unconditional fields + run_check_conditions(); + + + /** + * Run conditional logic + */ + function run_check_conditions() { + jQuery( '.um-forms-line' ).removeClass('um-forms-line-conditioned').each( function() { + if ( typeof jQuery(this).data('conditional') === 'undefined' || jQuery(this).hasClass('um-forms-line-conditioned') ) + return; + + if ( check_condition( jQuery(this) ) ) + jQuery(this).show(); + else + jQuery(this).hide(); + }); + } + + + /** + * Conditional logic + * + * true - show field + * false - hide field + * + * @returns {boolean} + */ + function check_condition( form_line ) { + + form_line.addClass( 'um-forms-line-conditioned' ); + + var conditional = form_line.data('conditional'); + var condition = conditional[1]; + var value = conditional[2]; + + var prefix = form_line.data( 'prefix' ); + //var prefix = form_line.parents( '.um-form-table' ).data( 'prefix' ); + + var condition_field = jQuery( '#' + prefix + '_' + conditional[0] ); + var parent_condition = true; + if ( typeof condition_field.parents('.um-forms-line').data('conditional') !== 'undefined' ) { + parent_condition = check_condition( condition_field.parents('.um-forms-line') ); + } + + var own_condition = false; + if ( condition == '=' ) { + var tagName = condition_field.prop("tagName").toLowerCase(); + + if ( tagName == 'input' ) { + var input_type = condition_field.attr('type'); + if ( input_type == 'checkbox' ) { + own_condition = ( value == '1' ) ? condition_field.is(':checked') : ! condition_field.is(':checked'); + } else { + own_condition = ( condition_field.val() == value ); + } + } else if ( tagName == 'select' ) { + own_condition = ( condition_field.val() == value ); + } + } else if ( condition == '!=' ) { + var tagName = condition_field.prop("tagName").toLowerCase(); + + if ( tagName == 'input' ) { + var input_type = condition_field.attr('type'); + if ( input_type == 'checkbox' ) { + own_condition = ( value == '1' ) ? ! condition_field.is(':checked') : condition_field.is(':checked'); + } else { + own_condition = ( condition_field.val() != value ); + } + } else if ( tagName == 'select' ) { + own_condition = ( condition_field.val() != value ); + } + } + + return ( own_condition && parent_condition ); + } + +}); \ No newline at end of file diff --git a/admin/assets/js/um-admin-modal.js b/includes/admin/assets/js/um-admin-modal.js similarity index 87% rename from admin/assets/js/um-admin-modal.js rename to includes/admin/assets/js/um-admin-modal.js index 5f3b841b..74a59c10 100644 --- a/admin/assets/js/um-admin-modal.js +++ b/includes/admin/assets/js/um-admin-modal.js @@ -1,9 +1,9 @@ function um_admin_live_update_scripts() { - jQuery('.um-admin-modal-body:visible select').select2({ + /*jQuery('.um-admin-modal-body:visible select').select2({ allowClear: false, minimumResultsForSearch: 10 - }); + });*/ jQuery('.um-adm-conditional').each(function(){jQuery(this).trigger('change');}); @@ -51,9 +51,9 @@ function um_admin_modal_ajaxcall( act_id, arg1, arg2, arg3 ) { } jQuery.ajax({ - url: ultimatemember_ajax_url, + url: um_admin_modal_data.ajax_url, type: 'POST', - data: {action: 'ultimatemember_dynamic_modal_content', act_id: act_id, arg1 : arg1, arg2 : arg2, arg3: arg3, in_row: in_row, in_sub_row: in_sub_row, in_column: in_column, in_group: in_group }, + data: {act_id: act_id, arg1 : arg1, arg2 : arg2, arg3: arg3, in_row: in_row, in_sub_row: in_sub_row, in_column: in_column, in_group: in_group }, complete: function(){ um_admin_modal_loaded(); um_admin_modal_responsive(); @@ -65,11 +65,13 @@ function um_admin_modal_ajaxcall( act_id, arg1, arg2, arg3 ) { um_responsive(); um_admin_live_update_scripts(); - + + jQuery( "#_custom_dropdown_options_source" ).trigger('blur'); + if ( jQuery('.um-admin-editor:visible').length > 0 ) { - + if ( act_id == 'um_admin_edit_field_popup' ) { - + tinyMCE.execCommand('mceRemoveEditor', true, 'um_editor_edit'); jQuery('.um-admin-editor:visible').html( jQuery('.um-hidden-editor-edit').contents() ); tinyMCE.execCommand('mceAddEditor', true, 'um_editor_edit'); @@ -83,7 +85,7 @@ function um_admin_modal_ajaxcall( act_id, arg1, arg2, arg3 ) { var editor = tinyMCE.get('um_editor_edit'); var content = editor.getContent(); editor.setContent( jQuery('.um-admin-modal:visible .dynamic-mce-content').html() ); - + } else { tinyMCE.execCommand('mceRemoveEditor', true, 'um_editor_new'); @@ -191,24 +193,29 @@ jQuery(document).ready(function() { clone a condition **/ jQuery(document).on('click', '.um-admin-new-condition', function(){ + if ( jQuery(this).hasClass('disabled') ) + return false; + var content = jQuery(this).parents('.um-admin-btn-content'); - content.find('select').select2('destroy'); var length = content.find('.um-admin-cur-condition').length; if ( length < 5 ) { - var cloned = jQuery(this).parents('.um-admin-cur-condition').clone(); - cloned.find('input[type=text],select').each(function(){ - jQuery(this).attr('id', jQuery(this).attr('id') + length ); - jQuery(this).attr('name', jQuery(this).attr('name') + length ); - }); - cloned.find('input[type=text]').val(''); - cloned.find('.um-admin-new-condition').replaceWith('

            '); - - cloned.appendTo( content ); - cloned.find('select').val(''); - um_admin_live_update_scripts(); - um_admin_modal_responsive(); + //content.find('select').select2('destroy'); + + var cloned = jQuery(this).parents('.um-admin-cur-condition').clone(); + cloned.find('input[type=text],select').each(function(){ + jQuery(this).attr('id', jQuery(this).attr('id') + length ); + jQuery(this).attr('name', jQuery(this).attr('name') + length ); + }); + cloned.find('input[type=text]').val(''); + cloned.find('.um-admin-new-condition').replaceWith('

            '); + + cloned.appendTo( content ); + cloned.find('select').val(''); + um_admin_live_update_scripts(); + um_admin_modal_responsive(); } else { - alert('You already have 5 rules'); + jQuery(this).addClass('disabled'); + alert( 'You already have 5 rules' ); } }); @@ -220,6 +227,7 @@ jQuery(document).ready(function() { content.find('.um-admin-cur-condition').slice(1).remove(); content.find('input[type=text]').val(''); content.find('select').val(''); + jQuery('.um-admin-new-condition').removeClass('disabled'); um_admin_live_update_scripts(); um_admin_modal_responsive(); }); @@ -229,6 +237,7 @@ jQuery(document).ready(function() { **/ jQuery(document).on('click', '.um-admin-remove-condition', function(){ var condition = jQuery(this).parents('.um-admin-cur-condition'); + jQuery('.um-admin-new-condition').removeClass('disabled'); jQuery('.tipsy').remove(); condition.remove(); um_admin_live_update_scripts(); @@ -339,9 +348,9 @@ jQuery(document).ready(function() { if( me.val() != '' ){ var um_option_callback = me.val(); jQuery.ajax({ - url: ultimatemember_ajax_url, + url: um_admin_modal_data.dropdown_ajax_url, type: 'POST', - data: {action: 'ultimatemember_populate_dropdown_options', um_option_callback: um_option_callback }, + data: { um_option_callback: um_option_callback }, complete: function(){ }, diff --git a/includes/admin/assets/js/um-admin-role-wrapper.js b/includes/admin/assets/js/um-admin-role-wrapper.js new file mode 100644 index 00000000..6ddddf77 --- /dev/null +++ b/includes/admin/assets/js/um-admin-role-wrapper.js @@ -0,0 +1,12 @@ +jQuery( document ).ready( function() { + + jQuery( '#role' ).change( function() { + if ( jQuery.inArray( jQuery(this).val().substr(3), um_roles ) !== -1 ) { + jQuery( '#um_role_selector_wrapper' ).hide(); + jQuery( '#um-role' ).val(''); + } else { + jQuery( '#um_role_selector_wrapper' ).show(); + } + }).trigger('change'); + +}); \ No newline at end of file diff --git a/admin/assets/js/um-admin-scripts.js b/includes/admin/assets/js/um-admin-scripts.js similarity index 68% rename from admin/assets/js/um-admin-scripts.js rename to includes/admin/assets/js/um-admin-scripts.js index a8607a79..7cbec40d 100644 --- a/admin/assets/js/um-admin-scripts.js +++ b/includes/admin/assets/js/um-admin-scripts.js @@ -67,11 +67,11 @@ jQuery(document).ready(function() { jQuery('.um-admin-colorpicker').wpColorPicker(); - /** +/* /!** Select Dropdowns - **/ + **!/ - jQuery(".umaf-selectjs, .ultimate-member_page_um_options .redux-select-item ").select2({ + jQuery(".umaf-selectjs").select2({ allowClear: false, minimumResultsForSearch: 10 }); @@ -79,14 +79,22 @@ jQuery(document).ready(function() { jQuery('.um-admin-field select').select2({ allowClear: true, minimumResultsForSearch: 10 - }); + });*/ /** Tooltips **/ + if ( jQuery( '.um_tooltip' ).length > 0 ) { + jQuery( '.um_tooltip' ).tooltip({ + tooltipClass: "um_tooltip", + content: function () { + return jQuery( this ).attr( 'title' ); + } + }); + } if( typeof tipsy !== 'undefined' ){ - jQuery('.um-admin-tipsy-n,#redux-share a').tipsy({gravity: 'n', opacity: 1, live: 'a.live' }); + jQuery('.um-admin-tipsy-n').tipsy({gravity: 'n', opacity: 1, live: 'a.live' }); jQuery('.um-admin-tipsy-w').tipsy({gravity: 'w', opacity: 1, live: 'a.live' }); jQuery('.um-admin-tipsy-e').tipsy({gravity: 'e', opacity: 1, live: 'a.live' }); jQuery('.um-admin-tipsy-s').tipsy({gravity: 's', opacity: 1, live: 'a.live' }); @@ -98,44 +106,51 @@ jQuery(document).ready(function() { jQuery(document).on('change', '.um-adm-conditional', function(){ + var value; + if ( jQuery(this).attr("type") == 'checkbox' ) { + value = jQuery(this).is(':checked') ? 1 : 0; + } else { + value = jQuery(this).val(); + } + if ( jQuery(this).data('cond1') ) { - if (jQuery(this).val() == jQuery(this).data('cond1') ){ - jQuery('.' + jQuery(this).data('cond1-show') ).show(); - jQuery('.' + jQuery(this).data('cond1-hide') ).hide(); - - if ( jQuery(this).data('cond1-show') == '_roles' ) { - return false; - } - - } else { - jQuery('.' + jQuery(this).data('cond1-show') ).hide(); - jQuery('.' + jQuery(this).data('cond1-hide') ).show(); - } + if ( value == jQuery(this).data('cond1') ) { + jQuery('.' + jQuery(this).data('cond1-show') ).show(); + jQuery('.' + jQuery(this).data('cond1-hide') ).hide(); + + if ( jQuery(this).data('cond1-show') == '_roles' ) { + return false; + } + + } else { + jQuery('.' + jQuery(this).data('cond1-show') ).hide(); + jQuery('.' + jQuery(this).data('cond1-hide') ).show(); + } } if ( jQuery(this).data('cond2') ) { - if (jQuery(this).val() == jQuery(this).data('cond2') ){ - jQuery('.' + jQuery(this).data('cond2-show') ).show(); - jQuery('.' + jQuery(this).data('cond2-hide') ).hide(); - - if ( jQuery(this).data('cond2-show') == '_roles' ) { - return false; - } - - } else { - jQuery('.' + jQuery(this).data('cond2-show') ).hide(); - jQuery('.' + jQuery(this).data('cond2-hide') ).show(); - } + if ( value == jQuery(this).data('cond2') ) { + jQuery('.' + jQuery(this).data('cond2-show') ).show(); + jQuery('.' + jQuery(this).data('cond2-hide') ).hide(); + + if ( jQuery(this).data('cond2-show') == '_roles' ) { + return false; + } + + } else { + jQuery('.' + jQuery(this).data('cond2-show') ).hide(); + jQuery('.' + jQuery(this).data('cond2-hide') ).show(); + } } if ( jQuery(this).data('cond3') ) { - if (jQuery(this).val() == jQuery(this).data('cond3') ){ - jQuery('.' + jQuery(this).data('cond3-show') ).show(); - jQuery('.' + jQuery(this).data('cond3-hide') ).hide(); - } else { - jQuery('.' + jQuery(this).data('cond3-show') ).hide(); - jQuery('.' + jQuery(this).data('cond3-hide') ).show(); - } + if ( value == jQuery(this).data('cond3') ) { + jQuery('.' + jQuery(this).data('cond3-show') ).show(); + jQuery('.' + jQuery(this).data('cond3-hide') ).hide(); + } else { + jQuery('.' + jQuery(this).data('cond3-show') ).hide(); + jQuery('.' + jQuery(this).data('cond3-hide') ).show(); + } } });jQuery('.um-adm-conditional').each(function(){jQuery(this).trigger('change');}); diff --git a/includes/admin/assets/js/um-admin-settings.js b/includes/admin/assets/js/um-admin-settings.js new file mode 100644 index 00000000..97f93d57 --- /dev/null +++ b/includes/admin/assets/js/um-admin-settings.js @@ -0,0 +1,12 @@ +jQuery( document ).ready( function() { + + /** + * Licenses + */ + jQuery( 'body' ).on( 'click', '.um_license_deactivate', function() { + jQuery(this).siblings('.um-option-field').val(''); + jQuery(this).parents('form.um-settings-form').submit(); + }); + + +}); \ No newline at end of file diff --git a/includes/admin/class-admin.php b/includes/admin/class-admin.php new file mode 100644 index 00000000..f80830aa --- /dev/null +++ b/includes/admin/class-admin.php @@ -0,0 +1,43 @@ +templates_path = um_path . 'includes/admin/templates/'; + + add_action( 'admin_init', array( &$this, 'admin_init' ), 0 ); + + } + + + + + + /** + * Init admin action/filters + request handlers + */ + function admin_init() { + require_once 'core/um-admin-actions-user.php'; + require_once 'core/um-admin-actions-modal.php'; + require_once 'core/um-admin-actions.php'; + + require_once 'core/um-admin-filters-fields.php'; + + if ( is_admin() && current_user_can('manage_options') && + ! empty( $_REQUEST['um_adm_action'] ) ) { + do_action( "um_admin_do_action__", $_REQUEST['um_adm_action'] ); + do_action( "um_admin_do_action__{$_REQUEST['um_adm_action']}", $_REQUEST['um_adm_action'] ); + } + + } + + } + +} \ No newline at end of file diff --git a/includes/admin/core/class-admin-builder.php b/includes/admin/core/class-admin-builder.php new file mode 100644 index 00000000..9dc7216c --- /dev/null +++ b/includes/admin/core/class-admin-builder.php @@ -0,0 +1,681 @@ +form_id = $_POST['form_id']; + + $this->show_builder(); + + $output = ob_get_contents(); + ob_end_clean(); + + if(is_array($output)){ print_r($output); }else{ echo $output; } die; + + } + + + /*** + *** @sort array function + ***/ + function array_sort_by_column( $arr, $col, $dir = SORT_ASC ) { + $sort_col = array(); + + foreach ( $arr as $key => $row ) { + if ( ! empty( $row[$col] ) ) + $sort_col[$key] = $row[$col]; + } + + if ( ! empty( $sort_col ) ) + array_multisort( $sort_col, $dir, $arr ); + + return $arr; + } + + + /*** + *** @get fields in row + ***/ + function get_fields_by_row( $row_id ) { + + if( empty( $this->global_fields) || ! is_array( $this->global_fields ) ){ + $this->global_fields = array(); + } + + foreach( $this->global_fields as $key => $array ) { + if ( !isset( $array['in_row'] ) || ( isset( $array['in_row'] ) && $array['in_row'] == $row_id ) ) { + $results[$key] = $array; + unset( $this->global_fields[$key] ); + } + } + return ( isset ( $results ) ) ? $results : ''; + } + + + /*** + *** @get fields by sub row + ***/ + function get_fields_in_subrow( $row_fields, $subrow_id ) { + if ( !is_array( $row_fields ) ) return ''; + foreach( $row_fields as $key => $array ) { + if ( !isset( $array['in_sub_row'] ) || ( isset( $array['in_sub_row'] ) && $array['in_sub_row'] == $subrow_id ) ) { + $results[$key] = $array; + unset( $this->global_fields[$key] ); + } + } + return ( isset ( $results ) ) ? $results : ''; + } + + + /*** + *** @Display the builder + ***/ + function show_builder() { + + $fields = UM()->query()->get_attr( 'custom_fields', $this->form_id ); + + if ( !isset( $fields ) || empty( $fields ) ) { ?> + +
            + + +
            + + + +
            + +
            +
            + + +
            + + + +
            + + +
            + +
            + + +
            + +
            + +
            + +
            + +
            +
            + +
            + + global_fields = array(); + }else{ + $this->global_fields = $fields; + } + + foreach( $this->global_fields as $key => $array ) { + if ( $array['type'] == 'row' ) { + $rows[$key] = $array; + unset( $this->global_fields[ $key ] ); // not needed now + } + + } + + if ( !isset( $rows ) ){ + $rows = array( '_um_row_1' => array( + 'type' => 'row', + 'id' => '_um_row_1', + 'sub_rows' => 1, + 'cols' => 1 + ) + ); + } + + foreach ( $rows as $row_id => $array ) { + + ?> + +
            + + +
            + + + + + + +
            + +
            + + get_fields_by_row( $row_id ); + + $sub_rows = ( isset( $array['sub_rows'] ) ) ? $array['sub_rows'] : 1; + for( $c = 0; $c < $sub_rows; $c++ ) { + + $subrow_fields = $this->get_fields_in_subrow( $row_fields, $c ); + + ?> + +
            + + +
            + + '; + } + + ?> + +
            + + +
            + + 0 ) { ?> +
            + + +
            + + array_sort_by_column( $subrow_fields, 'position'); + + foreach( $subrow_fields as $key => $keyarray ) { + extract( $keyarray ); + + ?> + +
            + +
            + + + + +
            + builtin()->core_fields[$type]['name'] ) ? UM()->builtin()->core_fields[$type]['name'] : ''; ?> +
            +
            + + + + + + + + + + + + + + +
            + + +
            + +
            + + +
            + + + +
            + +
            + +
            + +
            + + + +
            + +
            + + $_POST['_type'], + 'form_id' => $_POST['post_id'], + 'args' => UM()->builtin()->get_core_field_attrs( $_POST['_type'] ), + 'post' => $_POST + ); + + $array = apply_filters("um_admin_pre_save_fields_hook", $array ); + $output['error'] = apply_filters( 'um_admin_field_update_error_handling', $output['error'], $array ); + + extract( $array['post'] ); + if ( empty( $output['error'] ) ){ + + $save = array(); + $save[ $_metakey ] = null; + foreach( $array['post'] as $key => $val){ + + if ( substr( $key, 0, 1) === '_' && $val != '' ) { // field attribute + $new_key = ltrim ($key,'_'); + + if ( $new_key == 'options' ) { + //$save[ $_metakey ][$new_key] = explode(PHP_EOL, $val); + $save[ $_metakey ][$new_key] = preg_split('/[\r\n]+/', $val, -1, PREG_SPLIT_NO_EMPTY); + } else { + $save[ $_metakey ][$new_key] = $val; + } + + } else if ( strstr( $key, 'um_editor' ) ) { + $save[ $_metakey ]['content'] = $val; + } + + } + + $field_ID = $_metakey; + $field_args = $save[ $_metakey ]; + + $field_args = apply_filters("um_admin_pre_save_field_to_form", $field_args ); + + UM()->fields()->update_field( $field_ID, $field_args, $post_id ); + + $field_args = apply_filters("um_admin_pre_save_field_to_db", $field_args ); + + if ( ! isset( $array['args']['form_only'] ) ) { + if ( ! isset( UM()->builtin()->predefined_fields[ $field_ID ] ) ) { + UM()->fields()->globally_update_field( $field_ID, $field_args ); + } + } + + } + + $output = json_encode( $output ); + if ( is_array( $output ) ) { + print_r( $output ); + } else { + echo $output; + } + die; + } + + + function dynamic_modal_content() { + $metabox = UM()->metabox(); + + if ( !is_user_logged_in() || !current_user_can('manage_options') ) die( __('Please login as administrator','ultimate-member') ); + + extract($_POST); + + switch ( $act_id ) { + + default: + + ob_start(); + + do_action('um_admin_ajax_modal_content__hook', $act_id ); + do_action("um_admin_ajax_modal_content__hook_{$act_id}"); + + $output = ob_get_contents(); + ob_end_clean(); + + break; + + case 'um_admin_fonticon_selector': + + ob_start(); + + ?> + +
            + +
            + +
            + fonticons()->all as $icon ) { ?> + + +
            + + query()->get_attr( 'custom_fields', $arg2 ); + $form_fields = array_values( array_filter( array_keys( $form_fields ) ) ); + //$form_fields = array_keys( $form_fields ); + ?> + +

            +
            + + builtin()->core_fields ) { + foreach ( UM()->builtin()->core_fields as $field_type => $array ) { + + if ( isset( $array['in_fields'] ) && $array['in_fields'] == false ) { } else { + ?> + + + + + +
            + +

            +
            + + builtin()->predefined_fields ) { + foreach ( UM()->builtin()->predefined_fields as $field_key => $array ) { + + if ( !isset( $array['account_only'] ) && !isset( $array['private_use'] ) ) {?> + + data-silent_action="um_admin_add_field_from_predefined" data-arg1="" data-arg2=""> + + ' . __('None','ultimate-member') . '

            '; } ?> + +
            + +

            +
            + + builtin()->custom_fields ) { + foreach ( UM()->builtin()->custom_fields as $field_key => $array ) { + + ?> + + data-silent_action="um_admin_add_field_from_list" data-arg1="" data-arg2=""> () + + ' . __('You did not create any custom fields', 'ultimate-member') . '

            '; } ?> + +
            + + builtin()->get_core_field_attrs( $arg1 ); + + $form_fields = UM()->query()->get_attr( 'custom_fields', $arg2 ); + + $metabox->set_field_type = $arg1; + $metabox->in_edit = true; + $metabox->edit_array = $form_fields[ $arg3 ]; + + if ( !isset( $metabox->edit_array['metakey'] ) ){ + $metabox->edit_array['metakey'] = $metabox->edit_array['id']; + } + + if ( !isset( $metabox->edit_array['position'] ) ){ + $metabox->edit_array['position'] = $metabox->edit_array['id']; + } + + extract( $args ); + + if ( !isset( $col1 ) ) { + + echo '

            '. __('This field type is not setup correcty.', 'ultimate-member') . '

            '; + + } else { + + ?> + + edit_array['in_group'] ) ) { ?> + + + + + + + + + + + + + + + + +
            edit_array['content']; ?>
            + + + +
            + + field_input ( $opt, null, $metabox->edit_array ); } ?> + +
            + +
            + + field_input ( $opt, null, $metabox->edit_array ); } ?> + +
            + + field_input ( $opt, null, $metabox->edit_array ); } ?> + +
            + + field_input ( $opt, null, $metabox->edit_array ); } ?> + + in_edit, (isset( $metabox->edit_array ) ) ? $metabox->edit_array : '' ); ?> + + builtin()->get_core_field_attrs( $arg1 ); + + $metabox->set_field_type = $arg1; + + extract( $args ); + + if ( !isset( $col1 ) ) { + + echo '

            '. __('This field type is not setup correcty.', 'ultimate-member') . '

            '; + + } else { + + ?> + + + + + + + + + + + + + + +
            + + field_input ( $opt ); } ?> + +
            + +
            + + field_input ( $opt ); } ?> + +
            + + field_input ( $opt ); } ?> + +
            + + field_input ( $opt ); } ?> + + in_edit, (isset( $metabox->edit_array ) ) ? $metabox->edit_array : '' ); ?> + + query()->get_attr('mode', $arg1 ); + + if ( $mode == 'profile' ) { + UM()->fields()->editing = true; + } + + $output = do_shortcode('[ultimatemember form_id='.$arg1.']'); + + break; + + case 'um_admin_review_registration': + //$user_id = $arg1; + um_fetch_user( $arg1 ); + + UM()->user()->preview = true; + + $output = um_user_submitted_registration( true ); + + um_reset_user(); + + break; + + } + + if ( is_array( $output ) ) { + print_r( $output ); + } else { + echo $output; + } + die; + + } + + + /** + * Retrieves dropdown/multi-select options from a callback function + */ + function populate_dropdown_options(){ + + $arr_options = array(); + + if( ! current_user_can('manage_options') ){ + wp_die( __( 'This is not possible for security reasons.','ultimate-member') ); + } + + $um_callback_func = $_POST['um_option_callback']; + if( empty( $um_callback_func ) ){ + $arr_options['status'] = 'empty'; + $arr_options['function_name'] = $um_callback_func; + $arr_options['function_exists'] = function_exists( $um_callback_func ); + } + + $arr_options['data'] = array(); + + if( function_exists( $um_callback_func ) ){ + $arr_options['data'] = call_user_func( $um_callback_func ); + } + + wp_send_json( $arr_options ); + } + + } +} \ No newline at end of file diff --git a/includes/admin/core/class-admin-columns.php b/includes/admin/core/class-admin-columns.php new file mode 100644 index 00000000..6c82c74a --- /dev/null +++ b/includes/admin/core/class-admin-columns.php @@ -0,0 +1,121 @@ +slug = 'ultimatemember'; + + add_filter('manage_edit-um_form_columns', array(&$this, 'manage_edit_um_form_columns') ); + add_action('manage_um_form_posts_custom_column', array(&$this, 'manage_um_form_posts_custom_column'), 10, 3); + + add_filter('manage_edit-um_directory_columns', array(&$this, 'manage_edit_um_directory_columns') ); + add_action('manage_um_directory_posts_custom_column', array(&$this, 'manage_um_directory_posts_custom_column'), 10, 3); + + add_filter('post_row_actions', array(&$this, 'post_row_actions'), 99, 2); + + } + + /*** + *** @custom row actions + ***/ + function post_row_actions( $actions, $post ) { + //check for your post type + if ( $post->post_type == "um_form" ) { + $actions['um_duplicate'] = '' . __('Duplicate','ultimate-member') . ''; + } + return $actions; + } + + /*** + *** @duplicate a form + ***/ + function duplicate_uri( $id ) { + $url = add_query_arg('um_adm_action', 'duplicate_form', admin_url('edit.php?post_type=um_form') ); + $url = add_query_arg('post_id', $id, $url); + return $url; + } + + /*** + *** @Custom columns for Form + ***/ + function manage_edit_um_form_columns( $columns ) { + + $new_columns['cb'] = ''; + $new_columns['title'] = __( 'Title', 'ulitmatemember' ); + $new_columns['id'] = __('ID', 'ulitmatemember' ); + $new_columns['mode'] = __( 'Type', 'ulitmatemember' ); + $new_columns['shortcode'] = __( 'Shortcode', 'ulitmatemember' ); + $new_columns['date'] = __( 'Date', 'ulitmatemember' ); + + return $new_columns; + + } + + /*** + *** @Custom columns for Directory + ***/ + function manage_edit_um_directory_columns( $columns ) { + + $new_columns['cb'] = ''; + + $new_columns['title'] = __( 'Title', 'ultimate-member' ); + $new_columns['id'] = __( 'ID', 'ultimate-member' ); + $new_columns['shortcode'] = __( 'Shortcode', 'ultimate-member' ); + $new_columns['date'] = __( 'Date', 'ultimate-member' ); + + return $new_columns; + + } + + /*** + *** @Display cusom columns for Form + ***/ + function manage_um_form_posts_custom_column( $column_name, $id ) { + + switch ( $column_name ) { + + case 'id': + echo ''.$id.''; + break; + + case 'shortcode': + echo UM()->shortcodes()->get_shortcode( $id ); + break; + + case 'mode': + $mode = UM()->query()->get_attr( 'mode', $id ); + echo UM()->form()->display_form_type( $mode, $id ); + break; + + } + + } + + /*** + *** @Display cusom columns for Directory + ***/ + function manage_um_directory_posts_custom_column($column_name, $id) { + global $wpdb; + + switch ($column_name) { + + case 'id': + echo ''.$id.''; + break; + + case 'shortcode': + echo UM()->shortcodes()->get_shortcode( $id ); + break; + + } + + } + + } +} \ No newline at end of file diff --git a/includes/admin/core/class-admin-dragdrop.php b/includes/admin/core/class-admin-dragdrop.php new file mode 100644 index 00000000..9f9d7fba --- /dev/null +++ b/includes/admin/core/class-admin-dragdrop.php @@ -0,0 +1,216 @@ +query()->get_attr( 'custom_fields', $form_id ); + + $this->row_data = get_option( 'um_form_rowdata_' . $form_id, array() ); + $this->exist_rows = array(); + + if ( ! empty( $fields ) ) { + foreach ( $fields as $key => $array ) { + if ( $array['type'] == 'row' ) { + $this->row_data[$key] = $array; + unset( $fields[$key] ); + } + } + } else { + $fields = array(); + } + + foreach ( $_POST as $key => $value ) { + + // adding rows + if ( 0 === strpos( $key, '_um_row_' ) ) { + + $update_args = null; + + $row_id = str_replace( '_um_row_', '', $key ); + + $row_array = array( + 'type' => 'row', + 'id' => $value, + 'sub_rows' => $_POST[ '_um_rowsub_'.$row_id .'_rows' ], + 'cols' => $_POST[ '_um_rowcols_'.$row_id .'_cols' ], + 'origin' => $_POST[ '_um_roworigin_'.$row_id . '_val' ], + ); + + $row_args = $row_array; + + if ( isset( $this->row_data[ $row_array['origin'] ] ) ) { + foreach( $this->row_data[ $row_array['origin'] ] as $k => $v ){ + if ( $k != 'position' && $k != 'metakey' ) { + $update_args[$k] = $v; + } + } + if ( isset( $update_args ) ) { + $row_args = array_merge( $update_args, $row_array ); + } + $this->exist_rows[] = $key; + } + + $fields[$key] = $row_args; + + } + + // change field position + if ( 0 === strpos( $key, 'um_position_' ) ) { + $field_key = str_replace('um_position_','',$key); + if ( isset( $fields[$field_key] ) ) { + $fields[$field_key]['position'] = $value; + } + } + + // change field master row + if ( 0 === strpos( $key, 'um_row_' ) ) { + $field_key = str_replace('um_row_','',$key); + if ( isset( $fields[$field_key] ) ) { + $fields[$field_key]['in_row'] = $value; + } + } + + // change field sub row + if ( 0 === strpos( $key, 'um_subrow_' ) ) { + $field_key = str_replace('um_subrow_','',$key); + if ( isset( $fields[$field_key] ) ) { + $fields[$field_key]['in_sub_row'] = $value; + } + } + + // change field column + if ( 0 === strpos( $key, 'um_col_' ) ) { + $field_key = str_replace('um_col_','',$key); + if ( isset( $fields[$field_key] ) ) { + $fields[$field_key]['in_column'] = $value; + } + } + + // add field to group + if ( 0 === strpos( $key, 'um_group_' ) ) { + $field_key = str_replace('um_group_','',$key); + if ( isset( $fields[$field_key] ) ) { + $fields[$field_key]['in_group'] = $value; + } + } + + } + + foreach ( $this->row_data as $k => $v ) { + if ( ! in_array( $k, $this->exist_rows ) ) + unset( $this->row_data[$k] ); + } + + update_option( 'um_existing_rows_' . $form_id, $this->exist_rows ); + + update_option( 'um_form_rowdata_' . $form_id , $this->row_data ); + + UM()->query()->update_attr( 'custom_fields', $form_id, $fields ); + + } + + /*** + *** @load form to maintain form order + ***/ + function load_field_order() { + + $screen = get_current_screen(); + + if ( ! isset( $screen->id ) || $screen->id != 'um_form' ) return; + + ?> + +
            + + + + + + +
            + + + +
            + +
            + +
            + + slug = 'ultimatemember'; + + $this->js_url = um_url . 'includes/admin/assets/js/'; + $this->css_url = um_url . 'includes/admin/assets/css/'; + + add_action('admin_head', array(&$this, 'admin_head'), 9); + + add_action('admin_enqueue_scripts', array(&$this, 'admin_enqueue_scripts') ); + + add_filter( 'admin_body_class', array( &$this, 'admin_body_class' ), 999 ); + + add_filter('enter_title_here', array(&$this, 'enter_title_here') ); + + add_action( 'load-user-new.php', array( &$this, 'enqueue_role_wrapper' ) ); + add_action( 'load-user-edit.php', array( &$this, 'enqueue_role_wrapper' ) ); + } + + + function enqueue_role_wrapper() { + add_action( 'admin_enqueue_scripts', array( &$this, 'load_role_wrapper' ) ); + } + + + /** + * Load js for Add/Edit User form + */ + function load_role_wrapper() { + + wp_register_script( 'um_admin_role_wrapper', $this->js_url . 'um-admin-role-wrapper.js', '', '', true ); + wp_enqueue_script( 'um_admin_role_wrapper' ); + + $localize_data = get_option( 'um_roles' ); + + wp_localize_script( 'um_admin_settings', 'um_roles', $localize_data ); + + } + + + /*** + *** @enter title placeholder + ***/ + function enter_title_here( $title ){ + $screen = get_current_screen(); + if ( 'um_directory' == $screen->post_type ){ + $title = 'e.g. Member Directory'; + } + if ( 'um_role' == $screen->post_type ){ + $title = 'e.g. Community Member'; + } + if ( 'um_form' == $screen->post_type ){ + $title = 'e.g. New Registration Form'; + } + return $title; + } + + /*** + *** @Runs on admin head + ***/ + function admin_head(){ + + if ( $this->is_plugin_post_type() ){ + + ?> + + + + css_url . 'um-admin-form.css' ); + wp_enqueue_style( 'um_admin_form' ); + + wp_register_script( 'um_admin_form', $this->js_url . 'um-admin-form.js', '', '', true ); + wp_enqueue_script( 'um_admin_form' ); + + } + + + /*** + *** @Load Form + ***/ + function load_forms() { + + wp_register_style( 'um_admin_forms', $this->css_url . 'um-admin-forms.css' ); + wp_enqueue_style( 'um_admin_forms' ); + + wp_register_script( 'um_admin_forms', $this->js_url . 'um-admin-forms.js', '', '', true ); + wp_enqueue_script( 'um_admin_forms' ); + + $localize_data = array( + 'texts' => array( + 'remove' => __( 'Remove', 'ultimate-member' ), + 'select' => __( 'Select', 'ultimate-member' ) + ) + ); + + wp_localize_script( 'um_admin_forms', 'php_data', $localize_data ); + + } + + + /*** + *** @Load dashboard + ***/ + function load_dashboard() { + + wp_register_style( 'um_admin_dashboard', $this->css_url . 'um-admin-dashboard.css' ); + wp_enqueue_style( 'um_admin_dashboard' ); + + wp_register_script( 'um_admin_dashboard', $this->js_url . 'um-admin-dashboard.js', '', '', true ); + wp_enqueue_script( 'um_admin_dashboard' ); + + } + + + /*** + *** @Load settings + ***/ + function load_settings() { + + wp_register_style( 'um_admin_settings', $this->css_url . 'um-admin-settings.css' ); + wp_enqueue_style( 'um_admin_settings' ); + + wp_register_script( 'um_admin_settings', $this->js_url . 'um-admin-settings.js', '', '', true ); + wp_enqueue_script( 'um_admin_settings' ); + + $localize_data = array( + 'texts' => array( + 'remove' => __( 'Remove', 'ultimate-member' ), + 'select' => __( 'Select', 'ultimate-member' ) + ) + ); + + wp_localize_script( 'um_admin_settings', 'php_data', $localize_data ); + + } + + + /*** + *** @Load modal + ***/ + function load_modal() { + + wp_register_style( 'um_admin_modal', $this->css_url . 'um-admin-modal.css' ); + wp_enqueue_style( 'um_admin_modal' ); + + wp_register_script( 'um_admin_modal', $this->js_url . 'um-admin-modal.js', '', '', true ); + wp_enqueue_script( 'um_admin_modal' ); + + $localize_data = array( + 'ajax_url' => UM()->get_ajax_route( 'um\admin\core\Admin_Builder', 'dynamic_modal_content' ), + 'dropdown_ajax_url' => UM()->get_ajax_route( 'um\admin\core\Admin_Builder', 'populate_dropdown_options' ), + ); + wp_localize_script( 'um_admin_modal', 'um_admin_modal_data', $localize_data ); + + } + + + /*** + *** @Field Processing + ***/ + function load_field() { + + wp_register_script( 'um_admin_field', $this->js_url . 'um-admin-field.js', '', '', true ); + wp_enqueue_script( 'um_admin_field' ); + + $localize_data = array( + 'ajax_url' => UM()->get_ajax_route( 'um\admin\core\Admin_Builder', 'update_field' ), + 'do_ajax_url' => UM()->get_ajax_route( 'um\core\Fields', 'do_ajax_action' ), + ); + wp_localize_script( 'um_admin_field', 'um_admin_field_data', $localize_data ); + + } + + + /*** + *** @Load Builder + ***/ + function load_builder() { + + wp_register_script( 'um_admin_builder', $this->js_url . 'um-admin-builder.js', '', '', true ); + wp_enqueue_script( 'um_admin_builder' ); + + $localize_data = array( + 'ajax_url' => UM()->get_ajax_route( 'um\admin\core\Admin_Builder', 'update_builder' ), + ); + wp_localize_script( 'um_admin_builder', 'um_admin_builder_data', $localize_data ); + + wp_register_script( 'um_admin_dragdrop', $this->js_url . 'um-admin-dragdrop.js', '', '', true ); + wp_enqueue_script( 'um_admin_dragdrop' ); + + + $localize_data = array( + 'ajax_url' => UM()->get_ajax_route( 'um\admin\core\Admin_DragDrop', 'update_order' ), + ); + wp_localize_script( 'um_admin_dragdrop', 'um_admin_dragdrop_data', $localize_data ); + + + wp_register_style( 'um_admin_builder', $this->css_url . 'um-admin-builder.css' ); + wp_enqueue_style( 'um_admin_builder' ); + + } + + + /*** + *** @Load core WP styles/scripts + ***/ + function load_core_wp() { + + wp_enqueue_style( 'wp-color-picker' ); + wp_enqueue_script( 'wp-color-picker' ); + + wp_enqueue_script( 'jquery-ui-draggable' ); + wp_enqueue_script( 'jquery-ui-sortable' ); + + wp_enqueue_script( 'jquery-ui-tooltip' ); + + } + + + /*** + *** @Load Admin Styles + ***/ + function load_css() { + + wp_register_style( 'um_admin_menu', $this->css_url . 'um-admin-menu.css' ); + wp_enqueue_style( 'um_admin_menu' ); + + wp_register_style( 'um_admin_columns', $this->css_url . 'um-admin-columns.css' ); + wp_enqueue_style( 'um_admin_columns' ); + + wp_register_style( 'um_admin_misc', $this->css_url . 'um-admin-misc.css' ); + wp_enqueue_style( 'um_admin_misc' ); + + if ( get_post_type() != 'shop_order' ) { + wp_register_style( 'um_admin_select2', $this->css_url . 'um-admin-select2.css' ); + wp_enqueue_style( 'um_admin_select2' ); + } + + } + + + /*** + *** @Load global css + ***/ + function load_global_css() { + + wp_register_style( 'um_admin_global', $this->css_url . 'um-admin-global.css' ); + wp_enqueue_style( 'um_admin_global' ); + + } + + + /*** + *** @Load jQuery custom code + ***/ + function load_custom_scripts() { + + wp_register_script( 'um_admin_scripts', $this->js_url . 'um-admin-scripts.js', '', '', true ); + wp_enqueue_script( 'um_admin_scripts' ); + + } + + + /*** + *** @Load AJAX + ***/ + function load_ajax_js() { + + wp_register_script( 'um_admin_ajax', $this->js_url . 'um-admin-ajax.js', '', '', true ); + wp_enqueue_script( 'um_admin_ajax' ); + + $localize_data = array( + 'ajax_url' => UM()->get_ajax_route( 'um\core\Fields', 'do_ajax_action' ), + ); + wp_localize_script( 'um_admin_ajax', 'um_admin_ajax_data', $localize_data ); + + } + + + /*** + *** @Boolean check if we're viewing UM backend + ***/ + function is_UM_admin() { + global $current_screen; + + $screen_id = $current_screen->id; + if ( strstr( $screen_id, 'ultimatemember' ) || strstr( $screen_id, 'um_' ) || strstr( $screen_id, 'user' ) || strstr( $screen_id, 'profile' ) || $screen_id == 'nav-menus' ) return true; + + global $post; + if ( isset( $post->post_type ) ) return true; + + global $tax; + if ( isset( $tax->name ) ) return true; + + return false; + } + + /*** + *** @Adds class to our admin pages + ***/ + function admin_body_class($classes){ + if ( $this->is_UM_admin() ) { + return "$classes um-admin"; + } + return $classes; + } + + /*** + *** @Enqueue scripts and styles + ***/ + function admin_enqueue_scripts() { + if ( $this->is_UM_admin() ) { + + if ( get_post_type() != 'shop_order' ) { + UM()->enqueue()->wp_enqueue_scripts(); + } + + $this->load_global_css(); + $this->load_form(); + $this->load_forms(); + $this->load_modal(); + $this->load_dashboard(); + $this->load_settings(); + $this->load_field(); + $this->load_builder(); + $this->load_css(); + $this->load_core_wp(); + $this->load_ajax_js(); + $this->load_custom_scripts(); + + if ( is_rtl() ) { + wp_register_style( 'um_admin_rtl', $this->css_url . 'um-admin-rtl.css' ); + wp_enqueue_style( 'um_admin_rtl' ); + } + + } else { + + $this->load_global_css(); + + } + + } + + } +} \ No newline at end of file diff --git a/includes/admin/core/class-admin-forms.php b/includes/admin/core/class-admin-forms.php new file mode 100644 index 00000000..7ad00aed --- /dev/null +++ b/includes/admin/core/class-admin-forms.php @@ -0,0 +1,890 @@ +form_data = $form_data; + + } + + + /** + * Render form + * + * + * @param bool $echo + * @return string + */ + function render_form( $echo = true ) { + + if ( empty( $this->form_data['fields'] ) ) + return ''; + + $class = 'form-table um-form-table ' . ( ! empty( $this->form_data['class'] ) ? $this->form_data['class'] : '' ); + $class_attr = ' class="' . $class . '" '; + + ob_start(); + + foreach ( $this->form_data['fields'] as $field_data ) { + if ( isset( $field_data['type'] ) && 'hidden' == $field_data['type'] ) + echo $this->render_form_row( $field_data ); + } + + + if ( empty( $this->form_data['without_wrapper'] ) ) { ?> + + > + + + form_data['fields'] as $field_data ) { + if ( isset( $field_data['type'] ) && 'hidden' != $field_data['type'] ) + echo $this->render_form_row( $field_data ); + } + + if ( empty( $this->form_data['without_wrapper'] ) ) { ?> + + +
            + + form_data['prefix_id'] ) ? ' data-prefix="' . $this->form_data['prefix_id'] . '" ' : ''; + + $html = ''; + if ( $data['type'] != 'hidden' ) { + + if ( ! empty( $this->form_data['div_line'] ) ) { + + if ( strpos( $this->form_data['class'], 'um-top-label' ) !== false ) { + + $html .= '
            ' . $this->render_field_label( $data ); + + if ( method_exists( $this, 'render_' . $data['type'] ) ) { + + $html .= call_user_func( array( &$this, 'render_' . $data['type'] ), $data ); + + } else { + + $html .= apply_filters( 'um_render_field_type_' . $data['type'], '', $data, $this->form_data ); + + } + + if ( ! empty( $data['description'] ) ) + $html .= '

            ' . $data['description'] . '

            '; + + $html .= '
            '; + + } else { + + if ( ! empty( $data['without_label'] ) ) { + + $html .= '
            '; + + if ( method_exists( $this, 'render_' . $data['type'] ) ) { + + $html .= call_user_func( array( &$this, 'render_' . $data['type'] ), $data ); + + } else { + + $html .= apply_filters( 'um_render_field_type_' . $data['type'], '', $data, $this->form_data ); + + } + + if ( ! empty( $data['description'] ) ) + $html .= '

            ' . $data['description'] . '

            '; + + $html .= '
            '; + + } else { + + $html .= '
            ' . $this->render_field_label( $data ); + + if ( method_exists( $this, 'render_' . $data['type'] ) ) { + + $html .= call_user_func( array( &$this, 'render_' . $data['type'] ), $data ); + + } else { + + $html .= apply_filters( 'um_render_field_type_' . $data['type'], '', $data, $this->form_data ); + + } + + if ( ! empty( $data['description'] ) ) + $html .= '

            ' . $data['description'] . '

            '; + + $html .= '
            '; + + } + } + + } else { + if ( strpos( $this->form_data['class'], 'um-top-label' ) !== false ) { + + $html .= ' + ' . $this->render_field_label( $data ); + + if ( method_exists( $this, 'render_' . $data['type'] ) ) { + + $html .= call_user_func( array( &$this, 'render_' . $data['type'] ), $data ); + + } else { + + $html .= apply_filters( 'um_render_field_type_' . $data['type'], '', $data, $this->form_data ); + + } + + if ( ! empty( $data['description'] ) ) + $html .= '

            ' . $data['description'] . '

            '; + + $html .= ''; + + } else { + + if ( ! empty( $data['without_label'] ) ) { + + $html .= ' + '; + + if ( method_exists( $this, 'render_' . $data['type'] ) ) { + + $html .= call_user_func( array( &$this, 'render_' . $data['type'] ), $data ); + + } else { + + $html .= apply_filters( 'um_render_field_type_' . $data['type'], '', $data, $this->form_data ); + + } + + if ( ! empty( $data['description'] ) ) + $html .= '

            ' . $data['description'] . '

            '; + + $html .= ''; + + } else { + + $html .= ' + ' . $this->render_field_label( $data ) . ' + '; + + if ( method_exists( $this, 'render_' . $data['type'] ) ) { + + $html .= call_user_func( array( &$this, 'render_' . $data['type'] ), $data ); + + } else { + + $html .= apply_filters( 'um_render_field_type_' . $data['type'], '', $data, $this->form_data ); + + } + + if ( ! empty( $data['description'] ) ) + $html .= '

            ' . $data['description'] . '

            '; + + $html .= ''; + + } + } + } + + } else { + if ( method_exists( $this, 'render_' . $data['type'] ) ) { + + $html .= call_user_func( array( &$this, 'render_' . $data['type'] ), $data ); + + } else { + + $html .= apply_filters( 'um_render_field_type_' . $data['type'], '', $data, $this->form_data ); + + } + } + + return $html; + } + + + function render_field_label( $data ) { + if ( empty( $data['label'] ) ) + return false; + + $id = ! empty( $data['id1'] ) ? $data['id1'] : $data['id']; + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $id; + $for_attr = ' for="' . $id . '" '; + + $label = $data['label']; + $tooltip = ! empty( $data['tooltip'] ) ? UM()->tooltip( $data['tooltip'], false, false ) : ''; + + return ""; + } + + + function render_hidden( $field_data ) { + + if ( empty( $field_data['id'] ) ) + return false; + + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + $id_attr = ' id="' . $id . '" '; + + $class = ! empty( $field_data['class'] ) ? $field_data['class'] : ''; + $class_attr = ' class="um-forms-field ' . $class . '" '; + + $data = array( + 'field_id' => $field_data['id'] + ); + + $data_attr = ''; + foreach ( $data as $key => $value ) { + $data_attr .= " data-{$key}=\"{$value}\" "; + } + + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + $name_attr = ' name="' . $name . '" '; + + $default = isset( $field_data['default'] ) ? $field_data['default'] : ''; + $value = isset( $field_data['value'] ) ? $field_data['value'] : $default; + $value_attr = ' value="' . $value . '" '; + + $html = ""; + + return $html; + } + + + function render_text( $field_data ) { + + if ( empty( $field_data['id'] ) ) + return false; + + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + $id_attr = ' id="' . $id . '" '; + + $class = ! empty( $field_data['class'] ) ? $field_data['class'] : ''; + $class .= ! empty( $field_data['size'] ) ? 'um-' . $field_data['size'] . '-field' : 'um-long-field'; + $class_attr = ' class="um-forms-field ' . $class . '" '; + + $data = array( + 'field_id' => $field_data['id'] + ); + + $data_attr = ''; + foreach ( $data as $key => $value ) { + $data_attr .= " data-{$key}=\"{$value}\" "; + } + + $placeholder_attr = ! empty( $field_data['placeholder'] ) ? ' placeholder="' . $field_data['placeholder'] . '"' : ''; + + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + $name_attr = ' name="' . $name . '" '; + + $default = isset( $field_data['default'] ) ? $field_data['default'] : ''; + $value = isset( $field_data['value'] ) ? $field_data['value'] : $default; + $value_attr = ' value="' . $value . '" '; + + $html = ""; + + return $html; + } + + + function render_color( $field_data ) { + + if ( empty( $field_data['id'] ) ) + return false; + + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + $id_attr = ' id="' . $id . '" '; + + $class = ! empty( $field_data['class'] ) ? $field_data['class'] : ''; + $class .= ! empty( $field_data['size'] ) ? ' um-' . $field_data['size'] . '-field ' : ' um-long-field '; + $class .= ' um-admin-colorpicker '; + $class_attr = ' class="um-forms-field ' . $class . '" '; + + $data = array( + 'field_id' => $field_data['id'] + ); + + $data_attr = ''; + foreach ( $data as $key => $value ) { + $data_attr .= " data-{$key}=\"{$value}\" "; + } + + $placeholder_attr = ! empty( $field_data['placeholder'] ) ? ' placeholder="' . $field_data['placeholder'] . '"' : ''; + + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + $name_attr = ' name="' . $name . '" '; + + $default = isset( $field_data['default'] ) ? $field_data['default'] : ''; + $value = isset( $field_data['value'] ) ? $field_data['value'] : $default; + $value_attr = ' value="' . $value . '" '; + + $html = ""; + + return $html; + } + + + function render_icon( $field_data ) { + + if ( empty( $field_data['id'] ) ) + return false; + + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + $id_attr = ' id="' . $id . '" '; + + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + $name_attr = ' name="' . $name . '" '; + + $default = isset( $field_data['default'] ) ? $field_data['default'] : ''; + $value = isset( $field_data['value'] ) ? $field_data['value'] : $default; + $value_attr = ' value="' . $value . '" '; + + $html = '' . __( 'Choose Icon', 'ultimate-member' ) . ' + '; + + if ( ! empty( $value ) ) { + $html .= ''; + } else { + $html .= __( 'No Icon', 'ultimate-member' ); + } + + $html .= ''; + + if ( get_post_meta( get_the_ID(), '_um_icon', true ) ) { + $html .= ''; + } else { + $html .= ''; + } + + $html .= ''; + + return $html; + } + + + function render_datepicker( $field_data ) { + + if ( empty( $field_data['id'] ) ) + return false; + + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + $id_attr = ' id="' . $id . '" '; + + $class = ! empty( $field_data['class'] ) ? $field_data['class'] : ''; + $class .= ! empty( $field_data['size'] ) ? 'um-' . $field_data['size'] . '-field' : 'um-long-field'; + $class_attr = ' class="um-forms-field ' . $class . '" '; + + $data = array( + 'field_id' => $field_data['id'] + ); + + $data_attr = ''; + foreach ( $data as $key => $value ) { + $data_attr .= " data-{$key}=\"{$value}\" "; + } + + $placeholder_attr = ! empty( $field_data['placeholder'] ) ? ' placeholder="' . $field_data['placeholder'] . '"' : ''; + + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + $name_attr = ' name="' . $name . '" '; + + $default = isset( $field_data['default'] ) ? $field_data['default'] : ''; + $value = isset( $field_data['value'] ) ? $field_data['value'] : $default; + $value_attr = ' value="' . $value . '" '; + + $html = ""; + + return $html; + } + + + function render_inline_texts( $field_data ) { + + if ( empty( $field_data['id1'] ) ) + return false; + + + $i = 1; + $fields = array(); + while( ! empty( $field_data['id' . $i] ) ) { + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id'. $i]; + $id_attr = ' id="' . $id . '" '; + + $class = ! empty( $field_data['class'] ) ? $field_data['class'] : ''; + $class .= ! empty( $field_data['size'] ) ? 'um-' . $field_data['size'] . '-field' : 'um-long-field'; + $class_attr = ' class="um-forms-field ' . $class . '" '; + + $data = array( + 'field_id' => $field_data['id'. $i] + ); + + $data_attr = ''; + foreach ( $data as $key => $value ) { + $data_attr .= " data-{$key}=\"{$value}\" "; + } + + $placeholder_attr = ! empty( $field_data['placeholder'] ) ? ' placeholder="' . $field_data['placeholder'] . '"' : ''; + + $name = $field_data['id'. $i]; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + $name_attr = ' name="' . $name . '" '; + + $default = isset( $field_data['default'. $i] ) ? $field_data['default'. $i] : ''; + $value = isset( $field_data['value'. $i] ) ? $field_data['value'. $i] : $default; + $value_attr = ' value="' . $value . '" '; + + $fields[$i] = ""; + + $i++; + } + + $html = vsprintf( $field_data['mask'], $fields ); + + return $html; + } + + + function render_textarea( $field_data ) { + + if ( empty( $field_data['id'] ) ) + return false; + + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + $id_attr = ' id="' . $id . '" '; + + $class = ! empty( $field_data['class'] ) ? $field_data['class'] : ''; + $class .= ! empty( $field_data['size'] ) ? $field_data['size'] : 'um-long-field'; + $class_attr = ' class="um-forms-field ' . $class . '" '; + + $data = array( + 'field_id' => $field_data['id'] + ); + + $data_attr = ''; + foreach ( $data as $key => $value ) { + $data_attr .= " data-{$key}=\"{$value}\" "; + } + + $rows = ! empty( $field_data['args']['textarea_rows'] ) ? ' rows="' . $field_data['args']['textarea_rows'] . '" ' : ''; + + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + $name_attr = ' name="' . $name . '" '; + + $default = isset( $field_data['default'] ) ? $field_data['default'] : ''; + $value = isset( $field_data['value'] ) ? $field_data['value'] : $default; + $html = ""; + + return $html; + } + + + function render_wp_editor( $field_data ) { + + if ( empty( $field_data['id'] ) ) + return false; + + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + + $class = ! empty( $field_data['class'] ) ? $field_data['class'] : ''; + $class .= ! empty( $field_data['size'] ) ? $field_data['size'] : 'um-long-field'; + + $data = array( + 'field_id' => $field_data['id'] + ); + + $data_attr = ''; + foreach ( $data as $key => $value ) { + $data_attr .= " data-{$key}=\"{$value}\" "; + } + + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + + $default = isset( $field_data['default'] ) ? $field_data['default'] : ''; + $value = isset( $field_data['value'] ) ? $field_data['value'] : $default; + + ob_start(); + wp_editor( $value, + $id, + array( + 'textarea_name' => $name, + 'textarea_rows' => 20, + 'editor_height' => 425, + 'wpautop' => false, + 'media_buttons' => false, + 'editor_class' => $class + ) + ); + + $html = ob_get_clean(); + + return $html; + } + + + function render_checkbox( $field_data ) { + + if ( empty( $field_data['id'] ) ) + return false; + + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + $id_attr = ' id="' . $id . '" '; + $id_attr_hidden = ' id="' . $id . '_hidden" '; + + $class = ! empty( $field_data['class'] ) ? $field_data['class'] : ''; + $class .= ! empty( $field_data['size'] ) ? $field_data['size'] : 'um-long-field'; + $class_attr = ' class="um-forms-field ' . $class . '" '; + + $data = array( + 'field_id' => $field_data['id'] + ); + + $data_attr = ''; + foreach ( $data as $key => $value ) { + $data_attr .= " data-{$key}=\"{$value}\" "; + } + + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + $name_attr = ' name="' . $name . '" '; + + $default = isset( $field_data['default'] ) ? $field_data['default'] : ''; + $value = ( '' !== $field_data['value'] ) ? $field_data['value'] : $default; + /*$value = isset( $field_data['value'] ) ? $field_data['value'] : $default; + $value = ! empty( $field_data['value'] ) ? $field_data['value'] : 0; + */ + + $html = " + "; + + + return $html; + } + + + function render_select( $field_data ) { + + if ( empty( $field_data['id'] ) ) + return false; + + $multiple = ! empty( $field_data['multi'] ) ? 'multiple' : ''; + + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + $id_attr = ' id="' . $id . '" '; + + $class = ! empty( $field_data['class'] ) ? $field_data['class'] : ''; + $class .= ! empty( $field_data['size'] ) ? 'um-' . $field_data['size'] . '-field' : 'um-long-field'; + $class_attr = ' class="um-forms-field ' . $class . '" '; + + $data = array( + 'field_id' => $field_data['id'] + ); + + $data_attr = ''; + foreach ( $data as $key => $value ) { + $data_attr .= " data-{$key}=\"{$value}\" "; + } + + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + $name = $name . ( ! empty( $field_data['multi'] ) ? '[]' : '' ); + $name_attr = ' name="' . $name . '" '; + + $default = isset( $field_data['default'] ) ? $field_data['default'] : ''; + $value = isset( $field_data['value'] ) ? $field_data['value'] : $default; + + $options = ''; + foreach ( $field_data['options'] as $key=>$option ) { + if ( ! empty( $field_data['multi'] ) ) { + + if ( ! is_array( $value ) && empty( $value ) ) + $value = array(); + + $options .= ''; + } else { + $options .= ''; + } + } + + $html = ""; + + return $html; + } + + + function render_multi_selects( $field_data ) { + + if ( empty( $field_data['id'] ) ) + return false; + + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + + $class = ! empty( $field_data['class'] ) ? $field_data['class'] : ''; + $class .= ! empty( $field_data['size'] ) ? $field_data['size'] : 'um-long-field'; + $class_attr = ' class="um-forms-field ' . $class . '" '; + + $data = array( + 'field_id' => $field_data['id'], + 'id_attr' => $id + ); + + $data_attr = ''; + foreach ( $data as $key => $value ) { + $data_attr .= " data-{$key}=\"{$value}\" "; + } + + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + $name = "{$name}[]"; + $name_attr = ' name="' . $name . '" '; + + $default = isset( $field_data['default'] ) ? $field_data['default'] : ''; + $values = isset( $field_data['value'] ) ? $field_data['value'] : $default; + + $options = ''; + foreach ( $field_data['options'] as $key=>$option ) { + $options .= ''; + } + + $html = ""; + $html .= "
              "; + + if ( ! empty( $values ) ) { + foreach ( $values as $k=>$value ) { + + $id_attr = ' id="' . $id . '-' . $k . '" '; + + $options = ''; + foreach ( $field_data['options'] as $key=>$option ) { + $options .= ''; + } + + $html .= "
            • + + " . __( 'Remove', 'ultimate-member' ) . "
            • "; + } + } elseif ( ! empty( $field_data['show_default_number'] ) && is_numeric( $field_data['show_default_number'] ) && $field_data['show_default_number'] > 0 ) { + $i = 0; + while( $i < $field_data['show_default_number'] ) { + $id_attr = ' id="' . $id . '-' . $i . '" '; + + $options = ''; + foreach ( $field_data['options'] as $key=>$option ) { + $options .= ''; + } + + $html .= "
            • + + " . __( 'Remove', 'ultimate-member' ) . "
            • "; + + $i++; + } + } + + $html .= "
            {$field_data['add_text']}"; + + return $html; + } + + + function render_multi_checkbox( $field_data ) { + + if ( empty( $field_data['id'] ) ) + return false; + + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + + $class = ! empty( $field_data['class'] ) ? $field_data['class'] : ''; + $class .= ! empty( $field_data['size'] ) ? $field_data['size'] : 'um-long-field'; + $class_attr = ' class="um-forms-field ' . $class . '" '; + + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + + $default = isset( $field_data['default'] ) ? $field_data['default'] : ''; + $values = ( '' !== $field_data['value'] ) ? $field_data['value'] : $default; + + $i = 0; + $html = ''; + + $columns = ( ! empty( $field_data['columns'] ) && is_numeric( $field_data['columns'] ) ) ? $field_data['columns'] : 1; + while ( $i < $columns ) { + $per_page = ceil( count( $field_data['options'] ) / $columns ); + $section_fields_per_page = array_slice( $field_data['options'], $i*$per_page, $per_page ); + $html .= ''; + + foreach ( $section_fields_per_page as $k => $title ) { + $id_attr = ' id="' . $id . '_' . $k . '" '; + $for_attr = ' for="' . $id . '_' . $k . '" '; + $name_attr = ' name="' . $name . '[' . $k . ']" '; + + $html .= ""; + } + + $html .= ''; + $i++; + } + + return $html; + } + + + function render_multi_text( $field_data ) { + + if ( empty( $field_data['id'] ) ) + return false; + + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + + $size = ! empty( $field_data['size'] ) ? 'um-' . $field_data['size'] . '-field' : 'um-long-field'; + + $class = ! empty( $field_data['class'] ) ? $field_data['class'] : ''; + $class_attr = ' class="um-forms-field ' . $class . '" '; + + $data = array( + 'field_id' => $field_data['id'], + 'id_attr' => $id + ); + + $data_attr = ''; + foreach ( $data as $key => $value ) { + $data_attr .= " data-{$key}=\"{$value}\" "; + } + + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + $name = "{$name}[]"; + $name_attr = ' name="' . $name . '" '; + + //$values = ! empty( $field_data['value'] ) ? $field_data['value'] : ( ! empty( $field_data['default'] ) ? $field_data['default'] : '' ); + + $default = isset( $field_data['default'] ) ? $field_data['default'] : ''; + $values = isset( $field_data['value'] ) ? $field_data['value'] : $default; + + $html = ""; + $html .= "
              "; + + if ( ! empty( $values ) ) { + foreach ( $values as $k=>$value ) { + + $id_attr = ' id="' . $id . '-' . $k . '" '; + + $html .= "
            • + + " . __( 'Remove', 'ultimate-member' ) . "
            • "; + } + } elseif ( ! empty( $field_data['show_default_number'] ) && is_numeric( $field_data['show_default_number'] ) && $field_data['show_default_number'] > 0 ) { + $i = 0; + while( $i < $field_data['show_default_number'] ) { + $id_attr = ' id="' . $id . '-' . $i . '" '; + + $html .= "
            • + + " . __( 'Remove', 'ultimate-member' ) . "
            • "; + + $i++; + } + } + + $html .= "
            {$field_data['add_text']}"; + + return $html; + } + + + function render_media( $field_data ) { + + if ( empty( $field_data['id'] ) ) + return false; + + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + + $class = ! empty( $field_data['class'] ) ? $field_data['class'] : ''; + $class .= ! empty( $field_data['size'] ) ? $field_data['size'] : 'um-long-field'; + $class_attr = ' class="um-forms-field um-media-upload-data-url ' . $class . '"'; + + $data = array( + 'field_id' => $field_data['id'], + ); + + if ( ! empty( $field_data['default']['url'] ) ) + $data['default'] = esc_attr( $field_data['default']['url'] ); + + $data_attr = ''; + foreach ( $data as $key => $value ) { + $data_attr .= " data-{$key}=\"{$value}\" "; + } + + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + $default = isset( $field_data['default'] ) ? $field_data['default'] : ''; + $value = ! empty( $field_data['value'] ) ? $field_data['value'] : $default; + + $upload_frame_title = ! empty( $field_data['upload_frame_title'] ) ? $field_data['upload_frame_title'] : __( 'Select media', 'ultimate-member' ); + + $image_id = ! empty( $value['id'] ) ? $value['id'] : ''; + $image_width = ! empty( $value['width'] ) ? $value['width'] : ''; + $image_height = ! empty( $value['height'] ) ? $value['height'] : ''; + $image_thumbnail = ! empty( $value['thumbnail'] ) ? $value['thumbnail'] : ''; + $image_url = ! empty( $value['url'] ) ? $value['url'] : ''; + + $html = "
            " . + "" . + "" . + "" . + "" . + ""; + + if ( ! isset( $field_data['preview'] ) || $field_data['preview'] !== false ) { + $html .= '
            '; + } + + if ( ! empty( $field_data['url'] ) ) { + $html .= '
            '; + } + + $html .= ' +
            '; + + return $html; + } + + } +} \ No newline at end of file diff --git a/includes/admin/core/class-admin-functions.php b/includes/admin/core/class-admin-functions.php new file mode 100644 index 00000000..0e5b2b80 --- /dev/null +++ b/includes/admin/core/class-admin-functions.php @@ -0,0 +1,121 @@ +slug = 'ultimatemember'; + + add_action('parent_file', array(&$this, 'parent_file'), 9); + + add_filter('gettext', array(&$this, 'gettext'), 10, 4); + + add_filter('post_updated_messages', array(&$this, 'post_updated_messages') ); + + } + + /*** + *** @updated post messages + ***/ + function post_updated_messages($messages) { + global $post, $post_ID; + + $post_type = get_post_type( $post_ID ); + if ($post_type == 'um_form') { + + $messages['um_form'] = array( + 0 => '', + 1 => __('Form updated.'), + 2 => __('Custom field updated.'), + 3 => __('Custom field deleted.'), + 4 => __('Form updated.'), + 5 => isset($_GET['revision']) ? __('Form restored to revision.') : false, + 6 => __('Form created.'), + 7 => __('Form saved.'), + 8 => __('Form submitted.'), + 9 => __('Form scheduled.'), + 10=> __('Form draft updated.'), + ); + + } + + if ($post_type == 'um_role') { + + $messages['um_role'] = array( + 0 => '', + 1 => __('Role updated.'), + 2 => __('Custom field updated.'), + 3 => __('Custom field deleted.'), + 4 => __('Role updated.'), + 5 => isset($_GET['revision']) ? __('Role restored to revision.') : false, + 6 => __('Role created.'), + 7 => __('Role saved.'), + 8 => __('Role submitted.'), + 9 => __('Role scheduled.'), + 10=> __('Role draft updated.'), + ); + + } + + return $messages; + } + + /*** + *** @check that we're on a custom post type supported by UM + ***/ + function is_plugin_post_type(){ + if (isset($_REQUEST['post_type'])){ + $post_type = $_REQUEST['post_type']; + if ( in_array($post_type, array('um_form','um_role','um_directory'))){ + return true; + } + } else if ( isset($_REQUEST['action'] ) && $_REQUEST['action'] == 'edit') { + $post_type = get_post_type(); + if ( in_array($post_type, array('um_form','um_role','um_directory'))){ + return true; + } + } + return false; + } + + /*** + *** @gettext filters + ***/ + function gettext($translation, $text, $domain) { + global $post; + //$screen = get_current_screen(); + if ( isset( $post->post_type ) && $this->is_plugin_post_type() ) { + $translations = get_translations_for_domain( $domain); + if ( $text == 'Publish') { + return $translations->translate( 'Create' ); + } + if ( $text == 'Move to Trash') { + return $translations->translate( 'Delete' ); + } + } + + return $translation; + } + + /*** + *** @Fix parent file for correct highlighting + ***/ + function parent_file($parent_file){ + global $current_screen; + $screen_id = $current_screen->id; + if ( strstr($screen_id, 'um_') ) { + $parent_file = $this->slug; + } + return $parent_file; + } + + + + + } +} \ No newline at end of file diff --git a/includes/admin/core/class-admin-menu.php b/includes/admin/core/class-admin-menu.php new file mode 100644 index 00000000..d04e6ef3 --- /dev/null +++ b/includes/admin/core/class-admin-menu.php @@ -0,0 +1,321 @@ +slug = 'ultimatemember'; + + $this->about_tabs['about'] = 'About'; + $this->about_tabs['start'] = 'Getting Started'; + + add_action('admin_menu', array(&$this, 'primary_admin_menu'), 0); + add_action('admin_menu', array(&$this, 'secondary_menu_items'), 1000); + add_action('admin_menu', array(&$this, 'extension_menu'), 9999); + + add_action( 'admin_head', array( $this, 'menu_order_count' ) ); + + add_filter( 'admin_footer_text', array( $this, 'admin_footer_text' ), 1000 ); + } + + /** + * Change the admin footer text on UM admin pages + */ + public function admin_footer_text( $footer_text ) { + $current_screen = get_current_screen(); + + // Add the dashboard pages + $um_pages[] = 'toplevel_page_ultimatemember'; + $um_pages[] = 'admin_page_ultimatemember-about'; + $um_pages[] = 'ultimate-member_page_um_options'; + $um_pages[] = 'edit-um_form'; + $um_pages[] = 'edit-um_role'; + $um_pages[] = 'edit-um_directory'; + $um_pages[] = 'ultimate-member_page_ultimatemember-extensions'; + + if ( isset( $current_screen->id ) && in_array( $current_screen->id, $um_pages ) ) { + // Change the footer text + if ( ! get_option( 'um_admin_footer_text_rated' ) ) { + + $footer_text = sprintf( __( 'If you like Ultimate Member please consider leaving a %s★★★★★%s review. It will help us to grow the plugin and make it more popular. Thank you.', 'ultimate-member' ), '', '' ); + + $footer_text .= ""; + } + } + + return $footer_text; + } + + /** + * When user clicks the review link in backend + */ + function ultimatemember_rated() { + update_option('um_admin_footer_text_rated', 1 ); + die(); + } + + + /** + * Manage order of admin menu items + */ + public function menu_order_count() { + global $menu, $submenu; + + if ( ! current_user_can( 'list_users' ) ) + return; + + $count = UM()->user()->get_pending_users_count(); + if ( is_array( $menu ) ) { + foreach ( $menu as $key => $menu_item ) { + if ( 0 === strpos( $menu_item[0], _x( 'Users', 'Admin menu name' ) ) ) { + $menu[ $key ][0] .= ' '.$count.''; + } + } + + } + if ( is_array( $submenu ) ) { + foreach ( $submenu['users.php'] as $key => $menu_item ) { + if ( 0 === strpos( $menu_item[0], _x( 'All Users', 'Admin menu name' ) ) ) { + $submenu['users.php'][ $key ][0] .= ' '.$count.''; + } + } + } + } + + /*** + *** @setup admin menu + ***/ + function primary_admin_menu() { + + $this->pagehook = add_menu_page( __('Ultimate Member', $this->slug), __('Ultimate Member', $this->slug), 'manage_options', $this->slug, array(&$this, 'admin_page'), 'dashicons-admin-users', '42.78578'); + add_action( 'load-' . $this->pagehook, array( &$this, 'on_load_page' ) ); + + add_submenu_page( $this->slug, __('Dashboard', $this->slug), __('Dashboard', $this->slug), 'manage_options', $this->slug, array(&$this, 'admin_page') ); + + foreach( $this->about_tabs as $k => $tab ) { + add_submenu_page( '_'. $k . '_um', sprintf(__('%s | Ultimate Member', $this->slug), $tab), sprintf(__('%s | Ultimate Member', $this->slug), $tab), 'manage_options', $this->slug . '-' . $k, array(&$this, 'admin_page') ); + } + + } + + + /*** + *** @secondary admin menu (after settings) + ***/ + function secondary_menu_items() { + + add_submenu_page( $this->slug, __('Forms', $this->slug), __('Forms', $this->slug), 'manage_options', 'edit.php?post_type=um_form', '', '' ); + + add_submenu_page( $this->slug, __( 'User Roles', 'ultimate-member' ), __( 'User Roles', 'ultimate-member' ), 'manage_options', 'um_roles', array( &$this, 'um_roles_pages' ) ); + + if ( um_get_option('members_page' ) || !get_option('um_options') ){ + add_submenu_page( $this->slug, __('Member Directories', $this->slug), __('Member Directories', $this->slug), 'manage_options', 'edit.php?post_type=um_directory', '', '' ); + } + + do_action('um_extend_admin_menu'); + + } + + + function um_roles_pages() { + + if ( empty( $_GET['tab'] ) ) { + include_once um_path . 'includes/admin/core/list-tables/roles-list-table.php'; + } elseif ( $_GET['tab'] == 'add' || $_GET['tab'] == 'edit' ) { + include_once um_path . 'includes/admin/templates/role/role-edit.php'; + } else { + um_js_redirect( add_query_arg( array( 'page' => 'um_roles' ), get_admin_url( 'admin.php' ) ) ); + } + + } + + + /*** + *** @extension menu + ***/ + function extension_menu() { + + add_submenu_page( $this->slug, __('Extensions', $this->slug), '' .__('Extensions', $this->slug) . '', 'manage_options', $this->slug . '-extensions', array(&$this, 'admin_page') ); + + } + + /*** + *** @load metabox stuff + ***/ + function on_load_page() { + wp_enqueue_script('common'); + wp_enqueue_script('wp-lists'); + wp_enqueue_script('postbox'); + + /** custom metaboxes for dashboard defined here **/ + + add_meta_box('um-metaboxes-contentbox-1', __('Users Overview','ultimate-member'), array(&$this, 'users_overview'), $this->pagehook, 'core', 'core'); + + add_meta_box('um-metaboxes-mainbox-1', __('Latest from our blog','ultimate-member'), array(&$this, 'um_news'), $this->pagehook, 'normal', 'core'); + + add_meta_box('um-metaboxes-sidebox-1', __('Purge Temp Files','ultimate-member'), array(&$this, 'purge_temp'), $this->pagehook, 'side', 'core'); + add_meta_box('um-metaboxes-sidebox-2', __('User Cache','ultimate-member'), array(&$this, 'user_cache'), $this->pagehook, 'side', 'core'); + + if ( $this->language_avaialable_not_installed() ) { + add_meta_box('um-metaboxes-sidebox-2', __('Language','ultimate-member'), array(&$this, 'dl_language'), $this->pagehook, 'side', 'core'); + } else if ( $this->language_avaialable_installed() ) { + add_meta_box('um-metaboxes-sidebox-2', __('Language','ultimate-member'), array(&$this, 'up_language'), $this->pagehook, 'side', 'core'); + } else if ( $this->language_not_available() ) { + add_meta_box('um-metaboxes-sidebox-2', __('Language','ultimate-member'), array(&$this, 'ct_language'), $this->pagehook, 'side', 'core'); + } + + } + + function up_language() { + $locale = get_option('WPLANG'); + include_once UM()->admin()->templates_path . 'dashboard/language-update.php'; + } + + function dl_language() { + $locale = get_option('WPLANG'); + include_once UM()->admin()->templates_path . 'dashboard/language-download.php'; + } + + function ct_language() { + $locale = get_option('WPLANG'); + include_once UM()->admin()->templates_path . 'dashboard/language-contrib.php'; + } + + function um_news() { + include_once UM()->admin()->templates_path . 'dashboard/feed.php'; + } + + function users_overview() { + include_once UM()->admin()->templates_path . 'dashboard/users.php'; + } + + function purge_temp() { + include_once UM()->admin()->templates_path . 'dashboard/purge.php'; + } + + function user_cache() { + include_once UM()->admin()->templates_path . 'dashboard/cache.php'; + } + + /*** + *** @language not available + ***/ + function language_not_available() { + $locale = get_option('WPLANG'); + if ( $locale && !strstr($locale, 'en_') && !isset( UM()->available_languages[$locale] ) && !file_exists( WP_LANG_DIR . '/plugins/ultimatemember-' . $locale . '.mo' ) ) + return true; + return false; + } + + /*** + *** @language available but not installed + ***/ + function language_avaialable_not_installed() { + $locale = get_option('WPLANG'); + if ( $locale && isset( UM()->available_languages[$locale] ) && !file_exists( WP_LANG_DIR . '/plugins/ultimatemember-' . $locale . '.mo' ) ) + return true; + return false; + } + + /*** + *** @language available and installed + ***/ + function language_avaialable_installed() { + $locale = get_option('WPLANG'); + if ( $locale && isset( UM()->available_languages[$locale] ) && file_exists( WP_LANG_DIR . '/plugins/ultimatemember-' . $locale . '.mo' ) ) + return true; + return false; + } + + /*** + *** @get a directory size + ***/ + function dir_size( $directory ) { + if ( $directory == 'temp' ) { + $directory = UM()->files()->upload_temp; + $size = 0; + + foreach( new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator( $directory ) ) as $file ) { + $size+=$file->getSize(); + } + return round ( $size / 1048576, 2); + } + return 0; + } + + /*** + *** @which admin page to show? + ***/ + function admin_page() { + + $page = $_REQUEST['page']; + if ( $page == 'ultimatemember' && ! isset( $_REQUEST['um-addon'] ) ) { + + ?> + +
            + +

            Ultimate Member

            + + + + + + + +
            + +
            + +
            pagehook,'core',null); ?>
            +
            pagehook,'normal',null); ?>
            +
            pagehook,'side',null); ?>
            + +
            + +
            + +
            + + + + admin()->templates_path . 'extensions.php'; + + } else if ( $page == 'ultimatemember-about' ) { + + include_once UM()->admin()->templates_path . 'welcome/about.php'; + + } else if ( $page == 'ultimatemember-start' ) { + + include_once UM()->admin()->templates_path . 'welcome/start.php'; + + } + + } + + } +} \ No newline at end of file diff --git a/includes/admin/core/class-admin-metabox.php b/includes/admin/core/class-admin-metabox.php new file mode 100644 index 00000000..9a30d378 --- /dev/null +++ b/includes/admin/core/class-admin-metabox.php @@ -0,0 +1,1953 @@ +slug = 'ultimatemember'; + + $this->in_edit = false; + $this->edit_mode_value = null; + + add_action('admin_head', array(&$this, 'admin_head'), 9); + add_action('admin_footer', array(&$this, 'load_modal_content'), 9); + + add_action( 'load-post.php', array(&$this, 'add_metabox'), 9 ); + add_action( 'load-post-new.php', array(&$this, 'add_metabox'), 9 ); + + + add_action( 'plugins_loaded', array(&$this, 'add_taxonomy_metabox'), 9 ); + + + //roles metaboxes + add_action( 'um_roles_add_meta_boxes', array( &$this, 'add_metabox_role' ) ); + } + + /*** + *** @Boolean check if we're viewing UM backend + ***/ + function is_UM_admin() { + global $current_screen; + $screen_id = $current_screen->id; + if ( is_admin() && ( strstr( $screen_id, 'ultimatemember') || strstr( $screen_id, 'um_') || strstr($screen_id, 'user') || strstr($screen_id, 'profile') ) ) + return true; + return false; + } + + /*** + *** @check that we're on a custom post type supported by UM + ***/ + function is_plugin_post_type() { + if (isset($_REQUEST['post_type'])){ + $post_type = $_REQUEST['post_type']; + if ( in_array($post_type, array('um_form','um_role','um_directory'))){ + return true; + } + } else if ( isset($_REQUEST['action'] ) && $_REQUEST['action'] == 'edit') { + $post_type = get_post_type(); + if ( in_array($post_type, array('um_form','um_role','um_directory'))){ + return true; + } + } + return false; + } + + /*** + *** @Gets the role meta + ***/ + function get_custom_post_meta($id){ + $all_meta = get_post_custom($id); + foreach($all_meta as $k=>$v){ + if (strstr($k, '_um_')){ + $um_meta[$k] = $v; + } + } + if (isset($um_meta)) + return $um_meta; + } + + /*** + *** @Runs on admin head + ***/ + function admin_head(){ + global $post; + if ( $this->is_plugin_post_type() && isset($post->ID) ){ + $this->postmeta = $this->get_custom_post_meta($post->ID); + } + } + + + /*** + *** @Init the metaboxes + ***/ + function add_metabox() { + global $current_screen; + + if ( $current_screen->id == 'um_form' ) { + add_action( 'add_meta_boxes', array(&$this, 'add_metabox_form'), 1 ); + add_action( 'save_post', array(&$this, 'save_metabox_form'), 10, 2 ); + } + + if ( $current_screen->id == 'um_directory' ) { + add_action( 'add_meta_boxes', array(&$this, 'add_metabox_directory'), 1 ); + add_action( 'save_post', array(&$this, 'save_metabox_directory'), 10, 2 ); + } + + //restrict content metabox + $post_types = um_get_option( 'restricted_access_post_metabox' ); + if ( ! empty( $post_types[ $current_screen->id ] ) ) { + add_action( 'add_meta_boxes', array(&$this, 'add_metabox_restrict_content'), 1 ); + add_action( 'save_post', array( &$this, 'save_metabox_restrict_content' ), 10, 2 ); + } + + + add_action( 'save_post', array( &$this, 'save_metabox_custom' ), 10, 2 ); + } + + + function save_metabox_custom( $post_id, $post ) { + // validate nonce + if ( ! isset( $_POST['um_admin_save_metabox_custom_nonce'] ) || ! wp_verify_nonce( $_POST['um_admin_save_metabox_custom_nonce'], basename( __FILE__ ) ) ) return $post_id; + + do_action( 'um_admin_custom_restrict_content_metaboxes', $post_id, $post ); + } + + + function add_metabox_restrict_content() { + global $current_screen; + + add_meta_box( 'um-admin-restrict-content', __( 'UM Content Restriction', 'ultimate-member' ), array( &$this, 'restrict_content_cb' ), $current_screen->id, 'normal', 'default' ); + do_action( 'um_admin_custom_restrict_content_metaboxes' ); + } + + + /** + * Content restriction metabox + * + * @param $object + * @param $box + */ + function restrict_content_cb( $object, $box ) { + include_once UM()->admin()->templates_path . 'access/restrict_content.php'; + wp_nonce_field( basename( __FILE__ ), 'um_admin_save_metabox_restrict_content_nonce' ); + } + + + /*** + *** @Init the metaboxes + ***/ + function add_taxonomy_metabox() { + //restrict content metabox + $all_taxonomies = get_taxonomies( array( 'public' => true ) ); + $tax_types = um_get_option( 'restricted_access_taxonomy_metabox' ); + $exclude_taxonomies = array( + 'nav_menu', + 'link_category', + 'post_format', + 'um_user_tag', + 'um_hashtag', + ); + + foreach ( $all_taxonomies as $key => $taxonomy ) { + if ( in_array( $key, $exclude_taxonomies ) || empty( $tax_types[$key] ) ) + continue; + + add_action( $taxonomy . '_add_form_fields', array( &$this, 'um_category_access_fields_create' ) ); + add_action( $taxonomy . '_edit_form_fields', array( &$this, 'um_category_access_fields_edit' ) ); + add_action( 'create_' . $taxonomy, array( &$this, 'um_category_access_fields_save' ) ); + add_action( 'edited_' . $taxonomy, array( &$this, 'um_category_access_fields_save' ) ); + } + } + + + function save_metabox_restrict_content( $post_id, $post ) { + // validate nonce + if ( ! isset( $_POST['um_admin_save_metabox_restrict_content_nonce'] ) || !wp_verify_nonce( $_POST['um_admin_save_metabox_restrict_content_nonce'], basename( __FILE__ ) ) ) + return $post_id; + + // validate user + $post_type = get_post_type_object( $post->post_type ); + if ( ! current_user_can( $post_type->cap->edit_post, $post_id ) ) + return $post_id; + + if ( ! empty( $_POST['um_content_restriction'] ) ) + update_post_meta( $post_id, 'um_content_restriction', $_POST['um_content_restriction'] ); + else + delete_post_meta( $post_id, 'um_content_restriction' ); + + return $post_id; + } + + + function um_category_access_fields_create() { + $data = array(); + + UM()->admin_forms( array( + 'class' => 'um-restrict-content um-third-column', + 'prefix_id' => 'um_content_restriction', + 'without_wrapper' => true, + 'div_line' => true, + 'fields' => array( + array( + 'id' => '_um_custom_access_settings', + 'type' => 'checkbox', + 'name' => '_um_custom_access_settings', + 'label' => __( 'Restrict access to this content?', 'ultimate-member' ), + 'description' => __( 'Activate content restriction for this post', 'ultimate-member' ), + 'value' => ! empty( $data['_um_custom_access_settings'] ) ? $data['_um_custom_access_settings'] : 0, + ), + array( + 'id' => '_um_accessible', + 'type' => 'select', + 'name' => '_um_accessible', + 'label' => __( 'Who can access this content?', 'ultimate-member' ), + 'description' => __( 'Activate content restriction for this post', 'ultimate-member' ), + 'value' => ! empty( $data['_um_accessible'] ) ? $data['_um_accessible'] : 0, + 'options' => array( + '0' => __( 'Everyone', 'ultimate-member' ), + '1' => __( 'Logged out users', 'ultimate-member' ), + '2' => __( 'Logged in users', 'ultimate-member' ), + ), + 'conditional' => array( '_um_custom_access_settings', '=', '1' ) + ), + array( + 'id' => '_um_access_roles', + 'type' => 'multi_checkbox', + 'name' => '_um_access_roles', + 'label' => __( 'Select which roles can access this content', 'ultimate-member' ), + 'description' => __( 'Activate content restriction for this post', 'ultimate-member' ), + 'options' => UM()->roles()->get_roles( false, array( 'administrator' ) ), + 'columns' => 3, + 'conditional' => array( '_um_accessible', '=', '2' ) + ), + array( + 'id' => '_um_noaccess_action', + 'type' => 'select', + 'name' => '_um_noaccess_action', + 'label' => __( 'What happens when users without access tries to view the content?', 'ultimate-member' ), + 'description' => __( 'Action when users without access tries to view the content', 'ultimate-member' ), + 'value' => ! empty( $data['_um_noaccess_action'] ) ? $data['_um_noaccess_action'] : 0, + 'options' => array( + '0' => __( 'Show access restricted message', 'ultimate-member' ), + '1' => __( 'Redirect user', 'ultimate-member' ), + ), + 'conditional' => array( '_um_accessible', '!=', '0' ) + ), + array( + 'id' => '_um_restrict_by_custom_message', + 'type' => 'select', + 'name' => '_um_restrict_by_custom_message', + 'label' => __( 'Would you like to use the global default message or apply a custom message to this content?', 'ultimate-member' ), + 'description' => __( 'Action when users without access tries to view the content', 'ultimate-member' ), + 'value' => ! empty( $data['_um_restrict_by_custom_message'] ) ? $data['_um_restrict_by_custom_message'] : '0', + 'options' => array( + '0' => __( 'Global default message (default)', 'ultimate-member' ), + '1' => __( 'Custom message', 'ultimate-member' ), + ), + 'conditional' => array( '_um_noaccess_action', '=', '0' ) + ), + array( + 'id' => '_um_restrict_custom_message', + 'type' => 'wp_editor', + 'name' => '_um_restrict_custom_message', + 'label' => __( 'Custom Restrict Content message', 'ultimate-member' ), + 'description' => __( 'Changed global restrict message', 'ultimate-member' ), + 'value' => ! empty( $data['_um_restrict_custom_message'] ) ? $data['_um_restrict_custom_message'] : '', + 'conditional' => array( '_um_restrict_by_custom_message', '=', '1' ) + ), + array( + 'id' => '_um_access_redirect', + 'type' => 'select', + 'name' => '_um_access_redirect', + 'label' => __( 'Where should users be redirected to?', 'ultimate-member' ), + 'description' => __( 'Select redirect to page when user hasn\'t access to content', 'ultimate-member' ), + 'value' => ! empty( $data['_um_access_redirect'] ) ? $data['_um_access_redirect'] : '0', + 'conditional' => array( '_um_noaccess_action', '=', '1' ), + 'options' => array( + '0' => __( 'Login page', 'ultimate-member' ), + '1' => __( 'Custom URL', 'ultimate-member' ), + ), + ), + array( + 'id' => '_um_access_redirect_url', + 'type' => 'text', + 'name' => '_um_access_redirect_url', + 'label' => __( 'Redirect URL', 'ultimate-member' ), + 'description' => __( 'Changed global restrict message', 'ultimate-member' ), + 'value' => ! empty( $data['_um_access_redirect_url'] ) ? $data['_um_access_redirect_url'] : '', + 'conditional' => array( '_um_access_redirect', '=', '1' ) + ), + array( + 'id' => '_um_access_hide_from_queries', + 'type' => 'checkbox', + 'name' => '_um_access_hide_from_queries', + 'label' => __( 'Hide from queries', 'ultimate-member' ), + 'description' => __( 'Hide this content from archives, RSS feeds etc for users who do not have permission to view this content', 'ultimate-member' ), + 'value' => ! empty( $data['_um_access_hide_from_queries'] ) ? $data['_um_access_hide_from_queries'] : '', + 'conditional' => array( '_um_accessible', '!=', '0' ) + ) + ) + ) )->render_form(); + + wp_nonce_field( basename( __FILE__ ), 'um_admin_save_taxonomy_restrict_content_nonce' ); + } + + + function um_category_access_fields_edit( $term ) { + $termID = $term->term_id; + + $data = get_term_meta( $termID, 'um_content_restriction', true ); + + $_um_access_roles_value = array(); + if ( ! empty( $data['_um_access_roles'] ) ) { + foreach ( $data['_um_access_roles'] as $key => $value ) { + if ( $value ) + $_um_access_roles_value[] = $key; + } + } + + + UM()->admin_forms( array( + 'class' => 'um-restrict-content um-third-column', + 'prefix_id' => 'um_content_restriction', + 'without_wrapper' => true, + 'fields' => array( + array( + 'id' => '_um_custom_access_settings', + 'type' => 'checkbox', + 'class' => 'form-field', + 'name' => '_um_custom_access_settings', + 'label' => __( 'Restrict access to this content?', 'ultimate-member' ), + 'description' => __( 'Activate content restriction for this post', 'ultimate-member' ), + 'value' => ! empty( $data['_um_custom_access_settings'] ) ? $data['_um_custom_access_settings'] : 0, + ), + array( + 'id' => '_um_accessible', + 'type' => 'select', + 'class' => 'form-field', + 'name' => '_um_accessible', + 'label' => __( 'Who can access this content?', 'ultimate-member' ), + 'description' => __( 'Activate content restriction for this post', 'ultimate-member' ), + 'value' => ! empty( $data['_um_accessible'] ) ? $data['_um_accessible'] : 0, + 'options' => array( + '0' => __( 'Everyone', 'ultimate-member' ), + '1' => __( 'Logged out users', 'ultimate-member' ), + '2' => __( 'Logged in users', 'ultimate-member' ), + ), + 'conditional' => array( '_um_custom_access_settings', '=', '1' ) + ), + array( + 'id' => '_um_access_roles', + 'type' => 'multi_checkbox', + 'class' => 'form-field', + 'name' => '_um_access_roles', + 'label' => __( 'Select which roles can access this content', 'ultimate-member' ), + 'description' => __( 'Activate content restriction for this post', 'ultimate-member' ), + 'value' => $_um_access_roles_value, + 'options' => UM()->roles()->get_roles( false, array( 'administrator' ) ), + 'columns' => 3, + 'conditional' => array( '_um_accessible', '=', '2' ) + ), + array( + 'id' => '_um_noaccess_action', + 'type' => 'select', + 'class' => 'form-field', + 'name' => '_um_noaccess_action', + 'label' => __( 'What happens when users without access tries to view the content?', 'ultimate-member' ), + 'description' => __( 'Action when users without access tries to view the content', 'ultimate-member' ), + 'value' => ! empty( $data['_um_noaccess_action'] ) ? $data['_um_noaccess_action'] : 0, + 'options' => array( + '0' => __( 'Show access restricted message', 'ultimate-member' ), + '1' => __( 'Redirect user', 'ultimate-member' ), + ), + 'conditional' => array( '_um_accessible', '!=', '0' ) + ), + array( + 'id' => '_um_restrict_by_custom_message', + 'type' => 'select', + 'class' => 'form-field', + 'name' => '_um_restrict_by_custom_message', + 'label' => __( 'Would you like to use the global default message or apply a custom message to this content?', 'ultimate-member' ), + 'description' => __( 'Action when users without access tries to view the content', 'ultimate-member' ), + 'value' => ! empty( $data['_um_restrict_by_custom_message'] ) ? $data['_um_restrict_by_custom_message'] : '0', + 'options' => array( + '0' => __( 'Global default message (default)', 'ultimate-member' ), + '1' => __( 'Custom message', 'ultimate-member' ), + ), + 'conditional' => array( '_um_noaccess_action', '=', '0' ) + ), + array( + 'id' => '_um_restrict_custom_message', + 'type' => 'wp_editor', + 'class' => 'form-field', + 'name' => '_um_restrict_custom_message', + 'label' => __( 'Custom Restrict Content message', 'ultimate-member' ), + 'description' => __( 'Changed global restrict message', 'ultimate-member' ), + 'value' => ! empty( $data['_um_restrict_custom_message'] ) ? $data['_um_restrict_custom_message'] : '', + 'conditional' => array( '_um_restrict_by_custom_message', '=', '1' ) + ), + array( + 'id' => '_um_access_redirect', + 'type' => 'select', + 'class' => 'form-field', + 'name' => '_um_access_redirect', + 'label' => __( 'Where should users be redirected to?', 'ultimate-member' ), + 'description' => __( 'Select redirect to page when user hasn\'t access to content', 'ultimate-member' ), + 'value' => ! empty( $data['_um_access_redirect'] ) ? $data['_um_access_redirect'] : '0', + 'conditional' => array( '_um_noaccess_action', '=', '1' ), + 'options' => array( + '0' => __( 'Login page', 'ultimate-member' ), + '1' => __( 'Custom URL', 'ultimate-member' ), + ), + ), + array( + 'id' => '_um_access_redirect_url', + 'type' => 'text', + 'class' => 'form-field', + 'name' => '_um_access_redirect_url', + 'label' => __( 'Redirect URL', 'ultimate-member' ), + 'description' => __( 'Changed global restrict message', 'ultimate-member' ), + 'value' => ! empty( $data['_um_access_redirect_url'] ) ? $data['_um_access_redirect_url'] : '', + 'conditional' => array( '_um_access_redirect', '=', '1' ) + ), + array( + 'id' => '_um_access_hide_from_queries', + 'type' => 'checkbox', + 'class' => 'form-field', + 'name' => '_um_access_hide_from_queries', + 'label' => __( 'Hide from queries', 'ultimate-member' ), + 'description' => __( 'Hide this content from archives, RSS feeds etc for users who do not have permission to view this content', 'ultimate-member' ), + 'value' => ! empty( $data['_um_access_hide_from_queries'] ) ? $data['_um_access_hide_from_queries'] : '', + 'conditional' => array( '_um_accessible', '!=', '0' ) + ) + ) + ) )->render_form(); + + wp_nonce_field( basename( __FILE__ ), 'um_admin_save_taxonomy_restrict_content_nonce' ); + } + + + function um_category_access_fields_save( $termID ) { + + // validate nonce + if ( ! isset( $_REQUEST['um_admin_save_taxonomy_restrict_content_nonce'] ) || ! wp_verify_nonce( $_REQUEST['um_admin_save_taxonomy_restrict_content_nonce'], basename( __FILE__ ) ) ) + return $termID; + + // validate user + $term = get_term( $termID ); + $taxonomy = get_taxonomy( $term->taxonomy ); + + if ( ! current_user_can( $taxonomy->cap->edit_terms, $termID ) ) + return $termID; + + if ( ! empty( $_REQUEST['um_content_restriction'] ) ) + update_term_meta( $termID, 'um_content_restriction', $_REQUEST['um_content_restriction'] ); + else + delete_term_meta( $termID, 'um_content_restriction' ); + + return $termID; + } + + + /*** + *** @load a directory metabox + ***/ + function load_metabox_directory( $object, $box ) { + $box['id'] = str_replace( 'um-admin-form-', '', $box['id'] ); + include_once UM()->admin()->templates_path . 'directory/'. $box['id'] . '.php'; + wp_nonce_field( basename( __FILE__ ), 'um_admin_save_metabox_directory_nonce' ); + } + + + /*** + *** @load a role metabox + ***/ + function load_metabox_role( $object, $box ) { + global $post; + + $box['id'] = str_replace( 'um-admin-form-', '', $box['id'] ); + + if ( $box['id'] == 'builder' ) { + UM()->builder()->form_id = get_the_ID(); + } + + preg_match('#\{.*?\}#s', $box['id'], $matches); + + if ( isset($matches[0]) ){ + $path = $matches[0]; + $box['id'] = preg_replace('~(\\{[^}]+\\})~','', $box['id'] ); + } else { + $path = um_path; + } + + $path = str_replace('{','', $path ); + $path = str_replace('}','', $path ); + + include_once $path . 'includes/admin/templates/role/'. $box['id'] . '.php'; + //wp_nonce_field( basename( __FILE__ ), 'um_admin_save_metabox_role_nonce' ); + } + + + /*** + *** @load a form metabox + ***/ + function load_metabox_form( $object, $box ) { + global $post; + + $box['id'] = str_replace( 'um-admin-form-','', $box['id'] ); + + if ( $box['id'] == 'builder' ) { + UM()->builder()->form_id = get_the_ID(); + } + + preg_match('#\{.*?\}#s', $box['id'], $matches); + + if ( isset( $matches[0] ) ) { + $path = $matches[0]; + $box['id'] = preg_replace('~(\\{[^}]+\\})~','', $box['id'] ); + } else { + $path = um_path; + } + + $path = str_replace('{','', $path ); + $path = str_replace('}','', $path ); + + include_once $path . 'includes/admin/templates/form/'. $box['id'] . '.php'; + + if ( ! $this->form_nonce_added ) { + $this->form_nonce_added = true; + wp_nonce_field( basename( __FILE__ ), 'um_admin_save_metabox_form_nonce' ); + } + } + + + /*** + *** @load a form metabox + ***/ + function load_metabox_custom( $object, $box ) { + global $post; + + $box['id'] = str_replace('um-admin-custom-','', $box['id']); + + preg_match('#\{.*?\}#s', $box['id'], $matches); + + if ( isset($matches[0]) ){ + $path = $matches[0]; + $box['id'] = preg_replace('~(\\{[^}]+\\})~','', $box['id'] ); + } else { + $path = um_path; + } + + $path = str_replace('{','', $path ); + $path = str_replace('}','', $path ); + + include_once $path . 'includes/admin/templates/'. $box['id'] . '.php'; + wp_nonce_field( basename( __FILE__ ), 'um_admin_save_metabox_custom_nonce' ); + } + + /*** + *** @add directory metabox + ***/ + function add_metabox_directory() { + + add_meta_box('um-admin-form-general', __('General Options'), array(&$this, 'load_metabox_directory'), 'um_directory', 'normal', 'default'); + add_meta_box('um-admin-form-profile', __('Profile Card'), array(&$this, 'load_metabox_directory'), 'um_directory', 'normal', 'default'); + add_meta_box('um-admin-form-search', __('Search Options'), array(&$this, 'load_metabox_directory'), 'um_directory', 'normal', 'default'); + add_meta_box('um-admin-form-pagination', __('Results & Pagination'), array(&$this, 'load_metabox_directory'), 'um_directory', 'normal', 'default'); + + add_meta_box('um-admin-form-shortcode', __('Shortcode'), array(&$this, 'load_metabox_directory'), 'um_directory', 'side', 'default'); + + add_meta_box('um-admin-form-appearance', __('Styling: General'), array(&$this, 'load_metabox_directory'), 'um_directory', 'side', 'default'); + + //add_meta_box('um-admin-form-profile_card', __('Styling: Profile Card'), array(&$this, 'load_metabox_directory'), 'um_directory', 'side', 'default'); + + } + + /*** + *** @add role metabox + ***/ + function add_metabox_role() { + add_meta_box( + 'um-admin-form-admin', + __( 'Administrative Permissions', 'ultimate-member' ), + array( &$this, 'load_metabox_role' ), + 'um_role_meta', + 'normal', + 'default' + ); + + add_meta_box( + 'um-admin-form-general', + __( 'General Permissions', 'ultimate-member' ), + array( &$this, 'load_metabox_role' ), + 'um_role_meta', + 'normal', + 'default' + ); + + add_meta_box( + 'um-admin-form-profile', + __( 'Profile Access', 'ultimate-member' ), + array( &$this, 'load_metabox_role' ), + 'um_role_meta', + 'normal', + 'default' + ); + + add_meta_box( + 'um-admin-form-home', + __( 'Homepage Options', 'ultimate-member' ), + array( &$this, 'load_metabox_role' ), + 'um_role_meta', + 'normal', + 'default' + ); + + add_meta_box( + 'um-admin-form-register', + __( 'Registration Options', 'ultimate-member' ), + array( &$this, 'load_metabox_role' ), + 'um_role_meta', + 'normal', + 'default' + ); + + add_meta_box( + 'um-admin-form-login', + __( 'Login Options', 'ultimate-member' ), + array( &$this, 'load_metabox_role' ), + 'um_role_meta', + 'normal', + 'default' + ); + + add_meta_box( + 'um-admin-form-logout', + __( 'Logout Options', 'ultimate-member' ), + array( &$this, 'load_metabox_role' ), + 'um_role_meta', + 'normal', + 'default' + ); + + add_meta_box( + 'um-admin-form-delete', + __( 'Delete Options', 'ultimate-member' ), + array( &$this, 'load_metabox_role' ), + 'um_role_meta', + 'normal', + 'default' + ); + + add_meta_box( + 'um-admin-form-publish', + __( 'Publish', 'ultimate-member' ), + array( &$this, 'load_metabox_role' ), + 'um_role_meta', + 'side', + 'default' + ); + + do_action( 'um_admin_custom_role_metaboxes' ); + + $wp_caps_metabox = false; + if ( ! empty( $_GET['id'] ) ) { + $data = get_option( "um_role_{$_GET['id']}_meta" ); + if ( ! empty( $data['_um_is_custom'] ) ) + $wp_caps_metabox = true; + } + + if ( 'add' == $_GET['tab'] || $wp_caps_metabox ) { + add_meta_box( + 'um-admin-form-wp-capabilities', + __( 'WP Capabilities', 'ultimate-member' ), + array( &$this, 'load_metabox_role' ), + 'um_role_meta', + 'normal', + 'default' + ); + } + } + + + /*** + *** @add form metabox + ***/ + function add_metabox_form() { + + add_meta_box( 'um-admin-form-mode', __( 'Select Form Type' ), array( &$this, 'load_metabox_form' ), 'um_form', 'normal', 'default' ); + add_meta_box( 'um-admin-form-builder', __( 'Form Builder' ), array( &$this, 'load_metabox_form' ), 'um_form', 'normal', 'default' ); + add_meta_box( 'um-admin-form-shortcode', __( 'Shortcode' ), array( &$this, 'load_metabox_form' ), 'um_form', 'side', 'default' ); + + add_meta_box('um-admin-form-register_customize', __( 'Customize this form' ), array(&$this, 'load_metabox_form'), 'um_form', 'side', 'default'); + + do_action( 'um_admin_custom_register_metaboxes' ); + + add_meta_box('um-admin-form-profile_customize', __('Customize this form'), array(&$this, 'load_metabox_form'), 'um_form', 'side', 'default'); + add_meta_box('um-admin-form-profile_settings', __('User Meta'), array(&$this, 'load_metabox_form'), 'um_form', 'side', 'default'); + + do_action( 'um_admin_custom_profile_metaboxes' ); + + add_meta_box('um-admin-form-login_customize', __('Customize this form'), array(&$this, 'load_metabox_form'), 'um_form', 'side', 'default'); + add_meta_box('um-admin-form-login_settings', __('Options'), array(&$this, 'load_metabox_form'), 'um_form', 'side', 'default'); + + do_action( 'um_admin_custom_login_metaboxes' ); + + } + + /*** + *** @save directory metabox + ***/ + function save_metabox_directory( $post_id, $post ) { + global $wpdb; + + // validate nonce + if ( !isset( $_POST['um_admin_save_metabox_directory_nonce'] ) || !wp_verify_nonce( $_POST['um_admin_save_metabox_directory_nonce'], basename( __FILE__ ) ) ) return $post_id; + + // validate post type + if ( $post->post_type != 'um_directory' ) return $post_id; + + // validate user + $post_type = get_post_type_object( $post->post_type ); + if ( !current_user_can( $post_type->cap->edit_post, $post_id ) ) return $post_id; + + $where = array( 'ID' => $post_id ); + + if ( empty( $_POST['post_title'] ) ) + $_POST['post_title'] = 'Directory #'.$post_id; + + $wpdb->update( $wpdb->posts, array( 'post_title' => $_POST['post_title'] ), $where ); + + // save + delete_post_meta( $post_id, '_um_roles' ); + delete_post_meta( $post_id, '_um_tagline_fields' ); + delete_post_meta( $post_id, '_um_reveal_fields' ); + delete_post_meta( $post_id, '_um_search_fields' ); + delete_post_meta( $post_id, '_um_roles_can_search' ); + delete_post_meta( $post_id, '_um_show_these_users' ); + + //save metadata + foreach ( $_POST['um_metadata'] as $k => $v ) { + if ( $k == '_um_show_these_users' && trim( $_POST['um_metadata'][ $k ] ) ) { + $v = preg_split( '/[\r\n]+/', $v, -1, PREG_SPLIT_NO_EMPTY ); + } + if ( strstr( $k, '_um_' ) ) { + update_post_meta( $post_id, $k, $v ); + } + } + + } + + /*** + *** @save role metabox + ***/ + /* function save_metabox_role( $post_id, $post ) { + global $wpdb; + + // validate nonce + if ( !isset( $_POST['um_admin_save_metabox_role_nonce'] ) || !wp_verify_nonce( $_POST['um_admin_save_metabox_role_nonce'], basename( __FILE__ ) ) ) return $post_id; + + // validate post type + if ( $post->post_type != 'um_role' ) return $post_id; + + // validate user + $post_type = get_post_type_object( $post->post_type ); + if ( !current_user_can( $post_type->cap->edit_post, $post_id ) ) return $post_id; + + $where = array( 'ID' => $post_id ); + if (empty($_POST['post_title'])) $_POST['post_title'] = 'Role #'.$post_id; + $wpdb->update( $wpdb->posts, array( 'post_title' => $_POST['post_title'], 'post_name' => sanitize_title( $_POST['post_title'] ) ), $where ); + + // save + delete_post_meta( $post_id, '_um_can_view_roles' ); + delete_post_meta( $post_id, '_um_can_edit_roles' ); + delete_post_meta( $post_id, '_um_can_delete_roles' ); + + do_action('um_admin_before_saving_role_meta', $post_id ); + + do_action('um_admin_before_save_role', $post_id, $post ); + + foreach( $_POST as $k => $v ) { + if (strstr($k, '_um_')){ + update_post_meta( $post_id, $k, $v); + } + } + + do_action('um_admin_after_editing_role', $post_id, $post); + + do_action('um_admin_after_save_role', $post_id, $post ); + + }*/ + + /*** + *** @save form metabox + ***/ + function save_metabox_form( $post_id, $post ) { + global $wpdb; + + // validate nonce + if ( !isset( $_POST['um_admin_save_metabox_form_nonce'] ) || !wp_verify_nonce( $_POST['um_admin_save_metabox_form_nonce'], basename( __FILE__ ) ) ) return $post_id; + + // validate post type + if ( $post->post_type != 'um_form' ) return $post_id; + + // validate user + $post_type = get_post_type_object( $post->post_type ); + if ( !current_user_can( $post_type->cap->edit_post, $post_id ) ) return $post_id; + + $where = array( 'ID' => $post_id ); + if ( empty( $_POST['post_title'] ) ) $_POST['post_title'] = 'Form #' . $post_id; + $wpdb->update( $wpdb->posts, array( 'post_title' => $_POST['post_title'] ), $where ); + + // save + delete_post_meta( $post_id, '_um_profile_metafields' ); + foreach ( $_POST['form'] as $k => $v ) { + if ( strstr( $k, '_um_' ) ){ + update_post_meta( $post_id, $k, $v); + } + } + + } + + /*** + *** @Load modal content + ***/ + function load_modal_content() { + + $screen = get_current_screen(); + if ( $this->is_UM_admin() ) { + foreach ( glob( um_path . 'includes/admin/templates/modal/*.php' ) as $modal_content ) { + include_once $modal_content; + } + } + + // needed on forms only + if ( !isset( $this->is_loaded ) && isset( $screen->id ) && strstr( $screen->id, 'um_form' ) ) { + + $settings['textarea_rows'] = 8; + + echo ''; + + echo ''; + + } + + } + + /*** + *** @Show field input for edit + ***/ + function field_input( $attribute, $form_id = null, $field_args = array() ) { + + if ( $this->in_edit == true ) { // we're editing a field + $real_attr = substr( $attribute, 1 ); + $this->edit_mode_value = (isset( $this->edit_array[ $real_attr ] ) ) ? $this->edit_array[ $real_attr ] : null; + } + + switch ( $attribute ) { + + default: + + do_action( "um_admin_field_edit_hook{$attribute}", $this->edit_mode_value ); + + break; + + case '_visibility': + ?> + +

            + +

            + + + +

            + + +    +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + set_field_type == 'row' ) { + $back = 'UM_edit_row'; + + ?> + +

            + + Choose Icon + + edit_mode_value ) { ?>No Icon + + + + edit_mode_value ) { ?> + + + + + +

            + + in_edit ) { + $back = 'UM_edit_field'; + } else { + $back = 'UM_add_field'; + } + + ?> + +
            + +

            + + Choose Icon + + edit_mode_value ) { ?>No Icon + + + + edit_mode_value ) { ?> + + + + + +

            + +
            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + edit_mode_value ) ? $this->edit_mode_value : 0 ) ?> class="um-adm-conditional" data-cond1="1" data-cond1-show="_heading_text" data-cond1-hide="xxx" /> +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + edit_mode_value ) ? $this->edit_mode_value : 0 ) ?> /> +

            + + + +

            + edit_mode_value ) ? $this->edit_mode_value : 0 ) ?> /> +

            + + + +

            + +

            + + + +

            + +

            + + set_field_type == 'date' ) { + ?> + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + edit_mode_value ) && is_array( $this->edit_mode_value ) ) { + $values = $this->edit_mode_value; + } else { + $values = array(''); + } + ?> + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + set_field_type == 'shortcode' ) { + + ?> + +

            + +

            + + + +
            + +
            + + + +

            + +

            + + set_field_type == 'image' ) { + + if ( isset( $this->edit_mode_value ) && is_array( $this->edit_mode_value ) ) { + $values = $this->edit_mode_value; + } else { + $values = array('png','jpeg','jpg','gif'); + } + ?> + +

            + +

            + + edit_mode_value ) && is_array( $this->edit_mode_value ) ) { + $values = $this->edit_mode_value; + } else { + $values = array('pdf','txt'); + } + + ?> + +

            + +

            + + set_field_type == 'image' ) $value = 'Drag & Drop Photo'; + if ( $this->set_field_type == 'file' ) $value = 'Drag & Drop File'; + + ?> + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + edit_mode_value ) ? $this->edit_mode_value : 0 ) ?> class="um-adm-conditional" data-cond1="1" data-cond1-show="_max_selections" data-cond1-hide="xxx" /> +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + +

            + edit_mode_value ) ? $this->edit_mode_value : 0 ) ?> /> +

            + + edit_mode_value ) && is_array( $this->edit_mode_value ) ) { + $values = implode("\n", $this->edit_mode_value); + } else if ( $this->edit_mode_value ) { + $values = $this->edit_mode_value; + } else { + $values = ''; + } + + ?> + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + in_edit ) { + + ?> + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + + + set_field_type == 'textarea' ) { ?> + +

            + +

            + + set_field_type == 'rating' ) { ?> + +

            + +

            + + + +

            + +

            + + + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + edit_mode_value ) && is_array( $this->edit_mode_value ) ) { + $values = $this->edit_mode_value; + } else { + $values = array(''); + } + + ?> + +

            + +

            + + set_field_type == 'password' ) + $def_required = 1; + else + $def_required = 0; + + ?> + +
            + +

            + edit_mode_value ) ? $this->edit_mode_value : $def_required ) ?> /> +

            + +
            + + + +
            + +

            + edit_mode_value ) ? $this->edit_mode_value : 0 ) ?> /> +

            + +
            + + + +

            + +

            + + + +

            + +

            + + + +

            + +

            + + files()->upload_basedir; + $path = str_replace('/uploads/ultimatemember','',$path); + $path = $path . '/languages/plugins/'; + $path = str_replace('//','/',$path); + + if ( !file_exists( $path ) ) { + $old = umask(0); + @mkdir( $path, 0777, true); + umask($old); + } + + } + + /*** + *** @show main notices + ***/ + function main_notices() { + + if ( ! defined( 'DOING_AJAX' ) ) { + + $hide_exif_notice = get_option( 'um_hide_exif_notice' ); + + if ( !extension_loaded('exif') && !$hide_exif_notice ) { + + echo '

            '; + + echo sprintf(__( 'Exif is not enabled on your server. Mobile photo uploads will not be rotated correctly until you enable the exif extension. Hide this notice', 'ultimate-member' ), add_query_arg('um_adm_action', 'um_hide_exif_notice') ); + + echo '

            '; + + } + + // Regarding page setup + $pages = UM()->config()->permalinks; + if ( $pages && is_array( $pages ) ) { + + $err = false; + + foreach( $pages as $slug => $page_id ) { + + $page = get_post( $page_id ); + + if ( !isset( $page->ID ) && in_array( $slug, array( 'user','account','members','register','login','logout','password-reset' ) ) ) { + $err = true; + } + + } + + if ( $err ) { + echo '

            ' . __('One or more of your Ultimate Member pages are not correctly setup. Please visit Ultimate Member > Settings to re-assign your missing pages.','ultimate-member') . '

            '; + } + + if ( isset( $pages['user'] ) ) { + $test = get_post( $pages['user'] ); + if ( isset( $test->post_parent ) && $test->post_parent > 0 ) { + echo '

            ' . __('Ultimate Member Setup Error: User page can not be a child page.','ultimate-member') . '

            '; + } + } + + if ( isset( $pages['account'] ) ) { + $test = get_post( $pages['account'] ); + if ( isset( $test->post_parent ) && $test->post_parent > 0 ) { + echo '

            ' . __('Ultimate Member Setup Error: Account page can not be a child page.','ultimate-member') . '

            '; + } + } + + } + + do_action('um_admin_after_main_notices'); + } + + } + + + /*** + *** @localization notice + ***/ + function localize_note() { + $locale = get_option('WPLANG'); + if ( !$locale ) return; + if ( strstr( $locale, 'en_' ) ) return; // really, english! + if ( file_exists( WP_LANG_DIR . '/plugins/ultimatemember-' . $locale . '.mo' ) ) return; + + if ( isset( UM()->available_languages[ $locale ] ) ) { + + $download_uri = add_query_arg('um_adm_action', 'um_language_downloader'); + + $hide_locale_notice = get_option('um_hide_locale_notice'); + if ( !$hide_locale_notice ) { + echo '

            '; + + echo sprintf(__('Your site language is %1$s. Good news! Ultimate Member is already available in %2$s language. Download the translation files and start using the plugin in your language now. Hide this notice','ultimate-member'), $locale, UM()->available_languages[$locale], $download_uri, add_query_arg('um_adm_action', 'um_hide_locale_notice') ); + + echo '

            '; + } + + + } else { + + $hide_locale_notice = get_option('um_hide_locale_notice'); + if ( !$hide_locale_notice ) { + + echo '

            '; + + echo sprintf(__('Ultimate Member has not yet been translated to your langeuage: %1$s. If you have translated the plugin you need put these files ultimatemember-%1$s.po and ultimatemember-%1$s.mo in /wp-content/languages/plugins/ for the plugin to be translated in your language. Hide this notice','ultimate-member'), $locale, add_query_arg('um_adm_action', 'um_hide_locale_notice') ); + + echo '

            '; + + } + + } + + } + + /*** + *** @updating users + ***/ + function show_update_messages(){ + + if ( !isset($_REQUEST['update']) ) return; + + $update = $_REQUEST['update']; + switch($update) { + + case 'confirm_delete': + $confirm_uri = admin_url('users.php?' . http_build_query(array( + 'um_adm_action' => 'delete_users', + 'user' => array_map('intval', (array) $_REQUEST['user']), + 'confirm' => 1 + ))); + $users = ''; + + if( isset( $_REQUEST['user'] ) ){ + foreach( $_REQUEST['user'] as $user_id ) { + $user = get_userdata( $user_id ); + $users .= '#' . $user_id . ': ' . $user->user_login . '
            '; + } + } + + $ignore = admin_url('users.php'); + + $messages[0]['err_content'] = sprintf(__('Are you sure you want to delete the selected user(s)? The following users will be deleted:

            %s

            This cannot be undone!','ultimate-member'), $users); + $messages[0]['err_content'] .= '

            ' . __('Remove','ultimate-member') . '  ' . __('Undo','ultimate-member') . '

            '; + + break; + + case 'language_updated': + $messages[0]['content'] = __('Your translation files have been updated successfully.','ultimate-member'); + break; + + case 'purged_temp': + $messages[0]['content'] = __('Your temp uploads directory is now clean.','ultimate-member'); + break; + + case 'cleared_cache': + $messages[0]['content'] = __('Your user cache is now removed.','ultimate-member'); + break; + + case 'form_duplicated': + $messages[0]['content'] = __('The form has been duplicated successfully.','ultimate-member'); + break; + + case 'user_updated': + $messages[0]['content'] = __('User has been updated.','ultimate-member'); + break; + + case 'users_updated': + $messages[0]['content'] = __('Users have been updated.','ultimate-member'); + break; + + case 'users_role_updated': + $messages[0]['content'] = __('Changed roles.','ultimate-member'); + break; + + case 'err_users_updated': + $messages[0]['err_content'] = __('Super administrators cannot be modified.','ultimate-member'); + $messages[1]['content'] = __('Other users have been updated.','ultimate-member'); + + } + + if ( !empty( $messages ) ) { + foreach( $messages as $message ) { + if ( isset($message['err_content'])) { + echo '

            ' . $message['err_content'] . '

            '; + } else { + echo '

            ' . $message['content'] . '

            '; + } + } + } + + } + + } +} \ No newline at end of file diff --git a/includes/admin/core/class-admin-settings.php b/includes/admin/core/class-admin-settings.php new file mode 100644 index 00000000..1834705e --- /dev/null +++ b/includes/admin/core/class-admin-settings.php @@ -0,0 +1,1963 @@ + 'pages_settings', + 'type' => 'hidden', + 'default' => true, + 'is_option' => false + ) + ); + + $core_pages = UM()->config()->core_pages; + + foreach ( $core_pages as $page_s => $page ) { + $have_pages = UM()->query()->wp_pages(); + $page_id = apply_filters( 'um_core_page_id_filter', 'core_' . $page_s ); + + $page_title = ! empty( $page['title'] ) ? $page['title'] : ''; + + if ( 'reached_maximum_limit' == $have_pages ) { + $general_pages_fields[] = array( + 'id' => $page_id, + 'type' => 'text', + 'label' => sprintf( __( '%s page', 'ultimate-member' ), $page_title ), + 'placeholder' => __('Add page ID','ultimate-member'), + 'compiler' => true, + 'value' => UM()->um_get_option( $page_id ), + 'default' => UM()->um_get_default( $page_id ), + 'size' => 'small' + ); + } else { + $general_pages_fields[] = array( + 'id' => $page_id, + 'type' => 'select', + 'label' => sprintf( __( '%s page', 'ultimate-member' ), $page_title ), + 'options' => UM()->query()->wp_pages(), + 'placeholder' => __('Choose a page...','ultimate-member'), + 'compiler' => true, + 'value' => UM()->um_get_option( $page_id ), + 'default' => UM()->um_get_default( $page_id ), + 'size' => 'small' + ); + } + } + + + + $appearances_profile_menu_fields = array( + array( + 'id' => 'profile_menu', + 'type' => 'checkbox', + 'label' => __('Enable profile menu','ultimate-member'), + 'value' => UM()->um_get_option( 'profile_menu' ), + 'default' => UM()->um_get_default( 'profile_menu' ), + ) + ); + + $tabs = UM()->profile()->tabs_primary(); + foreach( $tabs as $id => $tab ) { + $appearances_profile_menu_fields = array_merge( $appearances_profile_menu_fields, array( + array( + 'id' => 'profile_tab_' . $id, + 'type' => 'checkbox', + 'label' => sprintf(__('%s Tab','ultimate-member'), $tab ), + 'conditional' => array( 'profile_menu', '=', 1 ), + 'value' => UM()->um_get_option( 'profile_tab_' . $id ), + 'default' => UM()->um_get_default( 'profile_tab_' . $id ), + ), + array( + 'id' => 'profile_tab_' . $id . '_privacy', + 'type' => 'select', + 'label' => sprintf( __( 'Who can see %s Tab?','ultimate-member' ), $tab ), + 'tooltip' => __( 'Select which users can view this tab.','ultimate-member' ), + 'options' => UM()->profile()->tabs_privacy(), + 'conditional' => array( 'profile_tab_' . $id, '=', 1 ), + 'value' => UM()->um_get_option( 'profile_tab_' . $id . '_privacy' ), + 'default' => UM()->um_get_default( 'profile_tab_' . $id . '_privacy' ), + 'size' => 'small' + ), + array( + 'id' => 'profile_tab_' . $id . '_roles', + 'type' => 'select', + 'multi' => true, + 'label' => __( 'Allowed roles','ultimate-member' ), + 'tooltip' => __( 'Select the the user roles allowed to view this tab.','ultimate-member' ), + 'options' => UM()->roles()->get_roles(), + 'placeholder' => __( 'Choose user roles...','ultimate-member' ), + 'conditional' => array( 'profile_tab_' . $id . '_privacy', '=', 4 ), + 'value' => ! empty( UM()->um_get_option( 'profile_tab_' . $id . '_roles' ) ) ? UM()->um_get_option( 'profile_tab_' . $id . '_roles' ) : array(), + 'default' => UM()->um_get_default( 'profile_tab_' . $id . '_roles' ), + 'size' => 'small' + ) + ) ); + } + + $appearances_profile_menu_fields = array_merge( $appearances_profile_menu_fields, array( + array( + 'id' => 'profile_menu_default_tab', + 'type' => 'select', + 'label' => __( 'Profile menu default tab','ultimate-member' ), + 'tooltip' => __( 'This will be the default tab on user profile page','ultimate-member' ), + 'options' => UM()->profile()->tabs_enabled(), + 'conditional' => array( 'profile_menu', '=', 1 ), + 'value' => UM()->um_get_option( 'profile_menu_default_tab' ), + 'default' => UM()->um_get_default( 'profile_menu_default_tab' ), + 'size' => 'small' + ), + array( + 'id' => 'profile_menu_icons', + 'type' => 'checkbox', + 'label' => __('Enable menu icons in desktop view','ultimate-member'), + 'conditional' => array( 'profile_menu', '=', 1 ), + 'value' => UM()->um_get_option( 'profile_menu_icons' ), + 'default' => UM()->um_get_default( 'profile_menu_icons' ), + ) + ) ); + + + $all_post_types = get_post_types( array( 'public' => true ) ); + + $all_taxonomies = get_taxonomies( array( 'public' => true ) ); + $exclude_taxonomies = array( + 'nav_menu', + 'link_category', + 'post_format', + 'um_user_tag', + 'um_hashtag', + ); + + foreach ( $all_taxonomies as $key => $taxonomy ) { + if( in_array( $key , $exclude_taxonomies ) ) + unset( $all_taxonomies[$key] ); + } + + $restricted_access_post_metabox_value = array(); + if ( $restricted_access_post_metabox = UM()->um_get_option( 'restricted_access_post_metabox' ) ) { + foreach ( $restricted_access_post_metabox as $key => $value ) { + if ( $value ) + $restricted_access_post_metabox_value[] = $key; + } + } + + + $restricted_access_taxonomy_metabox_value = array(); + if ( $restricted_access_taxonomy_metabox = UM()->um_get_option( 'restricted_access_taxonomy_metabox' ) ) { + foreach ( $restricted_access_taxonomy_metabox as $key => $value ) { + if ( $value ) + $restricted_access_taxonomy_metabox_value[] = $key; + } + } + + $this->settings_structure = apply_filters( 'um_settings_structure', array( + '' => array( + 'title' => __( 'General', 'ultimate-member' ), + 'sections' => array( + '' => array( + 'title' => __( 'Pages', 'ultimate-member' ), + 'fields' => $general_pages_fields + ), + 'users' => array( + 'title' => __( 'Users', 'ultimate-member' ), + 'fields' => array( + array( + 'id' => 'permalink_base', + 'type' => 'select', + 'size' => 'small', + 'label' => __( 'Profile Permalink Base','ultimate-member' ), + 'tooltip' => __( 'Here you can control the permalink structure of the user profile URL globally e.g. ' . trailingslashit( um_get_core_page('user') ) . 'username/','ultimate-member' ), + 'options' => array( + 'user_login' => __('Username','ultimate-member'), + 'name' => __('First and Last Name with \'.\'','ultimate-member'), + 'name_dash' => __('First and Last Name with \'-\'','ultimate-member'), + 'name_plus' => __('First and Last Name with \'+\'','ultimate-member'), + 'user_id' => __('User ID','ultimate-member'), + ), + 'placeholder' => __('Select...','ultimate-member'), + 'value' => UM()->um_get_option( 'permalink_base' ), + 'default' => UM()->um_get_default( 'permalink_base' ), + ), + array( + 'id' => 'display_name', + 'type' => 'select', + 'size' => 'medium', + 'label' => __( 'User Display Name','ultimate-member' ), + 'tooltip' => __( 'This is the name that will be displayed for users on the front end of your site. Default setting uses first/last name as display name if it exists','ultimate-member' ), + 'options' => array( + 'default' => __('Default WP Display Name','ultimate-member'), + 'nickname' => __('Nickname','ultimate-member'), + 'username' => __('Username','ultimate-member'), + 'full_name' => __('First name & last name','ultimate-member'), + 'sur_name' => __('Last name & first name','ultimate-member'), + 'initial_name' => __('First name & first initial of last name','ultimate-member'), + 'initial_name_f' => __('First initial of first name & last name','ultimate-member'), + 'first_name' => __('First name only','ultimate-member'), + 'field' => __('Custom field(s)','ultimate-member'), + ), + 'placeholder' => __('Select...'), + 'value' => UM()->um_get_option( 'display_name' ), + 'default' => UM()->um_get_default( 'display_name' ), + ), + array( + 'id' => 'display_name_field', + 'type' => 'text', + 'label' => __( 'Display Name Custom Field(s)','ultimate-member' ), + 'tooltip' => __('Specify the custom field meta key or custom fields seperated by comma that you want to use to display users name on the frontend of your site','ultimate-member'), + 'conditional' => array( 'display_name', '=', 'field' ), + 'value' => UM()->um_get_option( 'display_name_field' ), + 'default' => UM()->um_get_default( 'display_name_field' ), + ), + array( + 'id' => 'author_redirect', + 'type' => 'checkbox', + 'label' => __( 'Automatically redirect author page to their profile?','ultimate-member'), + 'tooltip' => __('If enabled, author pages will automatically redirect to the user\'s profile page','ultimate-member'), + 'value' => UM()->um_get_option( 'author_redirect' ), + 'default' => UM()->um_get_default( 'author_redirect' ), + ), + array( + 'id' => 'members_page', + 'type' => 'checkbox', + 'label' => __( 'Enable Members Directory','ultimate-member' ), + 'tooltip' => __('Control whether to enable or disable member directories on this site','ultimate-member'), + 'value' => UM()->um_get_option( 'members_page' ), + 'default' => UM()->um_get_default( 'members_page' ), + ), + array( + 'id' => 'use_gravatars', + 'type' => 'checkbox', + 'label' => __( 'Use Gravatars?','ultimate-member' ), + 'tooltip' => __('Do you want to use gravatars instead of the default plugin profile photo (If the user did not upload a custom profile photo / avatar)','ultimate-member'), + 'value' => UM()->um_get_option( 'use_gravatars' ), + 'default' => UM()->um_get_default( 'use_gravatars' ), + ), + array( + 'id' => 'use_um_gravatar_default_builtin_image', + 'type' => 'select', + 'label' => __( 'Use Gravatar builtin image','ultimate-member' ), + 'tooltip' => __( 'Gravatar has a number of built in options which you can also use as defaults','ultimate-member' ), + 'options' => array( + 'default' => __('Default','ultimate-member'), + '404' => __('404 ( File Not Found response )','ultimate-member'), + 'mm' => __('Mystery Man','ultimate-member'), + 'identicon' => __('Identicon','ultimate-member'), + 'monsterid' => __('Monsterid','ultimate-member'), + 'wavatar' => __('Wavatar','ultimate-member'), + 'retro' => __('Retro','ultimate-member'), + 'blank' => __('Blank ( a transparent PNG image )','ultimate-member'), + ), + 'conditional' => array( 'use_gravatars', '=', 1 ), + 'value' => UM()->um_get_option( 'use_um_gravatar_default_builtin_image' ), + 'default' => UM()->um_get_default( 'use_um_gravatar_default_builtin_image' ), + 'size' => 'medium' + ), + array( + 'id' => 'use_um_gravatar_default_image', + 'type' => 'checkbox', + 'label' => __( 'Use Default plugin avatar as Gravatar\'s Default avatar','ultimate-member' ), + 'tooltip' => __('Do you want to use the plugin default avatar instead of the gravatar default photo (If the user did not upload a custom profile photo / avatar)','ultimate-member'), + 'conditional' => array( 'use_um_gravatar_default_builtin_image', '=', 'default' ), + 'value' => UM()->um_get_option( 'use_um_gravatar_default_image' ), + 'default' => UM()->um_get_default( 'use_um_gravatar_default_image' ), + ), + array( + 'id' => 'reset_require_strongpass', + 'type' => 'checkbox', + 'label' => __( 'Require a strong password? (when user resets password only)','ultimate-member' ), + 'tooltip' => __('Enable or disable a strong password rules on password reset and change procedure','ultimate-member'), + 'value' => UM()->um_get_option( 'reset_require_strongpass' ), + 'default' => UM()->um_get_default( 'reset_require_strongpass' ), + ) + ) + ), + 'account' => array( + 'title' => __( 'Account', 'ultimate-member' ), + 'fields' => array( + array( + 'id' => 'account_tab_password', + 'type' => 'checkbox', + 'label' => __( 'Password Account Tab','ultimate-member' ), + 'tooltip' => 'Enable/disable the Password account tab in account page', + 'value' => UM()->um_get_option( 'account_tab_password' ), + 'default' => UM()->um_get_default( 'account_tab_password' ), + ), + array( + 'id' => 'account_tab_privacy', + 'type' => 'checkbox', + 'label' => __( 'Privacy Account Tab','ultimate-member' ), + 'tooltip' => __('Enable/disable the Privacy account tab in account page','ultimate-member'), + 'value' => UM()->um_get_option( 'account_tab_privacy' ), + 'default' => UM()->um_get_default( 'account_tab_privacy' ), + ), + array( + 'id' => 'account_tab_notifications', + 'type' => 'checkbox', + 'label' => __( 'Notifications Account Tab','ultimate-member' ), + 'tooltip' => __('Enable/disable the Notifications account tab in account page','ultimate-member'), + 'value' => UM()->um_get_option( 'account_tab_notifications' ), + 'default' => UM()->um_get_default( 'account_tab_notifications' ), + ), + array( + 'id' => 'account_tab_delete', + 'type' => 'checkbox', + 'label' => __( 'Delete Account Tab','ultimate-member' ), + 'tooltip' => __('Enable/disable the Delete account tab in account page','ultimate-member'), + 'value' => UM()->um_get_option( 'account_tab_delete' ), + 'default' => UM()->um_get_default( 'account_tab_delete' ), + ), + array( + 'id' => 'delete_account_text', + 'type' => 'textarea', // bug with wp 4.4? should be editor + 'label' => __( 'Account Deletion Custom Text','ultimate-member' ), + 'tooltip' => __('This is custom text that will be displayed to users before they delete their accounts from your site','ultimate-member'), + 'args' => array( + 'textarea_rows' => 6 + ), + 'value' => UM()->um_get_option( 'delete_account_text' ), + 'default' => UM()->um_get_default( 'delete_account_text' ), + ), + array( + 'id' => 'account_name', + 'type' => 'checkbox', + 'label' => __( 'Add a First & Last Name fields','ultimate-member' ), + 'tooltip' => __('Whether to enable these fields on the user account page by default or hide them.','ultimate-member'), + 'value' => UM()->um_get_option( 'account_name' ), + 'default' => UM()->um_get_default( 'account_name' ), + ), + array( + 'id' => 'account_name_disable', + 'type' => 'checkbox', + 'label' => __( 'Disable First & Last Name fields','ultimate-member' ), + 'tooltip' => __('Whether to allow users changing their first and last name in account page.','ultimate-member'), + 'conditional' => array( 'account_name', '=', '1' ), + 'value' => UM()->um_get_option( 'account_name_disable' ), + 'default' => UM()->um_get_default( 'account_name_disable' ), + ), + array( + 'id' => 'account_name_require', + 'type' => 'checkbox', + 'label' => __( 'Require First & Last Name','ultimate-member' ), + 'tooltip' => __('Require first and last name?','ultimate-member'), + 'conditional' => array( 'account_name', '=', '1' ), + 'value' => UM()->um_get_option( 'account_name_require' ), + 'default' => UM()->um_get_default( 'account_name_require' ), + ), + array( + 'id' => 'account_email', + 'type' => 'checkbox', + 'label' => __( 'Allow users to change e-mail','ultimate-member' ), + 'tooltip' => __('Whether to allow users changing their email in account page.','ultimate-member'), + 'value' => UM()->um_get_option( 'account_email' ), + 'default' => UM()->um_get_default( 'account_email' ), + ), + array( + 'id' => 'account_hide_in_directory', + 'type' => 'checkbox', + 'label' => __( 'Allow users to hide their profiles from directory','ultimate-member' ), + 'tooltip' => __('Whether to allow users changing their profile visibility from member directory in account page.','ultimate-member'), + 'value' => UM()->um_get_option( 'account_hide_in_directory' ), + 'default' => UM()->um_get_default( 'account_hide_in_directory' ), + ), + array( + 'id' => 'account_require_strongpass', + 'type' => 'checkbox', + 'label' => __( 'Require a strong password?','ultimate-member' ), + 'tooltip' => __('Enable or disable a strong password rules on account page / change password tab','ultimate-member'), + 'value' => UM()->um_get_option( 'account_require_strongpass' ), + 'default' => UM()->um_get_default( 'account_require_strongpass' ), + ) + ) + ), + 'uploads' => array( + 'title' => __( 'Uploads', 'ultimate-member' ), + 'fields' => array( + array( + 'id' => 'photo_thumb_sizes', + 'type' => 'multi_text', + 'size' => 'small', + 'label' => __( 'Profile Photo Thumbnail Sizes (px)','ultimate-member' ), + 'tooltip' => __( 'Here you can define which thumbnail sizes will be created for each profile photo upload.','ultimate-member' ), + 'validate' => 'numeric', + 'add_text' => __('Add New Size','ultimate-member'), + 'show_default_number' => 1, + 'value' => UM()->um_get_option( 'photo_thumb_sizes' ), + 'default' => UM()->um_get_default( 'photo_thumb_sizes' ), + ), + array( + 'id' => 'cover_thumb_sizes', + 'type' => 'multi_text', + 'size' => 'small', + 'label' => __( 'Cover Photo Thumbnail Sizes (px)','ultimate-member' ), + 'tooltip' => __( 'Here you can define which thumbnail sizes will be created for each cover photo upload.','ultimate-member' ), + 'validate' => 'numeric', + 'add_text' => __('Add New Size','ultimate-member'), + 'show_default_number' => 1, + 'value' => UM()->um_get_option( 'cover_thumb_sizes' ), + 'default' => UM()->um_get_default( 'cover_thumb_sizes' ), + ) + ) + ) + ) + ), + 'access' => array( + 'title' => __( 'Access', 'ultimate-member' ), + 'sections' => array( + '' => array( + 'title' => __( 'Restriction Content', 'ultimate-member' ), + 'fields' => array( + array( + 'id' => 'accessible', + 'type' => 'select', + 'label' => __( 'Global Site Access','ultimate-member' ), + 'tooltip' => __('Globally control the access of your site, you can have seperate restrict options per post/page by editing the desired item.','ultimate-member'), + 'options' => array( + 0 => 'Site accessible to Everyone', + 2 => 'Site accessible to Logged In Users' + ), + 'value' => UM()->um_get_option( 'accessible' ), + 'default' => UM()->um_get_default( 'accessible' ), + 'size' => 'medium' + ), + array( + 'id' => 'access_redirect', + 'type' => 'text', + 'label' => __( 'Custom Redirect URL','ultimate-member' ), + 'tooltip' => __('A logged out user will be redirected to this url If he is not permitted to access the site','ultimate-member'), + 'conditional' => array( 'accessible', '=', 2 ), + 'value' => UM()->um_get_option( 'access_redirect' ), + 'default' => UM()->um_get_default( 'access_redirect' ), + ), + array( + 'id' => 'access_exclude_uris', + 'type' => 'multi_text', + 'label' => __( 'Exclude the following URLs','ultimate-member' ), + 'tooltip' => __( 'Here you can exclude URLs beside the redirect URI to be accessible to everyone','ultimate-member' ), + 'add_text' => __('Add New URL','ultimate-member'), + 'conditional' => array( 'accessible', '=', 2 ), + 'show_default_number' => 1, + 'value' => UM()->um_get_option( 'access_exclude_uris' ), + 'default' => UM()->um_get_default( 'access_exclude_uris' ), + ), + array( + 'id' => 'home_page_accessible', + 'type' => 'checkbox', + 'label' => __( 'Allow Homepage to be accessible','ultimate-member' ), + 'conditional' => array( 'accessible', '=', 2 ), + 'value' => UM()->um_get_option( 'home_page_accessible' ), + 'default' => UM()->um_get_default( 'home_page_accessible' ), + ), + array( + 'id' => 'category_page_accessible', + 'type' => 'checkbox', + 'label' => __( 'Allow Category pages to be accessible','ultimate-member' ), + 'conditional' => array( 'accessible', '=', 2 ), + 'value' => UM()->um_get_option( 'category_page_accessible' ), + 'default' => UM()->um_get_default( 'category_page_accessible' ), + ), + array( + 'id' => 'restricted_access_message', + 'type' => 'wp_editor', + 'label' => __( 'Restricted Access Message','ultimate-member' ), + 'tooltip' => __( 'This is the message shown to users that do not have permission to view the content','ultimate-member' ), + 'value' => UM()->um_get_option( 'restricted_access_message' ), + 'default' => UM()->um_get_default( 'restricted_access_message' ), + ), + array( + 'id' => 'restricted_access_post_metabox', + 'type' => 'multi_checkbox', + 'label' => __( 'Restricted Access to Posts','ultimate-member' ), + 'tooltip' => __( 'Restriction content of the current Posts','ultimate-member' ), + 'options' => $all_post_types, + 'columns' => 3, + 'value' => $restricted_access_post_metabox_value, + 'default' => UM()->um_get_default( 'restricted_access_post_metabox' ), + ), + array( + 'id' => 'restricted_access_taxonomy_metabox', + 'type' => 'multi_checkbox', + 'label' => __( 'Restricted Access to Taxonomies','ultimate-member' ), + 'tooltip' => __( 'Restriction content of the current Taxonomies','ultimate-member' ), + 'options' => $all_taxonomies, + 'columns' => 3, + 'value' => $restricted_access_taxonomy_metabox_value, + 'default' => UM()->um_get_default( 'restricted_access_taxonomy_metabox' ), + ), + ) + ), + 'other' => array( + 'title' => __( 'Other', 'ultimate-member' ), + 'fields' => array( + array( + 'id' => 'enable_reset_password_limit', + 'type' => 'checkbox', + 'label' => __( 'Enable the Reset Password Limit?','ultimate-member' ), + 'value' => UM()->um_get_option( 'enable_reset_password_limit' ), + 'default' => UM()->um_get_default( 'enable_reset_password_limit' ), + ), + array( + 'id' => 'reset_password_limit_number', + 'type' => 'text', + 'label' => __( 'Reset Password Limit','ultimate-member' ), + 'tooltip' => __('Set the maximum reset password limit. If reached the maximum limit, user will be locked from using this.','ultimate-member'), + 'validate' => 'numeric', + 'conditional' => array('enable_reset_password_limit','=',1), + 'size' => 'um-small-field', + 'value' => UM()->um_get_option( 'reset_password_limit_number' ), + 'default' => UM()->um_get_default( 'reset_password_limit_number' ), + ), + array( + 'id' => 'blocked_emails', + 'type' => 'textarea', + 'label' => __( 'Blocked Email Addresses','ultimate-member' ), + 'tooltip' => __('This will block the specified e-mail addresses from being able to sign up or sign in to your site. To block an entire domain, use something like *@domain.com','ultimate-member'), + 'value' => UM()->um_get_option( 'blocked_emails' ), + 'default' => UM()->um_get_default( 'blocked_emails' ), + ), + array( + 'id' => 'blocked_words', + 'type' => 'textarea', + 'label' => __( 'Blacklist Words','ultimate-member' ), + 'tooltip' => __('This option lets you specify blacklist of words to prevent anyone from signing up with such a word as their username','ultimate-member'), + 'value' => UM()->um_get_option( 'blocked_words' ), + 'default' => UM()->um_get_default( 'blocked_words' ), + ) + ) + ), + ) + ), + 'email' => array( + 'title' => __( 'Email', 'ultimate-member' ), + 'fields' => array( + array( + 'id' => 'admin_email', + 'type' => 'text', + 'label' => __( 'Admin E-mail Address', 'ultimate-member' ), + 'tooltip' => __( 'e.g. admin@companyname.com','ultimate-member' ), + 'value' => UM()->um_get_option( 'admin_email' ), + 'default' => UM()->um_get_default( 'admin_email' ), + ), + array( + 'id' => 'mail_from', + 'type' => 'text', + 'label' => __( 'Mail appears from','ultimate-member' ), + 'tooltip' => __( 'e.g. Site Name','ultimate-member' ), + 'value' => UM()->um_get_option( 'mail_from' ), + 'default' => UM()->um_get_default( 'mail_from' ), + ), + array( + 'id' => 'mail_from_addr', + 'type' => 'text', + 'label' => __( 'Mail appears from address','ultimate-member' ), + 'tooltip' => __( 'e.g. admin@companyname.com','ultimate-member' ), + 'value' => UM()->um_get_option( 'mail_from_addr' ), + 'default' => UM()->um_get_default( 'mail_from_addr' ), + ), + array( + 'id' => 'email_html', + 'type' => 'checkbox', + 'label' => __( 'Use HTML for E-mails?','ultimate-member' ), + 'tooltip' => __('If you enable HTML for e-mails, you can customize the HTML e-mail templates found in templates/email folder.','ultimate-member'), + 'value' => UM()->um_get_option( 'email_html' ), + 'default' => UM()->um_get_default( 'email_html' ), + ) + ) + ), + 'appearance' => array( + 'title' => __( 'Appearance', 'ultimate-member' ), + 'sections' => array( + '' => array( + 'title' => __( 'Profile', 'ultimate-member' ), + 'fields' => array( + array( + 'id' => 'profile_template', + 'type' => 'select', + 'label' => __( 'Profile Default Template','ultimate-member' ), + 'tooltip' => __( 'This will be the default template to output profile','ultimate-member' ), + 'default' => um_get_metadefault('profile_template'), + 'options' => UM()->shortcodes()->get_templates( 'profile' ), + 'value' => UM()->um_get_option( 'profile_template' ), + 'size' => 'small' + ), + array( + 'id' => 'profile_max_width', + 'type' => 'text', + 'label' => __( 'Profile Maximum Width','ultimate-member' ), + 'default' => um_get_metadefault('profile_max_width'), + 'tooltip' => 'The maximum width this shortcode can take from the page width', + 'value' => UM()->um_get_option( 'profile_max_width' ), + 'size' => 'small' + ), + + array( + 'id' => 'profile_area_max_width', + 'type' => 'text', + 'label' => __( 'Profile Area Maximum Width','ultimate-member' ), + 'default' => um_get_metadefault('profile_area_max_width'), + 'tooltip' => __('The maximum width of the profile area inside profile (below profile header)','ultimate-member'), + 'value' => UM()->um_get_option( 'profile_area_max_width' ), + 'size' => 'small' + ), + array( + 'id' => 'profile_icons', + 'type' => 'select', + 'label' => __( 'Profile Field Icons' ), + 'tooltip' => __( 'This is applicable for edit mode only','ultimate-member' ), + 'default' => um_get_metadefault('profile_icons'), + 'options' => array( + 'field' => __('Show inside text field','ultimate-member'), + 'label' => __('Show with label','ultimate-member'), + 'off' => __('Turn off','ultimate-member'), + ), + 'value' => UM()->um_get_option( 'profile_icons' ), + 'size' => 'small' + ), + array( + 'id' => 'profile_primary_btn_word', + 'type' => 'text', + 'label' => __( 'Profile Primary Button Text','ultimate-member' ), + 'default' => um_get_metadefault('profile_primary_btn_word'), + 'tooltip' => __('The text that is used for updating profile button','ultimate-member'), + 'value' => UM()->um_get_option( 'profile_primary_btn_word' ), + 'size' => 'medium' + ), + array( + 'id' => 'profile_secondary_btn', + 'type' => 'checkbox', + 'label' => __( 'Profile Secondary Button','ultimate-member' ), + 'default' => um_get_metadefault('profile_secondary_btn'), + 'tooltip' => __('Switch on/off the secondary button display in the form','ultimate-member'), + 'value' => UM()->um_get_option( 'profile_secondary_btn' ), + ), + array( + 'id' => 'profile_secondary_btn_word', + 'type' => 'text', + 'label' => __( 'Profile Secondary Button Text','ultimate-member' ), + 'default' => um_get_metadefault('profile_secondary_btn_word'), + 'tooltip' => __('The text that is used for cancelling update profile button','ultimate-member'), + 'conditional' => array( 'profile_secondary_btn', '=', 1 ), + 'value' => UM()->um_get_option( 'profile_secondary_btn_word' ), + 'size' => 'medium' + ), + array( + 'id' => 'default_avatar', + 'type' => 'media', + 'label' => __('Default Profile Photo', 'ultimate-member'), + 'tooltip' => __('You can change the default profile picture globally here. Please make sure that the photo is 300x300px.', 'ultimate-member'), + 'upload_frame_title'=> __('Select Default Profile Photo', 'ultimate-member'), + 'default' => array( + 'url' => um_url . 'assets/img/default_avatar.jpg', + ), + 'value' => UM()->um_get_option( 'default_avatar' ), + ), + array( + 'id' => 'default_cover', + 'type' => 'media', + 'url' => true, + 'preview' => false, + 'label' => __('Default Cover Photo', 'ultimate-member'), + 'tooltip' => __('You can change the default cover photo globally here. Please make sure that the default cover is large enough and respects the ratio you are using for cover photos.', 'ultimate-member'), + 'upload_frame_title'=> __('Select Default Cover Photo', 'ultimate-member'), + 'value' => UM()->um_get_option( 'default_cover' ), + ), + array( + 'id' => 'profile_photosize', + 'type' => 'text', + 'label' => __( 'Profile Photo Size','ultimate-member' ), + 'default' => um_get_metadefault('profile_photosize'), + 'tooltip' => __('The global default of profile photo size. This can be overridden by individual form settings','ultimate-member'), + 'value' => UM()->um_get_option( 'profile_photosize' ), + 'size' => 'small' + ), + array( + 'id' => 'profile_cover_enabled', + 'type' => 'checkbox', + 'label' => __( 'Profile Cover Photos','ultimate-member' ), + 'default' => 1, + 'tooltip' => __('Switch on/off the profile cover photos','ultimate-member'), + 'value' => UM()->um_get_option( 'profile_cover_enabled' ), + ), + array( + 'id' => 'profile_cover_ratio', + 'type' => 'select', + 'label' => __( 'Profile Cover Ratio','ultimate-member' ), + 'tooltip' => __( 'Choose global ratio for cover photos of profiles','ultimate-member' ), + 'default' => um_get_metadefault('profile_cover_ratio'), + 'options' => array( + '1.6:1' => '1.6:1', + '2.7:1' => '2.7:1', + '2.2:1' => '2.2:1', + '3.2:1' => '3.2:1', + ), + 'conditional' => array( 'profile_cover_enabled', '=', 1 ), + 'value' => UM()->um_get_option( 'profile_cover_ratio' ), + 'size' => 'small' + ), + array( + 'id' => 'profile_show_metaicon', + 'type' => 'checkbox', + 'label' => __( 'Profile Header Meta Text Icon','ultimate-member' ), + 'default' => 0, + 'tooltip' => __('Display field icons for related user meta fields in header or not','ultimate-member'), + 'value' => UM()->um_get_option( 'profile_show_metaicon' ), + ), + array( + 'id' => 'profile_show_name', + 'type' => 'checkbox', + 'label' => __( 'Show display name in profile header','ultimate-member' ), + 'default' => um_get_metadefault('profile_show_name'), + 'tooltip' => __('Switch on/off the user name on profile header','ultimate-member'), + 'value' => UM()->um_get_option( 'profile_show_name' ), + ), + array( + 'id' => 'profile_show_social_links', + 'type' => 'checkbox', + 'label' => __( 'Show social links in profile header','ultimate-member' ), + 'default' => um_get_metadefault('profile_show_social_links'), + 'tooltip' => __('Switch on/off the social links on profile header','ultimate-member'), + 'value' => UM()->um_get_option( 'profile_show_social_links' ), + ), + array( + 'id' => 'profile_show_bio', + 'type' => 'checkbox', + 'label' => __( 'Show user description in header','ultimate-member' ), + 'default' => um_get_metadefault('profile_show_bio'), + 'tooltip' => __('Switch on/off the user description on profile header','ultimate-member'), + 'value' => UM()->um_get_option( 'profile_show_bio' ), + ), + array( + 'id' => 'profile_show_html_bio', + 'type' => 'checkbox', + 'label' => __( 'Enable html support for user description','ultimate-member' ), + 'default' => um_get_metadefault('profile_show_html_bio'), + 'tooltip' => __('Switch on/off to enable/disable support for html tags on user description.','ultimate-member'), + 'value' => UM()->um_get_option( 'profile_show_html_bio' ), + ), + array( + 'id' => 'profile_bio_maxchars', + 'type' => 'text', + 'label' => __( 'User description maximum chars','ultimate-member' ), + 'default' => um_get_metadefault('profile_bio_maxchars'), + 'tooltip' => __('Maximum number of characters to allow in user description field in header.','ultimate-member'), + 'conditional' => array( 'profile_show_bio', '=', 1 ), + 'value' => UM()->um_get_option( 'profile_bio_maxchars' ), + 'size' => 'small' + ), + array( + 'id' => 'profile_header_menu', + 'type' => 'select', + 'label' => __( 'Profile Header Menu Position','ultimate-member' ), + 'default' => um_get_metadefault('profile_header_menu'), + 'tooltip' => __('For incompatible themes, please make the menu open from left instead of bottom by default.','ultimate-member'), + 'options' => array( + 'bc' => 'Bottom of Icon', + 'lc' => 'Left of Icon', + ), + 'value' => UM()->um_get_option( 'profile_header_menu' ), + 'size' => 'small' + ), + array( + 'id' => 'profile_empty_text', + 'type' => 'checkbox', + 'label' => __( 'Show a custom message if profile is empty','ultimate-member' ), + 'default' => um_get_metadefault('profile_empty_text'), + 'tooltip' => __('Switch on/off the custom message that appears when the profile is empty','ultimate-member'), + 'value' => UM()->um_get_option( 'profile_empty_text' ), + ), + array( + 'id' => 'profile_empty_text_emo', + 'type' => 'checkbox', + 'label' => __( 'Show the emoticon','ultimate-member' ), + 'default' => um_get_metadefault('profile_empty_text_emo'), + 'tooltip' => __('Switch on/off the emoticon (sad face) that appears above the message','ultimate-member'), + 'conditional' => array( 'profile_empty_text', '=', 1 ), + 'value' => UM()->um_get_option( 'profile_empty_text_emo' ), + ) + ) + ), + 'profile_menu' => array( + 'title' => __( 'Profile Menu', 'ultimate-member' ), + 'fields' => $appearances_profile_menu_fields + ), + 'registration_form' => array( + 'title' => __( 'Registration Form', 'ultimate-member' ), + 'fields' => array( + array( + 'id' => 'register_template', + 'type' => 'select', + 'label' => __( 'Registration Default Template','ultimate-member' ), + 'tooltip' => __( 'This will be the default template to output registration' ), + 'default' => um_get_metadefault('register_template'), + 'options' => UM()->shortcodes()->get_templates( 'register' ), + 'value' => UM()->um_get_option( 'register_template' ), + 'size' => 'small' + ), + array( + 'id' => 'register_max_width', + 'type' => 'text', + 'label' => __( 'Registration Maximum Width','ultimate-member' ), + 'default' => um_get_metadefault('register_max_width'), + 'tooltip' => __('The maximum width this shortcode can take from the page width','ultimate-member'), + 'value' => UM()->um_get_option( 'register_max_width' ), + 'size' => 'small' + ), + array( + 'id' => 'register_align', + 'type' => 'select', + 'label' => __( 'Registration Shortcode Alignment','ultimate-member' ), + 'tooltip' => __( 'The shortcode is centered by default unless you specify otherwise here','ultimate-member' ), + 'default' => um_get_metadefault('register_align'), + 'options' => array( + 'center' => __('Centered'), + 'left' => __('Left aligned'), + 'right' => __('Right aligned'), + ), + 'value' => UM()->um_get_option( 'register_align' ), + 'size' => 'small' + ), + array( + 'id' => 'register_icons', + 'type' => 'select', + 'label' => __( 'Registration Field Icons','ultimate-member' ), + 'tooltip' => __( 'This controls the display of field icons in the registration form','ultimate-member' ), + 'default' => um_get_metadefault('register_icons'), + 'options' => array( + 'field' => __('Show inside text field'), + 'label' => __('Show with label'), + 'off' => __('Turn off'), + ), + 'value' => UM()->um_get_option( 'register_icons' ), + 'size' => 'small' + ), + array( + 'id' => 'register_primary_btn_word', + 'type' => 'text', + 'label' => __( 'Registration Primary Button Text','ultimate-member' ), + 'default' => um_get_metadefault('register_primary_btn_word'), + 'tooltip' => __('The text that is used for primary button text','ultimate-member'), + 'value' => UM()->um_get_option( 'register_primary_btn_word' ), + 'size' => 'medium' + ), + array( + 'id' => 'register_secondary_btn', + 'type' => 'checkbox', + 'label' => __( 'Registration Secondary Button','ultimate-member' ), + 'default' => 1, + 'tooltip' => __('Switch on/off the secondary button display in the form','ultimate-member'), + 'value' => UM()->um_get_option( 'register_secondary_btn' ), + ), + array( + 'id' => 'register_secondary_btn_word', + 'type' => 'text', + 'label' => __( 'Registration Secondary Button Text','ultimate-member' ), + 'default' => um_get_metadefault('register_secondary_btn_word'), + 'tooltip' => __('The text that is used for the secondary button text','ultimate-member'), + 'conditional' => array( 'register_secondary_btn', '=', 1 ), + 'value' => UM()->um_get_option( 'register_secondary_btn_word' ), + 'size' => 'medium' + ), + array( + 'id' => 'register_secondary_btn_url', + 'type' => 'text', + 'label' => __( 'Registration Secondary Button URL','ultimate-member' ), + 'default' => um_get_metadefault('register_secondary_btn_url'), + 'tooltip' => __('You can replace default link for this button by entering custom URL','ultimate-member'), + 'conditional' => array( 'register_secondary_btn', '=', 1 ), + 'value' => UM()->um_get_option( 'register_secondary_btn_url' ), + 'size' => 'medium' + ), + array( + 'id' => 'register_role', + 'type' => 'select', + 'label' => __( 'Registration Default Role','ultimate-member' ), + 'tooltip' => __( 'This will be the default role assigned to users registering thru registration form','ultimate-member' ), + 'default' => um_get_metadefault('register_role'), + 'options' => UM()->roles()->get_roles( $add_default = 'Default' ), + 'value' => UM()->um_get_option( 'register_role' ), + 'size' => 'small' + ) + ) + ), + 'login_form' => array( + 'title' => __( 'Login Form', 'ultimate-member' ), + 'fields' => array( + array( + 'id' => 'login_template', + 'type' => 'select', + 'label' => __( 'Login Default Template','ultimate-member' ), + 'tooltip' => __( 'This will be the default template to output login','ultimate-member' ), + 'default' => um_get_metadefault('login_template'), + 'options' => UM()->shortcodes()->get_templates( 'login' ), + 'value' => UM()->um_get_option( 'login_template' ), + 'size' => 'small' + ), + array( + 'id' => 'login_max_width', + 'type' => 'text', + 'label' => __( 'Login Maximum Width','ultimate-member' ), + 'default' => um_get_metadefault('login_max_width'), + 'tooltip' => __('The maximum width this shortcode can take from the page width','ultimate-member'), + 'value' => UM()->um_get_option( 'login_max_width' ), + 'size' => 'small' + ), + array( + 'id' => 'login_align', + 'type' => 'select', + 'label' => __( 'Login Shortcode Alignment','ultimate-member' ), + 'tooltip' => __( 'The shortcode is centered by default unless you specify otherwise here','ultimate-member' ), + 'default' => um_get_metadefault('login_align'), + 'options' => array( + 'center' => __('Centered','ultimate-member'), + 'left' => __('Left aligned','ultimate-member'), + 'right' => __('Right aligned','ultimate-member'), + ), + 'value' => UM()->um_get_option( 'login_align' ), + 'size' => 'small' + ), + array( + 'id' => 'login_icons', + 'type' => 'select', + 'label' => __( 'Login Field Icons','ultimate-member' ), + 'tooltip' => __( 'This controls the display of field icons in the login form','ultimate-member' ), + 'default' => um_get_metadefault('login_icons'), + 'options' => array( + 'field' => __('Show inside text field','ultimate-member'), + 'label' => __('Show with label','ultimate-member'), + 'off' => __('Turn off','ultimate-member'), + ), + 'value' => UM()->um_get_option( 'login_icons' ), + 'size' => 'small' + ), + array( + 'id' => 'login_primary_btn_word', + 'type' => 'text', + 'label' => __( 'Login Primary Button Text','ultimate-member' ), + 'default' => um_get_metadefault('login_primary_btn_word'), + 'tooltip' => __('The text that is used for primary button text','ultimate-member'), + 'value' => UM()->um_get_option( 'login_primary_btn_word' ), + 'size' => 'medium' + ), + array( + 'id' => 'login_secondary_btn', + 'type' => 'checkbox', + 'label' => __( 'Login Secondary Button','ultimate-member' ), + 'default' => 1, + 'tooltip' => __('Switch on/off the secondary button display in the form','ultimate-member'), + 'value' => UM()->um_get_option( 'login_secondary_btn' ), + ), + array( + 'id' => 'login_secondary_btn_word', + 'type' => 'text', + 'label' => __( 'Login Secondary Button Text','ultimate-member' ), + 'default' => um_get_metadefault('login_secondary_btn_word'), + 'tooltip' => __('The text that is used for the secondary button text','ultimate-member'), + 'conditional' => array( 'login_secondary_btn', '=', 1 ), + 'value' => UM()->um_get_option( 'login_secondary_btn_word' ), + 'size' => 'medium' + ), + array( + 'id' => 'login_secondary_btn_url', + 'type' => 'text', + 'label' => __( 'Login Secondary Button URL','ultimate-member' ), + 'default' => um_get_metadefault('login_secondary_btn_url'), + 'tooltip' => __('You can replace default link for this button by entering custom URL','ultimate-member'), + 'conditional' => array( 'login_secondary_btn', '=', 1 ), + 'value' => UM()->um_get_option( 'login_secondary_btn_url' ), + 'size' => 'medium' + ), + array( + 'id' => 'login_forgot_pass_link', + 'type' => 'checkbox', + 'label' => __( 'Login Forgot Password Link','ultimate-member' ), + 'default' => 1, + 'tooltip' => __('Switch on/off the forgot password link in login form','ultimate-member'), + 'value' => UM()->um_get_option( 'login_forgot_pass_link' ), + ), + array( + 'id' => 'login_show_rememberme', + 'type' => 'checkbox', + 'label' => __( 'Show "Remember Me"','ultimate-member' ), + 'default' => 1, + 'tooltip' => __('Allow users to choose If they want to stay signed in even after closing the browser. If you do not show this option, the default will be to not remember login session.','ultimate-member'), + 'value' => UM()->um_get_option( 'login_show_rememberme' ), + ) + ) + ) + ) + ), + 'extensions' => array( + 'title' => __( 'Extensions', 'ultimate-member' ) + ), + 'licenses' => array( + 'title' => __( 'Licenses', 'ultimate-member' ), + ), + 'misc' => array( + 'title' => __( 'Misc', 'ultimate-member' ), + 'fields' => array( + array( + 'id' => 'form_asterisk', + 'type' => 'checkbox', + 'label' => __( 'Show an asterisk for required fields','ultimate-member' ), + 'value' => UM()->um_get_option( 'form_asterisk' ), + 'default' => UM()->um_get_default( 'form_asterisk' ), + ), + array( + 'id' => 'profile_title', + 'type' => 'text', + 'label' => __('User Profile Title','ultimate-member'), + 'tooltip' => __('This is the title that is displayed on a specific user profile','ultimate-member'), + 'value' => UM()->um_get_option( 'profile_title' ), + 'default' => UM()->um_get_default( 'profile_title' ), + 'size' => 'medium' + ), + array( + 'id' => 'profile_desc', + 'type' => 'textarea', + 'label' => __( 'User Profile Dynamic Meta Description','ultimate-member' ), + 'tooltip' => __('This will be used in the meta description that is available for search-engines.','ultimate-member'), + 'value' => UM()->um_get_option( 'profile_desc' ), + 'default' => UM()->um_get_default( 'profile_desc' ), + 'args' => array( + 'textarea_rows' => 6 + ) + ), + array( + 'id' => 'allow_tracking', + 'type' => 'checkbox', + 'label' => __( 'Allow Tracking','ultimate-member' ), + 'value' => UM()->um_get_option( 'allow_tracking' ), + 'default' => UM()->um_get_default( 'allow_tracking' ), + ), + array( + 'id' => 'uninstall_on_delete', + 'type' => 'checkbox', + 'label' => __( 'Remove Data on Uninstall?', 'ultimate-member' ), + 'tooltip' => __( 'Check this box if you would like Ultimate Member to completely remove all of its data when the plugin/extensions are deleted.', 'ultimate-member' ), + 'value' => UM()->um_get_option( 'uninstall_on_delete' ), + 'default' => UM()->um_get_default( 'uninstall_on_delete' ), + ) + ) + ) + ) ); + + } + + + function sorting_licenses_options( $settings ) { + //sorting licenses + if ( empty( $settings['licenses']['fields'] ) ) + return $settings; + $licenses = $settings['licenses']['fields']; + @uasort( $licenses, create_function( '$a,$b', 'return strnatcasecmp($a["label"],$b["label"]);' ) ); + $settings['licenses']['fields'] = $licenses; + + + //sorting extensions + if ( empty( $settings['extensions']['sections'] ) ) + return $settings; + + $extensions = $settings['extensions']['sections']; + @uasort( $extensions, create_function( '$a,$b', 'return strnatcasecmp($a["title"],$b["title"]);' ) ); + + $keys = array_keys( $extensions ); + if ( $keys[0] != "" ) { + $new_key = strtolower( str_replace( " ", "_", $extensions[""]['title'] ) ); + $temp = $extensions[""]; + $extensions[$new_key] = $temp; + $extensions[""] = $extensions[$keys[0]]; + unset( $extensions[$keys[0]] ); + @uasort( $extensions, create_function( '$a,$b', 'return strnatcasecmp($a["title"],$b["title"]);' ) ); + } + + $settings['extensions']['sections'] = $extensions; + + return $settings; + } + + + function get_section_fields( $tab, $section ) { + + if ( empty( $this->settings_structure[$tab] ) ) + return array(); + + if ( ! empty( $this->settings_structure[$tab]['sections'][$section]['fields'] ) ) { + return $this->settings_structure[$tab]['sections'][$section]['fields']; + } elseif ( ! empty( $this->settings_structure[$tab]['fields'] ) ) { + return $this->settings_structure[$tab]['fields']; + } + + return array(); + } + + + /*** + *** @setup admin menu + ***/ + function primary_admin_menu() { + add_submenu_page( 'ultimatemember', __( 'Settings', 'ultimate-member' ), __( 'Settings', 'ultimate-member' ), 'manage_options', 'um_options', array( &$this, 'settings_page' ) ); + } + + + function settings_page() { + $current_tab = empty( $_GET['tab'] ) ? '' : urldecode( $_GET['tab'] ); + $current_subtab = empty( $_GET['section'] ) ? '' : urldecode( $_GET['section'] ); + + $settings_struct = $this->settings_structure[$current_tab]; + + //remove not option hidden fields + if ( ! empty( $settings_struct['fields'] ) ) { + foreach ( $settings_struct['fields'] as $field_key=>$field_options ) { + + if ( isset( $field_options['is_option'] ) && $field_options['is_option'] === false ) + unset( $settings_struct['fields'][$field_key] ); + + } + } + + if ( empty( $settings_struct['fields'] ) && empty( $settings_struct['sections'] ) ) + um_js_redirect( add_query_arg( array( 'page' => 'um_options' ), admin_url( 'admin.php' ) ) ); + + if ( ! empty( $settings_struct['sections'] ) ) { + if ( empty( $settings_struct['sections'][$current_subtab] ) ) + um_js_redirect( add_query_arg( array( 'page' => 'um_options', 'tab' => $current_tab ), admin_url( 'admin.php' ) ) ); + } + + echo $this->generate_tabs_menu() . $this->generate_subtabs_menu( $current_tab ); + + do_action( "um_settings_page_before_" . $current_tab . "_" . $current_subtab . "_content" ); + + if ( 'licenses' == $current_tab ) { + do_action( "um_settings_page_" . $current_tab . "_" . $current_subtab . "_before_section" ); + + $section_fields = $this->get_section_fields( $current_tab, $current_subtab ); + echo apply_filters( 'um_settings_section_' . $current_tab . '_' . $current_subtab . '_content', $this->render_settings_section( $section_fields, $current_tab, $current_subtab ), $section_fields ); + + } else { ?> + +
            + + + get_section_fields( $current_tab, $current_subtab ); + echo apply_filters( 'um_settings_section_' . $current_tab . '_' . $current_subtab . '_content', $this->render_settings_section( $section_fields, $current_tab, $current_subtab ), $section_fields ); + ?> + +

            + +

            +
            + + '; + + switch( $page ) { + case 'settings': + $menu_tabs = array(); + foreach ( $this->settings_structure as $slug => $tab ) { + if ( ! empty( $tab['fields'] ) ) { + foreach ( $tab['fields'] as $field_key=>$field_options ) { + if ( isset( $field_options['is_option'] ) && $field_options['is_option'] === false ) { + unset( $tab['fields'][$field_key] ); + } + } + } + + if ( ! empty( $tab['fields'] ) || ! empty( $tab['sections'] ) ) + $menu_tabs[$slug] = $tab['title']; + } + + $current_tab = empty( $_GET['tab'] ) ? '' : urldecode( $_GET['tab'] ); + foreach ( $menu_tabs as $name=>$label ) { + $active = ( $current_tab == $name ) ? 'nav-tab-active' : ''; + $tabs .= '' . + $label . + ''; + } + + break; + default: + $tabs = apply_filters( 'um_generate_tabs_menu_' . $page, $tabs ); + break; + } + + return $tabs . ''; + } + + + + function generate_subtabs_menu( $tab = '' ) { + if ( empty( $this->settings_structure[$tab]['sections'] ) ) + return ''; + + $menu_subtabs = array(); + foreach ( $this->settings_structure[$tab]['sections'] as $slug => $subtab ) { + $menu_subtabs[$slug] = $subtab['title']; + } + + $subtabs = '
              '; + + $current_tab = empty( $_GET['tab'] ) ? '' : urldecode( $_GET['tab'] ); + $current_subtab = empty( $_GET['section'] ) ? '' : urldecode( $_GET['section'] ); + foreach ( $menu_subtabs as $name => $label ) { + $active = ( $current_subtab == $name ) ? 'current' : ''; + $subtabs .= '' + . $label . + ' | '; + } + + return substr( $subtabs, 0, -3 ) . '
            '; + } + + + /** + * Handler for settings forms + * when "Save Settings" button click + * + */ + function save_settings_handler() { + if ( isset( $_POST['um-settings-action'] ) && 'save' == $_POST['um-settings-action'] && ! empty( $_POST['um_options'] ) ) { + do_action( "um_settings_before_save" ); + + foreach ( $_POST['um_options'] as $key=>$value ) { + um_update_option( $key, $value ); + } + + do_action( "um_settings_save" ); + + + //redirect after save settings + $arg = array( + 'page' => 'um_options', + ); + + if ( ! empty( $_GET['tab'] ) ) + $arg['tab'] = $_GET['tab']; + + if ( ! empty( $_GET['section'] ) ) + $arg['section'] = $_GET['section']; + + um_js_redirect( add_query_arg( $arg, admin_url( 'admin.php' ) ) ); + } + } + + + function on_settings_save() { + if ( ! empty( $_POST['um_options'] ) ) { + if ( ! empty( $_POST['pages_settings'] ) ) { + $post_ids = new \WP_Query( array( + 'post_type' => 'page', + 'meta_query' => array( + array( + 'key' => '_um_core', + 'compare' => 'EXISTS' + ) + ), + 'posts_per_page' => -1, + 'fields' => 'ids' + ) ); + + $post_ids = $post_ids->get_posts(); + + if ( ! empty( $post_ids ) ) { + foreach ( $post_ids as $post_id ) { + delete_post_meta( $post_id, '_um_core' ); + } + } + + foreach ( $_POST['um_options'] as $option_slug => $post_id ) { + $slug = str_replace( 'core_', '', $option_slug ); + update_post_meta( $post_id, '_um_core', $slug ); + } + } + } + } + + + function before_licenses_save() { + if ( empty( $_POST['um_options'] ) || empty( $_POST['licenses_settings'] ) ) + return; + + foreach ( $_POST['um_options'] as $key => $value ) { + $this->previous_licenses[$key] = um_get_option( $key ); + } + } + + + function licenses_save() { + if ( empty( $_POST['um_options'] ) || empty( $_POST['licenses_settings'] ) ) + return; + + foreach ( $_POST['um_options'] as $key => $value ) { + $edd_action = ''; + $license_key = ''; + if ( empty( $this->previous_licenses[$key] ) && ! empty( $value ) ) { + $edd_action = 'activate_license'; + $license_key = $value; + } elseif ( ! empty( $this->previous_licenses[$key] ) && empty( $value ) ) { + $edd_action = 'deactivate_license'; + $license_key = $this->previous_licenses[$key]; + } elseif ( ! empty( $this->previous_licenses[$key] ) && ! empty( $value ) ) { + $edd_action = 'check_license'; + $license_key = $value; + } + + if ( empty( $edd_action ) ) + continue; + + $item_name = false; + $version = false; + $author = false; + foreach ( $this->settings_structure['licenses']['fields'] as $field_data ) { + if ( $field_data['id'] == $key ) { + $item_name = ! empty( $field_data['item_name'] ) ? $field_data['item_name'] : false; + $version = ! empty( $field_data['version'] ) ? $field_data['version'] : false; + $author = ! empty( $field_data['author'] ) ? $field_data['author'] : false; + } + } + + $api_params = array( + 'edd_action' => $edd_action, + 'license' => $license_key, + 'item_name' => $item_name, + 'version' => $version, + 'author' => $author, + 'url' => home_url(), + ); + + $request = wp_remote_post( + 'https://ultimatemember.com/', + array( + 'timeout' => 15, + 'sslverify' => false, + 'body' => $api_params + ) + ); + + if ( ! is_wp_error( $request ) ) + $request = json_decode( wp_remote_retrieve_body( $request ) ); + + $request = ( $request ) ? maybe_unserialize( $request ) : false; + + if ( $edd_action == 'activate_license' || $edd_action == 'check_license' ) + update_option( "{$key}_edd_answer", $request ); + else + delete_option( "{$key}_edd_answer" ); + + } + } + + + function check_wrong_licenses() { + $invalid_license = false; + + if ( empty( $this->settings_structure['licenses']['fields'] ) ) + return; + + foreach ( $this->settings_structure['licenses']['fields'] as $field_data ) { + $license = get_option( "{$field_data['id']}_edd_answer" ); + + if ( ( is_object( $license ) && 'valid' == $license->license ) || 'valid' == $license ) + continue; + + $invalid_license = true; + break; + } + + if ( $invalid_license ) { ?> + +
            +

            + Licenses page to correct this issue.', 'ultimate-member' ), ultimatemember_plugin_name, add_query_arg( array('page'=>'um_options', 'tab' => 'licenses'), admin_url( 'admin.php' ) ) ) ?> +

            +
            + + config()->email_notifications; + + if ( empty( $email_key ) || empty( $emails[$email_key] ) ) + include_once um_path . 'includes/admin/core/list-tables/emails-list-table.php'; + } + + + function settings_email_tab( $section ) { + $email_key = empty( $_GET['email'] ) ? '' : urldecode( $_GET['email'] ); + $emails = UM()->config()->email_notifications; + + if ( empty( $email_key ) || empty( $emails[$email_key] ) ) + return $section; + + $section_fields = array( + array( + 'id' => $email_key . '_on', + 'type' => 'checkbox', + 'label' => $emails[$email_key]['title'], + 'tooltip' => $emails[$email_key]['description'], + 'value' => UM()->um_get_option( $email_key . '_on' ), + 'default' => UM()->um_get_default( $email_key . '_on' ), + ), + array( + 'id' => $email_key . '_sub', + 'type' => 'text', + 'label' => __( 'Subject Line','ultimate-member' ), + 'conditional' => array( $email_key . '_on', '=', 1 ), + 'tooltip' => __('This is the subject line of the e-mail','ultimate-member'), + 'value' => UM()->um_get_option( $email_key . '_sub' ), + 'default' => UM()->um_get_default( $email_key . '_sub' ), + ), + array( + 'id' => $email_key, + 'type' => 'wp_editor', + 'label' => __( 'Message Body','ultimate-member' ), + 'conditional' => array( $email_key . '_on', '=', 1 ), + 'tooltip' => __('This is the content of the e-mail','ultimate-member'), + 'value' => UM()->um_get_option( $email_key ), + 'default' => UM()->um_get_default( $email_key ), + ), + ); + + return $this->render_settings_section( $section_fields, 'email', $email_key ); + } + + + function settings_appearance_profile_tab() { + wp_enqueue_media(); + } + + + function settings_licenses_tab( $html, $section_fields ) { + ob_start(); ?> + +
            + + + + success ) { + + if ( ! empty( $license->error ) ) { + switch ( $license->error ) { + + case 'expired' : + + $class = 'expired'; + $messages[] = sprintf( + __( 'Your license key expired on %s. Please renew your license key.', 'ultimate-member' ), + date_i18n( get_option( 'date_format' ), strtotime( $license->expires, current_time( 'timestamp' ) ) ), + 'https://ultimatemember.com/checkout/?edd_license_key=' . $value . '&utm_campaign=admin&utm_source=licenses&utm_medium=expired' + ); + + $license_status = 'license-' . $class . '-notice'; + + break; + + case 'revoked' : + + $class = 'error'; + $messages[] = sprintf( + __( 'Your license key has been disabled. Please contact support for more information.', 'ultimate-member' ), + 'https://ultimatemember.com/support?utm_campaign=admin&utm_source=licenses&utm_medium=revoked' + ); + + $license_status = 'license-' . $class . '-notice'; + + break; + + case 'missing' : + + $class = 'error'; + $messages[] = sprintf( + __( 'Invalid license. Please visit your account page and verify it.', 'ultimate-member' ), + 'https://ultimatemember.com/account?utm_campaign=admin&utm_source=licenses&utm_medium=missing' + ); + + $license_status = 'license-' . $class . '-notice'; + + break; + + case 'invalid' : + case 'site_inactive' : + + $class = 'error'; + $messages[] = sprintf( + __( 'Your %s is not active for this URL. Please visit your account page to manage your license key URLs.', 'ultimate-member' ), + $field_data['item_name'], + 'https://ultimatemember.com/account?utm_campaign=admin&utm_source=licenses&utm_medium=invalid' + ); + + $license_status = 'license-' . $class . '-notice'; + + break; + + case 'item_name_mismatch' : + + $class = 'error'; + $messages[] = sprintf( __( 'This appears to be an invalid license key for %s.', 'ultimate-member' ), $field_data['item_name'] ); + + $license_status = 'license-' . $class . '-notice'; + + break; + + case 'no_activations_left': + + $class = 'error'; + $messages[] = sprintf( __( 'Your license key has reached its activation limit. View possible upgrades now.', 'ultimate-member' ), 'https://ultimatemember.com/account' ); + + $license_status = 'license-' . $class . '-notice'; + + break; + + case 'license_not_activable': + + $class = 'error'; + $messages[] = __( 'The key you entered belongs to a bundle, please use the product specific license key.', 'ultimate-member' ); + + $license_status = 'license-' . $class . '-notice'; + break; + + default : + + $class = 'error'; + $error = ! empty( $license->error ) ? $license->error : __( 'unknown_error', 'ultimate-member' ); + $messages[] = sprintf( __( 'There was an error with this license key: %s. Please contact our support team.', 'ultimate-member' ), $error, 'https://ultimatemember.com/support' ); + + $license_status = 'license-' . $class . '-notice'; + break; + } + } else { + $class = 'error'; + $error = ! empty( $license->error ) ? $license->error : __( 'unknown_error', 'ultimate-member' ); + $messages[] = sprintf( __( 'There was an error with this license key: %s. Please contact our support team.', 'ultimate-member' ), $error, 'https://ultimatemember.com/support' ); + + $license_status = 'license-' . $class . '-notice'; + } + + } else { + + switch( $license->license ) { + + case 'expired' : + + $class = 'expired'; + $messages[] = sprintf( + __( 'Your license key expired on %s. Please renew your license key.', 'ultimate-member' ), + date_i18n( get_option( 'date_format' ), strtotime( $license->expires, current_time( 'timestamp' ) ) ), + 'https://ultimatemember.com/checkout/?edd_license_key=' . $value . '&utm_campaign=admin&utm_source=licenses&utm_medium=expired' + ); + + $license_status = 'license-' . $class . '-notice'; + + break; + + case 'revoked' : + + $class = 'error'; + $messages[] = sprintf( + __( 'Your license key has been disabled. Please contact support for more information.', 'ultimate-member' ), + 'https://ultimatemember.com/support?utm_campaign=admin&utm_source=licenses&utm_medium=revoked' + ); + + $license_status = 'license-' . $class . '-notice'; + + break; + + case 'missing' : + + $class = 'error'; + $messages[] = sprintf( + __( 'Invalid license. Please visit your account page and verify it.', 'ultimate-member' ), + 'https://ultimatemember.com/account?utm_campaign=admin&utm_source=licenses&utm_medium=missing' + ); + + $license_status = 'license-' . $class . '-notice'; + + break; + + case 'invalid' : + case 'site_inactive' : + + $class = 'error'; + $messages[] = sprintf( + __( 'Your %s is not active for this URL. Please visit your account page to manage your license key URLs.', 'ultimate-member' ), + $field_data['item_name'], + 'https://ultimatemember.com/account?utm_campaign=admin&utm_source=licenses&utm_medium=invalid' + ); + + $license_status = 'license-' . $class . '-notice'; + + break; + + case 'item_name_mismatch' : + + $class = 'error'; + $messages[] = sprintf( __( 'This appears to be an invalid license key for %s.', 'ultimate-member' ), $field_data['item_name'] ); + + $license_status = 'license-' . $class . '-notice'; + + break; + + case 'no_activations_left': + + $class = 'error'; + $messages[] = sprintf( __( 'Your license key has reached its activation limit. View possible upgrades now.', 'ultimate-member' ), 'https://ultimatemember.com/account' ); + + $license_status = 'license-' . $class . '-notice'; + + break; + + case 'license_not_activable': + + $class = 'error'; + $messages[] = __( 'The key you entered belongs to a bundle, please use the product specific license key.', 'ultimate-member' ); + + $license_status = 'license-' . $class . '-notice'; + break; + + case 'valid' : + default: + + $class = 'valid'; + + $now = current_time( 'timestamp' ); + $expiration = strtotime( $license->expires, current_time( 'timestamp' ) ); + + if( 'lifetime' === $license->expires ) { + + $messages[] = __( 'License key never expires.', 'ultimate-member' ); + + $license_status = 'license-lifetime-notice'; + + } elseif( $expiration > $now && $expiration - $now < ( DAY_IN_SECONDS * 30 ) ) { + + $messages[] = sprintf( + __( 'Your license key expires soon! It expires on %s. Renew your license key.', 'ultimate-member' ), + date_i18n( get_option( 'date_format' ), strtotime( $license->expires, current_time( 'timestamp' ) ) ), + 'https://ultimatemember.com/checkout/?edd_license_key=' . $value . '&utm_campaign=admin&utm_source=licenses&utm_medium=renew' + ); + + $license_status = 'license-expires-soon-notice'; + + } else { + + $messages[] = sprintf( + __( 'Your license key expires on %s.', 'ultimate-member' ), + date_i18n( get_option( 'date_format' ), strtotime( $license->expires, current_time( 'timestamp' ) ) ) + ); + + $license_status = 'license-expiration-date-notice'; + + } + + break; + + } + + } + + } else { + $class = 'empty'; + + $messages[] = sprintf( + __( 'To receive updates, please enter your valid %s license key.', 'ultimate-member' ), + $field_data['item_name'] + ); + + $license_status = null; + } ?> + + + + + + + +
            +
            + + + + +
            + + + license ) || 'valid' == $license ) { ?> + + + + + + +
            +

            +
            + +
            +
            +
            + admin_forms( array( + 'class' => 'um_options-' . $current_tab . '-' . $current_subtab . ' um-third-column', + 'prefix_id' => 'um_options', + 'fields' => $section_fields + ) )->render_form(); ?> + + '; + + + $option_value = UM()->um_get_option( $data['id'] ); + $default = ! empty( $data['default'] ) ? $data['default'] : UM()->um_get_default( $data['id'] ); + + switch ( $data['type'] ) { + case 'hidden': + $value = ! empty( $option_value ) ? $option_value : $default; + + if ( empty( $data['is_option'] ) ) + $html .= ''; + else + $html .= ''; + + break; + case 'text': + $value = ! empty( $option_value ) ? $option_value : $default; + $field_length = ! empty( $data['size'] ) ? $data['size'] : 'um-long-field'; + + $html .= ''; + break; + case 'multi-text': + $values = ! empty( $option_value ) ? $option_value : $default; + + $html .= '' . $data['add_text'] . ''; + break; + case 'textarea': + $value = ! empty( $option_value ) ? $option_value : $default; + $field_length = ! empty( $data['size'] ) ? $data['size'] : 'um-long-field'; + + $html .= ''; + break; + case 'wp_editor': + $value = ! empty( $option_value ) ? $option_value : $default; + + ob_start(); + wp_editor( $value, + 'um_options_' . $data['id'], + array( + 'textarea_name' => 'um_options[' . $data['id'] . ']', + 'textarea_rows' => 20, + 'editor_height' => 425, + 'wpautop' => false, + 'media_buttons' => false, + 'editor_class' => 'um-option-field' + ) + ); + + $html .= ob_get_clean(); + break; + case 'checkbox': + $value = ( '' !== $option_value ) ? $option_value : $default; + + $html .= ''; + break; + case 'multi-checkbox': + $value = ( '' !== $option_value ) ? $option_value : $default; + $columns = ! empty( $data['columns'] ) ? $data['columns'] : 1; + + $per_column = ceil( count( $data['options'] ) / $columns ); + + $html .= '
            '; + + $current_option = 1; + $iter = 1; + foreach ( $data['options'] as $key=>$option ) { + if ( $current_option == 1 ) + $html .= '
            '; + + $html .= ' + '; + + if ( $current_option == $per_column || $iter == count( $data['options'] ) ) { + $current_option = 1; + $html .= '
            '; + } else { + $current_option++; + } + + $iter++; + } + + $html .= '
            '; + + break; + case 'selectbox': + $value = ! empty( $option_value ) ? $option_value : $default; + + $html .= ''; + + break; + case 'media': + $upload_frame_title = ! empty( $data['upload_frame_title'] ) ? $data['upload_frame_title'] : __( 'Select media', 'ultimate-member' ); + $value = ! empty( $option_value ) ? $option_value : $default; + + $image_id = ! empty( $value['id'] ) ? $value['id'] : ''; + $image_width = ! empty( $value['width'] ) ? $value['width'] : ''; + $image_height = ! empty( $value['height'] ) ? $value['height'] : ''; + $image_thumbnail = ! empty( $value['thumbnail'] ) ? $value['thumbnail'] : ''; + $image_url = ! empty( $value['url'] ) ? $value['url'] : ''; + + $data_default = ! empty( $default ) ? 'data-default="' . esc_attr( $default['url'] ) .'"' : ''; + + $html .= '
            ' . + '' . + '' . + '' . + '' . + ''; + + if ( ! isset( $data['preview'] ) || $data['preview'] !== false ) { + $html .= '
            '; + } + + if ( ! empty( $data['url'] ) ) { + $html .= '
            '; + } + + $html .= ' +
            '; + break; + } + + if ( ! empty( $data['description'] ) ) + $html .= '
            ' . $data['description'] . '
            '; + + $html .= ''; + + return $html; + } + + } +} \ No newline at end of file diff --git a/includes/admin/core/class-admin-upgrade.php b/includes/admin/core/class-admin-upgrade.php new file mode 100644 index 00000000..02aef1de --- /dev/null +++ b/includes/admin/core/class-admin-upgrade.php @@ -0,0 +1,73 @@ +packages_dir = plugin_dir_path( __FILE__ ).'packages/'; + + $um_last_version_upgrade = get_option( 'um_last_version_upgrade' ); + + if ( ! $um_last_version_upgrade || version_compare( $um_last_version_upgrade, ultimatemember_version, '<' ) ) + add_action( 'admin_init', array( $this, 'packages' ), 10 ); + } + + + /** + * Load packages + */ + public function packages() { + $this->set_update_versions(); + + $um_last_version_upgrade = get_option( 'um_last_version_upgrade' ); + $um_last_version_upgrade = ! $um_last_version_upgrade ? '0.0.0' : $um_last_version_upgrade; + + foreach ( $this->update_versions as $update_version ) { + + if ( version_compare( $update_version, $um_last_version_upgrade, '<=' ) ) + continue; + + if ( version_compare( $update_version, ultimatemember_version, '>' ) ) + continue; + + $file_path = $this->packages_dir . $update_version . '.php'; + + if ( file_exists( $file_path ) ) { + include_once( $file_path ); + update_option( 'um_last_version_upgrade', $update_version ); + } + } + } + + + /** + * Parse packages dir for packages files + */ + function set_update_versions() { + $update_versions = array(); + $handle = opendir( $this->packages_dir ); + while ( false !== ( $filename = readdir( $handle ) ) ) { + + if ( $filename != '.' && $filename != '..' ) + $update_versions[] = preg_replace( '/(.*?)\.php/i', '$1', $filename ); + + } + closedir( $handle ); + + sort( $update_versions ); + + $this->update_versions = $update_versions; + } + + } +} \ No newline at end of file diff --git a/includes/admin/core/class-admin-users.php b/includes/admin/core/class-admin-users.php new file mode 100644 index 00000000..886f0f77 --- /dev/null +++ b/includes/admin/core/class-admin-users.php @@ -0,0 +1,295 @@ +custom_role = 'um_role'; + + add_action( 'restrict_manage_users', array( &$this, 'restrict_manage_users' ) ); + + add_filter( 'user_row_actions', array( &$this, 'user_row_actions' ), 10, 2 ); + + add_filter( 'pre_user_query', array( &$this, 'sort_by_newest' ) ); + + add_filter( 'pre_user_query', array( &$this, 'filter_users_by_status' ) ); + + add_filter( 'views_users', array( &$this, 'add_status_links' ) ); + + add_action( 'admin_init', array( &$this, 'um_bulk_users_edit' ), 9 ); + } + + + /** + * Add UM Bulk actions to Users List Table + * + */ + function restrict_manage_users() { ?> +
            + + + + + + + +
            + + + + array( + 'label' => __( 'Approve Membership', 'ultimate-member' ) + ), + 'um_reject_membership' => array( + 'label' => __( 'Reject Membership', 'ultimate-member' ) + ), + 'um_put_as_pending' => array( + 'label' => __( 'Put as Pending Review', 'ultimate-member' ) + ), + 'um_resend_activation' => array( + 'label' => __( 'Resend Activation E-mail', 'ultimate-member' ) + ), + 'um_deactivate' => array( + 'label' => __( 'Deactivate', 'ultimate-member' ) + ), + 'um_reenable' => array( + 'label' => __( 'Reactivate', 'ultimate-member' ) + ) + ) ); + + $output = ''; + foreach ( $actions as $id => $action_data ) { + $output .= ''; + } + return $output; + } + + + /** + * Custom row actions for users page + * + * @param array $actions + * @param $user_object \WP_User + * @return array + */ + function user_row_actions( $actions, $user_object ) { + $user_id = $user_object->ID; + + $actions['frontend_profile'] = "" . __( 'View profile', 'ultimate-member' ) . ""; + + $submitted = get_user_meta( $user_id, 'submitted', true ); + if ( ! empty( $submitted ) ) + $actions['view_info'] = '' . __( 'Info', 'ultimate-member' ) . ''; + + $actions = apply_filters( 'um_admin_user_row_actions', $actions, $user_id ); + + return $actions; + } + + + /** + * Change default sorting at WP Users list table + * + * @param $query + * @return mixed + */ + function sort_by_newest( $query ) { + global $pagenow; + + if ( is_admin() && $pagenow == 'users.php' ) { + if ( ! isset( $_REQUEST['orderby'] ) ) { + $query->query_vars["order"] = 'desc'; + $query->query_orderby = " ORDER BY user_registered " . ( $query->query_vars["order"] == "desc" ? "desc " : "asc " ); //set sort order + } + } + + return $query; + } + + + /** + * Filter WP users by UM Status + * + * @param $query + * @return mixed + */ + function filter_users_by_status( $query ) { + global $wpdb, $pagenow; + + if ( is_admin() && $pagenow == 'users.php' && ! empty( $_GET['status'] ) ) { + + $status = urldecode( $_GET['status'] ); + + if ( $status == 'needs-verification' ) { + $query->query_where = str_replace('WHERE 1=1', + "WHERE 1=1 AND {$wpdb->users}.ID IN ( + SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta + WHERE {$wpdb->usermeta}.meta_key = '_um_verified' + AND {$wpdb->usermeta}.meta_value = 'pending')", + $query->query_where + ); + } else { + $query->query_where = str_replace('WHERE 1=1', + "WHERE 1=1 AND {$wpdb->users}.ID IN ( + SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta + WHERE {$wpdb->usermeta}.meta_key = 'account_status' + AND {$wpdb->usermeta}.meta_value = '{$status}')", + $query->query_where + ); + } + + } + + return $query; + } + + + /** + * Add status links to WP Users List Table + * + * @param $views + * @return array|mixed|void + */ + function add_status_links( $views ) { + remove_filter( 'pre_user_query', array( &$this, 'filter_users_by_status' ) ); + + $old_views = $views; + $views = array(); + + if ( ! isset( $_REQUEST['role'] ) && ! isset( $_REQUEST['status'] ) ) { + $views['all'] = 'All (' . UM()->query()->count_users() . ')'; + } else { + $views['all'] = 'All (' . UM()->query()->count_users() . ')'; + } + + $status = array( + 'approved' => __( 'Approved', 'ultimate-member' ), + 'awaiting_admin_review' => __( 'Pending review', 'ultimate-member' ), + 'awaiting_email_confirmation' => __( 'Waiting e-mail confirmation', 'ultimate-member' ), + 'inactive' => __( 'Inactive', 'ultimate-member' ), + 'rejected' => __( 'Rejected', 'ultimate-member' ) + ); + + UM()->query()->count_users_by_status( 'unassigned' ); + + foreach ( $status as $k => $v ) { + if ( isset( $_REQUEST['status'] ) && $_REQUEST['status'] == $k ) { + $current = 'class="current"'; + } else { + $current = ''; + } + + $views[$k] = ''. $v . ' ('.UM()->query()->count_users_by_status( $k ).')'; + } + + $views = apply_filters( 'um_admin_views_users', $views ); + + // remove all filters + unset( $old_views['all'] ); + + // add separator + $views['subsep'] = ''; + + // merge views + foreach ( $old_views as $key => $view ) { + $views[ $key ] = $view; + } + + return $views; + } + + + /*** + *** @Bulk user editing actions + ***/ + function um_bulk_users_edit() { + $admin_err = 0; + + // bulk edit users + if ( ! empty( $_REQUEST['users'] ) && ! empty( $_REQUEST['um_bulkedit'] ) && ! empty( $_REQUEST['um_bulk_action'] ) ) { + + if ( ! current_user_can( 'edit_users' ) ) + wp_die( __( 'You do not have enough permissions to do that.', 'ultimate-member' ) ); + + check_admin_referer( 'bulk-users' ); + + $users = $_REQUEST['users']; + $bulk_action = current( array_filter( $_REQUEST['um_bulk_action'] ) ); + + foreach ( $users as $user_id ) { + UM()->user()->set( $user_id ); + if ( ! um_user( 'super_admin' ) ) { + + do_action( "um_admin_user_action_hook", $bulk_action ); + + do_action( "um_admin_user_action_{$bulk_action}_hook" ); + + } else { + $admin_err = 1; + } + } + + // Finished. redirect now + if ( $admin_err == 0 ) { + + $uri = $this->set_redirect_uri( admin_url( 'users.php' ) ); + $uri = add_query_arg( 'update', 'users_updated', $uri ); + + wp_redirect( $uri ); + + exit; + } else { + wp_redirect( admin_url( 'users.php?update=err_users_updated' ) ); + exit; + } + + } else if ( ! empty( $_REQUEST['um_bulkedit'] ) ) { + + $uri = $this->set_redirect_uri( admin_url( 'users.php' ) ); + wp_redirect( $uri ); + exit; + + } + } + + + /** + * Sets redirect URI after bulk action + * + * @param string $uri + * @return string + */ + function set_redirect_uri( $uri ) { + + if ( ! empty( $_REQUEST['s'] ) ) + $uri = add_query_arg( 's', $_REQUEST['s'], $uri ); + + if ( ! empty( $_REQUEST['status'] ) ) + $uri = add_query_arg( 'status', $_REQUEST['status'], $uri ); + + return $uri; + + } + + } +} \ No newline at end of file diff --git a/includes/admin/core/list-tables/emails-list-table.php b/includes/admin/core/list-tables/emails-list-table.php new file mode 100644 index 00000000..3a8ba7e1 --- /dev/null +++ b/includes/admin/core/list-tables/emails-list-table.php @@ -0,0 +1,192 @@ + __( 'item', 'ultimate-member' ), + 'plural' => __( 'items', 'ultimate-member' ), + 'ajax' => false + ) ); + + $this->no_items_message = $args['plural'] . ' ' . __( 'not found.', 'ultimate-member' ); + + parent::__construct( $args ); + + + } + + function __call( $name, $arguments ) { + return call_user_func_array( array( $this, $name ), $arguments ); + } + + function prepare_items() { + $columns = $this->get_columns(); + $hidden = array(); + $sortable = $this->get_sortable_columns(); + $this->_column_headers = array( $columns, $hidden, $sortable ); + } + + function column_default( $item, $column_name ) { + if( isset( $item[ $column_name ] ) ) { + return $item[ $column_name ]; + } else { + return ''; + } + } + + function no_items() { + echo $this->no_items_message; + } + + function set_sortable_columns( $args = array() ) { + $return_args = array(); + foreach( $args as $k=>$val ) { + if( is_numeric( $k ) ) { + $return_args[ $val ] = array( $val, $val == $this->default_sorting_field ); + } else if( is_string( $k ) ) { + $return_args[ $k ] = array( $val, $k == $this->default_sorting_field ); + } else { + continue; + } + } + $this->sortable_columns = $return_args; + return $this; + } + + function get_sortable_columns() { + return $this->sortable_columns; + } + + function set_columns( $args = array() ) { + if( count( $this->bulk_actions ) ) { + $args = array_merge( array( 'cb' => '' ), $args ); + } + $this->columns = $args; + return $this; + } + + function get_columns() { + return $this->columns; + } + + function set_actions( $args = array() ) { + $this->actions = $args; + return $this; + } + + function get_actions() { + return $this->actions; + } + + function set_bulk_actions( $args = array() ) { + $this->bulk_actions = $args; + return $this; + } + + function get_bulk_actions() { + return $this->bulk_actions; + } + + function column_email( $item ) { + $active = um_get_option( $item['key'] . '_on' ); + if ( $active === '' ) + $active = ! empty( $item['default_active'] ); + return ''. $item['title'] . ''; + } + + + function column_recipients( $item ) { + if ( $item['recipient'] == 'admin' ) + return um_get_option( 'admin_email' ); + else + return __( 'Member', 'ultimate-member' ); + } + + + function column_configure( $item ) { + return ''; + } + + + function wpc_set_pagination_args( $attr = array() ) { + $this->set_pagination_args( $attr ); + } +} + + +$ListTable = new UM_Emails_List_Table( array( + 'singular' => __( 'Email Notification', 'ultimate-member' ), + 'plural' => __( 'Email Notifications', 'ultimate-member' ), + 'ajax' => false +)); + +$per_page = 20; +$paged = $ListTable->get_pagenum(); + +$ListTable->set_columns( array( + 'email' => __( 'Email', 'ultimate-member' ), + 'recipients' => __( 'Recipient(s)', 'ultimate-member' ), + 'configure' => '', +) ); + +$emails = UM()->config()->email_notifications; + +$ListTable->prepare_items(); +$ListTable->items = $emails; +$ListTable->wpc_set_pagination_args( array( 'total_items' => count( $emails ), 'per_page' => $per_page ) ); ?> + +
            + + + + + display(); ?> +
            \ No newline at end of file diff --git a/includes/admin/core/list-tables/roles-list-table.php b/includes/admin/core/list-tables/roles-list-table.php new file mode 100644 index 00000000..05bb9120 --- /dev/null +++ b/includes/admin/core/list-tables/roles-list-table.php @@ -0,0 +1,366 @@ +$role_key ) { + $role_meta = get_option( "um_role_{$role_key}_meta" ); + + if ( empty( $role_meta['_um_is_custom'] ) ) { + unset( $role_keys[array_search( $role_key, $role_keys )] ); + continue; + } + + delete_option( "um_role_{$role_key}_meta" ); + + $role_keys[$k] = 'um_' . $role_key; + } + + //set for users with deleted roles role "Subscriber" + $args = array( + 'blog_id' => get_current_blog_id(), + 'role__in' => $role_keys, + 'number' => -1, + 'count_total' => false, + 'fields' => 'ids', + ); + $users_to_subscriber = get_users( $args ); + if ( ! empty( $users_to_subscriber ) ) { + foreach ( $users_to_subscriber as $user_id ) { + $object_user = get_userdata( $user_id ); + + if ( ! empty( $object_user ) ) { + foreach ( $role_keys as $roleID ) { + $object_user->remove_role( $roleID ); + } + } + + //update user role if it's empty + if ( empty( $object_user->roles ) ) + wp_update_user( array( 'ID' => $user_id, 'role' => 'subscriber' ) ); + } + } + + um_js_redirect( add_query_arg( 'msg', 'd', $redirect ) ); + break; + } + case 'reset': { + $role_keys = array(); + if ( isset( $_REQUEST['id'] ) ) { + check_admin_referer( 'um_role_reset' . $_REQUEST['id'] . get_current_user_id() ); + $role_keys = (array)$_REQUEST['id']; + } elseif( isset( $_REQUEST['item'] ) ) { + check_admin_referer( 'bulk-' . sanitize_key( __( 'Roles', 'ultimate-member' ) ) ); + $role_keys = $_REQUEST['item']; + } + + if ( ! count( $role_keys ) ) + um_js_redirect( $redirect ); + + foreach ( $role_keys as $k=>$role_key ) { + $role_meta = get_option( "um_role_{$role_key}_meta" ); + + if ( ! empty( $role_meta['_um_is_custom'] ) ) { + unset( $role_keys[array_search( $role_key, $role_keys )] ); + continue; + } + + delete_option( "um_role_{$role_key}_meta" ); + } + + um_js_redirect( add_query_arg( 'msg', 'reset', $redirect ) ); + break; + } + } +} + +//remove extra query arg +if ( ! empty( $_GET['_wp_http_referer'] ) ) + um_js_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce'), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ); + +$order_by = 'name'; +$order = ( isset( $_GET['order'] ) && 'asc' == strtolower( $_GET['order'] ) ) ? 'ASC' : 'DESC'; + +if( ! class_exists( 'WP_List_Table' ) ) + require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' ); + + +class UM_Roles_List_Table extends WP_List_Table { + + var $no_items_message = ''; + var $sortable_columns = array(); + var $default_sorting_field = ''; + var $actions = array(); + var $bulk_actions = array(); + var $columns = array(); + + function __construct( $args = array() ){ + $args = wp_parse_args( $args, array( + 'singular' => __( 'item', 'ultimate-member' ), + 'plural' => __( 'items', 'ultimate-member' ), + 'ajax' => false + ) ); + + $this->no_items_message = $args['plural'] . ' ' . __( 'not found.', 'ultimate-member' ); + + parent::__construct( $args ); + + + } + + function __call( $name, $arguments ) { + return call_user_func_array( array( $this, $name ), $arguments ); + } + + function prepare_items() { + $columns = $this->get_columns(); + $hidden = array(); + $sortable = $this->get_sortable_columns(); + $this->_column_headers = array( $columns, $hidden, $sortable ); + } + + function column_default( $item, $column_name ) { + if( isset( $item[ $column_name ] ) ) { + return $item[ $column_name ]; + } else { + return ''; + } + } + + function no_items() { + echo $this->no_items_message; + } + + function set_sortable_columns( $args = array() ) { + $return_args = array(); + foreach( $args as $k=>$val ) { + if( is_numeric( $k ) ) { + $return_args[ $val ] = array( $val, $val == $this->default_sorting_field ); + } else if( is_string( $k ) ) { + $return_args[ $k ] = array( $val, $k == $this->default_sorting_field ); + } else { + continue; + } + } + $this->sortable_columns = $return_args; + return $this; + } + + function get_sortable_columns() { + return $this->sortable_columns; + } + + function set_columns( $args = array() ) { + if( count( $this->bulk_actions ) ) { + $args = array_merge( array( 'cb' => '' ), $args ); + } + $this->columns = $args; + return $this; + } + + function get_columns() { + return $this->columns; + } + + function set_actions( $args = array() ) { + $this->actions = $args; + return $this; + } + + function get_actions() { + return $this->actions; + } + + function set_bulk_actions( $args = array() ) { + $this->bulk_actions = $args; + return $this; + } + + function get_bulk_actions() { + return $this->bulk_actions; + } + + + function column_cb( $item ) { + return sprintf( '', $item['key'] ); + } + + + function column_title( $item ) { + $actions = array(); + + $actions['edit'] = '' . __( 'Edit', 'ultimate-member' ). ''; + + if ( ! empty( $item['_um_is_custom'] ) ) { + $actions['delete'] = '' . __( 'Delete', 'ultimate-member' ). ''; + } else { + $role_meta = get_option( "um_role_{$item['key']}_meta" ); + + if ( ! empty( $role_meta ) ) { + $actions['reset'] = '' . __( 'Reset UM Role meta', 'ultimate-member' ). ''; + } + } + + + + return sprintf('%1$s %2$s', ''. ( ! empty( $item['_um_is_custom'] ) ? 'UM ' : '' ) . $item['name'] . '', $this->row_actions( $actions ) ); + } + + function column_roleid( $item ) { + return ! empty( $item['_um_is_custom'] ) ? 'um_' . $item['key'] : $item['key']; + } + + + function column_core( $item ) { + if ( ! empty( $item['_um_is_custom'] ) ) { + echo ''; + } else { + echo '—'; + } + } + + + function column_admin_access( $item ) { + if ( ! empty( $item['_um_can_access_wpadmin'] ) ) { + echo ''; + } else { + echo __( 'No', 'ultimate-member' ); + } + } + + + function um_set_pagination_args( $attr = array() ) { + $this->set_pagination_args( $attr ); + } +} + + +$ListTable = new UM_Roles_List_Table( array( + 'singular' => __( 'Role', 'ultimate-member' ), + 'plural' => __( 'Roles', 'ultimate-member' ), + 'ajax' => false +)); + +$per_page = 20; +$paged = $ListTable->get_pagenum(); + +$ListTable->set_bulk_actions( array( + 'delete' => __( 'Delete', 'ultimate-member' ) +) ); + +$ListTable->set_columns( array( + 'title' => __( 'Role Title', 'ultimate-member' ), + 'roleid' => __( 'Role ID', 'ultimate-member' ), + 'users' => __( 'No.of Members', 'ultimate-member' ), + 'core' => __( 'UM Custom Role', 'ultimate-member' ), + 'admin_access' => __( 'WP-Admin Access', 'ultimate-member' ), +) ); + +$ListTable->set_sortable_columns( array( + 'title' => 'title' +) ); + +$users_count = count_users(); + +$roles = array(); +$role_keys = get_option( 'um_roles' ); + +if ( $role_keys ) { + foreach ( $role_keys as $role_key ) { + $role_meta = get_option( "um_role_{$role_key}_meta" ); + if ( $role_meta ) { + + $roles['um_' . $role_key] = array( + 'key' => $role_key, + 'users' => ! empty( $users_count['avail_roles']['um_' . $role_key] ) ? $users_count['avail_roles']['um_' . $role_key] : 0 + ); + $roles['um_' . $role_key] = array_merge( $roles['um_' . $role_key], $role_meta ); + } + } +} + +global $wp_roles; + +foreach ( $wp_roles->roles as $roleID => $role_data ) { + if ( in_array( $roleID, array_keys( $roles ) ) ) + continue; + + $roles[$roleID] = array( + 'key' => $roleID, + 'users' => ! empty( $users_count['avail_roles'][$roleID] ) ? $users_count['avail_roles'][$roleID] : 0, + 'name' => $role_data['name'] + ); + + $role_meta = get_option( "um_role_{$roleID}_meta" ); + if ( $role_meta ) + $roles[$roleID] = array_merge( $roles[$roleID], $role_meta ); +} + +switch( strtolower( $order ) ) { + case 'asc': + uasort( $roles, function( $a, $b ) { + $a['name'] = ! empty( $a['_um_is_custom'] ) ? 'UM ' . $a['name'] : $a['name']; + $b['name'] = ! empty( $b['_um_is_custom'] ) ? 'UM ' . $b['name'] : $b['name']; + + return strnatcmp( $a['name'], $b['name'] ); + } ); + break; + case 'desc': + uasort( $roles, function( $a, $b ) { + $a['name'] = ! empty( $a['_um_is_custom'] ) ? 'UM ' . $a['name'] : $a['name']; + $b['name'] = ! empty( $b['_um_is_custom'] ) ? 'UM ' . $b['name'] : $b['name']; + + return strnatcmp( $a['name'], $b['name'] ) * -1; + } ); + break; +} + +$ListTable->prepare_items(); +$ListTable->items = $roles; +$ListTable->um_set_pagination_args( array( 'total_items' => count( $roles ), 'per_page' => $per_page ) ); ?> + +
            +

            + + +

            + +

            ' . __( 'User Role Deleted Successfully.', 'ultimate-member' ) . '

            '; + break; + } + } ?> + +
            + + display(); ?> +
            +
            \ No newline at end of file diff --git a/admin/core/packages/1.3.39.php b/includes/admin/core/packages/1.3.39.php similarity index 95% rename from admin/core/packages/1.3.39.php rename to includes/admin/core/packages/1.3.39.php index 0b07a932..7ec2cac8 100644 --- a/admin/core/packages/1.3.39.php +++ b/includes/admin/core/packages/1.3.39.php @@ -10,7 +10,7 @@ * Target Version: 1.3.39 */ - global $wpdb, $ultimatemember; + global $wpdb; $wpdb->query('INSERT INTO '.$wpdb->usermeta.'(user_id, meta_key, meta_value) SELECT uu.ID, "_um_last_login", uu.user_registered FROM '.$wpdb->users.' AS uu diff --git a/includes/admin/core/packages/2.0.php b/includes/admin/core/packages/2.0.php new file mode 100644 index 00000000..739b0d95 --- /dev/null +++ b/includes/admin/core/packages/2.0.php @@ -0,0 +1,1128 @@ +query( array( + 'post_type' => 'um_form', + 'meta_query' => array( + 'relation' => 'AND', + array( + 'key' => '_um_mode', + 'value' => 'register' + ), + array( + 'key' => '_um_register_use_globals', + 'value' => true + ) + ), + 'fields' => 'ids' +) ); + +$login_forms = $forms_query->query( array( + 'post_type' => 'um_form', + 'meta_query' => array( + 'relation' => 'AND', + array( + 'key' => '_um_mode', + 'value' => 'login' + ), + array( + 'key' => '_um_login_use_globals', + 'value' => true + ) + ), + 'fields' => 'ids' +) ); + +$profile_forms = $forms_query->query( array( + 'post_type' => 'um_form', + 'meta_query' => array( + 'relation' => 'AND', + array( + 'key' => '_um_mode', + 'value' => 'profile' + ), + array( + 'key' => '_um_profile_use_globals', + 'value' => true + ) + ), + 'fields' => 'ids' +) ); + +$css = ''; + +$active_color = um_get_option( 'active_color' ); +if ( $active_color ) { + $css .= " +.um .um-tip:hover, +.um .um-field-radio.active:not(.um-field-radio-state-disabled) i, +.um .um-field-checkbox.active:not(.um-field-radio-state-disabled) i, +.um .um-member-name a:hover, +.um .um-member-more a:hover, +.um .um-member-less a:hover, +.um .um-members-pagi a:hover, +.um .um-cover-add:hover, +.um .um-profile-subnav a.active, +.um .um-item-meta a, +.um-account-name a:hover, +.um-account-nav a.current, +.um-account-side li a.current span.um-account-icon, +.um-account-side li a.current:hover span.um-account-icon, +.um-dropdown li a:hover, +i.um-active-color, +span.um-active-color +{ + color: $active_color; +} + +.um .um-field-group-head, +.picker__box, +.picker__nav--prev:hover, +.picker__nav--next:hover, +.um .um-members-pagi span.current, +.um .um-members-pagi span.current:hover, +.um .um-profile-nav-item.active a, +.um .um-profile-nav-item.active a:hover, +.upload, +.um-modal-header, +.um-modal-btn, +.um-modal-btn.disabled, +.um-modal-btn.disabled:hover, +div.uimob800 .um-account-side li a.current, +div.uimob800 .um-account-side li a.current:hover +{ + background: $active_color; +} +"; +} + +$secondary_color = um_get_option( 'secondary_color' ); +if ( $secondary_color ) { + $css .= " +.um .um-field-group-head:hover, +.picker__footer, +.picker__header, +.picker__day--infocus:hover, +.picker__day--outfocus:hover, +.picker__day--highlighted:hover, +.picker--focused .picker__day--highlighted, +.picker__list-item:hover, +.picker__list-item--highlighted:hover, +.picker--focused .picker__list-item--highlighted, +.picker__list-item--selected, +.picker__list-item--selected:hover, +.picker--focused .picker__list-item--selected { + background: $secondary_color; +} +"; +} + +$css .= " +.um { + margin-left: auto!important; + margin-right: auto!important; +}"; + +$primary_btn_color = um_get_option( 'primary_btn_color' ); +if ( $primary_btn_color ) { + $css .= " +.um input[type=submit]:disabled:hover { + background: $primary_btn_color; +} + +.um input[type=submit].um-button, +.um input[type=submit].um-button:focus, +.um a.um-button, +.um a.um-button.um-disabled:hover, +.um a.um-button.um-disabled:focus, +.um a.um-button.um-disabled:active { + background: $primary_btn_color; +} + +.um a.um-link { + color: $primary_btn_color; +} +"; +} + +$primary_btn_hover = um_get_option( 'primary_btn_hover' ); +if ( $primary_btn_hover ) { + $css .= " +.um input[type=submit].um-button:hover, +.um a.um-button:hover { + background-color: $primary_btn_hover; +} + +.um a.um-link:hover, +.um a.um-link-hvr:hover { + color: $primary_btn_hover; +} +"; +} + +$primary_btn_text = um_get_option( 'primary_btn_text' ); +if ( $primary_btn_text ) { + $css .= " +.um .um-button { + color: $primary_btn_text; +} +"; +} + +$secondary_btn_color = um_get_option( 'secondary_btn_color' ); +if ( $secondary_btn_color ) { + $css .= " +.um .um-button.um-alt, +.um input[type=submit].um-button.um-alt { + background: $secondary_btn_color; +} +"; +} + +$secondary_btn_hover = um_get_option( 'secondary_btn_hover' ); +if ( $secondary_btn_hover ) { + $css .= " +.um .um-button.um-alt:hover, +.um input[type=submit].um-button.um-alt:hover{ + background: $secondary_btn_hover; +} +"; +} + +$secondary_btn_text = um_get_option( 'secondary_btn_text' ); +if ( $secondary_btn_text ) { + $css .= " +.um .um-button.um-alt, +.um input[type=submit].um-button.um-alt { + color: $secondary_btn_text; +} +"; +} + +$help_tip_color = um_get_option( 'help_tip_color' ); +if ( $help_tip_color ) { + $css .= " +.um .um-tip { + color: $help_tip_color; +} +"; +} + +$form_field_label = um_get_option( 'form_field_label' ); +if ( $form_field_label ) { + $css .= " +.um .um-field-label { + color: $form_field_label; +} +"; +} + +$form_border = um_get_option( 'form_border' ); +if ( $form_border ) { + $css .= " +.um .um-form input[type=text], +.um .um-form input[type=tel], +.um .um-form input[type=number], +.um .um-form input[type=password], +.um .um-form textarea, +.um .upload-progress, +.select2-container .select2-choice, +.select2-drop, +.select2-container-multi .select2-choices, +.select2-drop-active, +.select2-drop.select2-drop-above +{ + border: $form_border !important; +} + +.um .um-form .select2-container-multi .select2-choices .select2-search-field input[type=text] { + border: none !important +} +"; +} + +$form_border_hover = um_get_option( 'form_border_hover' ); +if ( $form_border_hover ) { + $css .= " +.um .um-form input[type=text]:focus, +.um .um-form input[type=tel]:focus, +.um .um-form input[type=number]:focus, +.um .um-form input[type=password]:focus, +.um .um-form .um-datepicker.picker__input.picker__input--active, +.um .um-form .um-datepicker.picker__input.picker__input--target, +.um .um-form textarea:focus { + border: $form_border_hover !important; +} +"; +} + +$form_bg_color = um_get_option( 'form_bg_color' ); +if ( $form_bg_color ) { + $css .= " +.um .um-form input[type=text], +.um .um-form input[type=tel], +.um .um-form input[type=number], +.um .um-form input[type=password], +.um .um-form textarea, +.select2-container .select2-choice, +.select2-container-multi .select2-choices +{ + background-color: $form_bg_color; +} +"; +} + +$form_bg_color_focus = um_get_option( 'form_bg_color_focus' ); +if ( $form_bg_color_focus ) { + $css .= " +.um .um-form input[type=text]:focus, +.um .um-form input[type=tel]:focus, +.um .um-form input[type=number]:focus, +.um .um-form input[type=password]:focus, +.um .um-form textarea:focus { + background-color: $form_bg_color_focus; +} +"; +} + +$form_text_color = um_get_option( 'form_text_color' ); +if ( $form_text_color ) { + $css .= " +.um .um-form input[type=text], +.um .um-form input[type=tel], +.um .um-form input[type=password], +.um .um-form textarea +{ + color: $form_text_color; +} + +.um .um-form input:-webkit-autofill { + -webkit-box-shadow:0 0 0 50px white inset; /* Change the color to your own background color */ + -webkit-text-fill-color: $form_text_color; +} + +.um .um-form input:-webkit-autofill:focus { + -webkit-box-shadow: none,0 0 0 50px white inset; + -webkit-text-fill-color: $form_text_color; +} +"; +} + +$form_placeholder = um_get_option( 'form_placeholder' ); +if ( $form_placeholder ) { + $css .= " +.um .um-form ::-webkit-input-placeholder +{ + color: $form_placeholder; + opacity: 1 !important; +} + +.um .um-form ::-moz-placeholder +{ + color: $form_placeholder; + opacity: 1 !important; +} + +.um .um-form ::-moz-placeholder +{ + color: $form_placeholder; + opacity: 1 !important; +} + +.um .um-form ::-ms-input-placeholder +{ + color: $form_placeholder; + opacity: 1 !important; +} + +.select2-default, +.select2-default *, +.select2-container-multi .select2-choices .select2-search-field input +{ + color: $form_placeholder; +} +"; +} + +$form_icon_color = um_get_option( 'form_icon_color' ); +if ( $form_icon_color ) { + $css .= " +.um .um-field-icon i, +.select2-container .select2-choice .select2-arrow:before, +.select2-search:before, +.select2-search-choice-close:before +{ + color: $form_icon_color; +} +"; +} + +$form_asterisk_color = um_get_option( 'form_asterisk_color' ); +if ( $form_asterisk_color ) { + $css .= " +.um span.um-req +{ + color: $form_asterisk_color; +} +"; +} + + +$profile_photocorner = um_get_option( 'profile_photocorner' ); +if ( $profile_photocorner == 1 ) { + $css .= " +.um .um-profile-photo a.um-profile-photo-img, +.um .um-profile-photo img, +.um .um-profile-photo span.um-profile-photo-overlay +{ + -moz-border-radius: 999px !important; + -webkit-border-radius: 999px !important; + border-radius: 999px !important +} +"; +} else if ( $profile_photocorner == 2 ) { + $css .= " +.um .um-profile-photo a.um-profile-photo-img, +.um .um-profile-photo img, +.um .um-profile-photo span.um-profile-photo-overlay +{ + -moz-border-radius: 4px !important; + -webkit-border-radius: 4px !important; + border-radius: 4px !important +} +"; +} else if ( $profile_photocorner == 3 ) { + $css .= " +.um .um-profile-photo a.um-profile-photo-img, +.um .um-profile-photo img, +.um .um-profile-photo span.um-profile-photo-overlay +{ + -moz-border-radius: 0px !important; + -webkit-border-radius: 0px !important; + border-radius: 0px !important +} +"; +} + +$profile_main_bg = um_get_option( 'profile_main_bg' ); +if ( $profile_main_bg ) { + $css .= " +.um-profile { + background-color: $profile_main_bg; +} +"; +} + +$profile_header_bg = um_get_option( 'profile_header_bg' ); +if ( $profile_header_bg ) { + $css .= " +.um-profile.um .um-header { + background-color: $profile_header_bg; +} +"; +} + +$profile_header_text = um_get_option( 'profile_header_text' ); +if ( $profile_header_text ) { + $css .= " +.um-profile.um .um-profile-meta { + color: $profile_header_text; +} +"; +} + +$profile_header_link_color = um_get_option( 'profile_header_link_color' ); +if ( $profile_header_link_color ) { + $css .= " +.um-profile.um .um-name a { + color: $profile_header_link_color; +} +"; +} + +$profile_header_link_hcolor = um_get_option( 'profile_header_link_hcolor' ); +if ( $profile_header_link_hcolor ) { + $css .= " +.um-profile.um .um-name a:hover { + color: $profile_header_link_hcolor; +} +"; +} + +$profile_header_icon_color = um_get_option( 'profile_header_icon_color' ); +if ( $profile_header_icon_color ) { + $css .= " +.um-profile.um .um-profile-headericon a { + color: $profile_header_icon_color; +} +"; +} + +$profile_header_icon_hcolor = um_get_option( 'profile_header_icon_hcolor' ); +if ( $profile_header_icon_hcolor ) { + $css .= " +.um-profile.um .um-profile-headericon a:hover, +.um-profile.um .um-profile-edit-a.active { + color: $profile_header_icon_hcolor; +} +"; +} + + +foreach ( $registration_forms as $form_id ) { + + $align = get_post_meta( $form_id, '_um_register_align', true ); + if ( $align && $align != 'center' ) { + $css .= " +.um-$form_id.um { + float: $align; +} +"; + } + + $primary_btn_color = get_post_meta( $form_id, '_um_register_primary_btn_color', true ); + if ( $primary_btn_color ) { + $css .= " +.um-$form_id.um input[type=submit]:disabled:hover { + background: $primary_btn_color; +} + +.um-$form_id.um input[type=submit].um-button, +.um-$form_id.um input[type=submit].um-button:focus, +.um-$form_id.um a.um-button, +.um-$form_id.um a.um-button.um-disabled:hover, +.um-$form_id.um a.um-button.um-disabled:focus, +.um-$form_id.um a.um-button.um-disabled:active { + background: $primary_btn_color; +} + +.um-$form_id.um a.um-link { + color: $primary_btn_color; +} +"; + } + + $primary_btn_hover = get_post_meta( $form_id, '_um_register_primary_btn_hover', true ); + if ( $primary_btn_hover ) { + $css .= " +.um-$form_id.um input[type=submit].um-button:hover, +.um-$form_id.um a.um-button:hover { + background-color: $primary_btn_hover; +} + +.um-$form_id.um a.um-link:hover, +.um-$form_id.um a.um-link-hvr:hover { + color: $primary_btn_hover; +} +"; + } + + $primary_btn_text = get_post_meta( $form_id, '_um_register_primary_btn_text', true ); + if ( $primary_btn_text ) { + $css .= " +.um-$form_id.um .um-button { + color: $primary_btn_text; +} +"; + } + + $secondary_button = get_post_meta( $form_id, '_um_register_secondary_btn', true ); + if ( $secondary_button ) { + + $secondary_btn_color = get_post_meta( $form_id, '_um_register_secondary_btn_color', true ); + if ( $secondary_btn_color ) { + $css .= " +.um-$form_id.um .um-button.um-alt, +.um-$form_id.um input[type=submit].um-button.um-alt { + background: $secondary_btn_color; +} +"; + } + + $secondary_btn_hover = get_post_meta( $form_id, '_um_register_secondary_btn_hover', true ); + if ( $secondary_btn_hover ) { + $css .= " +.um-$form_id.um .um-button.um-alt:hover, +.um-$form_id.um input[type=submit].um-button.um-alt:hover{ + background: $secondary_btn_hover; +} +"; + } + + $secondary_btn_text = get_post_meta( $form_id, '_um_register_secondary_btn_text', true ); + if ( $secondary_btn_text ) { + $css .= " +.um-$form_id.um .um-button.um-alt, +.um-$form_id.um input[type=submit].um-button.um-alt { + color: $secondary_btn_text; +} +"; + } + } +} + + +foreach ( $login_forms as $form_id ) { + + $align = get_post_meta( $form_id, '_um_login_align', true ); + if ( $align && $align != 'center' ) { + $css .= " +.um-$form_id.um { + float: $align; +} +"; + } + + $primary_btn_color = get_post_meta( $form_id, '_um_login_primary_btn_color', true ); + if ( $primary_btn_color ) { + $css .= " +.um-$form_id.um input[type=submit]:disabled:hover { + background: $primary_btn_color; +} + +.um-$form_id.um input[type=submit].um-button, +.um-$form_id.um input[type=submit].um-button:focus, +.um-$form_id.um a.um-button, +.um-$form_id.um a.um-button.um-disabled:hover, +.um-$form_id.um a.um-button.um-disabled:focus, +.um-$form_id.um a.um-button.um-disabled:active { + background: $primary_btn_color; +} + +.um-$form_id.um a.um-link { + color: $primary_btn_color; +} +"; + } + + $primary_btn_hover = get_post_meta( $form_id, '_um_login_primary_btn_hover', true ); + if ( $primary_btn_hover ) { + $css .= " +.um-$form_id.um input[type=submit].um-button:hover, +.um-$form_id.um a.um-button:hover { + background-color: $primary_btn_hover; +} + +.um-$form_id.um a.um-link:hover, +.um-$form_id.um a.um-link-hvr:hover { + color: $primary_btn_hover; +} +"; + } + + $primary_btn_text = get_post_meta( $form_id, '_um_login_primary_btn_text', true ); + if ( $primary_btn_text ) { + $css .= " +.um-$form_id.um .um-button { + color: $primary_btn_text; +} +"; + } + + $secondary_button = get_post_meta( $form_id, '_um_login_secondary_btn', true ); + if ( $secondary_button ) { + + $secondary_btn_color = get_post_meta( $form_id, '_um_login_secondary_btn_color', true ); + if ( $secondary_btn_color ) { + $css .= " +.um-$form_id.um .um-button.um-alt, +.um-$form_id.um input[type=submit].um-button.um-alt { + background: $secondary_btn_color; +} +"; + } + + $secondary_btn_hover = get_post_meta( $form_id, '_um_login_secondary_btn_hover', true ); + if ( $secondary_btn_hover ) { + $css .= " +.um-$form_id.um .um-button.um-alt:hover, +.um-$form_id.um input[type=submit].um-button.um-alt:hover{ + background: $secondary_btn_hover; +} +"; + } + + $secondary_btn_text = get_post_meta( $form_id, '_um_login_secondary_btn_text', true ); + if ( $secondary_btn_text ) { + $css .= " +.um-$form_id.um .um-button.um-alt, +.um-$form_id.um input[type=submit].um-button.um-alt { + color: $secondary_btn_text; +} +"; + } + } +} + + +foreach ( $profile_forms as $form_id ) { + $align = get_post_meta( $form_id, '_um_profile_align', true ); + if ( $align && $align != 'center' ) { + $css .= " +.um-$form_id.um { + float: $align; +} +"; + } + + $primary_btn_color = get_post_meta( $form_id, '_um_profile_primary_btn_color', true ); + if ( $primary_btn_color ) { + $css .= " +.um-$form_id.um input[type=submit]:disabled:hover { + background: $primary_btn_color; +} + +.um-$form_id.um input[type=submit].um-button, +.um-$form_id.um input[type=submit].um-button:focus, +.um-$form_id.um a.um-button, +.um-$form_id.um a.um-button.um-disabled:hover, +.um-$form_id.um a.um-button.um-disabled:focus, +.um-$form_id.um a.um-button.um-disabled:active { + background: $primary_btn_color; +} + +.um-$form_id.um a.um-link { + color: $primary_btn_color; +} +"; + } + + $primary_btn_hover = get_post_meta( $form_id, '_um_profile_primary_btn_hover', true ); + if ( $primary_btn_hover ) { + $css .= " +.um-$form_id.um input[type=submit].um-button:hover, +.um-$form_id.um a.um-button:hover { + background-color: $primary_btn_hover; +} + +.um-$form_id.um a.um-link:hover, +.um-$form_id.um a.um-link-hvr:hover { + color: $primary_btn_hover; +} +"; + } + + $primary_btn_text = get_post_meta( $form_id, '_um_profile_primary_btn_text', true ); + if ( $primary_btn_text ) { + $css .= " +.um-$form_id.um .um-button { + color: $primary_btn_text; +} +"; + } + + $secondary_button = get_post_meta( $form_id, '_um_profile_secondary_btn', true ); + if ( $secondary_button ) { + + $secondary_btn_color = get_post_meta( $form_id, '_um_profile_secondary_btn_color', true ); + if ( $secondary_btn_color ) { + $css .= " +.um-$form_id.um .um-button.um-alt, +.um-$form_id.um input[type=submit].um-button.um-alt { + background: $secondary_btn_color; +} +"; + } + + $secondary_btn_hover = get_post_meta( $form_id, '_um_profile_secondary_btn_hover', true ); + if ( $secondary_btn_hover ) { + $css .= " +.um-$form_id.um .um-button.um-alt:hover, +.um-$form_id.um input[type=submit].um-button.um-alt:hover{ + background: $secondary_btn_hover; +} +"; + } + + $secondary_btn_text = get_post_meta( $form_id, '_um_profile_secondary_btn_text', true ); + if ( $secondary_btn_text ) { + $css .= " +.um-$form_id.um .um-button.um-alt, +.um-$form_id.um input[type=submit].um-button.um-alt { + color: $secondary_btn_text; +} +"; + } + } + + $profile_photocorner = get_post_meta( $form_id, '_um_profile_photocorner', true ); + if ( $profile_photocorner == 1 ) { + $css .= " +.um-$form_id.um .um-profile-photo a.um-profile-photo-img, +.um-$form_id.um .um-profile-photo img, +.um-$form_id.um .um-profile-photo span.um-profile-photo-overlay +{ + -moz-border-radius: 999px !important; + -webkit-border-radius: 999px !important; + border-radius: 999px !important +} +"; + } else if ( $profile_photocorner == 2 ) { + $css .= " +.um-$form_id.um .um-profile-photo a.um-profile-photo-img, +.um-$form_id.um .um-profile-photo img, +.um-$form_id.um .um-profile-photo span.um-profile-photo-overlay +{ + -moz-border-radius: 4px !important; + -webkit-border-radius: 4px !important; + border-radius: 4px !important +} +"; + } else if ( $profile_photocorner == 3 ) { + $css .= " +.um-$form_id.um .um-profile-photo a.um-profile-photo-img, +.um-$form_id.um .um-profile-photo img, +.um-$form_id.um .um-profile-photo span.um-profile-photo-overlay +{ + -moz-border-radius: 0px !important; + -webkit-border-radius: 0px !important; + border-radius: 0px !important +} +"; + } + + $profile_main_bg = get_post_meta( $form_id, '_um_profile_main_bg', true ); + if ( $profile_main_bg ) { + $css .= " +.um-$form_id.um-profile { + background-color: $profile_main_bg; +} +"; + } + + $main_text_color = get_post_meta( $form_id, '_um_profile_main_text_color', true ); + if ( $main_text_color ) { + $css .= " +.um-$form_id.um .um-profile-body.main *{ + color: $main_text_color; +} +"; + } + + $profile_header_bg = get_post_meta( $form_id, '_um_profile_header_bg', true ); + if ( $profile_header_bg ) { + $css .= " +.um-$form_id.um .um-header { + background-color: $profile_header_bg; +} +"; + } + + $profile_header_text = get_post_meta( $form_id, '_um_profile_header_text', true ); + if ( $profile_header_text ) { + $css .= " +.um-$form_id.um .um-profile-meta { + color: $profile_header_text; +} +"; + } + + + $profile_header_link_color = get_post_meta( $form_id, '_um_profile_header_link_color', true ); + if ( $profile_header_link_color ) { + $css .= " +.um-$form_id.um .um-name a { + color: $profile_header_link_color; +} +"; + } + + $profile_header_link_hcolor = get_post_meta( $form_id, '_um_profile_header_link_hcolor', true ); + if ( $profile_header_link_hcolor ) { + $css .= " +.um-$form_id.um .um-name a:hover { + color: $profile_header_link_hcolor; +} +"; + } + + $profile_header_icon_color = get_post_meta( $form_id, '_um_profile_header_icon_color', true ); + if ( $profile_header_icon_color ) { + $css .= " +.um-$form_id.um .um-profile-headericon a { + color: $profile_header_icon_color; +} +"; + } + + $profile_header_icon_hcolor = get_post_meta( $form_id, '_um_profile_header_icon_hcolor', true ); + if ( $profile_header_icon_hcolor ) { + $css .= " +.um-$form_id.um .um-profile-headericon a:hover, +.um-$form_id.um .um-profile-edit-a.active { + color: $profile_header_icon_hcolor; +} +"; + } +} + +$uploads = wp_upload_dir(); +$upload_dir = $uploads['basedir'] . DIRECTORY_SEPARATOR . 'ultimatemember' . DIRECTORY_SEPARATOR; +$css_doc_file = fopen( $upload_dir. 'um_old_settings.css', 'w+' ); +fwrite( $css_doc_file, $css ); +fclose( $css_doc_file ); + +//remove old options +um_remove_option( 'active_color' ); +um_remove_option( 'secondary_color' ); +um_remove_option( 'profile_align' ); +um_remove_option( 'register_align' ); +um_remove_option( 'login_align' ); +um_remove_option( 'primary_btn_color' ); +um_remove_option( 'primary_btn_hover' ); +um_remove_option( 'primary_btn_text' ); +um_remove_option( 'secondary_btn_color' ); +um_remove_option( 'secondary_btn_hover' ); +um_remove_option( 'secondary_btn_text' ); +um_remove_option( 'help_tip_color' ); +um_remove_option( 'form_field_label' ); +um_remove_option( 'form_border' ); +um_remove_option( 'form_border_hover' ); +um_remove_option( 'form_bg_color' ); +um_remove_option( 'form_bg_color_focus' ); +um_remove_option( 'form_text_color' ); +um_remove_option( 'form_placeholder' ); +um_remove_option( 'form_icon_color' ); +um_remove_option( 'form_asterisk_color' ); +um_remove_option( 'profile_photocorner' ); +um_remove_option( 'profile_main_bg' ); +um_remove_option( 'profile_header_bg' ); +um_remove_option( 'profile_header_text' ); +um_remove_option( 'profile_header_link_color' ); +um_remove_option( 'profile_header_link_hcolor' ); +um_remove_option( 'profile_header_icon_color' ); +um_remove_option( 'profile_header_icon_hcolor' ); + +//remove duplicates for UM Pages settings +delete_option( 'um_core_pages' ); + + + +//UM Roles to WP Roles +//all UM Roles from post type +$role_keys = array(); + +register_post_type( 'um_role', array( + 'labels' => array( + 'name' => __( 'User Roles' ), + 'singular_name' => __( 'User Role' ), + 'add_new' => __( 'Add New' ), + 'add_new_item' => __('Add New User Role' ), + 'edit_item' => __('Edit User Role'), + 'not_found' => __('You did not create any user roles yet'), + 'not_found_in_trash' => __('Nothing found in Trash'), + 'search_items' => __('Search User Roles') + ), + 'show_ui' => true, + 'show_in_menu' => false, + 'public' => false, + 'supports' => array('title') +) ); + + +$um_roles = get_posts( array( + 'post_type' => 'um_role', + 'posts_per_page' => -1, + 'post_status' => 'publish' +) ); + + +if ( ! empty( $um_roles ) ) { + foreach ( $um_roles as $um_role ) { + $role_key = sanitize_title( $um_role->post_title ); + + $role_keys[] = $role_key; + + $all_role_metadata = $wpdb->get_results( $wpdb->prepare( + "SELECT pm.meta_key, + pm.meta_value + FROM {$wpdb->postmeta} pm + WHERE pm.post_id = %d AND + pm.meta_key LIKE %s", + $um_role->ID, + "_um_%" + ), ARRAY_A ); + + $role_metadata = array(); + if ( ! empty( $all_role_metadata ) ) { + foreach( $all_role_metadata as $metadata ) { + $role_metadata[$metadata['meta_key']] = $metadata['meta_value']; + } + } + + $role_meta = array_merge( $role_metadata, array( + 'name' => $um_role->post_title, + '_um_is_custom' => true, + ) ); + + if ( ! empty( $role_meta['_um_core'] ) ) + unset( $role_meta['_um_core'] ); + + update_option( "um_role_{$role_key}_meta", $role_meta ); + } + + + //get all users with UM role + $args = array( + 'meta_query' => array( + array( + 'key' => 'role', + 'compare' => 'EXISTS', + ) + ), + 'number' => '', + 'count_total' => false, + ); + $all_users = get_users( $args ); + //update roles for users + foreach ( $all_users as $k => $user ) { + $user_roleID = get_user_meta( $user->ID, 'role', true ); + + if ( ! empty( $user_roleID ) ) { + $userdata = get_userdata( $user->ID ); + $userdata->add_role( 'um_' . $user_roleID ); + } + } +} + +update_option( 'um_roles', $role_keys ); + + + +//Content Restriction transfer +$roles_array = UM()->roles()->get_roles( false, array( 'administrator' ) ); + +$posts = get_posts( array( + 'meta_key' => '_um_custom_access_settings', + 'meta_value' => '1', + 'fields' => 'ids' +) ); +if ( ! empty( $posts ) ) { + foreach ( $posts as $post_id ) { + $um_accessible = get_post_meta( $post_id, '_um_accessible', true ); + $um_access_roles = get_post_meta( $post_id, '_um_access_roles', true ); + $um_access_redirect = ( $um_accessible == '2' ) ? get_post_meta( $post_id, '_um_access_redirect', true ) : get_post_meta( $post_id, '_um_access_redirect2', true ); + + $access_roles = array(); + if ( ! empty( $um_access_roles ) ) { + foreach ( $roles_array as $role ) { + if ( in_array( substr( $role, 3 ), $um_access_roles ) ) + $access_roles[$role] = '1'; + else + $access_roles[$role] = '0'; + } + } else { + foreach ( $roles_array as $role ) { + $access_roles[$role] = '0'; + } + } + $restrict_options = array( + '_um_custom_access_settings' => '1', + '_um_accessible' => $um_accessible, + '_um_access_roles' => $access_roles, + '_um_noaccess_action' => '1', + '_um_restrict_by_custom_message' => '0', + '_um_restrict_custom_message' => '', + '_um_access_redirect' => '1', + '_um_access_redirect_url' => ! empty( $um_access_redirect ) ? $um_access_redirect : '', + '_um_access_hide_from_queries' => '0', + ); + + update_post_meta( $post_id, 'um_content_restriction', $restrict_options ); + } +} + + +$all_taxonomies = get_taxonomies( array( 'public' => true ) ); +$exclude_taxonomies = array( + 'nav_menu', + 'link_category', + 'post_format', + 'um_user_tag', + 'um_hashtag', +); + +foreach ( $all_taxonomies as $key => $taxonomy ) { + if ( in_array( $key , $exclude_taxonomies ) ) + continue; + + $terms = get_terms( array( + 'taxonomy' => $taxonomy, + 'hide_empty' => false, + 'fields' => 'ids' + ) ); + + foreach ( $terms as $term_id ) { + $term_meta = get_option( "{$taxonomy}_{$term_id}" ); + + if ( empty( $term_meta ) ) + continue; + + $um_accessible = $term_meta['_um_accessible']; + $um_access_roles = $term_meta['_um_access_roles']; + $um_access_redirect = ( $um_accessible == '2' ) ? $term_meta['_um_access_redirect'] : $term_meta['_um_access_redirect2']; + + $access_roles = array(); + if ( ! empty( $um_access_roles ) ) { + foreach ( $roles_array as $role ) { + if ( in_array( substr( $role, 3 ), $um_access_roles ) ) + $access_roles[$role] = '1'; + else + $access_roles[$role] = '0'; + } + } else { + foreach ( $roles_array as $role ) { + $access_roles[$role] = '0'; + } + } + + $restrict_options = array( + '_um_custom_access_settings' => '1', + '_um_accessible' => $um_accessible, + '_um_access_roles' => $access_roles, + '_um_noaccess_action' => '1', + '_um_restrict_by_custom_message' => '0', + '_um_restrict_custom_message' => '', + '_um_access_redirect' => '1', + '_um_access_redirect_url' => ! empty( $um_access_redirect ) ? $um_access_redirect : '', + '_um_access_hide_from_queries' => '0', + ); + + update_term_meta( $term_id, 'um_content_restriction', $restrict_options ); + } +} + + + +//for metadata for all UM forms +$forms = get_posts( array( + 'post_type' => 'um_form', + 'numberposts' => -1, + 'fields' => 'ids' +) ); + +foreach ( $forms as $form_id ) { + $form_type = get_post_meta( $form_id, '_um_mode', true ); + + if ( ! empty( $form_type ) ) { + $use_globals = get_post_meta( $form_id, "_um_{$form_type}_use_globals", true ); + $use_custom_settings = empty( $use_globals ) ? true : false; + + update_post_meta( $form_id, "_um_{$form_type}_use_custom_settings", $use_custom_settings ); + delete_post_meta( $form_id, "_um_{$form_type}_use_globals" ); + } +} \ No newline at end of file diff --git a/includes/admin/core/um-admin-actions-modal.php b/includes/admin/core/um-admin-actions-modal.php new file mode 100644 index 00000000..0d10bb54 --- /dev/null +++ b/includes/admin/core/um-admin-actions-modal.php @@ -0,0 +1,87 @@ +
            metabox(); + + if ( isset( $field_args['conditional_support'] ) && $field_args['conditional_support'] == 0 ) + return; + + ?> + +
            + + in_edit = true; $metabox->edit_array = $edit_array; ?> + tooltip( __( 'Here you can setup conditional logic to show/hide this field based on specific fields value or conditions', 'ultimate-member' ) ); ?> + + tooltip( __( 'Here you can setup conditional logic to show/hide this field based on specific fields value or conditions', 'ultimate-member' ) ); ?> + + +
            + +

            +
            + + $arr ) { + + if ( $k == 0 ) $k = ''; + ?> + +
            + + field_input( '_conditional_action' . $k, $form_id ); ?> + field_input( '_conditional_field' . $k , $form_id ); ?> + field_input( '_conditional_operator' . $k, $form_id ); ?> + field_input( '_conditional_value' . $k, $form_id ); ?> + + +

            + +

            + + +
            +
            + + + +
            + + field_input( '_conditional_action', $form_id ); ?> + field_input( '_conditional_field', $form_id ); ?> + field_input( '_conditional_operator', $form_id ); ?> + field_input( '_conditional_value', $form_id ); ?> + +

            + +
            +
            + + + +
            + +
            + + user->id ); + do_action("um_admin_custom_hook_{$action}", UM()->user()->id ); break; case 'um_put_as_pending': - $ultimatemember->user->pending(); + UM()->user()->pending(); break; case 'um_approve_membership': case 'um_reenable': - $ultimatemember->user->approve(); + UM()->user()->approve(); break; case 'um_reject_membership': - $ultimatemember->user->reject(); + UM()->user()->reject(); break; case 'um_resend_activation': - $ultimatemember->user->email_pending(); + UM()->user()->email_pending(); break; case 'um_deactivate': - $ultimatemember->user->deactivate(); + UM()->user()->deactivate(); break; case 'um_delete': if ( is_admin() ) wp_die('This action is not allowed in backend.','ultimate-member'); - $ultimatemember->user->delete(); + UM()->user()->delete(); break; } diff --git a/includes/admin/core/um-admin-actions.php b/includes/admin/core/um-admin-actions.php new file mode 100644 index 00000000..6ca9c99e --- /dev/null +++ b/includes/admin/core/um-admin-actions.php @@ -0,0 +1,226 @@ +post_type ) || $post->post_type != 'page' ) + return $fields; + + $fields[] = array( + 'id' => '_um_wpml_user', + 'type' => 'checkbox', + 'label' => __( 'This is a translation of UM profile page?', 'ultimate-member' ), + 'value' => ! empty( $data['_um_wpml_user'] ) ? $data['_um_wpml_user'] : 0 + ); + + $fields[] = array( + 'id' => '_um_wpml_account', + 'type' => 'checkbox', + 'label' => __( 'This is a translation of UM account page?', 'ultimate-member' ), + 'value' => ! empty( $data['_um_wpml_account'] ) ? $data['_um_wpml_account'] : 0 + ); + + return $fields; + } + + + /*** + *** @clear user cache + ***/ + add_action('um_admin_do_action__user_cache', 'um_admin_do_action__user_cache'); + function um_admin_do_action__user_cache( $action ){ + global $wpdb; + if ( !is_admin() || !current_user_can('manage_options') ) die(); + + + $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE 'um_cache_userdata_%'" ); + + + $url = admin_url('admin.php?page=ultimatemember'); + $url = add_query_arg('update','cleared_cache',$url); + exit( wp_redirect($url) ); + } + + /*** + *** @purge temp + ***/ + add_action('um_admin_do_action__purge_temp', 'um_admin_do_action__purge_temp'); + function um_admin_do_action__purge_temp( $action ){ + if ( !is_admin() || !current_user_can('manage_options') ) die(); + + UM()->files()->remove_dir( UM()->files()->upload_temp ); + + $url = remove_query_arg('um_adm_action', UM()->permalinks()->get_current_url() ); + $url = add_query_arg('update','purged_temp',$url); + exit( wp_redirect($url) ); + } + + /*** + *** @duplicate form + ***/ + add_action('um_admin_do_action__duplicate_form', 'um_admin_do_action__duplicate_form'); + function um_admin_do_action__duplicate_form( $action ) { + if ( !is_admin() || !current_user_can('manage_options') ) die(); + if ( !isset($_REQUEST['post_id']) || !is_numeric( $_REQUEST['post_id'] ) ) die(); + + $post_id = $_REQUEST['post_id']; + + $n = array( + 'post_type' => 'um_form', + 'post_title' => sprintf( __( 'Duplicate of %s', 'ultimate-member' ), get_the_title( $post_id ) ), + 'post_status' => 'publish', + 'post_author' => get_current_user_id(), + ); + + $n_id = wp_insert_post( $n ); + + $n_fields = get_post_custom( $post_id ); + foreach ( $n_fields as $key => $value ) { + + if ( $key == '_um_custom_fields' ) { + $the_value = unserialize( $value[0] ); + } else { + $the_value = $value[0]; + } + + update_post_meta( $n_id, $key, $the_value ); + + } + + delete_post_meta($n_id, '_um_core'); + + $url = admin_url('edit.php?post_type=um_form'); + $url = add_query_arg('update','form_duplicated',$url); + + exit( wp_redirect( $url ) ); + + } + + /*** + *** @download a language remotely + ***/ + add_action('um_admin_do_action__um_language_downloader', 'um_admin_do_action__um_language_downloader'); + function um_admin_do_action__um_language_downloader( $action ){ + if ( !is_admin() || !current_user_can('manage_options') ) die(); + + $locale = get_option('WPLANG'); + if ( !$locale ) return; + if ( !isset( UM()->available_languages[$locale] ) ) return; + + $path = UM()->files()->upload_basedir; + $path = str_replace('/uploads/ultimatemember','',$path); + $path = $path . '/languages/plugins/'; + $path = str_replace('//','/',$path); + + $remote = 'https://ultimatemember.com/wp-content/languages/plugins/ultimatemember-' . $locale . '.po'; + $remote2 = 'https://ultimatemember.com/wp-content/languages/plugins/ultimatemember-' . $locale . '.mo'; + + $remote_tmp = download_url( $remote, $timeout = 300 ); + copy( $remote_tmp, $path . 'ultimatemember-' . $locale . '.po' ); + unlink( $remote_tmp ); + + $remote2_tmp = download_url( $remote2, $timeout = 300 ); + copy( $remote2_tmp, $path . 'ultimatemember-' . $locale . '.mo' ); + unlink( $remote2_tmp ); + + $url = remove_query_arg('um_adm_action', UM()->permalinks()->get_current_url() ); + $url = add_query_arg('update','language_updated',$url); + exit( wp_redirect($url) ); + + } + + /*** + *** @Action to hide notices in admin + ***/ + add_action('um_admin_do_action__um_hide_locale_notice', 'um_admin_do_action__hide_notice'); + add_action('um_admin_do_action__um_can_register_notice', 'um_admin_do_action__hide_notice'); + add_action('um_admin_do_action__um_hide_exif_notice', 'um_admin_do_action__hide_notice'); + function um_admin_do_action__hide_notice( $action ){ + if ( !is_admin() || !current_user_can('manage_options') ) die(); + update_option( $action, 1 ); + exit( wp_redirect( remove_query_arg('um_adm_action') ) ); + } + + /*** + *** @Opt-in tracking + ***/ + add_action('um_admin_do_action__opt_into_tracking', 'um_admin_do_action__opt_into_tracking'); + function um_admin_do_action__opt_into_tracking( $action ) { + if ( !is_admin() || !current_user_can('manage_options') ) die(); + + um_update_option( 'um_allow_tracking', 1 ); + update_option( 'um_tracking_notice', 1 ); + + $tracking = new um\core\Tracking(); + $tracking->send_checkin(true); + + exit( wp_redirect( remove_query_arg('um_adm_action') ) ); + } + + /*** + *** @Opt-out of tracking + ***/ + add_action('um_admin_do_action__opt_out_of_tracking', 'um_admin_do_action__opt_out_of_tracking'); + function um_admin_do_action__opt_out_of_tracking( $action ){ + if ( !is_admin() || !current_user_can('manage_options') ) die(); + + um_update_option( 'um_allow_tracking', 0 ); + update_option('um_tracking_notice', 1 ); + + exit( wp_redirect( remove_query_arg('um_adm_action') ) ); + } + + + /*** + *** @various user actions + ***/ + add_action('um_admin_do_action__user_action', 'um_admin_do_action__user_action'); + function um_admin_do_action__user_action( $action ){ + if ( !is_admin() || !current_user_can( 'edit_users' ) ) die(); + if ( !isset( $_REQUEST['sub'] ) ) die(); + if ( !isset($_REQUEST['user_id']) ) die(); + + um_fetch_user( $_REQUEST['user_id'] ); + + $subaction = $_REQUEST['sub']; + + do_action("um_admin_user_action_hook", $subaction); + do_action("um_admin_user_action_{$subaction}_hook"); + + um_reset_user(); + + wp_redirect( add_query_arg( 'update', 'user_updated', admin_url('?page=ultimatemember') ) ); + exit; + + } + + + /*** + *** @Add any custom links to plugin page + ***/ + $prefix = is_network_admin() ? 'network_admin_' : ''; + add_filter( "{$prefix}plugin_action_links_" . um_plugin, 'ultimatemember_plugin_links' ); + function ultimatemember_plugin_links( $links ) { + + $more_links[] = '' . __('Docs','ultimate-member') . ''; + + $more_links[] = '' . __('Settings','ultimate-member') . ''; + + $links = $more_links + $links; + + return $links; + + } \ No newline at end of file diff --git a/admin/core/um-admin-filters-fields.php b/includes/admin/core/um-admin-filters-fields.php similarity index 80% rename from admin/core/um-admin-filters-fields.php rename to includes/admin/core/um-admin-filters-fields.php index 4e09a6a9..69034286 100644 --- a/admin/core/um-admin-filters-fields.php +++ b/includes/admin/core/um-admin-filters-fields.php @@ -34,15 +34,12 @@ ***/ add_filter('um_admin_pre_save_fields_hook', 'um_admin_pre_save_fields_hook', 1 ); function um_admin_pre_save_fields_hook( $array ){ - global $ultimatemember; extract( $array ); - $metabox = new UM_Admin_Metabox(); - $fields_without_metakey = array('block','shortcode','spacing','divider','group'); $fields_without_metakey = apply_filters('um_fields_without_metakey', $fields_without_metakey ); - $fields = $ultimatemember->query->get_attr('custom_fields', $form_id); + $fields = UM()->query()->get_attr('custom_fields', $form_id); $count = 1; if ( isset( $fields ) && !empty( $fields) ) $count = count($fields)+1; @@ -64,10 +61,9 @@ ***/ add_filter('um_admin_field_update_error_handling', 'um_admin_field_update_error_handling', 1, 2 ); function um_admin_field_update_error_handling( $errors, $array ){ - global $ultimatemember; extract( $array ); - $field_attr = $ultimatemember->builtin->get_core_field_attrs( $field_type ); + $field_attr = UM()->builtin()->get_core_field_attrs( $field_type ); if ( isset( $field_attr['validate'] ) ) { @@ -86,8 +82,8 @@ case 'unique': if ( !isset( $array['post']['edit_mode'] ) ) { - if ( $ultimatemember->builtin->unique_field_err( $array['post'][$post_input] ) ) { - $errors[$post_input] = $ultimatemember->builtin->unique_field_err( $array['post'][$post_input] ); + if ( UM()->builtin()->unique_field_err( $array['post'][$post_input] ) ) { + $errors[$post_input] = UM()->builtin()->unique_field_err( $array['post'][$post_input] ); } } break; @@ -98,13 +94,13 @@ break; case 'range-start': - if ( $ultimatemember->builtin->date_range_start_err( $array['post'][$post_input] ) && $array['post']['_range'] == 'date_range' ) - $errors[$post_input] = $ultimatemember->builtin->date_range_start_err( $array['post'][$post_input] ); + if ( UM()->builtin()->date_range_start_err( $array['post'][$post_input] ) && $array['post']['_range'] == 'date_range' ) + $errors[$post_input] = UM()->builtin()->date_range_start_err( $array['post'][$post_input] ); break; case 'range-end': - if ( $ultimatemember->builtin->date_range_end_err( $array['post'][$post_input], $array['post']['_range_start'] ) && $array['post']['_range'] == 'date_range' ) - $errors[$post_input] = $ultimatemember->builtin->date_range_end_err( $array['post'][$post_input], $array['post']['_range_start'] ); + if ( UM()->builtin()->date_range_end_err( $array['post'][$post_input], $array['post']['_range_start'] ) && $array['post']['_range'] == 'date_range' ) + $errors[$post_input] = UM()->builtin()->date_range_end_err( $array['post'][$post_input], $array['post']['_range_start'] ); break; } diff --git a/includes/admin/templates/access/restrict_content.php b/includes/admin/templates/access/restrict_content.php new file mode 100644 index 00000000..e97a2e06 --- /dev/null +++ b/includes/admin/templates/access/restrict_content.php @@ -0,0 +1,129 @@ + + +
            + ID ) ) + $data = get_post_meta( $object->ID, 'um_content_restriction', true ); + else + $data = array(); + + $_um_access_roles_value = array(); + if ( ! empty( $data['_um_access_roles'] ) ) { + foreach ( $data['_um_access_roles'] as $key => $value ) { + if ( $value ) + $_um_access_roles_value[] = $key; + } + } + + $fields = apply_filters( 'um_admin_access_settings_fields', array( + array( + 'id' => '_um_custom_access_settings', + 'type' => 'checkbox', + 'name' => '_um_custom_access_settings', + 'label' => __( 'Restrict access to this content?', 'ultimate-member' ), + 'description' => __( 'Activate content restriction for this post', 'ultimate-member' ), + 'value' => ! empty( $data['_um_custom_access_settings'] ) ? $data['_um_custom_access_settings'] : 0, + ), + array( + 'id' => '_um_accessible', + 'type' => 'select', + 'name' => '_um_accessible', + 'label' => __( 'Who can access this content?', 'ultimate-member' ), + 'description' => __( 'Activate content restriction for this post', 'ultimate-member' ), + 'value' => ! empty( $data['_um_accessible'] ) ? $data['_um_accessible'] : 0, + 'options' => array( + '0' => __( 'Everyone', 'ultimate-member' ), + '1' => __( 'Logged out users', 'ultimate-member' ), + '2' => __( 'Logged in users', 'ultimate-member' ), + ), + 'conditional' => array( '_um_custom_access_settings', '=', '1' ) + ), + array( + 'id' => '_um_access_roles', + 'type' => 'multi_checkbox', + 'name' => '_um_access_roles', + 'label' => __( 'Select which roles can access this content', 'ultimate-member' ), + 'description' => __( 'Activate content restriction for this post', 'ultimate-member' ), + 'value' => $_um_access_roles_value, + 'options' => UM()->roles()->get_roles( false, array( 'administrator' ) ), + 'columns' => 3, + 'conditional' => array( '_um_accessible', '=', '2' ) + ), + array( + 'id' => '_um_noaccess_action', + 'type' => 'select', + 'name' => '_um_noaccess_action', + 'label' => __( 'What happens when users without access tries to view the content?', 'ultimate-member' ), + 'description' => __( 'Action when users without access tries to view the content', 'ultimate-member' ), + 'value' => ! empty( $data['_um_noaccess_action'] ) ? $data['_um_noaccess_action'] : 0, + 'options' => array( + '0' => __( 'Show access restricted message', 'ultimate-member' ), + '1' => __( 'Redirect user', 'ultimate-member' ), + ), + 'conditional' => array( '_um_accessible', '!=', '0' ) + ), + array( + 'id' => '_um_restrict_by_custom_message', + 'type' => 'select', + 'name' => '_um_restrict_by_custom_message', + 'label' => __( 'Would you like to use the global default message or apply a custom message to this content?', 'ultimate-member' ), + 'description' => __( 'Action when users without access tries to view the content', 'ultimate-member' ), + 'value' => ! empty( $data['_um_restrict_by_custom_message'] ) ? $data['_um_restrict_by_custom_message'] : '0', + 'options' => array( + '0' => __( 'Global default message (default)', 'ultimate-member' ), + '1' => __( 'Custom message', 'ultimate-member' ), + ), + 'conditional' => array( '_um_noaccess_action', '=', '0' ) + ), + array( + 'id' => '_um_restrict_custom_message', + 'type' => 'wp_editor', + 'name' => '_um_restrict_custom_message', + 'label' => __( 'Custom Restrict Content message', 'ultimate-member' ), + 'description' => __( 'Changed global restrict message', 'ultimate-member' ), + 'value' => ! empty( $data['_um_restrict_custom_message'] ) ? $data['_um_restrict_custom_message'] : '', + 'conditional' => array( '_um_restrict_by_custom_message', '=', '1' ) + ), + array( + 'id' => '_um_access_redirect', + 'type' => 'select', + 'name' => '_um_access_redirect', + 'label' => __( 'Where should users be redirected to?', 'ultimate-member' ), + 'description' => __( 'Select redirect to page when user hasn\'t access to content', 'ultimate-member' ), + 'value' => ! empty( $data['_um_access_redirect'] ) ? $data['_um_access_redirect'] : '0', + 'conditional' => array( '_um_noaccess_action', '=', '1' ), + 'options' => array( + '0' => __( 'Login page', 'ultimate-member' ), + '1' => __( 'Custom URL', 'ultimate-member' ), + ), + ), + array( + 'id' => '_um_access_redirect_url', + 'type' => 'text', + 'name' => '_um_access_redirect_url', + 'label' => __( 'Redirect URL', 'ultimate-member' ), + 'description' => __( 'Changed global restrict message', 'ultimate-member' ), + 'value' => ! empty( $data['_um_access_redirect_url'] ) ? $data['_um_access_redirect_url'] : '', + 'conditional' => array( '_um_access_redirect', '=', '1' ) + ), + array( + 'id' => '_um_access_hide_from_queries', + 'type' => 'checkbox', + 'name' => '_um_access_hide_from_queries', + 'label' => __( 'Hide from queries', 'ultimate-member' ), + 'description' => __( 'Hide this content from archives, RSS feeds etc for users who do not have permission to view this content', 'ultimate-member' ), + 'value' => ! empty( $data['_um_access_hide_from_queries'] ) ? $data['_um_access_hide_from_queries'] : '', + 'conditional' => array( '_um_accessible', '!=', '0' ) + ) + ), $data ); + + UM()->admin_forms( array( + 'class' => 'um-restrict-content um-third-column', + 'prefix_id' => 'um_content_restriction', + 'fields' => $fields + ) )->render_form(); ?> + +
            \ No newline at end of file diff --git a/admin/templates/dashboard/cache.php b/includes/admin/templates/dashboard/cache.php similarity index 100% rename from admin/templates/dashboard/cache.php rename to includes/admin/templates/dashboard/cache.php diff --git a/admin/templates/dashboard/feed.php b/includes/admin/templates/dashboard/feed.php similarity index 100% rename from admin/templates/dashboard/feed.php rename to includes/admin/templates/dashboard/feed.php diff --git a/admin/templates/dashboard/language-contrib.php b/includes/admin/templates/dashboard/language-contrib.php similarity index 100% rename from admin/templates/dashboard/language-contrib.php rename to includes/admin/templates/dashboard/language-contrib.php diff --git a/admin/templates/dashboard/language-download.php b/includes/admin/templates/dashboard/language-download.php similarity index 65% rename from admin/templates/dashboard/language-download.php rename to includes/admin/templates/dashboard/language-download.php index 48bfc3c2..80d21945 100644 --- a/admin/templates/dashboard/language-download.php +++ b/includes/admin/templates/dashboard/language-download.php @@ -1,3 +1,3 @@ -

            %1$s (%2$s).','ultimate-member'), $ultimatemember->available_languages[$locale], $locale); ?>

            +

            %1$s (%2$s).','ultimate-member'), UM()->available_languages[$locale], $locale); ?>

            \ No newline at end of file diff --git a/admin/templates/dashboard/language-update.php b/includes/admin/templates/dashboard/language-update.php similarity index 82% rename from admin/templates/dashboard/language-update.php rename to includes/admin/templates/dashboard/language-update.php index b1c648c2..dfae2d17 100644 --- a/admin/templates/dashboard/language-update.php +++ b/includes/admin/templates/dashboard/language-update.php @@ -1,3 +1,3 @@ -

            %1$s (%2$s).','ultimate-member'), $ultimatemember->available_languages[$locale], $locale); ?>

            +

            %1$s (%2$s).','ultimate-member'), UM()->available_languages[$locale], $locale); ?>

            \ No newline at end of file diff --git a/admin/templates/dashboard/purge.php b/includes/admin/templates/dashboard/purge.php similarity index 100% rename from admin/templates/dashboard/purge.php rename to includes/admin/templates/dashboard/purge.php diff --git a/admin/templates/dashboard/users.php b/includes/admin/templates/dashboard/users.php similarity index 70% rename from admin/templates/dashboard/users.php rename to includes/admin/templates/dashboard/users.php index 8eaa1d04..73526d2b 100644 --- a/admin/templates/dashboard/users.php +++ b/includes/admin/templates/dashboard/users.php @@ -3,17 +3,17 @@ - + - + - + @@ -26,17 +26,17 @@
            query->count_users(); ?>query()->count_users(); ?>
            query->count_users_by_status('approved'); ?>query()->count_users_by_status('approved'); ?>
            query->count_users_by_status('rejected'); ?>query()->count_users_by_status('rejected'); ?>
            - + - + - + diff --git a/includes/admin/templates/directory/appearance.php b/includes/admin/templates/directory/appearance.php new file mode 100644 index 00000000..384e7642 --- /dev/null +++ b/includes/admin/templates/directory/appearance.php @@ -0,0 +1,17 @@ +
            + + admin_forms( array( + 'class' => 'um-member-directory-appearance um-top-label', + 'prefix_id' => 'um_metadata', + 'fields' => array( + array( + 'id' => '_um_directory_template', + 'type' => 'select', + 'name' => '_um_directory_template', + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_directory_template', null, um_get_option( 'directory_template' ) ), + 'options' => UM()->shortcodes()->get_templates( 'members' ), + ) + ) + ) )->render_form(); ?> +
            \ No newline at end of file diff --git a/includes/admin/templates/directory/general.php b/includes/admin/templates/directory/general.php new file mode 100644 index 00000000..c909d018 --- /dev/null +++ b/includes/admin/templates/directory/general.php @@ -0,0 +1,101 @@ + $v ) { + if ( strstr( $k, '_um_' ) && !is_array( $v[0] ) ) { + //print "'$k' => '" . $v[0] . "',
            "; + } +} + +$roles_array = array(); + +foreach ( UM()->roles()->get_roles() as $key => $value ) { + if ( ! empty( UM()->query()->get_meta_value( '_um_roles', $key ) ) ) + $roles_array[] = UM()->query()->get_meta_value( '_um_roles', $key ); +} + +$show_these_users = get_post_meta( get_the_ID(), '_um_show_these_users', true ); +if ( $show_these_users ) { + $show_these_users = implode( "\n", str_replace( "\r", "", $show_these_users ) ); +} ?> + +
            + + '_um_mode', + 'type' => 'hidden', + 'name' => '_um_mode', + 'value' => 'directory', + ), + array( + 'id' => '_um_roles', + 'type' => 'select', + 'name' => '_um_roles', + 'label' => __( 'User Roles to Display', 'ultimate-member' ), + 'tooltip' => __( 'If you do not want to show all members, select only user roles to appear in this directory', 'ultimate-member' ), + 'options' => UM()->roles()->get_roles(), + 'multi' => true, + 'value' => $roles_array, + ), + array( + 'id' => '_um_has_profile_photo', + 'type' => 'checkbox', + 'name' => '_um_has_profile_photo', + 'label' => __( 'Only show members who have uploaded a profile photo', 'ultimate-member' ), + 'tooltip' => __( 'If \'Use Gravatars\' as profile photo is enabled, this option is ignored', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_has_profile_photo' ), + ), + array( + 'id' => '_um_has_cover_photo', + 'type' => 'checkbox', + 'name' => '_um_has_cover_photo', + 'label' => __( 'Only show members who have uploaded a cover photo', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_has_cover_photo' ), + ), + array( + 'id' => '_um_sortby', + 'type' => 'select', + 'name' => '_um_sortby', + 'label' => __( 'Sort users by', 'ultimate-member' ), + 'tooltip' => __( 'Sort users by a specific parameter in the directory', 'ultimate-member' ), + 'options' => apply_filters( 'um_admin_directory_sort_users_select', array( + 'user_registered_desc' => __( 'New users first', 'ultimate-member' ), + 'user_registered_asc' => __( 'Old users first', 'ultimate-member' ), + 'last_login' => __( 'Last login', 'ultimate-member' ), + 'display_name' => __( 'Display Name', 'ultimate-member' ), + 'first_name' => __( 'First Name', 'ultimate-member' ), + 'last_name' => __( 'Last Name', 'ultimate-member' ), + 'random' => __( 'Random', 'ultimate-member' ), + 'other' => __( 'Other (custom field)', 'ultimate-member' ), + ) ), + 'value' => UM()->query()->get_meta_value( '_um_sortby' ), + ), + array( + 'id' => '_um_sortby_custom', + 'type' => 'text', + 'name' => '_um_sortby_custom', + 'label' => __( 'Meta key', 'ultimate-member' ), + 'tooltip' => __( 'To sort by a custom field, enter the meta key of field here', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_sortby_custom', null, 'na' ), + 'conditional' => array( '_um_sortby', '=', 'other' ) + ), + array( + 'id' => '_um_show_these_users', + 'type' => 'textarea', + 'name' => '_um_show_these_users', + 'label' => __( 'Only show specific users (Enter one username per line)', 'ultimate-member' ), + 'value' => $show_these_users, + ) + ); + + $fields = apply_filters( 'um_admin_extend_directory_options_general', $fields ); + + UM()->admin_forms( array( + 'class' => 'um-member-directory-general um-half-column', + 'prefix_id' => 'um_metadata', + 'fields' => $fields + ) )->render_form(); ?> + +
            + +
            \ No newline at end of file diff --git a/includes/admin/templates/directory/pagination.php b/includes/admin/templates/directory/pagination.php new file mode 100644 index 00000000..cc23c016 --- /dev/null +++ b/includes/admin/templates/directory/pagination.php @@ -0,0 +1,38 @@ +
            + + admin_forms( array( + 'class' => 'um-member-directory-pagination um-half-column', + 'prefix_id' => 'um_metadata', + 'fields' => array( + array( + 'id' => '_um_profiles_per_page', + 'type' => 'text', + 'name' => '_um_profiles_per_page', + 'label' => __( 'Number of profiles per page', 'ultimate-member' ), + 'tooltip' => __( 'Number of profiles to appear on page for standard users', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profiles_per_page', null, 12 ), + 'size' => 'small' + ), + array( + 'id' => '_um_profiles_per_page_mobile', + 'type' => 'text', + 'name' => '_um_profiles_per_page_mobile', + 'label' => __( 'Number of profiles per page (for Mobiles & Tablets)', 'ultimate-member' ), + 'tooltip' => __( 'Number of profiles to appear on page for mobile users', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profiles_per_page_mobile', null, 8 ), + 'size' => 'small' + ), + array( + 'id' => '_um_max_users', + 'type' => 'text', + 'name' => '_um_max_users', + 'label' => __( 'Maximum number of profiles', 'ultimate-member' ), + 'tooltip' => __( 'Use this setting to control the maximum number of profiles to appear in this directory. Leave blank to disable this limit', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_max_users', null, 'na' ), + 'size' => 'small' + ) + ) + ) )->render_form(); ?> + +
            +
            \ No newline at end of file diff --git a/includes/admin/templates/directory/profile.php b/includes/admin/templates/directory/profile.php new file mode 100644 index 00000000..70afd1c4 --- /dev/null +++ b/includes/admin/templates/directory/profile.php @@ -0,0 +1,95 @@ +
            + + builtin()->all_user_fields() as $key => $arr ) { + $user_fields[$key] = isset( $arr['title'] ) ? $arr['title'] : ''; + } + + $post_id = get_the_ID(); + $_um_tagline_fields = get_post_meta( $post_id, '_um_tagline_fields', true ); + $_um_reveal_fields = get_post_meta( $post_id, '_um_reveal_fields', true ); + + UM()->admin_forms( array( + 'class' => 'um-member-directory-profile um-half-column', + 'prefix_id' => 'um_metadata', + 'fields' => array( + array( + 'id' => '_um_profile_photo', + 'type' => 'checkbox', + 'name' => '_um_profile_photo', + 'label' => __( 'Enable Profile Photo', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profile_photo', null, 1 ), + ), + array( + 'id' => '_um_cover_photos', + 'type' => 'checkbox', + 'name' => '_um_cover_photos', + 'label' => __( 'Enable Cover Photo', 'ultimate-member' ), + 'tooltip' => __( 'If turned on, the users cover photo will appear in the directory', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_cover_photos', null, 1 ), + ), + array( + 'id' => '_um_show_name', + 'type' => 'checkbox', + 'name' => '_um_show_name', + 'label' => __( 'Show display name', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_show_name', null, 1 ), + ), + array( + 'id' => '_um_show_tagline', + 'type' => 'checkbox', + 'name' => '_um_show_tagline', + 'label' => __( 'Show tagline below profile name', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_show_tagline' ), + ), + array( + 'id' => '_um_tagline_fields', + 'type' => 'multi_selects', + 'name' => '_um_tagline_fields', + 'label' => __( 'Choose field(s) to display in tagline', 'ultimate-member' ), + 'value' => $_um_tagline_fields, + 'conditional' => array( '_um_show_tagline', '=', 1 ), + 'add_text' => __( 'Add New Custom Field','ultimate-member' ), + 'options' => $user_fields, + 'show_default_number' => 1, + ), + array( + 'id' => '_um_show_userinfo', + 'type' => 'checkbox', + 'name' => '_um_show_userinfo', + 'label' => __( 'Show extra user information below tagline?', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_show_userinfo' ), + ), + array( + 'id' => '_um_userinfo_animate', + 'type' => 'checkbox', + 'name' => '_um_userinfo_animate', + 'label' => __( 'Enable reveal section transition by default', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_userinfo_animate' ), + 'conditional' => array( '_um_show_userinfo', '=', 1 ) + ), + array( + 'id' => '_um_reveal_fields', + 'type' => 'multi_selects', + 'name' => '_um_reveal_fields', + 'label' => __( 'Choose field(s) to display in reveal section', 'ultimate-member' ), + 'value' => $_um_reveal_fields, + 'add_text' => __( 'Add New Custom Field', 'ultimate-member' ), + 'conditional' => array( '_um_show_userinfo', '=', 1 ), + 'options' => $user_fields, + 'show_default_number' => 1, + ), + array( + 'id' => '_um_show_social', + 'type' => 'checkbox', + 'name' => '_um_show_social', + 'label' => __( 'Show social connect icons', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_show_social' ), + 'conditional' => array( '_um_show_userinfo', '=', 1 ) + ) + ) + ) )->render_form(); ?> + +
            +
            \ No newline at end of file diff --git a/includes/admin/templates/directory/search.php b/includes/admin/templates/directory/search.php new file mode 100644 index 00000000..1840e744 --- /dev/null +++ b/includes/admin/templates/directory/search.php @@ -0,0 +1,94 @@ +
            + roles()->get_roles() as $key => $value ) { + if ( ! empty( UM()->query()->get_meta_value( '_um_roles_can_search', $key ) ) ) + $can_search_array[] = UM()->query()->get_meta_value( '_um_roles_can_search', $key ); + } + + $custom_search = apply_filters( 'um_admin_custom_search_filters', array() ); + $searchable_fields = UM()->builtin()->all_user_fields('date,time,url'); + $searchable_fields = $searchable_fields + $custom_search; + $user_fields = array(); + foreach ( $searchable_fields as $key => $arr ) { + $user_fields[$key] = isset( $arr['title'] ) ? $arr['title'] : ''; + } + + $post_id = get_the_ID(); + $_um_search_fields = get_post_meta( $post_id, '_um_search_fields', true ); + + UM()->admin_forms( array( + 'class' => 'um-member-directory-search um-half-column', + 'prefix_id' => 'um_metadata', + 'fields' => array( + array( + 'id' => '_um_search', + 'type' => 'checkbox', + 'name' => '_um_search', + 'label' => __( 'Enable Search feature', 'ultimate-member' ), + 'tooltip' => __( 'If turned on, users will be able to search members in this directory', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_search' ), + ), + array( + 'id' => '_um_must_search', + 'type' => 'checkbox', + 'name' => '_um_must_search', + 'label' => __( 'Show results only after search', 'ultimate-member' ), + 'tooltip' => __( 'If turned on, member results will only appear after search is performed', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_must_search' ), + 'conditional' => array( '_um_search', '=', 1 ) + ), + array( + 'id' => '_um_roles_can_search', + 'type' => 'select', + 'multi' => true, + 'name' => '_um_roles_can_search', + 'label' => __( 'User Roles that can use search', 'ultimate-member' ), + 'tooltip' => __( 'If you want to allow specific user roles to be able to search only', 'ultimate-member' ), + 'value' => $can_search_array, + 'options' => UM()->roles()->get_roles(), + 'conditional' => array( '_um_search', '=', 1 ) + ), + array( + 'id' => '_um_search_fields', + 'type' => 'multi_selects', + 'name' => '_um_search_fields', + 'label' => __( 'Choose field(s) to enable in search', 'ultimate-member' ), + 'value' => $_um_search_fields, + 'conditional' => array( '_um_search', '=', 1 ), + 'options' => $user_fields, + 'add_text' => __( 'Add New Custom Field','ultimate-member' ), + 'show_default_number' => 1, + ), + array( + 'id' => '_um_directory_header', + 'type' => 'text', + 'name' => '_um_directory_header', + 'label' => __( 'Results Text', 'ultimate-member' ), + 'tooltip' => __( 'Customize the search result text . e.g. Found 3,000 Members. Leave this blank to not show result text', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value('_um_directory_header', null, __('{total_users} Members','ultimate-member') ), + 'conditional' => array( '_um_search', '=', 1 ) + ), + array( + 'id' => '_um_directory_header_single', + 'type' => 'text', + 'name' => '_um_directory_header_single', + 'label' => __( 'Single Result Text', 'ultimate-member' ), + 'tooltip' => __( 'Same as above but in case of 1 user found only', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value('_um_directory_header_single', null, __('{total_users} Member','ultimate-member') ), + 'conditional' => array( '_um_search', '=', 1 ) + ), + array( + 'id' => '_um_directory_no_users', + 'type' => 'text', + 'name' => '_um_directory_no_users', + 'label' => __( 'Custom text if no users were found', 'ultimate-member' ), + 'tooltip' => __( 'This is the text that is displayed if no users are found during a search', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value('_um_directory_no_users', null, __('We are sorry. We cannot find any users who match your search criteria.','ultimate-member') ), + 'conditional' => array( '_um_search', '=', 1 ) + ) + ) + ) )->render_form(); ?> + +
            +
            \ No newline at end of file diff --git a/includes/admin/templates/directory/shortcode.php b/includes/admin/templates/directory/shortcode.php new file mode 100644 index 00000000..f14cf4c8 --- /dev/null +++ b/includes/admin/templates/directory/shortcode.php @@ -0,0 +1,5 @@ +
            + +

            shortcodes()->get_shortcode( get_the_ID() ); ?>

            + +
            \ No newline at end of file diff --git a/includes/admin/templates/extensions.php b/includes/admin/templates/extensions.php new file mode 100644 index 00000000..b44fbf06 --- /dev/null +++ b/includes/admin/templates/extensions.php @@ -0,0 +1,214 @@ + 'https://ultimatemember.com/extensions/bbpress/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/bbpress.png', + 'name' => 'bbPress', + 'desc' => 'With the bbPress extension you can integrate Ultimate Member with bbPress', + ); + + $premium['profile-completeness'] = array( + 'url' => 'https://ultimatemember.com/extensions/profile-completeness/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/profile-completeness.png', + 'name' => 'Profile Completeness', + 'desc' => 'Encourage or force users to complete their profile on your site', + ); + + $premium['verified-users'] = array( + 'url' => 'https://ultimatemember.com/extensions/verified-users/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/verified-users.png', + 'name' => 'Verified Users', + 'desc' => 'Add a user verficiation system to your site so user accounts can be verified', + ); + + $premium['friends'] = array( + 'url' => 'https://ultimatemember.com/extensions/friends/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/friends.png', + 'name' => 'Friends', + 'desc' => 'Increase user interaction on your site by allowing users to become friends', + ); + + $premium['woocommerce'] = array( + 'url' => 'https://ultimatemember.com/extensions/woocommerce/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/woocommerce.png', + 'name' => 'WooCommerce', + 'desc' => 'Integrates the popular e-commerce plugin WooCommerce with Ultimate Member', + ); + + $premium['notices'] = array( + 'url' => 'https://ultimatemember.com/extensions/notices/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/notices.png', + 'name' => 'Notices', + 'desc' => 'Alert users to important information using conditional notices', + ); + + $premium['followers'] = array( + 'url' => 'https://ultimatemember.com/extensions/followers/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/follow.png', + 'name' => 'Followers', + 'desc' => 'Increase user interaction on your site by allowing users to follow each other', + ); + + $premium['mycred'] = array( + 'url' => 'https://ultimatemember.com/extensions/mycred/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/mycred.png', + 'name' => 'myCRED', + 'desc' => 'With the myCRED extension you can integrate Ultimate Member with myCRED', + ); + + $premium['private-messages'] = array( + 'url' => 'https://ultimatemember.com/extensions/private-messages/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/private-messages.png', + 'name' => 'Private Messages', + 'desc' => 'Add a private messaging system to your site & allow users to message each other', + ); + + $premium['social-activity'] = array( + 'url' => 'https://ultimatemember.com/extensions/social-activity/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/social-activity.png', + 'name' => 'Social Activity', + 'desc' => 'Let users create public wall posts & see the activity of other users', + ); + + $premium['social-login'] = array( + 'url' => 'https://ultimatemember.com/extensions/social-login/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/social-login.png', + 'name' => 'Social Login', + 'desc' => 'Let users register & login to your site via Facebook, Twitter, G+, LinkedIn, and more', + ); + + $premium['instagram'] = array( + 'url' => 'https://ultimatemember.com/extensions/instagram/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/instagram.png', + 'name' => 'Instagram', + 'desc' => 'Allow users to show their Instagram photos on their profile', + ); + + $premium['user-tags'] = array( + 'url' => 'https://ultimatemember.com/extensions/user-tags/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/usertags.png', + 'name' => 'User Tags', + 'desc' => 'With this extension you can add a user tag system to your website', + ); + + + $premium['mailchimp'] = array( + 'url' => 'https://ultimatemember.com/extensions/mailchimp/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/mailchimp.png', + 'name' => 'MailChimp', + 'desc' => 'Allow users to subscribe to your mailchimp lists when they signup on your site', + ); + + + $premium['user-reviews'] = array( + 'url' => 'https://ultimatemember.com/extensions/user-reviews/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/user-reviews.png', + 'name' => 'User Reviews', + 'desc' => 'Allow users to rate & review each other using a 5 star rate/review system', + ); + + $premium['real-time-notifications'] = array( + 'url' => 'https://ultimatemember.com/extensions/real-time-notifications/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/05/notifications.png', + 'name' => 'Real-time Notifications', + 'desc' => 'Add a notifications system to your site so users can receive real-time notifications', + ); + + + $free['online-users'] = array( + 'url' => 'https://ultimatemember.com/extensions/online-users/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/07/Online-Users.png', + 'name' => 'Online Users', + 'desc' => 'Display online users on your site so users can see who is online' + ); + + $free['google-recaptcha'] = array( + 'url' => 'https://ultimatemember.com/extensions/google-recaptcha/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/07/google.png', + 'name' => 'Google reCAPTCHA', + 'desc' => 'Stop bots on your registration & login forms with Google reCAPTCHA', + ); + + $free['terms-conditions'] = array( + 'url' => 'https://ultimatemember.com/extensions/terms-conditions/', + 'image' => 'https://ultimatemember.com/wp-content/uploads/edd/2017/07/terms-conditions.png', + 'name' => 'Terms & Conditions', + 'desc' => 'Add terms & conditions to your registration form', + ); + +?> + +
            + +

            Ultimate Member - Extensions

            + +
            +
            Core Extensions Bundle – Check out our extensions bundle which includes all extensions at a significant discount.
            + +
            + +
            + +
            + +
            +
            + + + + $info ) { ?> + +
            + +
            +

            + +
            + +
            + + +
            +
            + + + + + + $info ) { ?> + +
            + +
            +

            + +
            + +
            + + +
            +
            + + + +
            +
            + +
            \ No newline at end of file diff --git a/admin/templates/form/builder.php b/includes/admin/templates/form/builder.php similarity index 62% rename from admin/templates/form/builder.php rename to includes/admin/templates/form/builder.php index 6e2889bb..99d7f64f 100644 --- a/admin/templates/form/builder.php +++ b/includes/admin/templates/form/builder.php @@ -1,13 +1,11 @@ form_id = $this->form_id; - } - + +if ( empty( UM()->builder()->form_id ) ) { + UM()->builder()->form_id = $this->form_id; +} ?> -
            +
            @@ -19,9 +17,9 @@
            -
            +
            - show_builder( $UM_Builder->form_id ); ?> + builder()->show_builder(); ?>
            diff --git a/includes/admin/templates/form/login_customize.php b/includes/admin/templates/form/login_customize.php new file mode 100644 index 00000000..27ffb519 --- /dev/null +++ b/includes/admin/templates/form/login_customize.php @@ -0,0 +1,87 @@ +
            + admin_forms( array( + 'class' => 'um-form-login-customize um-top-label', + 'prefix_id' => 'form', + 'fields' => array( + array( + 'id' => '_um_login_use_globals', + 'type' => 'select', + 'label' => __( 'Apply custom settings to this form', 'ultimate-member' ), + 'tooltip' => __( 'Switch to yes if you want to customize this form settings, styling & appearance', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_login_use_globals', null, 0 ), + 'options' => array( + 0 => __( 'No', 'ultimate-member' ), + 1 => __( 'Yes', 'ultimate-member' ), + ), + ), + array( + 'id' => '_um_login_template', + 'type' => 'select', + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_login_template', null, um_get_option( 'login_template' ) ), + 'options' => UM()->shortcodes()->get_templates( 'login' ), + 'conditional' => array( '_um_login_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_login_max_width', + 'type' => 'text', + 'label' => __( 'Max. Width (px)', 'ultimate-member' ), + 'tooltip' => __( 'The maximum width of shortcode in pixels e.g. 600px', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value('_um_login_max_width', null, um_get_option( 'login_max_width' ) ), + 'conditional' => array( '_um_login_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_login_icons', + 'type' => 'select', + 'label' => __( 'Field Icons', 'ultimate-member' ), + 'tooltip' => __( 'Whether to show field icons and where to show them relative to the field', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_login_icons', null, um_get_option( 'login_icons' ) ) , + 'options' => array( + 'field' => __( 'Show inside text field', 'ultimate-member' ), + 'label' => __( 'Show with label', 'ultimate-member' ), + 'off' => __( 'Turn off', 'ultimate-member' ) + ), + 'conditional' => array( '_um_login_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_login_primary_btn_word', + 'type' => 'text', + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'tooltip' => __( 'Customize the button text', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_login_primary_btn_word', null, um_get_option( 'login_primary_btn_word' ) ), + 'conditional' => array( '_um_login_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_login_secondary_btn', + 'type' => 'checkbox', + 'label' => __( 'Show Secondary Button', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_login_secondary_btn', null, 1 ), + 'conditional' => array( '_um_login_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_login_secondary_btn_word', + 'type' => 'text', + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'tooltip' => __( 'Customize the button text', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_login_secondary_btn_word', null, um_get_option( 'login_secondary_btn_word' ) ), + 'conditional' => array( '_um_login_secondary_btn', '=', 1 ) + ), + array( + 'id' => '_um_login_forgot_pass_link', + 'type' => 'checkbox', + 'label' => __( 'Show Forgot Password Link?', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_login_forgot_pass_link', null, um_get_option('login_forgot_pass_link') ), + 'conditional' => array( '_um_login_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_login_show_rememberme', + 'type' => 'checkbox', + 'label' => __( 'Show "Remember Me"?', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_login_show_rememberme', null, um_get_option('login_show_rememberme') ), + 'conditional' => array( '_um_login_use_globals', '=', 1 ) + ), + ) + ) )->render_form(); ?> + +
            +
            \ No newline at end of file diff --git a/includes/admin/templates/form/login_settings.php b/includes/admin/templates/form/login_settings.php new file mode 100644 index 00000000..b2af83cc --- /dev/null +++ b/includes/admin/templates/form/login_settings.php @@ -0,0 +1,32 @@ +
            + + admin_forms( array( + 'class' => 'um-form-login-settings um-top-label', + 'prefix_id' => 'form', + 'fields' => array( + array( + 'id' => '_um_login_after_login', + 'type' => 'select', + 'label' => __( 'Redirection after Login', 'ultimate-member' ), + 'tooltip' => __( 'Change this If you want to override role redirection settings after login only.', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_login_after_login', null, 0 ), + 'options' => array( + '0' => __( 'Default', 'ultimate-member' ), + 'redirect_profile' => __( 'Redirect to profile', 'ultimate-member' ), + 'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ), + 'refresh' => __( 'Refresh active page', 'ultimate-member' ), + 'redirect_admin' => __( 'Redirect to WordPress Admin', 'ultimate-member' ), + ), + ), + array( + 'id' => '_um_login_redirect_url', + 'type' => 'text', + 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value('_um_login_redirect_url', null, 'na' ), + 'conditional' => array( '_um_login_after_login', '=', 'redirect_url' ) + ) + ) + ) )->render_form(); ?> + +
            +
            \ No newline at end of file diff --git a/admin/templates/form/mode.php b/includes/admin/templates/form/mode.php similarity index 89% rename from admin/templates/form/mode.php rename to includes/admin/templates/form/mode.php index 3c7e355d..9ae11dae 100644 --- a/admin/templates/form/mode.php +++ b/includes/admin/templates/form/mode.php @@ -12,6 +12,6 @@ - +
            \ No newline at end of file diff --git a/includes/admin/templates/form/profile_customize.php b/includes/admin/templates/form/profile_customize.php new file mode 100644 index 00000000..c3353e3b --- /dev/null +++ b/includes/admin/templates/form/profile_customize.php @@ -0,0 +1,154 @@ +
            + + roles()->get_roles( __( 'All roles', 'ultimate-member' ) ) as $key => $value ) { + if ( ! empty( UM()->query()->get_meta_value( '_um_profile_role', $key ) ) ) + $profile_role = UM()->query()->get_meta_value( '_um_profile_role', $key ); + } + + UM()->admin_forms( array( + 'class' => 'um-form-profile-customize um-top-label', + 'prefix_id' => 'form', + 'fields' => array( + array( + 'id' => '_um_profile_use_globals', + 'type' => 'select', + 'label' => __( 'Apply custom settings to this form', 'ultimate-member' ), + 'tooltip' => __( 'Switch to yes if you want to customize this form settings, styling & appearance', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profile_use_globals', null, 0 ), + 'options' => array( + 0 => __( 'No', 'ultimate-member' ), + 1 => __( 'Yes', 'ultimate-member' ), + ), + ), + array( + 'id' => '_um_profile_role', + 'type' => 'select', + 'label' => __( 'Make this profile role-specific', 'ultimate-member' ), + 'value' => ! empty( $profile_role ) ? $profile_role : 0, + 'options' => UM()->roles()->get_roles( __( 'All roles', 'ultimate-member' ) ), + 'conditional' => array( '_um_profile_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_profile_template', + 'type' => 'select', + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profile_template', null, um_get_option( 'profile_template' ) ), + 'options' => UM()->shortcodes()->get_templates( 'profile' ), + 'conditional' => array( '_um_profile_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_profile_max_width', + 'type' => 'text', + 'label' => __( 'Max. Width (px)', 'ultimate-member' ), + 'tooltip' => __( 'The maximum width of shortcode in pixels e.g. 600px', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value('_um_profile_max_width', null, um_get_option( 'profile_max_width' ) ), + 'conditional' => array( '_um_profile_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_profile_area_max_width', + 'type' => 'text', + 'label' => __( 'Profile Area Max. Width (px)', 'ultimate-member' ), + 'tooltip' => __( 'The maximum width of the profile area inside profile (below profile header)', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value('_um_profile_area_max_width', null, um_get_option( 'profile_area_max_width' ) ), + 'conditional' => array( '_um_profile_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_profile_icons', + 'type' => 'select', + 'label' => __( 'Field Icons', 'ultimate-member' ), + 'tooltip' => __( 'Whether to show field icons and where to show them relative to the field', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profile_icons', null, um_get_option( 'profile_icons' ) ) , + 'options' => array( + 'field' => __( 'Show inside text field', 'ultimate-member' ), + 'label' => __( 'Show with label', 'ultimate-member' ), + 'off' => __( 'Turn off', 'ultimate-member' ) + ), + 'conditional' => array( '_um_profile_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_profile_primary_btn_word', + 'type' => 'text', + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'tooltip' => __( 'Customize the button text', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profile_primary_btn_word', null, um_get_option( 'profile_primary_btn_word' ) ), + 'conditional' => array( '_um_profile_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_profile_secondary_btn', + 'type' => 'checkbox', + 'label' => __( 'Show Secondary Button', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profile_secondary_btn', null, 1 ), + 'conditional' => array( '_um_profile_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_profile_secondary_btn_word', + 'type' => 'text', + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'tooltip' => __( 'Customize the button text', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profile_secondary_btn_word', null, um_get_option( 'profile_secondary_btn_word' ) ), + 'conditional' => array( '_um_profile_secondary_btn', '=', 1 ) + ), + array( + 'id' => '_um_profile_cover_enabled', + 'type' => 'checkbox', + 'label' => __( 'Enable Cover Photos', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profile_cover_enabled', null, 1 ), + 'conditional' => array( '_um_profile_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_profile_cover_ratio', + 'type' => 'select', + 'label' => __( 'Cover photo ratio', 'ultimate-member' ), + 'tooltip' => __( 'The shortcode is centered by default unless you specify otherwise here', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profile_cover_ratio', null, um_get_option( 'profile_cover_ratio' ) ), + 'options' => array( + '2.7:1' => '2.7:1', + '2.2:1' => '2.2:1', + '3.2:1' => '3.2:1' + ), + 'conditional' => array( '_um_profile_cover_enabled', '=', 1 ) + ), + array( + 'id' => '_um_profile_photosize', + 'type' => 'text', + 'label' => __( 'Profile Photo Size', 'ultimate-member' ), + 'tooltip' => __( 'Set the profile photo size in pixels here', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profile_photosize', null, um_get_option( 'profile_photosize' ) ), + 'conditional' => array( '_um_profile_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_profile_photo_required', + 'type' => 'checkbox', + 'label' => __( 'Make Profile Photo Required', 'ultimate-member' ), + 'tooltip' => __( 'Require user to update a profile photo when updating their profile', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profile_photo_required' ), + 'conditional' => array( '_um_profile_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_profile_show_name', + 'type' => 'checkbox', + 'label' => __( 'Show display name in profile header?', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profile_show_name', null, 1 ), + 'conditional' => array( '_um_profile_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_profile_show_social_links', + 'type' => 'checkbox', + 'label' => __( 'Show social links in profile header?', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profile_show_social_links', null, 0 ), + 'conditional' => array( '_um_profile_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_profile_show_bio', + 'type' => 'checkbox', + 'label' => __( 'Show user description in profile header?', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profile_show_bio', null, 1 ), + 'conditional' => array( '_um_profile_use_globals', '=', 1 ) + ), + + ) + ) )->render_form(); ?> + +
            +
            \ No newline at end of file diff --git a/includes/admin/templates/form/profile_settings.php b/includes/admin/templates/form/profile_settings.php new file mode 100644 index 00000000..9d82a3ce --- /dev/null +++ b/includes/admin/templates/form/profile_settings.php @@ -0,0 +1,27 @@ +
            + builtin()->all_user_fields() as $key => $arr ) { + $user_fields[$key] = isset( $arr['title'] ) ? $arr['title'] : ''; + } + + $post_id = get_the_ID(); + $_um_search_fields = get_post_meta( $post_id, '_um_profile_metafields', true ); + + UM()->admin_forms( array( + 'class' => 'um-form-profile-settings um-top-label', + 'prefix_id' => 'form', + 'fields' => array( + array( + 'id' => '_um_profile_metafields', + 'type' => 'multi_selects', + 'label' => __( 'Field(s) to show in user meta', 'ultimate-member' ), + 'value' => $_um_search_fields, + 'options' => $user_fields, + 'add_text' => __( 'Add New Field', 'ultimate-member' ), + 'show_default_number' => 1, + ) + ) + ) )->render_form(); ?> + +
            +
            \ No newline at end of file diff --git a/includes/admin/templates/form/register_customize.php b/includes/admin/templates/form/register_customize.php new file mode 100644 index 00000000..de673180 --- /dev/null +++ b/includes/admin/templates/form/register_customize.php @@ -0,0 +1,88 @@ +
            + + roles()->get_roles( __( 'Default', 'ultimate-member' ) ) as $key => $value ) { + if ( ! empty( UM()->query()->get_meta_value( '_um_register_role', $key ) ) ) + $register_role = UM()->query()->get_meta_value( '_um_register_role', $key ); + } + + UM()->admin_forms( array( + 'class' => 'um-form-register-customize um-top-label', + 'prefix_id' => 'form', + 'fields' => array( + array( + 'id' => '_um_register_use_globals', + 'type' => 'select', + 'label' => __( 'Apply custom settings to this form', 'ultimate-member' ), + 'tooltip' => __( 'Switch to yes if you want to customize this form settings, styling & appearance', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_register_use_globals', null, 0 ), + 'options' => array( + 0 => __( 'No', 'ultimate-member' ), + 1 => __( 'Yes', 'ultimate-member' ), + ), + ), + array( + 'id' => '_um_register_role', + 'type' => 'select', + 'label' => __( 'Assign role to form', 'ultimate-member' ), + 'value' => ! empty( $register_role ) ? $register_role : 0, + 'options' => UM()->roles()->get_roles( __( 'Default', 'ultimate-member' ) ), + 'conditional' => array( '_um_register_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_register_template', + 'type' => 'select', + 'label' => __( 'Template', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_register_template', null, um_get_option( 'register_template' ) ), + 'options' => UM()->shortcodes()->get_templates( 'register' ), + 'conditional' => array( '_um_register_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_register_max_width', + 'type' => 'text', + 'label' => __( 'Max. Width (px)', 'ultimate-member' ), + 'tooltip' => __( 'The maximum width of shortcode in pixels e.g. 600px', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value('_um_register_max_width', null, um_get_option( 'register_max_width' ) ), + 'conditional' => array( '_um_register_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_register_icons', + 'type' => 'select', + 'label' => __( 'Field Icons', 'ultimate-member' ), + 'tooltip' => __( 'Whether to show field icons and where to show them relative to the field', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_register_icons', null, um_get_option( 'register_icons' ) ) , + 'options' => array( + 'field' => __( 'Show inside text field', 'ultimate-member' ), + 'label' => __( 'Show with label', 'ultimate-member' ), + 'off' => __( 'Turn off', 'ultimate-member' ) + ), + 'conditional' => array( '_um_register_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_register_primary_btn_word', + 'type' => 'text', + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'tooltip' => __( 'Customize the button text', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_register_primary_btn_word', null, um_get_option( 'register_primary_btn_word' ) ), + 'conditional' => array( '_um_register_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_register_secondary_btn', + 'type' => 'checkbox', + 'label' => __( 'Show Secondary Button', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_register_secondary_btn', null, 1 ), + 'conditional' => array( '_um_register_use_globals', '=', 1 ) + ), + array( + 'id' => '_um_register_secondary_btn_word', + 'type' => 'text', + 'label' => __( 'Primary Button Text', 'ultimate-member' ), + 'tooltip' => __( 'Customize the button text', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_register_secondary_btn_word', null, um_get_option( 'register_secondary_btn_word' ) ), + 'conditional' => array( '_um_register_secondary_btn', '=', 1 ) + ) + ) + ) )->render_form(); ?> + +
            +
            \ No newline at end of file diff --git a/includes/admin/templates/form/shortcode.php b/includes/admin/templates/form/shortcode.php new file mode 100644 index 00000000..f14cf4c8 --- /dev/null +++ b/includes/admin/templates/form/shortcode.php @@ -0,0 +1,5 @@ +
            + +

            shortcodes()->get_shortcode( get_the_ID() ); ?>

            + +
            \ No newline at end of file diff --git a/admin/templates/modal/dynamic_edit_field.php b/includes/admin/templates/modal/dynamic_edit_field.php similarity index 100% rename from admin/templates/modal/dynamic_edit_field.php rename to includes/admin/templates/modal/dynamic_edit_field.php diff --git a/admin/templates/modal/dynamic_edit_row.php b/includes/admin/templates/modal/dynamic_edit_row.php similarity index 100% rename from admin/templates/modal/dynamic_edit_row.php rename to includes/admin/templates/modal/dynamic_edit_row.php diff --git a/admin/templates/modal/dynamic_form_preview.php b/includes/admin/templates/modal/dynamic_form_preview.php similarity index 100% rename from admin/templates/modal/dynamic_form_preview.php rename to includes/admin/templates/modal/dynamic_form_preview.php diff --git a/admin/templates/modal/dynamic_new_divider.php b/includes/admin/templates/modal/dynamic_new_divider.php similarity index 100% rename from admin/templates/modal/dynamic_new_divider.php rename to includes/admin/templates/modal/dynamic_new_divider.php diff --git a/admin/templates/modal/dynamic_new_field.php b/includes/admin/templates/modal/dynamic_new_field.php similarity index 100% rename from admin/templates/modal/dynamic_new_field.php rename to includes/admin/templates/modal/dynamic_new_field.php diff --git a/admin/templates/modal/dynamic_new_group.php b/includes/admin/templates/modal/dynamic_new_group.php similarity index 100% rename from admin/templates/modal/dynamic_new_group.php rename to includes/admin/templates/modal/dynamic_new_group.php diff --git a/admin/templates/modal/dynamic_registration_preview.php b/includes/admin/templates/modal/dynamic_registration_preview.php similarity index 100% rename from admin/templates/modal/dynamic_registration_preview.php rename to includes/admin/templates/modal/dynamic_registration_preview.php diff --git a/admin/templates/modal/fields.php b/includes/admin/templates/modal/fields.php similarity index 100% rename from admin/templates/modal/fields.php rename to includes/admin/templates/modal/fields.php diff --git a/admin/templates/modal/fonticons.php b/includes/admin/templates/modal/fonticons.php similarity index 87% rename from admin/templates/modal/fonticons.php rename to includes/admin/templates/modal/fonticons.php index 7b3b0ac5..a321d8c0 100644 --- a/admin/templates/modal/fonticons.php +++ b/includes/admin/templates/modal/fonticons.php @@ -1,7 +1,7 @@ \ No newline at end of file diff --git a/admin/templates/welcome/about_header.php b/includes/admin/templates/welcome/about_header.php similarity index 100% rename from admin/templates/welcome/about_header.php rename to includes/admin/templates/welcome/about_header.php diff --git a/admin/templates/welcome/start.php b/includes/admin/templates/welcome/start.php similarity index 89% rename from admin/templates/welcome/start.php rename to includes/admin/templates/welcome/start.php index 128e2f19..775408ff 100644 --- a/admin/templates/welcome/start.php +++ b/includes/admin/templates/welcome/start.php @@ -1,5 +1,4 @@ - - + admin()->templates_path . 'welcome/about_header.php'; ?>

            Getting Started

            @@ -24,7 +23,7 @@
          • User
          • Members
          • Account
          • -
          • Logout
          • +
          • Logout
          • Password Reset
          • @@ -59,4 +58,4 @@
            - \ No newline at end of file + admin()->templates_path . 'welcome/about_footer.php'; ?> \ No newline at end of file diff --git a/includes/class-config.php b/includes/class-config.php new file mode 100644 index 00000000..8c9ff732 --- /dev/null +++ b/includes/class-config.php @@ -0,0 +1,530 @@ +core_forms = array( + 'register', + 'login', + 'profile', + ); + + $this->core_directories = array( + 'members', + ); + + $this->core_pages = apply_filters( 'um_core_pages', array( + 'user' => array( 'title' => __( 'User', 'ultimate-member' ) ), + 'login' => array( 'title' => __( 'Login', 'ultimate-member' ) ), + 'register' => array( 'title' => __( 'Register', 'ultimate-member' ) ), + 'members' => array( 'title' => __( 'Members', 'ultimate-member' ) ), + 'logout' => array( 'title' => __( 'Logout', 'ultimate-member' ) ), + 'account' => array( 'title' => __( 'Account', 'ultimate-member' ) ), + 'password-reset' => array( 'title' => __( 'Password Reset', 'ultimate-member' ) ), + ) ); + + $this->core_directory_meta['members'] = array( + '_um_template' => 'members', + '_um_mode' => 'directory', + '_um_has_profile_photo' => 0, + '_um_has_cover_photo' => 0, + '_um_show_social' => 0, + '_um_show_userinfo' => 0, + '_um_show_tagline' => 0, + '_um_search' => 0, + '_um_userinfo_animate' => '1', + '_um_sortby' => 'user_registered_desc', + '_um_profile_photo' => '1', + '_um_cover_photos' => '1', + '_um_show_name' => '1', + '_um_directory_header' => __('{total_users} Members','ultimate-member'), + '_um_directory_header_single' => __('{total_users} Member','ultimate-member'), + '_um_directory_no_users' => __('We are sorry. We cannot find any users who match your search criteria.','ultimate-member'), + '_um_profiles_per_page' => 12, + '_um_profiles_per_page_mobile' => 6, + '_um_core' => 'members', + ); + + $this->core_global_meta_all = array( + '_um_primary_btn_color', + '_um_primary_btn_hover', + '_um_primary_btn_text', + '_um_secondary_btn_color', + '_um_secondary_btn_hover', + '_um_secondary_btn_text', + '_um_form_border', + '_um_form_border_hover', + '_um_form_bg_color', + '_um_form_bg_color_focus', + '_um_form_placeholder', + '_um_form_icon_color', + '_um_form_asterisk_color', + '_um_form_field_label', + '_um_form_text_color', + '_um_active_color', + '_um_help_tip_color', + '_um_secondary_color', + ); + + $this->core_form_meta_all = apply_filters( 'um_core_form_meta_all', array( + '_um_profile_show_name' => 1, + '_um_profile_show_social_links' => 0, + '_um_profile_show_bio' => 1, + 'profile_show_html_bio' => 0, + '_um_profile_bio_maxchars' => 180, + '_um_profile_header_menu' => 'bc', + '_um_profile_empty_text' => 1, + '_um_profile_empty_text_emo' => 1, + '_um_profile_role' => '0', + '_um_profile_template' => 'profile', + '_um_profile_max_width' => '1000px', + '_um_profile_area_max_width' => '600px', + '_um_profile_align' => 'center', + '_um_profile_icons' => 'label', + '_um_profile_cover_enabled' => 1, + '_um_profile_cover_ratio' => '2.7:1', + '_um_profile_photosize' => '190px', + '_um_profile_photocorner' => '1', + '_um_profile_header_bg' => '', + '_um_profile_primary_btn_word' => 'Update Profile', + '_um_profile_secondary_btn' => '1', + '_um_profile_secondary_btn_word' => 'Cancel', + '_um_register_role' => '0', + '_um_register_template' => 'register', + '_um_register_max_width' => '450px', + '_um_register_align' => 'center', + '_um_register_icons' => 'label', + '_um_register_primary_btn_word' => __('Register','ultimate-member'), + '_um_register_secondary_btn' => 1, + '_um_register_secondary_btn_word' => __('Login','ultimate-member'), + '_um_register_secondary_btn_url' => '', + '_um_login_template' => 'login', + '_um_login_max_width' => '450px', + '_um_login_align' => 'center', + '_um_login_icons' => 'label', + '_um_login_primary_btn_word' => __('Login','ultimate-member'), + '_um_login_forgot_pass_link' => 1, + '_um_login_show_rememberme' => 1, + '_um_login_secondary_btn' => 1, + '_um_login_secondary_btn_word' => __('Register','ultimate-member'), + '_um_login_secondary_btn_url' => '', + '_um_directory_template' => 'members', + '_um_directory_header' => __('{total_users} Members','ultimate-member'), + '_um_directory_header_single' => __('{total_users} Member','ultimate-member'), + ) ); + + $this->core_form_meta['register'] = array( + '_um_custom_fields' => 'a:6:{s:10:"user_login";a:15:{s:5:"title";s:8:"Username";s:7:"metakey";s:10:"user_login";s:4:"type";s:4:"text";s:5:"label";s:8:"Username";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";i:0;s:8:"validate";s:15:"unique_username";s:9:"min_chars";i:3;s:9:"max_chars";i:24;s:8:"position";s:1:"1";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:10:"user_email";a:13:{s:5:"title";s:14:"E-mail Address";s:7:"metakey";s:10:"user_email";s:4:"type";s:4:"text";s:5:"label";s:14:"E-mail Address";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";i:1;s:8:"validate";s:12:"unique_email";s:8:"position";s:1:"4";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:13:"user_password";a:16:{s:5:"title";s:8:"Password";s:7:"metakey";s:13:"user_password";s:4:"type";s:8:"password";s:5:"label";s:8:"Password";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";i:1;s:9:"min_chars";i:8;s:9:"max_chars";i:30;s:15:"force_good_pass";i:1;s:18:"force_confirm_pass";i:1;s:8:"position";s:1:"5";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:10:"first_name";a:12:{s:5:"title";s:10:"First Name";s:7:"metakey";s:10:"first_name";s:4:"type";s:4:"text";s:5:"label";s:10:"First Name";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";i:1;s:8:"position";s:1:"2";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"last_name";a:12:{s:5:"title";s:9:"Last Name";s:7:"metakey";s:9:"last_name";s:4:"type";s:4:"text";s:5:"label";s:9:"Last Name";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";i:1;s:8:"position";s:1:"3";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}', + '_um_mode' => 'register', + '_um_core' => 'register', + '_um_register_use_globals' => 1, + ); + + $this->core_form_meta['login'] = array( + '_um_custom_fields' => 'a:3:{s:8:"username";a:13:{s:5:"title";s:18:"Username or E-mail";s:7:"metakey";s:8:"username";s:4:"type";s:4:"text";s:5:"label";s:18:"Username or E-mail";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";i:0;s:8:"validate";s:24:"unique_username_or_email";s:8:"position";s:1:"1";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:13:"user_password";a:16:{s:5:"title";s:8:"Password";s:7:"metakey";s:13:"user_password";s:4:"type";s:8:"password";s:5:"label";s:8:"Password";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";i:1;s:9:"min_chars";i:8;s:9:"max_chars";i:30;s:15:"force_good_pass";i:1;s:18:"force_confirm_pass";i:1;s:8:"position";s:1:"2";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}', + '_um_mode' => 'login', + '_um_core' => 'login', + '_um_login_use_globals' => 1, + ); + + $this->core_form_meta['profile'] = array( + '_um_custom_fields' => 'a:1:{s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}', + '_um_mode' => 'profile', + '_um_core' => 'profile', + '_um_profile_use_globals' => 1, + ); + + $this->email_notifications = apply_filters( 'um_email_notifications', array( + 'welcome_email' => array( + 'key' => 'welcome_email', + 'title' => __( 'Account Welcome Email','ultimate-member' ), + 'subject' => 'Welcome to {site_name}!', + 'body' => 'Hi {display_name},

            ' . + 'Thank you for signing up with {site_name}! Your account is now active.

            ' . + 'To login please visit the following url:

            ' . + '{login_url}

            ' . + 'Your account e-mail: {email}
            ' . + 'Your account username: {username}

            ' . + 'If you have any problems, please contact us at {admin_email}

            ' . + 'Thanks,
            ' . + '{site_name}', + 'description' => __('Whether to send the user an email when his account is automatically approved','ultimate-member'), + 'recipient' => 'user', + 'default_active' => true + ), + 'checkmail_email' => array( + 'key' => 'checkmail_email', + 'title' => __( 'Account Activation Email','ultimate-member' ), + 'subject' => 'Please activate your account', + 'body' => 'Hi {display_name},

            ' . + 'Thank you for signing up with {site_name}! To activate your account, please click the link below to confirm your email address:

            ' . + '{account_activation_link}

            ' . + 'If you have any problems, please contact us at {admin_email}

            ' . + 'Thanks,
            ' . + '{site_name}', + 'description' => __('Whether to send the user an email when his account needs e-mail activation','ultimate-member'), + 'recipient' => 'user' + ), + 'pending_email' => array( + 'key' => 'pending_email', + 'title' => __( 'Your account is pending review','ultimate-member' ), + 'subject' => '[{site_name}] New user account', + 'body' => 'Hi {display_name},

            ' . + 'Thank you for signing up with {site_name}! Your account is currently being reviewed by a member of our team.

            ' . + 'Please allow us some time to process your request.

            ' . + 'If you have any problems, please contact us at {admin_email}

            ' . + 'Thanks,
            ' . + '{site_name}', + 'description' => __('Whether to send the user an email when his account needs admin review','ultimate-member'), + 'recipient' => 'user' + ), + 'approved_email' => array( + 'key' => 'approved_email', + 'title' => __( 'Account Approved Email','ultimate-member' ), + 'subject' => 'Your account at {site_name} is now active', + 'body' => 'Hi {display_name},

            ' . + 'Thank you for signing up with {site_name}! Your account has been approved and is now active.

            ' . + 'To login please visit the following url:

            ' . + '{login_url}

            ' . + 'Your account e-mail: {email}
            ' . + 'Your account username: {username}
            ' . + 'Set your account password: {password_reset_link}

            ' . + 'If you have any problems, please contact us at {admin_email}

            ' . + 'Thanks,
            ' . + '{site_name}', + 'description' => __('Whether to send the user an email when his account is approved','ultimate-member'), + 'recipient' => 'user' + ), + 'rejected_email' => array( + 'key' => 'rejected_email', + 'title' => __( 'Account Rejected Email','ultimate-member' ), + 'subject' => 'Your account has been rejected', + 'body' => 'Hi {display_name},

            ' . + 'Thank you for applying for membership to {site_name}! We have reviewed your information and unfortunately we are unable to accept you as a member at this moment.

            ' . + 'Please feel free to apply again at a future date.

            ' . + 'Thanks,
            ' . + '{site_name}', + 'description' => __('Whether to send the user an email when his account is rejected','ultimate-member'), + 'recipient' => 'user' + ), + 'inactive_email' => array( + 'key' => 'inactive_email', + 'title' => __( 'Account Deactivated Email','ultimate-member' ), + 'subject' => 'Your account has been deactivated', + 'body' => 'Hi {display_name},

            ' . + 'This is an automated email to let you know your {site_name} account has been deactivated.

            ' . + 'If you would like your account to be reactivated please contact us at {admin_email}

            ' . + 'Thanks,
            ' . + '{site_name}', + 'description' => __('Whether to send the user an email when his account is deactivated','ultimate-member'), + 'recipient' => 'user', + 'default_active' => true + ), + 'deletion_email' => array( + 'key' => 'deletion_email', + 'title' => __( 'Account Deleted Email','ultimate-member' ), + 'subject' => 'Your account has been deleted', + 'body' => 'Hi {display_name},

            ' . + 'This is an automated email to let you know your {site_name} account has been deleted. All of your personal information has been permanently deleted and you will no longer be able to login to {site_name}.

            ' . + 'If your account has been deleted by accident please contact us at {admin_email}
            ' . + 'Thanks,
            ' . + '{site_name}', + 'description' => __('Whether to send the user an email when his account is deleted','ultimate-member'), + 'recipient' => 'user', + 'default_active' => true + ), + 'resetpw_email' => array( + 'key' => 'resetpw_email', + 'title' => __( 'Password Reset Email','ultimate-member' ), + 'subject' => 'Reset your password', + 'body' => 'Hi {display_name},

            ' . + 'We received a request to reset the password for your account. If you made this request, click the link below to change your password:

            ' . + '{password_reset_link}

            ' . + 'If you didn\'t make this request, you can ignore this email

            ' . + 'Thanks,
            ' . + '{site_name}', + 'description' => __('Whether to send an email when users changed their password (Recommended, please keep on)','ultimate-member'), + 'recipient' => 'user', + 'default_active' => true + ), + 'changedpw_email' => array( + 'key' => 'changedpw_email', + 'title' => __( 'Password Changed Email','ultimate-member' ), + 'subject' => 'Your {site_name} password has been changed', + 'body' => 'Hi {display_name},

            ' . + 'You recently changed the password associated with your {site_name} account.

            ' . + 'If you did not make this change and believe your {site_name} account has been compromised, please contact us at the following email address: {admin_email}

            ' . + 'Thanks,
            ' . + '{site_name}', + 'description' => __('Whether to send the user an email when he request to reset password (Recommended, please keep on)','ultimate-member'), + 'recipient' => 'user', + 'default_active' => true + ), + 'notification_new_user' => array( + 'key' => 'notification_new_user', + 'title' => __( 'New User Notification','ultimate-member' ), + 'subject' => '[{site_name}] New user account', + 'body' => '{display_name} has just created an account on {site_name}. To view their profile click here:

            ' . + '{user_profile_link}

            ' . + 'Here is the submitted registration form:

            ' . + '{submitted_registration}', + 'description' => __('Whether to receive notification when a new user account is approved','ultimate-member'), + 'recipient' => 'admin', + 'default_active' => true + ), + 'notification_review' => array( + 'key' => 'notification_review', + 'title' => __( 'Account Needs Review Notification','ultimate-member' ), + 'subject' => '[{site_name}] New user awaiting review', + 'body' => '{display_name} has just applied for membership to {site_name} and is waiting to be reviewed.

            ' . + 'To review this member please click the following link:

            ' . + '{user_profile_link}

            ' . + 'Here is the submitted registration form:

            ' . + '{submitted_registration}', + 'description' => __('Whether to receive notification when an account needs admin review','ultimate-member'), + 'recipient' => 'admin' + ), + 'notification_deletion' => array( + 'key' => 'notification_deletion', + 'title' => __( 'Account Deletion Notification','ultimate-member' ), + 'subject' => '[{site_name}] Account deleted', + 'body' => '{display_name} has just deleted their {site_name} account.', + 'description' => __('Whether to receive notification when an account is deleted','ultimate-member'), + 'recipient' => 'admin' + ) + ) ); + + + //settings defaults + $this->settings_defaults = array( + 'restricted_access_post_metabox' => array( 'post' => 1, 'page' => 1 ), + 'uninstall_on_delete' => 0, + 'permalink_base' => 'user_login', + 'display_name' => 'full_name', + 'display_name_field' => '', + 'author_redirect' => 1, + 'members_page' => 1, + 'use_gravatars' => 0, + 'use_um_gravatar_default_builtin_image' => 'default', + 'use_um_gravatar_default_image' => 0, + 'reset_require_strongpass' => 0, + 'account_tab_password' => 1, + 'account_tab_privacy' => 1, + 'account_tab_notifications' => 1, + 'account_tab_delete' => 1, + 'delete_account_text' => __('Are you sure you want to delete your account? This will erase all of your account data from the site. To delete your account enter your password below','ultimate-member'), + 'account_name' => 1, + 'account_name_disable' => 0, + 'account_name_require' => 1, + 'account_email' => 1, + 'account_hide_in_directory' => 1, + 'account_require_strongpass' => 0, + 'photo_thumb_sizes' => array( 40, 80, 190 ), + 'cover_thumb_sizes' => array( 300, 600 ), + 'accessible' => 0, + 'access_redirect' => '', + 'access_exclude_uris' => array(), + 'home_page_accessible' => 1, + 'category_page_accessible' => 1, + 'enable_reset_password_limit' => 1, + 'reset_password_limit_number' => 3, + 'blocked_emails' => '', + 'blocked_words' => 'admin' . "\r\n" . 'administrator' . "\r\n" . 'webmaster' . "\r\n" . 'support' . "\r\n" . 'staff', + 'default_avatar' => '', + 'default_cover' => '', + 'profile_show_metaicon' => 0, + 'profile_menu' => 1, + 'profile_menu_default_tab' => 'main', + 'profile_menu_icons' => 1, + 'form_asterisk' => 0, + 'profile_title' => '{display_name} | {site_name}', + 'profile_desc' => '{display_name} is on {site_name}. Join {site_name} to view {display_name}\'s profile', + 'allow_tracking' => 0, + 'admin_email' => get_bloginfo('admin_email'), + 'mail_from' => get_bloginfo('name'), + 'mail_from_addr' => get_bloginfo('admin_email'), + 'email_html' => 0, + ); + + $tabs = UM()->profile()->tabs_primary(); + foreach ( $tabs as $id => $tab ) { + $this->settings_defaults['profile_tab_' . $id] = 1; + $this->settings_defaults['profile_tab_' . $id . '_privacy'] = 0; + $this->settings_defaults['profile_tab_' . $id . '_roles'] = ''; + } + + foreach ( $this->email_notifications as $key => $notification ) { + $this->settings_defaults[$key . '_on'] = ! empty( $notification['default_active'] ); + $this->settings_defaults[$key . '_sub'] = $notification['subject']; + $this->settings_defaults[$key] = $notification['body']; + } + + foreach ( $this->core_pages as $page_s => $page ) { + $page_id = apply_filters( 'um_core_page_id_filter', 'core_' . $page_s ); + $this->settings_defaults[$page_id] = ''; + } + + foreach( $this->core_form_meta_all as $key => $value ) { + $this->settings_defaults[ str_replace( '_um_', '', $key ) ] = $value; + } + + + $this->settings_defaults = apply_filters( 'um_default_settings_values', $this->settings_defaults ); + + $this->permalinks = $this->get_core_pages(); + + + + $this->default_roles_metadata = array( + /* + * All caps map + * + * '_um_can_access_wpadmin' => 1, + '_um_can_not_see_adminbar' => 0, + '_um_can_edit_everyone' => 1, + '_um_can_edit_roles' => '', + '_um_can_delete_everyone' => 1, + '_um_can_delete_roles' => '', + '_um_after_delete' => '', + '_um_delete_redirect_url' => '', + '_um_can_edit_profile' => 1, + '_um_can_delete_profile' => 1, + '_um_default_homepage' => 1, + '_um_redirect_homepage' => '', + '_um_after_login' => 'redirect_admin', + '_um_login_redirect_url' => '', + '_um_after_logout' => 'redirect_home', + '_um_logout_redirect_url' => '', + '_um_can_view_all' => 1, + '_um_can_view_roles' => '', + '_um_can_make_private_profile' => 1, + '_um_can_access_private_profile' => 1, + '_um_status' => 'approved', + '_um_auto_approve_act' => 'redirect_profile', + '_um_auto_approve_url' => '', + '_um_login_email_activate' => '', + '_um_checkmail_action' => '', + '_um_checkmail_message' => '', + '_um_checkmail_url' => '', + '_um_url_email_activate' => '', + '_um_pending_action' => '', + '_um_pending_message' => '', + '_um_pending_url' => '', + * + * */ + + + 'subscriber' => array( + '_um_can_access_wpadmin' => 0, + '_um_can_not_see_adminbar' => 1, + '_um_can_edit_everyone' => 0, + '_um_can_delete_everyone' => 0, + '_um_can_edit_profile' => 1, + '_um_can_delete_profile' => 1, + '_um_after_login' => 'redirect_profile', + '_um_default_homepage' => 1, + '_um_can_view_all' => 1, + '_um_can_make_private_profile' => 0, + '_um_can_access_private_profile' => 0, + '_um_status' => 'approved', + '_um_auto_approve_act' => 'redirect_profile', + ), + 'author' => array( + '_um_can_access_wpadmin' => 0, + '_um_can_not_see_adminbar' => 1, + '_um_can_edit_everyone' => 0, + '_um_can_delete_everyone' => 0, + '_um_can_edit_profile' => 1, + '_um_can_delete_profile' => 1, + '_um_after_login' => 'redirect_profile', + '_um_default_homepage' => 1, + '_um_can_view_all' => 1, + '_um_can_make_private_profile' => 0, + '_um_can_access_private_profile' => 0, + '_um_status' => 'approved', + '_um_auto_approve_act' => 'redirect_profile', + ), + 'contributor' => array( + '_um_can_access_wpadmin' => 0, + '_um_can_not_see_adminbar' => 1, + '_um_can_edit_everyone' => 0, + '_um_can_delete_everyone' => 0, + '_um_can_edit_profile' => 1, + '_um_can_delete_profile' => 1, + '_um_after_login' => 'redirect_profile', + '_um_default_homepage' => 1, + '_um_can_view_all' => 1, + '_um_can_make_private_profile' => 0, + '_um_can_access_private_profile' => 0, + '_um_status' => 'approved', + '_um_auto_approve_act' => 'redirect_profile', + ), + 'editor' => array( + '_um_can_access_wpadmin' => 0, + '_um_can_not_see_adminbar' => 1, + '_um_can_edit_everyone' => 0, + '_um_can_delete_everyone' => 0, + '_um_can_edit_profile' => 1, + '_um_can_delete_profile' => 1, + '_um_after_login' => 'redirect_profile', + '_um_default_homepage' => 1, + '_um_can_view_all' => 1, + '_um_can_make_private_profile' => 0, + '_um_can_access_private_profile' => 0, + '_um_status' => 'approved', + '_um_auto_approve_act' => 'redirect_profile', + ), + 'administrator' => array( + '_um_can_access_wpadmin' => 1, + '_um_can_not_see_adminbar' => 0, + '_um_can_edit_everyone' => 1, + '_um_can_delete_everyone' => 1, + '_um_can_edit_profile' => 1, + '_um_can_delete_profile' => 1, + '_um_default_homepage' => 1, + '_um_after_login' => 'redirect_admin', + '_um_after_logout' => 'redirect_home', + '_um_can_view_all' => 1, + '_um_can_make_private_profile' => 1, + '_um_can_access_private_profile' => 1, + '_um_status' => 'approved', + '_um_auto_approve_act' => 'redirect_profile', + ), + ); + } + + + function get_core_pages() { + $permalink = array(); + $core_pages = array_keys( $this->core_pages ); + if ( empty( $core_pages ) ) + return $permalink; + + foreach ( $core_pages as $page_key ) { + $page_option_key = apply_filters( 'um_core_page_id_filter', 'core_' . $page_key ); + $permalink[$page_key] = UM()->um_get_option( $page_option_key ); + } + + return $permalink; + } + //end class + } +} \ No newline at end of file diff --git a/includes/class-dependencies.php b/includes/class-dependencies.php new file mode 100644 index 00000000..c09853a2 --- /dev/null +++ b/includes/class-dependencies.php @@ -0,0 +1,132 @@ +=' ); + + } + + + /** + * @param string $extension_version Extension version + * @return mixed + */ + public static function php_version_check( $extension_version ) { + + return version_compare( phpversion(), $extension_version, '>=' ); + + } + + } +} + + +if ( ! function_exists( 'is_um_active' ) ) { + /** + * Check UltimateMember core is active + * + * @return bool active - true | inactive - false + */ + function is_um_active() { + return Dependencies::ultimatemember_active_check(); + } +} + + +if ( ! function_exists( 'is_um_version_required' ) ) { + /** + * Check UltimateMember core required version + * + * @return bool Larger then required - true | Less than necessary - false + */ + function is_um_version_required( $version ) { + return Dependencies::ultimatemember_version_check( $version ); + } +} \ No newline at end of file diff --git a/includes/class-functions.php b/includes/class-functions.php new file mode 100644 index 00000000..58491d11 --- /dev/null +++ b/includes/class-functions.php @@ -0,0 +1,181 @@ +init_variables(); + + } + + + /** + * What type of request is this? + * + * @param string $type String containing name of request type (ajax, frontend, cron or admin) + * + * @return bool + */ + public function is_request( $type ) { + switch ( $type ) { + case 'admin' : + return is_admin(); + case 'ajax' : + return defined( 'DOING_AJAX' ); + case 'cron' : + return defined( 'DOING_CRON' ); + case 'frontend' : + return ( ! is_admin() || defined( 'DOING_AJAX' ) ) && ! defined( 'DOING_CRON' ); + } + + return false; + } + + + /** + * Get ajax routed URL + * + * @param string $route + * @param string $method + * + * @return string + */ + public function get_ajax_route( $route, $method ) { + + $route = str_replace( array( '\\', '/' ), '!', $route ); + $ip = isset( $_SERVER['REMOTE_ADDR'] ) ? $_SERVER['REMOTE_ADDR'] : ''; + $nonce = wp_create_nonce( $ip . get_current_user_id() . $route . $method ); + + if ( is_admin() ) { + $url = add_query_arg( array( + 'action' => 'um_router', + 'um_action' => 'route', + 'um_resource' => $route, + 'um_method' => $method, + 'um_verify' => $nonce + ), get_admin_url( null, 'admin-ajax.php' ) ); + } else if ( get_option( 'permalink_structure' ) ) { + $url = get_site_url( null, 'um-api/route/' . $route . '/' . $method . '/' . $nonce ); + } else { + $url = add_query_arg( array( + 'um_page' => 'api', + 'um_action' => 'route', + 'um_resource' => $route, + 'um_method' => $method, + 'um_verify' => $nonce + ), get_site_url() ); + } + return $url; + } + + + /** + * Set variables + */ + function init_variables() { + $this->options = get_option( 'um_options' ); + } + + + function um_get_option( $option_id ) { + if ( isset( $this->options[ $option_id ] ) ) + return apply_filters( "um_get_option_filter__{$option_id}", $this->options[ $option_id ] ); + + switch ( $option_id ) { + case 'site_name': + return get_bloginfo( 'name' ); + break; + case 'admin_email': + return get_bloginfo( 'admin_email' ); + break; + default: + return ''; + break; + + } + } + + + function um_update_option( $option_id, $value ) { + $this->options[ $option_id ] = $value; + update_option( 'um_options', $this->options ); + } + + + function um_remove_option( $option_id ) { + if ( ! empty( $this->options[ $option_id ] ) ) + unset( $this->options[ $option_id ] ); + + update_option( 'um_options', $this->options ); + } + + + function um_get_default( $option_id ) { + $settings_defaults = UM()->config()->settings_defaults; + if ( ! isset( $settings_defaults[$option_id] ) ) + return false; + + return $settings_defaults[$option_id]; + } + + + /** + * Help Tip displaying + * + * Function for render/displaying UltimateMember help tip + * + * @since 2.0.0 + * + * @param string $tip Help tip text + * @param bool $allow_html Allow sanitized HTML if true or escape + * @param bool $echo Return HTML or echo + * @return string + */ + function tooltip( $tip, $allow_html = false, $echo = true ) { + if ( $allow_html ) { + + $tip = htmlspecialchars( wp_kses( html_entity_decode( $tip ), array( + 'br' => array(), + 'em' => array(), + 'strong' => array(), + 'small' => array(), + 'span' => array(), + 'ul' => array(), + 'li' => array(), + 'ol' => array(), + 'p' => array(), + ) ) ); + + } else { + $tip = esc_attr( $tip ); + } + + ob_start(); ?> + + + + classes[ $name ] ) ) + $this->classes[ $name ] = apply_filters( 'um_call_object_' . $name, false ); + + return $this->classes[ $name ]; + + } + + + /** + * Function for add classes to $this->classes + * for run using UM() + * + * @param $class_name + * @param bool $instance + */ + public function set_class( $class_name, $instance = false ) { + if ( empty( $this->classes[$class_name] ) ) { + $class = 'UM_' . $class_name; + $this->classes[$class_name] = $instance ? $class::instance() : new $class; + } + } + + + /** + * Cloning is forbidden. + * @since 1.0 + */ + public function __clone() { + _doing_it_wrong( __FUNCTION__, __( 'Cheatin’ huh?', 'ultimate-member' ), '1.0' ); + } + + + /** + * Unserializing instances of this class is forbidden. + * @since 1.0 + */ + public function __wakeup() { + _doing_it_wrong( __FUNCTION__, __( 'Cheatin’ huh?', 'ultimate-member' ), '1.0' ); + } + + + /** + * UM constructor. + */ + function __construct() { + parent::__construct(); + + spl_autoload_register( array( $this, 'um__autoloader' ) ); + + if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) { + + $this->is_filtering = 0; + $this->honeypot = 'request'; + $this->available_languages = array( + 'en_US' => 'English (US)', + 'es_ES' => 'Español', + 'es_MX' => 'Español (México)', + 'fr_FR' => 'Français', + 'it_IT' => 'Italiano', + 'de_DE' => 'Deutsch', + 'nl_NL' => 'Nederlands', + 'pt_BR' => 'Português do Brasil', + 'fi_FI' => 'Suomi', + 'ro_RO' => 'Română', + 'da_DK' => 'Dansk', + 'sv_SE' => 'Svenska', + 'pl_PL' => 'Polski', + 'cs_CZ' => 'Czech', + 'el' => 'Greek', + 'id_ID' => 'Indonesian', + 'zh_CN' => '简体中文', + 'ru_RU' => 'Русский', + 'tr_TR' => 'Türkçe', + 'fa_IR' => 'Farsi', + 'he_IL' => 'Hebrew', + 'ar' => 'العربية', + ); + + $this->includes(); + + register_activation_hook( um_plugin, array( &$this, 'activation' ) ); + + $language_domain = 'ultimate-member'; + $language_domain = apply_filters( 'um_language_textdomain', $language_domain ); + + $language_locale = ( get_locale() != '' ) ? get_locale() : 'en_US'; + $language_locale = apply_filters( 'um_language_locale', $language_locale ); + + $language_file = WP_LANG_DIR . '/plugins/' . $language_domain . '-' . $language_locale . '.mo'; + $language_file = apply_filters( 'um_language_file', $language_file ); + + load_textdomain( $language_domain, $language_file ); + + require_once 'um-short-functions.php'; + + add_action( 'plugins_loaded', array( &$this, 'init' ), 0 ); + // init widgets + add_action( 'widgets_init', array( &$this, 'widgets_init' ) ); + + add_action( 'admin_init', array( &$this, 'redirect_to_about' ) ); + } + } + + + function um__autoloader( $class ) { + if ( strpos( $class, 'um' ) === 0 ) { + + $array = explode( '\\', strtolower( $class ) ); + $array[ count( $array ) - 1 ] = 'class-'. end( $array ); + if ( strpos( $class, 'um_ext' ) === 0 ) { + $full_path = str_replace( 'ultimate-member', '', rtrim( um_path, '/' ) ) . str_replace( '_', '-', $array[1] ) . '/includes/'; + unset( $array[0], $array[1] ); + $path = implode( DIRECTORY_SEPARATOR, $array ); + $path = str_replace( '_', '-', $path ); + $full_path .= $path . '.php'; + } else { + $class = implode( '\\', $array ); + $slash = DIRECTORY_SEPARATOR; + $path = str_replace( + array( 'um\\', '_', '\\' ), + array( $slash, '-', $slash ), + $class ); + $full_path = um_path . 'includes' . $path . '.php'; + } + + include_once $full_path; + } + } + + + /** + * Plugin Activation + */ + function activation() { + //first install + $version = get_option( 'um_version' ); + if ( ! $version ) + update_option( 'um_last_version_upgrade', ultimatemember_version ); + + if ( $version != ultimatemember_version ) + update_option( 'um_version', ultimatemember_version ); + + //run setup + $this->setup()->run_setup(); + + if ( $version != ultimatemember_version ) { + update_option( 'um_need_show_about', true ); + } + } + + + function redirect_to_about() { + if ( get_option( 'um_need_show_about' ) ) { + delete_option( 'um_need_show_about' ); + wp_redirect( admin_url( 'admin.php?page=ultimatemember-about' ) ); + exit; + } + } + + + /** + * Include required core files used in admin and on the frontend. + * + * @return void + */ + public function includes() { + + $this->common(); + + if ( $this->is_request( 'ajax' ) ) { + $this->admin(); + $this->ajax_init(); + $this->metabox(); + } elseif ( $this->is_request( 'admin' ) ) { + $this->admin(); + $this->admin_menu(); + $this->admin_upgrade(); + $this->admin_settings(); + $this->columns(); + $this->admin_enqueue(); + $this->functions(); + $this->metabox(); + $this->notices(); + $this->users(); + $this->dragdrop(); + } elseif ( $this->is_request( 'frontend' ) ) { + $this->rewrite(); + $this->account(); + $this->password(); + $this->login(); + $this->register(); + $this->user_posts(); + $this->access(); + $this->mail(); + $this->members(); + $this->logout(); + } + + //common includes + $this->rest_api(); + $this->enqueue(); + $this->shortcodes(); + $this->roles(); + $this->user(); + $this->profile(); + $this->builtin(); + $this->form(); + $this->permalinks(); + $this->modal(); + $this->cron(); + $this->tracking(); + $this->mobile(); + } + + + function common() { + if ( empty( $this->classes['common'] ) ) { + $this->classes['common'] = new um\core\Common(); + } + return $this->classes['common']; + } + + + function ajax_init() { + new um\core\AJAX_Common(); + } + + + /** + * @return um\admin\Admin() + */ + function admin() { + if ( empty( $this->classes['admin'] ) ) { + $this->classes['admin'] = new um\admin\Admin(); + } + return $this->classes['admin']; + } + + + /** + * @return um\admin\core\Admin_Menu() + */ + function admin_menu() { + if ( empty( $this->classes['admin_menu'] ) ) { + $this->classes['admin_menu'] = new um\admin\core\Admin_Menu(); + } + return $this->classes['admin_menu']; + } + + + /** + * @return um\admin\core\Admin_Settings() + */ + function admin_settings() { + if ( empty( $this->classes['admin_settings'] ) ) { + $this->classes['admin_settings'] = new um\admin\core\Admin_Settings(); + } + return $this->classes['admin_settings']; + } + + + /** + * @return um\admin\core\Admin_Upgrade() + */ + function admin_upgrade() { + if ( empty( $this->classes['admin_upgrade'] ) ) { + $this->classes['admin_upgrade'] = new um\admin\core\Admin_Upgrade(); + } + return $this->classes['admin_upgrade']; + } + + + /** + * @return um\admin\core\Admin_Columns() + */ + function columns() { + if ( empty( $this->classes['admin_columns'] ) ) { + $this->classes['admin_columns'] = new um\admin\core\Admin_Columns(); + } + return $this->classes['admin_columns']; + } + + + /** + * @return um\admin\core\Admin_Enqueue() + */ + function admin_enqueue() { + if ( empty( $this->classes['admin_enqueue'] ) ) { + $this->classes['admin_enqueue'] = new um\admin\core\Admin_Enqueue(); + } + return $this->classes['admin_enqueue']; + } + + + /** + * @return um\admin\core\Admin_Functions() + */ + function functions() { + if ( empty( $this->classes['admin_functions'] ) ) { + $this->classes['admin_functions'] = new um\admin\core\Admin_Functions(); + } + return $this->classes['admin_functions']; + } + + + /** + * @return um\admin\core\Admin_Metabox() + */ + function metabox() { + if ( empty( $this->classes['admin_metabox'] ) ) { + $this->classes['admin_metabox'] = new um\admin\core\Admin_Metabox(); + } + return $this->classes['admin_metabox']; + } + + + /** + * @return um\admin\core\Admin_Notices() + */ + function notices() { + if ( empty( $this->classes['admin_notices'] ) ) { + $this->classes['admin_notices'] = new um\admin\core\Admin_Notices(); + } + return $this->classes['admin_notices']; + } + + + /** + * @return um\admin\core\Admin_Users() + */ + function users() { + if ( empty( $this->classes['admin_users'] ) ) { + $this->classes['admin_users'] = new um\admin\core\Admin_Users(); + } + return $this->classes['admin_users']; + } + + + /** + * @return um\admin\core\Admin_Builder() + */ + function builder() { + if ( empty( $this->classes['admin_builder'] ) ) { + $this->classes['admin_builder'] = new um\admin\core\Admin_Builder(); + } + return $this->classes['admin_builder']; + } + + + /** + * @return um\admin\core\Admin_DragDrop() + */ + function dragdrop() { + if ( empty( $this->classes['admin_dragdrop'] ) ) { + $this->classes['admin_dragdrop'] = new um\admin\core\Admin_DragDrop(); + } + return $this->classes['admin_dragdrop']; + } + + + /** + * @param $data array + * @return um\admin\core\Admin_Forms() + */ + function admin_forms( $data ) { + if ( empty( $this->classes['admin_forms_' . $data['class']] ) ) { + $this->classes['admin_forms_' . $data['class']] = new um\admin\core\Admin_Forms( $data ); + } + return $this->classes['admin_forms_' . $data['class']]; + } + + + + /** + * @return um\Dependencies + */ + function dependencies() { + if ( empty( $this->classes['dependencies'] ) ) { + $this->classes['dependencies'] = new um\Dependencies(); + } + + return $this->classes['dependencies']; + } + + + /** + * @return um\Config + */ + function config() { + if ( empty( $this->classes['config'] ) ) { + $this->classes['config'] = new um\Config(); + } + + return $this->classes['config']; + } + + + /** + * @return um\core\REST_API + */ + function rest_api() { + if ( empty( $this->classes['rest_api'] ) ) { + $this->classes['rest_api'] = new um\core\REST_API(); + } + + return $this->classes['rest_api']; + } + + + /** + * @return um\core\Rewrite + */ + function rewrite() { + if ( empty( $this->classes['rewrite'] ) ) { + $this->classes['rewrite'] = new um\core\Rewrite(); + } + + return $this->classes['rewrite']; + } + + + /** + * @return um\core\Setup + */ + function setup() { + if ( empty( $this->classes['setup'] ) ) { + $this->classes['setup'] = new um\core\Setup(); + } + + return $this->classes['setup']; + } + + + /** + * @return um\core\FontIcons + */ + function fonticons() { + if ( empty( $this->classes['fonticons'] ) ) { + $this->classes['fonticons'] = new um\core\FontIcons(); + } + + return $this->classes['fonticons']; + } + + + /** + * @return um\core\Login + */ + function login() { + if ( empty( $this->classes['login'] ) ) { + $this->classes['login'] = new um\core\Login(); + } + + return $this->classes['login']; + } + + + /** + * @return um\core\Register + */ + function register() { + if ( empty( $this->classes['register'] ) ) { + $this->classes['register'] = new um\core\Register(); + } + + return $this->classes['register']; + } + + + /** + * @return um\core\Enqueue + */ + function enqueue() { + if ( empty( $this->classes['enqueue'] ) ) { + $this->classes['enqueue'] = new um\core\Enqueue(); + } + + return $this->classes['enqueue']; + } + + + /** + * @return um\core\Shortcodes + */ + function shortcodes() { + if ( empty( $this->classes['shortcodes'] ) ) { + $this->classes['shortcodes'] = new um\core\Shortcodes(); + } + + return $this->classes['shortcodes']; + } + + + /** + * @return um\core\Account + */ + function account() { + if ( empty( $this->classes['account'] ) ) { + $this->classes['account'] = new um\core\Account(); + } + + return $this->classes['account']; + } + + + /** + * @return um\core\Password + */ + function password() { + if ( empty( $this->classes['password'] ) ) { + $this->classes['password'] = new um\core\Password(); + } + + return $this->classes['password']; + } + + + /** + * @return um\core\Form + */ + function form() { + if ( empty( $this->classes['form'] ) ) { + $this->classes['form'] = new um\core\Form(); + } + + return $this->classes['form']; + } + + + /** + * @return um\core\Fields + */ + function fields() { + if ( empty( $this->classes['fields'] ) ) { + $this->classes['fields'] = new um\core\Fields(); + } + + return $this->classes['fields']; + } + + + /** + * @return um\core\User + */ + function user() { + if ( empty( $this->classes['user'] ) ) { + $this->classes['user'] = new um\core\User(); + } + + return $this->classes['user']; + } + + + /** + * @return um\core\Roles_Capabilities + */ + function roles() { + if ( empty( $this->classes['roles'] ) ) { + $this->classes['roles'] = new um\core\Roles_Capabilities(); + } + + return $this->classes['roles']; + } + + + /** + * @return um\core\User_posts + */ + function user_posts() { + if ( empty( $this->classes['user_posts'] ) ) { + $this->classes['user_posts'] = new um\core\User_posts(); + } + + return $this->classes['user_posts']; + } + + + /** + * @return um\core\Profile + */ + function profile() { + if ( empty( $this->classes['profile'] ) ) { + $this->classes['profile'] = new um\core\Profile(); + } + + return $this->classes['profile']; + } + + + /** + * @return um\core\Query + */ + function query() { + if ( empty( $this->classes['query'] ) ) { + $this->classes['query'] = new um\core\Query(); + } + + return $this->classes['query']; + } + + + /** + * @return um\core\Date_Time + */ + function datetime() { + if ( empty( $this->classes['datetime'] ) ) { + $this->classes['datetime'] = new um\core\Date_Time(); + } + + return $this->classes['datetime']; + } + + + /** + * @return um\core\Chart + */ + function chart() { + if ( empty( $this->classes['chart'] ) ) { + $this->classes['chart'] = new um\core\Chart(); + } + + return $this->classes['chart']; + } + + + /** + * @return um\core\Builtin + */ + function builtin() { + if ( empty( $this->classes['builtin'] ) ) { + $this->classes['builtin'] = new um\core\Builtin(); + } + + return $this->classes['builtin']; + } + + + /** + * @return um\core\Files + */ + function files() { + if ( empty( $this->classes['files'] ) ) { + $this->classes['files'] = new um\core\Files(); + } + + return $this->classes['files']; + } + + + /** + * @return um\core\Validation + */ + function validation() { + if ( empty( $this->classes['validation'] ) ) { + $this->classes['validation'] = new um\core\Validation(); + } + + return $this->classes['validation']; + } + + + /** + * @return um\core\Menu + */ + function menu() { + if ( empty( $this->classes['menu'] ) ) { + $this->classes['menu'] = new um\core\Menu(); + } + + return $this->classes['menu']; + } + + + /** + * @return um\core\Access + */ + function access() { + if ( empty( $this->classes['access'] ) ) { + $this->classes['access'] = new um\core\Access(); + } + + return $this->classes['access']; + } + + + /** + * @return um\core\Permalinks + */ + function permalinks() { + if ( empty( $this->classes['permalinks'] ) ) { + $this->classes['permalinks'] = new um\core\Permalinks(); + } + + return $this->classes['permalinks']; + } + + + /** + * @return um\core\Mail + */ + function mail() { + if ( empty( $this->classes['mail'] ) ) { + $this->classes['mail'] = new um\core\Mail(); + } + + return $this->classes['mail']; + } + + + /** + * @return um\core\Members + */ + function members() { + if ( empty( $this->classes['members'] ) ) { + $this->classes['members'] = new um\core\Members(); + } + + return $this->classes['members']; + } + + + /** + * @return um\core\Logout + */ + function logout() { + if ( empty( $this->classes['logout'] ) ) { + $this->classes['logout'] = new um\core\Logout(); + } + + return $this->classes['logout']; + } + + + /** + * @return um\core\Modal + */ + function modal() { + if ( empty( $this->classes['modal'] ) ) { + $this->classes['modal'] = new um\core\Modal(); + } + + return $this->classes['modal']; + } + + + /** + * @return um\core\Cron + */ + function cron() { + if ( empty( $this->classes['cron'] ) ) { + $this->classes['cron'] = new um\core\Cron(); + } + + return $this->classes['cron']; + } + + + /** + * @return um\core\Tracking + */ + function tracking() { + if ( empty( $this->classes['tracking'] ) ) { + $this->classes['tracking'] = new um\core\Tracking(); + } + + return $this->classes['tracking']; + } + + + /** + * @return um\lib\mobiledetect\Mobile_Detect + */ + function mobile() { + if ( empty( $this->classes['mobile'] ) ) { + $this->classes['mobile'] = new um\lib\mobiledetect\Mobile_Detect(); + } + + return $this->classes['mobile']; + } + + + /*** + *** @Init + */ + function init() { + + ob_start(); + + require_once 'core/um-navmenu.php'; + + require_once 'core/um-actions-form.php'; + require_once 'core/um-actions-access.php'; + require_once 'core/um-actions-wpadmin.php'; + require_once 'core/um-actions-core.php'; + require_once 'core/um-actions-ajax.php'; + require_once 'core/um-actions-login.php'; + require_once 'core/um-actions-register.php'; + require_once 'core/um-actions-profile.php'; + require_once 'core/um-actions-account.php'; + require_once 'core/um-actions-password.php'; + require_once 'core/um-actions-members.php'; + require_once 'core/um-actions-global.php'; + require_once 'core/um-actions-user.php'; + require_once 'core/um-actions-save-profile.php'; + require_once 'core/um-actions-misc.php'; + + require_once 'core/um-filters-language.php'; + require_once 'core/um-filters-login.php'; + require_once 'core/um-filters-fields.php'; + require_once 'core/um-filters-files.php'; + require_once 'core/um-filters-navmenu.php'; + require_once 'core/um-filters-avatars.php'; + require_once 'core/um-filters-arguments.php'; + require_once 'core/um-filters-user.php'; + require_once 'core/um-filters-members.php'; + require_once 'core/um-filters-profile.php'; + require_once 'core/um-filters-account.php'; + require_once 'core/um-filters-misc.php'; + require_once 'core/um-filters-commenting.php'; + + if ( ! get_option( 'show_avatars' ) ) + update_option( 'show_avatars', 1 ); + + } + + function widgets_init() { + register_widget( 'um\widgets\UM_Search_Widget' ); + } + + } +} + + +function UM() { + return UM::instance(); +} + +// Global for backwards compatibility. +$GLOBALS['ultimatemember'] = UM(); \ No newline at end of file diff --git a/includes/core/class-access.php b/includes/core/class-access.php new file mode 100644 index 00000000..61ce827b --- /dev/null +++ b/includes/core/class-access.php @@ -0,0 +1,480 @@ +redirect_handler = false; + $this->allow_access = false; + + add_action( 'template_redirect', array( &$this, 'template_redirect' ), 1000 ); + + //protect posts types + add_filter( 'the_posts', array( &$this, 'filter_protected_posts' ), 99, 2 ); + + //protect pages for wp_list_pages func + add_filter( 'get_pages', array( &$this, 'filter_protected_posts' ), 99, 2 ); + + //filter menu items + add_filter( 'wp_nav_menu_objects', array( &$this, 'filter_menu' ), 99, 2 ); + } + + + /** + * Set custom access actions and redirection + * + * Old global restrict content logic + */ + function template_redirect() { + global $post; + + do_action('um_access_global_settings'); + + do_action('um_access_user_custom_homepage'); + + do_action('um_access_frontpage_per_role'); + + do_action('um_access_homepage_per_role'); + + if ( $this->redirect_handler && $this->allow_access == false && + ( ! um_is_core_page('login') || um_is_core_page( 'login' ) && is_user_logged_in() ) ) { + + // login page add protected page automatically + + if ( strstr( $this->redirect_handler, um_get_core_page('login') ) ){ + $curr = UM()->permalinks()->get_current_url(); + $this->redirect_handler = esc_url( add_query_arg('redirect_to', urlencode_deep( $curr ), $this->redirect_handler) ); + } + + wp_redirect( $this->redirect_handler ); + + } + + } + + + /** + * Get custom access settings meta + * @param integer $post_id + * @return array + */ + function get_meta( $post_id ) { + global $post; + $meta = get_post_custom( $post_id ); + if ( isset( $meta ) && is_array( $meta ) ) { + foreach ($meta as $k => $v){ + if ( strstr($k, '_um_') ) { + $k = str_replace('_um_', '', $k); + $array[$k] = $v[0]; + } + } + } + if ( isset( $array ) ) + return (array)$array; + else + return array(''); + } + + + /** + * Sets a custom access referer in a redirect URL + * + * @param string $url + * @param string $referer + * + * @return string + */ + function set_referer( $url, $referer ) { + + $enable_referer = apply_filters( "um_access_enable_referer", false ); + if( ! $enable_referer ) return $url; + + $url = add_query_arg( 'um_ref', $referer, $url ); + return $url; + } + + + /** + * User can some of the roles array + * Restrict content new logic + * + * @param $user_id + * @param $roles + * @return bool + */ + function user_can( $user_id, $roles ) { + + $user_can = false; + + if ( ! empty( $roles ) ) { + foreach ( $roles as $key => $value ) { + if ( ! empty( $value ) && user_can( $user_id, $key ) ) { + $user_can = true; + } + } + } + + return $user_can; + } + + + /** + * Get privacy settings for post + * return false if post is not private + * Restrict content new logic + * + * @param $post + * @return bool|array + */ + function get_post_privacy_settings( $post ) { + //if logged in administrator all pages are visible + if ( current_user_can( 'administrator' ) ) + return false; + + //exlude from privacy UM default pages (except Members list and User(Profile) page) + if ( um_is_core_post( $post, 'login' ) || um_is_core_post( $post, 'register' ) || + um_is_core_post( $post, 'account' ) || um_is_core_post( $post, 'logout' ) || + um_is_core_post( $post, 'password-reset' ) ) + return false; + + $restricted_posts = um_get_option( 'restricted_access_post_metabox' ); + + if ( ! empty( $restricted_posts[$post->post_type] ) ) { + $restriction = get_post_meta( $post->ID, 'um_content_restriction', true ); + + if ( ! empty( $restriction['_um_custom_access_settings'] ) ) { + if ( ! isset( $restriction['_um_accessible'] ) || '0' == $restriction['_um_accessible'] ) + return false; + else + return $restriction; + } + } + + //post hasn't privacy settings....check all terms of this post + $restricted_taxonomies = um_get_option( 'restricted_access_taxonomy_metabox' ); + + //get all taxonomies for current post type + $taxonomies = get_object_taxonomies( $post ); + + //get all post terms + $terms = array(); + if ( ! empty( $taxonomies ) ) { + foreach ( $taxonomies as $taxonomy ) { + if ( empty( $restricted_taxonomies[$taxonomy] ) ) + continue; + + $terms = array_merge( $terms, wp_get_post_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) ) ); + } + } + + //get restriction options for first term with privacy settigns + foreach ( $terms as $term_id ) { + $restriction = get_term_meta( $term_id, 'um_content_restriction', true ); + + if ( ! empty( $restriction['_um_custom_access_settings'] ) ) { + if ( ! isset( $restriction['_um_accessible'] ) || '0' == $restriction['_um_accessible'] ) + continue; + else + return $restriction; + } + } + + + //post is public + return false; + } + + + /** + * Protect Post Types in query + * Restrict content new logic + * + * @param $posts + * @param $query + * @return array + */ + function filter_protected_posts( $posts, $query ) { + $filtered_posts = array(); + + //if empty + if ( empty( $posts ) ) + return $posts; + + $restricted_global_message = um_get_option( 'restricted_access_message' ); + + //other filter + foreach ( $posts as $post ) { + + $restriction = $this->get_post_privacy_settings( $post ); + if ( ! $restriction ) { + $filtered_posts[] = $post; + continue; + } + + //post is private + if ( '1' == $restriction['_um_accessible'] ) { + //if post for not logged in users and user is not logged in + if ( ! is_user_logged_in() ) { + $filtered_posts[] = $post; + continue; + } else { + + if ( current_user_can( 'administrator' ) ) { + $filtered_posts[] = $post; + continue; + } + + if ( ! $query->is_singular ) { + //if not single query when exclude if set _um_access_hide_from_queries + if ( empty( $restriction['_um_access_hide_from_queries'] ) ) { + + if ( ! isset( $restriction['_um_noaccess_action'] ) || '0' == $restriction['_um_noaccess_action'] ) { + + if ( ! isset( $restriction['_um_restrict_by_custom_message'] ) || '0' == $restriction['_um_restrict_by_custom_message'] ) { + $post->post_content = $restricted_global_message; + } elseif ( '1' == $restriction['_um_restrict_by_custom_message'] ) { + $post->post_content = ! empty( $restriction['_um_restrict_custom_message'] ) ? $restriction['_um_restrict_custom_message'] : ''; + } + + } + + $filtered_posts[] = $post; + continue; + } + } else { + //if single post query + if ( ! isset( $restriction['_um_noaccess_action'] ) || '0' == $restriction['_um_noaccess_action'] ) { + + if ( ! isset( $restriction['_um_restrict_by_custom_message'] ) || '0' == $restriction['_um_restrict_by_custom_message'] ) { + $post->post_content = $restricted_global_message; + } elseif ( '1' == $restriction['_um_restrict_by_custom_message'] ) { + $post->post_content = ! empty( $restriction['_um_restrict_custom_message'] ) ? $restriction['_um_restrict_custom_message'] : ''; + } + + $filtered_posts[] = $post; + continue; + } elseif ( '1' == $restriction['_um_noaccess_action'] ) { + $curr = UM()->permalinks()->get_current_url(); + + if ( ! isset( $restriction['_um_access_redirect'] ) || '0' == $restriction['_um_access_redirect'] ) { + + exit( wp_redirect( esc_url( add_query_arg( 'redirect_to', urlencode_deep( $curr ), um_get_core_page( 'login' ) ) ) ) ); + + } elseif ( '1' == $restriction['_um_access_redirect'] ) { + + if ( ! empty( $restriction['_um_access_redirect_url'] ) ) { + $redirect = $restriction['_um_access_redirect_url']; + } else { + $redirect = esc_url( add_query_arg( 'redirect_to', urlencode_deep( $curr ), um_get_core_page( 'login' ) ) ); + } + + exit( wp_redirect( $redirect ) ); + } + + } + } + } + } elseif ( '2' == $restriction['_um_accessible'] ) { + //if post for logged in users and user is not logged in + if ( is_user_logged_in() ) { + + if ( current_user_can( 'administrator' ) ) { + $filtered_posts[] = $post; + continue; + } + + $user_can = $this->user_can( get_current_user_id(), $restriction['_um_access_roles'] ); + + if ( $user_can ) { + $filtered_posts[] = $post; + continue; + } + + if ( ! $query->is_singular ) { + //if not single query when exclude if set _um_access_hide_from_queries + if ( empty( $restriction['_um_access_hide_from_queries'] ) ) { + + if ( ! isset( $restriction['_um_noaccess_action'] ) || '0' == $restriction['_um_noaccess_action'] ) { + + if ( ! isset( $restriction['_um_restrict_by_custom_message'] ) || '0' == $restriction['_um_restrict_by_custom_message'] ) { + $post->post_content = $restricted_global_message; + } elseif ( '1' == $restriction['_um_restrict_by_custom_message'] ) { + $post->post_content = ! empty( $restriction['_um_restrict_custom_message'] ) ? $restriction['_um_restrict_custom_message'] : ''; + } + + } + + $filtered_posts[] = $post; + continue; + } + } else { + //if single post query + if ( ! isset( $restriction['_um_noaccess_action'] ) || '0' == $restriction['_um_noaccess_action'] ) { + + if ( ! isset( $restriction['_um_restrict_by_custom_message'] ) || '0' == $restriction['_um_restrict_by_custom_message'] ) { + $post->post_content = $restricted_global_message; + } elseif ( '1' == $restriction['_um_restrict_by_custom_message'] ) { + $post->post_content = ! empty( $restriction['_um_restrict_custom_message'] ) ? $restriction['_um_restrict_custom_message'] : ''; + } + + $filtered_posts[] = $post; + continue; + } elseif ( '1' == $restriction['_um_noaccess_action'] ) { + + $curr = UM()->permalinks()->get_current_url(); + + if ( ! isset( $restriction['_um_access_redirect'] ) || '0' == $restriction['_um_access_redirect'] ) { + + exit( wp_redirect( esc_url( add_query_arg( 'redirect_to', urlencode_deep( $curr ), um_get_core_page( 'login' ) ) ) ) ); + + } elseif ( '1' == $restriction['_um_access_redirect'] ) { + + if ( ! empty( $restriction['_um_access_redirect_url'] ) ) { + $redirect = $restriction['_um_access_redirect_url']; + } else { + $redirect = esc_url( add_query_arg( 'redirect_to', urlencode_deep( $curr ), um_get_core_page( 'login' ) ) ); + } + + exit( wp_redirect( $redirect ) ); + } + + } + } + + } else { + if ( ! $query->is_singular ) { + if ( empty( $restriction['_um_access_hide_from_queries'] ) ) { + + if ( ! isset( $restriction['_um_noaccess_action'] ) || '0' == $restriction['_um_noaccess_action'] ) { + + if ( ! isset( $restriction['_um_restrict_by_custom_message'] ) || '0' == $restriction['_um_restrict_by_custom_message'] ) { + $post->post_content = $restricted_global_message; + } elseif ( '1' == $restriction['_um_restrict_by_custom_message'] ) { + $post->post_content = ! empty( $restriction['_um_restrict_custom_message'] ) ? $restriction['_um_restrict_custom_message'] : ''; + } + + } + + $filtered_posts[] = $post; + continue; + } + } else { + //if single post query + if ( ! isset( $restriction['_um_noaccess_action'] ) || '0' == $restriction['_um_noaccess_action'] ) { + + if ( ! isset( $restriction['_um_restrict_by_custom_message'] ) || '0' == $restriction['_um_restrict_by_custom_message'] ) { + $post->post_content = $restricted_global_message; + } elseif ( '1' == $restriction['_um_restrict_by_custom_message'] ) { + $post->post_content = ! empty( $restriction['_um_restrict_custom_message'] ) ? $restriction['_um_restrict_custom_message'] : ''; + } + + $filtered_posts[] = $post; + continue; + } elseif ( '1' == $restriction['_um_noaccess_action'] ) { + + $curr = UM()->permalinks()->get_current_url(); + + if ( ! isset( $restriction['_um_access_redirect'] ) || '0' == $restriction['_um_access_redirect'] ) { + + exit( wp_redirect( esc_url( add_query_arg( 'redirect_to', urlencode_deep( $curr ), um_get_core_page( 'login' ) ) ) ) ); + + } elseif ( '1' == $restriction['_um_access_redirect'] ) { + + if ( ! empty( $restriction['_um_access_redirect_url'] ) ) { + $redirect = $restriction['_um_access_redirect_url']; + } else { + $redirect = esc_url( add_query_arg( 'redirect_to', urlencode_deep( $curr ), um_get_core_page( 'login' ) ) ); + } + + exit( wp_redirect( $redirect ) ); + } + } + } + } + } + } + + return $filtered_posts; + } + + + /** + * Protect Post Types in menu query + * Restrict content new logic + * @param $menu_items + * @param $args + * @return array + */ + function filter_menu( $menu_items, $args ) { + //if empty + if ( empty( $menu_items ) ) + return $menu_items; + + $filtered_items = array(); + + //other filter + foreach ( $menu_items as $menu_item ) { + + if ( ! empty( $menu_item->object_id ) && ! empty( $menu_item->object ) ) { + + $restriction = $this->get_post_privacy_settings( get_post( $menu_item->object_id ) ); + if ( ! $restriction ) { + $filtered_items[] = $menu_item; + continue; + } + + //post is private + if ( '1' == $restriction['_um_accessible'] ) { + //if post for not logged in users and user is not logged in + if ( ! is_user_logged_in() ) { + $filtered_items[] = $menu_item; + continue; + } else { + //if not single query when exclude if set _um_access_hide_from_queries + if ( empty( $restriction['_um_access_hide_from_queries'] ) ) { + $filtered_items[] = $menu_item; + continue; + } + } + } elseif ( '2' == $restriction['_um_accessible'] ) { + //if post for logged in users and user is not logged in + if ( is_user_logged_in() ) { + + $user_can = $this->user_can( get_current_user_id(), $restriction['_um_access_roles'] ); + + if ( $user_can ) { + $filtered_items[] = $menu_item; + continue; + } + + //if not single query when exclude if set _um_access_hide_from_queries + if ( empty( $restriction['_um_access_hide_from_queries'] ) ) { + $filtered_items[] = $menu_item; + continue; + } + + } else { + if ( empty( $restriction['_um_access_hide_from_queries'] ) ) { + $filtered_items[] = $menu_item; + continue; + } + } + } + + continue; + } + + //add all other posts + $filtered_items[] = $menu_item; + + } + + return $filtered_items; + } + } +} \ No newline at end of file diff --git a/includes/core/class-account.php b/includes/core/class-account.php new file mode 100644 index 00000000..91c7809b --- /dev/null +++ b/includes/core/class-account.php @@ -0,0 +1,359 @@ +register_fields = array(); + + add_shortcode('ultimatemember_account', array(&$this, 'ultimatemember_account') ); + + add_filter('um_account_page_default_tabs_hook', array(&$this, 'core_tabs'), 1); + + add_action('template_redirect', array(&$this, 'account'), 10001 ); + + add_action('template_redirect', array(&$this, 'form_init'), 10002); + + add_filter('um_predefined_fields_hook', array(&$this,'predefined_fields_hook'),1 ); + + $this->current_tab = 'general'; + + } + + /** + * Get Core account tabs + * @return array + */ + function core_tabs() { + + $tabs[100]['general']['icon'] = 'um-faicon-user'; + $tabs[100]['general']['title'] = __('Account','ultimate-member'); + + $tabs[200]['password']['icon'] = 'um-faicon-asterisk'; + $tabs[200]['password']['title'] = __('Change Password','ultimate-member'); + + $tabs[300]['privacy']['icon'] = 'um-faicon-lock'; + $tabs[300]['privacy']['title'] = __('Privacy','ultimate-member'); + + $tabs[400]['notifications']['icon'] = 'um-faicon-envelope'; + $tabs[400]['notifications']['title'] = __('Notifications','ultimate-member'); + + $tabs[9999]['delete']['icon'] = 'um-faicon-trash-o'; + $tabs[9999]['delete']['title'] = __('Delete Account','ultimate-member'); + + return $tabs; + } + + /** + * Account page form + */ + function form_init() { + if ( um_submitting_account_page() ) { + + UM()->form()->post_form = $_POST; + + do_action('um_submit_account_errors_hook', UM()->form()->post_form ); + + if ( !isset( UM()->form()->errors ) ) { + + if ( get_query_var('um_tab') ) { + $this->current_tab = get_query_var('um_tab'); + } + + do_action('um_submit_account_details', UM()->form()->post_form ); + + } + + } + + } + + /** + * Can access account page + */ + function account(){ + if ( um_is_core_page('account') && !is_user_logged_in() ) { + + $redirect_to = add_query_arg( + 'redirect_to', + urlencode_deep( um_get_core_page('account') ) , + um_get_core_page('login') + ); + + exit( wp_redirect( $redirect_to ) ); + + } + + if ( um_is_core_page('account') ) { + + UM()->fields()->set_mode = 'account'; + + UM()->fields()->editing = true; + + if ( get_query_var('um_tab') ) { + $this->current_tab = get_query_var('um_tab'); + } + + } + + } + + /** + * Get Tab Link + * @param integer $id + * @return string + */ + function tab_link( $id ) { + + if ( get_option('permalink_structure') ) { + + $url = trailingslashit( untrailingslashit( um_get_core_page('account') ) ); + $url = $url . $id . '/'; + + } else { + + $url = add_query_arg( 'um_tab', $id, um_get_core_page('account') ); + + } + + return $url; + } + + /** + * Add class based on shortcode + * @param string $mode + * @return string + */ + function get_class( $mode ){ + + $classes = 'um-'.$mode; + + if ( is_admin() ) { + $classes .= ' um-in-admin'; + } + + if ( UM()->fields()->editing == true ) { + $classes .= ' um-editing'; + } + + if ( UM()->fields()->viewing == true ) { + $classes .= ' um-viewing'; + } + + $classes = apply_filters('um_form_official_classes__hook', $classes); + return $classes; + } + + /** + * Get Tab Output + * @param integer $id + * @return string + */ + function get_tab_output( $id ) { + $output = null; + + switch( $id ) { + + case 'notifications': + + $output = apply_filters("um_account_content_hook_{$id}", $output); + return $output; + + break; + + case 'privacy': + + $args = 'profile_privacy,hide_in_members'; + $args = apply_filters('um_account_tab_privacy_fields', $args ); + + $fields = UM()->builtin()->get_specific_fields( $args ); + + $fields = apply_filters('um_account_secure_fields', $fields, $id ); + + foreach( $fields as $key => $data ){ + $output .= UM()->fields()->edit_field( $key, $data ); + } + + return $output; + + break; + + case 'delete': + + $args = 'single_user_password'; + + $fields = UM()->builtin()->get_specific_fields( $args ); + + $fields = apply_filters('um_account_secure_fields', $fields, $id ); + + foreach( $fields as $key => $data ){ + $output .= UM()->fields()->edit_field( $key, $data ); + } + + return $output; + + break; + + case 'general': + + $args = 'user_login,first_name,last_name,user_email'; + + if ( !um_get_option('account_name') ) { + $args = 'user_login,user_email'; + } + + if ( !um_get_option('account_email') && !um_user('can_edit_everyone') ) { + $args = str_replace(',user_email','', $args ); + } + + $fields = UM()->builtin()->get_specific_fields( $args ); + + $fields = apply_filters('um_account_secure_fields', $fields, $id ); + + foreach( $fields as $key => $data ){ + $output .= UM()->fields()->edit_field( $key, $data ); + } + + return $output; + + break; + + case 'password': + + $args = 'user_password'; + + $fields = UM()->builtin()->get_specific_fields( $args ); + + $fields = apply_filters('um_account_secure_fields', $fields, $id ); + + foreach( $fields as $key => $data ){ + $output .= UM()->fields()->edit_field( $key, $data ); + } + + return $output; + + break; + + default : + + $output = apply_filters("um_account_content_hook_{$id}", $output); + return $output; + + break; + + } + } + + /** + * Shortcode + * @param array $args + * @return string + */ + function ultimatemember_account( $args = array() ) { + return $this->load( $args ); + } + + /** + * Load module with global function + * @param array $args + * @return string + */ + function load( $args ) { + + UM()->user()->set( get_current_user_id() ); + + ob_start(); + + $defaults = array( + 'template' => 'account', + 'mode' => 'account', + 'form_id' => 'um_account_id', + ); + $args = wp_parse_args( $args, $defaults ); + + /*if ( isset( $args['use_globals'] ) && $args['use_globals'] == 1 ) { + $args = array_merge( $args, $this->get_css_args( $args ) ); + } else { + $args = array_merge( $this->get_css_args( $args ), $args ); + }*/ + + $args = apply_filters('um_account_shortcode_args_filter', $args); + + extract( $args, EXTR_SKIP ); + + do_action("um_pre_{$mode}_shortcode", $args); + + do_action("um_before_form_is_loaded", $args); + + do_action("um_before_{$mode}_form_is_loaded", $args); + + $this->template_load( $template, $args ); + + if ( !is_admin() && !defined( 'DOING_AJAX' ) ) { + $this->dynamic_css( $args ); + } + + $output = ob_get_contents(); + ob_end_clean(); + return $output; + + } + + /** + * Get dynamic css args + * @param array $args + * @return array + */ + function get_css_args( $args ) { + $arr = um_styling_defaults( $args['mode'] ); + $arr = array_merge( $arr, array( 'form_id' => $args['form_id'], 'mode' => $args['mode'] ) ); + return $arr; + } + + /** + * Load dynamic css + * @param array $args + */ + function dynamic_css( $args=array() ) { + extract($args); + $global = um_path . 'assets/dynamic_css/dynamic_global.php'; + $file = um_path . 'assets/dynamic_css/dynamic_'.$mode.'.php'; + include $global; + if ( file_exists( $file ) ) + include $file; + } + + /** + * Loads a template file + * @param string $template + * @param array $args + */ + function template_load( $template, $args=array() ) { + if ( is_array( $args ) ) { + UM()->shortcodes()->set_args = $args; + } + UM()->shortcodes()->load_template( $template ); + } + + /** + * Filter account fields + * @param array $predefined_fields + * @return array + */ + function predefined_fields_hook( $predefined_fields ){ + + $account_hide_in_directory = um_get_option('account_hide_in_directory'); + if( ! $account_hide_in_directory ){ + unset( $predefined_fields['hide_in_members'] ); + } + + return $predefined_fields; + } + } +} \ No newline at end of file diff --git a/includes/core/class-ajax-common.php b/includes/core/class-ajax-common.php new file mode 100644 index 00000000..d90cb2db --- /dev/null +++ b/includes/core/class-ajax-common.php @@ -0,0 +1,64 @@ + nopriv + $ajax_actions = array( + 'router' => false + ); + + foreach ( $ajax_actions as $action => $nopriv ) { + + add_action( 'wp_ajax_um_' . $action, array( $this, $action ) ); + + if ( $nopriv ) + add_action( 'wp_ajax_nopriv_um_' . $action, array( $this, $action ) ); + + } + + + /** + * Fallback for ajax urls + * @uses action hooks: wp_head, admin_head + */ + add_action( 'wp_head', array( $this, 'ultimatemember_ajax_urls' ) ); + add_action( 'admin_head', array( $this, 'ultimatemember_ajax_urls' ) ); + + } + + + function ultimatemember_ajax_urls() { + $enable_ajax_urls = apply_filters( "um_enable_ajax_urls", true ); + + if ( $enable_ajax_urls ) { ?> + + + + backend_requests(); + } + } +} \ No newline at end of file diff --git a/includes/core/class-builtin.php b/includes/core/class-builtin.php new file mode 100644 index 00000000..e8220e8d --- /dev/null +++ b/includes/core/class-builtin.php @@ -0,0 +1,1620 @@ +saved_fields = get_option( 'um_fields' ); + + } + + /*** + *** @regular or multi-select/options + ***/ + function is_dropdown_field( $field, $attrs ) { + + if ( isset( $attrs['options'] ) ) + return true; + + $fields = $this->all_user_fields; + + if ( isset( $fields[$field]['options'] ) || ! empty( $fields[$field]['custom_dropdown_options_source'] ) ) + return true; + + return false; + } + + /*** + *** @get a field + ***/ + function get_a_field( $field ) { + $fields = $this->all_user_fields; + if ( isset( $fields[$field] ) ) { + return $fields[$field]; + } + return ''; + } + + /*** + *** @get specific fields + ***/ + function get_specific_fields( $fields ) { + $fields = explode(',', $fields); + $array=array(); + foreach ($fields as $field ) { + if ( isset( $this->predefined_fields[$field] ) ) { + $array[$field] = $this->predefined_fields[$field]; + } + } + return $array; + } + + /*** + *** @get specific field + ***/ + function get_specific_field( $fields ) { + $fields = explode(',', $fields); + $array=array(); + foreach ($fields as $field ) { + if ( isset( $this->predefined_fields[$field] ) ) { + $array = $this->predefined_fields[$field]; + } else if ( isset( $this->saved_fields[$field] ) ) { + $array = $this->saved_fields[$field]; + } + } + return $array; + } + + /*** + *** @Checks for a unique field error + ***/ + function unique_field_err( $key ){ + if ( empty( $key ) ) return 'Please provide a meta key'; + if ( isset( $this->core_fields[ $key ] ) ) return __('Your meta key is a reserved core field and cannot be used','ultimate-member'); + if ( isset( $this->predefined_fields[ $key ] ) ) return __('Your meta key is a predefined reserved key and cannot be used','ultimate-member'); + if ( isset( $this->saved_fields[ $key ] ) ) return __('Your meta key already exists in your fields list','ultimate-member'); + if ( ! UM()->validation()->safe_string( $key ) ) return __('Your meta key contains illegal characters. Please correct it.','ultimate-member'); + return 0; + } + + /*** + *** @check date range errors (start date) + ***/ + function date_range_start_err( $date ) { + if ( empty( $date ) ) return __('Please provide a date range beginning','ultimate-member'); + if ( ! UM()->validation()->validate_date( $date ) ) return __('Please enter a valid start date in the date range','ultimate-member'); + return 0; + } + + /*** + *** @check date range errors (end date) + ***/ + function date_range_end_err( $date, $start_date ) { + if ( empty( $date ) ) return __('Please provide a date range end','ultimate-member'); + if ( ! UM()->validation()->validate_date( $date ) ) return __('Please enter a valid end date in the date range','ultimate-member'); + if ( strtotime( $date ) <= strtotime( $start_date ) ) return __('The end of date range must be greater than the start of date range','ultimate-member'); + return 0; + } + + /*** + *** @Get a core field attrs + ***/ + function get_core_field_attrs( $type ) { + return ( isset( $this->core_fields[$type] ) ) ? $this->core_fields[$type] : array(''); + } + + /*** + *** @Core Fields + ***/ + function set_core_fields() { + + $this->core_fields = array( + + 'row' => array( + 'name' => 'Row', + 'in_fields' => false, + 'form_only' => true, + 'conditional_support' => 0, + 'icon' => 'um-faicon-pencil', + 'col1' => array('_id','_background','_text_color','_padding','_margin','_border','_borderradius','_borderstyle','_bordercolor'), + 'col2' => array('_heading','_heading_text','_heading_background_color','_heading_text_color','_icon','_icon_color','_css_class'), + ), + + 'text' => array( + 'name' => 'Text Box', + 'col1' => array('_title','_metakey','_help','_default','_min_chars','_visibility'), + 'col2' => array('_label','_placeholder','_public','_roles','_validate','_custom_validate','_max_chars'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + ) + ), + + 'number' => array( + 'name' => __('Number','ultimate-member'), + 'col1' => array('_title','_metakey','_help','_default','_min','_visibility'), + 'col2' => array('_label','_placeholder','_public','_roles','_validate','_custom_validate','_max'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + ) + ), + + 'textarea' => array( + 'name' => 'Textarea', + 'col1' => array('_title','_metakey','_help','_height','_max_chars','_max_words','_visibility'), + 'col2' => array('_label','_placeholder','_public','_roles','_default','_html'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + ) + ), + + 'select' => array( + 'name' => 'Dropdown', + 'col1' => array('_title','_metakey','_help','_default','_options','_visibility'), + 'col2' => array('_label','_placeholder','_public','_roles','_custom_dropdown_options_source','_parent_dropdown_relationship'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + '_options' => array( + 'mode' => 'required', + 'error' => __('You have not added any choices yet.','ultimate-member') + ), + ) + ), + + 'multiselect' => array( + 'name' => 'Multi-Select', + 'col1' => array('_title','_metakey','_help','_default','_options','_visibility'), + 'col2' => array('_label','_placeholder','_public','_roles','_min_selections','_max_selections','_custom_dropdown_options_source'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + '_options' => array( + 'mode' => 'required', + 'error' => __('You have not added any choices yet.','ultimate-member') + ), + ) + ), + + 'radio' => array( + 'name' => 'Radio', + 'col1' => array('_title','_metakey','_help','_default','_options','_visibility'), + 'col2' => array('_label','_public','_roles'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + '_options' => array( + 'mode' => 'required', + 'error' => __('You have not added any choices yet.','ultimate-member') + ), + ) + ), + + 'checkbox' => array( + 'name' => 'Checkbox', + 'col1' => array('_title','_metakey','_help','_default','_options','_visibility'), + 'col2' => array('_label','_public','_roles','_max_selections'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + '_options' => array( + 'mode' => 'required', + 'error' => __('You have not added any choices yet.','ultimate-member') + ), + ) + ), + + 'url' => array( + 'name' => 'URL', + 'col1' => array('_title','_metakey','_help','_default','_url_text','_visibility'), + 'col2' => array('_label','_placeholder','_url_target','_url_rel','_public','_roles','_validate','_custom_validate'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + ) + ), + + 'password' => array( + 'name' => 'Password', + 'col1' => array('_title','_metakey','_help','_min_chars','_max_chars','_visibility'), + 'col2' => array('_label','_placeholder','_public','_roles','_force_good_pass','_force_confirm_pass'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + ) + ), + + 'image' => array( + 'name' => 'Image Upload', + 'col1' => array('_title','_metakey','_help','_allowed_types','_max_size','_crop','_visibility'), + 'col2' => array('_label','_public','_roles','_upload_text','_upload_help_text','_button_text'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + '_max_size' => array( + 'mode' => 'numeric', + 'error' => __('Please enter a valid size','ultimate-member') + ), + ) + ), + + 'file' => array( + 'name' => 'File Upload', + 'col1' => array('_title','_metakey','_help','_allowed_types','_max_size','_visibility'), + 'col2' => array('_label','_public','_roles','_upload_text','_upload_help_text','_button_text'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + '_max_size' => array( + 'mode' => 'numeric', + 'error' => __('Please enter a valid size','ultimate-member') + ), + ) + ), + + 'date' => array( + 'name' => 'Date Picker', + 'col1' => array('_title','_metakey','_help','_range','_years','_years_x','_range_start','_range_end','_visibility'), + 'col2' => array('_label','_placeholder','_public','_roles','_format','_pretty_format','_disabled_weekdays'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + '_years' => array( + 'mode' => 'numeric', + 'error' => __('Number of years is not valid','ultimate-member') + ), + '_range_start' => array( + 'mode' => 'range-start', + ), + '_range_end' => array( + 'mode' => 'range-end', + ), + ) + ), + + 'time' => array( + 'name' => 'Time Picker', + 'col1' => array('_title','_metakey','_help','_format','_visibility'), + 'col2' => array('_label','_placeholder','_public','_roles','_intervals'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + ) + ), + + 'rating' => array( + 'name' => 'Rating', + 'col1' => array('_title','_metakey','_help','_visibility'), + 'col2' => array('_label','_public','_roles','_number','_default'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + ) + ), + + 'block' => array( + 'name' => 'Content Block', + 'col1' => array('_title','_visibility'), + 'col2' => array('_public','_roles'), + 'col_full' => array('_content'), + 'mce_content' => true, + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + ) + ), + + 'shortcode' => array( + 'name' => 'Shortcode', + 'col1' => array('_title','_visibility'), + 'col2' => array('_public','_roles'), + 'col_full' => array('_content'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_content' => array( + 'mode' => 'required', + 'error' => __('You must add a shortcode to the content area','ultimate-member') + ), + ) + ), + + 'spacing' => array( + 'name' => 'Spacing', + 'col1' => array('_title','_visibility'), + 'col2' => array('_spacing'), + 'form_only' => true, + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + ) + ), + + 'divider' => array( + 'name' => 'Divider', + 'col1' => array('_title','_width','_divider_text','_visibility'), + 'col2' => array('_style','_color'), + 'form_only' => true, + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + ) + ), + + 'googlemap' => array( + 'name' => 'Google Map', + 'col1' => array('_title','_metakey','_help','_visibility'), + 'col2' => array('_label','_placeholder','_public','_roles','_validate','_custom_validate'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + ) + ), + + 'youtube_video' => array( + 'name' => 'YouTube Video', + 'col1' => array('_title','_metakey','_help','_visibility'), + 'col2' => array('_label','_placeholder','_public','_roles','_validate','_custom_validate'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + ) + ), + + 'vimeo_video' => array( + 'name' => 'Vimeo Video', + 'col1' => array('_title','_metakey','_help','_visibility'), + 'col2' => array('_label','_placeholder','_public','_roles','_validate','_custom_validate'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + ) + ), + + 'soundcloud_track' => array( + 'name' => 'SoundCloud Track', + 'col1' => array('_title','_metakey','_help','_visibility'), + 'col2' => array('_label','_placeholder','_public','_roles','_validate','_custom_validate'), + 'col3' => array('_required','_editable','_icon'), + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => __('You must provide a title','ultimate-member') + ), + '_metakey' => array( + 'mode' => 'unique', + ), + ) + ), + + /*'group' => array( + 'name' => 'Field Group', + 'col1' => array('_title','_max_entries'), + 'col2' => array('_label','_public','_roles'), + 'form_only' => true, + 'validate' => array( + '_title' => array( + 'mode' => 'required', + 'error' => 'You must provide a title' + ), + '_label' => array( + 'mode' => 'required', + 'error' => 'You must provide a label' + ), + ) + ),*/ + + ); + + $this->core_fields = apply_filters('um_core_fields_hook', $this->core_fields ); + + } + + /*** + *** @Predefined Fields + ***/ + function set_predefined_fields() { + + $um_roles = UM()->roles()->get_roles( false, array( 'admin' ) ); + + $profile_privacy = apply_filters('um_profile_privacy_options', array( __('Everyone','ultimate-member'), __('Only me','ultimate-member') ) ); + + $this->predefined_fields = array( + + 'user_login' => array( + 'title' => __('Username','ultimate-member'), + 'metakey' => 'user_login', + 'type' => 'text', + 'label' => __('Username','ultimate-member'), + 'required' => 1, + 'public' => 1, + 'editable' => 0, + 'validate' => 'unique_username', + 'min_chars' => 3, + 'max_chars' => 24 + ), + + 'username' => array( + 'title' => __('Username or E-mail','ultimate-member'), + 'metakey' => 'username', + 'type' => 'text', + 'label' => __('Username or E-mail','ultimate-member'), + 'required' => 1, + 'public' => 1, + 'editable' => 0, + 'validate' => 'unique_username_or_email', + ), + + 'user_password' => array( + 'title' => __('Password','ultimate-member'), + 'metakey' => 'user_password', + 'type' => 'password', + 'label' => __('Password','ultimate-member'), + 'required' => 1, + 'public' => 1, + 'editable' => 1, + 'min_chars' => 8, + 'max_chars' => 30, + 'force_good_pass' => 1, + 'force_confirm_pass' => 1, + ), + + 'first_name' => array( + 'title' => __('First Name','ultimate-member'), + 'metakey' => 'first_name', + 'type' => 'text', + 'label' => __('First Name','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + ), + + 'last_name' => array( + 'title' => __('Last Name','ultimate-member'), + 'metakey' => 'last_name', + 'type' => 'text', + 'label' => __('Last Name','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + ), + + 'nickname' => array( + 'title' => __('Nickname','ultimate-member'), + 'metakey' => 'nickname', + 'type' => 'text', + 'label' => __('Nickname','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + ), + + 'user_registered' => array( + 'title' => __('Registration Date','ultimate-member'), + 'metakey' => 'user_registered', + 'type' => 'text', + 'label' => __('Registration Date','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'edit_forbidden' => 1, + ), + + 'last_login' => array( + 'title' => __('Last Login','ultimate-member'), + 'metakey' => '_um_last_login', + 'type' => 'text', + 'label' => __('Last Login','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'edit_forbidden' => 1, + ), + + 'user_email' => array( + 'title' => __('E-mail Address','ultimate-member'), + 'metakey' => 'user_email', + 'type' => 'text', + 'label' => __('E-mail Address','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'validate' => 'unique_email', + 'autocomplete' => 'off' + ), + + 'secondary_user_email' => array( + 'title' => __('Secondary E-mail Address','ultimate-member'), + 'metakey' => 'secondary_user_email', + 'type' => 'text', + 'label' => __('Secondary E-mail Address','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'validate' => 'unique_email', + 'autocomplete' => 'off' + ), + + 'description' => array( + 'title' => __('Biography','ultimate-member'), + 'metakey' => 'description', + 'type' => 'textarea', + 'label' => __('Biography','ultimate-member'), + 'html' => 0, + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'max_words' => 40, + 'placeholder' => 'Enter a bit about yourself...', + ), + + 'birth_date' => array( + 'title' => __('Birth Date','ultimate-member'), + 'metakey' => 'birth_date', + 'type' => 'date', + 'label' => __('Birth Date','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'pretty_format' => 1, + 'years' => 115, + 'years_x' => 'past', + 'icon' => 'um-faicon-calendar' + ), + + 'gender' => array( + 'title' => __('Gender','ultimate-member'), + 'metakey' => 'gender', + 'type' => 'radio', + 'label' => __('Gender','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'options' => array( __('Male','ultimate-member'), __('Female','ultimate-member') ) + ), + + 'country' => array( + 'title' => __('Country','ultimate-member'), + 'metakey' => 'country', + 'type' => 'select', + 'label' => __('Country','ultimate-member'), + 'placeholder' => __('Choose a Country','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'options' => $this->get('countries') + ), + + 'facebook' => array( + 'title' => __('Facebook','ultimate-member'), + 'metakey' => 'facebook', + 'type' => 'url', + 'label' => __('Facebook','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'url_target' => '_blank', + 'url_rel' => 'nofollow', + 'icon' => 'um-faicon-facebook', + 'validate' => 'facebook_url', + 'url_text' => 'Facebook', + 'advanced' => 'social', + 'color' => '#3B5999', + 'match' => 'https://facebook.com/', + ), + + 'twitter' => array( + 'title' => __('Twitter','ultimate-member'), + 'metakey' => 'twitter', + 'type' => 'url', + 'label' => __('Twitter','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'url_target' => '_blank', + 'url_rel' => 'nofollow', + 'icon' => 'um-faicon-twitter', + 'validate' => 'twitter_url', + 'url_text' => 'Twitter', + 'advanced' => 'social', + 'color' => '#4099FF', + 'match' => 'https://twitter.com/', + ), + + 'linkedin' => array( + 'title' => __('LinkedIn','ultimate-member'), + 'metakey' => 'linkedin', + 'type' => 'url', + 'label' => __('LinkedIn','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'url_target' => '_blank', + 'url_rel' => 'nofollow', + 'icon' => 'um-faicon-linkedin', + 'validate' => 'linkedin_url', + 'url_text' => 'LinkedIn', + 'advanced' => 'social', + 'color' => '#0976b4', + 'match' => 'https://linkedin.com/in/', + ), + + 'googleplus' => array( + 'title' => __('Google+','ultimate-member'), + 'metakey' => 'googleplus', + 'type' => 'url', + 'label' => __('Google+','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'url_target' => '_blank', + 'url_rel' => 'nofollow', + 'icon' => 'um-faicon-google-plus', + 'validate' => 'google_url', + 'url_text' => 'Google+', + 'advanced' => 'social', + 'color' => '#dd4b39', + 'match' => 'https://google.com/+', + ), + + 'instagram' => array( + 'title' => __('Instagram','ultimate-member'), + 'metakey' => 'instagram', + 'type' => 'url', + 'label' => __('Instagram','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'url_target' => '_blank', + 'url_rel' => 'nofollow', + 'icon' => 'um-faicon-instagram', + 'validate' => 'instagram_url', + 'url_text' => 'Instagram', + 'advanced' => 'social', + 'color' => '#3f729b', + 'match' => 'https://instagram.com/', + ), + + 'skype' => array( + 'title' => __('Skype ID','ultimate-member'), + 'metakey' => 'skype', + 'type' => 'url', + 'label' => __('Skype ID','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'url_target' => '_blank', + 'url_rel' => 'nofollow', + 'icon' => 'um-faicon-skype', + 'validate' => 'skype', + 'url_text' => 'Skype', + ), + + 'youtube' => array( + 'title' => __('YouTube','ultimate-member'), + 'metakey' => 'youtube', + 'type' => 'url', + 'label' => __('YouTube','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'url_target' => '_blank', + 'url_rel' => 'nofollow', + 'icon' => 'um-faicon-youtube', + 'validate' => 'youtube_url', + 'url_text' => 'YouTube', + 'advanced' => 'social', + 'color' => '#e52d27', + 'match' => 'https://youtube.com/', + ), + + 'soundcloud' => array( + 'title' => __('SoundCloud','ultimate-member'), + 'metakey' => 'soundcloud', + 'type' => 'url', + 'label' => __('SoundCloud','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'url_target' => '_blank', + 'url_rel' => 'nofollow', + 'icon' => 'um-faicon-soundcloud', + 'validate' => 'soundcloud_url', + 'url_text' => 'SoundCloud', + 'advanced' => 'social', + 'color' => '#f50', + 'match' => 'https://soundcloud.com/', + ), + + 'vk' => array( + 'title' => __('VKontakte','ultimate-member'), + 'metakey' => 'vkontakte', + 'type' => 'url', + 'label' => __('VKontakte','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'url_target' => '_blank', + 'url_rel' => 'nofollow', + 'icon' => 'um-faicon-vk', + 'validate' => 'vk_url', + 'url_text' => 'VKontakte', + 'advanced' => 'social', + 'color' => '#2B587A', + 'match' => 'https://vk.com/', + ), + + 'role_select' => array( + 'title' => __('Roles (Dropdown)','ultimate-member'), + 'metakey' => 'role_select', + 'type' => 'select', + 'label' => __('Account Type','ultimate-member'), + 'placeholder' => 'Choose account type', + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'options' => $um_roles, + ), + + 'role_radio' => array( + 'title' => __('Roles (Radio)','ultimate-member'), + 'metakey' => 'role_radio', + 'type' => 'radio', + 'label' => __('Account Type','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'options' => $um_roles, + ), + + 'languages' => array( + 'title' => __('Languages','ultimate-member'), + 'metakey' => 'languages', + 'type' => 'multiselect', + 'label' => __('Languages Spoken','ultimate-member'), + 'placeholder' => __('Select languages','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'options' => $this->get('languages'), + ), + + 'phone_number' => array( + 'title' => __('Phone Number','ultimate-member'), + 'metakey' => 'phone_number', + 'type' => 'text', + 'label' => __('Phone Number','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'validate' => 'phone_number', + 'icon' => 'um-faicon-phone', + ), + + 'mobile_number' => array( + 'title' => __('Mobile Number','ultimate-member'), + 'metakey' => 'mobile_number', + 'type' => 'text', + 'label' => __('Mobile Number','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'validate' => 'phone_number', + 'icon' => 'um-faicon-mobile', + ), + + // private use ( not public list ) + + 'profile_photo' => array( + 'title' => __('Profile Photo','ultimate-member'), + 'metakey' => 'profile_photo', + 'type' => 'image', + 'label' => __('Change your profile photo','ultimate-member'), + 'upload_text' => __('Upload your photo here','ultimate-member'), + 'icon' => 'um-faicon-camera', + 'crop' => 1, + 'max_size' => ( um_get_option('profile_photo_max_size') ) ? um_get_option('profile_photo_max_size') : 999999999, + 'min_width' => str_replace('px','',um_get_option('profile_photosize')), + 'min_height' => str_replace('px','',um_get_option('profile_photosize')), + 'private_use' => true, + ), + + 'cover_photo' => array( + 'title' => __('Cover Photo','ultimate-member'), + 'metakey' => 'cover_photo', + 'type' => 'image', + 'label' => __('Change your cover photo','ultimate-member'), + 'upload_text' => __('Upload profile cover here','ultimate-member'), + 'icon' => 'um-faicon-picture-o', + 'crop' => 2, + 'max_size' => ( um_get_option('cover_photo_max_size') ) ? um_get_option('cover_photo_max_size') : 999999999, + 'modal_size' => 'large', + 'ratio' => str_replace(':1','',um_get_option('profile_cover_ratio')), + 'min_width' => um_get_option('cover_min_width'), + 'private_use' => true, + ), + + 'password_reset_text' => array( + 'title' => __('Password Reset','ultimate-member'), + 'type' => 'block', + 'content' => '
            ' . __('To reset your password, please enter your email address or username below','ultimate-member'). '
            ', + 'private_use' => true, + ), + + 'username_b' => array( + 'title' => __('Username or E-mail','ultimate-member'), + 'metakey' => 'username_b', + 'type' => 'text', + 'placeholder' => __('Enter your username or email','ultimate-member'), + 'required' => 1, + 'public' => 1, + 'editable' => 0, + 'private_use' => true, + ), + + // account page use ( not public ) + + 'profile_privacy' => array( + 'title' => __('Profile Privacy','ultimate-member'), + 'metakey' => 'profile_privacy', + 'type' => 'select', + 'label' => __('Profile Privacy','ultimate-member'), + 'help' => __('Who can see your public profile?','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'default' => __('Everyone','ultimate-member'), + 'options' => $profile_privacy, + 'allowclear' => 0, + 'account_only' => true, + 'required_perm' => 'can_make_private_profile', + ), + + 'hide_in_members' => array( + 'title' => __('Hide my profile from directory','ultimate-member'), + 'metakey' => 'hide_in_members', + 'type' => 'radio', + 'label' => __('Hide my profile from directory','ultimate-member'), + 'help' => __('Here you can hide yourself from appearing in public directory','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'default' => __('No','ultimate-member'), + 'options' => array( __('No','ultimate-member'), __('Yes','ultimate-member') ), + 'account_only' => true, + 'required_opt' => array( 'members_page', 1 ), + ), + + 'delete_account' => array( + 'title' => __('Delete Account','ultimate-member'), + 'metakey' => 'delete_account', + 'type' => 'radio', + 'label' => __('Delete Account','ultimate-member'), + 'help' => __('If you confirm, everything related to your profile will be deleted permanently from the site','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'default' => __('No','ultimate-member'), + 'options' => array( __('Yes','ultimate-member') , __('No','ultimate-member') ), + 'account_only' => true, + ), + + 'single_user_password' => array( + 'title' => __('Password','ultimate-member'), + 'metakey' => 'single_user_password', + 'type' => 'password', + 'label' => __('Password','ultimate-member'), + 'required' => 1, + 'public' => 1, + 'editable' => 1, + 'account_only' => true, + ), + + ); + + $this->predefined_fields = apply_filters('um_predefined_fields_hook', $this->predefined_fields ); + + } + + /*** + *** @Custom Fields + ***/ + function set_custom_fields(){ + + if ( is_array( $this->saved_fields ) ) { + + $this->custom_fields = $this->saved_fields; + + } else { + + $this->custom_fields = ''; + + } + + $custom = $this->custom_fields; + $predefined = $this->predefined_fields; + + if ( is_array( $custom ) ){ + $this->all_user_fields = array_merge( $predefined, $custom ); + } else { + $this->all_user_fields = $predefined; + } + + } + + /*** + *** @may be used to show a dropdown, or source for user meta + ***/ + function all_user_fields( $exclude_types = null, $show_all = false ) { + + $fields_without_metakey = array('block','shortcode','spacing','divider','group'); + remove_filter('um_fields_without_metakey', 'um_user_tags_requires_no_metakey'); + $fields_without_metakey = apply_filters('um_fields_without_metakey', $fields_without_metakey ); + + if ( !$show_all ) { + $this->fields_dropdown = array('image','file','password','rating'); + $this->fields_dropdown = array_merge( $this->fields_dropdown, $fields_without_metakey ); + } else { + $this->fields_dropdown = $fields_without_metakey; + } + + $custom = $this->custom_fields; + $predefined = $this->predefined_fields; + + if ( $exclude_types ) { + $exclude_types = explode(',', $exclude_types); + } + + $all = array( 0 => '' ); + + if ( is_array( $custom ) ){ + $all = $all + array_merge( $predefined, $custom ); + } else { + $all = $all + $predefined; + } + + foreach( $all as $k => $arr ) { + + if ( $k == 0 ) { + unset($all[$k]); + } + + if ( isset( $arr['title'] ) ){ + $all[$k]['title'] = stripslashes( $arr['title'] ); + } + + if ( $exclude_types && isset( $arr['type'] ) && in_array( $arr['type'], $exclude_types ) ) { + unset( $all[$k] ); + } + if ( isset( $arr['account_only'] ) || isset( $arr['private_use'] ) ) { + if ( !$show_all ) { + unset( $all[$k] ); + } + } + if ( isset( $arr['type'] ) && in_array( $arr['type'], $this->fields_dropdown ) ) { + unset( $all[$k] ); + } + } + + $all = UM()->fields()->array_sort_by_column( $all, 'title'); + + $all = array( 0 => '') + $all; + + return $all; + } + + /*** + *** @Possible validation types for fields + ***/ + function validation_types(){ + + $array[0] = __('None','ultimate-member'); + $array['alphabetic'] = __('Alphabetic value only','ultimate-member'); + $array['alpha_numeric'] = __('Alpha-numeric value','ultimate-member'); + $array['english'] = __('English letters only','ultimate-member'); + $array['facebook_url'] = __('Facebook URL','ultimate-member'); + $array['google_url'] = __('Google+ URL','ultimate-member'); + $array['instagram_url'] = __('Instagram URL','ultimate-member'); + $array['linkedin_url'] = __('LinkedIn URL','ultimate-member'); + $array['vk_url'] = __('VKontakte URL','ultimate-member'); + $array['lowercase'] = __('Lowercase only','ultimate-member'); + $array['numeric'] = __('Numeric value only','ultimate-member'); + $array['phone_number'] = __('Phone Number','ultimate-member'); + $array['skype'] = __('Skype ID','ultimate-member'); + $array['soundcloud'] = __('SoundCloud Profile','ultimate-member'); + $array['twitter_url'] = __('Twitter URL','ultimate-member'); + $array['unique_email'] = __('Unique E-mail','ultimate-member'); + $array['unique_value'] = __('Unique Metakey value','ultimate-member'); + $array['unique_username'] = __('Unique Username','ultimate-member'); + $array['unique_username_or_email'] = __('Unique Username/E-mail','ultimate-member'); + $array['url'] = __('Website URL','ultimate-member'); + $array['youtube_url'] = __('YouTube Profile','ultimate-member'); + $array['custom'] = __('Custom Validation','ultimate-member'); + + $array = apply_filters('um_admin_field_validation_hook', $array ); + return $array; + } + + /*** + *** @Get predefined options + ***/ + function get( $data ){ + switch($data) { + + case 'languages': + $array = array( + "aa" => __("Afar",'ultimate-member'), + "ab" => __("Abkhazian",'ultimate-member'), + "ae" => __("Avestan",'ultimate-member'), + "af" => __("Afrikaans",'ultimate-member'), + "ak" => __("Akan",'ultimate-member'), + "am" => __("Amharic",'ultimate-member'), + "an" => __("Aragonese",'ultimate-member'), + "ar" => __("Arabic",'ultimate-member'), + "as" => __("Assamese",'ultimate-member'), + "av" => __("Avaric",'ultimate-member'), + "ay" => __("Aymara",'ultimate-member'), + "az" => __("Azerbaijani",'ultimate-member'), + "ba" => __("Bashkir",'ultimate-member'), + "be" => __("Belarusian",'ultimate-member'), + "bg" => __("Bulgarian",'ultimate-member'), + "bh" => __("Bihari",'ultimate-member'), + "bi" => __("Bislama",'ultimate-member'), + "bm" => __("Bambara",'ultimate-member'), + "bn" => __("Bengali",'ultimate-member'), + "bo" => __("Tibetan",'ultimate-member'), + "br" => __("Breton",'ultimate-member'), + "bs" => __("Bosnian",'ultimate-member'), + "ca" => __("Catalan",'ultimate-member'), + "ce" => __("Chechen",'ultimate-member'), + "ch" => __("Chamorro",'ultimate-member'), + "co" => __("Corsican",'ultimate-member'), + "cr" => __("Cree",'ultimate-member'), + "cs" => __("Czech",'ultimate-member'), + "cu" => __("Church Slavic",'ultimate-member'), + "cv" => __("Chuvash",'ultimate-member'), + "cy" => __("Welsh",'ultimate-member'), + "da" => __("Danish",'ultimate-member'), + "de" => __("German",'ultimate-member'), + "dv" => __("Divehi",'ultimate-member'), + "dz" => __("Dzongkha",'ultimate-member'), + "ee" => __("Ewe",'ultimate-member'), + "el" => __("Greek",'ultimate-member'), + "en" => __("English",'ultimate-member'), + "eo" => __("Esperanto",'ultimate-member'), + "es" => __("Spanish",'ultimate-member'), + "et" => __("Estonian",'ultimate-member'), + "eu" => __("Basque",'ultimate-member'), + "fa" => __("Persian",'ultimate-member'), + "ff" => __("Fulah",'ultimate-member'), + "fi" => __("Finnish",'ultimate-member'), + "fj" => __("Fijian",'ultimate-member'), + "fo" => __("Faroese",'ultimate-member'), + "fr" => __("French",'ultimate-member'), + "fy" => __("Western Frisian",'ultimate-member'), + "ga" => __("Irish",'ultimate-member'), + "gd" => __("Scottish Gaelic",'ultimate-member'), + "gl" => __("Galician",'ultimate-member'), + "gn" => __("Guarani",'ultimate-member'), + "gu" => __("Gujarati",'ultimate-member'), + "gv" => __("Manx",'ultimate-member'), + "ha" => __("Hausa",'ultimate-member'), + "he" => __("Hebrew",'ultimate-member'), + "hi" => __("Hindi",'ultimate-member'), + "ho" => __("Hiri Motu",'ultimate-member'), + "hr" => __("Croatian",'ultimate-member'), + "ht" => __("Haitian",'ultimate-member'), + "hu" => __("Hungarian",'ultimate-member'), + "hy" => __("Armenian",'ultimate-member'), + "hz" => __("Herero",'ultimate-member'), + "ia" => __("Interlingua (International Auxiliary Language Association)",'ultimate-member'), + "id" => __("Indonesian",'ultimate-member'), + "ie" => __("Interlingue",'ultimate-member'), + "ig" => __("Igbo",'ultimate-member'), + "ii" => __("Sichuan Yi",'ultimate-member'), + "ik" => __("Inupiaq",'ultimate-member'), + "io" => __("Ido",'ultimate-member'), + "is" => __("Icelandic",'ultimate-member'), + "it" => __("Italian",'ultimate-member'), + "iu" => __("Inuktitut",'ultimate-member'), + "ja" => __("Japanese",'ultimate-member'), + "jv" => __("Javanese",'ultimate-member'), + "ka" => __("Georgian",'ultimate-member'), + "kg" => __("Kongo",'ultimate-member'), + "ki" => __("Kikuyu",'ultimate-member'), + "kj" => __("Kwanyama",'ultimate-member'), + "kk" => __("Kazakh",'ultimate-member'), + "kl" => __("Kalaallisut",'ultimate-member'), + "km" => __("Khmer",'ultimate-member'), + "kn" => __("Kannada",'ultimate-member'), + "ko" => __("Korean",'ultimate-member'), + "kr" => __("Kanuri",'ultimate-member'), + "ks" => __("Kashmiri",'ultimate-member'), + "ku" => __("Kurdish",'ultimate-member'), + "kv" => __("Komi",'ultimate-member'), + "kw" => __("Cornish",'ultimate-member'), + "ky" => __("Kirghiz",'ultimate-member'), + "la" => __("Latin",'ultimate-member'), + "lb" => __("Luxembourgish",'ultimate-member'), + "lg" => __("Ganda",'ultimate-member'), + "li" => __("Limburgish",'ultimate-member'), + "ln" => __("Lingala",'ultimate-member'), + "lo" => __("Lao",'ultimate-member'), + "lt" => __("Lithuanian",'ultimate-member'), + "lu" => __("Luba-Katanga",'ultimate-member'), + "lv" => __("Latvian",'ultimate-member'), + "mg" => __("Malagasy",'ultimate-member'), + "mh" => __("Marshallese",'ultimate-member'), + "mi" => __("Maori",'ultimate-member'), + "mk" => __("Macedonian",'ultimate-member'), + "ml" => __("Malayalam",'ultimate-member'), + "mn" => __("Mongolian",'ultimate-member'), + "mr" => __("Marathi",'ultimate-member'), + "ms" => __("Malay",'ultimate-member'), + "mt" => __("Maltese",'ultimate-member'), + "my" => __("Burmese",'ultimate-member'), + "na" => __("Nauru",'ultimate-member'), + "nb" => __("Norwegian Bokmal",'ultimate-member'), + "nd" => __("North Ndebele",'ultimate-member'), + "ne" => __("Nepali",'ultimate-member'), + "ng" => __("Ndonga",'ultimate-member'), + "nl" => __("Dutch",'ultimate-member'), + "nn" => __("Norwegian Nynorsk",'ultimate-member'), + "no" => __("Norwegian",'ultimate-member'), + "nr" => __("South Ndebele",'ultimate-member'), + "nv" => __("Navajo",'ultimate-member'), + "ny" => __("Chichewa",'ultimate-member'), + "oc" => __("Occitan",'ultimate-member'), + "oj" => __("Ojibwa",'ultimate-member'), + "om" => __("Oromo",'ultimate-member'), + "or" => __("Oriya",'ultimate-member'), + "os" => __("Ossetian",'ultimate-member'), + "pa" => __("Panjabi",'ultimate-member'), + "pi" => __("Pali",'ultimate-member'), + "pl" => __("Polish",'ultimate-member'), + "ps" => __("Pashto",'ultimate-member'), + "pt" => __("Portuguese",'ultimate-member'), + "qu" => __("Quechua",'ultimate-member'), + "rm" => __("Raeto-Romance",'ultimate-member'), + "rn" => __("Kirundi",'ultimate-member'), + "ro" => __("Romanian",'ultimate-member'), + "ru" => __("Russian",'ultimate-member'), + "rw" => __("Kinyarwanda",'ultimate-member'), + "sa" => __("Sanskrit",'ultimate-member'), + "sc" => __("Sardinian",'ultimate-member'), + "sd" => __("Sindhi",'ultimate-member'), + "se" => __("Northern Sami",'ultimate-member'), + "sg" => __("Sango",'ultimate-member'), + "si" => __("Sinhala",'ultimate-member'), + "sk" => __("Slovak",'ultimate-member'), + "sl" => __("Slovenian",'ultimate-member'), + "sm" => __("Samoan",'ultimate-member'), + "sn" => __("Shona",'ultimate-member'), + "so" => __("Somali",'ultimate-member'), + "sq" => __("Albanian",'ultimate-member'), + "sr" => __("Serbian",'ultimate-member'), + "ss" => __("Swati",'ultimate-member'), + "st" => __("Southern Sotho",'ultimate-member'), + "su" => __("Sundanese",'ultimate-member'), + "sv" => __("Swedish",'ultimate-member'), + "sw" => __("Swahili",'ultimate-member'), + "ta" => __("Tamil",'ultimate-member'), + "te" => __("Telugu",'ultimate-member'), + "tg" => __("Tajik",'ultimate-member'), + "th" => __("Thai",'ultimate-member'), + "ti" => __("Tigrinya",'ultimate-member'), + "tk" => __("Turkmen",'ultimate-member'), + "tl" => __("Tagalog",'ultimate-member'), + "tn" => __("Tswana",'ultimate-member'), + "to" => __("Tonga",'ultimate-member'), + "tr" => __("Turkish",'ultimate-member'), + "ts" => __("Tsonga",'ultimate-member'), + "tt" => __("Tatar",'ultimate-member'), + "tw" => __("Twi",'ultimate-member'), + "ty" => __("Tahitian",'ultimate-member'), + "ug" => __("Uighur",'ultimate-member'), + "uk" => __("Ukrainian",'ultimate-member'), + "ur" => __("Urdu",'ultimate-member'), + "uz" => __("Uzbek",'ultimate-member'), + "ve" => __("Venda",'ultimate-member'), + "vi" => __("Vietnamese",'ultimate-member'), + "vo" => __("Volapuk",'ultimate-member'), + "wa" => __("Walloon",'ultimate-member'), + "wo" => __("Wolof",'ultimate-member'), + "xh" => __("Xhosa",'ultimate-member'), + "yi" => __("Yiddish",'ultimate-member'), + "yo" => __("Yoruba",'ultimate-member'), + "za" => __("Zhuang",'ultimate-member'), + "zh" => __("Chinese",'ultimate-member'), + "zu" => __("Zulu",'ultimate-member') + ); + break; + + case 'countries': + $array = array ( + 'AF' => __('Afghanistan','ultimate-member'), + 'AX' => __('Åland Islands','ultimate-member'), + 'AL' => __('Albania','ultimate-member'), + 'DZ' => __('Algeria','ultimate-member'), + 'AS' => __('American Samoa','ultimate-member'), + 'AD' => __('Andorra','ultimate-member'), + 'AO' => __('Angola','ultimate-member'), + 'AI' => __('Anguilla','ultimate-member'), + 'AQ' => __('Antarctica','ultimate-member'), + 'AG' => __('Antigua and Barbuda','ultimate-member'), + 'AR' => __('Argentina','ultimate-member'), + 'AM' => __('Armenia','ultimate-member'), + 'AW' => __('Aruba','ultimate-member'), + 'AU' => __('Australia','ultimate-member'), + 'AT' => __('Austria','ultimate-member'), + 'AZ' => __('Azerbaijan','ultimate-member'), + 'BS' => __('Bahamas','ultimate-member'), + 'BH' => __('Bahrain','ultimate-member'), + 'BD' => __('Bangladesh','ultimate-member'), + 'BB' => __('Barbados','ultimate-member'), + 'BY' => __('Belarus','ultimate-member'), + 'BE' => __('Belgium','ultimate-member'), + 'BZ' => __('Belize','ultimate-member'), + 'BJ' => __('Benin','ultimate-member'), + 'BM' => __('Bermuda','ultimate-member'), + 'BT' => __('Bhutan','ultimate-member'), + 'BO' => __('Bolivia, Plurinational State of','ultimate-member'), + 'BA' => __('Bosnia and Herzegovina','ultimate-member'), + 'BW' => __('Botswana','ultimate-member'), + 'BV' => __('Bouvet Island','ultimate-member'), + 'BR' => __('Brazil','ultimate-member'), + 'IO' => __('British Indian Ocean Territory','ultimate-member'), + 'BN' => __('Brunei Darussalam','ultimate-member'), + 'BG' => __('Bulgaria','ultimate-member'), + 'BF' => __('Burkina Faso','ultimate-member'), + 'BI' => __('Burundi','ultimate-member'), + 'KH' => __('Cambodia','ultimate-member'), + 'CM' => __('Cameroon','ultimate-member'), + 'CA' => __('Canada','ultimate-member'), + 'CV' => __('Cape Verde','ultimate-member'), + 'KY' => __('Cayman Islands','ultimate-member'), + 'CF' => __('Central African Republic','ultimate-member'), + 'TD' => __('Chad','ultimate-member'), + 'CL' => __('Chile','ultimate-member'), + 'CN' => __('China','ultimate-member'), + 'CX' => __('Christmas Island','ultimate-member'), + 'CC' => __('Cocos (Keeling) Islands','ultimate-member'), + 'CO' => __('Colombia','ultimate-member'), + 'KM' => __('Comoros','ultimate-member'), + 'CG' => __('Congo','ultimate-member'), + 'CD' => __('Congo, the Democratic Republic of the','ultimate-member'), + 'CK' => __('Cook Islands','ultimate-member'), + 'CR' => __('Costa Rica','ultimate-member'), + 'CI' => __("Côte d'Ivoire",'ultimate-member'), + 'HR' => __('Croatia','ultimate-member'), + 'CU' => __('Cuba','ultimate-member'), + 'CY' => __('Cyprus','ultimate-member'), + 'CZ' => __('Czech Republic','ultimate-member'), + 'DK' => __('Denmark','ultimate-member'), + 'DJ' => __('Djibouti','ultimate-member'), + 'DM' => __('Dominica','ultimate-member'), + 'DO' => __('Dominican Republic','ultimate-member'), + 'EC' => __('Ecuador','ultimate-member'), + 'EG' => __('Egypt','ultimate-member'), + 'SV' => __('El Salvador','ultimate-member'), + 'GQ' => __('Equatorial Guinea','ultimate-member'), + 'ER' => __('Eritrea','ultimate-member'), + 'EE' => __('Estonia','ultimate-member'), + 'ET' => __('Ethiopia','ultimate-member'), + 'FK' => __('Falkland Islands (Malvinas)','ultimate-member'), + 'FO' => __('Faroe Islands','ultimate-member'), + 'FJ' => __('Fiji','ultimate-member'), + 'FI' => __('Finland','ultimate-member'), + 'FR' => __('France','ultimate-member'), + 'GF' => __('French Guiana','ultimate-member'), + 'PF' => __('French Polynesia','ultimate-member'), + 'TF' => __('French Southern Territories','ultimate-member'), + 'GA' => __('Gabon','ultimate-member'), + 'GM' => __('Gambia','ultimate-member'), + 'GE' => __('Georgia','ultimate-member'), + 'DE' => __('Germany','ultimate-member'), + 'GH' => __('Ghana','ultimate-member'), + 'GI' => __('Gibraltar','ultimate-member'), + 'GR' => __('Greece','ultimate-member'), + 'GL' => __('Greenland','ultimate-member'), + 'GD' => __('Grenada','ultimate-member'), + 'GP' => __('Guadeloupe','ultimate-member'), + 'GU' => __('Guam','ultimate-member'), + 'GT' => __('Guatemala','ultimate-member'), + 'GG' => __('Guernsey','ultimate-member'), + 'GN' => __('Guinea','ultimate-member'), + 'GW' => __('Guinea-Bissau','ultimate-member'), + 'GY' => __('Guyana','ultimate-member'), + 'HT' => __('Haiti','ultimate-member'), + 'HM' => __('Heard Island and McDonald Islands','ultimate-member'), + 'VA' => __('Holy See (Vatican City State)','ultimate-member'), + 'HN' => __('Honduras','ultimate-member'), + 'HK' => __('Hong Kong','ultimate-member'), + 'HU' => __('Hungary','ultimate-member'), + 'IS' => __('Iceland','ultimate-member'), + 'IN' => __('India','ultimate-member'), + 'ID' => __('Indonesia','ultimate-member'), + 'IR' => __('Iran, Islamic Republic of','ultimate-member'), + 'IQ' => __('Iraq','ultimate-member'), + 'IE' => __('Ireland','ultimate-member'), + 'IM' => __('Isle of Man','ultimate-member'), + 'IL' => __('Israel','ultimate-member'), + 'IT' => __('Italy','ultimate-member'), + 'JM' => __('Jamaica','ultimate-member'), + 'JP' => __('Japan','ultimate-member'), + 'JE' => __('Jersey','ultimate-member'), + 'JO' => __('Jordan','ultimate-member'), + 'KZ' => __('Kazakhstan','ultimate-member'), + 'KE' => __('Kenya','ultimate-member'), + 'KI' => __('Kiribati','ultimate-member'), + 'KP' => __("Korea, Democratic People's Republic of",'ultimate-member'), + 'KR' => __('Korea, Republic of','ultimate-member'), + 'KW' => __('Kuwait','ultimate-member'), + 'KG' => __('Kyrgyzstan','ultimate-member'), + 'LA' => __("Lao People's Democratic Republic",'ultimate-member'), + 'LV' => __('Latvia','ultimate-member'), + 'LB' => __('Lebanon','ultimate-member'), + 'LS' => __('Lesotho','ultimate-member'), + 'LR' => __('Liberia','ultimate-member'), + 'LY' => __('Libyan Arab Jamahiriya','ultimate-member'), + 'LI' => __('Liechtenstein','ultimate-member'), + 'LT' => __('Lithuania','ultimate-member'), + 'LU' => __('Luxembourg','ultimate-member'), + 'MO' => __('Macao','ultimate-member'), + 'MK' => __('Macedonia, the former Yugoslav Republic of','ultimate-member'), + 'MG' => __('Madagascar','ultimate-member'), + 'MW' => __('Malawi','ultimate-member'), + 'MY' => __('Malaysia','ultimate-member'), + 'MV' => __('Maldives','ultimate-member'), + 'ML' => __('Mali','ultimate-member'), + 'MT' => __('Malta','ultimate-member'), + 'MH' => __('Marshall Islands','ultimate-member'), + 'MQ' => __('Martinique','ultimate-member'), + 'MR' => __('Mauritania','ultimate-member'), + 'MU' => __('Mauritius','ultimate-member'), + 'YT' => __('Mayotte','ultimate-member'), + 'MX' => __('Mexico','ultimate-member'), + 'FM' => __('Micronesia, Federated States of','ultimate-member'), + 'MD' => __('Moldova, Republic of','ultimate-member'), + 'MC' => __('Monaco','ultimate-member'), + 'MN' => __('Mongolia','ultimate-member'), + 'ME' => __('Montenegro','ultimate-member'), + 'MS' => __('Montserrat','ultimate-member'), + 'MA' => __('Morocco','ultimate-member'), + 'MZ' => __('Mozambique','ultimate-member'), + 'MM' => __('Myanmar','ultimate-member'), + 'NA' => __('Namibia','ultimate-member'), + 'NR' => __('Nauru','ultimate-member'), + 'NP' => __('Nepal','ultimate-member'), + 'NL' => __('Netherlands','ultimate-member'), + 'AN' => __('Netherlands Antilles','ultimate-member'), + 'NC' => __('New Caledonia','ultimate-member'), + 'NZ' => __('New Zealand','ultimate-member'), + 'NI' => __('Nicaragua','ultimate-member'), + 'NE' => __('Niger','ultimate-member'), + 'NG' => __('Nigeria','ultimate-member'), + 'NU' => __('Niue','ultimate-member'), + 'NF' => __('Norfolk Island','ultimate-member'), + 'MP' => __('Northern Mariana Islands','ultimate-member'), + 'NO' => __('Norway','ultimate-member'), + 'OM' => __('Oman','ultimate-member'), + 'PK' => __('Pakistan','ultimate-member'), + 'PW' => __('Palau','ultimate-member'), + 'PS' => __('Palestine','ultimate-member'), + 'PA' => __('Panama','ultimate-member'), + 'PG' => __('Papua New Guinea','ultimate-member'), + 'PY' => __('Paraguay','ultimate-member'), + 'PE' => __('Peru','ultimate-member'), + 'PH' => __('Philippines','ultimate-member'), + 'PN' => __('Pitcairn','ultimate-member'), + 'PL' => __('Poland','ultimate-member'), + 'PT' => __('Portugal','ultimate-member'), + 'PR' => __('Puerto Rico','ultimate-member'), + 'QA' => __('Qatar','ultimate-member'), + 'RE' => __('Réunion','ultimate-member'), + 'RO' => __('Romania','ultimate-member'), + 'RU' => __('Russian Federation','ultimate-member'), + 'RW' => __('Rwanda','ultimate-member'), + 'BL' => __('Saint Barthélemy','ultimate-member'), + 'SH' => __('Saint Helena','ultimate-member'), + 'KN' => __('Saint Kitts and Nevis','ultimate-member'), + 'LC' => __('Saint Lucia','ultimate-member'), + 'MF' => __('Saint Martin (French part)','ultimate-member'), + 'PM' => __('Saint Pierre and Miquelon','ultimate-member'), + 'VC' => __('Saint Vincent and the Grenadines','ultimate-member'), + 'WS' => __('Samoa','ultimate-member'), + 'SM' => __('San Marino','ultimate-member'), + 'ST' => __('Sao Tome and Principe','ultimate-member'), + 'SA' => __('Saudi Arabia','ultimate-member'), + 'SN' => __('Senegal','ultimate-member'), + 'RS' => __('Serbia','ultimate-member'), + 'SC' => __('Seychelles','ultimate-member'), + 'SL' => __('Sierra Leone','ultimate-member'), + 'SG' => __('Singapore','ultimate-member'), + 'SK' => __('Slovakia','ultimate-member'), + 'SI' => __('Slovenia','ultimate-member'), + 'SB' => __('Solomon Islands','ultimate-member'), + 'SO' => __('Somalia','ultimate-member'), + 'ZA' => __('South Africa','ultimate-member'), + 'GS' => __('South Georgia and the South Sandwich Islands','ultimate-member'), + 'SS' => __('South Sudan','ultimate-member'), + 'ES' => __('Spain','ultimate-member'), + 'LK' => __('Sri Lanka','ultimate-member'), + 'SD' => __('Sudan','ultimate-member'), + 'SR' => __('Suriname','ultimate-member'), + 'SJ' => __('Svalbard and Jan Mayen','ultimate-member'), + 'SZ' => __('Swaziland','ultimate-member'), + 'SE' => __('Sweden','ultimate-member'), + 'CH' => __('Switzerland','ultimate-member'), + 'SY' => __('Syrian Arab Republic','ultimate-member'), + 'TW' => __('Taiwan, Province of China','ultimate-member'), + 'TJ' => __('Tajikistan','ultimate-member'), + 'TZ' => __('Tanzania, United Republic of','ultimate-member'), + 'TH' => __('Thailand','ultimate-member'), + 'TL' => __('Timor-Leste','ultimate-member'), + 'TG' => __('Togo','ultimate-member'), + 'TK' => __('Tokelau','ultimate-member'), + 'TO' => __('Tonga','ultimate-member'), + 'TT' => __('Trinidad and Tobago','ultimate-member'), + 'TN' => __('Tunisia','ultimate-member'), + 'TR' => __('Turkey','ultimate-member'), + 'TM' => __('Turkmenistan','ultimate-member'), + 'TC' => __('Turks and Caicos Islands','ultimate-member'), + 'TV' => __('Tuvalu','ultimate-member'), + 'UG' => __('Uganda','ultimate-member'), + 'UA' => __('Ukraine','ultimate-member'), + 'AE' => __('United Arab Emirates','ultimate-member'), + 'GB' => __('United Kingdom','ultimate-member'), + 'US' => __('United States','ultimate-member'), + 'UM' => __('United States Minor Outlying Islands','ultimate-member'), + 'UY' => __('Uruguay','ultimate-member'), + 'UZ' => __('Uzbekistan','ultimate-member'), + 'VU' => __('Vanuatu','ultimate-member'), + 'VE' => __('Venezuela, Bolivarian Republic of','ultimate-member'), + 'VN' => __('Viet Nam','ultimate-member'), + 'VG' => __('Virgin Islands, British','ultimate-member'), + 'VI' => __('Virgin Islands, U.S.','ultimate-member'), + 'WF' => __('Wallis and Futuna','ultimate-member'), + 'EH' => __('Western Sahara','ultimate-member'), + 'YE' => __('Yemen','ultimate-member'), + 'ZM' => __('Zambia','ultimate-member'), + 'ZW' => __('Zimbabwe','ultimate-member'), + ); + break; + + } + + $array = apply_filters("um_{$data}_predefined_field_options", $array); + + return $array; + + } + + } +} \ No newline at end of file diff --git a/includes/core/class-chart.php b/includes/core/class-chart.php new file mode 100644 index 00000000..de81782a --- /dev/null +++ b/includes/core/class-chart.php @@ -0,0 +1,135 @@ + 0, + 'type' => 'LineChart', + 'data' => null, + 'x_label' => null, + 'y_label' => null, + 'vertical_max_lines' => 6, + 'colors' => '#0085ba', + 'backgroundcolor' => 'transparent', + 'basetextcolor' => '#666', + 'basebordercolor' => '#bbb', + 'days' => 30 + ); + + $args = wp_parse_args( $args, $defaults ); + extract($args); + + if ($type == 'LineChart'){ + $this->linechart( $args ); + } + + } + + /*** + *** @LineChart + ***/ + function linechart( $args ){ + + extract($args); + + ?> + + + +
            + +
            + + array( + 'name' => __( 'Forms' ), + 'singular_name' => __( 'Form' ), + 'add_new' => __( 'Add New' ), + 'add_new_item' => __('Add New Form' ), + 'edit_item' => __('Edit Form'), + 'not_found' => __('You did not create any forms yet'), + 'not_found_in_trash' => __('Nothing found in Trash'), + 'search_items' => __('Search Forms') + ), + 'show_ui' => true, + 'show_in_menu' => false, + 'public' => false, + 'supports' => array('title') + ) ); + + if ( um_get_option( 'members_page' ) || ! get_option( 'um_options' ) ) { + + register_post_type( 'um_directory', array( + 'labels' => array( + 'name' => __( 'Member Directories' ), + 'singular_name' => __( 'Member Directory' ), + 'add_new' => __( 'Add New' ), + 'add_new_item' => __('Add New Member Directory' ), + 'edit_item' => __('Edit Member Directory'), + 'not_found' => __('You did not create any member directories yet'), + 'not_found_in_trash' => __('Nothing found in Trash'), + 'search_items' => __('Search Member Directories') + ), + 'show_ui' => true, + 'show_in_menu' => false, + 'public' => false, + 'supports' => array('title') + ) ); + + } + + } + + + /** + * Check query string on 'posts_request' for our pages + * + * @param string $q + * + * @return string + */ + public function um_query_pages( $q ) { + global $wp_query; + + //We need main query + if ( $q == $wp_query->request ) { + + if ( ! empty( $wp_query->query_vars['um_page'] ) ) { + + if ( 'api' == $wp_query->query_vars['um_page'] ) { + $router = new Router(); + $router->frontend_requests(); + } + } + + } + + return $q; + } + } + +} \ No newline at end of file diff --git a/includes/core/class-cron.php b/includes/core/class-cron.php new file mode 100644 index 00000000..00a8206f --- /dev/null +++ b/includes/core/class-cron.php @@ -0,0 +1,58 @@ + 604800, + 'display' => __( 'Once Weekly', 'ultimate-member' ) + ); + + return $schedules; + } + + public function schedule_Events() { + $this->weekly_events(); + $this->daily_events(); + $this->twicedaily_events(); + $this->hourly_events(); + } + + private function weekly_events() { + if ( ! wp_next_scheduled( 'um_weekly_scheduled_events' ) ) { + wp_schedule_event( current_time( 'timestamp' ), 'weekly', 'um_weekly_scheduled_events' ); + } + } + + private function daily_events() { + if ( ! wp_next_scheduled( 'um_daily_scheduled_events' ) ) { + wp_schedule_event( current_time( 'timestamp' ), 'daily', 'um_daily_scheduled_events' ); + } + } + + private function twicedaily_events() { + if ( ! wp_next_scheduled( 'um_twicedaily_scheduled_events' ) ) { + wp_schedule_event( current_time( 'timestamp' ), 'twicedaily', 'um_twicedaily_scheduled_events' ); + } + } + + private function hourly_events() { + if ( ! wp_next_scheduled( 'um_hourly_scheduled_events' ) ) { + wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'um_hourly_scheduled_events' ); + } + } + + } +} \ No newline at end of file diff --git a/includes/core/class-date-time.php b/includes/core/class-date-time.php new file mode 100644 index 00000000..4781fb6c --- /dev/null +++ b/includes/core/class-date-time.php @@ -0,0 +1,125 @@ += HOUR_IN_SECONDS ) { + + $hours = round( $diff / HOUR_IN_SECONDS ); + if ( $hours <= 1 ) + $hours = 1; + if ( $hours == 1 ) { + $since = sprintf( __('%s hr','ultimate-member'), $hours ); + } else { + $since = sprintf( __('%s hrs','ultimate-member'), $hours ); + } + + } elseif ( $diff < WEEK_IN_SECONDS && $diff >= DAY_IN_SECONDS ) { + + $days = round( $diff / DAY_IN_SECONDS ); + if ( $days <= 1 ) + $days = 1; + if ( $days == 1 ) { + $since = sprintf( __('Yesterday at %s','ultimate-member'), date('g:ia', $from ) ); + } else { + $since = sprintf(__('%s at %s','ultimate-member'), date('F d', $from ), date('g:ia', $from ) ); + } + + } elseif ( $diff < 30 * DAY_IN_SECONDS && $diff >= WEEK_IN_SECONDS ) { + + $since = sprintf(__('%s at %s','ultimate-member'), date('F d', $from ), date('g:ia', $from ) ); + + } elseif ( $diff < YEAR_IN_SECONDS && $diff >= 30 * DAY_IN_SECONDS ) { + + $since = sprintf(__('%s at %s','ultimate-member'), date('F d', $from ), date('g:ia', $from ) ); + + } elseif ( $diff >= YEAR_IN_SECONDS ) { + + $since = sprintf(__('%s at %s','ultimate-member'), date( 'F d, Y', $from ), date('g:ia', $from ) ); + + } + + return apply_filters( 'um_human_time_diff', $since, $diff, $from, $to ); + } + + /*** + *** @Get age + ***/ + function get_age($then) { + if ( !$then ) return ''; + $then_ts = strtotime($then); + $then_year = date('Y', $then_ts); + $age = date('Y') - $then_year; + if( strtotime('+' . $age . ' years', $then_ts) > current_time( 'timestamp' ) ) $age--; + if ( $age == 1 ) + return sprintf(__('%s year old','ultimate-member'), $age ); + if ( $age > 1 ) + return sprintf(__('%s years old','ultimate-member'), $age ); + if ( $age == 0 ) + return __('Less than 1 year old','ultimate-member'); + } + + /*** + *** @Reformat dates + ***/ + function format($old, $new){ + $datetime = new \DateTime($old); + $output = $datetime->format( $new ); + return $output; + } + + /*** + *** @Get last 30 days as array + ***/ + function get_last_days($num = 30, $reverse = true) { + $d = array(); + for($i = 0; $i < $num; $i++) { + $d[ date('Y-m-d', strtotime('-'. $i .' days')) ] = date('m/d', strtotime('-'. $i .' days')); + } + if ($reverse == true){ + return array_reverse($d); + } else { + return $d; + } + } + + } +} \ No newline at end of file diff --git a/includes/core/class-enqueue.php b/includes/core/class-enqueue.php new file mode 100644 index 00000000..edfc11e1 --- /dev/null +++ b/includes/core/class-enqueue.php @@ -0,0 +1,413 @@ +permalinks()->get_current_url( get_option('permalink_structure') ); + + foreach( $exclude as $match ) { + if ( ! empty( $c_url ) && strstr( $c_url, untrailingslashit( $match ) ) ) { + return; + } + } + + } + + $include = um_get_option('js_css_include'); + if ( is_array( $include ) ) { + array_filter( $include ); + } + if ( $include && !is_admin() && is_array( $include ) ) { + + $c_url = UM()->permalinks()->get_current_url( get_option('permalink_structure') ); + + foreach( $include as $match ) { + if ( strstr( $c_url, untrailingslashit( $match ) ) ) { + $force_load = true; + } else { + if ( !isset( $force_load ) ) { + $force_load = false; + } + } + } + + } + + if ( isset($force_load) && $force_load == false ) return; + + // enqueue styles + $localize_data = apply_filters( 'um_enqueue_localize_data', array( + 'ajaxurl' => admin_url( 'admin-ajax.php' ), + 'fileupload' => um_url . 'includes/lib/upload/um-file-upload.php', + 'imageupload' => um_url . 'includes/lib/upload/um-image-upload.php', + 'remove_file' => UM()->get_ajax_route( 'um\core\Files', 'ajax_remove_file' ), + 'delete_profile_photo' => UM()->get_ajax_route( 'um\core\Profile', 'ajax_delete_profile_photo' ), + 'delete_cover_photo' => UM()->get_ajax_route( 'um\core\Profile', 'ajax_delete_cover_photo' ), + 'resize_image' => UM()->get_ajax_route( 'um\core\Files', 'ajax_resize_image' ), + 'muted_action' => UM()->get_ajax_route( 'um\core\Form', 'ajax_muted_action' ), + 'ajax_paginate' => UM()->get_ajax_route( 'um\core\Query', 'ajax_paginate' ), + 'ajax_select_options' => UM()->get_ajax_route( 'um\core\Form', 'ajax_select_options' ), + ) ); + + if ( um_get_option( 'disable_minify' ) ) { + + $this->load_original(); + + wp_localize_script( 'um_scripts', 'um_scripts', $localize_data ); + + } else { + + wp_register_script( 'um_minified', um_url . 'assets/js/um.min.js', array('jquery', 'jquery-masonry'), ultimatemember_version, true ); + wp_enqueue_script( 'um_minified' ); + + wp_localize_script( 'um_minified', 'um_scripts', $localize_data ); + + wp_register_style( 'um_minified', um_url . 'assets/css/um.min.css', '', ultimatemember_version, 'all' ); + wp_enqueue_style( 'um_minified' ); + + } + + // rtl style + if ( is_rtl() ) { + wp_register_style('um_rtl', um_url . 'assets/css/um.rtl.css', '', ultimatemember_version, 'all' ); + wp_enqueue_style('um_rtl'); + } + + // load a localized version for date/time + $locale = get_locale(); + if ( $locale && file_exists( um_path . 'assets/js/pickadate/translations/' . $locale . '.js' ) ) { + wp_register_script('um_datetime_locale', um_url . 'assets/js/pickadate/translations/' . $locale . '.js', '', ultimatemember_version, true ); + wp_enqueue_script('um_datetime_locale'); + } + + if(is_object($post) && has_shortcode($post->post_content,'ultimate-member')) { + wp_dequeue_script('jquery-form'); + } + + //old settings before UM 2.0 CSS + wp_register_style('um_default_css', um_url . 'assets/css/um-old-default.css', '', ultimatemember_version, 'all' ); + wp_enqueue_style('um_default_css'); + + $uploads = wp_upload_dir(); + $upload_dir = $uploads['basedir'] . DIRECTORY_SEPARATOR . 'ultimatemember' . DIRECTORY_SEPARATOR; + if ( file_exists( $upload_dir . 'um_old_settings.css' ) ) { + wp_register_style('um_old_css', $uploads['baseurl'] . '/ultimatemember/um_old_settings.css' ); + wp_enqueue_style('um_old_css'); + } + } + + /*** + *** @This will load original files (not minified) + ***/ + function load_original() { + + $this->load_google_charts(); + + $this->load_fonticons(); + + $this->load_selectjs(); + + $this->load_modal(); + + $this->load_css(); + + $this->load_fileupload(); + + $this->load_datetimepicker(); + + $this->load_raty(); + + $this->load_scrollto(); + + $this->load_scrollbar(); + + $this->load_imagecrop(); + + $this->load_tipsy(); + + $this->load_functions(); + + $this->load_responsive(); + + $this->load_customjs(); + + } + + /*** + *** @Include Google charts + ***/ + function load_google_charts(){ + + wp_register_script('um_gchart', 'https://www.google.com/jsapi' ); + wp_enqueue_script('um_gchart'); + + } + + /*** + *** @Load plugin css + ***/ + function load_css(){ + + wp_register_style('um_styles', um_url . 'assets/css/um-styles.css' ); + wp_enqueue_style('um_styles'); + + wp_register_style('um_members', um_url . 'assets/css/um-members.css' ); + wp_enqueue_style('um_members'); + + wp_register_style('um_profile', um_url . 'assets/css/um-profile.css' ); + wp_enqueue_style('um_profile'); + + wp_register_style('um_account', um_url . 'assets/css/um-account.css' ); + wp_enqueue_style('um_account'); + + wp_register_style('um_misc', um_url . 'assets/css/um-misc.css' ); + wp_enqueue_style('um_misc'); + + } + + /*** + *** @Load select-dropdowns JS + ***/ + function load_selectjs(){ + + if ( class_exists( 'WooCommerce' ) ) { + wp_dequeue_style( 'select2' ); + wp_deregister_style( 'select2' ); + + wp_dequeue_script( 'select2'); + wp_deregister_script('select2'); + } + + wp_register_script('select2', um_url . 'assets/js/select2/select2.full.min.js', array('jquery', 'jquery-masonry') ); + wp_enqueue_script('select2'); + + wp_register_style('select2', um_url . 'assets/css/select2/select2.min.css' ); + wp_enqueue_style('select2'); + + } + + /*** + *** @Load Fonticons + ***/ + function load_fonticons(){ + + wp_register_style('um_fonticons_ii', um_url . 'assets/css/um-fonticons-ii.css' ); + wp_enqueue_style('um_fonticons_ii'); + + wp_register_style('um_fonticons_fa', um_url . 'assets/css/um-fonticons-fa.css' ); + wp_enqueue_style('um_fonticons_fa'); + + } + + /*** + *** @Load fileupload JS + ***/ + function load_fileupload() { + + wp_register_script('um_jquery_form', um_url . 'assets/js/um-jquery-form.js' ); + wp_enqueue_script('um_jquery_form'); + + wp_register_script('um_fileupload', um_url . 'assets/js/um-fileupload.js' ); + wp_enqueue_script('um_fileupload'); + + wp_register_style('um_fileupload', um_url . 'assets/css/um-fileupload.css' ); + wp_enqueue_style('um_fileupload'); + + } + + /*** + *** @Load JS functions + ***/ + function load_functions(){ + + wp_register_script('um_functions', um_url . 'assets/js/um-functions.js' ); + wp_enqueue_script('um_functions'); + + } + + /*** + *** @Load custom JS + ***/ + function load_customjs(){ + + wp_register_script('um_conditional', um_url . 'assets/js/um-conditional.js' ); + wp_enqueue_script('um_conditional'); + + wp_register_script('um_scripts', um_url . 'assets/js/um-scripts.js' ); + wp_enqueue_script('um_scripts'); + + wp_register_script('um_members', um_url . 'assets/js/um-members.js' ); + wp_enqueue_script('um_members'); + + wp_register_script('um_profile', um_url . 'assets/js/um-profile.js' ); + wp_enqueue_script('um_profile'); + + wp_register_script('um_account', um_url . 'assets/js/um-account.js' ); + wp_enqueue_script('um_account'); + + } + + /*** + *** @Load date & time picker + ***/ + function load_datetimepicker(){ + + wp_register_script('um_datetime', um_url . 'assets/js/pickadate/picker.js' ); + wp_enqueue_script('um_datetime'); + + wp_register_script('um_datetime_date', um_url . 'assets/js/pickadate/picker.date.js' ); + wp_enqueue_script('um_datetime_date'); + + wp_register_script('um_datetime_time', um_url . 'assets/js/pickadate/picker.time.js' ); + wp_enqueue_script('um_datetime_time'); + + wp_register_script('um_datetime_legacy', um_url . 'assets/js/pickadate/legacy.js' ); + wp_enqueue_script('um_datetime_legacy'); + + wp_register_style('um_datetime', um_url . 'assets/css/pickadate/default.css' ); + wp_enqueue_style('um_datetime'); + + wp_register_style('um_datetime_date', um_url . 'assets/css/pickadate/default.date.css' ); + wp_enqueue_style('um_datetime_date'); + + wp_register_style('um_datetime_time', um_url . 'assets/css/pickadate/default.time.css' ); + wp_enqueue_style('um_datetime_time'); + + } + + /*** + *** @Load scrollto + ***/ + function load_scrollto(){ + + wp_register_script('um_scrollto', um_url . 'assets/js/um-scrollto.js' ); + wp_enqueue_script('um_scrollto'); + + } + + /*** + *** @Load scrollbar + ***/ + function load_scrollbar(){ + + wp_register_script('um_scrollbar', um_url . 'assets/js/um-scrollbar.js' ); + wp_enqueue_script('um_scrollbar'); + + wp_register_style('um_scrollbar', um_url . 'assets/css/um-scrollbar.css' ); + wp_enqueue_style('um_scrollbar'); + + } + + /*** + *** @Load rating + ***/ + function load_raty(){ + + wp_register_script('um_raty', um_url . 'assets/js/um-raty.js' ); + wp_enqueue_script('um_raty'); + + wp_register_style('um_raty', um_url . 'assets/css/um-raty.css' ); + wp_enqueue_style('um_raty'); + + } + + /*** + *** @Load crop script + ***/ + function load_imagecrop(){ + + wp_register_script('um_crop', um_url . 'assets/js/um-crop.js' ); + wp_enqueue_script('um_crop'); + + wp_register_style('um_crop', um_url . 'assets/css/um-crop.css' ); + wp_enqueue_style('um_crop'); + + } + + /*** + *** @Load tipsy + ***/ + function load_tipsy(){ + + wp_register_script('um_tipsy', um_url . 'assets/js/um-tipsy.js' ); + wp_enqueue_script('um_tipsy'); + + wp_register_style('um_tipsy', um_url . 'assets/css/um-tipsy.css' ); + wp_enqueue_style('um_tipsy'); + + } + + /*** + *** @Load modal + ***/ + function load_modal(){ + + wp_register_style('um_modal', um_url . 'assets/css/um-modal.css' ); + wp_enqueue_style('um_modal'); + + wp_register_script('um_modal', um_url . 'assets/js/um-modal.js' ); + wp_enqueue_script('um_modal'); + + } + + /*** + *** @Load responsive styles + ***/ + function load_responsive(){ + + wp_register_script('um_responsive', um_url . 'assets/js/um-responsive.js' ); + wp_enqueue_script('um_responsive'); + + wp_register_style('um_responsive', um_url . 'assets/css/um-responsive.css' ); + wp_enqueue_style('um_responsive'); + + } + + } +} \ No newline at end of file diff --git a/includes/core/class-fields.php b/includes/core/class-fields.php new file mode 100644 index 00000000..9783c7dd --- /dev/null +++ b/includes/core/class-fields.php @@ -0,0 +1,2961 @@ +editing = false; + $this->viewing = false; + $this->timestamp = current_time('timestamp'); + + } + + /** + * Standard checkbox field + * @param integer $id + * @param string $title + */ + function checkbox( $id, $title ) { + ?> + +
            +
            + +
            +
            + + builtin()->all_user_fields; + foreach( $fields as $field => $args ) { + if ( isset( $args['advanced'] ) && $args['advanced'] == 'social' ) { + $social[$field] = $args; + } + } + foreach( $social as $k => $arr ) { + if ( um_profile( $k ) ) { ?> + + + + '; + + $fields = UM()->builtin()->get_specific_fields( $field ); + + $output = null; + + foreach( $fields as $key => $data ) { + $output .= UM()->fields()->edit_field( $key, $data ); + } + + echo $output; + + echo '
            '; + } + + /** + * Get hidden field + * @param string $key + * @param string $value + * @return string + */ + function disabled_hidden_field( $key, $value ){ + + return ''; + } + + + /** + * Updates a field globally + * @param integer $id + * @param array $args + */ + function globally_update_field( $id, $args ){ + $fields = UM()->builtin()->saved_fields; + + $fields[$id] = $args; + + unset( $fields[ $id ]['in_row'] ); + unset( $fields[ $id ]['in_sub_row'] ); + unset( $fields[ $id ]['in_column'] ); + unset( $fields[ $id ]['in_group'] ); + unset( $fields[ $id ]['position'] ); + + update_option('um_fields', $fields ); + } + + + /** + * Updates a field in form only + * @param integer $id + * @param array $args + * @param integer $form_id + */ + function update_field($id, $args, $form_id){ + $fields = UM()->query()->get_attr( 'custom_fields', $form_id ); + + if ( $args['type'] == 'row' ) { + if ( isset( $fields[$id] ) ){ + $old_args = $fields[$id]; + foreach( $old_args as $k => $v ) { + if (!in_array($k, array('sub_rows','cols')) ) { + unset($old_args[$k]); + } + } + $args = array_merge( $old_args, $args ); + } + } + + // custom fields support + if ( isset( UM()->builtin()->predefined_fields[$id] ) && isset( UM()->builtin()->predefined_fields[$id]['custom'] ) ) { + $args = array_merge( UM()->builtin()->predefined_fields[$id], $args); + } + + $fields[$id] = $args; + + // for group field only + if ( $args['type'] == 'group' ){ + $fields[$id]['in_group'] = ''; + } + + UM()->query()->update_attr( 'custom_fields', $form_id, $fields ); + } + + + /** + * Deletes a field in form only + * @param integer $id + * @param integer $form_id + */ + function delete_field_from_form( $id, $form_id ) { + $fields = UM()->query()->get_attr( 'custom_fields', $form_id ); + if ( isset( $fields[ $id ] ) ) { + unset( $fields[ $id ] ); + UM()->query()->update_attr( 'custom_fields', $form_id, $fields ); + } + } + + + /** + * Deletes a field from custom fields + * @param integer $id + */ + function delete_field_from_db( $id ) { + $fields = UM()->builtin()->saved_fields; + if ( isset( $fields[$id] ) ){ + unset( $fields[$id] ); + update_option('um_fields', $fields ); + } + } + + /** + * Quickly adds a field from custom fields + * @param integer $global_id + * @param integer $form_id + * @param array $position + */ + function add_field_from_list( $global_id, $form_id, $position = array() ) { + $fields = UM()->query()->get_attr( 'custom_fields', $form_id ); + $field_scope = UM()->builtin()->saved_fields; + + if ( !isset( $fields[ $global_id ] ) ) { + + $count = 1; + if ( isset( $fields ) && !empty( $fields ) ) $count = count( $fields ) + 1; + + $fields[ $global_id ] = $field_scope[ $global_id ]; + $fields[ $global_id ]['position'] = $count; + + // set position + if ( $position ) { + foreach( $position as $key => $val ) { + $fields[ $global_id ][ $key ] = $val; + } + } + + // add field to form + UM()->query()->update_attr( 'custom_fields', $form_id, $fields ); + + } + } + + /** + * Quickly adds a field from pre-defined fields + * @param integer $global_id + * @param integer $form_id + * @param array $position + */ + function add_field_from_predefined( $global_id, $form_id, $position = array() ) { + $fields = UM()->query()->get_attr( 'custom_fields', $form_id ); + $field_scope = UM()->builtin()->predefined_fields; + + if ( !isset( $fields[ $global_id ] ) ) { + + $count = 1; + if ( isset( $fields ) && !empty( $fields) ) $count = count( $fields ) + 1; + + $fields[ $global_id ] = $field_scope[ $global_id ]; + $fields[ $global_id ]['position'] = $count; + + // set position + if ( $position ) { + foreach( $position as $key => $val ) { + $fields[ $global_id ][ $key ] = $val; + } + } + + // add field to form + UM()->query()->update_attr( 'custom_fields', $form_id, $fields ); + + // add field to db + //$this->globally_update_field( $global_id, $fields[$global_id] ); + + } + } + + /** + * Duplicates a frield by meta key + * @param integer $id + * @param integer $form_id + */ + function duplicate_field( $id, $form_id ) { + $fields = UM()->query()->get_attr( 'custom_fields', $form_id ); + $all_fields = UM()->builtin()->saved_fields; + + $inc = count( $fields ) + 1; + + $duplicate = $fields[ $id ]; + + $new_metakey = $id . "_" . $inc; + $new_title = $fields[ $id ]['title'] . " #" . $inc; + $new_position = $inc; + + $duplicate['title'] = $new_title; + $duplicate['metakey'] = $new_metakey; + $duplicate['position'] = $new_position; + + $fields[ $new_metakey ] = $duplicate; + $all_fields[ $new_metakey ] = $duplicate; + + // not global attributes + unset( $all_fields[ $new_metakey ]['in_row'] ); + unset( $all_fields[ $new_metakey ]['in_sub_row'] ); + unset( $all_fields[ $new_metakey ]['in_column'] ); + unset( $all_fields[ $new_metakey ]['in_group'] ); + unset( $all_fields[ $new_metakey ]['position'] ); + + UM()->query()->update_attr( 'custom_fields', $form_id, $fields ); + update_option('um_fields', $all_fields ); + + } + + /** + * Print field error + * @param string $text + * @param boolean $force_show + */ + function field_error($text, $force_show = false ) { + if ( $force_show ) { + $output = '
            '.$text.'
            '; + return $output; + } + if ( isset( $this->set_id ) && UM()->form()->processing == $this->set_id ) { + $output = '
            '.$text.'
            '; + } else { + $output = ''; + } + + if ( ! UM()->form()->processing ) { + $output = '
            '.$text.'
            '; + } + return $output; + } + + /** + * Checks if field has a server-side error + * @param string $key + * @return boolean + */ + function is_error($key) { + return UM()->form()->has_error($key); + } + + /** + * Returns field error + * @param string $key + * @return string + */ + function show_error($key) { + return UM()->form()->errors[$key]; + } + + /** + * Display field label + * @param string $label + * @param string $key + * @param data $data + * @return string + */ + function field_label( $label, $key, $data ) { + $output = null; + $output .= '
            '; + + if ( isset($data['icon']) && $data['icon'] != '' && isset( $this->field_icons ) && $this->field_icons != 'off' && ( $this->field_icons == 'label' || $this->viewing == true ) ) { + $output .= '
            '; + } + + if ( $this->viewing == true ) { + $label = apply_filters("um_view_label_{$key}", $label ); + } else { + $label = apply_filters("um_edit_label_{$key}", $label ); + $label = apply_filters("um_edit_label_all_fields", $label, $data ); + } + + $output .= ''; + + if ( isset( $data['help'] ) && !empty( $data['help'] ) && $this->viewing == false && !strstr($key, 'confirm_user_pass') ) { + + if ( !UM()->mobile()->isMobile() ) { + if ( !isset( $this->disable_tooltips ) ) { + $output .= ''; + } + } + + if ( UM()->mobile()->isMobile() || isset( $this->disable_tooltips ) ) { + $output .= ''.__( $data['help'], UM_TEXTDOMAIN ). ''; + } + + } + + $output .= '
            '; + + return $output; + } + + + /** + * Output field classes + * @param string $key + * @param array $data + * @param string $add + * @return string + */ + function get_class($key, $data, $add = null) { + $classes = null; + + $classes .= 'um-form-field '; + + if ( $this->is_error($key) ) { + $classes .= 'um-error '; + } else { + $classes .= 'valid '; + } + + if ( !isset($data['required']) ) { + $classes .= 'not-required '; + } + + if ( $data['type'] == 'date' ) { + $classes .= 'um-datepicker '; + } + + if ( $data['type'] == 'time' ) { + $classes .= 'um-timepicker '; + } + + if ( isset($data['icon']) && $data['icon'] && isset( $this->field_icons ) && $this->field_icons == 'field' ) { + $classes .= 'um-iconed '; + } + + if ($add) { + $classes .= $add . ' '; + } + + return $classes; + } + + + /** + * Gets field value + * @param string $key + * @param boolean $default + * @param array $data + * @return mixed + */ + function field_value( $key, $default = false, $data = null ) { + if ( isset( $_SESSION ) && isset( $_SESSION['um_social_profile'][ $key ] ) && isset( $this->set_mode ) && $this->set_mode == 'register' ) + return $_SESSION['um_social_profile'][ $key ]; + + $type = ( isset( $data['type'] ) ) ? $data['type'] : ''; + + // preview in backend + if ( isset( UM()->user()->preview ) && UM()->user()->preview ) { + $submitted = um_user('submitted'); + if ( isset( $submitted[ $key ] ) && ! empty( $submitted[ $key ] ) ) { + return $submitted[ $key ]; + } else { + return 'Undefined'; + } + } + + // normal state + if ( isset( UM()->form()->post_form[ $key ] ) ) { + + if ( strstr( $key, 'user_pass' ) && $this->set_mode != 'password' ) return ''; + + return stripslashes_deep( UM()->form()->post_form[ $key ] ); + + } else if ( um_user( $key ) && $this->editing == true ) { + + if ( strstr( $key, 'user_pass' ) ) return ''; + + $value = um_user( $key ); + $value = apply_filters( "um_edit_{$key}_field_value", $value, $key ); + $value = apply_filters( "um_edit_{$type}_field_value", $value, $key ); + + return $value; + + } else if ( ( um_user( $key ) || isset( $data['show_anyway'] ) ) && $this->viewing == true ) { + + $value = um_filtered_value( $key, $data ); + return $value; + + } else if ( $default ) { + + $default = apply_filters( "um_field_default_value", $default, $data, $type ); + $default = apply_filters( "um_field_{$key}_default_value", $default, $data ); + $default = apply_filters( "um_field_{$type}_default_value", $default, $data ); + + return $default; + + } else if ( $this->editing == true ) { + + return apply_filters( "um_edit_{$key}_field_value", '', $key); + + } + + return ''; + } + + + /** + * Checks if an option is selected + * @param string $key + * @param string $value + * @param array $data + * @return boolean + */ + function is_selected($key, $value, $data){ + $key = apply_filters('um_is_selected_filter_key', $key ); + + if ( isset( UM()->form()->post_form[ $key ] ) && is_array( UM()->form()->post_form[ $key ] ) ) { + + if ( in_array( $value, UM()->form()->post_form[ $key ] ) ){ + return true; + } + + if ( in_array( html_entity_decode( $value ), UM()->form()->post_form[ $key ] ) ){ + return true; + } + + } else { + + if ( !isset( UM()->form()->post_form ) ) { + + $field_value = um_user( $key ); + + if ( $key == 'role' ) { + + $role_keys = get_option( 'um_roles' ); + + if ( ! empty( $role_keys ) ) { + if ( in_array( $field_value, $role_keys ) ) { + $field_value = 'um_' . $field_value; + } + } + + } + + $field_value = apply_filters('um_is_selected_filter_value', $field_value, $key ); + $data = apply_filters('um_is_selected_filter_data', $data, $key, $field_value ); + + if ( $field_value && $this->editing == true && is_array( $field_value ) && ( in_array( $value, $field_value ) || in_array( html_entity_decode( $value ), $field_value ) ) ) { + return true; + } + + if ( $field_value && $this->editing == true && !is_array( $field_value ) && $field_value == $value ) { + return true; + } + + if ( $field_value && $this->editing == true && !is_array( $field_value ) && html_entity_decode( $field_value ) == html_entity_decode( $value ) ) { + return true; + } + + if ( strstr( $data['default'], ', ') ) { + $data['default'] = explode(', ', $data['default']); + } + + if ( isset( $data['default'] ) && !is_array( $data['default'] ) && $data['default'] == $value ) { + return true; + } + + if ( isset( $data['default'] ) && is_array( $data['default'] ) && in_array( $value, $data['default'] ) ){ + return true; + } + + } else { + + if ( isset( UM()->form()->post_form[ $key ] ) && $value == UM()->form()->post_form[ $key ] ) { + return true; + } + + + + } + + } + + return false; + } + + + /** + * Checks if a radio button is selected + * @param string $key + * @param string $value + * @param array $data + * @return boolean + */ + function is_radio_checked($key, $value, $data){ + if ( isset( UM()->form()->post_form[$key] ) && is_array( UM()->form()->post_form[$key] ) ) { + + if ( in_array( $value, UM()->form()->post_form[$key] ) ){ + return true; + } + + } else { + + if ( ! isset( UM()->form()->post_form ) ) { + + if ( um_user( $key ) && $this->editing == true ) { + + if ( strstr( $key, 'role_' ) ) { + $key = 'role'; + } + + $um_user_value = um_user( $key ); + + if ( $key == 'role' ) { + $um_user_value = strtolower( $um_user_value ); + + $role_keys = get_option( 'um_roles' ); + + if ( ! empty( $role_keys ) ) { + if ( in_array( $um_user_value, $role_keys ) ) { + $um_user_value = 'um_' . $um_user_value; + } + } + } + + if ( $um_user_value == $value ) { + return true; + } + + if ( is_array( $um_user_value ) && in_array( $value, $um_user_value ) ) { + return true; + } + + if ( is_array( $um_user_value ) ){ + foreach( $um_user_value as $u) { + if( $u == html_entity_decode( $value ) ){ + return true; + } + } + } + + + } else { + + if ( isset($data['default']) && $data['default'] == $value ) { + return true; + } + + } + + } else { + + if ( isset( UM()->form()->post_form[$key] ) && $value == UM()->form()->post_form[$key] ) { + return true; + } + + } + + } + + return false; + } + + + /** + * Get field icon + * @param string $key + * @return string + */ + function get_field_icon( $key ) { + $fields = UM()->builtin()->all_user_fields; + if ( isset( $fields[$key]['icon'] ) ) + return $fields[$key]['icon']; + return ''; + } + + + /** + * Gets selected option value from a callback function + * @param string $value + * @param array $data + * @param string $type + * @return json + */ + function get_option_value_from_callback( $value, $data, $type ){ + + if( in_array( $type , array('select','multiselect') ) && isset( $data['custom_dropdown_options_source'] ) && ! empty( $data['custom_dropdown_options_source'] ) ){ + + if( function_exists( $data['custom_dropdown_options_source'] ) ){ + + $arr_options = call_user_func( $data['custom_dropdown_options_source'] ); + + if( $type == 'select' ){ + if( isset( $arr_options[ $value ] ) && ! empty( $arr_options[ $value ] ) ) { + return $arr_options[ $value ]; + }else if( isset( $data['default'] ) && ! empty( $data['default'] ) && empty( $arr_options[ $value ] ) ) { + return $arr_options[ $data['default'] ]; + }else{ + return ''; + } + } + + if( $type == 'multiselect' ){ + + if( is_array( $value ) ){ + $values = $value; + }else{ + $values = explode(', ', $value ); + } + + $arr_paired_options = array(); + + foreach ( $values as $option ) { + if( isset( $arr_options[ $option ] ) ){ + $arr_paired_options[] = $arr_options[ $option ]; + } + } + + return implode( ', ' , $arr_paired_options ); + } + + } + + + } + + return $value; + } + + /** + * Get select options from a callback function + * @param array $data + * @param string $type + * @return array $arr_options + */ + function get_options_from_callback( $data, $type ){ + + + if( in_array( $type , array('select','multiselect') ) && isset( $data['custom_dropdown_options_source'] ) && ! empty( $data['custom_dropdown_options_source'] ) ){ + + if( function_exists( $data['custom_dropdown_options_source'] ) ){ + + $arr_options = call_user_func( $data['custom_dropdown_options_source'] ); + + } + + + } + + return $arr_options; + } + + /** + * Get field type + * @param string $key + * @return string + */ + function get_field_type( $key ) { + $fields = UM()->builtin()->all_user_fields; + if ( isset( $fields[$key]['type'] ) ) + return $fields[$key]['type']; + return ''; + } + + /** + * Get field label + * @param string $key + * @return string + */ + function get_label( $key ) { + $fields = UM()->builtin()->all_user_fields; + if ( isset( $fields[$key]['label'] ) ) + return $fields[$key]['label']; + if ( isset( $fields[$key]['title'] ) ) + return $fields[$key]['title']; + return ''; + } + + + /** + * Get field title + * @param string $key + * @return string + */ + function get_field_title( $key ) { + $fields = UM()->builtin()->all_user_fields; + if ( isset( $fields[$key]['title'] ) ) + return $fields[$key]['title']; + if ( isset( $fields[$key]['label'] ) ) + return $fields[$key]['label']; + return __('Custom Field','ultimate-member'); + } + + /** + * Get form fields + * @return array + */ + function get_fields() { + $this->fields = array(); + $this->fields = apply_filters("um_get_form_fields", $this->fields ); + return $this->fields; + } + + + /** + * Get specific field + * @param string $key + * @return array + */ + function get_field( $key ) { + $fields = $this->get_fields(); + + if ( isset( $fields ) && is_array( $fields ) && isset( $fields[$key] ) ) { + $array = $fields[$key]; + } else { + if ( !isset( UM()->builtin()->predefined_fields[$key] ) && !isset( UM()->builtin()->all_user_fields[$key] ) ) { + return ''; + } + $array = (isset( UM()->builtin()->predefined_fields[$key] ) ) ? UM()->builtin()->predefined_fields[$key] : UM()->builtin()->all_user_fields[$key]; + } + + $array['classes'] = null; + + if (!isset($array['placeholder'])) $array['placeholder'] = null; + if (!isset($array['required'])) $array['required'] = null; + if (!isset($array['validate'])) $array['validate'] = null; + if (!isset($array['default'])) $array['default'] = null; + + if ( isset( $array['conditions'] ) && is_array( $array['conditions'] ) && !$this->viewing ) { + $array['conditional'] = ''; + + foreach( $array['conditions'] as $cond_id => $cond ) { + $array['conditional'] .= ' data-cond-'.$cond_id.'-action="'. $cond[0] . '" data-cond-'.$cond_id.'-field="'. $cond[1] . '" data-cond-'.$cond_id.'-operator="'. $cond[2] . '" data-cond-'.$cond_id.'-value="'. $cond[3] . '"'; + } + + $array['classes'] .= ' um-is-conditional'; + + } else { + $array['conditional'] = null; + } + + $array['classes'] .= ' um-field-' . $key; + $array['classes'] .= ' um-field-' . $array['type']; + $array['classes'] .= ' um-field-type_' . $array['type']; + + switch( $array['type'] ) { + + case 'googlemap': + case 'youtube_video': + case 'vimeo_video': + case 'soundcloud_track': + $array['disabled'] = ''; + $array['input'] = 'text'; + break; + + case 'text': + + $array['disabled'] = ''; + + if ( $key == 'user_login' && isset( $this->set_mode ) && $this->set_mode == 'account' ) { + $array['disabled'] = 'disabled="disabled"'; + } + + $array['input'] = 'text'; + + break; + + case 'password': + + $array['input'] = 'password'; + + break; + + case 'number': + + $array['disabled'] = ''; + + break; + + case 'url': + + $array['input'] = 'text'; + + break; + + case 'date': + + $array['input'] = 'text'; + + if ( !isset( $array['format'] ) ) $array['format'] = 'j M Y'; + + switch( $array['format'] ) { + case 'j M Y': + $js_format = 'd mmm yyyy'; + break; + case 'j F Y': + $js_format = 'd mmmm yyyy'; + break; + case 'M j Y': + $js_format = 'mmm d yyyy'; + break; + case 'F j Y': + $js_format = 'mmmm d yyyy'; + break; + } + + $array['js_format'] = $js_format; + + if ( !isset( $array['range'] ) ) $array['range'] = 'years'; + if ( !isset( $array['years'] ) ) $array['years'] = 100; + if ( !isset( $array['years_x'] ) ) $array['years_x'] = 'past'; + if ( !isset( $array['disabled_weekdays'] ) ) $array['disabled_weekdays'] = ''; + + if ( !empty( $array['disabled_weekdays'] ) ) { + $array['disabled_weekdays'] = '[' . implode(',',$array['disabled_weekdays']) . ']'; + } + + // When date range is strictly defined + if ( $array['range'] == 'date_range' ) { + + $array['date_min'] = str_replace('/',',',$array['range_start']); + $array['date_max'] = str_replace('/',',',$array['range_end']); + + } else { + + if ( $array['years_x'] == 'past' ) { + + $date = new \DateTime( date('Y-n-d') ); + $past = $date->modify('-'.$array['years'].' years'); + $past = $date->format('Y,n,d'); + + $array['date_min'] = $past; + $array['date_max'] = date('Y,n,d'); + + } else if ( $array['years_x'] == 'future' ) { + + $date = new \DateTime( date('Y-n-d') ); + $future = $date->modify('+'.$array['years'].' years'); + $future = $date->format('Y,n,d'); + + $array['date_min'] = date('Y,n,d'); + $array['date_max'] = $future; + + } else { + + $date = new \DateTime( date('Y-n-d') ); + $date_f = new \DateTime( date('Y-n-d') ); + $past = $date->modify('-'. ( $array['years'] / 2 ).' years'); + $past = $date->format('Y,n,d'); + $future = $date_f->modify('+'. ( $array['years'] / 2 ).' years'); + $future = $date_f->format('Y,n,d'); + + $array['date_min'] = $past; + $array['date_max'] = $future; + + } + + } + + break; + + case 'time': + + $array['input'] = 'text'; + + if ( !isset( $array['format'] ) ) $array['format'] = 'g:i a'; + + switch( $array['format'] ) { + case 'g:i a': + $js_format = 'h:i a'; + break; + case 'g:i A': + $js_format = 'h:i A'; + break; + case 'H:i': + $js_format = 'HH:i'; + break; + } + + $array['js_format'] = $js_format; + + if ( !isset( $array['intervals'] ) ) $array['intervals'] = 60; + + break; + + case 'textarea': + + if (!isset($array['height'])) $array['height'] = '100px'; + + break; + + case 'rating': + + if (!isset($array['number'])) $array['number'] = 5; + + break; + + case 'spacing': + + if ( !isset($array['spacing'])){ + $array['spacing'] = '20px'; + } + + break; + + case 'divider': + + if (isset($array['width'])){ + $array['borderwidth'] = $array['width']; + } else { + $array['borderwidth'] = 4; + } + + if (isset($array['color'])){ + $array['bordercolor'] = $array['color']; + } else { + $array['bordercolor'] = '#eee'; + } + + if (isset($array['style'])){ + $array['borderstyle'] = $array['style']; + } else { + $array['borderstyle'] = 'solid'; + } + + if ( !isset( $array['divider_text'] ) ) { + $array['divider_text'] = ''; + } + + break; + + case 'image': + + if ( !isset( $array['crop'] ) ) $array['crop'] = 0; + + if ( $array['crop'] == 0 ) { + $array['crop_data'] = 0; + } else if ( $array['crop'] == 1 ) { + $array['crop_data'] = 'square'; + } else if ( $array['crop'] == 2 ) { + $array['crop_data'] = 'cover'; + } else { + $array['crop_data'] = 'user'; + } + + if ( !isset( $array['modal_size'] ) ) $array['modal_size'] = 'normal'; + + if ( $array['crop'] > 0 ) { + $array['crop_class'] = 'crop'; + } else { + $array['crop_class'] = ''; + } + + if ( !isset( $array['ratio'] ) ) $array['ratio'] = 1.0; + + if ( !isset( $array['min_width'] ) ) $array['min_width'] = ''; + if ( !isset( $array['min_height'] ) ) $array['min_height'] = ''; + + if ( $array['min_width'] == '' && $array['crop'] == 1 ) $array['min_width'] = 600; + if ( $array['min_height'] == '' && $array['crop'] == 1 ) $array['min_height'] = 600; + + if ( $array['min_width'] == '' && $array['crop'] == 3 ) $array['min_width'] = 600; + if ( $array['min_height'] == '' && $array['crop'] == 3 ) $array['min_height'] = 600; + + if (!isset($array['invalid_image'])) $array['invalid_image'] = __("Please upload a valid image!",'ultimate-member'); + if (!isset($array['allowed_types'])) { + $array['allowed_types'] = "gif,jpg,jpeg,png"; + } else { + $array['allowed_types'] = implode(',',$array['allowed_types']); + } + if (!isset($array['upload_text'])) $array['upload_text'] = ''; + if (!isset($array['button_text'])) $array['button_text'] = __('Upload','ultimate-member'); + if (!isset($array['extension_error'])) $array['extension_error'] = __("Sorry this is not a valid image.",'ultimate-member'); + if (!isset($array['max_size_error'])) $array['max_size_error'] = __("This image is too large!",'ultimate-member'); + if (!isset($array['min_size_error'])) $array['min_size_error'] = __("This image is too small!",'ultimate-member'); + if (!isset($array['max_files_error'])) $array['max_files_error'] = __("You can only upload one image",'ultimate-member'); + if (!isset($array['max_size'])) $array['max_size'] = 999999999; + if (!isset($array['upload_help_text'])) $array['upload_help_text'] = ''; + if (!isset($array['icon']) ) $array['icon'] = ''; + + break; + + case 'file': + + if ( !isset( $array['modal_size'] ) ) $array['modal_size'] = 'normal'; + + if (!isset($array['allowed_types'])) { + $array['allowed_types'] = "pdf,txt"; + } else { + $array['allowed_types'] = implode(',',$array['allowed_types']); + } + if (!isset($array['upload_text'])) $array['upload_text'] = ''; + if (!isset($array['button_text'])) $array['button_text'] = __('Upload','ultimate-member'); + if (!isset($array['extension_error'])) $array['extension_error'] = "Sorry this is not a valid file."; + if (!isset($array['max_size_error'])) $array['max_size_error'] = "This file is too large!"; + if (!isset($array['min_size_error'])) $array['min_size_error'] = "This file is too small!"; + if (!isset($array['max_files_error'])) $array['max_files_error'] = "You can only upload one file"; + if (!isset($array['max_size'])) $array['max_size'] = 999999999; + if (!isset($array['upload_help_text'])) $array['upload_help_text'] = ''; + if (!isset($array['icon']) ) $array['icon'] = ''; + + break; + + case 'select': + + break; + + case 'multiselect': + + break; + + case 'group': + + if ( !isset( $array['max_entries'] ) ) $array['max_entries'] = 0; + + break; + + } + + if ( !isset( $array['visibility'] ) ) $array['visibility'] = 'all'; + + $array = apply_filters("um_get_field__{$key}", $array ); + + + return $array; + } + + /** + * Gets a field in 'input mode' + * @param string $key + * @param array $data + * @param boolean $rule + * @return string + */ + function edit_field( $key, $data, $rule=false ) { + $output = null; + $disabled = ''; + + // get whole field data + if ( isset( $data ) && is_array( $data ) ) { + $data = $this->get_field($key); + if( is_array( $data ) ){ + extract($data); + } + } + + if ( !isset( $data['type'] ) ) return; + + if ( isset( $data['in_group'] ) && $data['in_group'] != '' && $rule != 'group' ) return; + + if ( $visibility == 'view' && $this->set_mode != 'register' ) return; + + if ( ( $visibility == 'view' && $this->set_mode == 'register' ) || + ( isset( $data['editable'] ) && $data['editable'] == 0 && $this->set_mode == 'profile' ) ){ + + if ( ! UM()->roles()->um_user_can( 'can_edit_everyone' ) ) + $disabled = ' disabled="disabled" '; + + if ( isset( $data['public'] ) && $data['public'] == '-2' && $data['roles'] ){ + if ( in_array( UM()->roles()->um_get_user_role( get_current_user_id() ), $data['roles'] ) ) { + $disabled = ''; + } + } + + } + + if( ! isset( $data['autocomplete'] ) ){ + $autocomplete = 'off'; + } + + + if ( !um_can_view_field( $data ) ) return; + if ( !um_can_edit_field( $data ) ) return; + + + // fields that need to be disabled in edit mode (profile) + $arr_restricted_fields = array('user_email','username','user_login','user_password'); + + if( um_get_option('editable_primary_email_in_profile') == 1 ){ + unset( $arr_restricted_fields[0] ); // remove user_email + } + + if ( in_array( $key, $arr_restricted_fields ) && $this->editing == true && $this->set_mode == 'profile' ) { + return; + } + + // forbidden in edit mode? + if ( isset( $data['edit_forbidden'] ) ) return; + + // required option + if ( isset( $data['required_opt'] ) ) { + $opt = $data['required_opt']; + if ( um_get_option( $opt[0] ) != $opt[1] ) { + return; + } + } + + // required user permission + if ( isset( $data['required_perm'] ) ) { + if ( !um_user( $data['required_perm'] ) ) { + return; + } + } + + // do not show passwords + if ( isset( UM()->user()->preview ) && UM()->user()->preview ) { + if ( $data['type'] == 'password' ){ + return; + } + } + + $type = apply_filters("um_hook_for_field_{$type}", $type ); + + /* Begin by field type */ + switch( $type ) { + + /* Default: Integration */ + default: + $mode = (isset($this->set_mode))?$this->set_mode:'no_mode'; + $output .= apply_filters("um_edit_field_{$mode}_{$type}", $output, $data); + break; + + /* Other fields */ + case 'googlemap': + case 'youtube_video': + case 'vimeo_video': + case 'soundcloud_track': + + $output .= '
            '; + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label($label, $key, $data); + } + + $output .= '
            '; + + if ( isset($icon) && $icon && isset( $this->field_icons ) && $this->field_icons == 'field' ) { + + $output .= '
            '; + + } + + $field_name = $key.UM()->form()->form_suffix; + $field_value = htmlspecialchars( $this->field_value( $key, $default, $data ) ); + + $output .= ' + +
            '; + + if( ! empty( $disabled ) ){ + $output .= $this->disabled_hidden_field( $field_name, $field_value ); + } + + if ( $this->is_error($key) ) { + $output .= $this->field_error( $this->show_error($key) ); + } + + $output .= '
            '; + break; + + /* Text */ + case 'text': + + $output .= '
            '; + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label($label, $key, $data); + } + + $output .= '
            '; + + if ( isset($icon) && $icon && isset( $this->field_icons ) && $this->field_icons == 'field' ) { + + $output .= '
            '; + + } + + $field_name = $key.UM()->form()->form_suffix; + $field_value = htmlspecialchars( $this->field_value( $key, $default, $data ) ); + + $output .= ' + +
            '; + + if( ! empty( $disabled ) ){ + $output .= $this->disabled_hidden_field( $field_name, $field_value ); + } + + if ( $this->is_error($key) ) { + $output .= $this->field_error( $this->show_error($key) ); + } + + $output .= '
            '; + break; + + /* Number */ + case 'number': + + $output .= '
            '; + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label($label, $key, $data); + } + + $output .= '
            '; + + if ( isset($icon) && $icon && isset( $this->field_icons ) && $this->field_icons == 'field' ) { + + $output .= '
            '; + + } + + $number_limit = ''; + + if( isset( $min ) ){ + $number_limit .= " min=\"{$min}\" "; + } + + if( isset( $max ) ){ + $number_limit .= " max=\"{$max}\" "; + } + + $output .= ' + +
            '; + + if ( $this->is_error($key) ) { + $output .= $this->field_error( $this->show_error($key) ); + } + + $output .= '
            '; + break; + + /* Password */ + case 'password': + + $original_key = $key; + + if ( $key == 'single_user_password' ) { + + $key = $original_key; + + $output .= '
            '; + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label($label, $key, $data); + } + + $output .= '
            '; + + if ( isset($icon) && $icon && $this->field_icons == 'field' ) { + + $output .= '
            '; + + } + + $output .= ' + +
            '; + + if ( $this->is_error($key) ) { + $output .= $this->field_error( $this->show_error($key) ); + } + + $output .= '
            '; + + } else { + + if ( $this->set_mode == 'account' && um_is_core_page('account') ) { + + $key = 'current_' . $original_key; + $output .= '
            '; + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label( __('Current Password','ultimate-member'), $key, $data); + } + + $output .= '
            '; + + if ( isset($icon) && $icon && $this->field_icons == 'field' ) { + + $output .= '
            '; + + } + + $output .= ' + +
            '; + + if ( $this->is_error($key) ) { + $output .= $this->field_error( $this->show_error($key) ); + } + + $output .= '
            '; + + } + + $key = $original_key; + + $output .= '
            '; + + if ( $this->set_mode == 'account' && um_is_core_page('account') || $this->set_mode == 'password' && um_is_core_page('password-reset') ) { + + $output .= $this->field_label( __('New Password','ultimate-member'), $key, $data); + + } else if ( isset( $data['label'] ) ) { + + $output .= $this->field_label($label, $key, $data); + + } + + $output .= '
            '; + + if ( isset($icon) && $icon && $this->field_icons == 'field' ) { + + $output .= '
            '; + + } + + $output .= ' + +
            '; + + if ( $this->is_error($key) ) { + $output .= $this->field_error( $this->show_error($key) ); + } + + $output .= '
            '; + + if ( $this->set_mode != 'login' && isset( $data['force_confirm_pass'] ) && $data['force_confirm_pass'] == 1 ) { + + $key = 'confirm_' . $original_key; + $output .= '
            '; + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label( sprintf(__('Confirm %s','ultimate-member'), $data['label'] ), $key, $data); + } + + $output .= '
            '; + + if ( isset($icon) && $icon && $this->field_icons == 'field' ) { + + $output .= '
            '; + + } + + $output .= ' + +
            '; + + if ( $this->is_error($key) ) { + $output .= $this->field_error( $this->show_error($key) ); + } + + $output .= '
            '; + + } + + } + + break; + + /* URL */ + case 'url': + + $output .= '
            '; + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label($label, $key, $data); + } + + $output .= '
            '; + + if ( isset($icon) && $icon && isset($this->field_icons) && $this->field_icons == 'field' ) { + + $output .= '
            '; + + } + + $output .= ' + +
            '; + + if ( $this->is_error($key) ) { + $output .= $this->field_error( $this->show_error($key) ); + } + + $output .= '
            '; + break; + + /* Date */ + case 'date': + + $output .= '
            '; + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label($label, $key, $data); + } + + $output .= '
            '; + + if ( isset($icon) && $icon && isset( $this->field_icons ) && $this->field_icons == 'field' ) { + + $output .= '
            '; + + } + + $output .= ' + +
            '; + + if ( $this->is_error($key) ) { + $output .= $this->field_error( $this->show_error($key) ); + } + + $output .= '
            '; + break; + + /* Time */ + case 'time': + + $output .= '
            '; + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label($label, $key, $data); + } + + $output .= '
            '; + + if ( isset($icon) && $icon && $this->field_icons == 'field' ) { + + $output .= '
            '; + + } + + $output .= ' + +
            '; + + if ( $this->is_error($key) ) { + $output .= $this->field_error( $this->show_error($key) ); + } + + $output .= '
            '; + break; + + /* Row */ + case 'row': + $output .= ''; + break; + + /* Textarea */ + case 'textarea': + $output .= '
            '; + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label($label, $key, $data); + } + + $output .= '
            '; + $field_name = $key; + $field_value = $this->field_value( $key, $default, $data ); + + if ( isset( $data['html'] ) && $data['html'] != 0 && $key != "description" ) { + + + $textarea_settings = array( + 'media_buttons' => false, + 'wpautop' => false, + 'editor_class' => $this->get_class($key, $data), + 'editor_height' => $height, + 'tinymce'=> array( + 'toolbar1' => 'formatselect,bullist,numlist,bold,italic,underline,forecolor,blockquote,hr,removeformat,link,unlink,undo,redo', + 'toolbar2' => '', + ) + ); + + if( ! empty( $disabled ) ){ + $textarea_settings['tinymce']['readonly'] = true; + } + + $textarea_settings = apply_filters('um_form_fields_textarea_settings', $textarea_settings ); + + // turn on the output buffer + ob_start(); + + // echo the editor to the buffer + wp_editor( $field_value , $key, $textarea_settings ); + + // add the contents of the buffer to the output variable + $output .= ob_get_clean(); + + } + else $output .= ''; + + $output .= ' +
            '; + + if( ! empty( $disabled ) ){ + $output .= $this->disabled_hidden_field( $field_name, $field_value ); + } + + if ( $this->is_error($key) ) { + $output .= $this->field_error( $this->show_error($key) ); + } + + $output .= '
            '; + break; + + /* Rating */ + case 'rating': + $output .= '
            '; + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label($label, $key, $data); + } + + $output .= '
            '; + + $output .= '
            '; + + $output .= '
            '; + + $output .= '
            '; + + break; + + /* Gap/Space */ + case 'spacing': + $output .= '
            '; + break; + + /* A line divider */ + case 'divider': + $output .= '
            '; + if ( $divider_text ) { + $output .= '
            ' . $divider_text . '
            '; + } + $output .= '
            '; + break; + + /* Single Image Upload */ + case 'image': + $output .= '
            '; + + if ( in_array( $key, array('profile_photo','cover_photo') ) ) { + $field_value = ''; + } else { + $field_value = $this->field_value( $key, $default, $data ); + } + + $output .= ''; + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label($label, $key, $data); + } + + $modal_label = ( isset( $data['label'] ) ) ? $data['label'] : __('Upload Photo','ultimate-member'); + + $output .= '
            '; + + if ( $this->field_value( $key, $default, $data ) ) { + + if ( !in_array( $key, array('profile_photo','cover_photo') ) ) { + if ( isset( $this->set_mode ) && $this->set_mode == 'register' ) { + $imgValue = $this->field_value( $key, $default, $data ); + } else { + $imgValue = um_user_uploads_uri() . $this->field_value( $key, $default, $data ); + } + $img = ''; + } else { + $img = ''; + } + + $output .= '
            + ' . $img . ' +
            '. __('Change photo','ultimate-member') . ''; + + } else { + + $output .= '
            + + +
            '. $button_text . ''; + + } + + $output .= '
            '; + + /* modal hidden */ + $output .= '
            '; + + $output .= '
            ' . $modal_label . '
            '; + + $output .= '
            '; + + if ( isset( $this->set_id ) ) { + $set_id = $this->set_id; + $set_mode = $this->set_mode; + } else { + $set_id = 0; + $set_mode = ''; + } + + $nonce = wp_create_nonce( 'um_upload_nonce-'.$this->timestamp ); + + $output .= '
            '; + $output .= '
            '.$button_text.'
            '; + + $output .= ''; + + $output .= '
            '; + + $output .= '
            '; + + /* end */ + + if ( $this->is_error($key) ) { + $output .= $this->field_error( $this->show_error($key) ); + } + + $output .= '
            '; + + break; + + /* Single File Upload */ + case 'file': + $output .= '
            '; + + $output .= ''; + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label($label, $key, $data); + } + + $modal_label = ( isset( $data['label'] ) ) ? $data['label'] : __('Upload Photo','ultimate-member'); + + $output .= '
            '; + + if ( $this->field_value( $key, $default, $data ) ) { + + $extension = pathinfo( $this->field_value( $key, $default, $data ), PATHINFO_EXTENSION); + + $output .= ''. __('Change file','ultimate-member') . ''; + + } else { + + $output .= '
            +
            '. $button_text . ''; + + } + + $output .= '
            '; + + /* modal hidden */ + $output .= '
            '; + + $output .= '
            ' . $modal_label . '
            '; + + $output .= '
            '; + + if ( isset( $this->set_id ) ) { + $set_id = $this->set_id; + $set_mode = $this->set_mode; + } else { + $set_id = 0; + $set_mode = ''; + } + + $output .= '
            + + +
            '; + + $nonce = wp_create_nonce( 'um_upload_nonce-'.$this->timestamp ); + + $output .= '
            '.$button_text.'
            '; + + $output .= ''; + + $output .= '
            '; + + $output .= '
            '; + + /* end */ + + if ( $this->is_error($key) ) { + $output .= $this->field_error( $this->show_error($key) ); + } + + $output .= '
            '; + + break; + + /* Select dropdown */ + case 'select': + + $form_key = str_replace( 'role_select', 'role', $key ); + + $output .= '
            '; + + + if ( isset( $data['allowclear'] ) && $data['allowclear'] == 0 ) { + $class = 'um-s2'; + } else { + $class = 'um-s1'; + } + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label($label, $key, $data); + } + + $output .= '
            '; + if ( isset( $icon ) && $icon && isset( $this->field_icons ) && $this->field_icons == 'field' ) { + $output .= '
            '; + } + + $has_parent_option = false; + $disabled_by_parent_option = ''; + $atts_ajax = ''; + $select_original_option_value = ''; + + if( isset( $data['parent_dropdown_relationship'] ) && ! empty( $data['parent_dropdown_relationship'] ) && ! UM()->user()->preview ){ + + $disabled_by_parent_option = 'disabled = disabled'; + + $has_parent_option = true; + + $parent_dropdown_relationship = apply_filters("um_custom_dropdown_options_parent__{$form_key}", $data['parent_dropdown_relationship'], $data ); + $atts_ajax .= " data-um-parent='{$parent_dropdown_relationship}' "; + + if( isset( $data['custom_dropdown_options_source'] ) && ! empty( $data['custom_dropdown_options_source'] ) && + $has_parent_option && function_exists( $data['custom_dropdown_options_source'] ) && + um_user( $data['parent_dropdown_relationship'] ) ){ + $options = call_user_func( $data['custom_dropdown_options_source'] ); + $disabled_by_parent_option = ''; + if( um_user( $form_key ) ){ + $select_original_option_value = " data-um-original-value='".um_user( $form_key )."' "; + } + } + + } + + if ( ! empty( $data['custom_dropdown_options_source'] ) ){ + + $ajax_source = apply_filters("um_custom_dropdown_options_source__{$form_key}", $data['custom_dropdown_options_source'], $data ); + $atts_ajax .= " data-um-ajax-source='{$ajax_source}' "; + + $ajax_source_url = apply_filters("um_custom_dropdown_options_source_url__{$form_key}", admin_url('admin-ajax.php'), $data ); + $atts_ajax .= " data-um-ajax-url='{$ajax_source_url}' "; + + + } + + $output .= ''; + + $output .= '
            '; + + + if ( $this->is_error($form_key) ) { + $output .= $this->field_error( $this->show_error($form_key) ); + } + + $output .= '
            '; + break; + + /* Multi-Select dropdown */ + case 'multiselect': + + $max_selections = ( isset( $max_selections ) ) ? absint( $max_selections ) : 0; + + $output .= '
            '; + + if ( isset( $data['allowclear'] ) && $data['allowclear'] == 0 ) { + $class = 'um-s2'; + } else { + $class = 'um-s1'; + } + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label($label, $key, $data); + } + + $field_icon = false; + $field_icon_output = ''; + + $use_keyword = apply_filters('um_multiselect_option_value', 0, $data['type'] ); + + $output .= '
            '; + if ( isset( $icon ) && $icon && isset( $this->field_icons ) && $this->field_icons == 'field' ) { + $output .= '
            '; + } + + $output .= ''; + + if( ! empty( $disabled ) && ! empty( $arr_selected ) ){ + foreach( $arr_selected as $item ){ + $output .= $this->disabled_hidden_field( $key.'[]', $item ); + } + } + + $output .= '
            '; + + + if ( $this->is_error($key) ) { + $output .= $this->field_error( $this->show_error( $key ) ); + } + + $output .= '
            '; + break; + + /* Radio */ + case 'radio': + + $form_key = str_replace( 'role_radio', 'role', $key ); + + if ( isset( $options ) ) { + $options = apply_filters('um_radio_field_options', $options, $data ); + $options = apply_filters("um_radio_field_options_{$key}", $options ); + } + + $output .= '
            '; + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label( $label, $key, $data ); + } + + $output .= '
            '; + + // role field + if ( $form_key == 'role' ) { + $options = UM()->roles()->get_roles( false, array( 'administrator' ) ); + + /*var_dump( UM()->roles()->get_roles() ); + global $wpdb; + if ( ! empty( $options ) ) { + foreach ( $options as $rkey => $val ) { + $val = (string) $val; + $val = trim( $val ); + $post_id = $wpdb->get_var( + $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'um_role' AND ( post_name = %s OR post_title = %s )", $rkey, $val ) + ); + $_role = get_post( $post_id ); + $new_roles[$_role->post_name] = $_role->post_title; + wp_reset_postdata(); + } + + $options = $new_roles; + }*/ + } + + // add options + $i = 0; + $field_value = array(); + + if ( ! empty( $options ) ) { + foreach ( $options as $k => $v ) { + + $v = rtrim($v); + + $um_field_checkbox_item_title = $v; + $option_value = $v; + + if ( !is_numeric( $k ) && in_array($form_key, array('role') ) ) { + $um_field_checkbox_item_title = $v; + $option_value = $k; + } + + $i++; + if ($i % 2 == 0 ) { + $col_class = 'right'; + } else { + $col_class = ''; + } + + if ( $this->is_radio_checked($key, $option_value, $data) ) { + $active = 'active'; + $class = "um-icon-android-radio-button-on"; + } else { + $active = ''; + $class = "um-icon-android-radio-button-off"; + } + + if( isset( $data['editable'] ) && $data['editable'] == 0 ){ + $col_class .= " um-field-radio-state-disabled"; + } + + + + $output .= ''; + + if ($i % 2 == 0) { + $output .= '
            '; + } + + } + } + + if ( ! empty( $disabled ) ) { + foreach ( $field_value as $item ) { + $output .= $this->disabled_hidden_field( $form_key , $item ); + } + } + + $output .= '
            '; + + $output .= '
            '; + + if ( $this->is_error($form_key) ) { + $output .= $this->field_error( $this->show_error($form_key) ); + } + + $output .= '
            '; + break; + + /* Checkbox */ + case 'checkbox': + + if ( isset( $options ) ) { + $options = apply_filters('um_checkbox_field_options', $options, $data ); + $options = apply_filters("um_checkbox_field_options_{$key}", $options ); + } + + $output .= '
            '; + + if ( isset( $data['label'] ) ) { + $output .= $this->field_label($label, $key, $data); + } + + $output .= '
            '; + + // add options + $i = 0; + + foreach($options as $k => $v) { + + $v = rtrim($v); + + $i++; + if ($i % 2 == 0 ) { + $col_class = 'right'; + } else { + $col_class = ''; + } + + if ( $this->is_selected($key, $v, $data) ) { + $active = 'active'; + $class = "um-icon-android-checkbox-outline"; + } else { + $active = ''; + $class = "um-icon-android-checkbox-outline-blank"; + } + + if( isset( $data['editable'] ) && $data['editable'] == 0 ){ + $col_class .= " um-field-radio-state-disabled"; + } + + $output .= ''; + + if ($i % 2 == 0) { + $output .= '
            '; + } + + } + + $output .= '
            '; + + $output .= '
            '; + + + if ( $this->is_error($key) ) { + $output .= $this->field_error( $this->show_error($key) ); + } + + $output .= '
            '; + break; + + /* HTML */ + case 'block': + $output .= '
            +
            '.$content.'
            +
            '; + break; + + /* Shortcode */ + case 'shortcode': + + $content = str_replace('{profile_id}', um_profile_id(), $content ); + + $output .= '
            +
            ' . do_shortcode($content) . '
            +
            '; + break; + + /* Unlimited Group */ + case 'group': + + $fields = $this->get_fields_in_group( $key ); + if ( !empty( $fields ) ) { + + $output .= '
            +
            '.__($label,UM_TEXTDOMAIN).'
            '; + $output .= '
            '; + + foreach($fields as $subkey => $subdata) { + $output .= $this->edit_field( $subkey, $subdata, 'group' ); + } + + $output .= '
            '; + $output .= '
            '; + + } + + break; + + } + + // Custom filter for field output + if ( isset( $this->set_mode ) ) { + $output = apply_filters("um_{$key}_form_edit_field", $output, $this->set_mode); + } + + return $output; + } + + /** + * Sorts columns array + * @param array $arr + * @param string $col + * @param string $dir + * @return array $arr + */ + function array_sort_by_column($arr, $col, $dir = SORT_ASC) { + $sort_col = array(); + foreach ($arr as $key=> $row) { + if ( isset( $row[$col] ) ) { + $sort_col[$key] = $row[$col]; + } + } + + array_multisort($sort_col, $dir, $arr); + return $arr; + } + + + /** + * Get fields in row + * @param integer $row_id + * @return string + */ + function get_fields_by_row( $row_id ) { + foreach( $this->get_fields as $key => $array ) { + if ( !isset( $array['in_row'] ) || ( isset( $array['in_row'] ) && $array['in_row'] == $row_id ) ) { + $results[$key] = $array; + } + } + return ( isset ( $results ) ) ? $results : ''; + } + + + /** + * Get fields by sub row + * @param string $row_fields + * @param integer $subrow_id + * @return mixed + */ + function get_fields_in_subrow( $row_fields, $subrow_id ) { + if ( !is_array( $row_fields ) ) return ''; + foreach( $row_fields as $key => $array ) { + if ( !isset( $array['in_sub_row'] ) || ( isset( $array['in_sub_row'] ) && $array['in_sub_row'] == $subrow_id ) ) { + $results[$key] = $array; + } + } + return ( isset ( $results ) ) ? $results : ''; + } + + /** + * Get fields in group + * @param integer $group_id + * @return mixed + */ + function get_fields_in_group( $group_id ) { + foreach( $this->get_fields as $key => $array ) { + if ( isset( $array['in_group'] ) && $array['in_group'] == $group_id ) { + $results[$key] = $array; + } + } + return ( isset ( $results ) ) ? $results : ''; + } + + + /** + * Get fields in column + * @param array $fields + * @param integer $col_number + * @return mixed + */ + function get_fields_in_column( $fields, $col_number ) { + foreach( $fields as $key => $array ) { + if ( isset( $array['in_column'] ) && $array['in_column'] == $col_number ) { + $results[$key] = $array; + } + } + return ( isset ( $results ) ) ? $results : ''; + } + + + /** + * Display fields + * @param string $mode + * @param array $args + * @return string + */ + function display( $mode, $args ) { + $output = null; + + $this->global_args = $args; + + UM()->form()->form_suffix = '-' . $this->global_args['form_id']; + + $this->set_mode = $mode; + $this->set_id = $this->global_args['form_id']; + + $this->field_icons = ( isset( $this->global_args['icons'] ) ) ? $this->global_args['icons'] : 'label'; + + // start output here + $this->get_fields = $this->get_fields(); + + if ( !empty( $this->get_fields ) ) { + + // find rows + foreach( $this->get_fields as $key => $array ) { + if ( $array['type'] == 'row' ) { + $this->rows[$key] = $array; + unset( $this->get_fields[ $key ] ); // not needed anymore + } + } + + // rows fallback + if ( !isset( $this->rows ) ){ + $this->rows = array( '_um_row_1' => array( + 'type' => 'row', + 'id' => '_um_row_1', + 'sub_rows' => 1, + 'cols' => 1 + ) + ); + } + + // master rows + foreach ( $this->rows as $row_id => $row_array ) { + + $row_fields = $this->get_fields_by_row( $row_id ); + if ( $row_fields ) { + + $output .= $this->new_row_output( $row_id, $row_array ); + + $sub_rows = ( isset( $row_array['sub_rows'] ) ) ? $row_array['sub_rows'] : 1; + for( $c = 0; $c < $sub_rows; $c++ ) { + + // cols + $cols = ( isset( $row_array['cols'] ) ) ? $row_array['cols'] : 1; + if ( strstr( $cols, ':' ) ) { + $col_split = explode( ':', $cols ); + } else { + $col_split = array( $cols ); + } + $cols_num = $col_split[$c]; + + // sub row fields + $subrow_fields = null; + $subrow_fields = $this->get_fields_in_subrow( $row_fields, $c ); + + if ( is_array( $subrow_fields ) ) { + + $subrow_fields = $this->array_sort_by_column( $subrow_fields, 'position'); + + if ( $cols_num == 1 ) { + + $output .= '
            '; + $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); + if ( $col1_fields ) { + foreach( $col1_fields as $key => $data ) {$output .= $this->edit_field( $key, $data );} + } + $output .= '
            '; + + } else if ( $cols_num == 2 ) { + + $output .= '
            '; + $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); + if ( $col1_fields ) { + foreach( $col1_fields as $key => $data ) {$output .= $this->edit_field( $key, $data );} + } + $output .= '
            '; + + $output .= '
            '; + $col2_fields = $this->get_fields_in_column( $subrow_fields, 2 ); + if ( $col2_fields ) { + foreach( $col2_fields as $key => $data ) {$output .= $this->edit_field( $key, $data );} + } + $output .= '
            '; + + } else { + + $output .= '
            '; + $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); + if ( $col1_fields ) { + foreach( $col1_fields as $key => $data ) {$output .= $this->edit_field( $key, $data );} + } + $output .= '
            '; + + $output .= '
            '; + $col2_fields = $this->get_fields_in_column( $subrow_fields, 2 ); + if ( $col2_fields ) { + foreach( $col2_fields as $key => $data ) {$output .= $this->edit_field( $key, $data );} + } + $output .= '
            '; + + $output .= '
            '; + $col3_fields = $this->get_fields_in_column( $subrow_fields, 3 ); + if ( $col3_fields ) { + foreach( $col3_fields as $key => $data ) {$output .= $this->edit_field( $key, $data );} + } + $output .= '
            '; + + } + + } + + } + + $output .= '
            '; + + } + + } + + } + + return $output; + } + + /** + * Gets a field in `view mode` + * @param string $key + * @param array $data + * @param boolean $rule + * @return string + */ + function view_field( $key, $data, $rule=false ) { + $output = null; + + // get whole field data + if (is_array($data)) { + $data = $this->get_field($key); + extract($data); + } + + if ( !isset( $data['type'] ) ) return; + + if ( isset( $data['in_group'] ) && $data['in_group'] != '' && $rule != 'group' ) return; + + if ( $visibility == 'edit' ) return; + + if ( in_array( $type, array('block','shortcode','spacing','divider','group') ) ) { + + } else { + if ( ! $this->field_value( $key, $default, $data ) ) return; + } + + if ( !um_can_view_field( $data ) ) return; + + // disable these fields in profile view only + if ( in_array( $key, array('user_password') ) && $this->set_mode == 'profile' ) { + return; + } + + if ( !um_field_conditions_are_met( $data ) ) return; + + switch( $type ) { + + /* Default */ + default: + + $output .= '
            '; + + if ( isset( $data['label'] ) || isset( $data['icon'] ) && ! empty( $data['icon'] ) ) { + + if( ! isset( $data['label'] ) ) $data['label'] = ''; + + $output .= $this->field_label( $data['label'], $key, $data); + } + + $res = $this->field_value( $key, $default, $data ); + + if( ! empty( $res ) ){ + $res = stripslashes( $res ); + } + + $data['is_view_field'] = true; + $res = apply_filters("um_view_field", $res, $data, $type ); + $res = apply_filters("um_view_field_value_{$type}", $res, $data ); + + + if ( $key == 'role_radio' || $key == 'role_select' ) { + $role_meta = UM()->roles()->role_data( um_user( 'role' ) ); + if ( ! empty( $role_meta['is_custom'] ) ) { + $res = 'UM ' . $res; + } + } + + $output .= '
            '; + $output .= '
            ' . $res . '
            '; + $output .= '
            '; + + $output .= '
            '; + + break; + + /* HTML */ + case 'block': + $output .= '
            +
            '.$content.'
            +
            '; + break; + + /* Shortcode */ + case 'shortcode': + + $content = str_replace('{profile_id}', um_profile_id(), $content ); + + $output .= '
            +
            ' . do_shortcode($content) . '
            +
            '; + break; + + /* Gap/Space */ + case 'spacing': + $output .= '
            '; + break; + + /* A line divider */ + case 'divider': + $output .= '
            '; + if ( $divider_text ) { + $output .= '
            ' . $divider_text . '
            '; + } + $output .= '
            '; + break; + + /* Rating */ + case 'rating': + + $output .= '
            '; + + if ( isset( $data['label'] ) || isset( $data['icon'] ) && ! empty( $data['icon'] ) ) { + $output .= $this->field_label($label, $key, $data); + } + + $output .= '
            '; + $output .= '
            +
            +
            '; + $output .= '
            '; + + $output .= '
            '; + + break; + + } + + // Custom filter for field output + if ( isset( $this->set_mode ) ) { + $output = apply_filters("um_{$key}_form_show_field", $output, $this->set_mode); + $output = apply_filters("um_{$type}_form_show_field", $output, $this->set_mode); + + } + + return $output; + } + + /** + * Display fields ( view mode ) + * @param string $mode + * @param array $args + * @return string + */ + function display_view( $mode, $args ) { + $output = null; + + $this->global_args = $args; + + UM()->form()->form_suffix = '-' . $this->global_args['form_id']; + + $this->set_mode = $mode; + $this->set_id = $this->global_args['form_id']; + + $this->field_icons = ( isset( $this->global_args['icons'] ) ) ? $this->global_args['icons'] : 'label'; + + // start output here + $this->get_fields = $this->get_fields(); + + if ( um_get_option('profile_empty_text') ) { + + $emo = um_get_option('profile_empty_text_emo'); + if ( $emo ) { + $emo = ''; + } else { + $emo = false; + } + + if ( um_is_myprofile() ) { + $output .= '

            ' . $emo .'' . sprintf(__('Your profile is looking a little empty. Why not add some information!','ultimate-member'), um_edit_profile_url() ) . '

            '; + } else { + $output .= '

            '. $emo . '' . __('This user has not added any information to their profile yet.','ultimate-member') . '

            '; + } + } + + if ( ! empty( $this->get_fields ) ) { + + // find rows + foreach ( $this->get_fields as $key => $array ) { + if ( $array['type'] == 'row' ) { + $this->rows[$key] = $array; + unset( $this->get_fields[ $key ] ); // not needed anymore + } + } + + // rows fallback + if ( !isset( $this->rows ) ) { + $this->rows = array( '_um_row_1' => array( + 'type' => 'row', + 'id' => '_um_row_1', + 'sub_rows' => 1, + 'cols' => 1 + ) + ); + } + + // master rows + foreach ( $this->rows as $row_id => $row_array ) { + + $row_fields = $this->get_fields_by_row( $row_id ); + + if ( $row_fields ) { + + $output .= $this->new_row_output( $row_id, $row_array ); + + $sub_rows = ( isset( $row_array['sub_rows'] ) ) ? $row_array['sub_rows'] : 1; + for( $c = 0; $c < $sub_rows; $c++ ) { + + // cols + $cols = ( isset( $row_array['cols'] ) ) ? $row_array['cols'] : 1; + if ( strstr( $cols, ':' ) ) { + $col_split = explode( ':', $cols ); + } else { + $col_split = array( $cols ); + } + $cols_num = $col_split[$c]; + + // sub row fields + $subrow_fields = null; + $subrow_fields = $this->get_fields_in_subrow( $row_fields, $c ); + + if ( is_array( $subrow_fields ) ) { + + $subrow_fields = $this->array_sort_by_column( $subrow_fields, 'position'); + + if ( $cols_num == 1 ) { + + $output .= '
            '; + $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); + if ( $col1_fields ) { + foreach( $col1_fields as $key => $data ) { + + $data = apply_filters("um_view_field_output_".$data['type'], $data); + + $output .= $this->view_field( $key, $data ); + + + } + } + $output .= '
            '; + + } else if ( $cols_num == 2 ) { + + $output .= '
            '; + $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); + if ( $col1_fields ) { + foreach( $col1_fields as $key => $data ) { + + $data = apply_filters("um_view_field_output_".$data['type'], $data); + + $output .= $this->view_field( $key, $data ); + + } + } + $output .= '
            '; + + $output .= '
            '; + $col2_fields = $this->get_fields_in_column( $subrow_fields, 2 ); + if ( $col2_fields ) { + foreach( $col2_fields as $key => $data ) { + + $data = apply_filters("um_view_field_output_".$data['type'], $data); + + $output .= $this->view_field( $key, $data ); + + } + } + $output .= '
            '; + + } else { + + $output .= '
            '; + $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); + if ( $col1_fields ) { + foreach( $col1_fields as $key => $data ) { + + $data = apply_filters("um_view_field_output_".$data['type'], $data); + + $output .= $this->view_field( $key, $data ); + + } + } + $output .= '
            '; + + $output .= '
            '; + $col2_fields = $this->get_fields_in_column( $subrow_fields, 2 ); + if ( $col2_fields ) { + foreach( $col2_fields as $key => $data ) { + + $data = apply_filters("um_view_field_output_".$data['type'], $data); + + $output .= $this->view_field( $key, $data ); + + } + } + $output .= '
            '; + + $output .= '
            '; + $col3_fields = $this->get_fields_in_column( $subrow_fields, 3 ); + if ( $col3_fields ) { + foreach( $col3_fields as $key => $data ) { + + $data = apply_filters("um_view_field_output_".$data['type'], $data); + + $output .= $this->view_field( $key, $data ); + + } + } + $output .= '
            '; + + } + + } + + } + + $output .= '
            '; + + } + + } + + } + + return $output; + } + + /** + * Get new row in form + * @param string $row_id + * @param array $row_array + * @return array + */ + function new_row_output( $row_id, $row_array ) { + $output = null; + extract($row_array); + + $padding = (isset($padding))?$padding:''; + $margin = (isset($margin))?$margin:''; + $background = (isset($background))?$background:''; + $text_color = (isset($text_color))?$text_color:''; + $borderradius = (isset($borderradius))?$borderradius:''; + $border = (isset($border))?$border:''; + $bordercolor = (isset($bordercolor))?$bordercolor:''; + $borderstyle = (isset($borderstyle))?$borderstyle:''; + $heading = (isset($heading))?$heading:''; + $css_class = (isset($css_class))?$css_class:''; + + $css_padding = ''; + $css_margin = ''; + $css_background = ''; + $css_borderradius = ''; + $css_border = ''; + $css_bordercolor = ''; + $css_borderstyle = ''; + $css_heading_background_color = ''; + $css_heading_padding = ''; + $css_heading_text_color = ''; + $css_heading_borderradius = ''; + $css_text_color = ''; + + // row css rules + if ( $padding ) $css_padding = 'padding: ' . $padding .';'; + if ( $margin ) { + $css_margin = 'margin: ' . $margin .';'; + } else { + $css_margin = 'margin: 0 0 30px 0;'; + } + + if ( $background ) $css_background = 'background-color: ' . $background .';'; + if ( $borderradius ) $css_borderradius = 'border-radius: 0px 0px ' . $borderradius . ' ' . $borderradius . ';'; + if ( $border ) $css_border = 'border-width: ' . $border . ';'; + if ( $bordercolor ) $css_bordercolor = 'border-color: ' . $bordercolor . ';'; + if ( $borderstyle ) $css_borderstyle = 'border-style: ' . $borderstyle . ';'; + if ( $text_color ) $css_text_color = 'color: ' . $text_color . ' !important;'; + + // show the heading + if ( $heading ) { + + $heading_background_color = (isset($heading_background_color))?$heading_background_color:''; + $heading_text_color = (isset($heading_text_color))?$heading_text_color:''; + + if ( $heading_background_color ) { + $css_heading_background_color = 'background-color: ' . $heading_background_color .';'; + $css_heading_padding = 'padding: 10px 15px;'; + } + + if ( $heading_text_color ) $css_heading_text_color = 'color: ' . $heading_text_color .';'; + if ( $borderradius ) $css_heading_borderradius = 'border-radius: ' . $borderradius . ' ' . $borderradius . ' 0px 0px;'; + + $output .= '
            '; + + if ( isset( $icon ) ) { + $output .= ''; + } + + $output .= ( ! empty( $heading_text ) ? $heading_text: '') .'
            '; + + } else { + + // no heading + if ( $borderradius ) $css_borderradius = 'border-radius: ' . $borderradius . ';'; + + } + + $output .= '
            '; + + return $output; + } + + + + + function do_ajax_action() { + if ( !is_user_logged_in() || !current_user_can('manage_options') ) die( __('Please login as administrator','ultimate-member') ); + + extract($_POST); + + $output = null; + + $position = array(); + if ( ! empty( $in_column ) ) { + $position['in_row'] = '_um_row_' . ( (int)$in_row+1 ); + $position['in_sub_row'] = $in_sub_row; + $position['in_column'] = $in_column; + $position['in_group'] = $in_group; + } + + switch ( $act_id ) { + + case 'um_admin_duplicate_field': + UM()->fields()->duplicate_field( $arg1, $arg2 ); + break; + + case 'um_admin_remove_field_global': + UM()->fields()->delete_field_from_db( $arg1 ); + break; + + case 'um_admin_remove_field': + UM()->fields()->delete_field_from_form( $arg1, $arg2 ); + break; + + case 'um_admin_add_field_from_predefined': + UM()->fields()->add_field_from_predefined( $arg1, $arg2, $position ); + break; + + case 'um_admin_add_field_from_list': + UM()->fields()->add_field_from_list( $arg1, $arg2, $position ); + break; + + } + + if(is_array($output)){ print_r($output); }else{ echo $output; } die; + + } + } +} \ No newline at end of file diff --git a/includes/core/class-files.php b/includes/core/class-files.php new file mode 100644 index 00000000..954a2c31 --- /dev/null +++ b/includes/core/class-files.php @@ -0,0 +1,747 @@ +setup_paths(); + + $this->fonticon = array( + 'pdf' => array('icon' => 'um-faicon-file-pdf-o', 'color' => '#D24D4D' ), + 'txt' => array('icon' => 'um-faicon-file-text-o' ), + 'csv' => array('icon' => 'um-faicon-file-text-o' ), + 'doc' => array('icon' => 'um-faicon-file-text-o', 'color' => '#2C95D5' ), + 'docx' => array('icon' => 'um-faicon-file-text-o', 'color' => '#2C95D5' ), + 'odt' => array('icon' => 'um-faicon-file-text-o', 'color' => '#2C95D5' ), + 'ods' => array('icon' => 'um-faicon-file-excel-o', 'color' => '#51BA6A' ), + 'xls' => array('icon' => 'um-faicon-file-excel-o', 'color' => '#51BA6A' ), + 'xlsx' => array('icon' => 'um-faicon-file-excel-o', 'color' => '#51BA6A' ), + 'zip' => array('icon' => 'um-faicon-file-zip-o' ), + 'rar' => array('icon' => 'um-faicon-file-zip-o' ), + 'mp3' => array('icon' => 'um-faicon-file-audio-o' ), + 'jpg' => array('icon' => 'um-faicon-picture-o' ), + 'jpeg' => array('icon' => 'um-faicon-picture-o' ), + 'png' => array('icon' => 'um-icon-image' ), + 'gif' => array('icon' => 'um-icon-images' ), + 'eps' => array('icon' => 'um-icon-images' ), + 'psd' => array('icon' => 'um-icon-images' ), + 'tif' => array('icon' => 'um-icon-image' ), + 'tiff' => array('icon' => 'um-icon-image' ), + ); + + $this->default_file_fonticon = 'um-faicon-file-o'; + + } + + + function ajax_remove_file() { + extract( $_REQUEST ); + $this->delete_file( $src ); + } + + + function ajax_resize_image() { + $output = 0; + + extract($_REQUEST); + + if ( !isset($src) || !isset($coord) ) die( __('Invalid parameters') ); + + $coord_n = substr_count($coord, ","); + if ( $coord_n != 3 ) die( __('Invalid coordinates') ); + + $um_is_temp_image = um_is_temp_image( $src ); + if ( !$um_is_temp_image ) die( __('Invalid Image file') ); + + $crop = explode(',', $coord ); + $crop = array_map('intval', $crop); + + $uri = UM()->files()->resize_image( $um_is_temp_image, $crop ); + + // If you're updating a user + if ( isset( $user_id ) && $user_id > 0 ) { + $uri = UM()->files()->new_user_upload( $user_id, $um_is_temp_image, $key ); + } + + $output = $uri; + + delete_option( "um_cache_userdata_{$user_id}" ); + + if(is_array($output)){ print_r($output); }else{ echo $output; } die; + } + + + /*** + *** @allowed image types + ***/ + function allowed_image_types() { + + $array['png'] = 'PNG'; + $array['jpeg'] = 'JPEG'; + $array['jpg'] = 'JPG'; + $array['gif'] = 'GIF'; + + $array = apply_filters('um_allowed_image_types', $array); + return $array; + } + + /*** + *** @allowed file types + ***/ + function allowed_file_types() { + + $array['pdf'] = 'PDF'; + $array['txt'] = 'Text'; + $array['csv'] = 'CSV'; + $array['doc'] = 'DOC'; + $array['docx'] = 'DOCX'; + $array['odt'] = 'ODT'; + $array['ods'] = 'ODS'; + $array['xls'] = 'XLS'; + $array['xlsx'] = 'XLSX'; + $array['zip'] = 'ZIP'; + $array['rar'] = 'RAR'; + $array['mp3'] = 'MP3'; + $array['jpg'] = 'JPG'; + $array['jpeg'] = 'JPEG'; + $array['png'] = 'PNG'; + $array['gif'] = 'GIF'; + $array['eps'] = 'EPS'; + $array['psd'] = 'PSD'; + $array['tif'] = 'TIF'; + $array['tiff'] = 'TIFF'; + + $array = apply_filters('um_allowed_file_types', $array); + return $array; + } + + /*** + *** @Get extension icon + ***/ + function get_fonticon_by_ext( $extension ) { + if ( isset( $this->fonticon[$extension]['icon'] ) ) { + return $this->fonticon[$extension]['icon']; + } else { + return $this->default_file_fonticon; + } + } + + /*** + *** @Get extension icon background + ***/ + function get_fonticon_bg_by_ext( $extension ) { + if ( isset( $this->fonticon[$extension]['color'] ) ) { + return $this->fonticon[$extension]['color']; + } else { + return '#666'; + } + } + + /*** + *** @Setup upload directory + ***/ + function setup_paths() { + + $this->upload_dir = wp_upload_dir(); + + $this->upload_basedir = $this->upload_dir['basedir'] . '/ultimatemember/'; + $this->upload_baseurl = $this->upload_dir['baseurl'] . '/ultimatemember/'; + + $this->upload_basedir = apply_filters( 'um_upload_basedir_filter', $this->upload_basedir ); + $this->upload_baseurl = apply_filters( 'um_upload_baseurl_filter', $this->upload_baseurl ); + + // @note : is_ssl() doesn't work properly for some sites running with load balancers + // Check the links for more info about this bug + // https://codex.wordpress.org/Function_Reference/is_ssl + // http://snippets.webaware.com.au/snippets/wordpress-is_ssl-doesnt-work-behind-some-load-balancers/ + if ( is_ssl() || stripos( get_option( 'siteurl' ), 'https://' ) !== false + || ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) ) { + $this->upload_baseurl = str_replace("http://", "https://", $this->upload_baseurl); + } + + $this->upload_temp = $this->upload_basedir . 'temp/'; + $this->upload_temp_url = $this->upload_baseurl . 'temp/'; + + if ( ! file_exists( $this->upload_basedir ) ) { + $old = umask(0); + @mkdir( $this->upload_basedir, 0755, true ); + umask( $old ); + } + + if ( ! file_exists( $this->upload_temp ) ) { + $old = umask(0); + @mkdir( $this->upload_temp , 0755, true ); + umask( $old ); + } + + } + + /*** + *** @Generate unique temp directory + ***/ + function unique_dir(){ + $unique_number = UM()->validation()->generate(); + $array['dir'] = $this->upload_temp . $unique_number . '/'; + $array['url'] = $this->upload_temp_url . $unique_number . '/'; + return $array; + } + + /*** + *** @get path only without file name + ***/ + function path_only( $file ) { + return trailingslashit( dirname( $file ) ); + } + + /*** + *** @fix image orientation + ***/ + function fix_image_orientation($rotate, $source){ + if ( extension_loaded('exif') ){ + $exif = @exif_read_data($source); + + if (isset($exif['Orientation'])) { + switch ($exif['Orientation']) { + case 3: + $rotate = imagerotate($rotate, 180, 0); + break; + + case 6: + $rotate = imagerotate($rotate, -90, 0); + break; + + case 8: + $rotate = imagerotate($rotate, 90, 0); + break; + } + } + } + return $rotate; + } + + /*** + *** @Process an image + ***/ + function create_and_copy_image($source, $destination, $quality = 100) { + + $info = @getimagesize($source); + + if ($info['mime'] == 'image/jpeg'){ + + $image = imagecreatefromjpeg( $source ); + + } else if ($info['mime'] == 'image/gif'){ + + $image = imagecreatefromgif( $source ); + + } else if ($info['mime'] == 'image/png'){ + + $image = imagecreatefrompng( $source ); + imagealphablending( $image, false ); + imagesavealpha( $image, true ); + + } + + list($w, $h) = @getimagesize( $source ); + if ( $w > um_get_option('image_max_width') ) { + + $ratio = round( $w / $h, 2 ); + $new_w = um_get_option('image_max_width'); + $new_h = round( $new_w / $ratio, 2 ); + + if ( $info['mime'] == 'image/jpeg' || $info['mime'] == 'image/gif' ){ + + $image_p = imagecreatetruecolor( $new_w, $new_h ); + imagecopyresampled( $image_p, $image, 0, 0, 0, 0, $new_w, $new_h, $w, $h ); + $image_p = $this->fix_image_orientation( $image_p, $source ); + + }else if( $info['mime'] == 'image/png' ){ + + $srcImage = $image; + $targetImage = imagecreatetruecolor( $new_w, $new_h ); + imagealphablending( $targetImage, false ); + imagesavealpha( $targetImage, true ); + imagecopyresampled( $targetImage, $srcImage, 0, 0, 0, 0, $new_w, $new_h, $w, $h ); + + } + + if ( $info['mime'] == 'image/jpeg' ){ + $has_copied = imagejpeg( $image_p, $destination, $quality ); + }else if ( $info['mime'] == 'image/gif' ){ + $has_copied = imagegif( $image_p, $destination ); + }else if ( $info['mime'] == 'image/png' ){ + $has_copied = imagepng( $targetImage, $destination, 0 ,PNG_ALL_FILTERS); + } + + $info['um_has_max_width'] = 'custom'; + $info['um_has_copied'] = $has_copied ? 'yes':'no'; + + } else { + + $image = $this->fix_image_orientation( $image, $source ); + + if ( $info['mime'] == 'image/jpeg' ){ + $has_copied = imagejpeg( $image, $destination, $quality ); + }else if ( $info['mime'] == 'image/gif' ){ + $has_copied = imagegif( $image, $destination ); + }else if ( $info['mime'] == 'image/png' ){ + $has_copied = imagepng( $image , $destination , 0 ,PNG_ALL_FILTERS); + } + + $info['um_has_max_width'] = 'default'; + $info['um_has_copied'] = $has_copied ? 'yes':'no'; + } + + + + return $info; + } + + /*** + *** @Process a file + ***/ + function upload_temp_file( $source, $destination ) { + + move_uploaded_file( $source, $destination ); + + } + + /*** + *** @Process a temp upload + ***/ + function new_image_upload_temp( $source, $destination, $quality = 100 ){ + + $unique_dir = $this->unique_dir(); + + $this->make_dir( $unique_dir['dir'] ); + + $info = $this->create_and_copy_image( $source, $unique_dir['dir'] . $destination, $quality ); + + $url = $unique_dir['url'] . $destination ; + + return $url; + + } + + /*** + *** @Process a temp upload for files + ***/ + function new_file_upload_temp( $source, $destination ){ + + $unique_dir = $this->unique_dir(); + + $this->make_dir( $unique_dir['dir'] ); + + $this->upload_temp_file( $source, $unique_dir['dir'] . $destination ); + + $url = $unique_dir['url'] . $destination; + + return $url; + + } + + /*** + *** @Make a Folder + ***/ + function make_dir( $dir ){ + + $old = umask(0); + @mkdir( $dir, 0755, true); + umask( $old ); + + } + + /*** + *** @Get extension by mime type + ***/ + function get_extension_by_mime_type( $mime ){ + $split = explode('/', $mime ); + return $split[1]; + } + + /*** + *** @Get file data + ***/ + function get_file_data( $file ){ + + $array['size'] = filesize( $file ); + + return $array; + } + + /*** + *** @Get image data + ***/ + function get_image_data( $file ){ + + $array['size'] = filesize( $file ); + + $array['image'] = @getimagesize( $file ); + + if ( $array['image'] > 0 ) { + + $array['invalid_image'] = false; + + list($width, $height, $type, $attr) = @getimagesize( $file ); + + $array['width'] = $width; + $array['height'] = $height; + $array['ratio'] = $width / $height; + + $array['extension'] = $this->get_extension_by_mime_type( $array['image']['mime'] ); + + } else { + + $array['invalid_image'] = true; + + } + + return $array; + } + + /*** + *** @Check image upload and handle errors + ***/ + function check_image_upload( $file, $field ) { + $error = null; + + $fileinfo = $this->get_image_data( $file ); + $data = UM()->fields()->get_field( $field ); + + if ( $data == null ) { + $data = apply_filters("um_custom_image_handle_{$field}", '' ); + if ( !$data ) { + $error = __('This media type is not recognized.','ultimate-member'); + } + } + + $data = apply_filters("um_image_handle_global__option", $data ); + $data = apply_filters("um_image_handle_{$field}__option", $data ); + + if ( $fileinfo['invalid_image'] == true ) { + $error = sprintf(__('Your image is invalid or too large!','ultimate-member') ); + } elseif ( isset( $data['allowed_types'] ) && !$this->in_array( $fileinfo['extension'], $data['allowed_types'] ) ) { + $error = ( isset( $data['extension_error'] ) && !empty( $data['extension_error'] ) ) ? $data['extension_error'] : 'not allowed'; + } elseif ( isset($data['min_size']) && ( $fileinfo['size'] < $data['min_size'] ) ) { + $error = $data['min_size_error']; + } elseif ( isset($data['min_width']) && ( $fileinfo['width'] < $data['min_width'] ) ) { + $error = sprintf(__('Your photo is too small. It must be at least %spx wide.','ultimate-member'), $data['min_width']); + } elseif ( isset($data['min_height']) && ( $fileinfo['height'] < $data['min_height'] ) ) { + $error = sprintf(__('Your photo is too small. It must be at least %spx wide.','ultimate-member'), $data['min_height']); + } + + return $error; + } + + /*** + *** @Check file upload and handle errors + ***/ + function check_file_upload( $file, $extension, $field ) { + $error = null; + + $fileinfo = $this->get_file_data( $file ); + $data = UM()->fields()->get_field( $field ); + + if ( !$this->in_array( $extension, $data['allowed_types'] ) ) { + $error = ( isset( $data['extension_error'] ) && !empty( $data['extension_error'] ) ) ? $data['extension_error'] : 'not allowed'; + } elseif ( isset($data['min_size']) && ( $fileinfo['size'] < $data['min_size'] ) ) { + $error = $data['min_size_error']; + } + + return $error; + } + + /*** + *** @If a value exists in comma seperated list + ***/ + function in_array( $value, $array ){ + + if ( in_array( $value, explode(',', $array ) ) ){ + return true; + } + + return false; + } + + /*** + *** @This function will delete file upload from server + ***/ + function delete_file( $src ) { + + if ( strstr( $src, '?' ) ){ + $splitted = explode('?', $src ); + $src = $splitted[0]; + } + + $is_temp = um_is_temp_upload( $src ); + if ( $is_temp ) { + unlink( $is_temp ); + rmdir( dirname( $is_temp ) ); + } else { + wp_die( __('Ultimate Member: Not a valid temp file','ultimate-member') ); + } + } + + /*** + *** @delete a main user photo + ***/ + function delete_core_user_photo( $user_id, $type ) { + + delete_user_meta( $user_id, $type ); + + do_action("um_after_remove_{$type}", $user_id); + + $dir = $this->upload_basedir . $user_id . '/'; + $prefix = $type; + chdir($dir); + $matches = glob($prefix.'*',GLOB_MARK); + + if( is_array($matches) && !empty($matches)) { + foreach($matches as $match) { + if( is_file($dir.$match) ) unlink($dir.$match); + } + } + + if ( count(glob("$dir/*")) === 0) { + rmdir( $dir ); + } + + } + + /*** + *** @resize a local image + ***/ + function resize_image( $file, $crop ) { + + $targ_x1 = $crop[0]; + $targ_y1 = $crop[1]; + $targ_x2 = $crop[2]; + $targ_y2 = $crop[3]; + + + $info = @getimagesize( $file ); + + if ( $info['mime'] == 'image/gif' ){ + + $img_r = imagecreatefromgif( $file ); + $dst_r = imagecreatetruecolor( $targ_x2, $targ_y2 ); + imagecopy( $dst_r, $img_r, 0, 0, $targ_x1, $targ_y1, $targ_x2, $targ_y2 ); + imagegif( $dst_r, $this->path_only( $file ) . basename( $file ) ); + + } else if ( $info['mime'] == 'image/png' ){ + + $img_r = imagecreatefrompng( $file ); + $dst_r = imagecreatetruecolor( $targ_x2, $targ_y2 ); + imagealphablending( $dst_r, false); + imagesavealpha( $dst_r, true); + imagecopy( $dst_r, $img_r, 0, 0, $targ_x1, $targ_y1, $targ_x2, $targ_y2 ); + imagepng( $dst_r, $this->path_only( $file ) . basename( $file ) ); + + }else{ + + $img_r = imagecreatefromjpeg( $file ); + $dst_r = imagecreatetruecolor( $targ_x2, $targ_y2 ); + imagecopy( $dst_r, $img_r, 0, 0, $targ_x1, $targ_y1, $targ_x2, $targ_y2 ); + imagejpeg( $dst_r, $this->path_only( $file ) . basename( $file ), 100 ); + + } + + $split = explode('/ultimatemember/temp/', $file ); + return $this->upload_temp_url . $split[1]; + + } + + /*** + *** @make a user folder for uploads + ***/ + function new_user( $user_id ) { + if ( !file_exists( $this->upload_basedir . $user_id . '/' ) ) { + $old = umask(0); + @mkdir( $this->upload_basedir . $user_id . '/' , 0755, true); + umask($old); + } + } + + /*** + *** @new user upload + ***/ + function new_user_upload( $user_id, $source, $key ) { + + if( ! is_numeric( $user_id ) ){ + wp_die( __("Invalid user ID: ".json_encode( $user_id )." ",'ultimate-member') ); + } + + $user_id = trim( $user_id ); + + // if he does not have uploads dir yet + $this->new_user( $user_id ); + + if ( is_user_logged_in() && ( get_current_user_id() != $user_id ) && ! UM()->roles()->um_user_can( 'can_edit_everyone' ) ) { + wp_die( __( 'Unauthorized to do this attempt.', 'ultimate-member' ) ); + } + + $allow_frontend_image_uploads = apply_filters('um_allow_frontend_image_uploads', false, $user_id, $key ); + + if ( $allow_frontend_image_uploads == false && !is_user_logged_in() && ( $key == 'profile_photo' || $key == 'cover_photo' ) ) { + wp_die( __('Unauthorized to do this attempt.','ultimate-member') ); + } + + $ext = '.' . pathinfo($source, PATHINFO_EXTENSION); + + // copy & overwrite file + + if( in_array( $key , array('profile_photo','cover_photo') ) ){ + $filename = $key . $ext; + $name = $key; + }else{ + $filename = basename( $source ); + } + + + + if ( file_exists( $this->upload_basedir . $user_id . '/' . $filename ) ) { + unlink( $this->upload_basedir . $user_id . '/' . $filename ); + } + copy( $source, $this->upload_basedir . $user_id . '/' . $filename ); + + $info = @getimagesize( $source ); + + // thumbs + if ( $key == 'profile_photo' ) { + + list($w, $h) = @getimagesize( $source ); + + + $sizes = um_get_option('photo_thumb_sizes'); + foreach( $sizes as $size ) { + + $ratio = round( $w / $h, 2 ); + $height = round( $size / $ratio, 2 ); + + if ( file_exists( $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext ) ) { + unlink( $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext ); + } + + if ( $size < $w ) { + + if ( $info['mime'] == 'image/jpeg' ){ + $thumb_s = imagecreatefromjpeg( $source ); + $thumb = imagecreatetruecolor( $size, $size ); + imagecopyresampled( $thumb, $thumb_s, 0, 0, 0, 0, $size, $size, $w, $h ); + imagejpeg( $thumb, $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext, 100); + imagejpeg( $thumb, $this->upload_basedir . $user_id . '/' . $name . $ext, 100); + }else if ( $info['mime'] == 'image/png' ){ + $thumb_s = imagecreatefrompng( $source ); + $thumb = imagecreatetruecolor( $size, $size ); + imagealphablending( $thumb, false); + imagesavealpha( $thumb, true); + imagecopyresampled( $thumb, $thumb_s, 0, 0, 0, 0, $size, $size, $w, $h ); + imagepng( $thumb, $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext ); + }else if ( $info['mime'] == 'image/gif' ){ + $thumb_s = imagecreatefromgif( $source ); + $thumb = imagecreatetruecolor( $size, $size ); + imagecopyresampled( $thumb, $thumb_s, 0, 0, 0, 0, $size, $size, $w, $h ); + imagegif( $thumb, $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext); + imagegif( $thumb, $this->upload_basedir . $user_id . '/' . $name . $ext); + } + } + + } + + // removes a synced profile photo + delete_user_meta( $user_id, 'synced_profile_photo' ); + + }else if ( $key == 'cover_photo' ) { + + list($w, $h) = @getimagesize( $source ); + + $sizes = um_get_option('cover_thumb_sizes'); + foreach( $sizes as $size ) { + + $ratio = round( $w / $h, 2 ); + $height = round( $size / $ratio, 2 ); + + if ( file_exists( $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext ) ) { + unlink( $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext ); + } + + if ( $size < $w ) { + + if ( $info['mime'] == 'image/jpeg' ){ + $thumb = imagecreatetruecolor( $size, $height ); + $thumb_s = imagecreatefromjpeg( $source ); + imagecopyresampled( $thumb, $thumb_s, 0, 0, 0, 0, $size, $height, $w, $h ); + imagejpeg( $thumb, $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext, 100); + }else if ( $info['mime'] == 'image/png' ){ + $thumb_s = imagecreatefrompng( $source ); + $thumb = imagecreatetruecolor( $size, $height ); + imagealphablending( $thumb, false); + imagesavealpha( $thumb, true); + imagecopyresampled( $thumb, $thumb_s, 0, 0, 0, 0, $size, $height, $w, $h ); + imagepng( $thumb, $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext ); + }else if ( $info['mime'] == 'image/gif' ){ + $thumb = imagecreatetruecolor( $size, $height ); + $thumb_s = imagecreatefromgif( $source ); + imagecopyresampled( $thumb, $thumb_s, 0, 0, 0, 0, $size, $height, $w, $h ); + imagegif( $thumb, $this->upload_basedir . $user_id . '/' . $name . '-' . $size . $ext); + } + } + + } + + } + + // clean up temp + $dir = dirname( $source ); + unlink( $source ); + rmdir( $dir ); + + // update user's meta + do_action('um_before_upload_db_meta', $user_id, $key ); + do_action("um_before_upload_db_meta_{$key}", $user_id ); + + update_user_meta( $user_id, $key, $filename ); + + do_action('um_after_upload_db_meta', $user_id, $key ); + do_action("um_after_upload_db_meta_{$key}", $user_id ); + + // the url of upload + return $this->upload_baseurl . $user_id . '/' . $filename; + + } + + /*** + *** @Remove a directory + ***/ + function remove_dir($dir) { + if ( file_exists( $dir ) ) { + foreach(glob($dir . '/*') as $file) { + if(is_dir($file)) $this->remove_dir($file); else unlink($file); + } rmdir($dir); + } + } + + /*** + *** @Format Bytes + ****/ + function format_bytes( $size , $precision = 1 ) { + + $base = log($size, 1024); + $suffixes = array('', 'kb', 'MB', 'GB', 'TB'); + $computed_size = round(pow(1024, $base - floor($base)), $precision); + $unit = $suffixes[ floor($base) ]; + + return $computed_size.' '.$unit; + + } + + } +} \ No newline at end of file diff --git a/includes/core/class-fonticons.php b/includes/core/class-fonticons.php new file mode 100644 index 00000000..96efc8fb --- /dev/null +++ b/includes/core/class-fonticons.php @@ -0,0 +1,43 @@ + $file ) { + + $css = file_get_contents( $file ); + + if ( $c == 'fa' ) { + preg_match_all('/(um-faicon-.*?)\s?\{/', $css, $matches); + } else { + preg_match_all('/(um-icon-.*?)\s?\{/', $css, $matches); + } + + unset( $matches[1][0] ); + foreach ( $matches[1] as $match ) { + $icon = str_replace( ':before', '', $match ); + $array[] = $icon; + } + + } + + update_option( 'um_cache_fonticons', $array ); + } + + $this->all = get_option( 'um_cache_fonticons' ); + + } + + } +} \ No newline at end of file diff --git a/includes/core/class-form.php b/includes/core/class-form.php new file mode 100644 index 00000000..0cab2263 --- /dev/null +++ b/includes/core/class-form.php @@ -0,0 +1,342 @@ +post_form = null; + + $this->form_suffix = null; + + $this->errors = null; + + $this->processing = null; + + add_action('template_redirect', array(&$this, 'form_init'), 2); + + add_action('init', array(&$this, 'field_declare'), 10); + + } + + + function ajax_muted_action() { + extract( $_REQUEST ); + + if ( ! UM()->roles()->um_current_user_can( 'edit', $user_id ) ) + die( __( 'You can not edit this user' ) ); + + switch( $hook ) { + default: + do_action( "um_run_ajax_function__{$hook}", $_REQUEST ); + break; + } + } + + + function ajax_select_options() { + + $arr_options = array(); + $arr_options['status'] = 'success'; + $arr_options['post'] = $_POST; + + UM()->fields()->set_id = intval( $_POST['form_id'] ); + UM()->fields()->set_mode = 'profile'; + $form_fields = UM()->fields()->get_fields(); + $arr_options['fields'] = $form_fields; + + $debug = apply_filters('um_ajax_select_options__debug_mode', false ); + if( $debug ){ + $arr_options['debug'] = array( + $_POST, + $form_fields, + ); + } + + if( isset( $_POST['child_callback'] ) && ! empty( $_POST['child_callback'] ) && isset( $form_fields[ $_POST['child_name'] ] ) ){ + + $ajax_source_func = $_POST['child_callback']; + + // If the requested callback function is added in the form or added in the field option, execute it with call_user_func. + if( isset( $form_fields[ $_POST['child_name'] ]['custom_dropdown_options_source'] ) && + ! empty( $form_fields[ $_POST['child_name'] ]['custom_dropdown_options_source'] ) && + $form_fields[ $_POST['child_name'] ]['custom_dropdown_options_source'] == $ajax_source_func ){ + + $arr_options['field'] = $form_fields[ $_POST['child_name'] ]; + if( function_exists( $ajax_source_func ) ){ + $arr_options['items'] = call_user_func( $ajax_source_func ); + } + + }else{ + $arr_options['status'] = 'error'; + $arr_options['message'] = __( 'This is not possible for security reasons.','ultimate-member'); + } + + } + + wp_send_json( $arr_options ); + } + + + /** + * Count the form errors. + * @return integer + */ + function count_errors() { + $errors = $this->errors; + + if( $errors && is_array( $errors ) ) { + return count( $errors ); + } + + return 0; + } + + + /** + * Appends field errors + * @param string $key + * @param string $error + */ + function add_error( $key, $error ) { + if ( ! isset( $this->errors[ $key ] ) ){ + + $error = apply_filters('um_submit_form_error', $error , $key ); + + $this->errors[ $key ] = $error; + } + } + + + /** + * If a form has errors + * @param string $key + * @return boolean + */ + function has_error( $key ) { + if ( isset($this->errors[$key]) ) + return true; + return false; + } + + + /** + * Declare all fields + */ + function field_declare(){ + if ( isset( UM()->builtin()->custom_fields ) ) { + $this->all_fields = UM()->builtin()->custom_fields; + } else { + $this->all_fields = null; + } + } + + + /** + * Validate form + */ + function form_init() { + if ( isset( $_SERVER['REQUEST_METHOD'] ) ) { + $http_post = ('POST' == $_SERVER['REQUEST_METHOD']); + } else { + $http_post = 'POST'; + } + + if ( $http_post && ! is_admin() && isset( $_POST['form_id'] ) && is_numeric( $_POST['form_id'] ) ) { + + do_action( "um_before_submit_form_post", $_POST ); + + $this->form_id = $_POST['form_id']; + $this->form_status = get_post_status( $this->form_id ); + + + if ( $this->form_status == 'publish' ) { + + /* save entire form as global */ + $this->post_form = apply_filters('um_submit_post_form' ,$_POST ); + + $this->post_form = $this->beautify( $this->post_form ); + + $this->form_data = UM()->query()->post_data( $this->form_id ); + + $this->post_form['submitted'] = $this->post_form; + + $this->post_form = array_merge( $this->form_data, $this->post_form ); + + + if( isset( $this->form_data['custom_fields'] ) && strstr( $this->form_data['custom_fields'], 'role_' ) ){ // Secure selected role + + $custom_field_roles = $this->custom_field_roles( $this->form_data['custom_fields'] ); + + if( ! empty( $_POST['role'] ) ){ + $role = $_POST['role']; + + if( is_array( $_POST['role'] ) ){ + $role = current( $_POST['role'] ); + } + + if ( isset( $custom_field_roles ) && is_array( $custom_field_roles ) && ! empty( $role ) && ! in_array( $role , $custom_field_roles ) ) { + wp_die( __( 'This is not possible for security reasons.','ultimate-member') ); + } + + $this->post_form['role'] = $role; + $this->post_form['submitted']['role'] = $role; + } + + + + } elseif ( isset( $this->post_form['mode'] ) && $this->post_form['mode'] == 'register' ) { + $role = $this->assigned_role( $this->form_id ); + $this->post_form['role'] = $role; + $this->post_form['submitted']['role'] = $role; + } + + if ( isset( $_POST[ UM()->honeypot ] ) && $_POST[ UM()->honeypot ] != '' ){ + wp_die( 'Hello, spam bot!', 'ultimate-member' ); + } + + if ( ! in_array( $this->form_data['mode'], array( 'login' ) ) ) { + + $form_timestamp = trim($_POST['timestamp']); + $live_timestamp = current_time( 'timestamp' ); + + if ( $form_timestamp == '' && um_get_option('enable_timebot') == 1 ) + wp_die( __('Hello, spam bot!','ultimate-member') ); + + if ( !current_user_can('manage_options') && $live_timestamp - $form_timestamp < 6 && um_get_option('enable_timebot') == 1 ) + wp_die( __('Whoa, slow down! You\'re seeing this message because you tried to submit a form too fast and we think you might be a spam bot. If you are a real human being please wait a few seconds before submitting the form. Thanks!','ultimate-member') ); + + } + + $this->post_form = apply_filters( 'um_submit_form_data', $this->post_form, $this->post_form['mode'] ); + + /* Continue based on form mode - pre-validation */ + + do_action( 'um_submit_form_errors_hook', $this->post_form ); + + do_action( "um_submit_form_{$this->post_form['mode']}", $this->post_form ); + + } + + } + + } + + + /** + * Beautify form data + * @param array $form + * @return array $form + */ + function beautify( $form ){ + + if (isset($form['form_id'])){ + + $this->form_suffix = '-' . $form['form_id']; + + $this->processing = $form['form_id']; + + foreach( $form as $key => $value ){ + if ( strstr( $key, $this->form_suffix ) ) { + $a_key = str_replace( $this->form_suffix, '', $key ); + $form[ $a_key ] = $value; + unset( $form[ $key ] ); + } + } + + } + + return $form; + } + + + /** + * Display form type as Title + * @param string $mode + * @param integer $post_id + * @return string $output + */ + function display_form_type( $mode, $post_id ){ + $output = null; + switch( $mode ){ + case 'login': + $output = 'Login'; + break; + case 'profile': + $output = 'Profile'; + break; + case 'register': + $output = 'Register'; + break; + } + return $output; + } + + /** + * Assigned roles to a form + * @param integer $post_id + * @return string $role + */ + function assigned_role( $post_id ){ + + $mode = $this->form_type( $post_id ); + $use_globals = get_post_meta( $post_id, "_um_{$mode}_use_globals", true); + + $global_role = get_option('default_role'); // Form Global settings + + if ( $use_globals == 0 ) { // Non-Global settings + $role = get_post_meta( $post_id, "_um_{$mode}_role", true ); + } + + if ( empty( $role ) ) { // custom role is default, return default role's slug + $role = $global_role; + } + + return $role; + + } + + /** + * Get form type + * @param integer $post_id + * @return string + */ + function form_type( $post_id ){ + + $mode = get_post_meta( $post_id, '_um_mode', true ); + + return $mode; + } + + /** + * Get custom field roles + * @param string $custom_fields serialized + * @return bool|array roles + */ + function custom_field_roles( $custom_fields ) { + + $fields = maybe_unserialize( $custom_fields ); + + if ( ! is_array( $fields ) ) + return false; + + foreach ( $fields as $field_key => $field_settings ) { + + if ( strstr( $field_key , 'role_' ) ) { + if ( is_array( $field_settings['options'] ) ) { + return array_keys( $field_settings['options'] ); + } + } + + } + + return false; + } + } +} \ No newline at end of file diff --git a/includes/core/class-login.php b/includes/core/class-login.php new file mode 100644 index 00000000..a810a4b2 --- /dev/null +++ b/includes/core/class-login.php @@ -0,0 +1,13 @@ +config()->permalinks['logout']; + $has_translation = false; + $trid = 0; + $not_default_lang = false; + + if ( is_home() /*|| is_front_page()*/ ) { + return; + } + + if ( function_exists('icl_object_id') || function_exists('icl_get_current_language') ) { + + if( function_exists('icl_get_current_language') ){ + $language_code = icl_get_current_language(); + }else if( function_exists('icl_object_id') && defined('ICL_LANGUAGE_CODE') ){ // checks if WPML exists + $language_code = ICL_LANGUAGE_CODE; + } + + $has_translation = true; + + if( function_exists('icl_object_id') && defined('ICL_LANGUAGE_CODE') && isset( $sitepress ) ){ // checks if WPML exists + $trid = $sitepress->get_element_trid( $current_page_ID ); + } + + if( icl_get_default_language() !== $language_code ){ + $not_default_lang = true; + }else{ + $language_code = ''; + } + + } + + + + if ( um_is_core_page('logout') || ( $trid > 0 && $has_translation && $trid == $logout_page_id && $not_default_lang ) ) { + + if ( is_user_logged_in() ) { + + if ( isset( $_REQUEST['redirect_to'] ) && $_REQUEST['redirect_to'] !== '' ) { + wp_logout(); + session_unset(); + exit( wp_redirect( $_REQUEST['redirect_to'] ) ); + } else if ( um_user('after_logout') == 'redirect_home' ) { + wp_logout(); + session_unset(); + exit( wp_redirect( home_url( $language_code ) ) ); + } else { + wp_logout(); + session_unset(); + exit( wp_redirect( um_user('logout_redirect_url') ) ); + + } + + } else { + exit( wp_redirect( home_url( $language_code ) ) ); + } + + } + + } + + } +} \ No newline at end of file diff --git a/includes/core/class-mail.php b/includes/core/class-mail.php new file mode 100644 index 00000000..87e6d6c1 --- /dev/null +++ b/includes/core/class-mail.php @@ -0,0 +1,131 @@ +force_plain_text = ''; + + } + + /*** + *** @mandrill compatibility + ***/ + function mandrill_nl2br($nl2br, $message = '') { + + // text emails + if ( !um_get_option('email_html') ) { + $nl2br = true; + } + + return $nl2br; + + } + + /*** + *** @check If template exists + ***/ + function email_template( $template, $args = array() ) { + $lang = ''; + $template_path = false; + + if ( function_exists('icl_get_current_language') ) { + if ( icl_get_current_language() != 'en' ) { + $lang = icl_get_current_language() . '/'; + } + } else { + + $lang = get_locale(); + $arr_english_lang = array('en','en_US','en_NZ','en_ZA','en_AU','en_GB'); + + if( in_array( $lang, $arr_english_lang ) || strpos( $lang , 'en_' ) > -1 || empty( $lang ) || $lang == 0 ){ + $lang = ''; + } else { + $lang .= '/'; + } + + } + + if ( file_exists( get_stylesheet_directory() . '/ultimate-member/templates/email/' . $lang . $template . '.html' ) ) { + $template_path = get_stylesheet_directory() . '/ultimate-member/templates/email/' . $lang . $template . '.html'; + } else { + if ( isset( $args['path'] ) ) { + $path = $args['path'] . $lang; + } else { + $path = um_path . 'templates/email/' . $lang; + } + + if ( file_exists( $path . $template . '.html' ) ) { + $template_path = $path . $template . '.html'; + } + } + + return apply_filters( 'um_email_template_path', $template_path, $template, $args ); + + } + + /*** + *** @sends an email to any user + ***/ + function send( $email, $template=null, $args = array() ) { + + if ( !$template ) return; + if ( um_get_option( $template . '_on' ) != 1 ) return; + if ( !is_email( $email ) ) return; + + $this->attachments = null; + $this->headers = 'From: '. um_get_option('mail_from') .' <'. um_get_option('mail_from_addr') .'>' . "\r\n"; + + $this->subject = um_get_option( $template . '_sub' ); + $this->subject = um_convert_tags( $this->subject, $args ); + + if ( isset( $args['admin'] ) || isset( $args['plain_text'] ) ) { + $this->force_plain_text = 'forced'; + } + + + add_filter( 'wp_mail_content_type', array(&$this, 'set_content_type') ); + // HTML e-mail or text + if ( um_get_option('email_html') && $this->email_template( $template, $args ) ) { + $this->message = file_get_contents( $this->email_template( $template, $args ) ); + } else { + $this->message = um_get_option( $template ); + } + + // Convert tags in body + $this->message = um_convert_tags( $this->message, $args ); + + // Send mail + wp_mail( $email, $this->subject, $this->message, $this->headers, $this->attachments ); + remove_filter( 'wp_mail_content_type', array(&$this, 'set_content_type') ); + + // reset globals + $this->force_plain_text = ''; + + } + + /*** + *** @maybe sending HTML emails + ***/ + function set_content_type( $content_type ) { + return 'text/html'; + + /*if ( $this->force_plain_text == 'forced' ) + return 'text/plain'; + + if ( um_get_option( 'email_html' ) ) + return 'text/html'; + + return 'text/plain';*/ + } + + + } +} \ No newline at end of file diff --git a/includes/core/class-members.php b/includes/core/class-members.php new file mode 100644 index 00000000..f8752272 --- /dev/null +++ b/includes/core/class-members.php @@ -0,0 +1,376 @@ +core_search_fields = array( + 'user_login', + 'username', + 'display_name', + 'user_email', + ); + + add_filter( 'um_search_select_fields', array(&$this, 'um_search_select_fields'), 10, 1 ); + + } + + /*** + *** @user_search_columns + ***/ + function user_search_columns( $search_columns ){ + if ( is_admin() ) { + $search_columns[] = 'display_name'; + } + return $search_columns; + } + + /*** + *** @Members page allowed? + ***/ + function access_members() { + + if ( um_get_option('members_page') == 0 && um_is_core_page('members') ) { + um_redirect_home(); + } + + } + + /*** + *** @tag conversion for member directory + ***/ + function convert_tags( $string, $array ) { + + $search = array( + '{total_users}', + ); + + $replace = array( + $array['total_users'], + ); + + $string = str_replace($search, $replace, $string); + return $string; + } + + /*** + *** @show filter + ***/ + function show_filter( $filter ) { + $fields = UM()->builtin()->all_user_fields; + + if ( isset( $fields[ $filter ] ) ) { + $attrs = $fields[ $filter ]; + } else { + $attrs = apply_filters("um_custom_search_field_{$filter}", array() ); + } + + // additional filter for search field attributes + $attrs = apply_filters("um_search_field_{$filter}", $attrs); + + if ( UM()->builtin()->is_dropdown_field( $filter, $attrs ) ) { + $type = 'select'; + } else if ( 'user_tags' == $attrs['type'] ) { + $attrs['options'] = apply_filters('um_multiselect_options_user_tags', array(), $attrs); + $attrs['custom'] = 1; + $type = 'select'; + } else { + $type = 'text'; + } + + // filter all search fields + $attrs = apply_filters( 'um_search_fields', $attrs ); + + if ( $type == 'select' ) + $attrs = apply_filters( 'um_search_select_fields', $attrs ); + + switch ( $type ) { + + case 'select': + + ?> + + + + + + + + shortcodes()->form_id, '_um_roles', true ); + $um_roles = UM()->roles()->get_roles( false ); + + if( ! empty( $shortcode_roles ) && is_array( $shortcode_roles ) ){ + + $attrs['options'] = array(); + + foreach ( $um_roles as $key => $value ) { + if ( in_array( $key, $shortcode_roles ) ) { + $attrs['options'][ $key ] = $value; + } + } + + } + + } + + return $attrs; + } + + + + + /*** + *** @Generate a loop of results + ***/ + function get_members( $args ) { + + global $wpdb, $post; + + extract($args); + + $query_args = array(); + $query_args = apply_filters( 'um_prepare_user_query_args', $query_args, $args ); + + // Prepare for BIG SELECT query + $wpdb->query('SET SQL_BIG_SELECTS=1'); + + // number of profiles for mobile + if ( UM()->mobile()->isMobile() && isset( $profiles_per_page_mobile ) ){ + $profiles_per_page = $profiles_per_page_mobile; + } + + $query_args['number'] = $profiles_per_page; + + if( isset( $args['number'] ) ){ + $query_args['number'] = $args['number']; + } + + if( isset( $args['page'] ) ){ + $members_page = $args['page']; + }else{ + $members_page = isset( $_REQUEST['members_page'] ) ? $_REQUEST['members_page'] : 1; + } + + $query_args['paged'] = $members_page; + + if ( ! um_user( 'can_view_all' ) && is_user_logged_in() ) { + //unset( $query_args ); + $query_args = array(); + } + + do_action('um_user_before_query', $query_args ); + + $users = new \WP_User_Query( $query_args ); + + do_action('um_user_after_query', $query_args, $users ); + + + $array['users'] = isset( $users->results ) && ! empty( $users->results ) ? array_unique( $users->results ) : array(); + + $array['total_users'] = (isset( $max_users ) && $max_users && $max_users <= $users->total_users ) ? $max_users : $users->total_users; + + $array['page'] = $members_page; + + $array['total_pages'] = ceil( $array['total_users'] / $profiles_per_page ); + + $array['header'] = $this->convert_tags( $header, $array ); + $array['header_single'] = $this->convert_tags( $header_single, $array ); + + $array['users_per_page'] = $array['users']; + + for( $i = $array['page']; $i <= $array['page'] + 2; $i++ ) { + if ( $i <= $array['total_pages'] ) { + $pages_to_show[] = $i; + } + } + + if ( isset( $pages_to_show ) && count( $pages_to_show ) < 5 ) { + $pages_needed = 5 - count( $pages_to_show ); + + for ( $c = $array['page']; $c >= $array['page'] - 2; $c-- ) { + if ( !in_array( $c, $pages_to_show ) && $c > 0 ) { + $pages_to_add[] = $c; + } + } + } + + if ( isset( $pages_to_add ) ) { + + asort( $pages_to_add ); + $pages_to_show = array_merge( (array)$pages_to_add, $pages_to_show ); + + if ( count( $pages_to_show ) < 5 ) { + if ( max($pages_to_show) - $array['page'] >= 2 ) { + $pages_to_show[] = max($pages_to_show) + 1; + if ( count( $pages_to_show ) < 5 ) { + $pages_to_show[] = max($pages_to_show) + 1; + } + } else if ( $array['page'] - min($pages_to_show) >= 2 ) { + $pages_to_show[] = min($pages_to_show) - 1; + if ( count( $pages_to_show ) < 5 ) { + $pages_to_show[] = min($pages_to_show) - 1; + } + } + } + + asort( $pages_to_show ); + + $array['pages_to_show'] = $pages_to_show; + + } else { + + if ( isset( $pages_to_show ) && count( $pages_to_show ) < 5 ) { + if ( max($pages_to_show) - $array['page'] >= 2 ) { + $pages_to_show[] = max($pages_to_show) + 1; + if ( count( $pages_to_show ) < 5 ) { + $pages_to_show[] = max($pages_to_show) + 1; + } + } else if ( $array['page'] - min($pages_to_show) >= 2 ) { + $pages_to_show[] = min($pages_to_show) - 1; + if ( count( $pages_to_show ) < 5 ) { + $pages_to_show[] = min($pages_to_show) - 1; + } + } + } + + if ( isset( $pages_to_show ) && is_array( $pages_to_show ) ) { + + asort( $pages_to_show ); + + $array['pages_to_show'] = $pages_to_show; + + } + + } + + if ( isset( $array['pages_to_show'] ) ) { + + if ( $array['total_pages'] < count( $array['pages_to_show'] ) ) { + foreach( $array['pages_to_show'] as $k => $v ) { + if ( $v > $array['total_pages'] ) unset( $array['pages_to_show'][$k] ); + } + } + + foreach( $array['pages_to_show'] as $k => $v ) { + if ( (int)$v <= 0 ) { + unset( $array['pages_to_show'][$k] ); + } + } + + } + + return apply_filters('um_prepare_user_results_array', $array ); + + } + + + /** + * Optimizes Member directory with multiple LEFT JOINs + * @param object $vars + * @return object $var + */ + public function um_optimize_member_query( $vars ) { + + global $wpdb; + + $arr_where = explode("\n", $vars->query_where ); + $arr_left_join = explode("LEFT JOIN", $vars->query_from ); + $arr_user_photo_key = array('synced_profile_photo','profile_photo','synced_gravatar_hashed_id'); + + foreach ( $arr_where as $where ) { + + foreach( $arr_user_photo_key as $key ){ + + if( strpos( $where , "'".$key."'" ) > -1 ){ + + // find usermeta key + preg_match("#mt[0-9]+.#", $where, $meta_key ); + + // remove period from found meta_key + $meta_key = str_replace(".","", current( $meta_key ) ); + + // remove matched LEFT JOIN clause + $vars->query_from = str_replace('LEFT JOIN wp_usermeta AS '.$meta_key.' ON ( wp_users.ID = '.$meta_key.'.user_id )', '', $vars->query_from ); + + // prepare EXISTS replacement for LEFT JOIN clauses + $where_exists = 'um_exist EXISTS( SELECT '.$wpdb->usermeta.'.umeta_id FROM '.$wpdb->usermeta.' WHERE '.$wpdb->usermeta.'.user_id = '.$wpdb->users.'.ID AND '.$wpdb->usermeta.'.meta_key IN("'.implode('","', $arr_user_photo_key ).'") AND '.$wpdb->usermeta.'.meta_value != "" )'; + + // Replace LEFT JOIN clauses with EXISTS and remove duplicates + if( strpos( $vars->query_where, 'um_exist' ) === FALSE ){ + $vars->query_where = str_replace( $where , $where_exists, $vars->query_where ); + }else{ + $vars->query_where = str_replace( $where , '1=0', $vars->query_where ); + } + } + + } + + } + + $vars->query_where = str_replace("\n", "", $vars->query_where ); + $vars->query_where = str_replace("um_exist", "", $vars->query_where ); + + return $vars; + + } + + + } +} \ No newline at end of file diff --git a/includes/core/class-menu.php b/includes/core/class-menu.php new file mode 100644 index 00000000..53870113 --- /dev/null +++ b/includes/core/class-menu.php @@ -0,0 +1,39 @@ + + +
            +
            +
            +
              + $v ) { ?> + +
            • + + +
            +
            +
            + + user()->profile['reset_pass_hash_token'] = current_time( 'timestamp' ); + UM()->user()->update_usermeta_info('reset_pass_hash_token'); + + $this->change_password = true; + + um_reset_user(); + + } + + } + + /*** + *** @reset url + ***/ + function reset_url(){ + if ( !um_user('reset_pass_hash') ) return false; + + $user_id = um_user('ID'); + + delete_option( "um_cache_userdata_{$user_id}" ); + + $url = add_query_arg( 'act', 'reset_password', um_get_core_page('password-reset') ); + $url = add_query_arg( 'hash', esc_attr( um_user('reset_pass_hash') ), $url ); + $url = add_query_arg( 'user_id', esc_attr( um_user('ID') ), $url ); + + return $url; + + } + + /*** + *** @we are on password reset page + ***/ + function password_reset(){ + if ( um_is_core_page('password-reset') ) { + + UM()->fields()->set_mode = 'password'; + + } + + } + + /*** + *** @password page form + ***/ + function form_init() { + if ( um_requesting_password_reset() ) { + + UM()->form()->post_form = $_POST; + + do_action('um_reset_password_errors_hook', UM()->form()->post_form ); + + if ( !isset( UM()->form()->errors) ) { + + do_action('um_reset_password_process_hook', UM()->form()->post_form ); + + } + + } + + if ( um_requesting_password_change() ) { + + UM()->form()->post_form = $_POST; + + do_action('um_change_password_errors_hook', UM()->form()->post_form ); + + if ( !isset( UM()->form()->errors ) ) { + + do_action('um_change_password_process_hook', UM()->form()->post_form ); + + } + + } + + } + + /*** + *** @Add class based on shortcode + ***/ + function get_class( $mode ){ + + $classes = 'um-'.$mode; + + if ( is_admin() ) { + $classes .= ' um-in-admin'; + } + + if ( UM()->fields()->editing == true ) { + $classes .= ' um-editing'; + } + + if ( UM()->fields()->viewing == true ) { + $classes .= ' um-viewing'; + } + + $classes = apply_filters('um_form_official_classes__hook', $classes); + return $classes; + } + + /*** + *** @Shortcode + ***/ + function ultimatemember_password( $args = array() ) { + return $this->load( $args ); + } + + /*** + *** @Load a module with global function + ***/ + function load( $args ) { + + ob_start(); + + $defaults = array( + 'template' => 'password-reset', + 'mode' => 'password', + 'form_id' => 'um_password_id', + 'max_width' => '450px', + 'align' => 'center', + ); + $args = wp_parse_args( $args, $defaults ); + + if ( isset( $args['use_globals'] ) && $args['use_globals'] == 1 ) { + $args = array_merge( $args, $this->get_css_args( $args ) ); + } else { + $args = array_merge( $this->get_css_args( $args ), $args ); + } + + $args = apply_filters('um_reset_password_shortcode_args_filter', $args); + + if ( isset( $this->change_password ) ) { + + $args['user_id'] = $_REQUEST['user_id']; + $args['template'] = 'password-change'; + + } + + extract( $args, EXTR_SKIP ); + + do_action("um_pre_{$mode}_shortcode", $args); + + do_action("um_before_form_is_loaded", $args); + + do_action("um_before_{$mode}_form_is_loaded", $args); + + $this->template_load( $template, $args ); + + if ( !is_admin() && !defined( 'DOING_AJAX' ) ) { + $this->dynamic_css( $args ); + } + + $output = ob_get_contents(); + ob_end_clean(); + return $output; + + } + + /*** + *** @Get dynamic css args + ***/ + function get_css_args( $args ) { + $arr = um_styling_defaults( $args['mode'] ); + $arr = array_merge( $arr, array( 'form_id' => $args['form_id'], 'mode' => $args['mode'] ) ); + return $arr; + } + + /*** + *** @Load dynamic css + ***/ + function dynamic_css( $args=array() ) { + extract($args); + $global = um_path . 'assets/dynamic_css/dynamic_global.php'; + $file = um_path . 'assets/dynamic_css/dynamic_'.$mode.'.php'; + include $global; + if ( file_exists( $file ) ) + include $file; + } + + /*** + *** @Loads a template file + ***/ + function template_load( $template, $args=array() ) { + if ( is_array( $args ) ) { + UM()->shortcodes()->set_args = $args; + } + UM()->shortcodes()->load_template( $template ); + } + + } +} \ No newline at end of file diff --git a/includes/core/class-permalinks.php b/includes/core/class-permalinks.php new file mode 100644 index 00000000..04c3651d --- /dev/null +++ b/includes/core/class-permalinks.php @@ -0,0 +1,511 @@ +current_url = $this->get_current_url(); + + add_action( 'init', array( &$this, 'check_for_querystrings' ), 1 ); + + add_action( 'init', array( &$this, 'activate_account_via_email_link' ), 1 ); + + add_action( 'um_user_after_updating_profile', array( &$this, 'profile_url' ), 1 ); + + remove_action( 'wp_head', 'rel_canonical' ); + + add_action( 'wp_head', array( &$this, 'um_rel_canonical_' ), 9 ); + } + + + + /*** + *** @SEO canonical href bugfix + ***/ + function um_rel_canonical_() { + global $wp_the_query; + + if ( !is_singular() ) + return; + + $enable_canonical = apply_filters("um_allow_canonical__filter", true ); + + if( ! $enable_canonical ) + return; + + if ( !$id = $wp_the_query->get_queried_object_id() ) + return; + + if( UM()->config()->permalinks['user'] == $id ) { + $link = $this->get_current_url(); + echo "\n"; + return; + } + + $link = get_permalink( $id ); + if ( $page = get_query_var('cpage') ){ + $link = get_comments_pagenum_link( $page ); + echo "\n"; + } + + } + + /*** + *** @Get query as array + ***/ + function get_query_array() { + $parts = parse_url( $this->get_current_url() ); + if ( isset( $parts['query'] ) ) { + parse_str($parts['query'], $query); + return $query; + } + } + + /*** + *** @Get current URL anywhere + ***/ + function get_current_url( $no_query_params = false ) { + global $post; + + $um_get_option = get_option('um_options'); + + $server_name_method = isset( $um_get_option['current_url_method'] ) ? $um_get_option['current_url_method'] : 'SERVER_NAME'; + + $um_port_forwarding_url = ( isset( $um_get_option['um_port_forwarding_url'] ) ) ? $um_get_option['um_port_forwarding_url']: ''; + + if ( is_multisite() ) { + + $page_url = ''; + $blog_id = get_current_blog_id(); + $siteurl = get_site_url( $blog_id ); + + /*if ( is_front_page() ) { + $page_url = $siteurl; + + if( isset( $_SERVER['QUERY_STRING'] ) && trim( $_SERVER['QUERY_STRING'] ) ) { + $page_url .= '?' . $_SERVER['QUERY_STRING']; + } + } else {*/ + + $network_permalink_structure = um_get_option("network_permalink_structure"); + + if( $network_permalink_structure == "sub-directory" ){ + + $page_url = 'http'; + + if ( isset( $_SERVER["HTTPS"] ) && $_SERVER["HTTPS"] == "on" ) { + $page_url .= "s"; + } + + $page_url .= "://"; + + $page_url .= $_SERVER[ $server_name_method ]; + }else{ + $page_url .= $siteurl; + } + + if ( $um_port_forwarding_url == 1 && isset( $_SERVER["SERVER_PORT"] ) ) { + $page_url .= ":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; + + } else { + $page_url .= $_SERVER["REQUEST_URI"]; + } + + //} + + + }else{ + if ( !isset( $_SERVER['SERVER_NAME'] ) ) + return ''; + + /*if ( is_front_page() ) { + $page_url = home_url(); + + if( isset( $_SERVER['QUERY_STRING'] ) && trim( $_SERVER['QUERY_STRING'] ) ) { + $page_url .= '?' . $_SERVER['QUERY_STRING']; + } + } else {*/ + $page_url = 'http'; + + if ( isset( $_SERVER["HTTPS"] ) && $_SERVER["HTTPS"] == "on" ) { + $page_url .= "s"; + } + $page_url .= "://"; + + if ( $um_port_forwarding_url == 1 && isset( $_SERVER["SERVER_PORT"] ) ) { + $page_url .= $_SERVER[ $server_name_method ].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; + + } else { + $page_url .= $_SERVER[ $server_name_method ].$_SERVER["REQUEST_URI"]; + } + + //} + + + } + + if ( $no_query_params == true ) { + $page_url = strtok( $page_url, '?' ); + } + + return apply_filters( 'um_get_current_page_url', $page_url ); + } + + /*** + *** @activates an account via email + ***/ + function activate_account_via_email_link(){ + if ( isset($_REQUEST['act']) && $_REQUEST['act'] == 'activate_via_email' && isset($_REQUEST['hash']) && is_string($_REQUEST['hash']) && strlen($_REQUEST['hash']) == 40 && + isset($_REQUEST['user_id']) && is_numeric($_REQUEST['user_id']) ) { // valid token + + $user_id = absint( $_REQUEST['user_id'] ); + delete_option( "um_cache_userdata_{$user_id}" ); + + um_fetch_user( $user_id ); + + if ( strtolower($_REQUEST['hash']) !== strtolower( um_user('account_secret_hash') ) ) + wp_die( __( 'This activation link is expired or have already been used.','ultimate-member' ) ); + + UM()->user()->approve(); + $redirect = ( um_user('url_email_activate') ) ? um_user('url_email_activate') : um_get_core_page('login', 'account_active'); + $login = (bool) um_user('login_email_activate'); + + // log in automatically + if ( !is_user_logged_in() && $login ) { + $user = get_userdata($user_id); + $user_id = $user->ID; + + // update wp user + wp_set_current_user( $user_id, $user->user_login ); + wp_set_auth_cookie( $user_id ); + + ob_start(); + do_action( 'wp_login', $user->user_login, $user ); + ob_end_clean(); + } + + um_reset_user(); + + do_action('um_after_email_confirmation', $user_id ); + + exit( wp_redirect( $redirect ) ); + + } + + } + + /*** + *** @makes an activate link for any user + ***/ + function activate_url(){ + if ( !um_user('account_secret_hash') ) return false; + $url = apply_filters( 'um_activate_url', home_url() ); + $url = add_query_arg( 'act', 'activate_via_email', $url ); + $url = add_query_arg( 'hash', um_user('account_secret_hash'), $url ); + $url = add_query_arg( 'user_id', um_user('ID'), $url ); + + return $url; + } + + /*** + *** @checks for UM query strings + ***/ + function check_for_querystrings(){ + if ( isset($_REQUEST['message']) ) + UM()->shortcodes()->message_mode = true; + } + + /*** + *** @add a query param to url + ***/ + function add_query( $key, $value ) { + $this->current_url = add_query_arg( $key, $value, $this->get_current_url() ); + return $this->current_url; + } + /*** + *** @remove a query param from url + ***/ + function remove_query( $key, $value ) { + $this->current_url = remove_query_arg( $key, $this->current_url ); + return $this->current_url; + } + + /*** + *** @get profile url for set user + ***/ + function profile_url( $update_slug = false ) { + // Permalink base + $permalink_base = um_get_option('permalink_base'); + + // Get user slug + $profile_slug = get_user_meta( um_user('ID'), "um_user_profile_url_slug_{$permalink_base}", true ); + $generate_slug = um_get_option('um_generate_slug_in_directory'); + + // Return existing profile slug + if( $generate_slug && $update_slug == false && $profile_slug ){ + return $this->profile_permalink( $profile_slug ); + } + + // Reset cache + if( $update_slug == true ){ + + $user_id = um_user('ID'); + + delete_option( "um_cache_userdata_{$user_id}" ); + + um_fetch_user( $user_id ); + + } + + // Username + if ( $permalink_base == 'user_login' ) { + $user_in_url = um_user('user_login'); + + if ( is_email( $user_in_url ) ) { + $user_email = $user_in_url; + $user_in_url = str_replace('@','',$user_in_url); + + if( ( $pos = strrpos( $user_in_url , '.' ) ) !== false ) { + $search_length = strlen( '.' ); + $user_in_url = substr_replace( $user_in_url , '-' , $pos , $search_length ); + } + update_user_meta( um_user('ID') , "um_email_as_username_{$user_in_url}" , $user_email ); + + } else { + + $user_in_url = sanitize_title( $user_in_url ); + + } + + } + + // User ID + if ( $permalink_base == 'user_id' ) { + $user_in_url = um_user('ID'); + } + + // Fisrt and Last name + $full_name_permalinks = array( 'name', 'name_dash', 'name_plus' ); + if( in_array( $permalink_base, $full_name_permalinks ) ) + { + $opt_display_name = um_get_option('display_name'); + $first_name = um_user( 'first_name' ); + $last_name = um_user( 'last_name' ); + $full_name = um_user( 'display_name' ); + $full_name = preg_replace('/\s+/', ' ', $full_name); // Remove double spaces + + $profile_slug = $this->profile_slug( $full_name, $first_name, $last_name ); + + $duplicate_slug_hash = md5( $profile_slug ); + + $args = array( + 'meta_query' => array( + 'relation' => 'AND', + array( + 'key' => "um_user_profile_url_slug_{$permalink_base}", + 'value' => $profile_slug, + 'compare' => '=' + ), + ), + 'orderby' => 'registered', + 'order' => 'ASC', + 'fields' => array('user_registered','ID'), + ); + + $user_query = new \WP_User_Query( $args ); + + if( $user_query->total_users > 1 ){ + + $duplicate_names = $user_query->get_results(); + + $current = end( $duplicate_names ); + + update_option("um_duplicate_name_{$duplicate_slug_hash}", $current->ID ); + + } + + $duplicate_id = get_option("um_duplicate_name_{$duplicate_slug_hash}"); + + if( ! empty( $duplicate_id ) && $duplicate_id != um_user('ID') ){ + $full_name = $full_name.' ' . um_user( 'ID' ); + } + + $user_in_url = $this->profile_slug( $full_name, $first_name, $last_name ); + + } + + update_user_meta( um_user('ID'), "um_user_profile_url_slug_{$permalink_base}", $user_in_url ); + + $profile_url = $this->profile_permalink( $user_in_url ); + + return $profile_url; + } + + /** + * Get Profile Permalink + * @param string $slug + * @return string $profile_url + */ + function profile_permalink( $slug ) { + + $page_id = UM()->config()->permalinks['user']; + $profile_url = get_permalink( $page_id ); + + $profile_url = apply_filters('um_localize_permalink_filter', UM()->config()->permalinks, $page_id, $profile_url ); + + if ( get_option('permalink_structure') ) { + + $profile_url = trailingslashit( untrailingslashit( $profile_url ) ); + $profile_url = $profile_url . strtolower( $slug ). '/'; + + } else { + + $profile_url = add_query_arg( 'um_user', $slug, $profile_url ); + + } + + return ! empty( $profile_url ) ? strtolower( $profile_url ) : ''; + + } + + /** + * Generate profile slug + * @param string $full_name + * @param string $first_name + * @param string $last_name + * @return string + */ + function profile_slug( $full_name, $first_name, $last_name ){ + + $permalink_base = um_get_option('permalink_base'); + + $user_in_url = ''; + + $full_name = str_replace("'", "", $full_name ); + $full_name = str_replace("&", "", $full_name ); + $full_name = str_replace("/", "", $full_name ); + + switch( $permalink_base ) + { + case 'name': // dotted + + $full_name_slug = $full_name; + $difficulties = 0; + + + if( strpos( $full_name, '.' ) > -1 ){ + $full_name = str_replace(".", "_", $full_name ); + $difficulties++; + } + + $full_name = strtolower( str_replace( " ", ".", $full_name ) ); + + if( strpos( $full_name, '_.' ) > -1 ){ + $full_name = str_replace('_.', '_', $full_name ); + $difficulties++; + } + + $full_name_slug = str_replace( '-' , '.', $full_name_slug ); + $full_name_slug = str_replace( ' ' , '.', $full_name_slug ); + $full_name_slug = str_replace( '..' , '.', $full_name_slug ); + + if( strpos( $full_name, '.' ) > -1 ){ + $full_name = str_replace('.', ' ', $full_name ); + $difficulties++; + } + + $user_in_url = rawurlencode( $full_name_slug ); + + break; + + case 'name_dash': // dashed + + $difficulties = 0; + + $full_name_slug = strtolower( $full_name ); + + // if last name has dashed replace with underscore + if( strpos( $last_name, '-') > -1 && strpos( $full_name, '-' ) > -1 ){ + $difficulties++; + $full_name = str_replace('-', '_', $full_name ); + } + // if first name has dashed replace with underscore + if( strpos( $first_name, '-') > -1 && strpos( $full_name, '-' ) > -1 ){ + $difficulties++; + $full_name = str_replace('-', '_', $full_name ); + } + // if name has space, replace with dash + $full_name_slug = str_replace( ' ' , '-', $full_name_slug ); + + // if name has period + if( strpos( $last_name, '.') > -1 && strpos( $full_name, '.' ) > -1 ){ + $difficulties++; + } + + $full_name_slug = str_replace( '.' , '-', $full_name_slug ); + $full_name_slug = str_replace( '--' , '-', $full_name_slug ); + + $user_in_url = rawurlencode( $full_name_slug ); + + break; + + case 'name_plus': // plus + + $difficulties = 0; + + $full_name_slug = strtolower( $full_name ); + + // if last name has dashed replace with underscore + if( strpos( $last_name, '+') > -1 && strpos( $full_name, '+' ) > -1 ){ + $difficulties++; + $full_name = str_replace('-', '_', $full_name ); + } + // if first name has dashed replace with underscore + if( strpos( $first_name, '+') > -1 && strpos( $full_name, '+' ) > -1 ){ + $difficulties++; + $full_name = str_replace('-', '_', $full_name ); + } + if( strpos( $last_name, '-') > -1 || strpos( $first_name, '-') > -1 || strpos( $full_name, '-') > -1 ){ + $difficulties++; + } + // if name has space, replace with dash + $full_name_slug = str_replace( ' ' , '+', $full_name_slug ); + $full_name_slug = str_replace( '-' , '+', $full_name_slug ); + + // if name has period + if( strpos( $last_name, '.') > -1 && strpos( $full_name, '.' ) > -1 ){ + $difficulties++; + } + + $full_name_slug = str_replace( '.' , '+', $full_name_slug ); + $full_name_slug = str_replace( '++' , '+', $full_name_slug ); + + $user_in_url = $full_name_slug; + + break; + } + + return $user_in_url ; + + } + + /*** + *** @get action url for admin use + ***/ + function admin_act_url( $action, $subaction ) { + $url = $this->get_current_url(); + $url = add_query_arg( 'um_adm_action', $action, $url ); + $url = add_query_arg( 'sub', $subaction, $url ); + $url = add_query_arg( 'user_id', um_user('ID'), $url ); + return $url; + } + + } +} \ No newline at end of file diff --git a/includes/core/class-profile.php b/includes/core/class-profile.php new file mode 100644 index 00000000..18dd2c53 --- /dev/null +++ b/includes/core/class-profile.php @@ -0,0 +1,248 @@ +roles()->um_current_user_can( 'edit', $user_id ) ) + die( __( 'You can not edit this user' ) ); + + UM()->files()->delete_core_user_photo( $user_id, 'profile_photo' ); + } + + + function ajax_delete_cover_photo() { + extract($_REQUEST); + + if ( ! UM()->roles()->um_current_user_can( 'edit', $user_id ) ) + die( __( 'You can not edit this user' ) ); + + UM()->files()->delete_core_user_photo( $user_id, 'cover_photo' ); + } + + + /*** + *** @all tab data + ***/ + function tabs() { + + $tabs = apply_filters( 'um_profile_tabs', array( + 'main' => array( + 'name' => __( 'About', 'ultimate-member' ), + 'icon' => 'um-faicon-user' + ), + 'posts' => array( + 'name' => __( 'Posts', 'ultimate-member' ), + 'icon' => 'um-faicon-pencil' + ), + 'comments' => array( + 'name' => __( 'Comments', 'ultimate-member' ), + 'icon' => 'um-faicon-comment' + ) + ) ); + + // disable private tabs + if ( ! is_admin() ) { + foreach ( $tabs as $id => $tab ) { + if ( ! $this->can_view_tab( $id ) ) { + unset( $tabs[$id] ); + } + } + } + + return $tabs; + } + + /*** + *** @tabs that are active + ***/ + function tabs_active(){ + $tabs = $this->tabs(); + foreach( $tabs as $id => $info ) { + if ( !um_get_option('profile_tab_'.$id) && !isset( $info['_builtin'] ) && !isset( $info['custom'] ) ) + unset( $tabs[$id] ); + } + return $tabs; + } + + /*** + *** @primary tabs only + ***/ + function tabs_primary(){ + $tabs = $this->tabs(); + $primary = array(); + foreach ( $tabs as $id => $info ) { + if ( isset( $info['name'] ) ) { + $primary[$id] = $info['name']; + } + } + return $primary; + } + + /*** + *** @Activated tabs in backend + ***/ + function tabs_enabled(){ + $tabs = $this->tabs(); + foreach( $tabs as $id => $info ){ + if ( isset( $info['name'] ) ) { + if ( um_get_option('profile_tab_'.$id) || isset( $info['_builtin'] ) ) { + $primary[$id] = $info['name']; + } + } + } + return ( isset( $primary ) ) ? $primary : ''; + } + + /*** + *** @Privacy options + ***/ + function tabs_privacy() { + $privacy = array( + 0 => 'Anyone', + 1 => 'Guests only', + 2 => 'Members only', + 3 => 'Only the owner', + 4 => 'Specific roles' + ); + + return $privacy; + } + + /*** + *** @Check if the user can view the current tab + ***/ + function can_view_tab( $tab ) { + $privacy = intval( um_get_option( 'profile_tab_' . $tab . '_privacy' ) ); + $can_view = false; + + switch( $privacy ) { + case 1: + $can_view = is_user_logged_in() ? false : true; + break; + + case 2: + $can_view = is_user_logged_in() ? true : false; + break; + + case 3: + $can_view = get_current_user_id() == um_user( 'ID' ) ? true : false; + break; + + case 4: + $can_view = false; + if( is_user_logged_in() ) { + $roles = um_get_option( 'profile_tab_' . $tab . '_roles' ); + if( is_array( $roles ) + && in_array( UM()->user()->get_role(), $roles ) ) { + $can_view = true; + } + } + break; + + default: + $can_view = true; + break; + } + + return $can_view; + } + + /*** + *** @Get active_tab + ***/ + function active_tab() { + + $this->active_tab = um_get_option('profile_menu_default_tab'); + + if ( get_query_var('profiletab') ) { + $this->active_tab = get_query_var('profiletab'); + } + + $this->active_tab = apply_filters( 'um_profile_active_tab', $this->active_tab ); + + return $this->active_tab; + } + + /*** + *** @Get active active_subnav + ***/ + function active_subnav() { + + $this->active_subnav = null; + + if ( get_query_var('subnav') ) { + $this->active_subnav = get_query_var('subnav'); + } + + return $this->active_subnav; + } + + /*** + *** @Show meta in profile + ***/ + function show_meta( $array ) { + $output = ''; + + if( isset( $array ) ){ + foreach( $array as $key ) { + $data = ''; + if ( $key && um_filtered_value( $key ) ) { + + if ( isset( UM()->builtin()->all_user_fields[ $key ] ) ){ + $data = UM()->builtin()->all_user_fields[ $key ]; + } + + if ( isset( $data['icon'] ) ) { + $icon = $data['icon']; + } else { + $icon = ''; + } + + $data['in_profile_meta'] = true; + + $icon = ( isset( $icon ) && !empty( $icon ) ) ? '' : ''; + + if ( !um_get_option('profile_show_metaicon') ){ + $icon = ''; + } + + $value = um_filtered_value( $key, $data ); + + $items[] = '' . $icon . $value . ''; + $items[] = ''; + + } + } + } + if ( isset( $items ) ) { + array_pop($items); + foreach( $items as $item ) { + $output .= $item; + } + } + + return $output; + } + + } +} \ No newline at end of file diff --git a/includes/core/class-query.php b/includes/core/class-query.php new file mode 100644 index 00000000..a1c1e291 --- /dev/null +++ b/includes/core/class-query.php @@ -0,0 +1,300 @@ +wp_pages ) && ! empty( $this->wp_pages ) ){ + return $this->wp_pages; + } + + $count_pages = wp_count_posts('page'); + + if ( $count_pages->publish > 300 ){ + return 'reached_maximum_limit'; + } + + + $pages = $wpdb->get_results('SELECT * FROM '.$wpdb->posts.' WHERE post_type = "page" AND post_status = "publish" ', OBJECT); + + $array = array(); + if( $wpdb->num_rows > 0 ){ + foreach ($pages as $page_data) { + $array[ $page_data->ID ] = $page_data->post_title; + } + } + + $this->wp_pages = $array; + + return $array; + } + + /*** + *** @get all forms + ***/ + function forms() { + + $args = array( + 'post_type' => 'um_form', + 'posts_per_page' => 200, + 'post_status' => array('publish') + ); + + $query = new \WP_Query( $args ); + foreach( $query->posts as $post ) { + setup_postdata( $post ); + $results[ $post->ID ] = $post->post_title; + } + return $results; + + } + + + /*** + *** @Do custom queries + ***/ + function make( $args ) { + + $defaults = array( + 'post_type' => 'post', + 'post_status' => array('publish') + ); + $args = wp_parse_args( $args, $defaults ); + + if ( isset( $args['post__in'] ) && empty( $args['post__in'] ) ) + return false; + + extract( $args ); + + if ( $post_type == 'comment' ) { // comments + + unset( $args['post_type'] ); + + $args['type__not_in'] = apply_filters( 'um_excluded_comment_types', array('') ); + + $comments = get_comments($args); + return $comments; + + } else { + + $custom_posts = new \WP_Query(); + $custom_posts->query( $args ); + return $custom_posts; + + } + + } + + /*** + *** @Get last users + ***/ + function get_recent_users($number = 5){ + $args = array( 'fields' => 'ID', 'number' => $number, 'orderby' => 'user_registered', 'order' => 'desc' ); + + $users = new \WP_User_Query( $args ); + return $users->results; + } + + /*** + *** @Count users by status + ***/ + function count_users_by_status( $status ) { + $args = array( 'fields' => 'ID', 'number' => 0 ); + if ( $status == 'unassigned' ) { + $args['meta_query'][] = array(array('key' => 'account_status','compare' => 'NOT EXISTS')); + $users = new \WP_User_Query( $args ); + foreach( $users->results as $user ) { + update_user_meta( $user, 'account_status', 'approved' ); + } + } else { + $args['meta_query'][] = array(array('key' => 'account_status','value' => $status,'compare' => '=')); + } + $users = new \WP_User_Query( $args ); + return count($users->results); + } + + /*** + *** @Get users by status + ***/ + function get_users_by_status($status, $number = 5){ + global $wpdb; + + $args = array( 'fields' => 'ID', 'number' => $number, 'orderby' => 'user_registered', 'order' => 'desc' ); + + $args['meta_query'][] = array( + array( + 'key' => 'account_status', + 'value' => $status, + 'compare' => '=' + ) + ); + + $users = new \WP_User_Query( $args ); + return $users->results; + } + + + /*** + *** @Count all users + ***/ + function count_users(){ + $result = count_users(); + return $result['total_users']; + } + + + /*** + *** @Using wpdb instead of update_post_meta + ***/ + function update_attr( $key, $post_id, $new_value ){ + update_post_meta( $post_id, '_um_' . $key, $new_value ); + } + + /*** + *** @get data + ***/ + function get_attr( $key, $post_id ){ + $meta = get_post_meta( $post_id, '_um_' . $key, true ); + return $meta; + } + + /*** + *** @delete data + ***/ + function delete_attr( $key, $post_id ){ + $meta = delete_post_meta( $post_id, '_um_' . $key ); + return $meta; + } + + /*** + *** @Checks if post has a specific meta key + ***/ + function has_post_meta($key, $value=null, $post_id=null ){ + if (!$post_id){ + global $post; + $post_id = $post->ID; + } + if ($value ){ + if ( get_post_meta($post_id, $key, true) == $value ) + return true; + } else { + if ( get_post_meta($post_id, $key, true) ) + return true; + } + return false; + } + + /*** + *** @Get posts with specific meta key/value + ***/ + function find_post_id($post_type, $key, $value){ + $posts = get_posts( array( 'post_type' => $post_type, 'meta_key' => $key, 'meta_value' => $value ) ); + if ( isset($posts[0]) && !empty($posts) ) + return $posts[0]->ID; + return false; + } + + + /*** + *** @Get post data + ***/ + function post_data( $post_id ) { + $array['form_id'] = $post_id; + $mode = $this->get_attr('mode', $post_id); + $meta = get_post_custom( $post_id ); + foreach ($meta as $k => $v){ + if ( strstr($k, '_um_'.$mode.'_' ) ) { + $k = str_replace('_um_'.$mode.'_', '', $k); + $array[$k] = $v[0]; + } elseif ($k == '_um_mode'){ + $k = str_replace('_um_', '', $k); + $array[$k] = $v[0]; + } elseif ( strstr($k, '_um_') ) { + $k = str_replace('_um_', '', $k); + $array[$k] = $v[0]; + } + + } + + foreach( $array as $k => $v ) { + if ( strstr( $k, 'login_') || strstr( $k, 'register_' ) || strstr( $k, 'profile_' ) ){ + if ( $mode != 'directory' ) { + unset($array[$k]); + } + } + } + return $array; + } + + /*** + *** @Capture selected value + ***/ + function get_meta_value( $key, $array_key = null, $fallback = null ) { + global $post; + $post_id = get_the_ID(); + $try = get_post_meta( $post_id, $key, true ); + + if ( ! empty( $try ) ) + if ( is_array( $try ) && in_array( $array_key, $try ) ) { + return $array_key; + } else if ( is_array( $try ) ) { + return ''; + } else { + return $try; + } + + if ($fallback == 'na') { + $fallback = 0; + $none = ''; + } else { + $none = 0; + } + return (!empty($fallback)) ? $fallback : $none; + } + + /*** + *** @Checks if its a core page of UM + ***/ + function is_core( $post_id ){ + $is_core = get_post_meta($post_id, '_um_core', true); + if ( $is_core != '' ) { + return $is_core; + } else { + return false; + } + } + + } +} diff --git a/includes/core/class-register.php b/includes/core/class-register.php new file mode 100644 index 00000000..d022c8b2 --- /dev/null +++ b/includes/core/class-register.php @@ -0,0 +1,35 @@ +pretty_print = defined( 'JSON_PRETTY_PRINT' ) ? JSON_PRETTY_PRINT : null; + + // Allow API request logging to be turned off + $this->log_requests = apply_filters( 'um_api_log_requests', $this->log_requests ); + + } + + /** + * Registers a new rewrite endpoint for accessing the API + */ + public function add_endpoint( $rewrite_rules ) { + add_rewrite_endpoint( 'um-api', EP_ALL ); + } + + /** + * Registers query vars for API access + */ + public function query_vars( $vars ) { + + $vars[] = 'key'; + $vars[] = 'token'; + $vars[] = 'format'; + $vars[] = 'query'; + $vars[] = 'type'; + $vars[] = 'data'; + $vars[] = 'fields'; + $vars[] = 'value'; + $vars[] = 'number'; + $vars[] = 'id'; + $vars[] = 'email'; + $vars[] = 'orderby'; + $vars[] = 'order'; + $vars[] = 'include'; + $vars[] = 'exclude'; + + $this->vars = $vars; + + return $vars; + } + + /** + * Validate the API request + */ + private function validate_request() { + global $wp_query; + + $this->override = false; + + // Make sure we have both user and api key + if ( ! empty( $wp_query->query_vars['um-api'] ) ) { + + if ( empty( $wp_query->query_vars['token'] ) || empty( $wp_query->query_vars['key'] ) ) + $this->missing_auth(); + + // Retrieve the user by public API key and ensure they exist + if ( ! ( $user = $this->get_user( $wp_query->query_vars['key'] ) ) ) : + $this->invalid_key(); + else : + $token = urldecode( $wp_query->query_vars['token'] ); + $secret = get_user_meta( $user, 'um_user_secret_key', true ); + $public = urldecode( $wp_query->query_vars['key'] ); + + if ( hash_equals( md5( $secret . $public ), $token ) ) + $this->is_valid_request = true; + else + $this->invalid_auth(); + endif; + } + } + + /** + * Retrieve the user ID based on the public key provided + */ + public function get_user( $key = '' ) { + global $wpdb, $wp_query; + + if( empty( $key ) ) + $key = urldecode( $wp_query->query_vars['key'] ); + + if ( empty( $key ) ) { + return false; + } + + $user = get_transient( md5( 'um_api_user_' . $key ) ); + + if ( false === $user ) { + $user = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'um_user_public_key' AND meta_value = %s LIMIT 1", $key ) ); + set_transient( md5( 'um_api_user_' . $key ) , $user, DAY_IN_SECONDS ); + } + + if ( $user != NULL ) { + $this->user_id = $user; + return $user; + } + + return false; + } + + /** + * Displays a missing authentication error if all the parameters aren't + * provided + */ + private function missing_auth() { + $error = array(); + $error['error'] = __( 'You must specify both a token and API key!', 'ultimate-member' ); + + $this->data = $error; + $this->output( 401 ); + } + + /** + * Displays an authentication failed error if the user failed to provide valid credentials + */ + private function invalid_auth() { + $error = array(); + $error['error'] = __( 'Your request could not be authenticated', 'ultimate-member' ); + + $this->data = $error; + $this->output( 401 ); + } + + /** + * Displays an invalid API key error if the API key provided couldn't be validated + */ + private function invalid_key() { + $error = array(); + $error['error'] = __( 'Invalid API key', 'ultimate-member' ); + + $this->data = $error; + $this->output( 401 ); + } + + + /** + * Listens for the API and then processes the API requests + */ + public function process_query() { + global $wp_query; + + // Check for um-api var. Get out if not present + if ( ! isset( $wp_query->query_vars['um-api'] ) ) + return; + + // Check for a valid user and set errors if necessary + $this->validate_request(); + + // Only proceed if no errors have been noted + if( ! $this->is_valid_request ) + return; + + if( ! defined( 'UM_DOING_API' ) ) { + define( 'UM_DOING_API', true ); + } + + // Determine the kind of query + $query_mode = $this->get_query_mode(); + foreach( $this->vars as $k ) { + $args[ $k ] = isset( $wp_query->query_vars[ $k ] ) ? $wp_query->query_vars[ $k ] : null; + } + + $data = array(); + + switch( $query_mode ) : + + case 'get.stats': + $data = $this->get_stats( $args ); + break; + + case 'get.users': + $data = $this->get_users( $args ); + break; + + case 'get.user': + $data = $this->get_auser( $args ); + break; + + case 'update.user': + $data = $this->update_user( $args ); + break; + + case 'delete.user': + $data = $this->delete_user( $args ); + break; + + case 'get.following': + $data = $this->get_following( $args ); + break; + + case 'get.followers': + $data = $this->get_followers( $args ); + break; + + endswitch; + + // Allow extensions to setup their own return data + $this->data = apply_filters( 'um_api_output_data', $data, $query_mode, $this ); + + // Log this API request, if enabled. We log it here because we have access to errors. + $this->log_request( $this->data ); + + // Send out data to the output function + $this->output(); + } + + /** + * Get some stats + */ + public function get_stats( $args ) { + global $wpdb; + extract( $args ); + + $response = array(); + $error = array(); + + $query = "SELECT COUNT(*) FROM {$wpdb->prefix}users"; + $count = absint( $wpdb->get_var($query) ); + $response['stats']['total_users'] = $count; + + $pending = UM()->user()->get_pending_users_count(); + $response['stats']['pending_users'] = absint( $pending ); + + if ( class_exists( 'UM_Notifications_API') ) { + $query = "SELECT COUNT(*) FROM {$wpdb->prefix}um_notifications"; + $total_notifications = absint( $wpdb->get_var( $query ) ); + $response['stats']['total_notifications'] = $total_notifications; + } + + if ( class_exists( 'UM_Messaging_API') ) { + $query = "SELECT COUNT(*) FROM {$wpdb->prefix}um_conversations"; + $total_conversations = absint( $wpdb->get_var( $query ) ); + $response['stats']['total_conversations'] = $total_conversations; + + $query = "SELECT COUNT(*) FROM {$wpdb->prefix}um_messages"; + $total_messages = absint( $wpdb->get_var( $query ) ); + $response['stats']['total_messages'] = $total_messages; + } + + if ( class_exists( 'UM_Online_API') ) { + global $um_online; + $total_online = count( $um_online->get_users() ); + $response['stats']['total_online'] = $total_online; + } + + if ( class_exists( 'UM_Reviews_API') ) { + $query = "SELECT COUNT(*) FROM {$wpdb->prefix}posts WHERE post_status='publish' AND post_type='um_review'"; + $total_reviews = absint( $wpdb->get_var( $query ) ); + $response['stats']['total_reviews'] = $total_reviews; + } + + return $response; + } + + /** + * Update user API query + */ + public function update_user( $args ) { + extract( $args ); + + $response = array(); + $error = array(); + + if ( !$id ) { + $error['error'] = __('You must provide a user ID','ultimate-member'); + return $error; + } + + if ( !$data ) { + $error['error'] = __('You need to provide data to update','ultimate-member'); + return $error; + } + + um_fetch_user( $id ); + + switch ( $data ) { + case 'status': + UM()->user()->set_status( $value ); + $response['success'] = __('User status has been changed.','ultimate-member'); + break; + case 'role': + $wp_user_object = new \WP_User( $id ); + $wp_user_object->set_role( $value ); + $response['success'] = __('User role has been changed.','ultimate-member'); + break; + default: + update_user_meta( $id, $data, esc_attr( $value ) ); + $response['success'] = __('User meta has been changed.','ultimate-member'); + break; + } + + return $response; + } + + /** + * Process Get followers users API Request + */ + public function get_followers( $args ) { + extract( $args ); + + $response = array(); + $error = array(); + + if ( !$id ) { + $error['error'] = __('You must provide a user ID','ultimate-member'); + return $error; + } + + if ( class_exists( 'UM_Followers_API' ) ) { + global $um_followers; + $results = $um_followers->api->followers( $id ); + if ( !$results ) { + $error['error'] = __('No users were found','ultimate-member'); + return $error; + } + $response['followers']['count'] = $um_followers->api->count_followers_plain( $id ); + foreach( $results as $k => $v ) { + $user = get_userdata( $v['user_id2'] ); + $response['followers']['users'][$k]['ID'] = $v['user_id2']; + $response['followers']['users'][$k]['username'] = $user->user_login; + $response['followers']['users'][$k]['display_name'] = $user->display_name; + } + } else { + $error['error'] = __('Invalid request','ultimate-member'); + return $error; + } + + return $response; + } + + /** + * Process Get following users API Request + */ + public function get_following( $args ) { + extract( $args ); + + $response = array(); + $error = array(); + + if ( !$id ) { + $error['error'] = __('You must provide a user ID','ultimate-member'); + return $error; + } + + if ( class_exists( 'UM_Followers_API' ) ) { + global $um_followers; + $results = $um_followers->api->following( $id ); + if ( !$results ) { + $error['error'] = __('No users were found','ultimate-member'); + return $error; + } + $response['following']['count'] = $um_followers->api->count_following_plain( $id ); + foreach( $results as $k => $v ) { + $user = get_userdata( $v['user_id1'] ); + $response['following']['users'][$k]['ID'] = $v['user_id1']; + $response['following']['users'][$k]['username'] = $user->user_login; + $response['following']['users'][$k]['display_name'] = $user->display_name; + } + } else { + $error['error'] = __('Invalid request','ultimate-member'); + return $error; + } + + return $response; + } + + /** + * Process Get users API Request + */ + public function get_users( $args ) { + extract( $args ); + + $response = array(); + $error = array(); + + if ( !$number ) + $number = 10; + + if ( !$orderby ) + $orderby = 'user_registered'; + + if ( !$order ) + $order = 'desc'; + + $loop_a = array('number' => $number, 'orderby' => $orderby, 'order' => $order ); + + if ( $include ) { + $include = explode(',', $include ); + $loop_a['include'] = $include; + } + + if ( $exclude ) { + $exclude = explode(',', $exclude ); + $loop_a['exclude'] = $exclude; + } + + $loop = get_users( $loop_a ); + + foreach( $loop as $user ) { + + unset( $user->data->user_status ); + unset( $user->data->user_activation_key ); + unset( $user->data->user_pass ); + + um_fetch_user( $user->ID ); + + foreach( $user as $key => $val ) { + if ( $key != 'data' ) continue; + if ( $key == 'data' ) { + $key = 'profile'; + $val->roles = $user->roles; + $val->first_name = um_user('first_name'); + $val->last_name = um_user('last_name'); + $val->account_status = um_user('account_status'); + $val->profile_pic_original = $this->getsrc( um_user('profile_photo', 'original') ); + $val->profile_pic_normal = $this->getsrc( um_user('profile_photo', 200) ); + $val->profile_pic_small = $this->getsrc( um_user('profile_photo', 40) ); + $val->cover_photo = $this->getsrc( um_user('cover_photo', 1000) ); + + if ( class_exists('UM_Followers_API') ) { + global $um_followers; + $val->followers_count = $um_followers->api->count_followers_plain( $user->ID ); + $val->following_count = $um_followers->api->count_following_plain( $user->ID ); + } + + } + $response[ $user->ID ] = $val; + } + + } + + return $response; + } + + /** + * Process delete user via API + */ + public function delete_user( $args ) { + extract( $args ); + + $response = array(); + $error = array(); + + if ( !isset( $id ) ) { + $error['error'] = __('You must provide a user ID','ultimate-member'); + return $error; + } + + $user = get_userdata( $id ); + if ( !$user ) { + $error['error'] = __('Invalid user specified','ultimate-member'); + return $error; + } + + um_fetch_user( $id ); + UM()->user()->delete(); + + $response['success'] = __('User has been successfully deleted.','ultimate-member'); + + return $response; + } + + /** + * Process Get user API Request + */ + public function get_auser( $args ) { + extract( $args ); + + $response = array(); + $error = array(); + + if ( !isset( $id ) ) { + $error['error'] = __('You must provide a user ID','ultimate-member'); + return $error; + } + + $user = get_userdata( $id ); + if ( !$user ) { + $error['error'] = __('Invalid user specified','ultimate-member'); + return $error; + } + + unset( $user->data->user_status ); + unset( $user->data->user_activation_key ); + unset( $user->data->user_pass ); + + um_fetch_user( $user->ID ); + + if ( isset( $fields ) && $fields ) { + $fields = explode(',', $fields ); + $response['ID'] = $user->ID; + $response['username'] = $user->user_login; + foreach( $fields as $field ) { + + switch( $field ) { + + default: + $response[$field] = ( um_profile( $field ) ) ? um_profile( $field ) : ''; + break; + + case 'mycred_points': + $response['mycred_points'] = number_format( (int)get_user_meta( $user->ID, 'mycred_default', true ), 2 ); + break; + + case 'cover_photo': + $response['cover_photo'] = $this->getsrc( um_user('cover_photo', 1000) ); + break; + + case 'profile_pic': + $response['profile_pic_original'] = $this->getsrc( um_user('profile_photo', 'original') ); + $response['profile_pic_normal'] = $this->getsrc( um_user('profile_photo', 200) ); + $response['profile_pic_small'] = $this->getsrc( um_user('profile_photo', 40) ); + break; + + case 'status': + $response['status'] = um_user('account_status'); + break; + + case 'role': + $response['role'] = um_user('role'); + break; + + case 'email': + case 'user_email': + $response['email'] = um_user('user_email'); + break; + + case 'followers': + if ( class_exists('UM_Followers_API') ) { + global $um_followers; + $response['followers_count'] = $um_followers->api->count_followers_plain( $user->ID ); + $response['following_count'] = $um_followers->api->count_following_plain( $user->ID ); + } + break; + + } + + } + } else { + + foreach( $user as $key => $val ) { + if ( $key != 'data' ) continue; + if ( $key == 'data' ) { + $key = 'profile'; + $val->roles = $user->roles; + $val->first_name = um_user('first_name'); + $val->last_name = um_user('last_name'); + $val->account_status = um_user('account_status'); + $val->profile_pic_original = $this->getsrc( um_user('profile_photo', 'original') ); + $val->profile_pic_normal = $this->getsrc( um_user('profile_photo', 200) ); + $val->profile_pic_small = $this->getsrc( um_user('profile_photo', 40) ); + $val->cover_photo = $this->getsrc( um_user('cover_photo', 1000) ); + + if ( class_exists('UM_Followers_API') ) { + global $um_followers; + $val->followers_count = $um_followers->api->count_followers_plain( $user->ID ); + $val->following_count = $um_followers->api->count_following_plain( $user->ID ); + } + + } + $response = $val; + } + + } + + return $response; + } + + /** + * Get source + */ + public function getsrc( $image ) { + if (preg_match('/query_vars['um-api'] ) ? $wp_query->query_vars['um-api'] : null; + $error = array(); + // Make sure our query is valid + if ( ! in_array( $query, $accepted ) ) { + $error['error'] = __( 'Invalid query!', 'ultimate-member' ); + + $this->data = $error; + $this->output(); + } + + return $query; + } + + /** + * Get page number + */ + public function get_paged() { + global $wp_query; + + return isset( $wp_query->query_vars['page'] ) ? $wp_query->query_vars['page'] : 1; + } + + /** + * Retrieve the output format + */ + public function get_output_format() { + global $wp_query; + + $format = isset( $wp_query->query_vars['format'] ) ? $wp_query->query_vars['format'] : 'json'; + + return apply_filters( 'um_api_output_format', $format ); + } + + /** + * Log each API request, if enabled + */ + private function log_request( $data = array() ) { + if ( ! $this->log_requests ) + return; + + } + + + /** + * Retrieve the output data + */ + public function get_output() { + return $this->data; + } + + /** + * Output Query in either JSON/XML. The query data is outputted as JSON + * by default + */ + public function output( $status_code = 200 ) { + global $wp_query; + + $format = $this->get_output_format(); + + status_header( $status_code ); + + do_action( 'um_api_output_before', $this->data, $this, $format ); + + switch ( $format ) : + + case 'xml' : + + require_once um_path . 'includes/lib/array2xml.php'; + $xml = Array2XML::createXML( 'um', $this->data ); + echo $xml->saveXML(); + + break; + + case 'json' : + case '' : + + header( 'Content-Type: application/json' ); + if ( ! empty( $this->pretty_print ) ) + echo json_encode( $this->data, $this->pretty_print ); + else + echo json_encode( $this->data ); + + break; + + + default : + + // Allow other formats to be added via extensions + do_action( 'um_api_output_' . $format, $this->data, $this ); + + break; + + endswitch; + + do_action( 'um_api_output_after', $this->data, $this, $format ); + + die(); + } + + /** + * Modify User Profile + */ + function user_key_field( $user ) { + + if ( empty( $user ) ) + return; + + if( ! isset( $user->ID ) ) + return; + + if ( current_user_can( 'edit_users' ) && current_user_can( 'edit_user', $user->ID ) ) { + $user = get_userdata( $user->ID ); + ?> +
            query->count_users_by_status('awaiting_admin_review'); ?>query()->count_users_by_status('awaiting_admin_review'); ?>
            query->count_users_by_status('awaiting_email_confirmation'); ?>query()->count_users_by_status('awaiting_email_confirmation'); ?>
            query->count_users_by_status('inactive'); ?>query()->count_users_by_status('inactive'); ?>
            + + + + + + +
            + + + um_user_public_key ) ) { ?> +

            +

            + +

            +  um_user_public_key; ?>
            +  um_user_secret_key; ?>
            +  get_token( $user->ID ); ?> +

            +

            +

            + +
            + um_user_public_key ) ) { + update_user_meta( $user_id, 'um_user_public_key', $this->generate_public_key( $user->user_email ) ); + update_user_meta( $user_id, 'um_user_secret_key', $this->generate_private_key( $user->ID ) ); + } elseif( $regenerate == true ) { + $this->revoke_api_key( $user->ID ); + update_user_meta( $user_id, 'um_user_public_key', $this->generate_public_key( $user->user_email ) ); + update_user_meta( $user_id, 'um_user_secret_key', $this->generate_private_key( $user->ID ) ); + } else { + return false; + } + + return true; + } + + /** + * Revoke a users API keys + */ + public function revoke_api_key( $user_id = 0 ) { + + if( empty( $user_id ) ) { + return false; + } + + $user = get_userdata( $user_id ); + + if( ! $user ) { + return false; + } + + if ( ! empty( $user->um_user_public_key ) ) { + delete_transient( md5( 'um_api_user_' . $user->um_user_public_key ) ); + delete_user_meta( $user_id, 'um_user_public_key' ); + delete_user_meta( $user_id, 'um_user_secret_key' ); + } else { + return false; + } + + return true; + } + + + /** + * Generate and Save API key + */ + public function update_key( $user_id ) { + if ( current_user_can( 'edit_user', $user_id ) && isset( $_POST['um_set_api_key'] ) ) { + + $user = get_userdata( $user_id ); + + if ( empty( $user->um_user_public_key ) ) { + update_user_meta( $user_id, 'um_user_public_key', $this->generate_public_key( $user->user_email ) ); + update_user_meta( $user_id, 'um_user_secret_key', $this->generate_private_key( $user->ID ) ); + } else { + $this->revoke_api_key( $user_id ); + } + } + } + + /** + * Generate the public key for a user + */ + private function generate_public_key( $user_email = '' ) { + $auth_key = defined( 'AUTH_KEY' ) ? AUTH_KEY : ''; + $public = hash( 'md5', $user_email . $auth_key . date( 'U' ) ); + return $public; + } + + /** + * Generate the secret key for a user + */ + private function generate_private_key( $user_id = 0 ) { + $auth_key = defined( 'AUTH_KEY' ) ? AUTH_KEY : ''; + $secret = hash( 'md5', $user_id . $auth_key . date( 'U' ) ); + return $secret; + } + + /** + * Retrieve the user's token + */ + private function get_token( $user_id = 0 ) { + $user = get_userdata( $user_id ); + return hash( 'md5', $user->um_user_secret_key . $user->um_user_public_key ); + } + + } +} \ No newline at end of file diff --git a/includes/core/class-rewrite.php b/includes/core/class-rewrite.php new file mode 100644 index 00000000..401585f3 --- /dev/null +++ b/includes/core/class-rewrite.php @@ -0,0 +1,216 @@ +config()->permalinks['user'] ) ) { + + $user_page_id = UM()->config()->permalinks['user']; + $account_page_id = UM()->config()->permalinks['account']; + $user = get_post($user_page_id); + + if ( isset( $user->post_name ) ) { + + $user_slug = $user->post_name; + $account = get_post($account_page_id); + $account_slug = $account->post_name; + + $add_lang_code = ''; + $language_code = ''; + + if ( function_exists('icl_object_id') || function_exists('icl_get_current_language') ) { + + if( function_exists('icl_get_current_language') ){ + $language_code = icl_get_current_language(); + }else if( function_exists('icl_object_id') && defined('ICL_LANGUAGE_CODE') ){ + $language_code = ICL_LANGUAGE_CODE; + } + + // User page translated slug + $lang_post_id = icl_object_id( $user->ID, 'post', FALSE, $language_code ); + $lang_post_obj = get_post( $lang_post_id ); + if( isset( $lang_post_obj->post_name ) ){ + $user_slug = $lang_post_obj->post_name; + } + + // Account page translated slug + $lang_post_id = icl_object_id( $account->ID, 'post', FALSE, $language_code ); + $lang_post_obj = get_post( $lang_post_id ); + if( isset( $lang_post_obj->post_name ) ){ + $account_slug = $lang_post_obj->post_name; + } + + if( $language_code != icl_get_default_language() ){ + $add_lang_code = $language_code; + } + + } + + add_rewrite_rule( $user_slug.'/([^/]+)/?$', + 'index.php?page_id='.$user_page_id.'&um_user=$matches[1]&lang='.$add_lang_code, + 'top' + ); + + add_rewrite_rule( $account_slug.'/([^/]+)?$', + 'index.php?page_id='.$account_page_id.'&um_tab=$matches[1]&lang='.$add_lang_code, + 'top' + ); + + if( ! apply_filters('um_rewrite_flush_rewrite_rules', um_get_option('um_flush_stop') ) ) + flush_rewrite_rules( true ); + + } + + } + + } + + /*** + *** @author page to user profile redirect + ***/ + function redirect_author_page() { + if ( um_get_option('author_redirect') && is_author() ) { + $id = get_query_var( 'author' ); + um_fetch_user( $id ); + exit( wp_redirect( um_user_profile_url() ) ); + } + } + + /*** + *** @locate/display a profile + ***/ + function locate_user_profile() { + global $post; + + if ( um_queried_user() && um_is_core_page('user') ) { + + if ( um_get_option('permalink_base') == 'user_login' ) { + + $user_id = username_exists( um_queried_user() ); + + // Try nice name + if ( !$user_id ) { + $slug = um_queried_user(); + $slug = str_replace('.','-',$slug); + $the_user = get_user_by( 'slug', $slug ); + if ( isset( $the_user->ID ) ){ + $user_id = $the_user->ID; + } + + if ( ! $user_id ) + $user_id = UM()->user()->user_exists_by_email_as_username( um_queried_user() ); + + if ( ! $user_id ) + $user_id = UM()->user()->user_exists_by_email_as_username( $slug ); + + } + + } + + if ( um_get_option('permalink_base') == 'user_id' ) { + $user_id = UM()->user()->user_exists_by_id( um_queried_user() ); + + } + + if ( in_array( um_get_option('permalink_base'), array('name','name_dash','name_dot','name_plus') ) ) { + $user_id = UM()->user()->user_exists_by_name( um_queried_user() ); + + } + + /** USER EXISTS SET USER AND CONTINUE **/ + + if ( $user_id ) { + + um_set_requested_user( $user_id ); + + do_action('um_access_profile', $user_id ); + + } else { + + exit( wp_redirect( um_get_core_page('user') ) ); + + } + + } else if ( um_is_core_page('user') ) { + + if ( is_user_logged_in() ) { // just redirect to their profile + + $query = UM()->permalinks()->get_query_array(); + + $url = um_user_profile_url(); + + if ( $query ) { + foreach ( $query as $key => $val ) { + $url = add_query_arg( $key, $val, $url ); + } + } + + exit( wp_redirect( $url ) ); + } else { + + $redirect_to = apply_filters( 'um_locate_user_profile_not_loggedin__redirect', home_url() ); + if ( ! empty( $redirect_to ) ){ + exit( wp_redirect( $redirect_to ) ); + } + + } + + } + + } + + + } +} \ No newline at end of file diff --git a/includes/core/class-roles-capabilities.php b/includes/core/class-roles-capabilities.php new file mode 100644 index 00000000..97525b73 --- /dev/null +++ b/includes/core/class-roles-capabilities.php @@ -0,0 +1,344 @@ +roles as $roleID => $role_data ) { + $role_meta = get_option( "um_role_{$roleID}_meta" ); + + if ( ! empty( $role_meta ) ) + $wp_roles->roles[$roleID] = array_merge( $role_data, $role_meta ); + } + + + //Add custom UM roles + $roles = array(); + + $role_keys = get_option( 'um_roles' ); + + if ( $role_keys ) { + + foreach ( $role_keys as $role_key ) { + $role_meta = get_option( "um_role_{$role_key}_meta" ); + if ( $role_meta ) { + $role_meta['name'] = 'UM ' . $role_meta['name']; + $roles['um_' . $role_key] = $role_meta; + } + } + + foreach ( $roles as $role_id => $details ) { + $capabilities = ! empty( $details['wp_capabilities'] ) ? array_keys( $details['wp_capabilities'] ) : array(); + $details['capabilities'] = array_fill_keys( array_values( $capabilities ), true ); + unset( $details['wp_capabilities'] ); + $wp_roles->roles[$role_id] = $details; + $wp_roles->role_objects[$role_id] = new \WP_Role( $role_id, $capabilities ); + $wp_roles->role_names[$role_id] = $details['name']; + } + + } + + // Return the modified $wp_roles array + return $wp_roles; + } + + + /** + * Return a user's main role + * + * @param int $user_id + * @param string $new_role + * @uses get_userdata() To get the user data + * @uses apply_filters() Calls 'um_set_user_role' with the role and user id + * @return string + */ + function set_um_user_role( $user_id = 0, $new_role = '' ) { + // Validate user id + $user = get_userdata( $user_id ); + + // User exists + if ( ! empty( $user ) ) { + + // Get users old UM role + $role = $this->um_get_user_role( $user_id ); + + // User already has this role so no new role is set + if ( $new_role === $role ) { + $new_role = false; + } else { + // Users role is different than the new role + + // Remove the old UM role + if ( ! empty( $role ) ) + $user->remove_role( $role ); + + // Add the new role + if ( ! empty( $new_role ) ) { + $user->add_role( $new_role ); + } + + do_action( 'um_when_role_is_set', um_user('ID') ); + + do_action('um_before_user_role_is_changed'); + + UM()->user()->profile['role'] = $new_role; + + do_action('um_member_role_upgrade', $role, UM()->user()->profile['role'] ); + + UM()->user()->update_usermeta_info('role'); + + do_action('um_after_user_role_is_changed'); + + do_action('um_after_user_role_is_updated', um_user('ID'), $role ); + } + } else { + // User does don exist so return false + $new_role = false; + } + + return apply_filters( 'um_set_user_role', $new_role, $user_id, $user ); + } + + + /** + * Get user one of UM roles if it has it + * + * @param int $user_id + * @return bool|mixed + */ + function um_get_user_role( $user_id = 0 ) { + $user = get_userdata( $user_id ); + $role = false; + + // User has roles so look for a UM Role one + if ( ! empty( $user->roles ) ) { + $role_keys = get_option( 'um_roles' ); + + if ( empty( $role_keys ) ) + return array_shift( $user->roles ); + + $role_keys = array_map( function( $item ) { + return 'um_' . $item; + }, $role_keys ); + + $roles = array_intersect( array_values( $user->roles ), $role_keys ); + if ( ! empty( $roles ) ) { + $role = array_shift( $roles ); + } else { + return array_shift( $user->roles ); + } + } + + return $role; + } + + + /** + * Get role name by roleID + * + * @param $slug + * @return bool|string + */ + function get_role_name( $slug ) { + $roledata = $this->role_data( $slug ); + + if ( empty( $roledata['name'] ) ) { + global $wp_roles; + + if ( empty( $wp_roles->roles[$slug] ) ) + return false; + else + return $wp_roles->roles[$slug]['name']; + } + + + return $roledata['name']; + } + + + /** + * Get role data + * + * @param int $roleID Role ID + * @return mixed|void + */ + function role_data( $roleID ) { + if ( strpos( $roleID, 'um_' ) === 0 ) + $roleID = substr( $roleID, 3 ); + + $role_data = get_option( "um_role_{$roleID}_meta" ); + + if ( ! $role_data ) + return array(); + + $temp = array(); + foreach ( $role_data as $key=>$value ) { + if ( strpos( $key, '_um_' ) === 0 ) + $key = str_replace( '_um_', '', $key ); + $temp[$key] = $value; + } + return $temp; + } + + + /*** + *** @Query for UM roles + ***/ + function get_roles( $add_default = false, $exclude = null ){ + global $wp_roles; + + if ( empty( $wp_roles ) ) { + return array(); + } + + $roles = $wp_roles->role_names; + + if ( $add_default ) { + $roles[0] = $add_default; + } + + if ( $exclude ) { + foreach( $exclude as $role ) { + unset( $roles[$role] ); + } + } + + return $roles; + } + + + /*** + *** @Current user can + ***/ + function um_current_user_can( $cap, $user_id ) { + if ( ! is_user_logged_in() ) + return false; + + $return = 1; + + um_fetch_user( get_current_user_id() ); + + switch( $cap ) { + case 'edit': + if ( get_current_user_id() == $user_id && um_user( 'can_edit_profile' ) ) + $return = 1; + elseif ( ! um_user( 'can_edit_everyone' ) ) + $return = 0; + elseif ( get_current_user_id() == $user_id && ! um_user( 'can_edit_profile') ) + $return = 0; + elseif ( um_user( 'can_edit_roles' ) && ! in_array( UM()->roles()->um_get_user_role( $user_id ), um_user( 'can_edit_roles' ) ) ) + $return = 0; + break; + + case 'delete': + if ( ! um_user( 'can_delete_everyone' ) ) $return = 0; + elseif ( um_user( 'can_delete_roles' ) && ! in_array( UM()->roles()->um_get_user_role( $user_id ), um_user( 'can_delete_roles' ) ) ) $return = 0; + break; + + } + + um_fetch_user( $user_id ); + + return $return; + } + + + /*** + *** @User can (role settings ) + ***/ + function um_user_can( $permission ) { + if ( ! is_user_logged_in() ) + return false; + + $user_id = get_current_user_id(); + $role = get_user_meta( $user_id, 'role', true ); + $permissions = $this->role_data( $role ); + + $permissions = apply_filters( 'um_user_permissions_filter', $permissions, $user_id ); + if ( isset( $permissions[ $permission ] ) && is_serialized( $permissions[ $permission ] ) ) + return unserialize( $permissions[ $permission ] ); + if ( isset( $permissions[ $permission ] ) && $permissions[ $permission ] == 1 ) + return true; + return false; + } + +/* + /** + * @param $cap + * @param bool $value + * @param string $struct + * @return bool + * + function current_user_can( $cap, $value = true, $struct = 'string' ) { + if ( ! is_user_logged_in() ) + return false; + + $user_id = get_current_user_id(); + return $this->user_can( $user_id, $cap, $value, $struct ); + } + + + /** + * @param $user_id + * @param $cap + * @param bool $value + * @param string $struct + * @return bool + * + function user_can( $user_id, $cap, $value = true, $struct = 'string' ) { + + + $role = $this->um_get_user_role( $user_id ); + $role_meta = $this->role_data( $role ); + $role_meta = apply_filters( 'um_user_permissions_filter', $role_meta, $user_id ); + + /* $um_roles = get_option( 'um_roles' ); + $um_roles = array_map( function( $item ) { + return 'um_' . $item; + }, $um_roles ); + + $user_meta = get_userdata( $user_id ); + $user_roles = $user_meta->roles; + + $user_um_role = array_intersect( $um_roles, $user_roles ); + if ( ! count( $user_um_role ) ) + return false; + + $user_um_role = $user_um_role[0]; + $role_meta = get_option( "um_role_" . substr( $user_um_role, 3 ) . "_meta" );* + + if ( empty( $role_meta[$cap] ) ) + return false; + + if ( $struct == 'array' ) { + if ( is_array( $role_meta[$cap] ) && ! in_array( $value, $role_meta[$cap] ) ) + return false; + } else { + if ( $role_meta[$cap] != $value ) + return false; + } + + return true; + }*/ + } +} \ No newline at end of file diff --git a/includes/core/class-router.php b/includes/core/class-router.php new file mode 100644 index 00000000..9e068f60 --- /dev/null +++ b/includes/core/class-router.php @@ -0,0 +1,103 @@ +request_process( array( + 'route' => $_REQUEST['um_resource'], + 'method' => $_REQUEST['um_method'] + ) ); + + /*if ($_REQUEST['um_action'] == 'download' || $_REQUEST['um_action'] == 'view') { + WO()->downloader()->set_type( $_REQUEST['um_action'] )->process( array( + 'id' => $_REQUEST['um_id'], + 'resource' => $_REQUEST['um_resource'], + 'action' => $_REQUEST['um_action'] + ) ); + } else if ($_REQUEST['um_action'] == 'route') { + $this->request_process( array( + 'route' => $_REQUEST['um_resource'], + 'method' => $_REQUEST['um_method'] + ) ); + }*/ + } + + + /** + * @param $params array + * @return bool + */ + function request_process( $params ) { + if ( empty( $params['route'] ) || empty( $params['method'] ) ) + return false; + + $route = str_replace( array( '!', '/' ), '\\', $params['route'] ); + + if ( ! class_exists( $route ) ) + return false; + + if ( method_exists( $route, 'instance' ) ) + $object = $route::instance(); + else + $object = new $route(); + + if ( ! method_exists( $object, $params['method'] ) ) + return false; + + + call_user_func( array( &$object, $params['method'] ) ); + return true; + } + + + function frontend_requests() { + $ip = isset( $_SERVER['REMOTE_ADDR'] ) ? $_SERVER['REMOTE_ADDR'] : ''; + $user_id = get_current_user_id(); + if ( ! get_query_var( 'um_action' ) ) + exit( __( 'Wrong action', 'ultimate-member' ) ); + + if ( ! get_query_var( 'um_resource' ) ) + exit( __( 'Wrong resource', 'ultimate-member' ) ); + + $verify = false; + if ( get_query_var( 'um_action' ) == 'route' ) + $verify = wp_verify_nonce( get_query_var( 'um_verify' ), $ip . $user_id . get_query_var( 'um_resource' ) . get_query_var( 'um_method' ) ); + + if ( $verify ) { + if ( get_query_var( 'um_action' ) == 'route' ) { + $this->request_process( array( + 'route' => get_query_var( 'um_resource' ), + 'method' => get_query_var( 'um_method' ) + ) ); + } + } else { + exit( __( 'Wrong nonce', 'ultimate-member' ) ); + } + } + + } +} \ No newline at end of file diff --git a/includes/core/class-setup.php b/includes/core/class-setup.php new file mode 100644 index 00000000..5882929a --- /dev/null +++ b/includes/core/class-setup.php @@ -0,0 +1,219 @@ +install_basics(); + $this->install_default_forms(); + $this->set_default_settings(); + $this->set_default_role_meta(); + } + + + /*** + *** @Basics + ***/ + function install_basics() { + if ( ! get_option( '__ultimatemember_sitekey' ) ) + update_option( '__ultimatemember_sitekey', str_replace( array( 'http://', 'https://' ), '', sanitize_user( get_bloginfo('url') ) ) . '-' . wp_generate_password( 20, false ) ); + } + + + /*** + *** @Default Forms + ***/ + function install_default_forms() { + + if ( current_user_can( 'manage_options' ) && ! get_option( 'um_is_installed' ) ) { + + update_option( 'um_is_installed', 1 ); + + //Install default options + foreach ( UM()->config()->settings_defaults as $key => $value ) { + UM()->um_update_option( $key, $value ); + } + + // Install Core Forms + foreach ( UM()->config()->core_forms as $id ) { + + /** + If page does not exist + Create it + **/ + $page_exists = UM()->query()->find_post_id( 'um_form', '_um_core', $id ); + if ( ! $page_exists ) { + + if ( $id == 'register' ) { + $title = 'Default Registration'; + } else if ( $id == 'login' ) { + $title = 'Default Login'; + } else { + $title = 'Default Profile'; + } + + $form = array( + 'post_type' => 'um_form', + 'post_title' => $title, + 'post_status' => 'publish', + 'post_author' => get_current_user_id(), + ); + + $form_id = wp_insert_post( $form ); + + foreach( UM()->config()->core_form_meta[$id] as $key => $value ) { + if ( $key == '_um_custom_fields' ) { + $array = unserialize( $value ); + update_post_meta( $form_id, $key, $array ); + } else { + update_post_meta( $form_id, $key, $value ); + } + } + + $this->setup_shortcode[$id] = '[ultimatemember form_id='.$form_id.']'; + + $core_forms[ $form_id ] = $form_id; + + } + /** DONE **/ + + } + + if ( isset( $core_forms ) ) update_option( 'um_core_forms', $core_forms ); + + // Install Core Directories + foreach ( UM()->config()->core_directories as $id ) { + + /** + If page does not exist + Create it + **/ + $page_exists = UM()->query()->find_post_id( 'um_directory', '_um_core', $id ); + if ( ! $page_exists ) { + + $title = 'Members'; + + $form = array( + 'post_type' => 'um_directory', + 'post_title' => $title, + 'post_status' => 'publish', + 'post_author' => get_current_user_id(), + ); + + $form_id = wp_insert_post( $form ); + + foreach ( UM()->config()->core_directory_meta[$id] as $key => $value ) { + if ( $key == '_um_custom_fields' ) { + $array = unserialize( $value ); + update_post_meta( $form_id, $key, $array ); + } else { + update_post_meta($form_id, $key, $value); + } + } + + $this->setup_shortcode[$id] = '[ultimatemember form_id='.$form_id.']'; + + $core_directories[ $form_id ] = $form_id; + + } + /** DONE **/ + + } + + if ( isset( $core_directories ) ) update_option( 'um_core_directories', $core_directories ); + + + // Install Core Pages + $core_pages = array(); + foreach ( UM()->config()->core_pages as $slug => $array ) { + + /** + If page does not exist + Create it + **/ + $page_exists = UM()->query()->find_post_id( 'page', '_um_core', $slug ); + if ( ! $page_exists ) { + + if ( $slug == 'logout' ) { + $content = ''; + } else if ( $slug == 'account' ) { + $content = '[ultimatemember_account]'; + } else if ( $slug == 'password-reset' ) { + $content = '[ultimatemember_password]'; + } else if ( $slug == 'user' ){ + $content = $this->setup_shortcode['profile']; + } else { + $content = $this->setup_shortcode[$slug]; + } + + $user_page = array( + 'post_title' => $array['title'], + 'post_content' => $content, + 'post_name' => $slug, + 'post_type' => 'post', + 'post_status' => 'publish', + 'post_author' => get_current_user_id(), + 'comment_status' => 'closed' + ); + + $post_id = wp_insert_post( $user_page ); + wp_update_post( array( 'ID' => $post_id, 'post_type' => 'page' ) ); + + update_post_meta( $post_id, '_um_core', $slug ); + + $core_pages[ $slug ] = $post_id; + + } else { + $core_pages[ $slug ] = $page_exists; + } + /** DONE **/ + } + + foreach ( $core_pages as $slug => $page_id ) { + UM()->um_update_option( apply_filters( 'um_core_page_id_filter', 'core_' . $slug ), $page_id ); + } + } + + } + + + /** + * Set default UM settings + */ + function set_default_settings() { + $options = get_option( 'um_options' ); + $options = empty( $options ) ? array() : $options; + + foreach ( UM()->config()->settings_defaults as $key => $value ) { + //set new options to default + if ( ! isset( $options[$key] ) ) + UM()->um_update_option( $key, $value ); + + } + } + + + /** + * Set UM roles meta to Default WP roles + */ + function set_default_role_meta() { + foreach ( UM()->config()->default_roles_metadata as $role => $meta ) { + update_option( "um_role_{$role}_meta", $meta ); + } + } + } +} \ No newline at end of file diff --git a/includes/core/class-shortcodes.php b/includes/core/class-shortcodes.php new file mode 100644 index 00000000..4dae5ea3 --- /dev/null +++ b/includes/core/class-shortcodes.php @@ -0,0 +1,604 @@ +message_mode = false; + + $this->loop = array(); + + add_shortcode( 'ultimatemember', array( &$this, 'ultimatemember' ) ); + + add_shortcode('um_loggedin', array(&$this, 'um_loggedin')); + add_shortcode('um_loggedout', array(&$this, 'um_loggedout')); + add_shortcode('um_show_content', array(&$this, 'um_shortcode_show_content_for_role') ); + add_shortcode('ultimatemember_searchform', array(&$this, 'ultimatemember_searchform') ); + + + add_filter('body_class', array(&$this, 'body_class'), 0); + + $base_uri = apply_filters('um_emoji_base_uri', 'https://s.w.org/images/core/emoji/'); + + $this->emoji[':)'] = $base_uri . '72x72/1f604.png'; + $this->emoji[':smiley:'] = $base_uri . '72x72/1f603.png'; + $this->emoji[':D'] = $base_uri . '72x72/1f600.png'; + $this->emoji[':$'] = $base_uri . '72x72/1f60a.png'; + $this->emoji[':relaxed:'] = $base_uri . '72x72/263a.png'; + $this->emoji[';)'] = $base_uri . '72x72/1f609.png'; + $this->emoji[':heart_eyes:'] = $base_uri . '72x72/1f60d.png'; + $this->emoji[':kissing_heart:'] = $base_uri . '72x72/1f618.png'; + $this->emoji[':kissing_closed_eyes:'] = $base_uri . '72x72/1f61a.png'; + $this->emoji[':kissing:'] = $base_uri . '72x72/1f617.png'; + $this->emoji[':kissing_smiling_eyes:'] = $base_uri . '72x72/1f619.png'; + $this->emoji[';P'] = $base_uri . '72x72/1f61c.png'; + $this->emoji[':P'] = $base_uri . '72x72/1f61b.png'; + $this->emoji[':stuck_out_tongue_closed_eyes:'] = $base_uri . '72x72/1f61d.png'; + $this->emoji[':flushed:'] = $base_uri . '72x72/1f633.png'; + $this->emoji[':grin:'] = $base_uri . '72x72/1f601.png'; + $this->emoji[':pensive:'] = $base_uri . '72x72/1f614.png'; + $this->emoji[':relieved:'] = $base_uri . '72x72/1f60c.png'; + $this->emoji[':unamused'] = $base_uri . '72x72/1f612.png'; + $this->emoji[':('] = $base_uri . '72x72/1f61e.png'; + $this->emoji[':persevere:'] = $base_uri . '72x72/1f623.png'; + $this->emoji[":'("] = $base_uri . '72x72/1f622.png'; + $this->emoji[':joy:'] = $base_uri . '72x72/1f602.png'; + $this->emoji[':sob:'] = $base_uri . '72x72/1f62d.png'; + $this->emoji[':sleepy:'] = $base_uri . '72x72/1f62a.png'; + $this->emoji[':disappointed_relieved:'] = $base_uri . '72x72/1f625.png'; + $this->emoji[':cold_sweat:'] = $base_uri . '72x72/1f630.png'; + $this->emoji[':sweat_smile:'] = $base_uri . '72x72/1f605.png'; + $this->emoji[':sweat:'] = $base_uri . '72x72/1f613.png'; + $this->emoji[':weary:'] = $base_uri . '72x72/1f629.png'; + $this->emoji[':tired_face:'] = $base_uri . '72x72/1f62b.png'; + $this->emoji[':fearful:'] = $base_uri . '72x72/1f628.png'; + $this->emoji[':scream:'] = $base_uri . '72x72/1f631.png'; + $this->emoji[':angry:'] = $base_uri . '72x72/1f620.png'; + $this->emoji[':rage:'] = $base_uri . '72x72/1f621.png'; + $this->emoji[':triumph'] = $base_uri . '72x72/1f624.png'; + $this->emoji[':confounded:'] = $base_uri . '72x72/1f616.png'; + $this->emoji[':laughing:'] = $base_uri . '72x72/1f606.png'; + $this->emoji[':yum:'] = $base_uri . '72x72/1f60b.png'; + $this->emoji[':mask:'] = $base_uri . '72x72/1f637.png'; + $this->emoji[':cool:'] = $base_uri . '72x72/1f60e.png'; + $this->emoji[':sleeping:'] = $base_uri . '72x72/1f634.png'; + $this->emoji[':dizzy_face:'] = $base_uri . '72x72/1f635.png'; + $this->emoji[':astonished:'] = $base_uri . '72x72/1f632.png'; + $this->emoji[':worried:'] = $base_uri . '72x72/1f61f.png'; + $this->emoji[':frowning:'] = $base_uri . '72x72/1f626.png'; + $this->emoji[':anguished:'] = $base_uri . '72x72/1f627.png'; + $this->emoji[':smiling_imp:'] = $base_uri . '72x72/1f608.png'; + $this->emoji[':imp:'] = $base_uri . '72x72/1f47f.png'; + $this->emoji[':open_mouth:'] = $base_uri . '72x72/1f62e.png'; + $this->emoji[':grimacing:'] = $base_uri . '72x72/1f62c.png'; + $this->emoji[':neutral_face:'] = $base_uri . '72x72/1f610.png'; + $this->emoji[':confused:'] = $base_uri . '72x72/1f615.png'; + $this->emoji[':hushed:'] = $base_uri . '72x72/1f62f.png'; + $this->emoji[':no_mouth:'] = $base_uri . '72x72/1f636.png'; + $this->emoji[':innocent:'] = $base_uri . '72x72/1f607.png'; + $this->emoji[':smirk:'] = $base_uri . '72x72/1f60f.png'; + $this->emoji[':expressionless:'] = $base_uri . '72x72/1f611.png'; + + } + + /*** + *** @emoji support + */ + function emotize($content) { + $content = stripslashes($content); + foreach ($this->emoji as $code => $val) { + $regex = str_replace(array('(', ')'), array("\\" . '(', "\\" . ')'), $code); + $content = preg_replace('/(' . $regex . ')(\s|$)/', '' . $code . '$2', $content); + } + return $content; + } + + /*** + *** @extend body classes + */ + function body_class($classes) { + $array = UM()->config()->permalinks; + if (!$array) { + return $classes; + } + + foreach ($array as $slug => $info) { + if (um_is_core_page($slug)) { + + $classes[] = 'um-page-' . $slug; + + if (is_user_logged_in()) { + $classes[] = 'um-page-loggedin'; + } else { + $classes[] = 'um-page-loggedout'; + } + + } + } + + if( um_is_core_page('user') && um_is_user_himself() ){ + $classes[] = 'um-own-profile'; + } + + return $classes; + } + + /*** + *** @Retrieve core login form + */ + function core_login_form() { + $forms = get_posts(array('post_type' => 'um_form', 'posts_per_page' => 1, 'meta_key' => '_um_core', 'meta_value' => 'login')); + $form_id = isset( $forms[0]->ID ) ? $forms[0]->ID: 0; + + return $form_id; + } + + /*** + *** @load a compatible template + */ + function load_template($tpl) { + $loop = ($this->loop) ? $this->loop : array(); + + if (isset($this->set_args) && is_array($this->set_args)) { + $args = $this->set_args; + extract($args); + } + + $file = um_path . 'templates/' . $tpl . '.php'; + $theme_file = get_stylesheet_directory() . '/ultimate-member/templates/' . $tpl . '.php'; + + if (file_exists($theme_file)) { + $file = $theme_file; + } + + if (file_exists($file)) { + include $file; + } + + } + + /*** + *** @Add class based on shortcode + */ + function get_class($mode, $args = array()) { + + $classes = 'um-' . $mode; + + if (is_admin()) { + $classes .= ' um-in-admin'; + } + + if (isset(UM()->form()->errors) && UM()->form()->errors) { + $classes .= ' um-err'; + } + + if (UM()->fields()->editing == true) { + $classes .= ' um-editing'; + } + + if (UM()->fields()->viewing == true) { + $classes .= ' um-viewing'; + } + + if (isset($args['template']) && $args['template'] != $args['mode']) { + $classes .= ' um-' . $args['template']; + } + + $classes = apply_filters('um_form_official_classes__hook', $classes); + return $classes; + } + + /*** + *** @Logged-in only content + */ + function um_loggedin($args = array(), $content = "") { + ob_start(); + + $defaults = array( + 'lock_text' => __('This content has been restricted to logged in users only. Please login to view this content.', 'ultimate-member'), + 'show_lock' => 'yes', + ); + + $args = wp_parse_args($args, $defaults); + + $args['lock_text'] = $this->convert_locker_tags($args['lock_text']); + + if (!is_user_logged_in()) { + if ($args['show_lock'] == 'no') { + echo ''; + } else { + UM()->shortcodes()->set_args = $args; + UM()->shortcodes()->load_template('login-to-view'); + } + } else { + echo do_shortcode($this->convert_locker_tags(wpautop($content))); + } + + $output = ob_get_contents(); + ob_end_clean(); + return $output; + } + + /*** + *** @Logged-out only content + */ + function um_loggedout($args = array(), $content = "") { + ob_start(); + + // Hide for logged in users + if (is_user_logged_in()) { + echo ''; + } else { + echo do_shortcode(wpautop($content)); + } + + $output = ob_get_contents(); + ob_end_clean(); + return $output; + } + + /*** + *** @Shortcode + */ + function ultimatemember($args = array()) { + return $this->load($args); + } + + /*** + *** @Load a module with global function + */ + function load($args) { + ob_start(); + + $defaults = array(); + $args = wp_parse_args($args, $defaults); + + // when to not continue + $this->form_id = (isset($args['form_id'])) ? $args['form_id'] : null; + if (!$this->form_id) { + return; + } + + $this->form_status = get_post_status($this->form_id); + if ($this->form_status != 'publish') { + return; + } + + // get data into one global array + $post_data = UM()->query()->post_data($this->form_id); + + $args = apply_filters('um_pre_args_setup', $post_data); + + if (!isset($args['template'])) { + $args['template'] = ''; + } + + if (isset($post_data['template']) && $post_data['template'] != $args['template']) { + $args['template'] = $post_data['template']; + } + + if (!$this->template_exists($args['template'])) { + $args['template'] = $post_data['mode']; + } + + if (!isset($post_data['template'])) { + $post_data['template'] = $post_data['mode']; + } + + $args = array_merge($post_data, $args); + + if (isset($args['use_globals']) && $args['use_globals'] == 1) { + $args = array_merge($args, $this->get_css_args($args)); + } else { + $args = array_merge($this->get_css_args($args), $args); + } + + // filter for arguments + $args = apply_filters('um_shortcode_args_filter', $args); + + extract($args, EXTR_SKIP); + + // for profiles only + if ($mode == 'profile' && um_profile_id() && isset($args['role']) && $args['role'] && + $args['role'] != UM()->roles()->um_get_user_role( um_profile_id() ) ) { + return; + } + + // start loading the template here + do_action("um_pre_{$mode}_shortcode", $args); + + do_action("um_before_form_is_loaded", $args); + + do_action("um_before_{$mode}_form_is_loaded", $args); + + $this->template_load( $template, $args ); + + $this->dynamic_css( $args ); + + if (um_get_requested_user() || $mode == 'logout') { + um_reset_user(); + } + + do_action('um_after_everything_output'); + + $output = ob_get_contents(); + ob_end_clean(); + return $output; + } + + /*** + *** @Get dynamic css args + */ + function get_css_args($args) { + $arr = um_styling_defaults($args['mode']); + $arr = array_merge($arr, array('form_id' => $args['form_id'], 'mode' => $args['mode'])); + return $arr; + } + + /*** + *** @Load dynamic css + */ + function dynamic_css($args = array()) { + extract($args); + + $global = um_path . 'assets/dynamic_css/dynamic_global.php'; + + if (isset($mode)) { + $file = um_path . 'assets/dynamic_css/dynamic_' . $mode . '.php'; + } + + include $global; + + if (isset($file) && file_exists($file)) { + include $file; + } + + if (isset($args['custom_css'])) { + $css = $args['custom_css']; + ?>shortcodes()->set_args = $args; + } + UM()->shortcodes()->load_template($template); + } + + /*** + *** @Checks if a template file exists + */ + function template_exists($template) { + + $file = um_path . 'templates/' . $template . '.php'; + $theme_file = get_stylesheet_directory() . '/ultimate-member/templates/' . $template . '.php'; + + if (file_exists($theme_file) || file_exists($file)) { + return true; + } + + return false; + } + + /*** + *** @Get File Name without path and extension + */ + function get_template_name($file) { + $file = basename($file); + $file = preg_replace('/\\.[^.\\s]{3,4}$/', '', $file); + return $file; + } + + /*** + *** @Get Templates + */ + function get_templates($excluded = null) { + + if ($excluded) { + $array[$excluded] = __('Default Template', 'ultimate-member'); + } + + $paths[] = glob(um_path . 'templates/' . '*.php'); + + if (file_exists(get_stylesheet_directory() . '/ultimate-member/templates/')) { + $paths[] = glob(get_stylesheet_directory() . '/ultimate-member/templates/' . '*.php'); + } + + if( isset( $paths ) && ! empty( $paths ) ){ + + foreach ($paths as $k => $files) { + + if( isset( $files ) && ! empty( $files ) ){ + + foreach ($files as $file) { + + $clean_filename = $this->get_template_name( $file ); + + if ( 0 === strpos( $clean_filename, $excluded ) ) { + + $source = file_get_contents( $file ); + $tokens = token_get_all( $source ); + $comment = array( + T_COMMENT, // All comments since PHP5 + T_DOC_COMMENT, // PHPDoc comments + ); + foreach ( $tokens as $token ) { + if ( in_array( $token[0], $comment ) && strstr( $token[1], '/* Template:' ) && $clean_filename != $excluded ) { + $txt = $token[1]; + $txt = str_replace('/* Template: ', '', $txt ); + $txt = str_replace(' */', '', $txt ); + $array[ $clean_filename ] = $txt; + } + } + + } + + } + + } + + } + + } + + return $array; + + } + + /*** + *** @Get Shortcode for given form ID + */ + function get_shortcode($post_id) { + $shortcode = '[ultimatemember form_id=' . $post_id . ']'; + return $shortcode; + } + + /*** + *** @convert access lock tags + */ + function convert_locker_tags($str) { + $str = um_convert_tags($str); + return $str; + } + + /*** + *** @convert user tags in a string + */ + function convert_user_tags($str) { + + $value = ''; + + $pattern_array = array( + '{first_name}', + '{last_name}', + '{display_name}', + '{user_avatar_small}', + '{username}', + ); + + $pattern_array = apply_filters('um_allowed_user_tags_patterns', $pattern_array); + + $matches = false; + foreach ($pattern_array as $pattern) { + + if (preg_match($pattern, $str)) { + + $usermeta = str_replace('{', '', $pattern); + $usermeta = str_replace('}', '', $usermeta); + + if ($usermeta == 'user_avatar_small') { + $value = get_avatar(um_user('ID'), 40); + } elseif (um_user($usermeta)) { + $value = um_user($usermeta); + } + + if ($usermeta == 'username') { + $value = um_user('user_login'); + } + + $value = apply_filters("um_profile_tag_hook__{$usermeta}", $value, um_user('ID')); + + if ($value) { + $str = preg_replace('/' . $pattern . '/', $value, $str); + } + + } + + } + + return $str; + } + + /** + * Shortcode: Show custom content to specific role + * + * Show content to specific roles + * [um_show_content roles='member'] [/um_show_content] + * You can add multiple target roles, just use ',' e.g. [um_show_content roles='member,candidates,pets'] + * + * Hide content from specific roles + * [um_show_content not='contributors'] [/um_show_content] + * You can add multiple target roles, just use ',' e.g. [um_show_content roles='member,candidates,pets'] + * + * @param array $atts + * @param string $content + * @return string + */ + function um_shortcode_show_content_for_role( $atts = array() , $content = '' ) { + + global $user_ID; + + if( ! is_user_logged_in() ) { + return; + } + + $a = shortcode_atts( array( + 'roles' => '', + 'not' => '', + 'is_profile' => false, + ), $atts ); + + if( $a['is_profile'] ){ + um_fetch_user( um_profile_id() ); + }else{ + um_fetch_user( $user_ID ); + } + + + + $current_user_role = um_user('role'); + + if( isset( $a['not'] ) && ! empty( $a['not'] ) && isset( $a['roles'] ) && ! empty( $a['roles'] ) ){ + return do_shortcode( $content ); + } + + if( isset( $a['not'] ) && ! empty( $a['not'] ) ){ + + $not_in_roles = explode(",", $a['not'] ); + + if( is_array( $not_in_roles ) && ! in_array( $current_user_role, $not_in_roles ) ){ + return do_shortcode( $content ); + } + + }else{ + + $roles = explode(",", $a['roles'] ); + + if(is_array( $roles ) && in_array( $current_user_role, $roles ) ){ + return do_shortcode( $content ); + } + + + } + + return ''; + } + + public function ultimatemember_searchform($args = array(), $content = "") { + // turn off buffer + ob_start(); + + // load template + $this->load_template( 'searchform' ); + + // get the buffer + $template = ob_get_contents(); + + // clear the buffer + ob_end_clean(); + + return $template; + } + + } +} \ No newline at end of file diff --git a/includes/core/class-tracking.php b/includes/core/class-tracking.php new file mode 100644 index 00000000..b7273ac3 --- /dev/null +++ b/includes/core/class-tracking.php @@ -0,0 +1,158 @@ +schedule_send(); + + add_action( 'admin_notices', array( $this, 'admin_notices' ), 10 ); + + } + + /*** + *** @setup info array + ***/ + private function setup_data() { + $data = array(); + + // Retrieve current theme info + if ( get_bloginfo( 'version' ) < '3.4' ) { + $theme_data = get_theme_data( get_stylesheet_directory() . '/style.css' ); + $theme = $theme_data['Name']; + $theme_ver = $theme_data['Version']; + } else { + $theme_data = wp_get_theme(); + $theme = $theme_data->Name; + $theme_ver = $theme_data->Version; + } + + $data['url'] = home_url(); + $data['theme'] = $theme; + $data['theme_version'] = $theme_ver; + $data['wp_version'] = get_bloginfo( 'version' ); + $data['version'] = ultimatemember_version; + + // Retrieve current plugin information + if( ! function_exists( 'get_plugins' ) ) { + include ABSPATH . '/wp-admin/includes/plugin.php'; + } + + $plugins = array_keys( get_plugins() ); + $active_plugins = get_option( 'active_plugins', array() ); + + foreach ( $plugins as $key => $plugin ) { + if ( in_array( $plugin, $active_plugins ) ) { + // Remove active plugins from list so we can show active and inactive separately + unset( $plugins[ $key ] ); + } + } + + $data['active_plugins'] = $active_plugins; + $data['inactive_plugins'] = $plugins; + $data['language'] = get_bloginfo('language'); + $data['multisite'] = ( is_multisite() ) ? 1 : 0; + + UM()->setup()->install_basics(); + + $data['email'] = get_option( 'admin_email' ); + $data['unique_sitekey'] = get_option( '__ultimatemember_sitekey' ); + + $this->data = $data; + + } + + /*** + *** @check if tracking is allowed + ***/ + private function tracking_allowed() { + if ( !um_get_option('allow_tracking') ) + return 0; + return 1; + } + + /*** + *** @get last send time + ***/ + private function get_last_send() { + return get_option( 'um_tracking_last_send' ); + } + + /*** + *** @send a report + ***/ + public function send_checkin( $override = false ) { + + if( ! $this->tracking_allowed() && ! $override ) + return; + + // Send a maximum of once per period + $last_send = $this->get_last_send(); + if( $last_send && $last_send > strtotime( '-1 day' ) ) + return; + + $this->setup_data(); + + if ( !get_option('__ultimatemember_coupon_sent') ) { + $this->data['send_discount'] = 1; + } else { + $this->data['send_discount'] = 0; + } + + $request = wp_remote_post( 'https://ultimatemember.com/?um_action=checkin', array( + 'method' => 'POST', + 'timeout' => 20, + 'redirection' => 5, + 'httpversion' => '1.0', + 'blocking' => true, + 'body' => $this->data, + 'user-agent' => 'UM/' . ultimatemember_version . '; ' . get_bloginfo( 'url' ), + ) ); + + update_option( 'um_tracking_last_send', time() ); + update_option( '__ultimatemember_coupon_sent', 1 ); + } + + /*** + *** @run a scheduled report + ***/ + private function schedule_send() { + add_action( 'um_daily_scheduled_events', array( $this, 'send_checkin' ) ); + } + + /*** + *** @show admin notices + ***/ + public function admin_notices() { + + if( ! current_user_can( 'manage_options' ) ) + return; + + $hide_notice = get_option('um_tracking_notice'); + + if ( $hide_notice ) + return; + + $optin_url = esc_url( add_query_arg( 'um_adm_action', 'opt_into_tracking' ) ); + $optout_url = esc_url( add_query_arg( 'um_adm_action', 'opt_out_of_tracking' ) ); + + echo '

            '; + + echo __( 'Allow Ultimate Member to track plugin usage? Opt-in to tracking and our newsletter and we will immediately e-mail you a 20% discount which you can use to purchase our core extensions bundle. No sensitive data is tracked.', 'ultimate-member' ); + + echo '

            '; + + echo '

            ' . __( 'Allow tracking', 'ultimate-member' ) . ''; + echo ' ' . __( 'Do not allow tracking', 'ultimate-member' ) . '

            '; + + } + + } +} \ No newline at end of file diff --git a/includes/core/class-user-posts.php b/includes/core/class-user-posts.php new file mode 100644 index 00000000..f8dfda78 --- /dev/null +++ b/includes/core/class-user-posts.php @@ -0,0 +1,110 @@ +shortcodes()->modified_args = "$post_type,$posts_per_page,$offset_n,$author"; + + UM()->shortcodes()->loop = UM()->query()->make("post_type=$post_type&posts_per_page=$posts_per_page&offset=$offset&author=$author"); + + UM()->shortcodes()->load_template('profile/posts-single'); + + } + + /*** + *** @dynamic load of comments + ***/ + function load_comments( $args ) { + $array = explode(',', $args ); + $post_type = $array[0]; + $posts_per_page = $array[1]; + $offset = $array[2]; + $author = $array[3]; + + $offset_n = $posts_per_page + $offset; + + UM()->shortcodes()->modified_args = "$post_type,$posts_per_page,$offset_n,$author"; + + UM()->shortcodes()->loop = UM()->query()->make("post_type=$post_type&number=$posts_per_page&offset=$offset&user_id=$author"); + + UM()->shortcodes()->load_template('profile/comments-single'); + + } + + + /*** + *** @add posts + ***/ + function add_posts() { + UM()->shortcodes()->load_template('profile/posts'); + } + + /*** + *** @add comments + ***/ + function add_comments() { + UM()->shortcodes()->load_template('profile/comments'); + } + + /*** + *** @count posts + ***/ + function count_user_posts_by_type( $user_id= '', $post_type = 'post' ) { + global $wpdb; + if ( !$user_id ) + $user_id = um_user('ID'); + + if ( !$user_id ) return 0; + + $where = get_posts_by_author_sql( $post_type, true, $user_id ); + $count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" ); + + return apply_filters('um_pretty_number_formatting', $count); + } + + /*** + *** @count comments + ***/ + function count_user_comments( $user_id = null ) { + global $wpdb; + if ( !$user_id ) + $user_id = um_user('ID'); + + if ( !$user_id ) return 0; + + $count = $wpdb->get_var("SELECT COUNT(comment_ID) FROM " . $wpdb->comments. " WHERE user_id = " . $user_id . " AND comment_approved = '1'"); + + return apply_filters('um_pretty_number_formatting', $count); + } + + } +} \ No newline at end of file diff --git a/includes/core/class-user.php b/includes/core/class-user.php new file mode 100644 index 00000000..0bf2e5bb --- /dev/null +++ b/includes/core/class-user.php @@ -0,0 +1,1243 @@ +id = 0; + $this->usermeta = null; + $this->data = null; + $this->profile = null; + $this->cannot_edit = null; + $this->tabs = null; + + $this->banned_keys = array( + 'metabox','postbox','meta-box', + 'dismissed_wp_pointers', 'session_tokens', + 'screen_layout', 'wp_user-', 'dismissed', + 'cap_key', 'wp_capabilities', + 'managenav', 'nav_menu','user_activation_key', + 'level_', 'wp_user_level' + ); + + add_action( 'init', array( &$this, 'set' ), 1 ); + + $this->preview = false; + + // a list of keys that should never be in wp_usermeta + $this->update_user_keys = array( + 'user_email', + 'user_pass', + 'user_password', + 'display_name', + ); + + $this->target_id = null; + + // When the cache should be cleared + add_action('um_delete_user_hook', array(&$this, 'remove_cached_queue') ); + add_action('um_after_user_status_is_changed_hook', array(&$this, 'remove_cached_queue') ); + + // When user cache should be cleared + add_action('um_after_user_updated', array(&$this, 'remove_cache') ); + add_action('um_after_user_account_updated', array(&$this, 'remove_cache') ); + add_action('personal_options_update', array(&$this, 'remove_cache') ); + //add_action('edit_user_profile_update', array(&$this, 'remove_cache') ); + add_action('um_when_role_is_set', array(&$this, 'remove_cache') ); + add_action('um_when_status_is_set', array(&$this, 'remove_cache') ); + + add_action( 'show_user_profile', array( $this, 'community_role_edit' ) ); + add_action( 'edit_user_profile', array( $this, 'community_role_edit' ) ); + + add_action( 'user_new_form', array( $this, 'secondary_role_display' ) ); + add_action( 'edit_user_profile', array( $this, 'secondary_role_display' ) ); + add_action( 'show_user_profile', array( $this, 'secondary_role_display' ) ); + + add_action( 'profile_update', array( &$this, 'profile_update' ), 10, 2 ); // user_id and old_user_data + add_action( 'edit_user_profile_update', array( &$this, 'profile_update' ), 10, 1 ); + + add_action( 'user_register', array( &$this, 'user_register_via_admin' ), 10, 1 ); + + } + + + /** + * Get pending users (in queue) + */ + function get_pending_users_count() { + + if ( get_option( 'um_cached_users_queue' ) > 0 && ! isset( $_REQUEST['delete_count'] ) ) + return get_option( 'um_cached_users_queue' ); + + $args = array( 'fields' => 'ID', 'number' => 100 ); + $args['meta_query']['relation'] = 'OR'; + $args['meta_query'][] = array( + 'key' => 'account_status', + 'value' => 'awaiting_email_confirmation', + 'compare' => '=' + ); + $args['meta_query'][] = array( + 'key' => 'account_status', + 'value' => 'awaiting_admin_review', + 'compare' => '=' + ); + $args = apply_filters( 'um_admin_pending_queue_filter', $args ); + $users = new \WP_User_Query( $args ); + + delete_option( 'um_cached_users_queue' ); + add_option( 'um_cached_users_queue', $users->get_total(), '', 'no' ); + + return $users->get_total(); + } + + + function get_profile_url( $user_id, $update_slug = false ) { + + // Permalink base + $permalink_base = um_get_option( 'permalink_base' ); + + // Get user slug + $profile_slug = get_user_meta( $user_id, "um_user_profile_url_slug_{$permalink_base}", true ); + $generate_slug = um_get_option( 'um_generate_slug_in_directory' ); + + // Return existing profile slug + if ( $generate_slug && $update_slug == false && $profile_slug ) + return UM()->permalinks()->profile_permalink( $profile_slug ); + + + // Reset cache + if ( $update_slug == true ) { + delete_option( "um_cache_userdata_{$user_id}" ); + um_fetch_user( $user_id ); + } + + $userdata = get_userdata( $user_id ); + + $user_in_url = ''; + // Username + if ( $permalink_base == 'user_login' ) { + $user_in_url = $userdata->user_login; + + if ( is_email( $user_in_url ) ) { + $user_email = $user_in_url; + $user_in_url = str_replace('@','',$user_in_url); + + if( ( $pos = strrpos( $user_in_url , '.' ) ) !== false ) { + $search_length = strlen( '.' ); + $user_in_url = substr_replace( $user_in_url , '-' , $pos , $search_length ); + } + update_user_meta( $user_id , "um_email_as_username_{$user_in_url}" , $user_email ); + + } else { + + $user_in_url = sanitize_title( $user_in_url ); + + } + } + + // User ID + if ( $permalink_base == 'user_id' ) + $user_in_url = $user_id; + + // Fisrt and Last name + $full_name_permalinks = array( 'name', 'name_dash', 'name_plus' ); + if ( in_array( $permalink_base, $full_name_permalinks ) ) { + + $first_name = $userdata->first_name; + $last_name = $userdata->last_name; + $full_name = $userdata->display_name; + + $full_name = preg_replace( '/\s+/', ' ', $full_name ); // Remove double spaces + + $profile_slug = UM()->permalinks()->profile_slug( $full_name, $first_name, $last_name ); + + $duplicate_slug_hash = md5( $profile_slug ); + + $args = array( + 'meta_query' => array( + 'relation' => 'AND', + array( + 'key' => "um_user_profile_url_slug_{$permalink_base}", + 'value' => $profile_slug, + 'compare' => '=' + ), + ), + 'orderby' => 'registered', + 'order' => 'ASC', + 'fields' => array('user_registered','ID'), + ); + + $user_query = new \WP_User_Query( $args ); + + if ( $user_query->get_total() > 1 ) { + + $duplicate_names = $user_query->get_results(); + + $current = end( $duplicate_names ); + + update_option( "um_duplicate_name_{$duplicate_slug_hash}", $current->ID ); + + } + + $duplicate_id = get_option( "um_duplicate_name_{$duplicate_slug_hash}" ); + + if ( ! empty( $duplicate_id ) && $duplicate_id != $user_id ) + $full_name = $full_name . ' ' . $user_id; + + $user_in_url = UM()->permalinks()->profile_slug( $full_name, $first_name, $last_name ); + } + + update_user_meta( $user_id, "um_user_profile_url_slug_{$permalink_base}", $user_in_url ); + + return UM()->permalinks()->profile_permalink( $user_in_url ); + } + + + /** + * Backend user creation + * + * @param $user_id + */ + function user_register_via_admin( $user_id ) { + + if ( empty( $user_id ) ) + return; + + + if ( is_admin() ) { + + do_action( 'um_after_new_user_register', $user_id, $_POST ); + + } + + } + + + function profile_update( $user_id ) { + // Bail if no user ID was passed + + if ( empty( $user_id ) ) + return; + + if ( ! empty( $_POST['um-role'] ) ) { + if ( ! user_can( $user_id, $_POST['um-role'] ) ) + UM()->roles()->set_um_user_role( $user_id, $_POST['um-role'] ); + } + + $this->remove_cache( $user_id ); + } + + + /** + * Default interface for setting a ultimatemember role + * + * @param \WP_User $userdata User data + * @return void + */ + public static function secondary_role_display( $userdata ) { + $roles = array(); + + $role_keys = get_option( 'um_roles' ); + if ( $role_keys ) { + foreach ( $role_keys as $role_key ) { + $role_meta = get_option( "um_role_{$role_key}_meta" ); + + if ( $role_meta ) { + $role_meta['name'] = 'UM ' . $role_meta['name']; + $roles['um_' . $role_key] = $role_meta; + } + } + } + + if ( empty( $roles ) ) + return; + + + $style = ''; + $user_role = false; + if ( $userdata !== 'add-new-user' ) { + // Bail if current user cannot edit users + if ( ! current_user_can( 'edit_user', $userdata->ID ) ) + return; + + $user_role = UM()->roles()->um_get_user_role( $userdata->ID ); + if ( $user_role && ! empty( $userdata->roles ) && count( $userdata->roles ) == 1 ) + $style = 'style="display:none;"'; + + } ?> + +
            > + +

            + + + + + + + + +
            + +
            +
            + $val) { + $new[$key] = $this->toArray($val); + } + } else { + $new = $obj; + } + + return $new; + } + + function get_cached_data( $user_id ) { + + $disallow_cache = um_get_option('um_profile_object_cache_stop'); + if( $disallow_cache ){ + return ''; + } + + if ( is_numeric( $user_id ) && $user_id > 0 ) { + $find_user = get_option("um_cache_userdata_{$user_id}"); + if ( $find_user ) { + $find_user = apply_filters('um_user_permissions_filter', $find_user, $user_id); + return $find_user; + } + } + return ''; + } + + function setup_cache( $user_id, $profile ) { + + $disallow_cache = um_get_option('um_profile_object_cache_stop'); + if( $disallow_cache ){ + return ''; + } + + update_option( "um_cache_userdata_{$user_id}", $profile ); + } + + function remove_cache( $user_id ) { + delete_option( "um_cache_userdata_{$user_id}" ); + } + + /** + * @function set() + * + * @description This method lets you set a user. For example, to retrieve a profile or anything related to that user. + * + * @usage user->set( $user_id, $clean = false ); ?> + * + * @param $user_id (numeric) (optional) Which user to retrieve. A numeric user ID + * @param $clean (boolean) (optional) Should be true or false. Basically, if you did not provide a user ID It will set the current logged in user as a profile + * + * @returns This API method does not return anything. It sets user profile and permissions and allow you to retrieve any details for that user. + * + * @example The following example makes you set a user and retrieve their display name after that using the user API. + + user->set( 12 ); + $display_name = $ultimatemember->user->profile['display_name']; // Should print user display name + + ?> + + * + * + */ + function set( $user_id = null, $clean = false ) { + if ( isset( $this->profile ) ) { + unset( $this->profile ); + } + + if ( $user_id ) { + $this->id = $user_id; + } elseif ( is_user_logged_in() && $clean == false ) { + $this->id = get_current_user_id(); + } else { + $this->id = 0; + } + + if ( $this->get_cached_data( $this->id ) ) { + $this->profile = $this->get_cached_data( $this->id ); + } else { + + if ( $user_id ) { + + $this->id = $user_id; + $this->usermeta = get_user_meta( $user_id ); + $this->data = get_userdata( $this->id ); + + } elseif ( is_user_logged_in() && $clean == false ) { + + $this->id = get_current_user_id(); + $this->usermeta = get_user_meta($this->id); + $this->data = get_userdata($this->id); + + } else { + + $this->id = 0; + $this->usermeta = null; + $this->data = null; + + } + + // we have a user, populate a profile + if ( $this->id && $this->toArray( $this->data ) ) { + + // add user data + $this->data = $this->toArray( $this->data ); + + foreach ( $this->data as $k=>$v ) { + if ( $k == 'roles') { + $this->profile['wp_roles'] = implode(',',$v); + } else if ( is_array( $v ) ) { + foreach($v as $k2 => $v2){ + $this->profile[$k2] = $v2; + } + } else { + $this->profile[$k] = $v; + } + } + + // add account status + if ( !isset( $this->usermeta['account_status'][0] ) ) { + $this->usermeta['account_status'][0] = 'approved'; + } + + if ( $this->usermeta['account_status'][0] == 'approved' ) { + $this->usermeta['account_status_name'][0] = __('Approved','ultimate-member'); + } + + if ( $this->usermeta['account_status'][0] == 'awaiting_email_confirmation' ) { + $this->usermeta['account_status_name'][0] = __('Awaiting E-mail Confirmation','ultimate-member'); + } + + if ( $this->usermeta['account_status'][0] == 'awaiting_admin_review' ) { + $this->usermeta['account_status_name'][0] = __('Pending Review','ultimate-member'); + } + + if ( $this->usermeta['account_status'][0] == 'rejected' ) { + $this->usermeta['account_status_name'][0] = __('Membership Rejected','ultimate-member'); + } + + if ( $this->usermeta['account_status'][0] == 'inactive' ) { + $this->usermeta['account_status_name'][0] = __('Membership Inactive','ultimate-member'); + } + + // add user meta + foreach( $this->usermeta as $k=>$v ) { + if ( $k == 'display_name') continue; + $this->profile[$k] = $v[0]; + } + + // add permissions + $user_role = UM()->roles()->um_get_user_role( $this->id ); + $this->profile['role'] = ( strpos( $user_role, 'um_' ) === 0 ) ? str_replace( 'um_', '', $user_role ) : $user_role; + + $role_meta = UM()->roles()->role_data( $user_role ); + $role_meta = apply_filters( 'um_user_permissions_filter', $role_meta, $this->id ); + + /*$role_meta = array_map( function( $key, $item ) { + if ( strpos( $key, '_um_' ) === 0 ) + $key = str_replace( '_um_', '', $key ); + + return array( $key => $item ); + }, array_keys( $role_meta ), $role_meta );*/ + + $this->profile = array_merge( $this->profile, (array)$role_meta ); + + $this->profile['super_admin'] = ( is_super_admin( $this->id ) ) ? 1 : 0; + + // clean profile + $this->clean(); + + // Setup cache + $this->setup_cache( $this->id, $this->profile ); + + } + + } + + } + + /*** + *** @reset user data + ***/ + function reset( $clean = false ){ + $this->set(0, $clean); + } + + /*** + *** @Clean user profile + ***/ + function clean(){ + foreach($this->profile as $key => $value){ + foreach($this->banned_keys as $ban){ + if (strstr($key, $ban) || is_numeric($key) ) + unset($this->profile[$key]); + } + } + } + + /** + * @function auto_login() + * + * @description This method lets you auto sign-in a user to your site. + * + * @usage user->auto_login( $user_id, $rememberme = false ); ?> + * + * @param $user_id (numeric) (required) Which user ID to sign in automatically + * @param $rememberme (boolean) (optional) Should be true or false. If you want the user sign in session to use cookies, use true + * + * @returns Sign in the specified user automatically. + * + * @example The following example lets you sign in a user automatically by their ID. + + user->auto_login( 2 ); ?> + + * + * + * @example The following example lets you sign in a user automatically by their ID and makes the plugin remember their session. + + user->auto_login( 10, true ); ?> + + * + * + */ + function auto_login( $user_id, $rememberme = 0 ) { + + wp_set_current_user( $user_id ); + + wp_set_auth_cookie( $user_id, $rememberme ); + + $user = get_user_by('ID', $user_id ); + + do_action( 'wp_login', $user->user_login, $user ); + + } + + /*** + *** @Set user's registration details + ***/ + function set_registration_details( $submitted ) { + + if ( isset( $submitted['user_pass'] ) ) { + unset( $submitted['user_pass'] ); + } + + if ( isset( $submitted['user_password'] ) ) { + unset( $submitted['user_password'] ); + } + + if ( isset( $submitted['confirm_user_password'] ) ) { + unset( $submitted['confirm_user_password'] ); + } + + $submitted = apply_filters('um_before_save_filter_submitted', $submitted ); + + do_action('um_before_save_registration_details', $this->id, $submitted ); + + update_user_meta( $this->id, 'submitted', $submitted ); + + do_action('um_after_save_registration_details', $this->id, $submitted ); + + } + + /*** + *** @A plain version of password + ***/ + function set_plain_password( $plain ) { + update_user_meta( $this->id, '_um_cool_but_hard_to_guess_plain_pw', $plain ); + } + + /** + * Set last login for new registered users + */ + function set_last_login() { + update_user_meta( $this->id, '_um_last_login', current_time( 'timestamp' ) ); + } + + + function set_role( $role ){ + + do_action('um_when_role_is_set', um_user('ID') ); + + do_action('um_before_user_role_is_changed'); + + $this->profile['role'] = $role; + + do_action('um_member_role_upgrade', $role, $this->profile['role'] ); + + $this->update_usermeta_info('role'); + + do_action('um_after_user_role_is_changed'); + + do_action('um_after_user_role_is_updated', um_user('ID'), $role ); + + } + + /*** + *** @Set user's account status + ***/ + function set_status( $status ){ + + do_action( 'um_when_status_is_set', um_user('ID') ); + + $this->profile['account_status'] = $status; + + $this->update_usermeta_info('account_status'); + + do_action( 'um_after_user_status_is_changed_hook' ); + + do_action( 'um_after_user_status_is_changed', $status); + + } + + /*** + *** @Set user's hash for password reset + ***/ + function password_reset_hash(){ + $this->profile['reset_pass_hash'] = UM()->validation()->generate(); + $this->update_usermeta_info('reset_pass_hash'); + + } + + /*** + *** @Set user's hash + ***/ + function assign_secretkey(){ + do_action('um_before_user_hash_is_changed'); + + $this->profile['account_secret_hash'] = UM()->validation()->generate(); + $this->update_usermeta_info('account_secret_hash'); + + do_action('um_after_user_hash_is_changed'); + + } + + /*** + *** @password reset email + ***/ + function password_reset(){ + $this->password_reset_hash(); + UM()->mail()->send( um_user('user_email'), 'resetpw_email' ); + } + + + /*** + *** @password changed email + ***/ + function password_changed(){ + UM()->mail()->send( um_user('user_email'), 'changedpw_email' ); + } + + /** + * @function approve() + * + * @description This method approves a user membership and sends them an optional welcome/approval e-mail. + * + * @usage user->approve(); ?> + * + * @returns Approves a user membership. + * + * @example Approve a pending user and allow him to sign-in to your site. + + user->approve(); + + ?> + + * + * + */ + function approve(){ + $user_id = um_user('ID'); + delete_option( "um_cache_userdata_{$user_id}" ); + + if ( um_user('account_status') == 'awaiting_admin_review' ) { + $this->password_reset_hash(); + UM()->mail()->send( um_user('user_email'), 'approved_email' ); + + } else { + $this->password_reset_hash(); + UM()->mail()->send( um_user('user_email'), 'welcome_email'); + } + + $this->set_status('approved'); + $this->delete_meta('account_secret_hash'); + $this->delete_meta('_um_cool_but_hard_to_guess_plain_pw'); + + do_action('um_after_user_is_approved', um_user('ID') ); + + } + + /*** + *** @pending email + ***/ + function email_pending() { + $this->assign_secretkey(); + $this->set_status('awaiting_email_confirmation'); + UM()->mail()->send( um_user('user_email'), 'checkmail_email' ); + } + + /** + * @function pending() + * + * @description This method puts a user under manual review by administrator and sends them an optional e-mail. + * + * @usage user->pending(); ?> + * + * @returns Puts a user under review and sends them an email optionally. + * + * @example An example of putting a user pending manual review + + user->pending(); + + ?> + + * + * + */ + function pending(){ + $this->set_status('awaiting_admin_review'); + UM()->mail()->send( um_user('user_email'), 'pending_email' ); + } + + /** + * @function reject() + * + * @description This method rejects a user membership and sends them an optional e-mail. + * + * @usage user->reject(); ?> + * + * @returns Rejects a user membership. + * + * @example Reject a user membership example + + user->reject(); + + ?> + + * + * + */ + function reject(){ + $this->set_status('rejected'); + UM()->mail()->send( um_user('user_email'), 'rejected_email' ); + } + + /** + * @function deactivate() + * + * @description This method deactivates a user membership and sends them an optional e-mail. + * + * @usage user->deactivate(); ?> + * + * @returns Deactivates a user membership. + * + * @example Deactivate a user membership with the following example + + user->deactivate(); + + ?> + + * + * + */ + function deactivate(){ + $this->set_status('inactive'); + + do_action('um_after_user_is_inactive', um_user('ID') ); + + UM()->mail()->send( um_user('user_email'), 'inactive_email' ); + } + + /*** + *** @delete user + ***/ + function delete( $send_mail = true ) { + do_action( 'um_delete_user_hook' ); + do_action( 'um_delete_user', um_user('ID') ); + + // send email notifications + if ( $send_mail ) { + UM()->mail()->send( um_user('user_email'), 'deletion_email' ); + UM()->mail()->send( um_admin_email(), 'notification_deletion', array('admin' => true ) ); + } + + // remove uploads + UM()->files()->remove_dir( um_user_uploads_dir() ); + + // remove user + if ( is_multisite() ) { + + if ( !function_exists('wpmu_delete_user') ) { + require_once( ABSPATH . 'wp-admin/includes/ms.php' ); + } + + wpmu_delete_user( $this->id ); + + } else { + + if ( !function_exists('wp_delete_user') ) { + require_once( ABSPATH . 'wp-admin/includes/user.php' ); + } + + wp_delete_user( $this->id ); + + } + + } + + /** + * @function get_role() + * + * @description This method gets a user role in slug format. e.g. member + * + * @usage user->get_role(); ?> + * + * @returns The user role's slug. + * + * @example Do something if the user's role is paid-member + + user->get_role() == 'paid-member' ) { + // Show this to paid customers + } else { + // You are a free member + } + + ?> + + * + * + */ + function get_role() { + if ( ! empty( $this->profile['role'] ) ) { + return $this->profile['role']; + } else { + if ( $this->profile['wp_roles'] == 'administrator' ) { + return 'admin'; + } else { + return 'member'; + } + } + } + + + /*** + *** @Update one key in user meta + ***/ + function update_usermeta_info( $key ) { + // delete the key first just in case + delete_user_meta( $this->id, $key ); + update_user_meta( $this->id, $key, $this->profile[$key] ); + } + + /** + * @function delete_meta() + * + * @description This method can be used to delete user's meta key. + * + * @usage user->delete_meta( $key ); ?> + * + * @param $key (string) (required) The meta field key to remove from user + * + * @returns This method will not return anything. The specified meta key will be deleted from database for the specified user. + * + * @example Delete user's age field + + user->delete_meta( 'age' ); + + ?> + + * + * + */ + function delete_meta( $key ){ + delete_user_meta( $this->id, $key ); + } + + + /*** + *** @Get admin actions for individual user + ***/ + function get_admin_actions() { + $items = array(); + $actions = array(); + $actions = apply_filters('um_admin_user_actions_hook', $actions ); + if ( !isset( $actions ) || empty( $actions ) ) return false; + foreach($actions as $id => $arr ) { + $url = add_query_arg('um_action', $id ); + $url = add_query_arg('uid', um_profile_id(), $url ); + $items[] = '' . $arr['label'] . ''; + } + return $items; + } + + /** + * @function is_private_profile() + * + * @description This method checks if give user profile is private. + * + * @usage user->is_private_profile( $user_id ); ?> + * + * @param $user_id (numeric) (required) A user ID must be passed to check if the user profile is private + * + * @returns Returns true if user profile is private and false if user profile is public. + * + * @example This example display a specific user's name If his profile is public + + user->is_private_profile( 60 ); + if ( !$is_private ) { + echo 'User is public and his name is ' . um_user('display_name'); + } + + ?> + + * + * + */ + function is_private_profile( $user_id ) { + $privacy = get_user_meta( $user_id, 'profile_privacy', true ); + if ( $privacy == __('Only me','ultimate-member') ) { + return true; + } + return false; + } + + /** + * @function is_approved() + * + * @description This method can be used to determine If a certain user is approved or not. + * + * @usage user->is_approved( $user_id ); ?> + * + * @param $user_id (numeric) (required) The user ID to check approval status for + * + * @returns True if user is approved and false if user is not approved. + * + * @example Do something If a user's membership is approved + + user->is_approved( 55 ) { + // User account is approved + } else { + // User account is not approved + } + + ?> + + * + * + */ + function is_approved( $user_id ) { + $status = get_user_meta( $user_id, 'account_status', true ); + if ( $status == 'approved' || $status == '' ) { + return true; + } + return false; + } + + /*** + *** @Is private + ***/ + function is_private_case( $user_id, $case ) { + $privacy = get_user_meta( $user_id, 'profile_privacy', true ); + + if ( $privacy == $case ) { + $bool = apply_filters('um_is_private_filter_hook', false, $privacy, $user_id ); + return $bool; + } + + return false; + } + + /*** + *** @update files + ***/ + function update_files( $changes ) { + + foreach( $changes as $key => $uri ) { + $src = um_is_temp_upload( $uri ); + UM()->files()->new_user_upload( $this->id, $src, $key ); + } + + } + + /*** + *** @update profile + ***/ + function update_profile( $changes ) { + + $args['ID'] = $this->id; + $changes = apply_filters('um_before_update_profile', $changes, $this->id); + + // save or update profile meta + foreach( $changes as $key => $value ) { + if ( !in_array( $key, $this->update_user_keys ) ) { + + update_user_meta( $this->id, $key, $value ); + + } else { + + $args[$key] = esc_attr( $changes[$key] ); + + } + + } + + + // update user + if ( count( $args ) > 1 ) { + wp_update_user( $args ); + } + + } + + /*** + *** @user exists by meta key and value + ***/ + function user_has_metadata( $key, $value ) { + + $value = UM()->validation()->safe_name_in_url( $value ); + + $ids = get_users(array( 'fields' => 'ID', 'meta_key' => $key,'meta_value' => $value,'meta_compare' => '=') ); + if ( !isset( $ids ) || empty( $ids ) ) return false; + foreach( $ids as $k => $id ) { + if ( $id == um_user('ID') ){ + unset( $ids[$k] ); + } else { + $duplicates[] = $id; + } + } + if ( isset( $duplicates ) && !empty( $duplicates ) ) + return count( $duplicates ); + return false; + } + + + /*** + *** @user exists by name + ***/ + function user_exists_by_name( $value ) { + + // Permalink base + $permalink_base = um_get_option('permalink_base'); + + $raw_value = $value; + $value = UM()->validation()->safe_name_in_url( $value ); + $value = um_clean_user_basename( $value ); + + // Search by Profile Slug + $args = array( + "fields" => array("ID"), + 'meta_query' => array( + 'relation' => 'OR', + array( + 'key' => 'um_user_profile_url_slug_'.$permalink_base, + 'value' => strtolower( $raw_value ), + 'compare' => '=' + + ) + + ) + ); + + + $ids = new \WP_User_Query( $args ); + + if( $ids->total_users > 0 ){ + $um_user_query = current( $ids->get_results() ); + return $um_user_query->ID; + } + + // Search by Display Name or ID + $args = array( + "fields" => array("ID"), + "search" => $value, + 'search_columns' => array( 'display_name','ID' ) + ); + + $ids = new \WP_User_Query( $args ); + + if( $ids->total_users > 0 ){ + $um_user_query = current( $ids->get_results() ); + return $um_user_query->ID; + } + + + // Search By User Login + $value = str_replace(".", "_", $value ); + $value = str_replace(" ", "", $value ); + + $args = array( + "fields" => array("ID"), + "search" => $value, + 'search_columns' => array( + 'user_login', + ) + ); + + $ids = new \WP_User_Query( $args ); + + if( $ids->total_users > 0 ){ + $um_user_query = current( $ids->get_results() ); + return $um_user_query->ID; + } + + return false; + } + + + /** + * @function user_exists_by_id() + * + * @description This method checks if a user exists or not in your site based on the user ID. + * + * @usage user->user_exists_by_id( $user_id ); ?> + * + * @param $user_id (numeric) (required) A user ID must be passed to check if the user exists + * + * @returns Returns true if user exists and false if user does not exist. + * + * @example Basic Usage + + user->user_exists_by_id( 15 ); + if ( $boolean ) { + // That user exists + } + + ?> + + * + * + */ + function user_exists_by_id( $user_id ) { + $aux = get_userdata( intval( $user_id ) ); + if($aux==false){ + return false; + } else { + return $user_id; + } + } + /** + * @function user_exists_by_email_as_username() + * + * @description This method checks if a user exists or not in your site based on the user email as username + * + * @usage user->user_exists_by_email_as_username( $slug ); ?> + * + * @param $slug (string) (required) A user slug must be passed to check if the user exists + * + * @returns Returns true if user exists and false if user does not exist. + * + * @example Basic Usage + + user->user_exists_by_email_as_username( 'calumgmail-com' ); + if ( $boolean ) { + // That user exists + } + + ?> + + * + * + */ + function user_exists_by_email_as_username( $slug ){ + + $user_id = false; + + $ids = get_users( array( 'fields' => 'ID', 'meta_key' => 'um_email_as_username_'.$slug ) ); + if ( isset( $ids[0] ) && ! empty( $ids[0] ) ){ + $user_id = $ids[0]; + } + + return $user_id; + } + + /** + * Set gravatar hash id + */ + function set_gravatar( $user_id ){ + + um_fetch_user( $user_id ); + $email_address = um_user('user_email'); + $hash_email_address = ''; + + if( $email_address ){ + $hash_email_address = md5( $email_address ); + $this->profile['synced_gravatar_hashed_id'] = $hash_email_address; + $this->update_usermeta_info('synced_gravatar_hashed_id'); + } + + return $hash_email_address; + } + + } +} \ No newline at end of file diff --git a/includes/core/class-validation.php b/includes/core/class-validation.php new file mode 100644 index 00000000..646e2db5 --- /dev/null +++ b/includes/core/class-validation.php @@ -0,0 +1,187 @@ +regex_safe = '/\A[\w\-\.]+\z/'; + $this->regex_phone_number = '/\A[\d\-\.\+\(\)\ ]+\z/'; + + } + + /*** + *** @removes html from any string + ***/ + function remove_html($string) { + return wp_strip_all_tags( $string ); + } + + /*** + *** @normalize a string + ***/ + function normalize($string) { + $string = preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8')); + return $string; + } + + /*** + *** @safe name usage ( for url purposes ) + ***/ + function safe_name_in_url( $name ) { + $name = strtolower( $name ); + $name = preg_replace("/'/","", $name ); + $name = stripslashes( $name ); + $name = $this->normalize($name); + $name = rawurldecode( $name ); + return $name; + } + + /*** + *** @password test + ***/ + function strong_pass($candidate) { + $r1='/[A-Z]/'; + $r2='/[a-z]/'; + $r3='/[0-9]/'; + if(preg_match_all($r1,$candidate, $o)<1) return false; + if(preg_match_all($r2,$candidate, $o)<1) return false; + if(preg_match_all($r3,$candidate, $o)<1) return false; + return true; + } + + /*** + *** @space, dash, underscore + ***/ + function safe_username( $string ) { + + $regex_safe_username = apply_filters('um_validation_safe_username_regex',$this->regex_safe ); + + if ( is_email( $string ) ) + return true; + if ( !is_email( $string) && !preg_match( $regex_safe_username, $string ) ) + return false; + return true; + } + + /*** + *** @dash and underscore (metakey) + ***/ + function safe_string($string){ + + $regex_safe_string = apply_filters('um_validation_safe_string_regex',$this->regex_safe ); + + if ( !preg_match( $regex_safe_string, $string) ){ + return false; + } + return true; + } + + /*** + *** @is phone number + ***/ + function is_phone_number( $string ){ + if ( !$string ) + return true; + if ( !preg_match( $this->regex_phone_number, $string) ) + return false; + return true; + } + + /*** + *** @is url + ***/ + function is_url( $url, $social = false ){ + if ( !$url ) return true; + + if ( $social ) { + + if ( !filter_var($url, FILTER_VALIDATE_URL) && strstr( $url, $social ) ) { // starts with social requested + return true; + } else { + + if ( filter_var($url, FILTER_VALIDATE_URL) && strstr( $url, $social ) ) { + return true; + } elseif ( preg_match( $this->regex_safe, $url) ) { + + if ( strstr( $url, '.com' ) ){ + return false; + } else { + return true; + } + + } + + } + + } else { + + if ( strstr( $url, 'http://') || strstr( $url, 'https://') ) + return true; + + } + + return false; + } + + /*** + *** @get a random string + ***/ + function randomize( $length = 10 ) { + $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $result = ''; + for ($i = 0; $i < $length; $i++) { + $result .= $characters[rand(0, strlen($characters) - 1)]; + } + return $result; + } + + /*** + *** @generate a password, hash, or similar + ***/ + function generate( $length = 40 ) { + return wp_generate_password( $length, false ); + } + + /*** + *** @random numbers only + ***/ + function random_number($len = false) { + $ints = array(); + $len = $len ? $len : rand(2,9); + if($len > 9) + { + trigger_error('Maximum length should not exceed 9'); + return 0; + } + while(true) + { + $current = rand(0,9); + if(!in_array($current,$ints)) + { + $ints[] = $current; + } + if(count($ints) == $len) + { + return implode($ints); + } + } + } + + /*** + *** @To validate given date input + ***/ + function validate_date( $date, $format='YYYY/MM/D' ) { + if ( strlen( $date ) < strlen($format) ) return false; + if ( $date[4] != '/' ) return false; + if ( $date[7] != '/' ) return false; + if ( false === strtotime($date) ) return false; + return true; + } + + } +} \ No newline at end of file diff --git a/includes/core/um-actions-access.php b/includes/core/um-actions-access.php new file mode 100644 index 00000000..4ef3b20e --- /dev/null +++ b/includes/core/um-actions-access.php @@ -0,0 +1,350 @@ +permalinks()->get_current_url( get_option( 'permalink_structure' ) ); + $current_url = untrailingslashit( $current_url ); + $current_url_slash = trailingslashit( $current_url ); + + if ( isset( $post->ID ) && ( in_array( $current_url, $redirects ) || in_array( $current_url_slash, $redirects ) ) ) { + // allow + }else { + UM()->access()->redirect_handler = UM()->access()->set_referer( $redirect, "global" ); + } + + // Disallow access in homepage + if( /*is_front_page() ||*/ is_home() ){ + $home_page_accessible = um_get_option( "home_page_accessible" ); + if ( $home_page_accessible == 0 ) { + UM()->access()->redirect_handler = UM()->access()->set_referer( $redirect, "global" ); + + wp_redirect( UM()->access()->redirect_handler ); exit; + } + + } + + // Disallow access in category pages + if ( is_category() ){ + $category_page_accessible = um_get_option("category_page_accessible"); + if ( $category_page_accessible == 0 ) { + UM()->access()->redirect_handler = UM()->access()->set_referer( $redirect, "global" ); + wp_redirect( UM()->access()->redirect_handler ); exit; + } else { + UM()->access()->allow_access = true; + } + } + } + + + $current_page_type = um_get_current_page_type(); + + do_action("um_access_post_type",$current_page_type); + do_action("um_access_post_type_{$current_page_type}"); + } + + /** + * Custom User homepage redirection + */ + add_action( "um_access_user_custom_homepage", "um_access_user_custom_homepage" ); + function um_access_user_custom_homepage() { + if( ! is_user_logged_in() ) return; + if ( ! is_home() ) return; + + $role_meta = UM()->roles()->role_data( um_user( 'role' ) ); + + if ( empty( $role_meta['default_homepage'] ) ) { + + $redirect_to = ! empty( $role_meta['redirect_homepage'] ) ? $role_meta['redirect_homepage'] : um_get_core_page( 'user' ); + + $redirect_to = UM()->access()->set_referer( $redirect_to, "custom_homepage" ); + + wp_redirect( $redirect_to ); + exit; + + } + } + + /** + * Front page access settings + */ + add_action('um_access_frontpage_per_role','um_access_frontpage_per_role'); + function um_access_frontpage_per_role() { + global $post; + + if ( is_admin() ) return; + /*if ( ! is_front_page() ) return;*/ + if( is_404() ) return; + + if ( ! isset( $um_post_id ) && isset( $post->ID ) ){ + $um_post_id = $post->ID; + } + + if( ! isset( $um_post_id ) ){ + return; + } + + $args = UM()->access()->get_meta( $um_post_id ); + extract( $args ); + + if ( !isset( $args['custom_access_settings'] ) || $args['custom_access_settings'] == 0 ) { + + $um_post_id = apply_filters('um_access_control_for_parent_posts', $um_post_id ); + + $args = UM()->access()->get_meta( $um_post_id ); + extract( $args ); + + if ( !isset( $args['custom_access_settings'] ) || $args['custom_access_settings'] == 0 ) { + return; + } + + } + + $redirect_to = null; + + if ( !isset( $accessible ) ) return; + + switch( $accessible ) { + + case 0: + UM()->access()->allow_access = true; + UM()->access()->redirect_handler = false; // open to everyone + + break; + + case 1: + + $redirect_to = $access_redirect2; + + if ( is_user_logged_in() ){ + UM()->access()->allow_access = false; + } + + if ( ! is_user_logged_in() ){ + UM()->access()->allow_access = true; + } + + if( ! empty( $redirect_to ) ){ + $redirect_to = UM()->access()->set_referer( $redirect_to, "frontpage_per_role_1a" ); + UM()->access()->redirect_handler = esc_url( $redirect_to ); + }else{ + if ( ! is_user_logged_in() ){ + $redirect_to = um_get_core_page("login"); + }else{ + $redirect_to = um_get_core_page("user"); + } + + $redirect_to = UM()->access()->set_referer( $redirect_to, "frontpage_per_role_1b" ); + UM()->access()->redirect_handler = esc_url( $redirect_to ); + } + + + break; + + case 2: + + if ( ! is_user_logged_in() ){ + + if ( empty( $access_redirect ) ) { + $access_redirect = um_get_core_page('login'); + } + + $redirect_to = $access_redirect; + $redirect_to = UM()->access()->set_referer( $redirect_to, "frontpage_per_role_2a" ); + + } + + if ( is_user_logged_in() && isset( $access_roles ) && !empty( $access_roles ) ){ + $access_roles = unserialize( $access_roles ); + $access_roles = array_filter($access_roles); + + if ( !empty( $access_roles ) && !in_array( um_user('role'), $access_roles ) ) { + if ( empty( $access_redirect ) ) { + if ( is_user_logged_in() ) { + $access_redirect = site_url(); + } else { + $access_redirect = um_get_core_page('login'); + } + } + $redirect_to = esc_url( $access_redirect ); + $redirect_to = UM()->access()->set_referer( $redirect_to, "frontpage_per_role_2b" ); + + } + } + + + UM()->access()->redirect_handler = esc_url( $redirect_to ); + + break; + + } + + } + + /** + * Posts page access settings + */ + add_action('um_access_homepage_per_role','um_access_homepage_per_role'); + function um_access_homepage_per_role() { + global $post; + + if ( is_admin() ) return; + if ( ! is_home() ) return; + if ( is_404() ) return; + + $access = um_get_option('accessible'); + + $show_on_front = get_option( 'show_on_front' ); + + if( $show_on_front == "page" ){ + + $um_post_id = get_option( 'page_for_posts' ); + + if ( $access == 2 && ! is_user_logged_in() ) { + UM()->access()->allow_access = false; + }else{ + UM()->access()->allow_access = true; + } + + }else if( $show_on_front == "posts" ){ + UM()->access()->allow_access = true; + } + + + + if ( isset( $um_post_id ) ){ + + $args = UM()->access()->get_meta( $um_post_id ); + extract( $args ); + + if ( !isset( $args['custom_access_settings'] ) || $args['custom_access_settings'] == 0 ) { + + $um_post_id = apply_filters('um_access_control_for_parent_posts', $um_post_id ); + + $args = UM()->access()->get_meta( $um_post_id ); + extract( $args ); + + if ( !isset( $args['custom_access_settings'] ) || $args['custom_access_settings'] == 0 ) { + return; + } + + } + + $redirect_to = null; + + if ( !isset( $accessible ) ) return; + + switch( $accessible ) { + + case 0: + UM()->access()->allow_access = true; + UM()->access()->redirect_handler = false; // open to everyone + + break; + + case 1: + + $redirect_to = esc_url( $access_redirect2 ); + + if ( is_user_logged_in() ){ + UM()->access()->allow_access = false; + } + + if ( ! is_user_logged_in() ){ + UM()->access()->allow_access = true; + } + + if( ! empty( $redirect_to ) ){ + $redirect_to = UM()->access()->set_referer( $redirect_to, "homepage_per_role_1a" ); + UM()->access()->redirect_handler = esc_url( $redirect_to ); + }else{ + $redirect_to = null; + if ( ! is_user_logged_in() ){ + $redirect_to = um_get_core_page("login"); + }else{ + $redirect_to = um_get_core_page("user"); + } + $redirect_to = UM()->access()->set_referer( $redirect_to, "homepage_per_role_1b" ); + UM()->access()->redirect_handler = esc_url( $redirect_to ); + } + + + break; + + case 2: + + if ( ! is_user_logged_in() ){ + + if ( empty( $access_redirect ) ) { + $access_redirect = um_get_core_page('login'); + } + + $redirect_to = $access_redirect; + $redirect_to = UM()->access()->set_referer( $redirect_to, "homepage_per_role_2a" ); + } + + if ( is_user_logged_in() && isset( $access_roles ) && !empty( $access_roles ) ){ + $access_roles = unserialize( $access_roles ); + $access_roles = array_filter($access_roles); + + if ( !empty( $access_roles ) && !in_array( um_user('role'), $access_roles ) ) { + if ( !$access_redirect ) { + if ( is_user_logged_in() ) { + $access_redirect = site_url(); + } else { + $access_redirect = um_get_core_page('login'); + } + } + + $redirect_to = $access_redirect; + $redirect_to = UM()->access()->set_referer( $redirect_to, "homepage_per_role_2b" ); + + } + } + UM()->access()->redirect_handler = esc_url( $redirect_to ); + + break; + + } + } + } + + + /** + * Profile Access + */ + add_action( 'um_access_profile', 'um_access_profile' ); + function um_access_profile( $user_id ) { + + if ( ! um_is_myprofile() && um_is_core_page( 'user' ) && ! current_user_can( 'edit_users' ) ) { + + um_fetch_user( $user_id ); + + if ( ! in_array( um_user( 'account_status' ), array( 'approved' ) ) ) { + um_redirect_home(); + } + + um_reset_user(); + + } + } \ No newline at end of file diff --git a/core/um-actions-account.php b/includes/core/um-actions-account.php similarity index 78% rename from core/um-actions-account.php rename to includes/core/um-actions-account.php index 3b91d217..555f7103 100644 --- a/core/um-actions-account.php +++ b/includes/core/um-actions-account.php @@ -5,17 +5,15 @@ */ add_action('um_submit_account_details','um_submit_account_details'); function um_submit_account_details( $args ) { - global $ultimatemember; - $tab = ( get_query_var('um_tab') ) ? get_query_var('um_tab') : 'general'; - + if ( $_POST['user_password'] && $_POST['confirm_user_password'] ) { $changes['user_pass'] = $_POST['user_password']; $args['id'] = um_user('ID'); - + do_action('send_password_change_email', $args ); - + wp_set_password( $changes['user_pass'], um_user('ID') ); wp_signon( array('user_login' => um_user('user_login'), 'user_password' => $changes['user_pass']) ); @@ -51,7 +49,7 @@ // fired on account page, just before updating profile do_action('um_account_pre_update_profile', $changes, um_user('ID') ); - $ultimatemember->user->update_profile( $changes ); + UM()->user()->update_profile( $changes ); // delete account $user = get_user_by('login', um_user('user_login') ); @@ -60,7 +58,7 @@ if ( isset( $_POST['single_user_password'] ) && wp_check_password( $_POST['single_user_password'], $user->data->user_pass, $user->data->ID ) && $current_tab == 'delete' ) { if ( current_user_can('delete_users') || um_user('can_delete_profile') ) { if ( !um_user('super_admin') ) { - $ultimatemember->user->delete(); + UM()->user()->delete(); if ( um_user('after_delete') && um_user('after_delete') == 'redirect_home' ) { um_redirect_home(); } elseif ( um_user('delete_redirect_url') ) { @@ -76,13 +74,13 @@ do_action('um_after_user_account_updated', get_current_user_id() ); - $url = $ultimatemember->account->tab_link( $tab ); + $url = UM()->account()->tab_link( $tab ); $url = add_query_arg( 'updated', 'account', $url ); if ( function_exists('icl_get_current_language') ) { if ( icl_get_current_language() != icl_get_default_language() ) { - $url = $ultimatemember->permalinks->get_current_url( true ); + $url = UM()->permalinks()->get_current_url( true ); $url = add_query_arg( 'updated', 'account', $url ); exit( wp_redirect( $url ) ); } @@ -97,8 +95,6 @@ */ add_action('um_submit_account_errors_hook','um_submit_account_errors_hook'); function um_submit_account_errors_hook( $args ) { - global $ultimatemember; - $current_tab = isset( $_POST['_um_account_tab'] ) ? $_POST['_um_account_tab']: ''; $user = get_user_by('login', um_user('user_login') ); @@ -111,28 +107,28 @@ $account_name_require = um_get_option("account_name_require"); if ( isset($_POST['first_name']) && ( strlen(trim( $_POST['first_name'] ) ) == 0 && $account_name_require ) ) { - $ultimatemember->form->add_error('first_name', __('You must provide your first name','ultimate-member') ); + UM()->form()->add_error('first_name', __('You must provide your first name','ultimate-member') ); } if ( isset($_POST['last_name']) && ( strlen(trim( $_POST['last_name'] ) ) == 0 && $account_name_require ) ) { - $ultimatemember->form->add_error('last_name', __('You must provide your last name','ultimate-member') ); + UM()->form()->add_error('last_name', __('You must provide your last name','ultimate-member') ); } if ( isset($_POST['user_email']) && strlen(trim( $_POST['user_email'] ) ) == 0 ) { - $ultimatemember->form->add_error('user_email', __('You must provide your e-mail','ultimate-member') ); + UM()->form()->add_error('user_email', __('You must provide your e-mail','ultimate-member') ); } if ( isset($_POST['user_email']) && !is_email( $_POST['user_email'] ) ) { - $ultimatemember->form->add_error('user_email', __('Please provide a valid e-mail','ultimate-member') ); + UM()->form()->add_error('user_email', __('Please provide a valid e-mail','ultimate-member') ); } if ( email_exists( $_POST['user_email'] ) && email_exists( $_POST['user_email'] ) != get_current_user_id() ) { - $ultimatemember->form->add_error('user_email', __('Email already linked to another account','ultimate-member') ); + UM()->form()->add_error('user_email', __('Email already linked to another account','ultimate-member') ); } } } - $ultimatemember->account->current_tab = 'general'; + UM()->account()->current_tab = 'general'; // change password if ( ( isset( $_POST['current_user_password'] ) && $_POST['current_user_password'] != '' ) || @@ -141,28 +137,28 @@ if ( $_POST['current_user_password'] == '' || ! wp_check_password( $_POST['current_user_password'], $user->data->user_pass, $user->data->ID ) ) { - $ultimatemember->form->add_error('current_user_password', __('This is not your password','ultimate-member') ); - $ultimatemember->account->current_tab = 'password'; + UM()->form()->add_error('current_user_password', __('This is not your password','ultimate-member') ); + UM()->account()->current_tab = 'password'; } else { // correct password if ( $_POST['user_password'] != $_POST['confirm_user_password'] && $_POST['user_password'] ) { - $ultimatemember->form->add_error('user_password', __('Your new password does not match','ultimate-member') ); - $ultimatemember->account->current_tab = 'password'; + UM()->form()->add_error('user_password', __('Your new password does not match','ultimate-member') ); + UM()->account()->current_tab = 'password'; } if ( um_get_option('account_require_strongpass') ) { if ( strlen( utf8_decode( $_POST['user_password'] ) ) < 8 ) { - $ultimatemember->form->add_error('user_password', __('Your password must contain at least 8 characters','ultimate-member') ); + UM()->form()->add_error('user_password', __('Your password must contain at least 8 characters','ultimate-member') ); } if ( strlen( utf8_decode( $_POST['user_password'] ) ) > 30 ) { - $ultimatemember->form->add_error('user_password', __('Your password must contain less than 30 characters','ultimate-member') ); + UM()->form()->add_error('user_password', __('Your password must contain less than 30 characters','ultimate-member') ); } - if ( !$ultimatemember->validation->strong_pass( $_POST['user_password'] ) ) { - $ultimatemember->form->add_error('user_password', __('Your password must contain at least one lowercase letter, one capital letter and one number','ultimate-member') ); - $ultimatemember->account->current_tab = 'password'; + if ( ! UM()->validation()->strong_pass( $_POST['user_password'] ) ) { + UM()->form()->add_error('user_password', __('Your password must contain at least one lowercase letter, one capital letter and one number','ultimate-member') ); + UM()->account()->current_tab = 'password'; } } @@ -171,21 +167,21 @@ } if ( ! empty( $_POST['user_login'] ) && ! validate_username( $_POST['user_login'] ) ) { - $ultimatemember->form->add_error('user_login', __('Your username is invalid','ultimate-member') ); + UM()->form()->add_error('user_login', __('Your username is invalid','ultimate-member') ); return; } } // delete account if ( isset( $_POST['um_account_submit'] ) && $_POST['_um_account_tab'] == "delete" ) { if ( strlen(trim( $_POST['single_user_password'] ) ) == 0 ) { - $ultimatemember->form->add_error('single_user_password', __('You must enter your password','ultimate-member') ); + UM()->form()->add_error('single_user_password', __('You must enter your password','ultimate-member') ); } else { if ( ! wp_check_password( $_POST['single_user_password'], $user->data->user_pass, $user->data->ID ) ) { - $ultimatemember->form->add_error('single_user_password', __('This is not your password','ultimate-member') ); + UM()->form()->add_error('single_user_password', __('This is not your password','ultimate-member') ); } } - $ultimatemember->account->current_tab = 'delete'; + UM()->account()->current_tab = 'delete'; } } @@ -195,12 +191,11 @@ */ add_action('um_account_page_hidden_fields','um_account_page_hidden_fields'); function um_account_page_hidden_fields( $args ) { - global $ultimatemember; ?> - account->current_tab; ?> + account()->current_tab; ?> @@ -213,10 +208,9 @@ */ add_action('um_account_tab__delete', 'um_account_tab__delete'); function um_account_tab__delete( $info ) { - global $ultimatemember; extract( $info ); - $output = $ultimatemember->account->get_tab_output('delete'); + $output = UM()->account()->get_tab_output('delete'); if ( $output ) { ?> @@ -245,10 +239,9 @@ */ add_action('um_account_tab__privacy', 'um_account_tab__privacy'); function um_account_tab__privacy( $info ) { - global $ultimatemember; extract( $info ); - $output = $ultimatemember->account->get_tab_output('privacy'); + $output = UM()->account()->get_tab_output('privacy'); if ( $output ) { ?> @@ -275,10 +268,9 @@ */ add_action('um_account_tab__general', 'um_account_tab__general'); function um_account_tab__general( $info ) { - global $ultimatemember; extract( $info ); - $output = $ultimatemember->account->get_tab_output('general'); + $output = UM()->account()->get_tab_output('general'); if ( $output ) { ?> @@ -305,10 +297,9 @@ */ add_action('um_account_tab__password', 'um_account_tab__password'); function um_account_tab__password( $info ) { - global $ultimatemember; extract( $info ); - $output = $ultimatemember->account->get_tab_output('password'); + $output = UM()->account()->get_tab_output('password'); if ( $output ) { ?> @@ -335,10 +326,9 @@ */ add_action('um_account_tab__notifications', 'um_account_tab__notifications'); function um_account_tab__notifications( $info ) { - global $ultimatemember; extract( $info ); - $output = $ultimatemember->account->get_tab_output('notifications'); + $output = UM()->account()->get_tab_output('notifications'); if ( $output ) { ?> @@ -371,7 +361,6 @@ */ add_action('um_account_user_photo_hook__mobile', 'um_account_user_photo_hook__mobile'); function um_account_user_photo_hook__mobile( $args ) { - global $ultimatemember; extract( $args ); ?> @@ -396,7 +385,6 @@ */ add_action('um_account_user_photo_hook', 'um_account_user_photo_hook'); function um_account_user_photo_hook( $args ) { - global $ultimatemember; extract( $args ); ?> @@ -405,7 +393,7 @@ - mobile->isMobile() ) { ?> + mobile()->isMobile() ) { ?> @@ -431,12 +419,11 @@ */ add_action('um_account_display_tabs_hook', 'um_account_display_tabs_hook'); function um_account_display_tabs_hook( $args ) { - global $ultimatemember; extract( $args ); - $ultimatemember->account->tabs = apply_filters('um_account_page_default_tabs_hook', $tabs=array() ); + UM()->account()->tabs = apply_filters('um_account_page_default_tabs_hook', $tabs=array() ); - ksort( $ultimatemember->account->tabs ); + ksort( UM()->account()->tabs ); ?> @@ -444,17 +431,17 @@ account->tabs as $k => $arr ) { + foreach( UM()->account()->tabs as $k => $arr ) { foreach( $arr as $id => $info ) { extract( $info ); - $current_tab = $ultimatemember->account->current_tab; + $current_tab = UM()->account()->current_tab; if ( isset($info['custom']) || um_get_option('account_tab_'.$id ) == 1 || $id == 'general' ) { ?>
          • -
            +
            @@ -78,10 +76,9 @@ */ add_action('um_pre_directory_shortcode', 'um_pre_directory_shortcode'); function um_pre_directory_shortcode($args) { - global $ultimatemember; extract( $args ); - $ultimatemember->members->results = $ultimatemember->members->get_members( $args ); + UM()->members()->results = UM()->members()->get_members( $args ); } @@ -90,12 +87,11 @@ */ add_action('um_members_directory_head', 'um_members_directory_head'); function um_members_directory_head( $args ) { - global $ultimatemember; extract( $args ); if ( isset($_REQUEST['um_search']) ) { $is_filtering = 1; - } else if ( $ultimatemember->is_filtering == 1 ) { + } else if ( UM()->is_filtering == 1 ) { $is_filtering = 1; } else { $is_filtering = 0; @@ -118,7 +114,6 @@ */ add_action('um_members_directory_footer', 'um_members_directory_pagination'); function um_members_directory_pagination( $args ) { - global $ultimatemember; extract( $args ); @@ -136,7 +131,7 @@ @@ -146,13 +141,13 @@
            - + 1 ) { ?> - + @@ -164,7 +159,7 @@ - + @@ -172,13 +167,13 @@ - + - + @@ -196,8 +191,6 @@ */ add_action('um_members_directory_display', 'um_members_directory_display'); function um_members_directory_display( $args ) { - global $ultimatemember; - extract( $args ); if ( isset( $args['search'] ) && $args['search'] == 1 && isset( $args['must_search'] ) && $args['must_search'] == 1 && !isset( $_REQUEST['um_search'] ) ) diff --git a/core/um-actions-misc.php b/includes/core/um-actions-misc.php similarity index 88% rename from core/um-actions-misc.php rename to includes/core/um-actions-misc.php index dea9083c..5bb5b474 100644 --- a/core/um-actions-misc.php +++ b/includes/core/um-actions-misc.php @@ -6,8 +6,6 @@ add_action('um_after_form_fields', 'um_browser_url_redirect_to'); function um_browser_url_redirect_to( $args ) { - global $ultimatemember; - $url = ''; if ( isset( $_REQUEST['redirect_to'] ) && !empty( $_REQUEST['redirect_to'] ) ) { @@ -32,7 +30,7 @@ case 'refresh': - $url = $ultimatemember->permalinks->get_current_url(); + $url = UM()->permalinks()->get_current_url(); break; @@ -51,20 +49,15 @@ /*** *** @add a notice to form ***/ - add_action('um_before_form', 'um_add_update_notice', 500 ); - function um_add_update_notice($args){ - global $ultimatemember; + add_action( 'um_before_form', 'um_add_update_notice', 500 ); + function um_add_update_notice( $args ) { extract($args); $output = ''; $err = ''; $success = ''; - - if ( ! get_option('users_can_register') && $mode == 'register' ) { - $err = __('Registration is currently disabled','ultimate-member'); - } - if ( isset( $_REQUEST['updated'] ) && !empty( $_REQUEST['updated'] ) && !$ultimatemember->form->errors ) { + if ( isset( $_REQUEST['updated'] ) && !empty( $_REQUEST['updated'] ) && ! UM()->form()->errors ) { switch( $_REQUEST['updated'] ) { default: @@ -86,7 +79,7 @@ } } - if ( isset( $_REQUEST['err'] ) && !empty( $_REQUEST['err'] ) && !$ultimatemember->form->errors ) { + if ( isset( $_REQUEST['err'] ) && !empty( $_REQUEST['err'] ) && ! UM()->form()->errors ) { switch( $_REQUEST['err'] ) { default: diff --git a/core/um-actions-password.php b/includes/core/um-actions-password.php similarity index 76% rename from core/um-actions-password.php rename to includes/core/um-actions-password.php index f8dd2939..f00a075a 100644 --- a/core/um-actions-password.php +++ b/includes/core/um-actions-password.php @@ -5,8 +5,6 @@ ***/ add_action('um_reset_password_process_hook','um_reset_password_process_hook'); function um_reset_password_process_hook( $args ) { - global $ultimatemember; - $user = null; foreach ( $_POST as $key => $val ) { @@ -23,12 +21,12 @@ $user_email = $user; } - $ultimatemember->password->reset_request['user_id'] = $data->ID; - $ultimatemember->password->reset_request['user_email'] = $user_email; + UM()->password()->reset_request['user_id'] = $data->ID; + UM()->password()->reset_request['user_email'] = $user_email; um_fetch_user( $data->ID ); - $ultimatemember->user->password_reset(); + UM()->user()->password_reset(); um_reset_user(); @@ -39,7 +37,6 @@ ***/ add_action('um_change_password_process_hook','um_change_password_process_hook'); function um_change_password_process_hook( $args ) { - global $ultimatemember; extract( $args ); wp_set_password( $args['user_password'], $args['user_id'] ); @@ -66,12 +63,11 @@ add_action('send_password_change_email','um_send_password_change_email'); function um_send_password_change_email( $args ){ - global $ultimatemember; extract( $args ); um_fetch_user( $user_id ); - $ultimatemember->user->password_changed(); + UM()->user()->password_changed(); um_reset_user(); @@ -84,7 +80,6 @@ ***/ add_action('um_after_changing_user_password','um_after_changing_user_password'); function um_after_changing_user_password( $user_id ) { - global $ultimatemember; } @@ -93,9 +88,8 @@ ***/ add_action('um_reset_password_errors_hook','um_reset_password_errors_hook'); function um_reset_password_errors_hook( $args ) { - global $ultimatemember; - if ( $_POST[ $ultimatemember->honeypot ] != '' ) + if ( $_POST[ UM()->honeypot ] != '' ) wp_die('Hello, spam bot!','ultimate-member'); $form_timestamp = trim($_POST['timestamp']); @@ -116,11 +110,11 @@ } if ( empty( $user ) ) { - $ultimatemember->form->add_error('username_b', __('Please provide your username or email','ultimate-member') ); + UM()->form()->add_error('username_b', __('Please provide your username or email','ultimate-member') ); } if ( ( !is_email( $user ) && !username_exists( $user ) ) || ( is_email( $user ) && !email_exists( $user ) ) ) { - $ultimatemember->form->add_error('username_b', __('We can\'t find an account registered with that address or username','ultimate-member') ); + UM()->form()->add_error('username_b', __('We can\'t find an account registered with that address or username','ultimate-member') ); } else { if ( is_email( $user ) ) { @@ -139,7 +133,7 @@ }else{ $limit = um_get_option('reset_password_limit_number'); if ( $attempts >= $limit ) { - $ultimatemember->form->add_error('username_b', __('You have reached the limit for requesting password change for this user already. Contact support if you cannot open the email','ultimate-member') ); + UM()->form()->add_error('username_b', __('You have reached the limit for requesting password change for this user already. Contact support if you cannot open the email','ultimate-member') ); } else { update_user_meta( $user_id, 'password_rst_attempts', $attempts + 1 ); } @@ -155,9 +149,7 @@ ***/ add_action('um_change_password_errors_hook','um_change_password_errors_hook'); function um_change_password_errors_hook( $args ) { - global $ultimatemember; - - if ( isset( $_POST[ $ultimatemember->honeypot ] ) && $_POST[ $ultimatemember->honeypot ] != '' ){ + if ( isset( $_POST[ UM()->honeypot ] ) && $_POST[ UM()->honeypot ] != '' ){ wp_die('Hello, spam bot!','ultimate-member'); } @@ -186,31 +178,31 @@ } if ( isset( $args['user_password'] ) && empty( $args['user_password'] ) ) { - $ultimatemember->form->add_error('user_password', __('You must enter a new password','ultimate-member') ); + UM()->form()->add_error('user_password', __('You must enter a new password','ultimate-member') ); } if ( um_get_option('reset_require_strongpass') ) { if ( strlen( utf8_decode( $args['user_password'] ) ) < 8 ) { - $ultimatemember->form->add_error('user_password', __('Your password must contain at least 8 characters','ultimate-member') ); + UM()->form()->add_error('user_password', __('Your password must contain at least 8 characters','ultimate-member') ); } if ( strlen( utf8_decode( $args['user_password'] ) ) > 30 ) { - $ultimatemember->form->add_error('user_password', __('Your password must contain less than 30 characters','ultimate-member') ); + UM()->form()->add_error('user_password', __('Your password must contain less than 30 characters','ultimate-member') ); } - if ( !$ultimatemember->validation->strong_pass( $args['user_password'] ) ) { - $ultimatemember->form->add_error('user_password', __('Your password must contain at least one lowercase letter, one capital letter and one number','ultimate-member') ); + if ( ! UM()->validation()->strong_pass( $args['user_password'] ) ) { + UM()->form()->add_error('user_password', __('Your password must contain at least one lowercase letter, one capital letter and one number','ultimate-member') ); } } if ( isset( $args['confirm_user_password'] ) && empty( $args['confirm_user_password'] ) ) { - $ultimatemember->form->add_error('confirm_user_password', __('You must confirm your new password','ultimate-member') ); + UM()->form()->add_error('confirm_user_password', __('You must confirm your new password','ultimate-member') ); } if ( isset( $args['user_password'] ) && isset( $args['confirm_user_password'] ) && $args['user_password'] != $args['confirm_user_password'] ) { - $ultimatemember->form->add_error('confirm_user_password', __('Your passwords do not match','ultimate-member') ); + UM()->form()->add_error('confirm_user_password', __('Your passwords do not match','ultimate-member') ); } } @@ -251,13 +243,11 @@ add_action('um_reset_password_form', 'um_reset_password_form'); function um_reset_password_form($args) { - global $ultimatemember; - - $fields = $ultimatemember->builtin->get_specific_fields('password_reset_text,username_b'); ?> + $fields = UM()->builtin()->get_specific_fields('password_reset_text,username_b'); ?> $data ) { - $output .= $ultimatemember->fields->edit_field( $key, $data ); + $output .= UM()->fields()->edit_field( $key, $data ); }echo $output; ?> @@ -280,18 +270,16 @@ add_action('um_change_password_form', 'um_change_password_form'); function um_change_password_form() { - global $ultimatemember; - - $fields = $ultimatemember->builtin->get_specific_fields('user_password'); ?> + $fields = UM()->builtin()->get_specific_fields('user_password'); ?> $data ) { - $output .= $ultimatemember->fields->edit_field( $key, $data ); + $output .= UM()->fields()->edit_field( $key, $data ); }echo $output; ?>
            -
            +
            diff --git a/core/um-actions-profile.php b/includes/core/um-actions-profile.php similarity index 72% rename from core/um-actions-profile.php rename to includes/core/um-actions-profile.php index 61498dce..470072dd 100644 --- a/core/um-actions-profile.php +++ b/includes/core/um-actions-profile.php @@ -41,52 +41,52 @@ /*** *** @update user's profile ***/ - add_action('um_user_edit_profile', 'um_user_edit_profile', 10); - function um_user_edit_profile( $args ){ - - global $ultimatemember; + add_action( 'um_user_edit_profile', 'um_user_edit_profile', 10 ); + function um_user_edit_profile( $args ) { $to_update = null; $files = null; if ( isset( $args['user_id'] ) ) { - if ( um_current_user_can('edit', $args['user_id'] ) ) { - $ultimatemember->user->set( $args['user_id'] ); + if ( UM()->roles()->um_current_user_can('edit', $args['user_id'] ) ) { + UM()->user()->set( $args['user_id'] ); } else { wp_die( __('You are not allowed to edit this user.','ultimate-member') ); } } else if ( isset( $args['_user_id'] ) ) { - $ultimatemember->user->set( $args['_user_id'] ); + UM()->user()->set( $args['_user_id'] ); } - $userinfo = $ultimatemember->user->profile; + $userinfo = UM()->user()->profile; - $fields = unserialize( $args['custom_fields'] ); + do_action( 'um_user_before_updating_profile', $userinfo ); - do_action('um_user_before_updating_profile', $userinfo ); + if ( ! empty( $args['custom_fields'] ) ) + $fields = unserialize( $args['custom_fields'] ); // loop through fields - if ( isset( $fields ) && is_array( $fields ) ) { - foreach( $fields as $key => $array ) { + if ( ! empty( $fields ) ) { + foreach ( $fields as $key => $array ) { - if( !um_user_can( 'can_edit_everyone' ) && isset($fields[$key]['editable']) && !$fields[$key]['editable'] ) continue; + if( ! UM()->roles()->um_user_can( 'can_edit_everyone' ) && isset( $fields[$key]['editable'] ) && ! $fields[$key]['editable'] ) + continue; - if ( $fields[$key]['type'] == 'multiselect' || $fields[$key]['type'] == 'checkbox' && !isset($args['submitted'][$key]) ) { + if ( $fields[$key]['type'] == 'multiselect' || $fields[$key]['type'] == 'checkbox' && ! isset( $args['submitted'][$key] ) ) { delete_user_meta( um_user('ID'), $key ); } if ( isset( $args['submitted'][ $key ] ) ) { - if ( isset( $fields[$key]['type'] ) && in_array( $fields[$key]['type'], array('image','file') ) && + if ( isset( $fields[$key]['type'] ) && in_array( $fields[$key]['type'], array('image','file') ) && ( um_is_temp_upload( $args['submitted'][ $key ] ) || $args['submitted'][ $key ] == 'empty_file' ) ) { $files[ $key ] = $args['submitted'][ $key ]; } else { - if ( isset( $userinfo[$key]) && $args['submitted'][$key] != $userinfo[$key] ) { + if ( isset( $userinfo[$key] ) && $args['submitted'][$key] != $userinfo[$key] ) { $to_update[ $key ] = $args['submitted'][ $key ]; - } else if ( $args['submitted'][$key] ) { + } elseif ( $args['submitted'][$key] ) { $to_update[ $key ] = $args['submitted'][ $key ]; } @@ -100,35 +100,34 @@ $to_update['description'] = $args['submitted']['description']; } - if ( isset( $args['submitted']['role'] ) && !empty( $args['submitted']['role'] ) ) { + if ( ! empty( $args['submitted']['role'] ) ) { $to_update['role'] = $args['submitted']['role']; } - do_action('um_user_pre_updating_profile', $to_update ); + do_action( 'um_user_pre_updating_profile', $to_update ); - $to_update = apply_filters('um_user_pre_updating_profile_array', $to_update); + $to_update = apply_filters( 'um_user_pre_updating_profile_array', $to_update ); if ( is_array( $to_update ) ) { - $ultimatemember->user->update_profile( $to_update ); - do_action('um_after_user_updated', um_user('ID') ); + UM()->user()->update_profile( $to_update ); + do_action( 'um_after_user_updated', um_user('ID') ); } - $files = apply_filters('um_user_pre_updating_files_array', $files); + $files = apply_filters( 'um_user_pre_updating_files_array', $files ); if ( is_array( $files ) ) { do_action('um_before_user_upload', um_user('ID'), $files ); - $ultimatemember->user->update_files( $files ); - do_action('um_after_user_upload', um_user('ID'), $files ); + UM()->user()->update_files( $files ); + do_action( 'um_after_user_upload', um_user('ID'), $files ); } - do_action('um_user_after_updating_profile', $to_update ); + do_action( 'um_user_after_updating_profile', $to_update ); - do_action('um_update_profile_full_name', $to_update ); + do_action( 'um_update_profile_full_name', $to_update ); - - if ( !isset( $args['is_signup'] ) ) { - $url = $ultimatemember->permalinks->profile_url( true ); + if ( ! isset( $args['is_signup'] ) ) { + $url = UM()->user()->get_profile_url( um_user('ID'), true ); exit( wp_redirect( um_edit_my_profile_cancel_uri( $url ) ) ); } @@ -139,10 +138,9 @@ ***/ add_action('um_after_form_fields', 'um_editing_user_id_input'); function um_editing_user_id_input($args){ - global $ultimatemember; - if ( $ultimatemember->fields->editing == 1 && $ultimatemember->fields->set_mode == 'profile' && $ultimatemember->user->target_id ) { ?> + if ( UM()->fields()->editing == 1 && UM()->fields()->set_mode == 'profile' && UM()->user()->target_id ) { ?> - + fields->editing ) { + if ( UM()->fields()->editing ) { $items = array( ''.__('Change cover photo','ultimate-member').'', @@ -220,12 +214,12 @@ ''.__('Cancel','ultimate-member').'', ); - echo $ultimatemember->menu->new_ui( 'bc', 'div.um-cover', 'click', $items ); + echo UM()->menu()->new_ui( 'bc', 'div.um-cover', 'click', $items ); } ?> - fields->add_hidden_field( 'cover_photo' ); ?> + fields()->add_hidden_field( 'cover_photo' ); ?> @@ -235,8 +229,8 @@ mobile->isMobile() ){ - if ( $ultimatemember->mobile->isTablet() ) { + if( UM()->mobile()->isMobile() ){ + if ( UM()->mobile()->isTablet() ) { echo um_user('cover_photo', 1000); } else { echo um_user('cover_photo', 300); @@ -255,7 +249,7 @@ } else { - if ( !isset( $ultimatemember->user->cannot_edit ) ) { ?> + if ( !isset( UM()->user()->cannot_edit ) ) { ?> @@ -278,11 +272,10 @@ ***/ add_action('um_after_profile_header_name_args','um_social_links_icons', 50 ); function um_social_links_icons( $args ) { - global $ultimatemember; if ( isset($args['show_social_links']) && $args['show_social_links'] ) { echo '
            '; - echo $ultimatemember->fields->show_social_urls(); + UM()->fields()->show_social_urls(); echo '
            '; } @@ -293,8 +286,6 @@ ***/ add_action('um_profile_header', 'um_profile_header', 9 ); function um_profile_header( $args ) { - global $ultimatemember; - $classes = null; if ( !$args['cover_enabled'] ) { @@ -323,9 +314,9 @@ user->cannot_edit ) ) { + if ( ! isset( UM()->user()->cannot_edit ) ) { - $ultimatemember->fields->add_hidden_field( 'profile_photo' ); + UM()->fields()->add_hidden_field( 'profile_photo' ); if ( !um_profile('profile_photo') ) { // has profile photo @@ -336,9 +327,9 @@ $items = apply_filters('um_user_photo_menu_view', $items ); - echo $ultimatemember->menu->new_ui( 'bc', 'div.um-profile-photo', 'click', $items ); + echo UM()->menu()->new_ui( 'bc', 'div.um-profile-photo', 'click', $items ); - } else if ( $ultimatemember->fields->editing == true ) { + } else if ( UM()->fields()->editing == true ) { $items = array( ''.__('Change photo','ultimate-member').'', @@ -348,7 +339,7 @@ $items = apply_filters('um_user_photo_menu_edit', $items ); - echo $ultimatemember->menu->new_ui( 'bc', 'div.um-profile-photo', 'click', $items ); + echo UM()->menu()->new_ui( 'bc', 'div.um-profile-photo', 'click', $items ); } @@ -382,12 +373,12 @@
            - profile->show_meta( $args['metafields'] ); ?> + profile()->show_meta( $args['metafields'] ); ?>
            - fields->viewing == true && um_user('description') && $args['show_bio'] ) { ?> + fields()->viewing == true && um_user('description') && $args['show_bio'] ) { ?>
            - fields->editing == true && $args['show_bio'] ) { ?> + fields()->editing == true && $args['show_bio'] ) { ?>
            fields->is_error('description') ) { - echo $ultimatemember->fields->field_error( $ultimatemember->fields->show_error('description'), true ); + if ( UM()->fields()->is_error('description') ) { + echo UM()->fields()->field_error( UM()->fields()->show_error('description'), true ); } ?> @@ -424,8 +415,8 @@
            fields->is_error( 'profile_photo' ) ) { - echo $ultimatemember->fields->field_error( $ultimatemember->fields->show_error('profile_photo'), 'force_show' ); + if ( UM()->fields()->is_error( 'profile_photo' ) ) { + echo UM()->fields()->field_error( UM()->fields()->show_error('profile_photo'), 'force_show' ); } ?> @@ -439,30 +430,32 @@ /*** *** @adds profile permissions to view/edit ***/ - add_action('um_pre_profile_shortcode', 'um_pre_profile_shortcode'); + add_action( 'um_pre_profile_shortcode', 'um_pre_profile_shortcode' ); function um_pre_profile_shortcode($args){ - global $ultimatemember; extract( $args ); - if ( $mode == 'profile' && $ultimatemember->fields->editing == false ) { - $ultimatemember->fields->viewing = 1; + if ( $mode == 'profile' && UM()->fields()->editing == false ) { + UM()->fields()->viewing = 1; if ( um_get_requested_user() ) { - if ( !um_can_view_profile( um_get_requested_user() ) && ! um_is_myprofile() ) um_redirect_home(); - if ( !um_current_user_can('edit', um_get_requested_user() ) ) $ultimatemember->user->cannot_edit = 1; - um_fetch_user( um_get_requested_user() ); + if ( ! um_can_view_profile( um_get_requested_user() ) && ! um_is_myprofile() ) + um_redirect_home(); + + if ( ! UM()->roles()->um_current_user_can( 'edit', um_get_requested_user() ) ) + UM()->user()->cannot_edit = 1; + + um_fetch_user( um_get_requested_user() ); } else { if ( !is_user_logged_in() ) um_redirect_home(); - if ( !um_user('can_edit_profile') ) $ultimatemember->user->cannot_edit = 1; + if ( !um_user('can_edit_profile') ) UM()->user()->cannot_edit = 1; } - } - if ( $mode == 'profile' && $ultimatemember->fields->editing == true ) { - $ultimatemember->fields->editing = 1; + if ( $mode == 'profile' && UM()->fields()->editing == true ) { + UM()->fields()->editing = 1; if ( um_get_requested_user() ) { - if ( !um_current_user_can('edit', um_get_requested_user() ) ) um_redirect_home(); + if ( ! UM()->roles()->um_current_user_can('edit', um_get_requested_user() ) ) um_redirect_home(); um_fetch_user( um_get_requested_user() ); } @@ -475,14 +468,13 @@ ***/ add_action('um_pre_header_editprofile', 'um_add_edit_icon' ); function um_add_edit_icon( $args ) { - global $ultimatemember; $output = ''; if ( !is_user_logged_in() ) return; // not allowed for guests - if ( isset( $ultimatemember->user->cannot_edit ) && $ultimatemember->user->cannot_edit == 1 ) return; // do not proceed if user cannot edit + if ( isset( UM()->user()->cannot_edit ) && UM()->user()->cannot_edit == 1 ) return; // do not proceed if user cannot edit - if ( $ultimatemember->fields->editing == true ) { + if ( UM()->fields()->editing == true ) { ?> @@ -511,7 +503,7 @@ if ( !um_is_myprofile() ) { - $actions = $ultimatemember->user->get_admin_actions(); + $actions = UM()->user()->get_admin_actions(); unset( $items['myaccount'] ); unset( $items['logout'] ); @@ -531,7 +523,7 @@ } - echo $ultimatemember->menu->new_ui( $args['header_menu'], 'div.um-profile-edit', 'click', $items ); + UM()->menu()->new_ui( $args['header_menu'], 'div.um-profile-edit', 'click', $items ); ?> @@ -547,17 +539,15 @@ ***/ add_action('um_main_profile_fields', 'um_add_profile_fields', 100); function um_add_profile_fields($args){ - global $ultimatemember; + if ( UM()->fields()->editing == true ) { - if ( $ultimatemember->fields->editing == true ) { - - echo $ultimatemember->fields->display( 'profile', $args ); + echo UM()->fields()->display( 'profile', $args ); } else { - $ultimatemember->fields->viewing = true; + UM()->fields()->viewing = true; - echo $ultimatemember->fields->display_view( 'profile', $args ); + echo UM()->fields()->display_view( 'profile', $args ); } @@ -568,9 +558,8 @@ ***/ add_action('um_submit_form_profile', 'um_submit_form_profile', 10); function um_submit_form_profile($args){ - global $ultimatemember; - if ( !isset($ultimatemember->form->errors) ) do_action('um_user_edit_profile', $args); + if ( !isset( UM()->form()->errors) ) do_action('um_user_edit_profile', $args); do_action('um_user_profile_extra_hook', $args ); @@ -581,13 +570,11 @@ ***/ add_action('um_after_profile_fields', 'um_add_submit_button_to_profile', 1000); function um_add_submit_button_to_profile($args){ - global $ultimatemember; - // DO NOT add when reviewing user's details - if ( $ultimatemember->user->preview == true && is_admin() ) return; + if ( UM()->user()->preview == true && is_admin() ) return; // only when editing - if ( $ultimatemember->fields->editing == false ) return; + if ( UM()->fields()->editing == false ) return; ?> @@ -616,27 +603,25 @@ ***/ add_action('um_profile_navbar', 'um_profile_navbar', 9 ); function um_profile_navbar( $args ) { - global $ultimatemember; - if ( !um_get_option('profile_menu') ) return; // get active tabs - $tabs = $ultimatemember->profile->tabs_active(); + $tabs = UM()->profile()->tabs_active(); $tabs = apply_filters('um_user_profile_tabs', $tabs ); - $ultimatemember->user->tabs = $tabs; + UM()->user()->tabs = $tabs; // need enough tabs to continue if ( count( $tabs ) <= 1 ) return; - $active_tab = $ultimatemember->profile->active_tab(); + $active_tab = UM()->profile()->active_tab(); if ( !isset( $tabs[$active_tab] ) ) { $active_tab = 'main'; - $ultimatemember->profile->active_tab = $active_tab; - $ultimatemember->profile->active_subnav = null; + UM()->profile()->active_tab = $active_tab; + UM()->profile()->active_subnav = null; } // Move default tab priority @@ -656,7 +641,7 @@ if ( isset( $tab['hidden'] ) ) continue; - $nav_link = $ultimatemember->permalinks->get_current_url( get_option('permalink_structure') ); + $nav_link = UM()->permalinks()->get_current_url( get_option('permalink_structure') ); $nav_link = remove_query_arg( 'um_action', $nav_link ); $nav_link = remove_query_arg( 'subnav', $nav_link ); $nav_link = add_query_arg('profiletab', $id, $nav_link ); @@ -689,7 +674,7 @@ if ( isset( $tab['subnav'] ) && $active_tab == $id ) { - $active_subnav = ( $ultimatemember->profile->active_subnav() ) ? $ultimatemember->profile->active_subnav() : $tab['subnav_default']; + $active_subnav = ( UM()->profile()->active_subnav() ) ? UM()->profile()->active_subnav() : $tab['subnav_default']; echo '
            '; foreach( $tab['subnav'] as $id => $subtab ) { @@ -710,20 +695,18 @@ /** * Clean up file for new uploaded files - * @param integer $user_id - * @param array $arr_files + * @param integer $user_id + * @param array $arr_files */ - add_action("um_before_user_upload","um_before_user_upload", 10 ,2 ); + add_action( "um_before_user_upload","um_before_user_upload", 10 ,2 ); function um_before_user_upload( $user_id, $arr_files ){ - global $ultimatemember; - um_fetch_user( $user_id ); - + foreach ($arr_files as $key => $filename ) { if( um_user( $key ) ){ if( basename( $filename ) != basename( um_user( $key ) ) || in_array( $old_filename , array( basename( um_user( $key ) ), basename( $filename ) ) ) || $filename == 'empty_file' ){ $old_filename = um_user( $key ); - $path = $ultimatemember->files->upload_basedir; + $path = UM()->files()->upload_basedir; delete_user_meta( $user_id, $old_filename ); if ( file_exists( $path . $user_id . '/' . $old_filename ) ) { unlink( $path . $user_id . '/' . $old_filename ); @@ -732,4 +715,3 @@ } } } - diff --git a/includes/core/um-actions-register.php b/includes/core/um-actions-register.php new file mode 100644 index 00000000..2a88a82b --- /dev/null +++ b/includes/core/um-actions-register.php @@ -0,0 +1,355 @@ +user()->approve(); + } + + /** + * Account needs email validation + */ + add_action('um_post_registration_checkmail_hook', 'um_post_registration_checkmail_hook', 10, 2); + function um_post_registration_checkmail_hook($user_id, $args){ + um_fetch_user( $user_id ); + + UM()->user()->email_pending(); + } + + /** + * Account needs admin review + */ + add_action('um_post_registration_pending_hook', 'um_post_registration_pending_hook', 10, 2); + function um_post_registration_pending_hook($user_id, $args){ + um_fetch_user( $user_id ); + + UM()->user()->pending(); + + } + + + /** + * After adding a new user + */ + add_action( 'um_after_new_user_register', 'um_after_new_user_register', 10, 2 ); + function um_after_new_user_register( $user_id, $args ) { + global $pagenow; + + um_fetch_user( $user_id ); + + if ( ! isset( $args['role'] ) ) + $args['role'] = get_option( 'default_role', true ); + + if ( $pagenow != 'user-new.php' && ! array_key_exists( $args['role'], UM()->roles()->get_roles( false, array( 'admin' ) ) ) ) + $args['role'] = get_option( 'default_role', true ); + + if ( ! user_can( $user_id, $args['role'] ) ) + UM()->roles()->set_um_user_role( $user_id, $args['role'] ); + + if ( ! empty( $args['submitted'] ) ) + UM()->user()->set_registration_details( $args['submitted'] ); + + //UM()->user()->set_last_login(); + + UM()->user()->remove_cached_queue(); + + do_action( 'um_post_registration_save', $user_id, $args ); + + //send notification about registration + do_action( 'um_post_registration_listener', $user_id, $args ); + + do_action( 'um_post_registration', $user_id, $args ); + + } + + /** + * Update user's profile after registration + */ + add_action( 'um_post_registration_save', 'um_post_registration_save', 10, 2 ); + function um_post_registration_save( $user_id, $args ) { + unset( $args['user_id'] ); + $args['_user_id'] = $user_id; + $args['is_signup'] = 1; + + do_action( 'um_user_edit_profile', $args ); + } + + + /** + * Post-registration admin listener + */ + add_action('um_post_registration_listener', 'um_post_registration_listener', 10, 2); + function um_post_registration_listener( $user_id, $args ) { + if ( um_user('status') != 'pending' ) { + UM()->mail()->send( um_admin_email(), 'notification_new_user', array( 'admin' => true ) ); + } else { + UM()->mail()->send( um_admin_email(), 'notification_review', array( 'admin' => true ) ); + } + + } + + + /** + * Post-registration procedure + */ + add_action('um_post_registration', 'um_post_registration', 10, 2); + function um_post_registration( $user_id, $args ) { + unset( $args['user_id'] ); + extract( $args ); + + $status = um_user( 'status' ); + + /* + * maybe in future + * if ( ! is_admin() ) { + um_fetch_user( $user_id ); + + $user_roles = UM()->roles()->um_get_user_role( $user_id ); + var_dump( $user_roles ); + $role_meta = UM()->roles()->role_data( $user_roles ); + var_dump( $role_meta ); + if ( $role_meta['_um_status'] == 'approved' ) { + UM()->user()->approve(); + } elseif ( $role_meta['_um_status'] == 'checkmail' ) { + UM()->user()->email_pending(); + } elseif ( $role_meta['_um_status'] == 'pending' ) { + UM()->user()->pending(); + } + + $status = um_user( 'status' ); + }*/ + + do_action( "um_post_registration_{$status}_hook", $user_id, $args ); + + if ( ! is_admin() ) { + + do_action( "track_{$status}_user_registration" ); + + // Priority redirect + if ( isset( $args['redirect_to'] ) ) { + exit( wp_redirect( urldecode( $args['redirect_to'] ) ) ); + } + + if ( $status == 'approved' ) { + + UM()->user()->auto_login( $user_id ); + UM()->user()->get_profile_url( $user_id, true ); + + do_action( 'um_registration_after_auto_login', $user_id ); + + if ( um_user( 'auto_approve_act' ) == 'redirect_url' && um_user( 'auto_approve_url' ) !== '' ) { + exit( wp_redirect( um_user( 'auto_approve_url' ) ) ); + } + + if ( um_user( 'auto_approve_act' ) == 'redirect_profile' ) { + exit( wp_redirect( um_user_profile_url() ) ); + } + + } + + if ( $status != 'approved' ) { + + if ( um_user( $status . '_action' ) == 'redirect_url' && um_user( $status . '_url' ) != '' ) { + exit( wp_redirect( um_user( $status . '_url' ) ) ); + } + + if ( um_user( $status . '_action' ) == 'show_message' && um_user( $status . '_message' ) != '' ) { + + $url = UM()->permalinks()->get_current_url(); + $url = add_query_arg( 'message', esc_attr( $status ), $url ); + $url = add_query_arg( 'um_role', esc_attr( um_user( 'role' ) ), $url ); + $url = add_query_arg( 'um_form_id', esc_attr( $form_id ), $url ); + + exit( wp_redirect( $url ) ); + } + + } + + } + + } + + + /** + * New user registration + */ + add_action( 'um_user_registration', 'um_user_registration', 10 ); + function um_user_registration( $args ) { + unset( $args['user_id'] ); + + extract( $args ); + + if ( isset( $username ) && ! isset( $args['user_login'] ) ) { + $user_login = $username; + } + + if ( ! empty( $first_name ) && ! empty( $last_name ) && ! isset( $user_login ) ) { + + if ( um_get_option( 'permalink_base' ) == 'name' ) { + $user_login = rawurlencode( strtolower( str_replace( " ", ".", $first_name . " " . $last_name ) ) ); + } elseif ( um_get_option( 'permalink_base' ) == 'name_dash' ) { + $user_login = rawurlencode( strtolower( str_replace( " ", "-", $first_name . " " . $last_name ) ) ); + } elseif ( um_get_option( 'permalink_base' ) == 'name_plus' ) { + $user_login = strtolower( str_replace( " ", "+", $first_name . " " . $last_name ) ); + } else { + $user_login = strtolower( str_replace( " ", "", $first_name . " " . $last_name ) ); + } + + // if full name exists + $count = 1; + while ( username_exists( $user_login ) ) { + $user_login .= $count; + $count++; + } + } + + if ( ! isset( $user_login ) && isset( $user_email ) && $user_email ) { + $user_login = $user_email; + } + + $unique_userID = UM()->query()->count_users() + 1; + + if ( ! isset( $user_login ) || strlen( $user_login ) > 30 && ! is_email( $user_login ) ) { + $user_login = 'user' . $unique_userID; + } + + if ( isset( $username ) && is_email( $username ) ) { + $user_email = $username; + } + + if ( ! isset( $user_password ) ) { + $user_password = UM()->validation()->generate( 8 ); + } + + + if ( ! isset( $user_email ) ) { + $site_url = @$_SERVER['SERVER_NAME']; + $user_email = 'nobody' . $unique_userID . '@' . $site_url; + $user_email = apply_filters( "um_user_register_submitted__email", $user_email ); + } + + $creds['user_login'] = $user_login; + $creds['user_password'] = $user_password; + $creds['user_email'] = trim( $user_email ); + + $args = apply_filters('um_add_user_frontend_submitted', $args ); + + $args['submitted'] = array_merge( $args['submitted'], $creds ); + $args = array_merge( $args, $creds ); + + unset( $args['user_id'] ); + + do_action( 'um_before_new_user_register', $args ); + + $default_role = get_option( 'default_role', true ); +/* if ( empty( $default_role ) ) + $default_role = get_option( 'default_role' );*/ + + $userdata = array( + 'user_login' => $user_login, + 'user_pass' => $user_password, + 'user_email' => $user_email, + 'role' => $default_role, + ); + $user_id = wp_insert_user( $userdata ); + + do_action( 'um_after_new_user_register', $user_id, $args ); + + return $user_id; + + } + + /** + * Form Processing + */ + add_action( 'um_submit_form_register', 'um_submit_form_register', 10 ); + function um_submit_form_register( $args ) { + if ( ! isset( UM()->form()->errors ) ) + do_action( 'um_user_registration', $args ); + } + + /** + * Register user with predefined role in options + */ + add_action('um_after_register_fields', 'um_add_user_role'); + function um_add_user_role( $args ){ + + if ( isset( $args['custom_fields']['role_select'] ) || isset( $args['custom_fields']['role_radio'] ) ) return; + + $use_global_settings = get_post_meta( $args['form_id'], '_um_register_use_globals', true); + + if (isset($args['role']) && !empty($args['role']) && $use_global_settings == 0 ) { + $role = $args['role']; + } else if( $use_global_settings == 1 ) { + //$role = um_get_option('default_role'); + $role = get_option( 'default_role' ); + } + + if( empty( $role ) ) return; + + $role = apply_filters('um_register_hidden_role_field', $role ); + if( $role ){ + echo ''; + } + + } + + /** + * Show the submit button + */ + add_action('um_after_register_fields', 'um_add_submit_button_to_register', 1000); + function um_add_submit_button_to_register($args){ + // DO NOT add when reviewing user's details + if ( isset( UM()->user()->preview ) && UM()->user()->preview == true && is_admin() ) return; + + $primary_btn_word = $args['primary_btn_word']; + $primary_btn_word = apply_filters('um_register_form_button_one', $primary_btn_word, $args ); + + $secondary_btn_word = $args['secondary_btn_word']; + $secondary_btn_word = apply_filters('um_register_form_button_two', $secondary_btn_word, $args ); + + $secondary_btn_url = ( isset( $args['secondary_btn_url'] ) && $args['secondary_btn_url'] ) ? $args['secondary_btn_url'] : um_get_core_page('login'); + $secondary_btn_url = apply_filters('um_register_form_button_two_url', $secondary_btn_url, $args ); + + ?> + +
            + + + +
            +
            + + + +
            + + + +
            + +
            + + fields()->display( 'register', $args ); + + } + + /** + * Set user gravatar with user_email + */ + add_action('user_register','um_user_register_generate_gravatar'); + function um_user_register_generate_gravatar( $user_id ){ + UM()->user()->set_gravatar( $user_id ); + } diff --git a/core/um-actions-save-profile.php b/includes/core/um-actions-save-profile.php similarity index 78% rename from core/um-actions-save-profile.php rename to includes/core/um-actions-save-profile.php index d4955a8d..ca257b26 100644 --- a/core/um-actions-save-profile.php +++ b/includes/core/um-actions-save-profile.php @@ -3,15 +3,12 @@ /*** *** @profile name update ***/ - add_action('um_update_profile_full_name', 'um_update_profile_full_name' ); + add_action( 'um_update_profile_full_name', 'um_update_profile_full_name' ); function um_update_profile_full_name( $changes ) { - global $ultimatemember; - - // Sync display name changes - $option = um_get_option('display_name'); + $option = um_get_option( 'display_name' ); - $user_id = $ultimatemember->user->id; + $user_id = UM()->user()->id; if( ! isset( $user_id ) || empty( $user_id ) ){ $user = get_user_by( 'email', $changes['user_email'] ); @@ -59,17 +56,15 @@ if ( isset( $changes['first_name'] ) && isset( $changes['last_name'] ) ) { - $full_name = $ultimatemember->user->profile['display_name']; - $full_name = $ultimatemember->validation->safe_name_in_url( $full_name ); + $full_name = UM()->user()->profile['display_name']; + $full_name = UM()->validation()->safe_name_in_url( $full_name ); - update_user_meta( $ultimatemember->user->id, 'full_name', $full_name ); + update_user_meta( UM()->user()->id, 'full_name', $full_name ); } // regenerate slug - $ultimatemember->permalinks->profile_url( true ); - - + UM()->user()->get_profile_url( $user_id, true ); } \ No newline at end of file diff --git a/core/um-actions-user.php b/includes/core/um-actions-user.php similarity index 66% rename from core/um-actions-user.php rename to includes/core/um-actions-user.php index 85e6f15a..58ea8100 100644 --- a/core/um-actions-user.php +++ b/includes/core/um-actions-user.php @@ -5,9 +5,7 @@ ***/ add_action('um_after_user_role_is_updated','um_setup_synced_wp_role', 50, 2); function um_setup_synced_wp_role( $user_id, $role ) { - global $ultimatemember; - - $meta = $ultimatemember->query->role_data( $role ); + $meta = UM()->roles()->role_data( $role ); $meta = apply_filters('um_user_permissions_filter', $meta, $user_id ); $wp_user_object = new WP_User( $user_id ); @@ -23,11 +21,9 @@ ***/ add_action('um_when_role_is_set', 'um_remove_prev_synced_wp_role'); function um_remove_prev_synced_wp_role( $user_id ) { - global $ultimatemember; - um_fetch_user( $user_id ); $role = um_user('role'); - $meta = $ultimatemember->query->role_data( $role ); + $meta = UM()->roles()->role_data( $role ); if ( isset( $meta['synced_role'] ) && $meta['synced_role'] ) { $wp_user_object = new WP_User( $user_id ); $wp_user_object->remove_role( $meta['synced_role'] ); @@ -40,11 +36,9 @@ ***/ add_action('um_after_user_upload','um_remove_unused_uploads', 10); function um_remove_unused_uploads( $user_id ) { - global $ultimatemember; - um_fetch_user( $user_id ); - $array = $ultimatemember->user->profile; + $array = UM()->user()->profile; $files = glob( um_user_uploads_dir() . '*', GLOB_BRACE); @@ -60,44 +54,16 @@ } - /*** - *** @listen to a new user creation in backend - ***/ - add_action( 'user_register', 'um_new_user_via_wpadmin', 10, 1 ); - function um_new_user_via_wpadmin( $user_id ) { - - if ( is_admin() ) { - - global $ultimatemember; - - if( isset( $_POST['um_role'] ) ) { - $args['role'] = $_POST['um_role']; - } else { - $args['role'] = um_get_option('default_role'); - } - - do_action('um_after_new_user_register', $user_id, $args); - - do_action('um_update_profile_full_name', $_POST); - - // generate profile slug - $ultimatemember->permalinks->profile_url( true ); - - } - - } /*** *** @adds main links to a logout widget ***/ add_action('um_logout_user_links', 'um_logout_user_links', 100 ); function um_logout_user_links( $args ) { - global $ultimatemember; - ?>
          • -
          • +
          • $arr ) { foreach( $arr as $id => $info ) { - $output = $ultimatemember->account->get_tab_output( $id ); + $output = UM()->account()->get_tab_output( $id ); if ( !$output ) { unset( $tabs[$k][$id] ); } @@ -41,14 +39,13 @@ */ add_filter('um_account_secure_fields','um_account_secure_fields', 10, 2); function um_account_secure_fields( $fields, $tab_key ){ - global $ultimatemember; $secure = apply_filters('um_account_secure_fields__enabled', true ); if( ! $secure ) return $fields; - if( isset( $ultimatemember->account->register_fields ) && ! isset( $ultimatemember->account->register_fields[ $tab_key ] ) ){ - $ultimatemember->account->register_fields[ $tab_key ] = $fields; + if( isset( UM()->account()->register_fields ) && ! isset( UM()->account()->register_fields[ $tab_key ] ) ){ + UM()->account()->register_fields[ $tab_key ] = $fields; } @@ -65,8 +62,6 @@ add_filter("um_get_field__first_name","um_account_disable_name_fields", 10 ,1 ); add_filter("um_get_field__last_name","um_account_disable_name_fields", 10 ,1 ); function um_account_disable_name_fields( $fields ){ - global $ultimatemember; - if( ! um_get_option("account_name_disable") ) return $fields; if( um_is_core_page("account") ){ diff --git a/core/um-filters-arguments.php b/includes/core/um-filters-arguments.php similarity index 60% rename from core/um-filters-arguments.php rename to includes/core/um-filters-arguments.php index 151a30d4..f6af4c24 100644 --- a/core/um-filters-arguments.php +++ b/includes/core/um-filters-arguments.php @@ -5,8 +5,6 @@ ***/ add_filter('um_shortcode_args_filter', 'um_display_logout_form', 99); function um_display_logout_form( $args ) { - global $ultimatemember; - if ( is_user_logged_in() && isset( $args['mode'] ) && $args['mode'] == 'login' ) { if ( get_current_user_id() != um_user('ID' ) ) { @@ -26,26 +24,20 @@ ***/ add_filter('um_shortcode_args_filter', 'um_shortcode_args_filter', 99); function um_shortcode_args_filter( $args ) { - global $ultimatemember; - if ($ultimatemember->shortcodes->message_mode == true) { + if ( UM()->shortcodes()->message_mode == true ) { $args['template'] = 'message'; - $role = esc_attr( $_REQUEST['um_role'] ); - $role_slug = $ultimatemember->user->get_role_slug_by_id( $role ); - $role = $ultimatemember->query->role_data( $role_slug ); + $roleID = esc_attr( $_REQUEST['um_role'] ); + $role = UM()->roles()->role_data( $roleID ); $status = $role["status"]; $message = $role["{$status}_message"]; - $ultimatemember->shortcodes->custom_message = $message; + UM()->shortcodes()->custom_message = $message; } foreach( $args as $k => $v ) { - if ( $ultimatemember->validation->is_serialized( $args[$k] ) ) { - if ( !empty( $args[$k] ) ) { - $args[$k] = unserialize( $args[$k] ); - } - } + $args[$k] = maybe_unserialize( $args[$k] ); } return $args; diff --git a/core/um-filters-avatars.php b/includes/core/um-filters-avatars.php similarity index 100% rename from core/um-filters-avatars.php rename to includes/core/um-filters-avatars.php diff --git a/includes/core/um-filters-commenting.php b/includes/core/um-filters-commenting.php new file mode 100644 index 00000000..b499d496 --- /dev/null +++ b/includes/core/um-filters-commenting.php @@ -0,0 +1,31 @@ +user_id ) && ! empty( $comment->user_id ) ){ + if ( isset( UM()->user()->cached_user[ $comment->user_id ] ) && UM()->user()->cached_user[ $comment->user_id ] ) { + + $return = '' . UM()->user()->cached_user[$comment->user_id]['name'] . ''; + + } else { + + um_fetch_user( $comment->user_id ); + + UM()->user()->cached_user[ $comment->user_id ] = array('url' => um_user_profile_url(), 'name' => um_user('display_name') ); + $return = '' . UM()->user()->cached_user[$comment->user_id]['name'] . ''; + + um_reset_user(); + + } + } + + return $return; + } + + \ No newline at end of file diff --git a/core/um-filters-fields.php b/includes/core/um-filters-fields.php similarity index 87% rename from core/um-filters-fields.php rename to includes/core/um-filters-fields.php index 3232a68e..f1042d5d 100644 --- a/core/um-filters-fields.php +++ b/includes/core/um-filters-fields.php @@ -96,16 +96,14 @@ } /*** - *** @urls in description + *** @urls in textarea ***/ add_filter('um_profile_field_filter_hook__textarea', 'um_profile_field_filter_hook__textarea', 99, 2); function um_profile_field_filter_hook__textarea( $value, $data ) { - global $ultimatemember; - if ( isset( $data ) && isset( $data['html'] ) && $data['html'] == 1 ) return $value; - $value = esc_textarea( $value ); + $value = esc_textarea( $value ); $value = preg_replace('$(https?://[a-z0-9_./?=&#-]+)(?![^<>]*>)$i', ' $1 ', $value." "); $value = preg_replace('$(www\.[a-z0-9_./?=&#-]+)(?![^<>]*>)$i', '$1 ', $value." "); $value = wpautop($value); @@ -113,27 +111,30 @@ return $value; } - add_filter('um_profile_field_filter_hook__description', 'um_profile_field_filter_hook__description', 99, 2); - function um_profile_field_filter_hook__description( $value, $data ) { - global $ultimatemember; - if ( isset( $data ) && isset( $data['html'] ) && $data['html'] == 1 ) - return $value; + /*** + *** @urls in description + ***/ + add_filter('um_profile_field_filter_hook__description', 'um_profile_field_filter_hook__description', 99, 2); + function um_profile_field_filter_hook__description( $value, $data ) { + + if ( isset( $data ) && isset( $data['html'] ) && $data['html'] == 1 ) + return $value; + + $value = esc_textarea( $value ); + $value = preg_replace('$(https?://[a-z0-9_./?=&#-]+)(?![^<>]*>)$i', ' $1 ', $value." "); + $value = preg_replace('$(www\.[a-z0-9_./?=&#-]+)(?![^<>]*>)$i', '$1 ', $value." "); + + return $value; + } - $value = esc_textarea( $value ); - $value = preg_replace('$(https?://[a-z0-9_./?=&#-]+)(?![^<>]*>)$i', ' $1 ', $value." "); - $value = preg_replace('$(www\.[a-z0-9_./?=&#-]+)(?![^<>]*>)$i', '$1 ', $value." "); - - return $value; - } /*** *** @time ***/ add_filter('um_profile_field_filter_hook__time', 'um_profile_field_filter_hook__time', 99, 2); function um_profile_field_filter_hook__time( $value, $data ) { - global $ultimatemember; - $value = $ultimatemember->datetime->format( $value, $data['format'] ); + $value = UM()->datetime()->format( $value, $data['format'] ); $value = str_replace('am', 'a.m.', $value ); $value = str_replace('pm', 'p.m.', $value ); @@ -145,12 +146,10 @@ ***/ add_filter('um_profile_field_filter_hook__date', 'um_profile_field_filter_hook__date', 99, 2); function um_profile_field_filter_hook__date( $value, $data ) { - global $ultimatemember; - if ( $data['pretty_format'] == 1 ) { - $value = $ultimatemember->datetime->get_age( $value ); + $value = UM()->datetime()->get_age( $value ); } else { - $value = $ultimatemember->datetime->format( $value, $data['format'] ); + $value = UM()->datetime()->format( $value, $data['format'] ); } return $value; @@ -161,8 +160,6 @@ ***/ add_filter('um_profile_field_filter_hook__file', 'um_profile_field_filter_hook__file', 99, 2); function um_profile_field_filter_hook__file( $value, $data ) { - global $ultimatemember; - $uri = um_user_uploads_uri() . $value; $extension = pathinfo( $uri, PATHINFO_EXTENSION); @@ -170,13 +167,13 @@ $value = __('This file has been removed.'); } else { $value = ''; + +
            '; } return $value; @@ -208,7 +205,6 @@ ***/ add_filter('um_profile_field_filter_hook__', 'um_profile_field_filter_hook__', 99, 2); function um_profile_field_filter_hook__( $value, $data ) { - global $ultimatemember; if ( !$value ) return ''; if ( ( isset( $data['validate'] ) && $data['validate'] != '' && strstr( $data['validate'], 'url' ) ) || ( isset( $data['type'] ) && $data['type'] == 'url' ) ) { @@ -257,7 +253,7 @@ $value = str_replace('https://https://','https://',$value); $value = str_replace('http://https://','https://',$value); - $value = $ultimatemember->shortcodes->emotize( $value ); + $value = UM()->shortcodes()->emotize( $value ); return $value; } @@ -268,13 +264,11 @@ add_filter('um_get_form_fields', 'um_get_form_fields', 99); function um_get_form_fields( $array ) { - global $ultimatemember; - - $form_id = (isset ( $ultimatemember->fields->set_id ) ) ? $ultimatemember->fields->set_id : null; - $mode = (isset( $ultimatemember->fields->set_mode ) ) ? $ultimatemember->fields->set_mode : null; + $form_id = (isset ( UM()->fields()->set_id ) ) ? UM()->fields()->set_id : null; + $mode = (isset( UM()->fields()->set_mode ) ) ? UM()->fields()->set_mode : null; if ( $form_id && $mode ) { - $array = $ultimatemember->query->get_attr('custom_fields', $form_id ); + $array = UM()->query()->get_attr('custom_fields', $form_id ); } else { $array = ''; } @@ -351,8 +345,6 @@ add_filter('um_is_selected_filter_value','um_is_selected_filter_value',1,9); add_filter('um_select_dropdown_dynamic_option_value','um_is_selected_filter_value',1,10); function um_is_selected_filter_value( $value ){ - global $ultimatemember; - if( ! um_get_option('um_force_utf8_strings') ) return $value; @@ -370,8 +362,6 @@ */ add_filter('um_select_dropdown_dynamic_options','um_select_dropdown_dynamic_options_to_utf8',2,10); function um_select_dropdown_dynamic_options_to_utf8( $options, $data ){ - global $ultimatemember; - if( ! um_get_option('um_force_utf8_strings') ) return $options; @@ -437,10 +427,8 @@ add_filter('um_field_select_default_value','um_option_match_callback_view_field', 10, 2); add_filter('um_field_multiselect_default_value','um_option_match_callback_view_field', 10, 2); function um_option_match_callback_view_field( $value, $data ){ - global $ultimatemember; - if( ! empty( $data['custom_dropdown_options_source'] ) ){ - return $ultimatemember->fields->get_option_value_from_callback( $value, $data, $data['type'] ); + return UM()->fields()->get_option_value_from_callback( $value, $data, $data['type'] ); } return $value; @@ -464,7 +452,7 @@ $arr_options = array(); if( is_array( $options ) ){ foreach ( $options as $item ) { - $arr_options[] = __( $item, 'ultimate-member'); + $arr_options[] = __( $item, 'ultimate-member' ); } } diff --git a/core/um-filters-files.php b/includes/core/um-filters-files.php similarity index 100% rename from core/um-filters-files.php rename to includes/core/um-filters-files.php diff --git a/core/um-filters-language.php b/includes/core/um-filters-language.php similarity index 58% rename from core/um-filters-language.php rename to includes/core/um-filters-language.php index ca82f262..292a8077 100644 --- a/core/um-filters-language.php +++ b/includes/core/um-filters-language.php @@ -2,30 +2,29 @@ add_filter("um_localize_permalink_filter","um_localize_permalink_filter",10,3); function um_localize_permalink_filter( $core_pages, $page_id, $profile_url ){ - global $ultimatemember; - if ( function_exists('icl_get_current_language') && icl_get_current_language() != icl_get_default_language() ) { - if ( get_the_ID() > 0 && get_post_meta( get_the_ID(), '_um_wpml_user', true ) == 1 ) { - $profile_url = get_permalink( get_the_ID() ); - } - } + if ( function_exists('icl_get_current_language') && icl_get_current_language() != icl_get_default_language() ) { + if ( get_the_ID() > 0 && get_post_meta( get_the_ID(), '_um_wpml_user', true ) == 1 ) { + $profile_url = get_permalink( get_the_ID() ); + } + } - // WPML compatibility - if ( function_exists('icl_object_id') ) { - $language_code = ICL_LANGUAGE_CODE; - $lang_post_id = icl_object_id( $page_id , 'page', true, $language_code ); + // WPML compatibility + if ( function_exists('icl_object_id') ) { + $language_code = ICL_LANGUAGE_CODE; + $lang_post_id = icl_object_id( $page_id , 'page', true, $language_code ); - if($lang_post_id != 0) { - $profile_url = get_permalink( $lang_post_id ); - }else { - // No page found, it's most likely the homepage - global $sitepress; - $profile_url = $sitepress->language_url( $language_code ); - } + if($lang_post_id != 0) { + $profile_url = get_permalink( $lang_post_id ); + }else { + // No page found, it's most likely the homepage + global $sitepress; + $profile_url = $sitepress->language_url( $language_code ); + } - } + } - return $profile_url; + return $profile_url; } @@ -40,7 +39,7 @@ function um_core_page_id_filter( $page_id ){ */ add_filter( 'icl_ls_languages','um_core_page_wpml_permalink', 10, 1 ); function um_core_page_wpml_permalink( $array ){ - global $ultimatemember, $sitepress; + global $sitepress; if( ! um_is_core_page("user") ) return $array; if( ! defined("ICL_LANGUAGE_CODE") ) return $array; if( ! function_exists('icl_object_id') ) return $array; diff --git a/core/um-filters-login.php b/includes/core/um-filters-login.php similarity index 100% rename from core/um-filters-login.php rename to includes/core/um-filters-login.php diff --git a/core/um-filters-members.php b/includes/core/um-filters-members.php similarity index 63% rename from core/um-filters-members.php rename to includes/core/um-filters-members.php index 18fa34fe..184fd3f6 100644 --- a/core/um-filters-members.php +++ b/includes/core/um-filters-members.php @@ -3,34 +3,30 @@ /*** *** @Members Filter Hooks ***/ - add_filter('um_prepare_user_query_args', 'um_prepare_user_query_args', 10, 2); - add_filter('um_prepare_user_query_args', 'um_add_search_to_query', 50, 2); - add_filter('um_prepare_user_query_args', 'um_search_usernames_emails', 51, 2); - add_filter('um_prepare_user_query_args', 'um_remove_special_users_from_list', 99, 2); + add_filter( 'um_prepare_user_query_args', 'um_prepare_user_query_args', 10, 2 ); + add_filter( 'um_prepare_user_query_args', 'um_add_search_to_query', 50, 2 ); + add_filter( 'um_prepare_user_query_args', 'um_search_usernames_emails', 51, 2 ); + add_filter( 'um_prepare_user_query_args', 'um_remove_special_users_from_list', 99, 2 ); /*** *** @WP API user search ***/ function um_search_usernames_emails( $query_args, $args ) { - global $ultimatemember; extract( $args ); - $query = $ultimatemember->permalinks->get_query_array(); + $query = UM()->permalinks()->get_query_array(); $arr_columns = array(); - foreach( $ultimatemember->members->core_search_fields as $key ) { - - if ( isset( $query[ $key ] ) && ! empty( $query[ $key ] ) ) { + foreach ( UM()->members()->core_search_fields as $key ) { + if ( ! empty( $query[ $key ] ) ) { $arr_columns[] = $key; $query_args['search'] = '*' . $query[ $key ] .'*'; - - } } - if( ! empty( $arr_columns ) ){ + if ( ! empty( $arr_columns ) ) $query_args['search_columns'] = $arr_columns; - } + return $query_args; } @@ -38,12 +34,11 @@ *** @Remove users we do not need to show in directory ***/ function um_remove_special_users_from_list( $query_args, $args ) { - global $ultimatemember; extract( $args ); $query_args['meta_query']['relation'] = 'AND'; - if ( ! um_user_can('can_edit_everyone') ) { + if ( ! UM()->roles()->um_user_can( 'can_edit_everyone' ) ) { $query_args['meta_query'][] = array( 'key' => 'account_status', @@ -53,13 +48,13 @@ } - if ( ! um_user_can('can_edit_everyone') || um_get_option('account_hide_in_directory') ) { + if ( ! UM()->roles()->um_user_can( 'can_edit_everyone' ) || um_get_option('account_hide_in_directory') ) { $query_args['meta_query'][] = array( "relation" => "OR", array( - 'key' => 'hide_in_members', - 'value' => '', - 'compare' => 'NOT EXISTS' + 'key' => 'hide_in_members', + 'value' => '', + 'compare' => 'NOT EXISTS' ), array( 'key' => 'hide_in_members', @@ -70,19 +65,16 @@ } - if( um_user_can('can_view_all') && um_user_can('can_view_roles') ){ + if ( UM()->roles()->um_user_can( 'can_view_all' ) && UM()->roles()->um_user_can( 'can_view_roles' ) ) { - $role = um_user('role'); + $role = um_user( 'role' ); - $permissions = $ultimatemember->query->role_data( $role ); - - if ( isset( $permissions['can_view_roles'] ) && is_serialized( $permissions['can_view_roles'] ) ){ - $roles = unserialize( $permissions['can_view_roles'] ); - }else{ - $roles = $permissions['can_view_roles']; - } + $permissions = UM()->roles()->role_data( $role ); - if( $roles && is_array( $roles ) ){ + if ( ! empty( $permissions['can_view_roles'] ) ) + $roles = maybe_unserialize( $permissions['can_view_roles'] ); + + if ( isset( $roles ) && is_array( $roles ) ) { $query_args['meta_query'][] = array( 'key' => 'role', 'value' => $roles, @@ -99,56 +91,57 @@ *** @adds search parameters ***/ function um_add_search_to_query( $query_args, $args ){ - global $ultimatemember; extract( $args ); if ( isset( $_REQUEST['um_search'] ) ) { - $query = $ultimatemember->permalinks->get_query_array(); + $query = UM()->permalinks()->get_query_array(); // if searching - if( isset( $query['search'] ) ) { + if ( isset( $query['search'] ) ) { $query_args['search'] = '*' . um_filter_search( $query['search'] ) . '*'; unset( $query['search'] ); } if ( $query && is_array( $query ) ) { - foreach( $query as $field => $value ) { + foreach ( $query as $field => $value ) { - if(in_array($field, array('members_page'))) continue; + if ( in_array( $field, array( 'members_page' ) ) ) continue; $serialize_value = serialize( strval( $value ) ); if ( $value && $field != 'um_search' && $field != 'page_id' ) { - if( strstr( $field, 'role_') ){ + if ( strstr( $field, 'role_' ) ) $field = 'role'; - } - if ( !in_array( $field, $ultimatemember->members->core_search_fields ) ) { + if ( ! in_array( $field, UM()->members()->core_search_fields ) ) { - $field_query = array( - array( - 'key' => $field, - 'value' => trim( $value ), - 'compare' => '=', - ), - array( - 'key' => $field, - 'value' => trim( $value ), - 'compare' => 'LIKE', - ), - array( - 'key' => $field, - 'value' => trim( $serialize_value ), - 'compare' => 'LIKE', - ), - 'relation' => 'OR', - ); - + if ( 'role' == $field ) { + $query_args['role__in'] = trim( $value ); + } else { + $field_query = array( + array( + 'key' => $field, + 'value' => trim( $value ), + 'compare' => '=', + ), + array( + 'key' => $field, + 'value' => trim( $value ), + 'compare' => 'LIKE', + ), + array( + 'key' => $field, + 'value' => trim( $serialize_value ), + 'compare' => 'LIKE', + ), + 'relation' => 'OR', + ); - $field_query = apply_filters("um_query_args_{$field}__filter", $field_query ); - $query_args['meta_query'][] = $field_query; + $field_query = apply_filters( "um_query_args_{$field}__filter", $field_query ); + $query_args['meta_query'][] = $field_query; + } } @@ -160,11 +153,10 @@ } // allow filtering - $query_args = apply_filters('um_query_args_filter', $query_args ); + $query_args = apply_filters( 'um_query_args_filter', $query_args ); - if ( count ($query_args['meta_query']) == 1 ) { + if ( count( $query_args['meta_query'] ) == 1 ) unset( $query_args['meta_query'] ); - } return $query_args; @@ -173,8 +165,7 @@ /*** *** @adds main parameters ***/ - function um_prepare_user_query_args($query_args, $args){ - global $ultimatemember; + function um_prepare_user_query_args( $query_args, $args ) { extract( $args ); $query_args['fields'] = 'ID'; @@ -185,7 +176,7 @@ // must have a profile photo if ( $has_profile_photo == 1 ) { - if( um_get_option('use_gravatars') ){ + if ( um_get_option( 'use_gravatars' ) ) { $query_args['meta_query'][] = array( 'relation' => 'OR', array( @@ -205,7 +196,7 @@ ) ); - }else{ + } else { $query_args['meta_query'][] = array( 'relation' => 'OR', array( @@ -234,20 +225,23 @@ // show specific usernames if ( isset( $show_these_users ) && $show_these_users && is_array( $show_these_users ) ) { - foreach( $show_these_users as $username ) { + foreach ( $show_these_users as $username ) { $users_array[] = username_exists( $username ); } $query_args['include'] = $users_array; } // add roles to appear in directory - if ( !empty( $roles ) ) { + if ( ! empty( $roles ) ) { - $query_args['meta_query'][] = array( + //since WP4.4 use 'role__in' argument + $query_args['role__in'] = $roles; + + /*$query_args['meta_query'][] = array( 'key' => 'role', 'value' => $roles, 'compare' => 'IN' - ); + );*/ } @@ -366,14 +360,12 @@ add_filter('um_search_select_fields','um_search_select_fields'); function um_search_select_fields( $atts ){ - global $ultimatemember; - - if( isset( $atts['custom_dropdown_options_source'] ) && ! empty( $atts['custom_dropdown_options_source'] ) ){ - $atts['custom'] = true; - $atts['options'] = $ultimatemember->fields->get_options_from_callback( $atts, $atts['type'] ); + if( isset( $atts['custom_dropdown_options_source'] ) && ! empty( $atts['custom_dropdown_options_source'] ) ){ + $atts['custom'] = true; + $atts['options'] = UM()->fields()->get_options_from_callback( $atts, $atts['type'] ); } - return $atts; + return $atts; } /** diff --git a/core/um-filters-misc.php b/includes/core/um-filters-misc.php similarity index 100% rename from core/um-filters-misc.php rename to includes/core/um-filters-misc.php diff --git a/core/um-filters-navmenu.php b/includes/core/um-filters-navmenu.php similarity index 95% rename from core/um-filters-navmenu.php rename to includes/core/um-filters-navmenu.php index be0ed757..67ace8d7 100644 --- a/core/um-filters-navmenu.php +++ b/includes/core/um-filters-navmenu.php @@ -5,14 +5,12 @@ ***/ add_filter( 'wp_nav_menu_items', 'um_add_custom_message_to_menu', 10, 2 ); function um_add_custom_message_to_menu( $items, $args ) { - global $ultimatemember; - // this feature required logged in user if ( !is_user_logged_in() ) return $items; um_fetch_user( get_current_user_id() ); - $items = $ultimatemember->shortcodes->convert_user_tags( $items ); + $items = UM()->shortcodes()->convert_user_tags( $items ); um_reset_user(); return $items; diff --git a/core/um-filters-profile.php b/includes/core/um-filters-profile.php similarity index 77% rename from core/um-filters-profile.php rename to includes/core/um-filters-profile.php index 152268c5..acfcb97e 100644 --- a/core/um-filters-profile.php +++ b/includes/core/um-filters-profile.php @@ -1,26 +1,11 @@ __('About','ultimate-member'), - 'icon' => 'um-faicon-user' - ); - - return $tabs; - } - /*** *** @dynamic profile page title ***/ add_filter('wp_title', 'um_dynamic_user_profile_pagetitle', 100000, 2 ); add_filter('pre_get_document_title', 'um_dynamic_user_profile_pagetitle', 100000, 2 ); function um_dynamic_user_profile_pagetitle( $title, $sep = '' ) { - global $paged, $page, $ultimatemember; $profile_title = um_get_option('profile_title'); @@ -44,14 +29,12 @@ ***/ add_filter('the_title', 'um_dynamic_user_profile_title', 100000, 2 ); function um_dynamic_user_profile_title( $title, $id = '' ) { - global $ultimatemember; - if( is_admin() ){ return $title; } - if ( $id == $ultimatemember->permalinks->core['user'] && in_the_loop() ) { + if ( $id == UM()->config()->permalinks['user'] && in_the_loop() ) { if ( um_is_core_page('user') && um_get_requested_user() ) { $title = um_get_display_name( um_get_requested_user() ); } else if ( um_is_core_page('user') && is_user_logged_in() ) { @@ -74,8 +57,7 @@ ***/ add_filter('um_predefined_fields_hook','um_change_profile_cover_photo_label',10,1); function um_change_profile_cover_photo_label( $args ){ - global $ultimatemember; - $max_size = $ultimatemember->files->format_bytes( $args['cover_photo']['max_size'] ); + $max_size = UM()->files()->format_bytes( $args['cover_photo']['max_size'] ); list( $file_size, $unit ) = explode(' ', $max_size ); if( $file_size >= 999999999 ){ @@ -92,8 +74,7 @@ ***/ add_filter('um_predefined_fields_hook','um_change_profile_photo_label',10,1); function um_change_profile_photo_label( $args ){ - global $ultimatemember; - $max_size = $ultimatemember->files->format_bytes( $args['profile_photo']['max_size'] ); + $max_size = UM()->files()->format_bytes( $args['profile_photo']['max_size'] ); list( $file_size, $unit ) = explode(' ', $max_size ); if( $file_size >= 999999999 ){ diff --git a/core/um-filters-user.php b/includes/core/um-filters-user.php similarity index 81% rename from core/um-filters-user.php rename to includes/core/um-filters-user.php index 076d398f..8f3a1e86 100644 --- a/core/um-filters-user.php +++ b/includes/core/um-filters-user.php @@ -1,29 +1,11 @@ __('Approve Membership','ultimate-member') ); - $actions['um_reject_membership'] = array( 'label' => __('Reject Membership','ultimate-member') ); - $actions['um_put_as_pending'] = array( 'label' => __('Put as Pending Review','ultimate-member') ); - $actions['um_resend_activation'] = array( 'label' => __('Resend Activation E-mail','ultimate-member') ); - $actions['um_deactivate'] = array( 'label' => __('Deactivate','ultimate-member') ); - $actions['um_reenable'] = array( 'label' => __('Reactivate','ultimate-member') ); - //$actions['um_delete'] = array( 'label' => __('Delete','ultimate-member') ); - - return $actions; - } /*** *** @Main admin user actions ***/ add_filter('um_admin_user_actions_hook', 'um_admin_user_actions_hook', 1); - function um_admin_user_actions_hook( $actions ){ + function um_admin_user_actions_hook( $actions ) { $actions = null; @@ -56,7 +38,7 @@ $actions['um_reenable'] = array( 'label' => __('Reactivate this account','ultimate-member') ); } - if ( um_current_user_can( 'delete', um_profile_id() ) ) { + if ( UM()->roles()->um_current_user_can( 'delete', um_profile_id() ) ) { $actions['um_delete'] = array( 'label' => __('Delete this user','ultimate-member') ); } @@ -80,11 +62,9 @@ */ add_filter('um_clean_user_basename_filter','um_clean_user_basename_filter',2,10); function um_clean_user_basename_filter( $value, $raw ){ - global $wpdb; - $permalink_base = um_get_option('permalink_base'); - $user_query = new WP_User_Query( + $user_query = new WP_User_Query( array( 'meta_query' => array( 'relation' => 'AND', @@ -193,9 +173,7 @@ */ add_filter('um_before_update_profile','um_before_update_profile',2,10); function um_before_update_profile( $changes, $user_id ){ - global $ultimatemember; - - if( ! um_get_option('um_force_utf8_strings') ) + if( ! um_get_option('um_force_utf8_strings') ) return $changes; foreach( $changes as $key => $value ) { diff --git a/core/um-navmenu-walker-edit.php b/includes/core/um-navmenu-walker-edit.php similarity index 97% rename from core/um-navmenu-walker-edit.php rename to includes/core/um-navmenu-walker-edit.php index ffb154e2..3a156e80 100644 --- a/core/um-navmenu-walker-edit.php +++ b/includes/core/um-navmenu-walker-edit.php @@ -67,8 +67,6 @@ class UM_Menu_Item_Custom_Fields_Editor { } public static function _fields( $id, $item, $depth, $args ) { - global $ultimatemember; - ?>
            @@ -115,7 +113,7 @@ class UM_Menu_Item_Custom_Fields_Editor {

            - query->get_roles() as $role_id => $role) { ?> + roles()->get_roles() as $role_id => $role) { ?>    diff --git a/core/um-navmenu-walker.php b/includes/core/um-navmenu-walker.php similarity index 100% rename from core/um-navmenu-walker.php rename to includes/core/um-navmenu-walker.php diff --git a/core/um-navmenu.php b/includes/core/um-navmenu.php similarity index 100% rename from core/um-navmenu.php rename to includes/core/um-navmenu.php diff --git a/core/lib/array2xml.php b/includes/lib/array2xml.php similarity index 100% rename from core/lib/array2xml.php rename to includes/lib/array2xml.php diff --git a/core/lib/browser.php b/includes/lib/browser.php similarity index 100% rename from core/lib/browser.php rename to includes/lib/browser.php diff --git a/includes/lib/mobiledetect/class-mobile-detect.php b/includes/lib/mobiledetect/class-mobile-detect.php new file mode 100644 index 00000000..224d4339 --- /dev/null +++ b/includes/lib/mobiledetect/class-mobile-detect.php @@ -0,0 +1,1321 @@ + array('matches' => array( + // Opera Mini; @reference: http://dev.opera.com/articles/view/opera-binary-markup-language/ + 'application/x-obml2d', + // BlackBerry devices. + 'application/vnd.rim.html', + 'text/vnd.wap.wml', + 'application/vnd.wap.xhtml+xml' + )), + 'HTTP_X_WAP_PROFILE' => null, + 'HTTP_X_WAP_CLIENTID' => null, + 'HTTP_WAP_CONNECTION' => null, + 'HTTP_PROFILE' => null, + // Reported by Opera on Nokia devices (eg. C3). + 'HTTP_X_OPERAMINI_PHONE_UA' => null, + 'HTTP_X_NOKIA_GATEWAY_ID' => null, + 'HTTP_X_ORANGE_ID' => null, + 'HTTP_X_VODAFONE_3GPDPCONTEXT' => null, + 'HTTP_X_HUAWEI_USERID' => null, + // Reported by Windows Smartphones. + 'HTTP_UA_OS' => null, + // Reported by Verizon, Vodafone proxy system. + 'HTTP_X_MOBILE_GATEWAY' => null, + // Seen this on HTC Sensation. SensationXE_Beats_Z715e. + 'HTTP_X_ATT_DEVICEID' => null, + // Seen this on a HTC. + 'HTTP_UA_CPU' => array('matches' => array('ARM')), + ); + + /** + * List of mobile devices (phones). + * + * @var array + */ + protected static $phoneDevices = array( + 'iPhone' => '\biPhone\b|\biPod\b', // |\biTunes + 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+', + 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m', + 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6', + // @todo: Is 'Dell Streak' a tablet or a phone? ;) + 'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b', + 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925', + 'Samsung' => 'Samsung|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750', + 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)', + 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533', + 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile', + // http://www.micromaxinfo.com/mobiles/smartphones + // Added because the codes might conflict with Acer Tablets. + 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b', + // @todo Complete the regex. + 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; + 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;) + // http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH) + // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android. + 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790', + // http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones. + 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250', + 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)', + // Added simvalley mobile just for fun. They have some interesting devices. + // http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html + 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b', + // Wolfgang - a brand that is sold by Aldi supermarkets. + // http://www.wolfgangmobile.com/ + 'Wolfgang' => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q', + 'Alcatel' => 'Alcatel', + 'Nintendo' => 'Nintendo 3DS', + // http://en.wikipedia.org/wiki/Amoi + 'Amoi' => 'Amoi', + // http://en.wikipedia.org/wiki/INQ + 'INQ' => 'INQ', + // @Tapatalk is a mobile app; http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039 + 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser', + ); + + /** + * List of tablet devices. + * + * @var array + */ + protected static $tabletDevices = array( + 'iPad' => 'iPad|iPad.*Mobile', // @todo: check for mobile friendly emails topic. + 'NexusTablet' => 'Android.*Nexus[\s]+(7|9|10)|^.*Android.*Nexus(?:(?!Mobile).)*$', + 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-I9205|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T707A|SM-T807A|SM-T237P|SM-T807P|SM-P607T|SM-T217T|SM-T337T', // SCH-P709|SCH-P729|SM-T2558 - Samsung Mega - treat them like a regular phone. + // http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html + 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI)\b', + // Only the Surface tablets with Windows RT are considered mobile. + // http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx + 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)', + // http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT + 'HPTablet' => 'HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10', + // Watch out for PadFone, see #132. + // http://www.asus.com/de/Tablets_Mobile/Memo_Pad_Products/ + 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG', + 'BlackBerryTablet' => 'PlayBook|RIM Tablet', + 'HTCtablet' => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410', + 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617', + 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2', + // http://www.acer.ro/ac/ro/RO/content/drivers + // http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer) + // http://us.acer.com/ac/en/US/content/group/tablets + // http://www.acer.de/ac/de/DE/content/models/tablets/ + // Can conflict with Micromax and Motorola phones codes. + 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b', + // http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/ + // http://us.toshiba.com/tablets/tablet-finder + // http://www.toshiba.co.jp/regza/tablet/ + 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO', + // http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html + // http://www.lg.com/us/tablets + 'LGTablet' => '\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b', + 'FujitsuTablet' => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b', + // Prestigio Tablets http://www.prestigio.com/support + 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD', + // http://support.lenovo.com/en_GB/downloads/default.page?# + 'LenovoTablet' => 'Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)', + // http://www.dell.com/support/home/us/en/04/Products/tab_mob/tablets + 'DellTablet' => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7', + // http://www.yarvik.com/en/matrix/tablets/ + 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b', + 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB', + 'ArnovaTablet' => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2', + // http://www.intenso.de/kategorie_en.php?kategorie=33 + // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate + 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004', + // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/ + 'IRUTablet' => 'M702pro', + 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b', + // http://www.e-boda.ro/tablete-pc.html + 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)', + // http://www.allview.ro/produse/droseries/lista-tablete-pc/ + 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)', + // http://wiki.archosfans.com/index.php?title=Main_Page + 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b', + // http://www.ainol.com/plugin.php?identifier=ainol&module=product + 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark', + // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER + // Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser + // http://www.sony.jp/support/tablet/ + 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551', + // http://www.support.philips.com/support/catalog/worldproducts.jsp?userLanguage=en&userCountry=cn&categoryid=3G_LTE_TABLET_SU_CN_CARE&title=3G%20tablets%20/%20LTE%20range&_dyncharset=UTF-8 + 'PhilipsTablet' => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b', + // db + http://www.cube-tablet.com/buy-products.html + 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT', + // http://www.cobyusa.com/?p=pcat&pcat_id=3001 + 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010', + // http://www.match.net.cn/products.asp + 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733', + // http://www.msi.com/support + // @todo Research the Windows Tablets. + 'MSITablet' => 'MSI \b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\b', + // @todo http://www.kyoceramobile.com/support/drivers/ + // 'KyoceraTablet' => null, + // @todo http://intexuae.com/index.php/category/mobile-devices/tablets-products/ + // 'IntextTablet' => null, + // http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets) + // http://www.imp3.net/14/show.php?itemid=20454 + 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)', + // http://www.rock-chips.com/index.php?do=prod&pid=2 + 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A', + // http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/ + 'FlyTablet' => 'IQ310|Fly Vision', + // http://www.bqreaders.com/gb/tablets-prices-sale.html + 'bqTablet' => 'bq.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant)|Maxwell.*Lite|Maxwell.*Plus', + // http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290 + // http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets) + 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim', + // Nec or Medias Tab + 'NecTablet' => '\bN-06D|\bN-08D', + // Pantech Tablets: http://www.pantechusa.com/phones/ + 'PantechTablet' => 'Pantech.*P4100', + // Broncho Tablets: http://www.broncho.cn/ (hard to find) + 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)', + // http://versusuk.com/support.html + 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b', + // http://www.zync.in/index.php/our-products/tablet-phablets + 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900', + // http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/ + 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA', + // https://www.nabitablet.com/ + 'NabiTablet' => 'Android.*\bNabi', + 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build', + // French Danew Tablets http://www.danew.com/produits-tablette.php + 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b', + // Texet Tablets and Readers http://www.texet.ru/tablet/ + 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE', + // Avoid detecting 'PLAYSTATION 3' as mobile. + 'PlaystationTablet' => 'Playstation.*(Portable|Vita)', + // http://www.trekstor.de/surftabs.html + 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab', + // http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets + 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b', + // http://www.advandigital.com/index.php?link=content-product&jns=JP001 + // because of the short codenames we have to include whitespaces to reduce the possible conflicts. + 'AdvanTablet' => 'Android.* \b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\b ', + // http://www.danytech.com/category/tablet-pc + 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1', + // http://www.galapad.net/product.html + 'GalapadTablet' => 'Android.*\bG1\b', + // http://www.micromaxinfo.com/tablet/funbook + 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b', + // http://www.karbonnmobiles.com/products_tablet.php + 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b', + // http://www.myallfine.com/Products.asp + 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide', + // http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr= + 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b', + // http://www.yonesnav.com/products/products.php + 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026', + // http://www.cjshowroom.com/eproducts.aspx?classcode=004001001 + // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html) + 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503', + // http://www.gloryunion.cn/products.asp + // http://www.allwinnertech.com/en/apply/mobile.html + // http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB) + // @todo: Softwiner tablets? + // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions. + 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G + // http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118 + 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10', + // http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/ + // @todo: add more tests. + 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)', + // http://hclmetablet.com/India/index.php + 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync', + // http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html + 'DPSTablet' => 'DPS Dream 9|DPS Dual 7', + // http://www.visture.com/index.asp + 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10', + // http://www.mijncresta.nl/tablet + 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989', + // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309 + 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b', + // Concorde tab + 'ConcordeTablet' => 'Concorde([ ]+)?Tab|ConCorde ReadMan', + // GoClever Tablets - http://www.goclever.com/uk/products,c1/tablet,c5/ + 'GoCleverTablet' => 'GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042', + // Modecom Tablets - http://www.modecom.eu/tablets/portal/ + 'ModecomTablet' => 'FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003', + // Vonino Tablets - http://www.vonino.eu/tablets + 'VoninoTablet' => '\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\bQ8\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\b', + // ECS Tablets - http://www.ecs.com.tw/ECSWebSite/Product/Product_Tablet_List.aspx?CategoryID=14&MenuID=107&childid=M_107&LanID=0 + 'ECSTablet' => 'V07OT2|TM105A|S10OT1|TR10CS1', + // Storex Tablets - http://storex.fr/espace_client/support.html + // @note: no need to add all the tablet codes since they are guided by the first regex. + 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab', + // Generic Vodafone tablets. + 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7', + // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb + // Aka: http://www.essentielb.fr/ + 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2', + // Ross & Moor - http://ross-moor.ru/ + 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711', + // i-mobile http://product.i-mobilephone.com/Mobile_Device + 'iMobileTablet' => 'i-mobile i-note', + // http://www.tolino.de/de/vergleichen/ + 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine', + // AudioSonic - a Kmart brand + // http://www.kmart.com.au/webapp/wcs/stores/servlet/Search?langId=-1&storeId=10701&catalogId=10001&categoryId=193001&pageSize=72¤tPage=1&searchCategory=193001%2b4294965664&sortBy=p_MaxPrice%7c1 + 'AudioSonicTablet' => '\bC-22Q|T7-QC|T-17B|T-17P\b', + // AMPE Tablets - http://www.ampe.com.my/product-category/tablets/ + // @todo: add them gradually to avoid conflicts. + 'AMPETablet' => 'Android.* A78 ', + // Skk Mobile - http://skkmobile.com.ph/product_tablets.php + 'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)', + // Tecno Mobile (only tablet) - http://www.tecno-mobile.com/index.php/product?filterby=smart&list_order=all&page=1 + 'TecnoTablet' => 'TECNO P9', + // JXD (consoles & tablets) - http://jxd.hk/products.asp?selectclassid=009008&clsid=3 + 'JXDTablet' => 'Android.*\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b', + // i-Joy tablets - http://www.i-joy.es/en/cat/products/tablets/ + 'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)', + // http://www.intracon.eu/tablet + 'FX2Tablet' => 'FX2 PAD7|FX2 PAD10', + // http://www.xoro.de/produkte/ + // @note: Might be the same brand with 'Simply tablets' + 'XoroTablet' => 'KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151', + // http://www1.viewsonic.com/products/computing/tablets/ + 'ViewsonicTablet' => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a', + // http://www.odys.de/web/internet-tablet_en.html + 'OdysTablet' => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10', + // http://www.captiva-power.de/products.html#tablets-en + 'CaptivaTablet' => 'CAPTIVA PAD', + // IconBIT - http://www.iconbit.com/products/tablets/ + 'IconbitTablet' => 'NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S', + // http://www.teclast.com/topic.php?channelID=70&topicID=140&pid=63 + 'TeclastTablet' => 'T98 4G|\bP80\b|\bX90HD\b|X98 Air|X98 Air 3G|\bX89\b|P80 3G|\bX80h\b|P98 Air|\bX89HD\b|P98 3G|\bP90HD\b|P89 3G|X98 3G|\bP70h\b|P79HD 3G|G18d 3G|\bP79HD\b|\bP89s\b|\bA88\b|\bP10HD\b|\bP19HD\b|G18 3G|\bP78HD\b|\bA78\b|\bP75\b|G17s 3G|G17h 3G|\bP85t\b|\bP90\b|\bP11\b|\bP98t\b|\bP98HD\b|\bG18d\b|\bP85s\b|\bP11HD\b|\bP88s\b|\bA80HD\b|\bA80se\b|\bA10h\b|\bP89\b|\bP78s\b|\bG18\b|\bP85\b|\bA70h\b|\bA70\b|\bG17\b|\bP18\b|\bA80s\b|\bA11s\b|\bP88HD\b|\bA80h\b|\bP76s\b|\bP76h\b|\bP98\b|\bA10HD\b|\bP78\b|\bP88\b|\bA11\b|\bA10t\b|\bP76a\b|\bP76t\b|\bP76e\b|\bP85HD\b|\bP85a\b|\bP86\b|\bP75HD\b|\bP76v\b|\bA12\b|\bP75a\b|\bA15\b|\bP76Ti\b|\bP81HD\b|\bA10\b|\bT760VE\b|\bT720HD\b|\bP76\b|\bP73\b|\bP71\b|\bP72\b|\bT720SE\b|\bC520Ti\b|\bT760\b|\bT720VE\b|T720-3GE|T720-WiFi', + 'JaytechTablet' => 'TPC-PA762', + 'BlaupunktTablet' => 'Endeavour 800NG|Endeavour 1010', + // http://www.digma.ru/support/download/ + // @todo: Ebooks also (if requested) + 'DigmaTablet' => '\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b', + // http://www.evolioshop.com/ro/tablete-pc.html + // http://www.evolio.ro/support/downloads_static.html?cat=2 + // @todo: Research some more + 'EvolioTablet' => 'ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b', + // @todo http://www.lavamobiles.com/tablets-data-cards + 'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY', + // https://www.celkonmobiles.com/?_a=categoryphones&sid=2 + 'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b', + // http://www.mi.com/en + 'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b', + // http://www.nbru.cn/index.html + 'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One', + // http://navroad.com/products/produkty/tablety/ + 'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI', + // http://www.datawind.com/ubislate/ + 'UbislateTablet' => 'UbiSlate[\s]?7C', + // http://www.pocketbook-int.com/ru/support + 'PocketBookTablet' => 'Pocketbook', + // http://www.tesco.com/direct/hudl/ + 'Hudl' => 'Hudl HT7S3', + // http://www.telstra.com.au/home-phone/thub-2/ + 'TelstraTablet' => 'T-Hub2', + 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bJolla\b' + ); + + /** + * List of mobile Operating Systems. + * + * @var array + */ + protected static $operatingSystems = array( + 'AndroidOS' => 'Android', + 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os', + 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino', + 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b', + // @reference: http://en.wikipedia.org/wiki/Windows_Mobile + 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;', + // @reference: http://en.wikipedia.org/wiki/Windows_Phone + // http://wifeng.cn/?r=blog&a=view&id=106 + // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx + // http://msdn.microsoft.com/library/ms537503.aspx + 'WindowsPhoneOS' => 'Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;', + 'iOS' => '\biPhone.*Mobile|\biPod|\biPad', + // http://en.wikipedia.org/wiki/MeeGo + // @todo: research MeeGo in UAs + 'MeeGoOS' => 'MeeGo', + // http://en.wikipedia.org/wiki/Maemo + // @todo: research Maemo in UAs + 'MaemoOS' => 'Maemo', + 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135 + 'webOS' => 'webOS|hpwOS', + 'badaOS' => '\bBada\b', + 'BREWOS' => 'BREW', + ); + + /** + * List of mobile User Agents. + * + * @var array + */ + protected static $browsers = array( + // @reference: https://developers.google.com/chrome/mobile/docs/user-agent + 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?', + 'Dolfin' => '\bDolfin\b', + 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+', + 'Skyfire' => 'Skyfire', + 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+ + 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile', + 'Bolt' => 'bolt', + 'TeaShark' => 'teashark', + 'Blazer' => 'Blazer', + // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3 + 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari', + // http://en.wikipedia.org/wiki/Midori_(web_browser) + //'Midori' => 'midori', + 'Tizen' => 'Tizen', + 'UCBrowser' => 'UC.*Browser|UCWEB', + 'baiduboxapp' => 'baiduboxapp', + 'baidubrowser' => 'baidubrowser', + // https://github.com/serbanghita/Mobile-Detect/issues/7 + 'DiigoBrowser' => 'DiigoBrowser', + // http://www.puffinbrowser.com/index.php + 'Puffin' => 'Puffin', + // http://mercury-browser.com/index.html + 'Mercury' => '\bMercury\b', + // http://en.wikipedia.org/wiki/Obigo_Browser + 'ObigoBrowser' => 'Obigo', + // http://en.wikipedia.org/wiki/NetFront + 'NetFront' => 'NF-Browser', + // @reference: http://en.wikipedia.org/wiki/Minimo + // http://en.wikipedia.org/wiki/Vision_Mobile_Browser + 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger', + ); + + /** + * Utilities. + * + * @var array + */ + protected static $utilities = array( + // Experimental. When a mobile device wants to switch to 'Desktop Mode'. + // http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/ + // https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011 + 'DesktopMode' => 'WPDesktop', + 'TV' => 'SonyDTV|HbbTV', // experimental + 'WebKit' => '(webkit)[ /]([\w.]+)', + 'Bot' => 'Googlebot|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|facebookexternalhit', + 'MobileBot' => 'Googlebot-Mobile|YahooSeeker/M1A1-R2D2', + // @todo: Include JXD consoles. + 'Console' => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\b', + 'Watch' => 'SM-V700', + ); + + /** + * All possible HTTP headers that represent the + * User-Agent string. + * + * @var array + */ + protected static $uaHttpHeaders = array( + // The default User-Agent string. + 'HTTP_USER_AGENT', + // Header can occur on devices using Opera Mini. + 'HTTP_X_OPERAMINI_PHONE_UA', + // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/ + 'HTTP_X_DEVICE_USER_AGENT', + 'HTTP_X_ORIGINAL_USER_AGENT', + 'HTTP_X_SKYFIRE_PHONE', + 'HTTP_X_BOLT_PHONE_UA', + 'HTTP_DEVICE_STOCK_UA', + 'HTTP_X_UCBROWSER_DEVICE_UA' + ); + + /** + * The individual segments that could exist in a User-Agent string. VER refers to the regular + * expression defined in the constant self::VER. + * + * @var array + */ + protected static $properties = array( + + // Build + 'Mobile' => 'Mobile/[VER]', + 'Build' => 'Build/[VER]', + 'Version' => 'Version/[VER]', + 'VendorID' => 'VendorID/[VER]', + + // Devices + 'iPad' => 'iPad.*CPU[a-z ]+[VER]', + 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]', + 'iPod' => 'iPod.*CPU[a-z ]+[VER]', + //'BlackBerry' => array('BlackBerry[VER]', 'BlackBerry [VER];'), + 'Kindle' => 'Kindle/[VER]', + + // Browser + 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'), + 'Coast' => array('Coast/[VER]'), + 'Dolfin' => 'Dolfin/[VER]', + // @reference: https://developer.mozilla.org/en-US/docs/User_Agent_Strings_Reference + 'Firefox' => 'Firefox/[VER]', + 'Fennec' => 'Fennec/[VER]', + // @reference: http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx + 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];'), + // http://en.wikipedia.org/wiki/NetFront + 'NetFront' => 'NetFront/[VER]', + 'NokiaBrowser' => 'NokiaBrowser/[VER]', + 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ), + 'Opera Mini' => 'Opera Mini/[VER]', + 'Opera Mobi' => 'Version/[VER]', + 'UC Browser' => 'UC Browser[VER]', + 'MQQBrowser' => 'MQQBrowser/[VER]', + 'MicroMessenger' => 'MicroMessenger/[VER]', + 'baiduboxapp' => 'baiduboxapp/[VER]', + 'baidubrowser' => 'baidubrowser/[VER]', + 'Iron' => 'Iron/[VER]', + // @note: Safari 7534.48.3 is actually Version 5.1. + // @note: On BlackBerry the Version is overwriten by the OS. + 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ), + 'Skyfire' => 'Skyfire/[VER]', + 'Tizen' => 'Tizen/[VER]', + 'Webkit' => 'webkit[ /][VER]', + + // Engine + 'Gecko' => 'Gecko/[VER]', + 'Trident' => 'Trident/[VER]', + 'Presto' => 'Presto/[VER]', + + // OS + 'iOS' => ' \bOS\b [VER] ', + 'Android' => 'Android [VER]', + 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'), + 'BREW' => 'BREW [VER]', + 'Java' => 'Java/[VER]', + // @reference: http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx + // @reference: http://en.wikipedia.org/wiki/Windows_NT#Releases + 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'), + 'Windows Phone' => 'Windows Phone [VER]', + 'Windows CE' => 'Windows CE/[VER]', + // http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd + 'Windows NT' => 'Windows NT [VER]', + 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'), + 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'), + ); + + /** + * Construct an instance of this class. + * + * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored. + * If left empty, will use the global _SERVER['HTTP_*'] vars instead. + * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT + * from the $headers array instead. + */ + public function __construct( + array $headers = null, + $userAgent = null + ) { + $this->setHttpHeaders($headers); + $this->setUserAgent($userAgent); + } + + /** + * Get the current script version. + * This is useful for the demo.php file, + * so people can check on what version they are testing + * for mobile devices. + * + * @return string The version number in semantic version format. + */ + public static function getScriptVersion() + { + return self::VERSION; + } + + /** + * Set the HTTP Headers. Must be PHP-flavored. This method will reset existing headers. + * + * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract + * the headers. The default null is left for backwards compatibilty. + */ + public function setHttpHeaders($httpHeaders = null) + { + //use global _SERVER if $httpHeaders aren't defined + if (!is_array($httpHeaders) || !count($httpHeaders)) { + $httpHeaders = $_SERVER; + } + + //clear existing headers + $this->httpHeaders = array(); + + //Only save HTTP headers. In PHP land, that means only _SERVER vars that + //start with HTTP_. + foreach ($httpHeaders as $key => $value) { + if (substr($key,0,5) == 'HTTP_') { + $this->httpHeaders[$key] = $value; + } + } + } + + /** + * Retrieves the HTTP headers. + * + * @return array + */ + public function getHttpHeaders() + { + return $this->httpHeaders; + } + + /** + * Retrieves a particular header. If it doesn't exist, no exception/error is caused. + * Simply null is returned. + * + * @param string $header The name of the header to retrieve. Can be HTTP compliant such as + * "User-Agent" or "X-Device-User-Agent" or can be php-esque with the + * all-caps, HTTP_ prefixed, underscore seperated awesomeness. + * + * @return string|null The value of the header. + */ + public function getHttpHeader($header) + { + //are we using PHP-flavored headers? + if (strpos($header, '_') === false) { + $header = str_replace('-', '_', $header); + $header = strtoupper($header); + } + + //test the alternate, too + $altHeader = 'HTTP_' . $header; + + //Test both the regular and the HTTP_ prefix + if (isset($this->httpHeaders[$header])) { + return $this->httpHeaders[$header]; + } elseif (isset($this->httpHeaders[$altHeader])) { + return $this->httpHeaders[$altHeader]; + } + + return null; + } + + public function getMobileHeaders() + { + return self::$mobileHeaders; + } + + /** + * Get all possible HTTP headers that + * can contain the User-Agent string. + * + * @return array List of HTTP headers. + */ + public function getUaHttpHeaders() + { + return self::$uaHttpHeaders; + } + + /** + * Set the User-Agent to be used. + * + * @param string $userAgent The user agent string to set. + * + * @return string|null + */ + public function setUserAgent($userAgent = null) + { + if (!empty($userAgent)) { + return $this->userAgent = $userAgent; + } else { + $this->userAgent = null; + foreach ($this->getUaHttpHeaders() as $altHeader) { + if (!empty($this->httpHeaders[$altHeader])) { // @todo: should use getHttpHeader(), but it would be slow. (Serban) + $this->userAgent .= $this->httpHeaders[$altHeader] . " "; + } + } + + return $this->userAgent = (!empty($this->userAgent) ? trim($this->userAgent) : null); + + } + } + + /** + * Retrieve the User-Agent. + * + * @return string|null The user agent if it's set. + */ + public function getUserAgent() + { + return $this->userAgent; + } + + /** + * Set the detection type. Must be one of self::DETECTION_TYPE_MOBILE or + * self::DETECTION_TYPE_EXTENDED. Otherwise, nothing is set. + * + * @deprecated since version 2.6.9 + * + * @param string $type The type. Must be a self::DETECTION_TYPE_* constant. The default + * parameter is null which will default to self::DETECTION_TYPE_MOBILE. + */ + public function setDetectionType($type = null) + { + if ($type === null) { + $type = self::DETECTION_TYPE_MOBILE; + } + + if ($type != self::DETECTION_TYPE_MOBILE && $type != self::DETECTION_TYPE_EXTENDED) { + return; + } + + $this->detectionType = $type; + } + + public function getMatchingRegex() + { + return $this->matchingRegex; + } + + public function getMatchesArray() + { + return $this->matchesArray; + } + + /** + * Retrieve the list of known phone devices. + * + * @return array List of phone devices. + */ + public static function getPhoneDevices() + { + return self::$phoneDevices; + } + + /** + * Retrieve the list of known tablet devices. + * + * @return array List of tablet devices. + */ + public static function getTabletDevices() + { + return self::$tabletDevices; + } + + /** + * Alias for getBrowsers() method. + * + * @return array List of user agents. + */ + public static function getUserAgents() + { + return self::getBrowsers(); + } + + /** + * Retrieve the list of known browsers. Specifically, the user agents. + * + * @return array List of browsers / user agents. + */ + public static function getBrowsers() + { + return self::$browsers; + } + + /** + * Retrieve the list of known utilities. + * + * @return array List of utilities. + */ + public static function getUtilities() + { + return self::$utilities; + } + + /** + * Method gets the mobile detection rules. This method is used for the magic methods $detect->is*(). + * + * @deprecated since version 2.6.9 + * + * @return array All the rules (but not extended). + */ + public static function getMobileDetectionRules() + { + static $rules; + + if (!$rules) { + $rules = array_merge( + self::$phoneDevices, + self::$tabletDevices, + self::$operatingSystems, + self::$browsers + ); + } + + return $rules; + + } + + /** + * Method gets the mobile detection rules + utilities. + * The reason this is separate is because utilities rules + * don't necessary imply mobile. This method is used inside + * the new $detect->is('stuff') method. + * + * @deprecated since version 2.6.9 + * + * @return array All the rules + extended. + */ + public function getMobileDetectionRulesExtended() + { + static $rules; + + if (!$rules) { + // Merge all rules together. + $rules = array_merge( + self::$phoneDevices, + self::$tabletDevices, + self::$operatingSystems, + self::$browsers, + self::$utilities + ); + } + + return $rules; + } + + /** + * Retrieve the current set of rules. + * + * @deprecated since version 2.6.9 + * + * @return array + */ + public function getRules() + { + if ($this->detectionType == self::DETECTION_TYPE_EXTENDED) { + return self::getMobileDetectionRulesExtended(); + } else { + return self::getMobileDetectionRules(); + } + } + + /** + * Retrieve the list of mobile operating systems. + * + * @return array The list of mobile operating systems. + */ + public static function getOperatingSystems() + { + return self::$operatingSystems; + } + + /** + * Check the HTTP headers for signs of mobile. + * This is the fastest mobile check possible; it's used + * inside isMobile() method. + * + * @return bool + */ + public function checkHttpHeadersForMobile() + { + + foreach ($this->getMobileHeaders() as $mobileHeader => $matchType) { + if ( isset($this->httpHeaders[$mobileHeader]) ) { + if ( is_array($matchType['matches']) ) { + foreach ($matchType['matches'] as $_match) { + if ( strpos($this->httpHeaders[$mobileHeader], $_match) !== false ) { + return true; + } + } + + return false; + } else { + return true; + } + } + } + + return false; + + } + + /** + * Magic overloading method. + * + * @method boolean is[...]() + * @param string $name + * @param array $arguments + * @return mixed + * @throws BadMethodCallException when the method doesn't exist and doesn't start with 'is' + */ + public function __call($name, $arguments) + { + //make sure the name starts with 'is', otherwise + if (substr($name, 0, 2) != 'is') { + throw new BadMethodCallException("No such method exists: $name"); + } + + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); + + $key = substr($name, 2); + + return $this->matchUAAgainstKey($key); + } + + /** + * Find a detection rule that matches the current User-agent. + * + * @param null $userAgent deprecated + * @return boolean + */ + protected function matchDetectionRulesAgainstUA($userAgent = null) + { + // Begin general search. + foreach ($this->getRules() as $_regex) { + if (empty($_regex)) { + continue; + } + if ($this->match($_regex, $userAgent)) { + return true; + } + } + + return false; + } + + /** + * Search for a certain key in the rules array. + * If the key is found the try to match the corresponding + * regex agains the User-Agent. + * + * @param string $key + * @param null $userAgent deprecated + * @return mixed + */ + protected function matchUAAgainstKey($key, $userAgent = null) + { + // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc. + $key = strtolower($key); + + //change the keys to lower case + $_rules = array_change_key_case($this->getRules()); + + if (array_key_exists($key, $_rules)) { + if (empty($_rules[$key])) { + return null; + } + + return $this->match($_rules[$key], $userAgent); + } + + return false; + } + + /** + * Check if the device is mobile. + * Returns true if any type of mobile device detected, including special ones + * @param null $userAgent deprecated + * @param null $httpHeaders deprecated + * @return bool + */ + public function isMobile($userAgent = null, $httpHeaders = null) + { + + if ($httpHeaders) { + $this->setHttpHeaders($httpHeaders); + } + + if ($userAgent) { + $this->setUserAgent($userAgent); + } + + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); + + if ($this->checkHttpHeadersForMobile()) { + return true; + } else { + return $this->matchDetectionRulesAgainstUA(); + } + + } + + /** + * Check if the device is a tablet. + * Return true if any type of tablet device is detected. + * + * @param string $userAgent deprecated + * @param array $httpHeaders deprecated + * @return bool + */ + public function isTablet($userAgent = null, $httpHeaders = null) + { + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); + + foreach (self::$tabletDevices as $_regex) { + if ($this->match($_regex, $userAgent)) { + return true; + } + } + + return false; + } + + /** + * This method checks for a certain property in the + * userAgent. + * @todo: The httpHeaders part is not yet used. + * + * @param string $key + * @param string $userAgent deprecated + * @param string $httpHeaders deprecated + * @return bool|int|null + */ + public function is($key, $userAgent = null, $httpHeaders = null) + { + // Set the UA and HTTP headers only if needed (eg. batch mode). + if ($httpHeaders) { + $this->setHttpHeaders($httpHeaders); + } + + if ($userAgent) { + $this->setUserAgent($userAgent); + } + + $this->setDetectionType(self::DETECTION_TYPE_EXTENDED); + + return $this->matchUAAgainstKey($key); + } + + /** + * Some detection rules are relative (not standard), + * because of the diversity of devices, vendors and + * their conventions in representing the User-Agent or + * the HTTP headers. + * + * This method will be used to check custom regexes against + * the User-Agent string. + * + * @param $regex + * @param string $userAgent + * @return bool + * + * @todo: search in the HTTP headers too. + */ + public function match($regex, $userAgent = null) + { + // Escape the special character which is the delimiter. + $regex = str_replace('/', '\/', $regex); + $match = (bool) preg_match('/'.$regex.'/is', (!empty($userAgent) ? $userAgent : $this->userAgent), $matches); + // If positive match is found, store the results for debug. + if ($match) { + $this->matchingRegex = $regex; + $this->matchesArray = $matches; + } + + return $match; + } + + /** + * Get the properties array. + * + * @return array + */ + public static function getProperties() + { + return self::$properties; + } + + /** + * Prepare the version number. + * + * @todo Remove the error supression from str_replace() call. + * + * @param string $ver The string version, like "2.6.21.2152"; + * + * @return float + */ + public function prepareVersionNo($ver) + { + $ver = str_replace(array('_', ' ', '/'), '.', $ver); + $arrVer = explode('.', $ver, 2); + + if (isset($arrVer[1])) { + $arrVer[1] = @str_replace('.', '', $arrVer[1]); // @todo: treat strings versions. + } + + return (float) implode('.', $arrVer); + } + + /** + * Check the version of the given property in the User-Agent. + * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31) + * + * @param string $propertyName The name of the property. See self::getProperties() array + * keys for all possible properties. + * @param string $type Either self::VERSION_TYPE_STRING to get a string value or + * self::VERSION_TYPE_FLOAT indicating a float value. This parameter + * is optional and defaults to self::VERSION_TYPE_STRING. Passing an + * invalid parameter will default to the this type as well. + * + * @return string|float The version of the property we are trying to extract. + */ + public function version($propertyName, $type = self::VERSION_TYPE_STRING) + { + if (empty($propertyName)) { + return false; + } + + //set the $type to the default if we don't recognize the type + if ($type != self::VERSION_TYPE_STRING && $type != self::VERSION_TYPE_FLOAT) { + $type = self::VERSION_TYPE_STRING; + } + + $properties = self::getProperties(); + + // Check if the property exists in the properties array. + if (array_key_exists($propertyName, $properties)) { + + // Prepare the pattern to be matched. + // Make sure we always deal with an array (string is converted). + $properties[$propertyName] = (array) $properties[$propertyName]; + + foreach ($properties[$propertyName] as $propertyMatchString) { + + $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString); + + // Escape the special character which is the delimiter. + $propertyPattern = str_replace('/', '\/', $propertyPattern); + + // Identify and extract the version. + preg_match('/'.$propertyPattern.'/is', $this->userAgent, $match); + + if (!empty($match[1])) { + $version = ( $type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1] ); + + return $version; + } + + } + + } + + return false; + } + + /** + * Retrieve the mobile grading, using self::MOBILE_GRADE_* constants. + * + * @return string One of the self::MOBILE_GRADE_* constants. + */ + public function mobileGrade() + { + $isMobile = $this->isMobile(); + + if ( + // Apple iOS 4-7.0 – Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3 / 5.1 / 6.1), iPad 3 (5.1 / 6.0), iPad Mini (6.1), iPad Retina (7.0), iPhone 3GS (4.3), iPhone 4 (4.3 / 5.1), iPhone 4S (5.1 / 6.0), iPhone 5 (6.0), and iPhone 5S (7.0) + $this->isIOS() && $this->version('iPad', self::VERSION_TYPE_FLOAT)>=4.3 || + $this->isIOS() && $this->version('iPhone', self::VERSION_TYPE_FLOAT)>=4.3 || + $this->isIOS() && $this->version('iPod', self::VERSION_TYPE_FLOAT)>=4.3 || + + // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5) + // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM + // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices + // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7 + ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) || + + // Windows Phone 7.5-8 - Tested on the HTC Surround (7.5), HTC Trophy (7.5), LG-E900 (7.5), Nokia 800 (7.8), HTC Mazaa (7.8), Nokia Lumia 520 (8), Nokia Lumia 920 (8), HTC 8x (8) + $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT)>=7.5 || + + // Tested on the Torch 9800 (6) and Style 9670 (6), BlackBerry® Torch 9810 (7), BlackBerry Z10 (10) + $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=6.0 || + // Blackberry Playbook (1.0-2.0) - Tested on PlayBook + $this->match('Playbook.*Tablet') || + + // Palm WebOS (1.4-3.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0), HP TouchPad (3.0) + ( $this->version('webOS', self::VERSION_TYPE_FLOAT)>=1.4 && $this->match('Palm|Pre|Pixi') ) || + // Palm WebOS 3.0 - Tested on HP TouchPad + $this->match('hp.*TouchPad') || + + // Firefox Mobile 18 - Tested on Android 2.3 and 4.1 devices + ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=18 ) || + + // Chrome for Android - Tested on Android 4.0, 4.1 device + ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=4.0 ) || + + // Skyfire 4.1 - Tested on Android 2.3 device + ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT)>=4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) || + + // Opera Mobile 11.5-12: Tested on Android 2.3 + ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>=11.5 && $this->is('AndroidOS') ) || + + // Meego 1.2 - Tested on Nokia 950 and N9 + $this->is('MeeGoOS') || + + // Tizen (pre-release) - Tested on early hardware + $this->is('Tizen') || + + // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser + // @todo: more tests here! + $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT)>=2.0 || + + // UC Browser - Tested on Android 2.3 device + ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) || + + // Kindle 3 and Fire - Tested on the built-in WebKit browser for each + ( $this->match('Kindle Fire') || + $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT)>=3.0 ) || + + // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet + $this->is('AndroidOS') && $this->is('NookTablet') || + + // Chrome Desktop 16-24 - Tested on OS X 10.7 and Windows 7 + $this->version('Chrome', self::VERSION_TYPE_FLOAT)>=16 && !$isMobile || + + // Safari Desktop 5-6 - Tested on OS X 10.7 and Windows 7 + $this->version('Safari', self::VERSION_TYPE_FLOAT)>=5.0 && !$isMobile || + + // Firefox Desktop 10-18 - Tested on OS X 10.7 and Windows 7 + $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=10.0 && !$isMobile || + + // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7 + $this->version('IE', self::VERSION_TYPE_FLOAT)>=7.0 && !$isMobile || + + // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7 + $this->version('Opera', self::VERSION_TYPE_FLOAT)>=10 && !$isMobile + ){ + return self::MOBILE_GRADE_A; + } + + if ( + $this->isIOS() && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 || + $this->isIOS() && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<4.3 || + $this->isIOS() && $this->version('iPod', self::VERSION_TYPE_FLOAT)<4.3 || + + // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770 + $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 || + + //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3 + ($this->version('Opera Mini', self::VERSION_TYPE_FLOAT)>=5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT)<=7.0 && + ($this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 || $this->is('iOS')) ) || + + // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1) + $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') || + + // @todo: report this (tested on Nokia N71) + $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>=11 && $this->is('SymbianOS') + ){ + return self::MOBILE_GRADE_B; + } + + if ( + // Blackberry 4.x - Tested on the Curve 8330 + $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<=5.0 || + // Windows Mobile - Tested on the HTC Leo (WinMo 5.2) + $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT)<=5.2 || + + // Tested on original iPhone (3.1), iPhone 3 (3.2) + $this->isIOS() && $this->version('iPad', self::VERSION_TYPE_FLOAT)<=3.2 || + $this->isIOS() && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<=3.2 || + $this->isIOS() && $this->version('iPod', self::VERSION_TYPE_FLOAT)<=3.2 || + + // Internet Explorer 7 and older - Tested on Windows XP + $this->version('IE', self::VERSION_TYPE_FLOAT)<=7.0 && !$isMobile + ){ + return self::MOBILE_GRADE_C; + } + + //All older smartphone platforms and featurephones - Any device that doesn't support media queries + //will receive the basic, C grade experience. + return self::MOBILE_GRADE_C; + } + } +} \ No newline at end of file diff --git a/core/lib/upload/um-file-upload.php b/includes/lib/upload/um-file-upload.php similarity index 52% rename from core/lib/upload/um-file-upload.php rename to includes/lib/upload/um-file-upload.php index e375a804..cf085cc5 100644 --- a/core/lib/upload/um-file-upload.php +++ b/includes/lib/upload/um-file-upload.php @@ -2,26 +2,24 @@ $dirname = dirname( __FILE__ ); do { - $dirname = dirname( $dirname ); - $wp_config = "{$dirname}/wp-config.php"; - $wp_load = "{$dirname}/wp-load.php"; + $dirname = dirname( $dirname ); + $wp_config = "{$dirname}/wp-config.php"; + $wp_load = "{$dirname}/wp-load.php"; } while( !file_exists( $wp_config ) ); -if ( !file_exists( $wp_load ) ) { - $dirs = glob( $dirname . '/*' , GLOB_ONLYDIR ); +if ( ! file_exists( $wp_load ) ) { + $dirs = glob( $dirname . '/*' , GLOB_ONLYDIR ); - foreach ( $dirs as $key => $value ) { - $wp_load = "{$value}/wp-load.php"; - if ( file_exists( $wp_load ) ) { - break; - } - } + foreach ( $dirs as $key => $value ) { + $wp_load = "{$value}/wp-load.php"; + if ( file_exists( $wp_load ) ) { + break; + } + } } require_once( $wp_load ); -global $ultimatemember; - $ret['error'] = null; $ret = array(); @@ -30,8 +28,8 @@ $nonce = $_POST['_wpnonce']; $id = $_POST['key']; $timestamp = $_POST['timestamp']; -$ultimatemember->fields->set_id = $_POST['set_id']; -$ultimatemember->fields->set_mode = $_POST['set_mode']; +UM()->fields()->set_id = $_POST['set_id']; +UM()->fields()->set_mode = $_POST['set_mode']; $um_file_upload_nonce = apply_filters("um_file_upload_nonce", true ); @@ -50,17 +48,17 @@ if(isset($_FILES[$id]['name'])) { if(!is_array($_FILES[$id]['name'])) { $temp = $_FILES[$id]["tmp_name"]; - $file = apply_filters('um_upload_file_name',$id."-".$_FILES[$id]["name"],$id,$_FILES[$id]["name"]); + $file = apply_filters('um_upload_file_name',$id."-".$_FILES[$id]["name"],$id,$_FILES[$id]["name"]); $file = sanitize_file_name($file); $extension = strtolower( pathinfo($file, PATHINFO_EXTENSION) ); - $error = $ultimatemember->files->check_file_upload( $temp, $extension, $id ); + $error = UM()->files()->check_file_upload( $temp, $extension, $id ); if ( $error ){ $ret['error'] = $error; } else { - $ret[] = $ultimatemember->files->new_file_upload_temp( $temp, $file ); - $ret['icon'] = $ultimatemember->files->get_fonticon_by_ext( $extension ); - $ret['icon_bg'] = $ultimatemember->files->get_fonticon_bg_by_ext( $extension ); + $ret[] = UM()->files()->new_file_upload_temp( $temp, $file ); + $ret['icon'] = UM()->files()->get_fonticon_by_ext( $extension ); + $ret['icon_bg'] = UM()->files()->get_fonticon_bg_by_ext( $extension ); $ret['filename'] = $file; } diff --git a/core/lib/upload/um-image-upload.php b/includes/lib/upload/um-image-upload.php similarity index 64% rename from core/lib/upload/um-image-upload.php rename to includes/lib/upload/um-image-upload.php index c73ebaec..6bf1397d 100644 --- a/core/lib/upload/um-image-upload.php +++ b/includes/lib/upload/um-image-upload.php @@ -2,25 +2,23 @@ $dirname = dirname( __FILE__ ); do { - $dirname = dirname( $dirname ); - $wp_config = "{$dirname}/wp-config.php"; - $wp_load = "{$dirname}/wp-load.php"; + $dirname = dirname( $dirname ); + $wp_config = "{$dirname}/wp-config.php"; + $wp_load = "{$dirname}/wp-load.php"; } while( !file_exists( $wp_config ) ); if ( !file_exists( $wp_load ) ) { - $dirs = glob( $dirname . '/*' , GLOB_ONLYDIR ); + $dirs = glob( $dirname . '/*' , GLOB_ONLYDIR ); - foreach ( $dirs as $key => $value ) { - $wp_load = "{$value}/wp-load.php"; - if ( file_exists( $wp_load ) ) { - break; - } - } + foreach ( $dirs as $key => $value ) { + $wp_load = "{$value}/wp-load.php"; + if ( file_exists( $wp_load ) ) { + break; + } + } } - require_once( $wp_load ); -global $ultimatemember; $ret['error'] = null; $ret = array(); @@ -29,8 +27,8 @@ $id = $_POST['key']; $timestamp = $_POST['timestamp']; $nonce = $_POST['_wpnonce']; -$ultimatemember->fields->set_id = $_POST['set_id']; -$ultimatemember->fields->set_mode = $_POST['set_mode']; +UM()->fields()->set_id = $_POST['set_id']; +UM()->fields()->set_mode = $_POST['set_mode']; $um_image_upload_nonce = apply_filters("um_image_upload_nonce", true ); @@ -51,14 +49,14 @@ if(isset($_FILES[$id]['name'])) { $file = sanitize_file_name($file); $ext = strtolower( pathinfo($file, PATHINFO_EXTENSION) ); - $error = $ultimatemember->files->check_image_upload( $temp, $id ); + $error = UM()->files()->check_image_upload( $temp, $id ); if ( $error ){ $ret['error'] = $error; } else { $file = "stream_photo_".md5($file)."_".uniqid().".".$ext; - $ret[ ] = $ultimatemember->files->new_image_upload_temp( $temp, $file, um_get_option('image_compression') ); + $ret[ ] = UM()->files()->new_image_upload_temp( $temp, $file, um_get_option('image_compression') ); } diff --git a/core/um-short-functions.php b/includes/um-short-functions.php similarity index 73% rename from core/um-short-functions.php rename to includes/um-short-functions.php index f6dd4dc6..b920c722 100644 --- a/core/um-short-functions.php +++ b/includes/um-short-functions.php @@ -57,12 +57,10 @@ ***/ function um_dynamic_login_page_redirect( $redirect_to = '' ) { - global $ultimatemember; - $uri = um_get_core_page( 'login' ); if ( ! $redirect_to ) { - $redirect_to = $ultimatemember->permalinks->get_current_url(); + $redirect_to = UM()->permalinks()->get_current_url(); } $redirect_key = urlencode_deep( $redirect_to ); @@ -267,77 +265,51 @@ *** @If conditions are met return true; ***/ function um_field_conditions_are_met( $data ) { - if ( !isset( $data['conditions'] ) ) return true; + if ( ! isset( $data['conditions'] ) ) return true; $state = 1; - foreach( $data['conditions'] as $k => $arr ) { + foreach ( $data['conditions'] as $k => $arr ) { if ( $arr[0] == 'show' ) { $val = $arr[3]; $op = $arr[2]; - if( strstr( $arr[1] , 'role_') ){ + if ( strstr( $arr[1] , 'role_') ) $arr[1] = 'role'; - } $field = um_profile( $arr[1] ); switch( $op ) { - case 'equals to': + case 'equals to': - if( is_serialized( $field ) ){ - - if ( in_array( $val , unserialize( $field ) ) ) { - $state = 1; - }else{ - $state = 0; - } + $field = maybe_unserialize( $field ); - }else{ + if ( is_array( $field ) ) + $state = in_array( $val , $field ) ? 1 : 0; + else + $state = ( $field == $val ) ? 1 : 0; - if ( $field == $val ) { - $state = 1; - }else{ - $state = 0; - } - - } - break; - case 'not equals': + case 'not equals': - if( is_serialized( $field ) ){ - - if ( ! in_array( $val , unserialize( $field ) ) ) { - $state = 1; - }else{ - $state = 0; - } + $field = maybe_unserialize( $field ); - }else{ - - if ( $field != $val ) { - $state = 1; - }else{ - $state = 0; - } + if ( is_array( $field ) ) + $state = ! in_array( $val , $field ) ? 1 : 0; + else + $state = ( $field != $val ) ? 1 : 0; - } break; - case 'empty': - if ( $field ){ - $state = 1; - }else{ - $state = 0; - } + case 'empty': + + $state = ( $field ) ? 1 : 0; + break; - case 'not empty': - if ( ! $field ){ - $state = 1; - }else{ - $state = 0; - } + case 'not empty': + + $state = ( ! $field ) ? 1 : 0; + break; case 'greater than': if ( $field > $val ){ @@ -361,64 +333,47 @@ } break; } - } - - if ( $arr[0] == 'hide' ) { + } elseif ( $arr[0] == 'hide' ) { $state = 1; $val = $arr[3]; $op = $arr[2]; - if( strstr( $arr[1] , 'role_') ){ + if ( strstr( $arr[1] , 'role_' ) ) $arr[1] = 'role'; - } $field = um_profile( $arr[1] ); switch( $op ) { - case 'equals to': - if( is_serialized( $field ) ){ - if ( in_array( $val , unserialize( $field ) ) ) { - $state = 0; - }else{ - $state = 1; - } - }else{ - if ( $field == $val ) { - $state = 0; - }else{ - $state = 1; - } - } + case 'equals to': + + $field = maybe_unserialize( $field ); + + if ( is_array( $field ) ) + $state = in_array( $val , $field ) ? 0 : 1; + else + $state = ( $field == $val ) ? 0 : 1; + break; - case 'not equals': - if( is_serialized( $field ) ){ - if ( ! in_array( $val , unserialize( $field ) ) ) { - $state = 0; - }else{ - $state = 1; - } - }else{ - if ( $field != $val ) { - $state = 0; - }else{ - $state = 1; - } - } + case 'not equals': + + $field = maybe_unserialize( $field ); + + if ( is_array( $field ) ) + $state = ! in_array( $val , $field ) ? 0 : 1; + else + $state = ( $field != $val ) ? 0 : 1; + break; - case 'empty': - if ( $field ){ - $state = 0; - }else{ - $state = 1; - } + case 'empty': + + $state = ( $field ) ? 0 : 1; + break; - case 'not empty': - if ( !$field ){ - $state = 0; - }else{ - $state = 1; - } + case 'not empty': + + $state = ( ! $field ) ? 0 : 1; + break; case 'greater than': if ( $field <= $val ){ @@ -443,12 +398,9 @@ break; } } - } - if ( $state ) - return true; - return false; + return ( $state ) ? true : false; } /*** @@ -459,6 +411,36 @@ exit( wp_redirect( home_url() ) ); } + + function um_js_redirect( $url ) { + if ( headers_sent() || empty( $url ) ) { + //for blank redirects + if ( '' == $url ) { + $url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; + } + + $funtext="echo \"\";"; + register_shutdown_function(create_function('',$funtext)); + + if ( 1 < ob_get_level() ) { + while ( ob_get_level() > 1 ) { + ob_end_clean(); + } + } + + ?> + + '; + if ( $style ) + $output .= '

            '; if ( isset( $data ) && is_array( $data ) ) { @@ -518,7 +500,7 @@ if ( !$v ) $v = __('(empty)','ultimate-member'); $output .= "

            $v

            "; } else { - $output .= "$k: $v" . "\r\n"; + $output .= "$k: $v" . "
            "; } } @@ -526,7 +508,8 @@ } } - if ( $style ) $output .= '
            '; + if ( $style ) + $output .= '
            '; return $output; } @@ -553,12 +536,10 @@ *** @Get filtered meta value after applying hooks ***/ function um_filtered_value( $key, $data = false ) { - global $ultimatemember; - $value = um_user( $key ); if ( !$data ) { - $data = $ultimatemember->builtin->get_specific_field( $key ); + $data = UM()->builtin()->get_specific_field( $key ); } $type = ( isset($data['type']) ) ? $data['type'] : ''; @@ -586,8 +567,6 @@ *** @Check that temp upload is valid ***/ function um_is_temp_upload( $url ) { - global $ultimatemember; - $url = explode('/ultimatemember/temp/', $url); if ( isset( $url[1] ) ) { @@ -595,7 +574,7 @@ return false; } - $src = $ultimatemember->files->upload_temp . $url[1]; + $src = UM()->files()->upload_temp . $url[1]; if ( !file_exists( $src ) ) { return false; } @@ -608,10 +587,9 @@ *** @Check that temp image is valid ***/ function um_is_temp_image( $url ) { - global $ultimatemember; $url = explode('/ultimatemember/temp/', $url); if ( isset( $url[1] ) ) { - $src = $ultimatemember->files->upload_temp . $url[1]; + $src = UM()->files()->upload_temp . $url[1]; if ( !file_exists( $src ) ) return false; list($width, $height, $type, $attr) = @getimagesize($src); @@ -643,8 +621,7 @@ *** @Get core page url ***/ function um_time_diff( $time1, $time2 ) { - global $ultimatemember; - return $ultimatemember->datetime->time_diff( $time1, $time2 ); + return UM()->datetime()->time_diff( $time1, $time2 ); } /*** @@ -684,24 +661,23 @@ *** @Get core page url ***/ function um_get_core_page( $slug, $updated = false) { - global $ultimatemember; $url = ''; - if ( isset( $ultimatemember->permalinks->core[ $slug ] ) ) { - $url = get_permalink( $ultimatemember->permalinks->core[ $slug ] ); + if ( isset( UM()->config()->permalinks[ $slug ] ) ) { + $url = get_permalink( UM()->config()->permalinks[ $slug ] ); if ( $updated ) $url = add_query_arg( 'updated', esc_attr( $updated ), $url ); } if ( function_exists('icl_get_current_language') && icl_get_current_language() != icl_get_default_language() ) { - $url = um_get_url_for_language( $ultimatemember->permalinks->core[ $slug ], icl_get_current_language() ); + $url = um_get_url_for_language( UM()->config()->permalinks[ $slug ], icl_get_current_language() ); if ( get_post_meta( get_the_ID() , '_um_wpml_account', true ) == 1 ) { $url = get_permalink( get_the_ID() ); } if ( get_post_meta( get_the_ID() , '_um_wpml_user', true ) == 1 ) { - $url = um_get_url_for_language( $ultimatemember->permalinks->core[ $slug ], icl_get_current_language() ); + $url = um_get_url_for_language( UM()->config()->permalinks[ $slug ], icl_get_current_language() ); } } @@ -717,8 +693,8 @@ *** @boolean check if we are on UM page ***/ function is_ultimatemember() { - global $post, $ultimatemember; - if ( isset($post->ID) && in_array( $post->ID, $ultimatemember->permalinks->core ) ) + global $post; + if ( isset( $post->ID ) && in_array( $post->ID, UM()->config()->permalinks ) ) return true; return false; } @@ -727,8 +703,9 @@ *** @boolean check if we are on a core page or not ***/ function um_is_core_page( $page ) { - global $post, $ultimatemember; - if ( isset($post->ID) && isset( $ultimatemember->permalinks->core[ $page ] ) && $post->ID == $ultimatemember->permalinks->core[ $page ] ) + global $post; + + if ( isset($post->ID) && isset( UM()->config()->permalinks[ $page ] ) && $post->ID == UM()->config()->permalinks[ $page ] ) return true; if ( isset($post->ID) && get_post_meta( $post->ID, '_um_wpml_' . $page, true ) == 1 ) return true; @@ -736,7 +713,24 @@ if( isset($post->ID) ){ $_icl_lang_duplicate_of = get_post_meta( $post->ID, '_icl_lang_duplicate_of', true ); - if ( isset( $ultimatemember->permalinks->core[ $page ] ) && ( ( $_icl_lang_duplicate_of == $ultimatemember->permalinks->core[ $page ] && ! empty( $_icl_lang_duplicate_of ) ) || $ultimatemember->permalinks->core[ $page ] == $post->ID ) ) + if ( isset( UM()->config()->permalinks[ $page ] ) && ( ( $_icl_lang_duplicate_of == UM()->config()->permalinks[ $page ] && ! empty( $_icl_lang_duplicate_of ) ) || UM()->config()->permalinks[ $page ] == $post->ID ) ) + return true; + } + + return false; + } + + + function um_is_core_post( $post, $core_page ) { + if ( isset( $post->ID ) && isset( UM()->config()->permalinks[ $core_page ] ) && $post->ID == UM()->config()->permalinks[ $core_page ] ) + return true; + if ( isset($post->ID) && get_post_meta( $post->ID, '_um_wpml_' . $core_page, true ) == 1 ) + return true; + + if( isset($post->ID) ){ + $_icl_lang_duplicate_of = get_post_meta( $post->ID, '_icl_lang_duplicate_of', true ); + + if ( isset( UM()->config()->permalinks[ $core_page ] ) && ( ( $_icl_lang_duplicate_of == UM()->config()->permalinks[ $core_page ] && ! empty( $_icl_lang_duplicate_of ) ) || UM()->config()->permalinks[ $core_page ] == $post->ID ) ) return true; } @@ -747,9 +741,8 @@ *** @Is core URL ***/ function um_is_core_uri() { - global $ultimatemember; - $array = $ultimatemember->permalinks->core; - $current_url = $ultimatemember->permalinks->get_current_url( get_option('permalink_structure') ); + $array = UM()->config()->permalinks; + $current_url = UM()->permalinks()->get_current_url( get_option('permalink_structure') ); if ( !isset( $array ) || !is_array( $array ) ) return false; @@ -765,18 +758,18 @@ *** @Check value of queried search in text input ***/ function um_queried_search_value( $filter, $echo = true ) { - global $ultimatemember; $value = ''; - if ( isset($_REQUEST['um_search']) ) { - $query = $ultimatemember->permalinks->get_query_array(); + if ( isset( $_REQUEST['um_search'] ) ) { + $query = UM()->permalinks()->get_query_array(); if ( isset( $query[ $filter ] ) && $query[ $filter ] != '' ) { $value = stripslashes_deep( $query[ $filter ] ); } } - if( $echo ){ + if ( $echo ) { echo $value; - }else{ + return ''; + } else { return $value; } @@ -786,12 +779,38 @@ *** @Check whether item in dropdown is selected in query-url ***/ function um_select_if_in_query_params( $filter, $val ) { - global $ultimatemember; - if ( isset($_REQUEST['um_search']) ) { - $query = $ultimatemember->permalinks->get_query_array(); + /*if ( isset( $_REQUEST['um_search'] ) ) { + $query = UM()->permalinks()->get_query_array(); if ( isset( $query[$filter] ) && $val == $query[$filter] ) echo 'selected="selected"'; + }*/ + + if ( isset( $_REQUEST['um_search'] ) ) { + $query = UM()->permalinks()->get_query_array(); + + if ( ! is_numeric( $query[$filter] ) ) { + $tags = get_option( 'um_user_tags_filters' ); + + if ( $tags ) { + $tags = array_unique( array_values( $tags ) ); + if ( in_array( $filter, $tags ) ) { + $term = get_term_by( 'slug', $query[$filter], 'um_user_tag' ); + if ( ! is_wp_error( $term ) ) { + if ( isset( $query[$filter] ) && $val == $term->term_id ) { + echo 'selected="selected"'; + } + } + } + } else { + if ( isset( $query[$filter] ) && $val == $query[$filter] ) + echo 'selected="selected"'; + } + } else { + if ( isset( $query[$filter] ) && $val == $query[$filter] ) + echo 'selected="selected"'; + } } + echo ''; } @@ -799,15 +818,18 @@ *** @get styling defaults ***/ function um_styling_defaults( $mode ) { - global $ultimatemember; - $arr = $ultimatemember->setup->core_form_meta_all; - foreach( $arr as $k => $v ) { - $s = str_replace($mode . '_', '', $k ); - if ( strstr($k, '_um_'.$mode.'_') && !in_array($s, $ultimatemember->setup->core_global_meta_all ) ) { - $a = str_replace('_um_'.$mode.'_','',$k); - $b = str_replace('_um_','',$k); + + $new_arr = array(); + $core_form_meta_all = UM()->config()->core_form_meta_all; + $core_global_meta_all = UM()->config()->core_global_meta_all; + + foreach( $core_form_meta_all as $k => $v ) { + $s = str_replace( $mode . '_', '', $k ); + if ( strstr( $k, '_um_'.$mode.'_' ) && !in_array( $s, $core_global_meta_all ) ) { + $a = str_replace( '_um_'.$mode.'_','',$k); + $b = str_replace( '_um_','',$k); $new_arr[$a] = um_get_option( $b ); - } else if ( in_array( $k, $ultimatemember->setup->core_global_meta_all ) ) { + } else if ( in_array( $k, $core_global_meta_all ) ) { $a = str_replace('_um_','',$k); $new_arr[$a] = um_get_option( $a ); } @@ -820,17 +842,14 @@ *** @get meta option default ***/ function um_get_metadefault( $id ) { - global $ultimatemember; - if ( isset( $ultimatemember->setup->core_form_meta_all[ '_um_' . $id ] ) ) - return $ultimatemember->setup->core_form_meta_all[ '_um_' . $id ]; - return ''; + $core_form_meta_all = UM()->config()->core_form_meta_all; + return isset( $core_form_meta_all[ '_um_' . $id ] ) ? $core_form_meta_all[ '_um_' . $id ] : ''; } /*** *** @check if a legitimate password reset request is in action ***/ function um_requesting_password_reset() { - global $post, $ultimatemember; if ( um_is_core_page('password-reset') && isset( $_POST['_um_password_reset'] ) == 1 ) return true; return false; @@ -840,8 +859,6 @@ *** @check if a legitimate password change request is in action ***/ function um_requesting_password_change() { - global $post, $ultimatemember; - if ( um_is_core_page('account') && isset( $_POST['_um_account'] ) == 1 ) return true; elseif ( isset( $_POST['_um_password_change'] ) && $_POST['_um_password_change'] == 1) @@ -872,8 +889,7 @@ *** @get members to show in directory ***/ function um_members( $argument ) { - global $ultimatemember; - return $ultimatemember->members->results[ $argument ]; + return UM()->members()->results[ $argument ]; } /** @@ -894,8 +910,7 @@ * */ function um_reset_user_clean() { - global $ultimatemember; - $ultimatemember->user->reset( true ); + UM()->user()->reset( true ); } /** @@ -916,8 +931,7 @@ * */ function um_reset_user() { - global $ultimatemember; - $ultimatemember->user->reset(); + UM()->user()->reset(); } /*** @@ -932,17 +946,15 @@ *** @Sets the requested user ***/ function um_set_requested_user( $user_id ) { - global $ultimatemember; - $ultimatemember->user->target_id = $user_id; + UM()->user()->target_id = $user_id; } /*** *** @Gets the requested user ***/ function um_get_requested_user() { - global $ultimatemember; - if ( isset( $ultimatemember->user->target_id ) && !empty( $ultimatemember->user->target_id ) ) - return $ultimatemember->user->target_id; + if ( ! empty( UM()->user()->target_id ) ) + return UM()->user()->target_id; return false; } @@ -950,15 +962,14 @@ *** @remove edit profile args from url ***/ function um_edit_my_profile_cancel_uri( $url = '' ) { - global $ultimatemember; - - if( empty( $url ) ){ + + if ( empty( $url ) ) { $url = remove_query_arg( 'um_action' ); $url = remove_query_arg( 'profiletab', $url ); $url = add_query_arg('profiletab', 'main', $url ); } - $url = apply_filters('um_edit_profile_cancel_uri', $url ); + $url = apply_filters( 'um_edit_profile_cancel_uri', $url ); return $url; } @@ -979,25 +990,23 @@ *** @can view field ***/ function um_can_view_field( $data ) { - global $ultimatemember; + if ( ! isset( UM()->fields()->set_mode ) ) + UM()->fields()->set_mode = ''; - if ( !isset( $ultimatemember->fields->set_mode ) ) - $ultimatemember->fields->set_mode = ''; - - if ( isset( $data['public'] ) && $ultimatemember->fields->set_mode != 'register' ) { + if ( isset( $data['public'] ) && UM()->fields()->set_mode != 'register' ) { if ( !is_user_logged_in() && $data['public'] != '1' ) return false; if ( is_user_logged_in() ) { - if ( $data['public'] == '-3' && !um_is_user_himself() && !in_array( $ultimatemember->query->get_role_by_userid( get_current_user_id() ), $data['roles'] ) ) + if ( $data['public'] == '-3' && ! um_is_user_himself() && ! in_array( UM()->roles()->um_get_user_role( get_current_user_id() ), $data['roles'] ) ) return false; - if ( !um_is_user_himself() && $data['public'] == '-1' && !um_user_can('can_edit_everyone') ) + if ( ! um_is_user_himself() && $data['public'] == '-1' && ! UM()->roles()->um_user_can( 'can_edit_everyone' ) ) return false; if ( $data['public'] == '-2' && $data['roles'] ) - if ( !in_array( $ultimatemember->query->get_role_by_userid( get_current_user_id() ), $data['roles'] ) ) + if ( ! in_array( UM()->roles()->um_get_user_role( get_current_user_id() ), $data['roles'] ) ) return false; } @@ -1009,27 +1018,25 @@ /*** *** @checks if user can view profile ***/ - function um_can_view_profile( $user_id ){ - global $ultimatemember; - + function um_can_view_profile( $user_id ) { if ( !um_user('can_view_all') && $user_id != get_current_user_id() && is_user_logged_in() ) return false; - if ( um_current_user_can('edit', $user_id ) ) { + if ( UM()->roles()->um_current_user_can('edit', $user_id ) ) { return true; } if ( !is_user_logged_in() ) { - if ( $ultimatemember->user->is_private_profile( $user_id ) ) { + if ( UM()->user()->is_private_profile( $user_id ) ) { return false; } else { return true; } } - if ( !um_user('can_access_private_profile') && $ultimatemember->user->is_private_profile( $user_id ) ) return false; + if ( ! um_user('can_access_private_profile') && UM()->user()->is_private_profile( $user_id ) ) return false; - if ( um_user_can('can_view_roles') && $user_id != get_current_user_id() ) { - if ( !in_array( $ultimatemember->query->get_role_by_userid( $user_id ), um_user_can('can_view_roles') ) ) { + if ( UM()->roles()->um_user_can( 'can_view_roles' ) && $user_id != get_current_user_id() ) { + if ( ! in_array( UM()->roles()->um_get_user_role( $user_id ), UM()->roles()->um_user_can( 'can_view_roles' ) ) ) { return false; } } @@ -1051,10 +1058,8 @@ *** @can edit field ***/ function um_can_edit_field( $data ) { - global $ultimatemember; - - if ( isset( $ultimatemember->fields->editing ) && $ultimatemember->fields->editing == true && - isset( $ultimatemember->fields->set_mode ) && $ultimatemember->fields->set_mode == 'profile' ) { + if ( isset( UM()->fields()->editing ) && UM()->fields()->editing == true && + isset( UM()->fields()->set_mode ) && UM()->fields()->set_mode == 'profile' ) { if ( is_user_logged_in() && isset( $data['editable'] ) && $data['editable'] == 0 ) { @@ -1066,11 +1071,8 @@ return true; } - - if ( !um_is_user_himself() && !um_user_can('can_edit_everyone') ){ + if ( ! um_is_user_himself() && ! UM()->roles()->um_user_can( 'can_edit_everyone' ) ) return false; - } - } } @@ -1079,75 +1081,23 @@ } - /*** - *** @User can (role settings ) - ***/ - function um_user_can( $permission ) { - global $ultimatemember; - if ( !is_user_logged_in() ) - return false; - $user_id = get_current_user_id(); - $role = get_user_meta( $user_id, 'role', true ); - $permissions = $ultimatemember->query->role_data( $role ); - $permissions = apply_filters('um_user_permissions_filter', $permissions, $user_id); - if ( isset( $permissions[ $permission ] ) && is_serialized( $permissions[ $permission ] ) ) - return unserialize( $permissions[ $permission ] ); - if ( isset( $permissions[ $permission ] ) && $permissions[ $permission ] == 1 ) - return true; - return false; - } /*** *** @Check if user is in his profile ***/ function um_is_myprofile(){ - global $ultimatemember; if ( get_current_user_id() && get_current_user_id() == um_get_requested_user() )return true; if ( !um_get_requested_user() && um_is_core_page('user') && get_current_user_id() ) return true; return false; } - /*** - *** @Current user can - ***/ - function um_current_user_can( $cap, $user_id ){ - global $ultimatemember; - - if ( !is_user_logged_in() ) return false; - - $return = 1; - - um_fetch_user( get_current_user_id() ); - - switch($cap) { - - case 'edit': - if ( get_current_user_id() == $user_id && um_user('can_edit_profile') ) $return = 1; - elseif ( !um_user('can_edit_everyone') ) $return = 0; - elseif ( get_current_user_id() == $user_id && !um_user('can_edit_profile') ) $return = 0; - elseif ( um_user('can_edit_roles') && !in_array( $ultimatemember->query->get_role_by_userid( $user_id ), um_user('can_edit_roles') ) ) $return = 0; - break; - - case 'delete': - if ( !um_user('can_delete_everyone') ) $return = 0; - elseif ( um_user('can_delete_roles') && !in_array( $ultimatemember->query->get_role_by_userid( $user_id ), um_user('can_delete_roles') ) ) $return = 0; - break; - - } - - um_fetch_user( $user_id ); - - return $return; - } /*** *** @Returns the edit profile link ***/ function um_edit_profile_url(){ - global $ultimatemember; - if( um_is_core_page('user') ){ - $url = $ultimatemember->permalinks->get_current_url(); + $url = UM()->permalinks()->get_current_url(); }else{ $url = um_user_profile_url(); } @@ -1162,8 +1112,7 @@ /*** *** @checks if user can edit his profile ***/ - function um_can_edit_my_profile(){ - global $ultimatemember; + function um_can_edit_my_profile() { if ( !is_user_logged_in() ) return false; if ( !um_user('can_edit_profile') ) return false; return true; @@ -1172,7 +1121,7 @@ /*** *** @short for admin e-mail ***/ - function um_admin_email(){ + function um_admin_email() { return um_get_option('admin_email'); } @@ -1197,44 +1146,70 @@ - * + * @return mixed */ - function um_get_option($option_id) { - global $ultimatemember; - if ( !isset( $ultimatemember->options ) ) return ''; - $um_options = $ultimatemember->options; - if ( isset( $um_options[ $option_id ] ) && !empty( $um_options[ $option_id ] ) ) { - return apply_filters("um_get_option_filter__{$option_id}", $um_options[ $option_id ] ); - } + function um_get_option( $option_id ) { + if ( ! isset( UM()->options ) ) + return ''; - switch($option_id){ + $um_options = UM()->options; + if ( ! empty( $um_options[ $option_id ] ) ) + return apply_filters( "um_get_option_filter__{$option_id}", $um_options[ $option_id ] ); + + switch ( $option_id ) { case 'site_name': - return get_bloginfo('name'); + return get_bloginfo( 'name' ); break; case 'admin_email': - return get_bloginfo('admin_email'); + return get_bloginfo( 'admin_email' ); break; + default: + return ''; + break; } - } + + function um_update_option( $option_id, $value ) { + if ( ! isset( UM()->options ) ) + UM()->options = array(); + + $um_options = UM()->options; + $um_options[ $option_id ] = $value; + UM()->options = $um_options; + + update_option( 'um_options', $um_options ); + } + + + function um_remove_option( $option_id ) { + if ( ! isset( UM()->options ) ) + UM()->options = array(); + + $um_options = UM()->options; + if ( ! empty( $um_options[ $option_id ] ) ) + unset( $um_options[ $option_id ] ); + + UM()->options = $um_options; + + update_option( 'um_options', $um_options ); + } + /*** *** @Display a link to profile page ***/ function um_user_profile_url() { - global $ultimatemember; - return $ultimatemember->permalinks->profile_url(); + return UM()->user()->get_profile_url( um_user( 'ID' ) ); } /*** *** @Get all UM roles in array ***/ function um_get_roles() { - global $ultimatemember; - return $ultimatemember->query->get_roles(); + return UM()->roles()->get_roles(); } /** @@ -1270,18 +1245,16 @@ * */ function um_fetch_user( $user_id ) { - global $ultimatemember; - $ultimatemember->user->set( $user_id ); + UM()->user()->set( $user_id ); } /*** *** @Load profile key ***/ - function um_profile( $key ){ - global $ultimatemember; - - if (isset( $ultimatemember->user->profile[ $key ] ) && !empty( $ultimatemember->user->profile[ $key ] ) ){ - $value = apply_filters("um_profile_{$key}__filter", $ultimatemember->user->profile[ $key ] ); + function um_profile( $key ) { + + if ( ! empty( UM()->user()->profile[ $key ] ) ){ + $value = apply_filters("um_profile_{$key}__filter", UM()->user()->profile[ $key ] ); } else { $value = apply_filters("um_profile_{$key}_empty__filter", false ); } @@ -1321,13 +1294,11 @@ *** @user uploads uri ***/ function um_user_uploads_uri() { - global $ultimatemember; - - if( is_ssl() ){ - $ultimatemember->files->upload_baseurl = str_replace("http://", "https://", $ultimatemember->files->upload_baseurl ); + if ( is_ssl() ) { + UM()->files()->upload_baseurl = str_replace("http://", "https://", UM()->files()->upload_baseurl ); } - $uri = $ultimatemember->files->upload_baseurl . um_user('ID') . '/'; + $uri = UM()->files()->upload_baseurl . um_user('ID') . '/'; return $uri; } @@ -1335,8 +1306,7 @@ *** @user uploads directory ***/ function um_user_uploads_dir() { - global $ultimatemember; - $uri = $ultimatemember->files->upload_basedir . um_user('ID') . '/'; + $uri = UM()->files()->upload_basedir . um_user('ID') . '/'; return $uri; } @@ -1355,13 +1325,12 @@ *** @get cover uri ***/ function um_get_cover_uri( $image, $attrs ) { - global $ultimatemember; $uri = false; $ext = '.' . pathinfo($image, PATHINFO_EXTENSION); - if ( file_exists( $ultimatemember->files->upload_basedir . um_user('ID') . '/cover_photo'.$ext ) ) { + if ( file_exists( UM()->files()->upload_basedir . um_user('ID') . '/cover_photo'.$ext ) ) { $uri = um_user_uploads_uri() . 'cover_photo'.$ext.'?' . current_time( 'timestamp' ); } - if ( file_exists( $ultimatemember->files->upload_basedir . um_user('ID') . '/cover_photo-' .$attrs.$ext ) ){ + if ( file_exists( UM()->files()->upload_basedir . um_user('ID') . '/cover_photo-' .$attrs.$ext ) ){ $uri = um_user_uploads_uri() . 'cover_photo-'.$attrs.$ext.'?' . current_time( 'timestamp' ); } return $uri; @@ -1379,7 +1348,6 @@ *** @get avatar uri ***/ function um_get_avatar_uri( $image, $attrs ) { - global $ultimatemember; $uri = false; $find = false; $ext = '.' . pathinfo($image, PATHINFO_EXTENSION); @@ -1390,7 +1358,7 @@ $cache_time = "?{$cache_time}"; } - if ( file_exists( $ultimatemember->files->upload_basedir . um_user('ID') . "/profile_photo-{$attrs}{$ext}" ) ) { + if ( file_exists( UM()->files()->upload_basedir . um_user('ID') . "/profile_photo-{$attrs}{$ext}" ) ) { $uri = um_user_uploads_uri() . "profile_photo-{$attrs}{$ext}{$cache_time}"; @@ -1399,11 +1367,11 @@ $sizes = um_get_option('photo_thumb_sizes'); if ( is_array( $sizes ) ) $find = um_closest_num( $sizes, $attrs ); - if ( file_exists( $ultimatemember->files->upload_basedir . um_user('ID') . "/profile_photo-{$find}{$ext}" ) ) { + if ( file_exists( UM()->files()->upload_basedir . um_user('ID') . "/profile_photo-{$find}{$ext}" ) ) { $uri = um_user_uploads_uri() . "profile_photo-{$find}{$ext}{$cache_time}"; - } else if ( file_exists( $ultimatemember->files->upload_basedir . um_user('ID') . "/profile_photo{$ext}" ) ) { + } else if ( file_exists( UM()->files()->upload_basedir . um_user('ID') . "/profile_photo{$ext}" ) ) { $uri = um_user_uploads_uri() . "profile_photo{$ext}{$cache_time}"; @@ -1421,9 +1389,9 @@ *** @default avatar ***/ function um_get_default_avatar_uri( $user_id = '' ) { - $uri = um_get_option('default_avatar'); - $uri = $uri['url']; - if ( !$uri ) + $uri = um_get_option( 'default_avatar' ); + $uri = ! empty( $uri['url'] ) ? $uri['url'] : ''; + if ( ! $uri ) $uri = um_url . 'assets/img/default_avatar.jpg'; return $uri; @@ -1446,7 +1414,7 @@ ***/ function um_get_default_cover_uri() { $uri = um_get_option('default_cover'); - $uri = $uri['url']; + $uri = ! empty( $uri['url'] ) ? $uri['url'] : ''; if ( $uri ){ $uri = apply_filters('um_get_default_cover_uri_filter', $uri ); return $uri; @@ -1456,20 +1424,16 @@ function um_user( $data, $attrs = null ) { - global $ultimatemember; - - switch($data){ + switch( $data ) { default: - $value = um_profile($data); - - if ( $ultimatemember->validation->is_serialized( $value ) ) { - $value = unserialize( $value ); - } + $value = um_profile( $data ); - if( in_array( $data, array('role','gender') ) ){ - if( is_array( $value ) ){ + $value = maybe_unserialize( $value ); + + if ( in_array( $data, array( 'role', 'gender' ) ) ) { + if ( is_array( $value ) ) { $value = implode(",", $value ); } return $value; @@ -1513,7 +1477,7 @@ $full_name = um_user('display_name'); } - $full_name = $ultimatemember->validation->safe_name_in_url( $full_name ); + $full_name = UM()->validation()->safe_name_in_url( $full_name ); // update full_name changed if( um_profile( $data ) !== $full_name ) @@ -1536,7 +1500,7 @@ $f_and_l_initial = um_profile( $data ); } - $f_and_l_initial = $ultimatemember->validation->safe_name_in_url( $f_and_l_initial ); + $f_and_l_initial = UM()->validation()->safe_name_in_url( $f_and_l_initial ); if( um_get_option('force_display_name_capitlized') ){ $name = implode('-', array_map('ucfirst', explode('-', $f_and_l_initial ) ) ); @@ -1614,13 +1578,13 @@ if ( $op == 'field' && um_get_option('display_name_field') != '' ) { - $fields = array_filter(preg_split('/[,\s]+/', um_get_option('display_name_field') )); + $fields = array_filter( preg_split( '/[,\s]+/', um_get_option( 'display_name_field' ) ) ); $name = ''; - foreach( $fields as $field ) { - if( um_profile( $field ) ){ + foreach ( $fields as $field ) { + if ( um_profile( $field ) ){ $name .= um_profile( $field ) . ' '; - }else if( um_user( $field ) ){ + } elseif ( um_user( $field ) ) { $name .= um_user( $field ) . ' '; } @@ -1637,7 +1601,7 @@ case 'role_select': case 'role_radio': - return $ultimatemember->user->get_role_name( um_user('role') ); + return UM()->roles()->get_role_name( um_user( 'role' ) ); break; case 'submitted': @@ -1648,11 +1612,11 @@ break; case 'password_reset_link': - return $ultimatemember->password->reset_url(); + return UM()->password()->reset_url(); break; case 'account_activation_link': - return $ultimatemember->permalinks->activate_url(); + return UM()->permalinks()->activate_url(); break; case 'profile_photo': @@ -1673,29 +1637,28 @@ $avatar_uri = apply_filters('um_user_avatar_url_filter', $avatar_uri, um_user('ID') ); - if ( $avatar_uri ) - - if( um_get_option('use_gravatars') && ! um_user('synced_profile_photo') && ! $has_profile_photo ){ - $avatar_hash_id = get_user_meta( um_user('ID'),'synced_gravatar_hashed_id', true); - $avatar_uri = um_get_domain_protocol().'gravatar.com/avatar/'.$avatar_hash_id; - $avatar_uri = add_query_arg('s',400, $avatar_uri); - $gravatar_type = um_get_option('use_um_gravatar_default_builtin_image'); - $photo_type = 'um-avatar-gravatar'; - if( $gravatar_type == 'default' ){ - if( um_get_option('use_um_gravatar_default_image') ){ - $avatar_uri = add_query_arg('d', um_get_default_avatar_uri(), $avatar_uri ); - } - }else{ - $avatar_uri = add_query_arg('d', $gravatar_type, $avatar_uri ); - } - - } - - return ''.$image_alt.''; if ( !$avatar_uri ) return ''; + if ( um_get_option('use_gravatars') && ! um_user('synced_profile_photo') && ! $has_profile_photo ) { + $avatar_hash_id = get_user_meta( um_user('ID'),'synced_gravatar_hashed_id', true); + $avatar_uri = um_get_domain_protocol().'gravatar.com/avatar/'.$avatar_hash_id; + $avatar_uri = add_query_arg('s',400, $avatar_uri); + $gravatar_type = um_get_option('use_um_gravatar_default_builtin_image'); + $photo_type = 'um-avatar-gravatar'; + if( $gravatar_type == 'default' ){ + if( um_get_option('use_um_gravatar_default_image') ){ + $avatar_uri = add_query_arg('d', um_get_default_avatar_uri(), $avatar_uri ); + } + }else{ + $avatar_uri = add_query_arg('d', $gravatar_type, $avatar_uri ); + } + + } + + return ''.$image_alt.''; + break; case 'cover_photo': @@ -1730,7 +1693,7 @@ * Get server protocol * @return string */ - function um_get_domain_protocol(){ + function um_get_domain_protocol() { if ( is_ssl() ) { $protocol = 'https://'; @@ -1762,33 +1725,33 @@ * @return integer */ function um_is_meta_value_exists( $key, $value, $return_user_id = false ){ - global $wpdb, $ultimatemember; + global $wpdb; - if( isset( $ultimatemember->profile->arr_user_slugs[ 'is_'.$return_user_id ][ $key ] ) ){ - return $ultimatemember->profile->arr_user_slugs[ 'is_'.$return_user_id ][ $key ]; + if( isset( UM()->profile()->arr_user_slugs[ 'is_'.$return_user_id ][ $key ] ) ){ + return UM()->profile()->arr_user_slugs[ 'is_'.$return_user_id ][ $key ]; } - if( ! $return_user_id ){ + if ( ! $return_user_id ) { $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) as count FROM {$wpdb->usermeta} WHERE meta_key = %s AND meta_value = %s ", $key, $value ) ); - $ultimatemember->profile->arr_user_slugs[ 'is_'.$return_user_id ][ $key ] = $count; + UM()->profile()->arr_user_slugs[ 'is_'.$return_user_id ][ $key ] = $count; return $count; } - $user_id = $wpdb->get_var( $wpdb->prepare( - "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = %s AND meta_value = %s ", - $key, - $value - ) ); - - $ultimatemember->profile->arr_user_slugs[ 'is_'.$return_user_id ][ $key ] = $user_id; + $user_id = $wpdb->get_var( $wpdb->prepare( + "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = %s AND meta_value = %s ", + $key, + $value + ) ); - return $user_id; + UM()->profile()->arr_user_slugs[ 'is_'.$return_user_id ][ $key ] = $user_id; + + return $user_id; } @@ -1842,12 +1805,10 @@ * @return string */ function um_get_search_query() { - global $ultimatemember; - - $query = $ultimatemember->permalinks->get_query_array(); + $query = UM()->permalinks()->get_query_array(); $search = isset( $query['search'] ) ? $query['search'] : ''; - return um_filter_search($search); + return um_filter_search( $search ); } /** @@ -1893,7 +1854,8 @@ $loop = 'notfound'; if ( $wp_query->is_page ) { - $loop = is_front_page() ? 'front' : 'page'; + //$loop = is_front_page() ? 'front' : 'page'; + $loop = 'page'; } elseif ( $wp_query->is_home ) { $loop = 'home'; } elseif ( $wp_query->is_single ) { diff --git a/core/widgets/um-search-widget.php b/includes/widgets/class-um-search-widget.php similarity index 88% rename from core/widgets/um-search-widget.php rename to includes/widgets/class-um-search-widget.php index 36b2d188..648832d3 100644 --- a/core/widgets/um-search-widget.php +++ b/includes/widgets/class-um-search-widget.php @@ -1,6 +1,10 @@ __( 'Shows users they follow in a widget.', 'ultimate-member'), ) + array( 'description' => __( 'Shows users they follow in a widget.', 'ultimate-member' ), ) ); } @@ -36,12 +40,10 @@ class um_search_widget extends WP_Widget { // Widget Backend public function form( $instance ) { - global $ultimatemember; - if ( isset( $instance[ 'title' ] ) ) { $title = $instance[ 'title' ]; } else { - $title = __( 'Search Users', 'ultimate-member'); + $title = __( 'Search Users', 'ultimate-member' ); } if ( isset( $instance[ 'max' ] ) ) { diff --git a/index.php b/index.php deleted file mode 100644 index 04089163..00000000 --- a/index.php +++ /dev/null @@ -1,64 +0,0 @@ -' . __('Docs','ultimate-member') . ''; - - $more_links[] = '' . __('Settings','ultimate-member') . ''; - - $links = $more_links + $links; - - $links[] = '' . __( 'Uninstall','ultimate-member') . ''; - - return $links; - - } - $prefix = is_network_admin() ? 'network_admin_' : ''; - add_filter( "{$prefix}plugin_action_links_$plugin", 'ultimatemember_plugin_links' ); \ No newline at end of file diff --git a/templates/account.php b/templates/account.php index fd55a93c..5c6efe6b 100644 --- a/templates/account.php +++ b/templates/account.php @@ -16,17 +16,17 @@
            -