From ecef10d96a1c8952f7e2fb9a5827d2ce76198eb4 Mon Sep 17 00:00:00 2001 From: Remco Tolsma Date: Fri, 6 Sep 2013 11:27:26 +0200 Subject: [PATCH] Updated from 1.7.2 to 1.7.8. --- change_log.txt | 3681 ++++---- common.php | 119 +- css/admin.css | 7848 +++++++++-------- css/browsers.css | 4 +- css/datepicker.css | 0 css/formreset.css | 0 css/forms.css | 10 +- css/formsmain.css | 17 +- css/jquery-ui-1.7.2.custom.css | 412 - css/preview.css | 0 css/print.css | 0 css/readyclass.css | 0 css/reset.css | 0 css/rtl.css | 4 +- css/tooltip.css | 113 +- css/ui.tabs.css | 0 currency.php | 248 +- entry_detail.php | 44 +- entry_list.php | 2742 +++--- export.php | 7 +- form_detail.php | 4706 +++++----- form_display.php | 63 +- form_list.php | 13 +- form_settings.php | 2884 +++--- forms_model.php | 245 +- gravityforms.php | 605 +- help.php | 0 images/active0.png | Bin images/active1.png | Bin images/add.png | Bin images/arrow-handle.png | Bin images/arrow-right.jpg | Bin images/arrow-rightleft.jpg | Bin images/blank.gif | Bin images/calendar.png | Bin images/captcha_blackglass.jpg | Bin images/captcha_clean.jpg | Bin images/captcha_large.png | Bin images/captcha_medium.png | Bin images/captcha_red.jpg | Bin images/captcha_small.png | Bin images/captcha_white.jpg | Bin images/chosen-sprite.png | Bin images/close.png | Bin images/color.png | Bin images/datepicker/arrow.png | Bin images/datepicker/ui-icons_222222_256x240.png | Bin images/datepicker/ui-icons_454545_256x240.png | Bin images/datepicker/ui-icons_888888_256x240.png | Bin images/datepicker/ui-icons_cd0a0a_256x240.png | Bin images/datepicker_arrow_left.gif | Bin 53 -> 0 bytes images/datepicker_arrow_right.gif | Bin 53 -> 0 bytes images/delete.png | Bin 764 -> 0 bytes images/doctypes/icon_audio.gif | Bin images/doctypes/icon_css.gif | Bin images/doctypes/icon_doc.gif | Bin images/doctypes/icon_fla.gif | Bin images/doctypes/icon_generic.gif | Bin images/doctypes/icon_html.gif | Bin images/doctypes/icon_image.gif | Bin images/doctypes/icon_js.gif | Bin images/doctypes/icon_log.gif | Bin images/doctypes/icon_mov.gif | Bin images/doctypes/icon_pdf.gif | Bin images/doctypes/icon_php.gif | Bin images/doctypes/icon_ppt.gif | Bin images/doctypes/icon_psd.gif | Bin images/doctypes/icon_sql.gif | Bin images/doctypes/icon_swf.gif | Bin images/doctypes/icon_txt.gif | Bin images/doctypes/icon_video.gif | Bin images/doctypes/icon_xls.gif | Bin images/doctypes/icon_xml.gif | Bin images/doctypes/icon_zip.gif | Bin images/download.png | Bin images/duplicate.png | Bin 1502 -> 0 bytes images/edit.png | Bin 730 -> 0 bytes images/expand_title.png | Bin 822 -> 0 bytes images/form-button.png | Bin images/form_options.png | Bin images/gf-32-iconsprite.png | Bin images/gf-creditcard-icons.png | Bin images/gf-entry-paging-sprite.jpg | Bin images/gf-expand-title-bg-rtl.png | Bin images/gf-expand-title-bg.png | Bin images/gf-fieldsettings-header.jpg | Bin images/gf-hovergrad-bg.png | Bin images/gf-html-admin-placeholder.jpg | Bin images/gf-media-button-bg.jpg | Bin images/gf-new-option-bg.png | Bin images/gf-nofields-steps.png | Bin images/gf-pagebreak-end.png | Bin images/gf-pagebreak-first.png | Bin images/gf-pagebreak-inline.png | Bin images/gf-percentbar-bg.png | Bin images/gf-percentbar-blue.png | Bin images/gf-percentbar-custom.png | Bin images/gf-percentbar-gray.png | Bin images/gf-percentbar-green.png | Bin images/gf-percentbar-orange.png | Bin images/gf-percentbar-red.png | Bin images/gf-percentbar-yellow.png | Bin images/gf-tab-container-bg.png | Bin images/gf-taboff-bg.png | Bin images/gf-toolbar-bg.jpg | Bin images/gf-toolbar-iconsprite.png | Bin images/gf_creditcard_icons.png | Bin 76461 -> 0 bytes images/gf_entry_paging_sprite.jpg | Bin 2308 -> 0 bytes images/gf_fieldsettings_header.jpg | Bin 559 -> 0 bytes images/gf_formsettings_header.jpg | Bin 3006 -> 0 bytes images/gf_html_admin_placeholder.jpg | Bin 12795 -> 0 bytes images/gf_media_button_bg.jpg | Bin 551 -> 0 bytes images/gf_new_option_bg 2.png | Bin 181 -> 0 bytes images/gf_new_option_bg.png | Bin 181 -> 0 bytes images/gf_pagebreak_end.png | Bin 2770 -> 0 bytes images/gf_pagebreak_first.png | Bin 2957 -> 0 bytes images/gf_pagebreak_inline.png | Bin 2970 -> 0 bytes images/gf_taboff_bg.png | Bin 187 -> 0 bytes images/gf_toolbar_bg.jpg | Bin images/gravity-admin-icon.png | Bin images/gravity-edit-icon-32.png | Bin images/gravity-entry-icon-32.png | Bin images/gravity-export-icon-32.png | Bin images/gravity-help-icon-32.png | Bin images/gravity-logo.png | Bin images/gravity-notification-icon-32.png | Bin images/gravity-title-icon-32.png | Bin images/gravity_logo.png | Bin 5684 -> 0 bytes images/gravityforms-business-upgrade.png | Bin images/gravityforms-developer-upgrade.png | Bin images/gravityforms_business_upgrade.png | Bin 15018 -> 0 bytes images/gravityforms_developer_upgrade.png | Bin 16650 -> 0 bytes images/hovergrad.png | Bin 208 -> 0 bytes images/icon-close.png | Bin images/icon-delete.png | Bin images/icon-drop-list.png | Bin images/icon-duplicate.png | Bin images/icon-edit-gray.png | Bin images/icon-edit.png | Bin images/icon-question.png | Bin images/icon-question2.png | Bin 735 -> 0 bytes images/icon-remove.png | Bin images/icon-submenu-down.png | Bin images/loading.gif | Bin images/percentbar_bg.png | Bin 334 -> 0 bytes images/percentbar_blue.png | Bin 492 -> 0 bytes images/percentbar_custom.png | Bin 547 -> 0 bytes images/percentbar_gray.png | Bin 375 -> 0 bytes images/percentbar_green.png | Bin 513 -> 0 bytes images/percentbar_orange.png | Bin 483 -> 0 bytes images/percentbar_red.png | Bin 452 -> 0 bytes images/percentbar_yellow.png | Bin 477 -> 0 bytes images/prodlist-last.png | Bin images/prodlist.png | Bin images/prodlist_last.png | Bin images/remove.png | Bin images/screen-options-left.gif | Bin images/spinner.gif | Bin images/star0.png | Bin images/star1.png | Bin images/stop.png | Bin images/stopbanner.png | Bin images/tick.png | Bin images/tiny-arrow-down.png | Bin images/top-highlight.png | Bin images/top_highlight.png | Bin 110 -> 0 bytes images/trash.png | Bin images/webkit-enhanced-select.png | Bin images/wp-logo.gif | Bin 1096 -> 0 bytes includes/addon/class-gf-addon.php | 2294 +++++ includes/addon/class-gf-auto-upgrade.php | 215 + includes/addon/class-gf-feed-addon.php | 918 ++ includes/addon/class-gf-results.php | 899 ++ includes/addon/css/gaddon_form_settings.css | 9 + includes/addon/css/gaddon_results.css | 217 + includes/addon/js/gaddon_results.js | 468 + js.php | 14 +- js/chosen.jquery.min.js | 4 +- js/conditional_logic.js | 585 +- js/confirmation_editor.js | 0 js/datepicker.js | 0 js/floatmenu_init.js | 28 +- js/form_admin.js | 422 +- js/form_editor.js | 26 - js/forms.js | 0 js/gravityforms.js | 23 +- js/jquery-ui/ui.datepicker.js | 1754 ---- js/jquery.dimensions.js | 0 js/jquery.json-1.3.js | 0 js/jquery.maskedinput-1.3.1.min.js | 7 + js/jquery.maskedinput-1.3.min.js | 12 +- js/jquery.placeholder.1.2.min.js | 0 js/jquery.qtip-1.0.0-rc2.min.js | 15 - js/jquery.simplemodal-1.3.min.js | 8 - js/jquery.textareaCounter.plugin.js | 332 +- js/menu.js | 0 js/qtip_init.js | 92 - js/thickbox.css | 0 js/thickbox.js | 678 +- js/tooltip_init.js | 9 + languages/gravityforms-cs_CZ.mo | Bin languages/gravityforms-da_DK.mo | Bin 0 -> 135109 bytes languages/gravityforms-de_DE.mo | Bin languages/gravityforms-es_ES.mo | Bin languages/gravityforms-fi.mo | Bin languages/gravityforms-fi_FI.mo | Bin 51856 -> 0 bytes languages/gravityforms-fr_FR.mo | Bin languages/gravityforms-hu_HU.mo | Bin languages/gravityforms-it_IT.mo | Bin languages/gravityforms-nb_NO.mo | Bin languages/gravityforms-nl_NL.mo | Bin 110041 -> 99481 bytes languages/gravityforms-pt_BR.mo | Bin 115084 -> 116150 bytes languages/gravityforms-sv_SE.mo | Bin languages/gravityforms.pot | 6164 +++++++------ notification.php | 16 +- preview.php | 2 +- print-entry.php | 15 +- recaptchalib.php | 0 select_columns.php | 4 + settings.php | 42 +- tooltips.php | 315 +- update.php | 4 +- widget.php | 0 xml.php | 442 +- 224 files changed, 21965 insertions(+), 17833 deletions(-) mode change 100755 => 100644 change_log.txt mode change 100755 => 100644 common.php mode change 100755 => 100644 css/admin.css mode change 100755 => 100644 css/browsers.css mode change 100755 => 100644 css/datepicker.css mode change 100755 => 100644 css/formreset.css mode change 100755 => 100644 css/forms.css mode change 100755 => 100644 css/formsmain.css delete mode 100755 css/jquery-ui-1.7.2.custom.css mode change 100755 => 100644 css/preview.css mode change 100755 => 100644 css/print.css mode change 100755 => 100644 css/readyclass.css mode change 100755 => 100644 css/reset.css mode change 100755 => 100644 css/rtl.css mode change 100755 => 100644 css/tooltip.css mode change 100755 => 100644 css/ui.tabs.css mode change 100755 => 100644 currency.php mode change 100755 => 100644 entry_detail.php mode change 100755 => 100644 entry_list.php mode change 100755 => 100644 export.php mode change 100755 => 100644 form_detail.php mode change 100755 => 100644 form_display.php mode change 100755 => 100644 form_list.php mode change 100755 => 100644 form_settings.php mode change 100755 => 100644 forms_model.php mode change 100755 => 100644 gravityforms.php mode change 100755 => 100644 help.php mode change 100755 => 100644 images/active0.png mode change 100755 => 100644 images/active1.png mode change 100755 => 100644 images/add.png mode change 100755 => 100644 images/arrow-handle.png mode change 100755 => 100644 images/arrow-right.jpg mode change 100755 => 100644 images/arrow-rightleft.jpg mode change 100755 => 100644 images/blank.gif mode change 100755 => 100644 images/calendar.png mode change 100755 => 100644 images/captcha_blackglass.jpg mode change 100755 => 100644 images/captcha_clean.jpg mode change 100755 => 100644 images/captcha_large.png mode change 100755 => 100644 images/captcha_medium.png mode change 100755 => 100644 images/captcha_red.jpg mode change 100755 => 100644 images/captcha_small.png mode change 100755 => 100644 images/captcha_white.jpg mode change 100755 => 100644 images/chosen-sprite.png mode change 100755 => 100644 images/close.png mode change 100755 => 100644 images/color.png mode change 100755 => 100644 images/datepicker/arrow.png mode change 100755 => 100644 images/datepicker/ui-icons_222222_256x240.png mode change 100755 => 100644 images/datepicker/ui-icons_454545_256x240.png mode change 100755 => 100644 images/datepicker/ui-icons_888888_256x240.png mode change 100755 => 100644 images/datepicker/ui-icons_cd0a0a_256x240.png delete mode 100755 images/datepicker_arrow_left.gif delete mode 100755 images/datepicker_arrow_right.gif delete mode 100755 images/delete.png mode change 100755 => 100644 images/doctypes/icon_audio.gif mode change 100755 => 100644 images/doctypes/icon_css.gif mode change 100755 => 100644 images/doctypes/icon_doc.gif mode change 100755 => 100644 images/doctypes/icon_fla.gif mode change 100755 => 100644 images/doctypes/icon_generic.gif mode change 100755 => 100644 images/doctypes/icon_html.gif mode change 100755 => 100644 images/doctypes/icon_image.gif mode change 100755 => 100644 images/doctypes/icon_js.gif mode change 100755 => 100644 images/doctypes/icon_log.gif mode change 100755 => 100644 images/doctypes/icon_mov.gif mode change 100755 => 100644 images/doctypes/icon_pdf.gif mode change 100755 => 100644 images/doctypes/icon_php.gif mode change 100755 => 100644 images/doctypes/icon_ppt.gif mode change 100755 => 100644 images/doctypes/icon_psd.gif mode change 100755 => 100644 images/doctypes/icon_sql.gif mode change 100755 => 100644 images/doctypes/icon_swf.gif mode change 100755 => 100644 images/doctypes/icon_txt.gif mode change 100755 => 100644 images/doctypes/icon_video.gif mode change 100755 => 100644 images/doctypes/icon_xls.gif mode change 100755 => 100644 images/doctypes/icon_xml.gif mode change 100755 => 100644 images/doctypes/icon_zip.gif mode change 100755 => 100644 images/download.png delete mode 100755 images/duplicate.png delete mode 100755 images/edit.png delete mode 100755 images/expand_title.png mode change 100755 => 100644 images/form-button.png mode change 100755 => 100644 images/form_options.png mode change 100755 => 100644 images/gf-32-iconsprite.png mode change 100755 => 100644 images/gf-creditcard-icons.png mode change 100755 => 100644 images/gf-entry-paging-sprite.jpg mode change 100755 => 100644 images/gf-expand-title-bg-rtl.png mode change 100755 => 100644 images/gf-expand-title-bg.png mode change 100755 => 100644 images/gf-fieldsettings-header.jpg mode change 100755 => 100644 images/gf-hovergrad-bg.png mode change 100755 => 100644 images/gf-html-admin-placeholder.jpg mode change 100755 => 100644 images/gf-media-button-bg.jpg mode change 100755 => 100644 images/gf-new-option-bg.png mode change 100755 => 100644 images/gf-nofields-steps.png mode change 100755 => 100644 images/gf-pagebreak-end.png mode change 100755 => 100644 images/gf-pagebreak-first.png mode change 100755 => 100644 images/gf-pagebreak-inline.png mode change 100755 => 100644 images/gf-percentbar-bg.png mode change 100755 => 100644 images/gf-percentbar-blue.png mode change 100755 => 100644 images/gf-percentbar-custom.png mode change 100755 => 100644 images/gf-percentbar-gray.png mode change 100755 => 100644 images/gf-percentbar-green.png mode change 100755 => 100644 images/gf-percentbar-orange.png mode change 100755 => 100644 images/gf-percentbar-red.png mode change 100755 => 100644 images/gf-percentbar-yellow.png mode change 100755 => 100644 images/gf-tab-container-bg.png mode change 100755 => 100644 images/gf-taboff-bg.png mode change 100755 => 100644 images/gf-toolbar-bg.jpg mode change 100755 => 100644 images/gf-toolbar-iconsprite.png delete mode 100755 images/gf_creditcard_icons.png delete mode 100755 images/gf_entry_paging_sprite.jpg delete mode 100755 images/gf_fieldsettings_header.jpg delete mode 100755 images/gf_formsettings_header.jpg delete mode 100755 images/gf_html_admin_placeholder.jpg delete mode 100755 images/gf_media_button_bg.jpg delete mode 100755 images/gf_new_option_bg 2.png delete mode 100755 images/gf_new_option_bg.png delete mode 100755 images/gf_pagebreak_end.png delete mode 100755 images/gf_pagebreak_first.png delete mode 100755 images/gf_pagebreak_inline.png delete mode 100755 images/gf_taboff_bg.png mode change 100755 => 100644 images/gf_toolbar_bg.jpg mode change 100755 => 100644 images/gravity-admin-icon.png mode change 100755 => 100644 images/gravity-edit-icon-32.png mode change 100755 => 100644 images/gravity-entry-icon-32.png mode change 100755 => 100644 images/gravity-export-icon-32.png mode change 100755 => 100644 images/gravity-help-icon-32.png mode change 100755 => 100644 images/gravity-logo.png mode change 100755 => 100644 images/gravity-notification-icon-32.png mode change 100755 => 100644 images/gravity-title-icon-32.png delete mode 100755 images/gravity_logo.png mode change 100755 => 100644 images/gravityforms-business-upgrade.png mode change 100755 => 100644 images/gravityforms-developer-upgrade.png delete mode 100755 images/gravityforms_business_upgrade.png delete mode 100755 images/gravityforms_developer_upgrade.png delete mode 100755 images/hovergrad.png mode change 100755 => 100644 images/icon-close.png mode change 100755 => 100644 images/icon-delete.png mode change 100755 => 100644 images/icon-drop-list.png mode change 100755 => 100644 images/icon-duplicate.png mode change 100755 => 100644 images/icon-edit-gray.png mode change 100755 => 100644 images/icon-edit.png mode change 100755 => 100644 images/icon-question.png delete mode 100755 images/icon-question2.png mode change 100755 => 100644 images/icon-remove.png mode change 100755 => 100644 images/icon-submenu-down.png mode change 100755 => 100644 images/loading.gif delete mode 100755 images/percentbar_bg.png delete mode 100755 images/percentbar_blue.png delete mode 100755 images/percentbar_custom.png delete mode 100755 images/percentbar_gray.png delete mode 100755 images/percentbar_green.png delete mode 100755 images/percentbar_orange.png delete mode 100755 images/percentbar_red.png delete mode 100755 images/percentbar_yellow.png mode change 100755 => 100644 images/prodlist-last.png mode change 100755 => 100644 images/prodlist.png mode change 100755 => 100644 images/prodlist_last.png mode change 100755 => 100644 images/remove.png mode change 100755 => 100644 images/screen-options-left.gif mode change 100755 => 100644 images/spinner.gif mode change 100755 => 100644 images/star0.png mode change 100755 => 100644 images/star1.png mode change 100755 => 100644 images/stop.png mode change 100755 => 100644 images/stopbanner.png mode change 100755 => 100644 images/tick.png mode change 100755 => 100644 images/tiny-arrow-down.png mode change 100755 => 100644 images/top-highlight.png delete mode 100755 images/top_highlight.png mode change 100755 => 100644 images/trash.png mode change 100755 => 100644 images/webkit-enhanced-select.png delete mode 100755 images/wp-logo.gif create mode 100644 includes/addon/class-gf-addon.php create mode 100644 includes/addon/class-gf-auto-upgrade.php create mode 100644 includes/addon/class-gf-feed-addon.php create mode 100644 includes/addon/class-gf-results.php create mode 100644 includes/addon/css/gaddon_form_settings.css create mode 100644 includes/addon/css/gaddon_results.css create mode 100644 includes/addon/js/gaddon_results.js mode change 100755 => 100644 js.php mode change 100755 => 100644 js/chosen.jquery.min.js mode change 100755 => 100644 js/conditional_logic.js mode change 100755 => 100644 js/confirmation_editor.js mode change 100755 => 100644 js/datepicker.js mode change 100755 => 100644 js/floatmenu_init.js mode change 100755 => 100644 js/form_admin.js mode change 100755 => 100644 js/form_editor.js mode change 100755 => 100644 js/forms.js mode change 100755 => 100644 js/gravityforms.js delete mode 100755 js/jquery-ui/ui.datepicker.js mode change 100755 => 100644 js/jquery.dimensions.js mode change 100755 => 100644 js/jquery.json-1.3.js create mode 100644 js/jquery.maskedinput-1.3.1.min.js mode change 100755 => 100644 js/jquery.maskedinput-1.3.min.js mode change 100755 => 100644 js/jquery.placeholder.1.2.min.js delete mode 100755 js/jquery.qtip-1.0.0-rc2.min.js delete mode 100755 js/jquery.simplemodal-1.3.min.js mode change 100755 => 100644 js/jquery.textareaCounter.plugin.js mode change 100755 => 100644 js/menu.js delete mode 100755 js/qtip_init.js mode change 100755 => 100644 js/thickbox.css mode change 100755 => 100644 js/thickbox.js create mode 100644 js/tooltip_init.js mode change 100755 => 100644 languages/gravityforms-cs_CZ.mo create mode 100644 languages/gravityforms-da_DK.mo mode change 100755 => 100644 languages/gravityforms-de_DE.mo mode change 100755 => 100644 languages/gravityforms-es_ES.mo mode change 100755 => 100644 languages/gravityforms-fi.mo delete mode 100755 languages/gravityforms-fi_FI.mo mode change 100755 => 100644 languages/gravityforms-fr_FR.mo mode change 100755 => 100644 languages/gravityforms-hu_HU.mo mode change 100755 => 100644 languages/gravityforms-it_IT.mo mode change 100755 => 100644 languages/gravityforms-nb_NO.mo mode change 100755 => 100644 languages/gravityforms-nl_NL.mo mode change 100755 => 100644 languages/gravityforms-pt_BR.mo mode change 100755 => 100644 languages/gravityforms-sv_SE.mo mode change 100755 => 100644 languages/gravityforms.pot mode change 100755 => 100644 notification.php mode change 100755 => 100644 preview.php mode change 100755 => 100644 print-entry.php mode change 100755 => 100644 recaptchalib.php mode change 100755 => 100644 select_columns.php mode change 100755 => 100644 settings.php mode change 100755 => 100644 tooltips.php mode change 100755 => 100644 update.php mode change 100755 => 100644 widget.php mode change 100755 => 100644 xml.php diff --git a/change_log.txt b/change_log.txt old mode 100755 new mode 100644 index edc0bcc..dba6562 --- a/change_log.txt +++ b/change_log.txt @@ -1,1786 +1,1895 @@ -------------------------------------------------------------------------------------------------------------------- -Version 1.7.2 - - Fixed issue with enqueueing the wrong css file on the preview page - -------------------------------------------------------------------------------------------------------------------- -Version 1.7.1 - - Fixed conflict with minifiers because of @import statements in forms.css - -------------------------------------------------------------------------------------------------------------------- -Version 1.7 - - Fixed issue with jQuery tabs creating a Javascript error on the form editor page when using WP 3.6 beta - - Added language attributes to the preview page's html tag - - Fixed issue with entry limit and form scheduling validation on preview page not displaying the appropriate message - - Added div wrapper element with class name gf_submission_limit_message to submission limit message so it can be styled more easily. - - Added improved right to left (RTL) language support for the admin, preview page and front end. - - Added Gravity Forms specific classes to the dashboard widget to allow user styling - - Fixed issue causing legacy notifications to be reloaded after all notifications are deleted. - - Updated form settings submenu style to avoid issue where menu is hidden before it can be selected - - Updated update_lead() function so that it updates the cached lead. - - Fixed GFFormsModel::gform_get_meta_values_for_entries() when $entry_ids is empty - - Updated gfMergeTags class to trigger input's change event after tag inserted - - Fixed issue with form settings submenu hiding before mouse can move to it - - Fixed error when trying to resend entry notifications when no conflict mode is on - - Fixed bug in adminonly fields that were set to be dynamically populated from the querystring - -------------------------------------------------------------------------------------------------------------------- -Version 1.7.beta2 - - Fixed issue with calculation fields on currencies that use a comma as the decimal separator - - Updated Zip to ZIP - - Updated send_notifications() function to accept single path attachments (previously only supported arrays) - - Added support for WP Editor merge tag icons and applied to the Notification message textarea - - Moved GFNotificationsTable to notifications.php - - Fixed issue preventing modifications done from the gform_entry_post_save filter to not be available on notifications - - Added gform_entry_post_save filter to allow entries to be filtered after being saved - - Fixed issue where when accessing a new form and not adding any fields, unsaved changes notification is still triggered - - Fixed issue where "text" confirmations were having confirmation message replaced with default message when upgrading to 1.7 - - Moved notification functions form form_settings.php to notifications.php - - Renamed the hook gform_confirmation_before_save -> gform_pre_confirmation_save - - Fixed issues with notification tooltips - - Fixed issue with preview page returning a 404 on sites where wordpress is running in a subfolder - - Removed the gform_before_form_settings_update javascript hook; use the gform_pre_form_settings_save php hook instead - - Renamed the javascript hook gform_before_form_editor_update -> gform_pre_form_editor_save - - Renamed the hook gform_notification_before_save -> gform_pre_notification_save - - Renamed the hook gform_before_email -> gform_pre_send_email - - Removed debug statement which caused a javascript error to be thrown in Internet Explorer when switching forms in the editor - - Fixed issue with calculated products not saving their values correctly - - Fixed conflict with Custom Post Types plugin causing JS errors - - Added mt-prepopulate class to "Default Value" setting on form field Advanced tab so the Merge Tag drop down does not include form fields - - Fixed issue with custom jQuery UI stylesheet being enqueued when file did not exist - - Added gform_admin_pre_render hook to notifications edit page - - Changed the form actions submenu hover class to make it more generic and applicable to all submenus. - -------------------------------------------------------------------------------------------------------------------- -Version 1.7.beta1 - - Fixed issue with notifications being sent with extra padding - -------------------------------------------------------------------------------------------------------------------- -Version 1.7.alpha2.2 - - Fixed backward compatibility of the gform_form_actions filter - - Added GFCache class to common.php and changed GFFormsModel::get_lead_field_value() and GFCommon::is_section_empty() to use GFCache. - - Fixed backward compatibility of the gform_custom_merge_tags filter - - Added group labels to new merge tag list - - Updated form settings to have gform_pre_form_settings_save filter and removed separation of standard and advanced settings - -------------------------------------------------------------------------------------------------------------------- -Version 1.7.alpha2.1 - - Updated Form Field title to be marked as required on new form creation modal - -------------------------------------------------------------------------------------------------------------------- -Version 1.7.alpha2 - - Moved legacy confirmation settings hook so that it is above the submit button - - Updated form settings menu (in form actions list) to match functionality for form settings menu in toolbar - - Updated conditional logic to be required for non-default confirmations - - Fixed issue where error icon was still displaying next to form title on new form modal - -------------------------------------------------------------------------------------------------------------------- -Version 1.7.alpha1 - - Fixed no-conflict scripts - - Cleaned up datepicker UI - - Added tooltip to merge tag icon - -------------------------------------------------------------------------------------------------------------------- -Version 1.7.dev7 - - Added caching to get_lead_field_value, is_section_empty and is_field_hidden to improve performance on long forms - - Fixed js issues when in no conflict mode - - Changed GFFormsModel::search_leads and GFFormsModel::count_search_leads to support searching across all forms (form_id = 0) - -------------------------------------------------------------------------------------------------------------------- -Version 1.7.dev6 - - Fixed issue with radio button Other choice not maintaining text when the form has conditional logic - - Fixed javascript errors being thrown when Gravity Forms set to No Conflict Mode - - Fixed issue with phone field not honoring the "No duplicate" field setting when phones are formatted slightly different - - Updated form settings page to not run filter gform_editor_js - -------------------------------------------------------------------------------------------------------------------- -Version 1.7.dev5 - - Added hook for changing args when getting all categories for post category fields - - Added animation to form settings sub sections - - Added the $form_id parameter to GFFormSettings::get_tabs($form_id) so tabs can be added conditionally. e.g. only show Quiz Settings when there's a quiz field on the form. - - Changed GFCommon::$errors from private to public because it's now used in GFFormSettings::get_confirmation_ui_settings() - - Added GFFormsModel::search_leads() and GFFormsModel::count_search_leads() - -------------------------------------------------------------------------------------------------------------------- -Version 1.7.dev4 - - Fixed potential security hole on form_display.php by using json_encode/json_decode instead of serialize/unserialize - -------------------------------------------------------------------------------------------------------------------- -Version 1.7.dev3 - - Updated form editor UI - -------------------------------------------------------------------------------------------------------------------- -Version 1.7.dev2 - - Re-added jQuery event trigger 'gform_load_form_settings' for backwards compatibility - - Added new JS filter 'gform_is_conditional_logic_field' to the form editor page - - Added support for resending notifications using the new notification structure - - Added form setting hooks to form editor page - - Added new JS filter 'gform_before_form_editor_update' to the form editor page - - Added new JS filter 'gform_before_form_settings_update' to form settings page - - Fixed issue with City sublabel having a dot in the ID attribute instead of an underscore - - Fixed issue with wpList script in WP 3.5 causing entry list trash and spam links not to work - - Updated form button UI to include text on WP 3.5+ - - Updated gform.doHook function to call functions via window - - Fixed several styling issues with GF editor - - Added auto-focus to form title field when new form modal launched - - Added correct tabbing sequence for new form modal fields - - Added "Settings" link to Form Settings submenu - - Fixed issue with notification displaying validation errors where created with "Send To" set to "Field" - - Fixed styling issues on entry detail page - - Updated import/export pages to use new vertical tab format - - Fixed issue where notifications of type field were not being sent - - Fixed issue where confirmations were not in the legacy format when processing continues from paypal - - Fixed issue where checking "show values" option on multi-choice fields was generating a JS error - - Updated "Max Characters" field to only allow numbers to be entered - - Updated post creation to not fire Buddy Press' save_post function until the post data is complete - - Added new filter "gform_post_status_options" to allow addition of custom post status in field's post status setting - add_action('gform_post_status_options', 'add_custom_post_status'); - function add_custom_post_status($post_status_options) { - $post_status_options['custom_status'] = 'My Custom Status'; - return $post_status_options; - } - - Fixed issue where commas in checkbox post custom field fields with commas in the label/value resulted in multiple post meta values for a single checkbox value - - Updated confirmation settings ui and code to load editing into new page, removed functions no longer called - - Added confirm message when deleting a field or modifying/deleting a field choice that is depended on for conditional logic - - Updated loop in get_calculation_value to be a foreach loop to eliminate an extra time through when filter was set to false - - Added support for removing notifications - - Added support for handling admin messages - - Miscellaneous clean up - - Updated location of notification messages on the edit page to be under the page title - - Added new filter to allow new menu items on the Results toolbar item. Example usage: - add_filter("gform_custom_toolbar_button", "add_results_toolbar_button", 10, 2); - function add_results_toolbar_button($buttons, $form_id){ - $capabilities = array("gravityforms_quiz_results"); - $menu_items = array(); - $menu_items[] = array( - 'html' => '' . __('Quiz Results', "gravityformsquiz") . '', - 'css_class' => '', - 'capabilities' => $capabilities - ); - - $buttons[] = array( - 'key' => 'gform_results', - 'html' => ' ' . __("Results", "gravityformsquiz") . '', - 'css_class' => 'gf_form_toolbar_results', - 'menu_items' => $menu_items, - 'capabilities' => $capabilities - ); - - return $buttons; - } - - Updated confirmations UI to better match new GF UI direction - - Added new filter "gform_pre_validation" to allow add-ons to modify the form object before validation - - Added new action "gform_view" to allow add-ons to add new views to the gf_edit_forms WordPress admin "page" - -------------------------------------------------------------------------------------------------------------------- -Version 1.7.dev1 - - Added is_default_column to the gform_entry_meta filter allow developers to define default columns for the entry list - - Fixed a warning notice with gform_get_meta when no key is found - - Added gform_field_added and gform_field_deleted jQuery event actions - - Fixed an issue which was causing gform_update_meta to insert multiple values for the same key - - Added gform_entry_meta filter to allow developers to add custom propeties to the lead object. Allows lead meta data to be added as sortable columns to the entry list and export entries file. Added the following functions to assist: GFFormsModel::get_entry_meta(), GFFormsModel::update_entry_meta(), GFSelectColumns::get_selectable_entry_meta, GFExport::get_entry_meta() and gform_get_meta_values_for_entries($entry_ids, $meta_keys) - Example usage: - add_filter( 'gform_entry_meta', array( 'GFQuiz', 'entry_meta' ), 10, 2); - public static function entry_meta($entry_meta, $form_id){ - $form = RGFormsModel::get_form_meta($form_id); - $quiz_fields = GFCommon::get_fields_by_type( $form, array( 'quiz' ) ); - if ( false === empty ( $quiz_fields ) ) { - $entry_meta['gquiz_score'] = array( - 'label' => 'Quiz Score Total', - 'is_numeric' => true, - 'update_entry_meta_callback' => array('GFQuiz', 'update_entry_meta') - ); - $entry_meta['gquiz_grade'] = array( - 'label' => 'Quiz Grade', - 'is_numeric' => false, - 'update_entry_meta_callback' => array('GFQuiz', 'update_entry_meta') - ); - $entry_meta['gquiz_percent'] = array( - 'label' => 'Quiz Percentage', - 'is_numeric' => true, - 'update_entry_meta_callback' => array('GFQuiz', 'update_entry_meta') - ); - $entry_meta['gquiz_is_pass'] = array( - 'label' => 'Quiz Pass/Fail', - 'is_numeric' => false, - 'update_entry_meta_callback' => array('GFQuiz', 'update_entry_meta') - ); - - } - return $entry_meta; - } - - public static function update_entry_meta($key, $lead, $form){ - $value = ""; - $results = self::get_quiz_results( $form, $lead, false ); - - if ( $key == "gquiz_score" ) - $value = $results["score"]; - elseif ( $key == "gquiz_percent" ) - $value = $results["percent"]; - elseif ( $key == "gquiz_grade" ) - $value = $results["grade"]; - elseif ( $key == "gquiz_is_pass" ) - $value = $results["is_pass"] ? "1" : "0"; - - return $value; - } - - Added RGFormsModel::get_leads_where_sql() function to assist with get_leads() queries - - Fixed sending admin notifications with conditional routing when using PayPal's option to only send when payment is received - - Fixed register link on multi-site; goes to primary site's Form Settings - - Fixed notice (Undefined index: gforms_enable_akismet) when saving Form Settings and Akismet not installed - - Fixed 1000 character string limit for emails - - Updated Chosen script to its latest version (0.9.8) - - Fixed issue with Section break being displayed on {all_fields} even when marked as Admin Only - - Fixed issue with duplicate validation taking trash entries into account - - Added extra parameter to gform_merge_tag_filter hook - - Added hook: gform_register_init_script - Used to initialized init scripts via the add_init_script() function - - Fixed issue with conditional logic reset default value function which set drop down value to non-existant option resulting in JS errors - - Updated gform_field_values field to use esc_attr as additional prevention of cross-site scripting - - Fixed notice generated by hierarchical post categories - - Fixed issue where quantity was counted as 0 when a product's quantity field was hidden via conditional logic. - - Fixed issue with database permission error message. - - Fixed issue with static methods not being declared as static - - Added calcObj to parameters passed in gform_calculation_result() user function - - Added "gform_price_change" js event, triggers when any pricing field is modified - - Added "gform_calculation_formula" hook, allows modification of formula prior to calculation - - Fixed bug for multi-page ajax forms with progress bar starting at zero that are sent to PayPal Standard - - Fixed bug in get_credit_card_init_script that caused javascript error when Force SSL was turned on - - Fixed bug for when a calculated value was zero and it did not show in the email notifications or on the confirmation page - - Added spanish translation file - - Fixed warning thrown in has_conditional_logic when $form["fields"] is empty - - Updated "Edit Forms" menu navigation/page to be "Forms" - - Fixed conflict with some popup scripts (i.e. FancyBox) that caused the spinner to be displayed twice - - Updated AJAX calls using sack and jquery to not pass along a cookie because this caused the loading of admin-ajax.php to be aborted for some users - - Updated the display of the name of uploaded files to be escaped to prevent security issues. - - Fixed notice when max_label_size was not defined - - Fixed issue where fields that are not on the last page of a multi-page form and are marked to not allow duplicates were not going through duplicate validation - - Updated Settings UI - - Added gform_entry_detail_sidebar_before hook to allow text to be added before the first sidebar box on the entry detail page - add_action("gform_entry_detail_sidebar_before", "add_sidebar_text_before", 10, 2); - function add_sidebar_text_before($form, $lead){ - echo "

Extra Cool Stuff

text added before!
"; - } - - Added gform_entry_detail_sidebar_after hook to allow text to be added after the last sidebar box on the entry detail page - add_action("gform_entry_detail_sidebar_after", "add_sidebar_text_after", 10, 2); - function add_sidebar_text_after($form, $lead){ - echo "

More Cool Stuff

text added after!
"; - } - - Added gform_entry_detail_content_before hook to allow text to be added before the main content on the entry detail page - add_action("gform_entry_detail_content_before", "add_main_text_before", 10, 2); - function add_main_text_before($form, $lead){ - echo '
Main Content Before
some stuff
'; - } - - Added gform_entry_detail_content_after hook to allow text to be added after the main content on the entry detail page - add_action("gform_entry_detail_content_after", "add_main_text_after", 10, 2); - function add_main_text_after($form, $lead){ - echo '
Main Content After
some stuff
'; - } - - Added gform_append_field_choice_option_[field type] JS hook to allow additional options for each choice - - Added gform_load_field_choices JS hook to allow help text to be displayed below the choices - - Added gform_export_field_value filter to allow the value to be filtered during export - - Added gform_print_styles filter to allow styles to be included in the print entry page - - Added gform_export_fields filter to allow fields to be added/modified during export - - Added GFExport::add_default_export_fields($form) to refactor a fragment of duplicate code - - Added gform_choices_setting_title filter to allow the choice setting title to be changed - - Added gform_import_form_xml_options filter to allow add-ons to declare arrays during the import process - - Updated entry export to prompt user when no fields have been chosen - - Fixed notice "Undefined index: gf_form_id" displayed when exporting forms and no form chosen - - Added gform_form_settings filter to allow the settings displayed for a form to be changed (added, removed, modified) - - Added support for adding merge tag autocomplete - - Added support for the new notifications/confirmations form meta format for importing and exporting forms - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.5.11 - - Fixed issue where only section headers were displaying in email notifications when using a multi-select with conditional logic - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.5.10 - - Added filter to allow new choices to be filtered. Initially to support the Polls Add-On. - - Updated GFEntryList::get_icon_url() function to be public - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.5.9 - - Fixed issue with conditional logic when using "is not" as the operator - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.5.8 - - Updated field editor so that fields can only be dragged from the title bar - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.5.7 - - Added drag and drop sorting functionality to selection field choices - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.5.6 - - Fixed security vulnerability with password field - - Fixed conflict with Tabbed Widget plugin that caused the widget page to throw Javascript errors - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.5.5 - - Fixed issue with field_values not being saved across AJAX validation failures - - Added Hungarian translation - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.5.4 - - Replaced }) with } ) to alleviate conflict with some themes that replace }) with ] - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.5.3 - - Added space between multiselect values on entry list view - - Fixed issue on confirmation page causing malformed markup and preventing progress bar from being displayed properly - - Added swedish translation - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.5.2 - - Fixed issue where submissions (entries) could be created on forms that did not exist or that were inactive. - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.5.1 - - Fixed issue with number field calculation not rounding correctly when entry is saved - - Added gform_shortcode_$action filter to allow Add-Ons to implement shortcode actions - add_filter("gform_shortcode_custom", "custom_action", 10, 3); - function custom_action($string, $attributes, $content){ - $string = "custom shortcode action"; - - return $string; - } - - Fixed issue with total not being calculated on forms with animation and next button conditional logic - - Fixed issue with conditional logic value reset with pre-populated fields - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.5 - - Fixed issue with conditional logic on jQuery 1.6.1 under certain circumstances - - Fixed issue where required quantity on single, hidden and cacluation products did not accept "0" - - Added logging infrastructure and a few log messages around multi-page file upload - - Fixed issue where inputs did not have calc events bound to change event - - Fixed issue where required quantity on single, hidden and cacluation products did not accept "0" - - Fixed issue with input mask not properly clearing value when form was submitted via the Enter key. - - Fixed issue with gform_product_info being added to meta even on non-product forms - - Fixed issue with default post category not being properly set - - Updated "GFCommon::is_post_field()" to be a public method (for use in User Registration Add-on) - - Fixed issue with number field failing validation when field was configured with commas for decimal separators - - Fixed issue with calculation not supporting the field number format setting - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.4 - - Fixed issue with get_product_fields() function caching product fields for pre-submission entries (ones without an ID) - - Fixed issue with credit card field not updating card type as the card number is entered - - Fixed issue with init scripts being executed more than once - - Fixed issue with gf_global not being output on certain situations - - Fixed issue with post not being associated with entries - - Fixed some notice messages - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.3 - - Fixed issue with notification url not accepting port number and cleaned up trailing slash and question mark when not necessary - - Fixed issue with shipping being displayed even when shipping is hidden by conditional logic - - Fixed issue with slow conditional logic on certain situations - - Added "create_lead()" function to allow creation of lead object prior to actually saving the lead - - Fixed issue with checkbox field reverting back to default selections after form is submitted - - Fixed issue with payment amount being displayed on entry details for payments of $0.00 - - Fixed issue causing long entry values to not be displayed when server's localization changes the number format - - Fixed issue with quantity fields not updating total on blur - - Fixed issue where "No duplicates" option was not working on calculated fields on values above 999 - - Fixed issue where jQuery prop function was not returning elem/value - - Fixed misc notices - - Added constant for min wp version and updated min version error to use this - - Fixed issue where hidden fields were not triggering calculation event - - Fixed an issue with character counter throwing errors when configured on admin only fields - - Fixed issue with shortcodes being executed as part of the post body template - - Fixed issue with default values being reset on forms with conditional logic - - Updated how gf_global js object was being enqueued and output to work around wp3.2 wp_localize script limitation - - Fixed issue with conditional logic when using the post category checkbox field as a target - - Fixed issue with no conflict mode blocking scripts for any ajax call - - Fixed issue with option and quantity fields not being properly re-assigned to another product field when the product field they are assigned to is deleted. - - Added validation to prevent option and quantity fields from being added to the form without a product field. - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.2 - - Fixed issue with website validation not allowing port numbers to be entered - - Added override for jQuery "prop" method which defaults to using attr if prop not available - - Updated AJAX .submit() call, removing extra event data parameter that caused a conflict with some scripts - - Fixed issue with field calculation not taking fields hidden by conditional logic into account - - Moved Cardholder name under the expiration date on credit card fields - - Fixed issue with post image size merge tag drop down not saving its value properly - - Fixed issue where field calculations were not triggering conditional logic - - Fixed issue with {all_fields} displaying duplicate values - - Fixed issue with No conflict mode not enqueueing gravityforms.js on the form editor - - Updated Single Product field so that the field label is changed to match the pre-populated product name - - Fixed issue with Forms menu overriding other custom post type menus - - Fixed issue where number fields in HTML where chocking on comma-formatted numbers - - Fixed issue on form editor for forms that had hidden product fields - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4.1 - - Fixed issue with conditional logic throwing a javascript error. - - Fixed issue with price calculation rounding - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.4 - - Fixed issue with notification failing when a comma separated list of emails was entered with spaces in between emails - - Fixed quantity validation so that it does not allow decimals. - - Fixed issue with chosen script not being enqueued properly when form had conditional logic - - Fixed validation issue with quantity field that didn't honor the min/max setting - - Removed "Enable calculation" option from quantity field - - Added step='any' attribute to number inputs when HTML5 is enabled - - Fixed javascript error on AJAX forms with credit card field - - Added id attribute to anchor - - Fixed issue with the WordPress HTTPS plugin integration - - Added new entry information fields to the entry export field list - - Updated conditional logic and merge tag drop downs so that a width is specified instead of truncating the value - - Fixed issue on notification merge tag drop down wrapping to next line when field labels were long - - Fixed issue with hidden product not taking quantity into account when calculating total - - Fixed issue with hidden product field preventing quantity from being populated dynamically - - Fixed issue with entry detail page not loading the entry that was clicked on entry list page - - Updated inline js so that it is now "enqueued" and consolidated into a single script block tied to the 'gform_post_render' event - - Fixed admin display issue with the bulk-add modal panel in Chrome - - Fixed warnings when nl2br used on array - - Added new choices for conditional routing to administrator notifications (greater than, less than, contains, starts with, ends with) - - Updated notification wysiwyg styles in admin - - Fixed issue with form editor not allowing users to uncheck the "Set as Post Image" checkbox - - Fixed issue where errors would be displayed when a "starts with" conditional logic was configured without the actual "starts with" value - - Fixed issue with quantity field being recorded as . when a value is not entered - - Fixed issue with a "Select Format" option appearing in the quantity field's number format option for newly created fields. - - Added hook to allow users to specify the page size on the entry list page - add_filter("gform_entry_page_size", "set_page_size", 10, 2); - function set_page_size($page_size, $form_id){ - return 50; //sets page size to 50 - } - - Updated the form editor so that the max characters option on single input field is hidden when input mask is enabled - - Updated checkbox field so that it can be pre-populated using an array in addition to a comma separated list - - Fixed notice for $read_only variable - - Fixed notice for postStatus - - Added support for calculations in Number field - - Added Calculation product type - - Added [gravityforms action="conditional"] shortcode - - Added support for showing lead on entry detail when LID or POS are passed. Always third parties to link directly to leads. - - Implemented support for {Product Name:1:qty} merge tag to allow the quantity of product fields to be returned via a merge tag - - Fixed issue with {all_fields} merge tag when using post category fields as target of conditional logic - - Added filter to allow changes to the recaptcha init screen - add_filter("gform_recaptcha_init_script", "custom_translation", 10, 3); - function custom_translation($script, $form_id, $field){ - $script = 'RecaptchaOptions.custom_translations = { - instructions_visual : "Scrivi le due parole:", - instructions_audio : "Trascrivi ci\u00f2 che senti:", - play_again : "Riascolta la traccia audio", - cant_hear_this : "Scarica la traccia in formato MP3", - visual_challenge : "Modalit\u00e0 visiva", - audio_challenge : "Modalit\u00e0 auditiva", - refresh_btn : "Chiedi due nuove parole", - help_btn : "Aiuto", - incorrect_try_again : "Scorretto. Riprova.", - }'; - return $script; - - } - - Added support for {Total:1:price} merge tag to allow total to be formatted numerically - - Fixed issue of no results displayed when viewing a form that has a paged entry list and switching to a form that does not - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.3.1.2 - - Fixed notices in form widget and when enabling no-conflict mode - - Fixed issue with entry list throwing database errors when sorting while filtering by starred or unread - - Fixed javascript error on form editor for IE7/8 - - Fixed issue with entry detail page displaying an error when query string "pos" wasn't specified. - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.3.1.1 - - Fixed bug with Post Category merge tags - - Fixed issue when AJAX forms getting displayed blank - - Fixed issue with product fields being added to entry even though they were hidden by conditional logic - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.3.1 - - Fixed bug with conditional logic when applied to checkboxes - - Fixed issue where entry limit - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.3 - - Fixed issue where entry limit was not being validated on form submssion - - Fixed issue where form schedule was not being validated on form submission - - Added no-conflict mode functionality - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.3.beta2.4 - - Fixed issue with spinner when multiple forms are placed on the same page - - Fixed issue with AJAX multi-form not being displayed on some occasions - - Fixed issue with email validation when using {admin_email} on notification emails - - Added integration with ManageWP - - Fixed deprecated PHP functions - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.3.beta2.3 - - Updated pricing fields so that they don't support the "Admin Only" option. - - Fixed issue with reCaptcha not changing languages properly - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.3.beta2.2 - - Fixed issue when clicking on "enable values" in admin throwing javascript error; function SetFieldChoices was missing - - Fixed issue with non-customer facing error when there was no attachment - - Fixed issue with with submit button text always using default text - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.3.beta2 - - Fixed issue when applying conditional logic to the submit button - - Fixed issue with non-translatable strings in JS files - - Added merge tag support for HTML fields - - Added hook to enable attachments to be added to notifications - - Updated POT file - - Added total entries to dashboard widget - - Added filter to customize dashboard widget title - - Fixed issue with dashboard widget table breaking outside of container - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.3.beta1 - - Fixed issue with post author not being correctly set for posts configured to be created after payment is received - - Updated conditional logic to support other types of operation and other types of fields - - Updated search in admin to maintain the filter (starred, unread, spam, trash) so the filtered results you are viewing are what is searched - - Added field type (Multi Select, Drop Down, Radio, Checkbox) support to Post Category field - - Updated single product field so that its quantity is defauted to 1 when the quantity field is disabled - - Fixed notices in export and notification page - - Added setting to enable/disable Akismet - - Removed CDATA from scripts to prevent JS error on some browsers due to a character replacement done by WP core. - - Added hooks to enable CDATA wrapping - - Fixed issue with Date field not honoring the "No Duplicate" setting and allowing duplicate dates to be entered when they shouldn't - - Fixed issue with custom confirmation not working properly on AJAX forms - - Added back button to entry detail pagination - - Added pagination on entry detail page - - Fixed WP3.3 bug with {user:***} merge tag - - Fixed issue with chosen script initialization when field is target of conditional logic - - Added support for {admin_email} merge tag and using it as the default value for notifications instead of the actual admin email - - Updated admin paging total to not include items in the trash - - Updated admin paging links so that when an item is moved to the trash using the link, the counts are updated as necessary to reflect the change - - Updated admin paging links so that when an item is marked spam using the link, the counts are updated as necessary to reflect the change - - Fixed admin paging so that the filter carries through to the next page - - Fixed admin paging so that the counts displayed apply to the entry list you are viewing (all, unread, starred, spam, trash) - - Added "gform_akismet_enabled" hook which allows you to disable akismet integration - Documentation: http://www.gravityhelp.com/documentation/page/Gform_akismet_enabled - Example: - add_filter("gform_akismet_enabled", "__return_false"); - - Updated enqueue and print scripts functions to always include jQuery, allows "gform_post_render" js hook to be accessible even when GF not using it - - Added 'eventName' parameter to ajaxSpinner submit event to allow third party integrations to target this specific event - - Added $ajax parameter to 'gform_pre_render' hook - - Updated field type menu on form editor page to prevent it from overlapping the form toolbar when a notice is displayed - - Fixed issue with textarea and input mask script on AJAX forms - - Fixed issue with multi-select fields on AJAX multi-page forms - - Updated progress bar to start at 0% - - Added ability to turn on/off progress bar and set completion text when displayed with the confirmation text - - Added "gform_progressbar_start_at_zero" hook to set progress bar back to previous behavior - Example: - add_filter("gform_progressbar_start_at_zero", "set_progressbar_start", 10, 2); - function set_progressbar_start($start_at_zero, $form) - { - return false; - } - - Added functionality to store a static copy of the product info when the entry is created - - Updated Really Simple Captcha to set a tabindex - - Fixed notice occuring when 'postFormat' property of form object was not present - - Added TinyMCE editor to notification page - - Fixed issue with main Gravity Forms permission that prevented the Forms menu from displaying the first time a new user logged in. - - Fixed issue with Simple Captcha field not validating because of an extra "input_" in the input's ID attribute - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.2 - - - Fixed issue with uploaded files not being properly deleted on multi-site installs - - Updated thickbox enqueuing so that it is done conditionally when WP < 3.3, since the conflict between thickbox and the UI tabs have been fixed in WP 3.3 - - Fixed issue for ReallySimpleCaptcha with image/color display when changing size/font/background colors - - Fixed issue with preview link that is displyed after creating a new form - - Fixed notice messages - - Fixed link for reCaptcha sign-up - - Changed the way that the preview, print entry and column selection pages are requested so that they run within the WordPress page cycle instead of being called directly. - - Fixed issue with {all_fields:admin} not displaying admin labels for Single Product fields. - - Fixed issue with blank sections being displayed on {all_fields} merge tag. - - Fixed issue where content templates would return empty when a "0" was passed - - Added "gform_replace_merge_tags" hook which allows for the replacement of custom merge tags - Documentation: http://www.gravityhelp.com/documentation/page/Gform_replace_variables - Example: - add_filter('gform_replace_merge_tags', 'replace_download_link', 10, 7); - function replace_download_link($text, $form, $entry, $url_encode, $esc_html, $nl2br, $format) { - - if(strpos($text, '{download_link}') === false) - return $text; - - $text = str_replace('{download_link}', gform_get_meta($entry['id'], 'download_link'), $text); - - return $text; - } - - Added "gform_custom_merge_tags" hook which allows for the inclusion of custom merge tags whereever merge tag drop downs are generated - Documentation: http://www.gravityhelp.com/documentation/page/Gform_custom_merge_tags - Example: - add_filter('gform_custom_merge_tags', 'custom_merge_tags', 10, 4); - function custom_merge_tags($merge_tags, $form_id, $fields, $element_id) { - $merge_tags[] = array('label' => 'Download Link', 'tag' => '{download_link}'); - return $merge_tags; - } - - Added "gform_entry_created" hook which fires immediately after the lead has been created but before any lead specific functionality has processed - Documentation: http://www.gravityhelp.com/documentation/page/Gform_entry_created - Example: - add_action('gform_entry_created', 'generate_mergedoc'); - function generate_mergedoc($entry, $form) { - $download_link = self::get_download_link($entry['id']); - gform_update_meta($entry['id'], 'download_link', $download_link); - } - - Added "gform_form_actions" hook which allows the modification of existing form actions and addition of new form actions - Documentation: http://www.gravityhelp.com/documentation/page/Gform_form_actions - Example: - add_action('gform_form_actions', 'add_mergedoc_link', 10, 4); - function add_mergedoc_link($actions, $form_id) { - $actions['mergedoc_settings'] = "" . __("MergeDoc", "gravityformsmergedoc") . ""; - return $actions; - } - - Fixed issue with activation throwing errors when trying to remove old indexes. - - Fixed issue with Pricing fields displaying as $0.00 for text formatted notifications - - Updated issue where selecting "None" for Paging Progress Indicator option was not being re-populated correctly after updating the form - - Fixed issue with user defined price field not accepting $0.00 as a valid value - - Added ability to go back to a specific page when form valiation fails - - Fixed issue with radion button and checkbox pricing fields storing the selected items even when they had blank prices - - Fixed issue with escaping causing javascript errors on the entry list when language is set to French - - Updated the color_picker function in the GFFormDetail class to public (so Add-Ons can access it) - -------------------------------------------------------------------------------------------------------------------- -Version 1.6.1 - - Fixed issue with form preview returning a 404 - - Fixed issue with credit card field not escaping translated text properly and causing issues with French translation. - - Updated 'gform_allowable_tags' filter to run on every field including post fields - - Fixed issue with form export including the node for non credit card fields. - - Fixed issue with gform_save_field_value filter not accepting values greater than 200 characters - - Fixed issue with last field in the form being saved with the value of the total field. - -------------------------------------------------------------------------------------------------------------------- -Version 1.6 - - Added additional version-specific IE browser classes to gform_wrapper - - Removed json.php. Using WordPress JSON class instead. - - Fixed issue where blank post meta keys are created when empty value is submitted - - Added support for running Gravity Forms setup from settings page based on "setup" query string. (ie. ?page=gf_settings&setup) - - Fixed issue with radio buttons when using jQuery 1.6.4 (Wordpress 3.3) - - Fixed issue with post images getting saved in a wrong folder (based on the date of the embedded post/page instead of the newly created post) - - Fixed debug notice messages - - Added support for merge codes :label to allow field labels to be conditionally written to the outputted only when the field has a value. - - Fixed issue with Post Format not being selected correctly in the form editor - - Added hook on preview.php file to enqueue custom styles - - Added Primary key to wp_rg_form_meta and wp_rg_lead_detail_long tables - - Fixed issue on checkbox merge tag when targeting specific checkbox item - - Added support for :currency and :price modifier on pricing merge tags - - Updated tooltip script printing so that only tooltip specific scripts are printed when calling wp_print_scripts(); - - Updated "gform_confirmation_anchor" hook to affect AJAX forms and provide option for AJAX forms that allows you to specify an integer for the scroll position - - Fixed issue with thickbox script on upcoming WP 3.3 - - Fixed issue with Post Custom Field (Date field type) not honoring date format when storing post meta - - Updated editor "Update Form" button to do a full refresh instead of AJAX - - Fixed issue with formatting and total calculation of the Swiss Franc currency - - Added ID attribute to the "Add Form" link - - Dynamically calculating WordPress root directory on files that are loaded outside the WP context (i.e. preview.php, select_columns.php) - - Added "gform_post_render" javascript hook to functions to bound to every form render on AJAX enabled forms. - Documentation: http://www.gravityhelp.com/documentation/page/Gform_post_render - Example: - jQuery(document).bind('gform_post_render', function(){ - // code to trigger on AJAX form render - }); - - Added support for additional date formats - - Fixed conditional logic issue on multi-page forms when AJAX is turned on - - Fixed issue where the full list of radio and checkbox items were displayed in the admin after editing a choice - - Fixed erroneous single quote from AJAX inline script block - - Fixed issue with conditional logic fields not making into notification email when sending notification after payment is made. - - Added "gform_allowable_tags" hook to allow enabling HTML or specific HTML tags for submitted data - Documentation: http://www.gravityhelp.com/documentation/page/Gform_allowable_tags - Example: - add_filter("gform_allowable_tags", "__return_true"); - - Added browser class to gform_wrapper - - Added a form specific class to the confirmation container. "gform_confirmation_message_FORMID". - - Fixed issue where adding any post field to a form prevented the form from saving if Post Formats were not supported - - Fixed problem creating warning messages on radio button fields. - - Added extra classes to pagination steps - - Updated form editor UI - - Added Mask setting to Text Field. - - Fixed markup on form list page causing WP footer to overlap with long form list. - - Aded form advanced setting to require user to be logged in to view form and a configurable message. - - Added re-send notification functionality to entry list and entry detail page. - - Added Print to list of bulk action operations so that multiple entries can be printed at once. - - Added hook to change separator of entry export file. - - Added "Other" option to radio button field. - - Added tab index to shortcode and function to specify starting tab index. - - Added CDATA around scripts to ensure valid HTML. - - Updated shortcode wizard to remove square brackets( [ ] ) characters from form name when placed in the shortcode. - - Added duplicate field functionality. - - Added update message for bulk actions on entries list page. - - Added post format setting to main post fields (title, body). - - Added option to set post image field as a featured image. - - Added default value settings to simple name field - - Updated default price for options to $0.00 price instead of blank. - - Added visibility setting to product fields so that they can be hidden. - - Added trash and spam functionality. - - Added integration with Akismet. - - Fixed conditional logic problem when target values have single quotes. - - Fixed number field validation. - - Added support for 24 hour time on time field. - - Added Date drop down type to date field. - - Added new gform_after_submission hook that fires early in the process and deprecated gform_post_submission. - - Enhanced Limit entry option to allow (per day/week/month/year). - - Added hidden product field. - - Added list field type. - - Updated file upload field to increase security. - - Added lookup by form name on gravityform shortcode. - - Added checkbox merge variable to return a comma separated list of selected items. - - Updated product fields to improve pre-population via hooks. - - Added new easier to use field validation filter. - - Updated entry detail and notification emails to hide section break when all fields in that section are blank. - - Added validation so that option field does not get added to a form without a product field. - - Added hook for single product sublabels. - - Added support for merge tags in confirmation URL redirect field - - Added checkbox input type to Post Custom Field. - - Added an option to send emails in text format. - - Added rg_lead_meta table to be used by Add-On developers. - - Removed donation field button (still providing support for existing donation fields). - - Added option to use the "chosen" script on drop downs. - - Added multi-select field. - - Added multi-select field as input type for: Tag, Custom Field. - - Added checkbox (comma separated) to entry list. - - Added ability to save a predefined choice from the bulk add screen. - - Added list field to custom post field. - - Added hook for list field column. - - Added description placement setting (top label only). - - Added new merge tag for displaying Admin labels on notifications(create {all_fields:admin_label} and make it more flexible) - - Fixed issue with "gform_notification_format" filter not passing all of the parameters correctly - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.2.10 - - Fixed issue with checkbox variable replacement creating a warning message. - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.2.9 - - Replaced dot(.) in the state field ID with underscore. - - Disabling product state validation if field is configured for dynamic population - - Marked build_lead_array() function as public to allow developers to call it when performing custom entry queries. - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.2.8 - - Added product price javascript filter to allow custom total calculation - - function gform_product_total(formId, price){ - return price + 100; - } - - Added gform_product_info filter to allow manipulation of the product list - - Removed custom class from field when displayed in the form editor - - Implemented gform_address_display_format on form display - - Fixed formatting issue with address field when state field was hidden - - Replace dot (.) in complex field's input IDs with underscores to prevent CSS problems when targeting the input - - Added gform_print_entry_header and gform_print_entry_footer hooks to allow users to add custom headers and footers in the Print Entry screen - - Added CSS rule to prevent a reported display issue where button panels were cut off by the container overflow in the form editor - - Fixed javascript error on drop down shipping fields when using WP 3.2 RC1 - - Fixed issue with Post Custom Field template not saving value correctly - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.2.7 - - Fixed issue with drop down fields hidden by conditional logic getting sent in notifications - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.2.6 - - Added rgobj() function to better handle retrieving properties from objects - - Added new hook "gform_default_notification" to allow the default admin notification for new forms to be disabled - Documentation: http://www.gravityhelp.com/documentation/page/Gform_default_notification - Example: - add_filter("gform_default_notification", "__return_false"); - - - Fixed localization issues on a few strings - - Updated POT file - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.2.5 - - Adjusted website field so that if the default value of "http://" is left in the field, it is saved as a blank value - - Fixed issue with shortcode wizard adding shortcode to wrong the tab - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.2.4 - - Changed entry export so that entry date is timezone aware - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.2.3 - - Updated jQuery attr("checked"), attr("disabled") and attr("selected") statements for compatibility with jQuery 1.6 - - Fixed issue with form editor throwing errors on WP 3.2 on forms without page breaks - - Changed Print Entry page so that Admin labels are used when appropriate. - - Added "gfield_contains_required" class to main
  • when it contains a required field. - - Fixed issue with checkbox option fields displaying blank options in the admin and PayPal - - Added Greenland to the list of countries - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.2.2 - - Changed form action to a relative path instead of full URL - - Removed TwentyTen theme-specific styles from forms.css - - Minor updates to admin.css - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.2.1 - - Updated jQuery property selector to include quotes - - Removed 'href' attribute from 'Edit' link to resolve IE issue where it triggered the onBeforeUnload event - - Updated admin styles to make 'Close' link cursor display as a pointer - - Added 'gform_admin_pre_render' hook to fire on Form Editor view - - Added renewal reminder to admin notifications - - Removed Category ID from category variable replacement - - Fixed issue with back-slashes being removed when saving entry - - Added gform_get_input_value hook to replace gform_get_field_value - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.2 - - Updated reCAPTCHA API file - - Fixed issue with Post Category fields storing the wrong post when sub categories have the same name - - Fixed issue with Post Category field not displaying all categories in the form editor - - Fixed issue with drop downs not keeping selected item upon validation error when value is set to 0 (zero) and other item is selected by default - - Fixed issue with number of entries being written to the export files - - Fixed javascript error on Form Editor when "Enable Content Template" is checked, but nothing is entered in the template field - - Added JS escaping to prevent javascript error on Form Editor when translated AJAX error messages contain a single quote. - - Fixed issue drop downs not keeping selected item upon validation error when value is set to 0 (zero) - - Fixed issue with price calculation when conditional logic animation was enabled - - Added gform_validation_error in wrapper div when form fails validation - - Updated POT file - - Fixed error caused by GFCommon not being included when calling enqueue_function from functions.php - - Updated portuguese translation file - - Added gform_delete_lead hook - - Fixed problem with exporting/importing routing rules - - Fixed issue with product field validation when using Euro as currency - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.1 - - Fixed problem with getting embed_post for {custom_field} variables - - Added rules to forms.css file to reset unordered list styles to defaults inside HTML blocks - - Cleaned up Notice messages - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.0.2 - - Updated GFFormsModel::get_forms() to sort by "title ASC" by default - - Added autocomplete="off" to honeypot field when HTML5 is on - - Added shortcode support to entry limit and expired form messages - - Updated POT file - - Fixed File Upload and Post Field bug deleting field data when editing entry - - Fixed typo in validation message - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.0.1 - - Localized string "of" in character counter message. - - Fixed issue with option field where checkbox and radio buttons items where not getting refreshed when the + and - button were clicked - - Fixed issue with currency formatting for currencies with commas as decimal points - - Added form specific version of "gform_validation" hook - - Fixed issue with gform_unique_id not escaping result before displaying - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.RC7 - - Added "Disable Auto-formatting" option to form confirmations - - Added "Reset Views" and "Delete Entries" to the form list bulk action drop down - - Added "Settings" link to the plugins page - - Removed Thesis (theme) specific CSS rules from default forms.css file - -------------------------------------------------------------------------------------------------------------------- -Version 1.5.RC6 - - Added styles to admin.css for new toolbar element - - Implemented toolbar on Form editor, Notification and Entry list pages - - Added gform_countries filter to allow manipulation of the address field's country list - - Added gform_duplicate_message filter to allow customization of the default duplicate value validation message - - Populating content templates with the field's variable by default (applies to Post Title, Post Body and Post Custom Field) - - Fixed issue with Single Product and User Defined Product not displaying the Rule Settings - - Implemented Renew section on Settings page - - Limiting the number of items displayed in the admin for checkbox and multiple choice fields - - Fixed issue with user defined product field not formatting the entered value as currency - - Fixed issue with
  • "; - } - } - - //Hierarchical category functions copied from WordPress core and modified. - private static function _cat_rows( $categories, &$count, &$output, $parent = 0, $level = 0, $page = 1, $per_page = 9999999 ) { - if ( empty($categories) ) { - $args = array('hide_empty' => 0); - if ( !empty($_POST['search']) ) - $args['search'] = $_POST['search']; - $categories = get_categories( $args ); - } - - if ( !$categories ) - return false; - - $children = self::_get_term_hierarchy('category'); - - $start = ($page - 1) * $per_page; - $end = $start + $per_page; - $i = -1; - foreach ( $categories as $category ) { - if ( $count >= $end ) - break; - - $i++; - - if ( $category->parent != $parent ) - continue; - - // If the page starts in a subtree, print the parents. - if ( $count == $start && $category->parent > 0 ) { - $my_parents = array(); - while ( $my_parent) { - $my_parent = get_category($my_parent); - $my_parents[] = $my_parent; - if ( !$my_parent->parent ) - break; - $my_parent = $my_parent->parent; - } - $num_parents = count($my_parents); - while( $my_parent = array_pop($my_parents) ) { - self::_cat_row( $my_parent, $level - $num_parents, $output ); - $num_parents--; - } - } - - if ( $count >= $start ) - self::_cat_row( $category, $level, $output ); - - //unset($categories[$i]); // Prune the working set - $count++; - - if ( isset($children[$category->term_id]) ) - self::_cat_rows( $categories, $count, $output, $category->term_id, $level + 1, $page, $per_page ); - - } -} - private static function _cat_row( $category, $level, &$output, $name_override = false ) { - static $row_class = ''; - - $cat = get_category( $category, OBJECT, 'display' ); - - $default_cat_id = (int) get_option( 'default_category' ); - $pad = str_repeat( '— ', $level ); - $name = ( $name_override ? $name_override : $pad . ' ' . $cat->name ); - - $cat->count = number_format_i18n( $cat->count ); - - $output .=" - - - $name - "; - } - private static function _get_term_hierarchy($taxonomy) { - if ( !is_taxonomy_hierarchical($taxonomy) ) - return array(); - $children = get_option("{$taxonomy}_children"); - if ( is_array($children) ) - return $children; - - $children = array(); - $terms = get_terms($taxonomy, 'get=all'); - foreach ( $terms as $term ) { - if ( $term->parent > 0 ) - $children[$term->parent][] = $term->term_id; - } - update_option("{$taxonomy}_children", $children); - - return $children; - } - - private static function insert_variable_prepopulate($element_id, $callback=""){ - ?> - + + + + + + + +
    + +
    ;"> +
    + "> +
    + " alt="" title="" /> + +
    + +
      " style="position: relative;"> + + + + + +
    • + +
      + + + +

      1.

      +

      + +
      + + +
      + + + +

      2.

      +

      + +
      + +
      + + + +

      3.

      +

      + +
      + + + +
      + + + +

      4.

      +

      + +
      + + +
      + + + +

      5.

      +

      + +
      + + +
      + +
    • + + + +
    + +
    ;"> +
    + "> +
    + " alt="" title="" /> + +
    + + + +
    +
    +
    + + + +
    + + + ' . __("Delete Form", "gravityforms") . ''; + echo apply_filters("gform_form_delete_link", $delete_link); + } + + $button_text = rgar($form,"id") > 0 ? __("Update Form", "gravityforms") : __("Save Form", "gravityforms"); + $isNew = rgar($form, "id") > 0 ? 0 : 1; + $save_button = ''; + $save_button = apply_filters("gform_save_form_button", $save_button); + echo $save_button; + ?> + + + + + + + + + +
    + + +
    + +
    +
    +
    + + + + +
    + + + + + + + + + + + + + + + + +
    + + + + + + + + +
    + + "; + } + } + + //Hierarchical category functions copied from WordPress core and modified. + private static function _cat_rows( $categories, &$count, &$output, $parent = 0, $level = 0, $page = 1, $per_page = 9999999 ) { + if ( empty($categories) ) { + $args = array('hide_empty' => 0); + if ( !empty($_POST['search']) ) + $args['search'] = $_POST['search']; + $categories = get_categories( $args ); + } + + if ( !$categories ) + return false; + + $children = self::_get_term_hierarchy('category'); + + $start = ($page - 1) * $per_page; + $end = $start + $per_page; + $i = -1; + foreach ( $categories as $category ) { + if ( $count >= $end ) + break; + + $i++; + + if ( $category->parent != $parent ) + continue; + + // If the page starts in a subtree, print the parents. + if ( $count == $start && $category->parent > 0 ) { + $my_parents = array(); + while ( $my_parent) { + $my_parent = get_category($my_parent); + $my_parents[] = $my_parent; + if ( !$my_parent->parent ) + break; + $my_parent = $my_parent->parent; + } + $num_parents = count($my_parents); + while( $my_parent = array_pop($my_parents) ) { + self::_cat_row( $my_parent, $level - $num_parents, $output ); + $num_parents--; + } + } + + if ( $count >= $start ) + self::_cat_row( $category, $level, $output ); + + //unset($categories[$i]); // Prune the working set + $count++; + + if ( isset($children[$category->term_id]) ) + self::_cat_rows( $categories, $count, $output, $category->term_id, $level + 1, $page, $per_page ); + + } +} + private static function _cat_row( $category, $level, &$output, $name_override = false ) { + static $row_class = ''; + + $cat = get_category( $category, OBJECT, 'display' ); + + $default_cat_id = (int) get_option( 'default_category' ); + $pad = str_repeat( '— ', $level ); + $name = ( $name_override ? $name_override : $pad . ' ' . $cat->name ); + + $cat->count = number_format_i18n( $cat->count ); + + $output .=" + + + $name + "; + } + private static function _get_term_hierarchy($taxonomy) { + if ( !is_taxonomy_hierarchical($taxonomy) ) + return array(); + $children = get_option("{$taxonomy}_children"); + if ( is_array($children) ) + return $children; + + $children = array(); + $terms = get_terms($taxonomy, 'get=all'); + foreach ( $terms as $term ) { + if ( $term->parent > 0 ) + $children[$term->parent][] = $term->term_id; + } + update_option("{$taxonomy}_children", $children); + + return $children; + } + + private static function insert_variable_prepopulate($element_id, $callback=""){ + ?> +
    -
    +
    - + '); ?>
    @@ -470,6 +468,7 @@ public static function save_new_form() { require_once(GFCommon::get_base_path() . '/form_detail.php'); $form = rgpost('form'); + if( empty( $form['title'] ) ) { $result = array( 'error' => __( 'Please enter a form title.', 'gravityforms' ) ); die( json_encode( $result ) ); diff --git a/form_settings.php b/form_settings.php old mode 100755 new mode 100644 index 5ea1a9b..3f7b0f8 --- a/form_settings.php +++ b/form_settings.php @@ -1,1440 +1,1446 @@ - - - - - -
    - - ', '') ?> -
    - -
    - -
    - -
    - -
    - -
    - - '; - $subsetting_close = ' - -
    -
    - '; - - - - //create form settings table rows and put them into an array - //form title - $tr_form_title = ' - - - ' . - __("Form title", "gravityforms") . ' ' . - gform_tooltip("form_title", "", true) . - ' - - - - - '; - - //form description - $tr_form_description = ' - - - ' . - __("Form description", "gravityforms") . ' ' . - gform_tooltip("form_description", "", true) . - ' - - - - - '; - - //form label placement - $alignment_options = array( - 'top_label' => __("Top aligned", "gravityforms"), - 'left_label' => __("Left aligned", "gravityforms"), - 'right_label' => __("Right aligned", "gravityforms") - ); - - $label_dd = ""; - foreach($alignment_options as $value => $label) { - $selected = $form['labelPlacement'] == $value ? 'selected="selected"' : ''; - - $label_dd .= ''; - } - $tr_form_label_placement = ' - - - ' . - __("Label placement", "gravityforms") . ' ' . - gform_tooltip("form_label_placement", "", true) . - ' - - - - - '; - - //form description placement - $style = $form['labelPlacement'] != 'top_label' ? 'display:none;' : ''; - $description_dd = ""; - $description_options = array( - 'below' => __("Below inputs", "gravityforms"), - 'above' => __("Above inputs", "gravityforms") - ); - foreach($description_options as $value => $label) { - $selected = $form['descriptionPlacement'] == $value ? 'selected="selected"' : ''; - - $description_dd .= ''; - } - $tr_form_description_placement = ' - - - ' . - __("Description placement", "gravityforms") . ' ' . - gform_tooltip("form_description_placement", "", true) . - ' - - - - - '; - - - - //css class name - $tr_css_class_name = ' - - - - - - - - '; - - - - //create form advanced settings table rows - //create form button rows - $form_button_type = rgars($form, 'button/type'); - $text_button_checked = ""; - $image_button_checked = ""; - $text_style_display = ""; - $image_style_display = ""; - if ($form_button_type == "text"){ - $text_button_checked = 'checked="checked"'; - $image_style_display = "display:none;"; - } - else if ($form_button_type == "image"){ - $image_button_checked = 'checked="checked"'; - $text_style_display = "display:none;"; - } - //form button - $tr_form_button = ' - - - ' . __("Input type", "gravityforms") . ' - - - - - - -    - - - - - - - '; - - //form button text - $tr_form_button_text = $subsetting_open . ' - - - ' . - __("Button text", "gravityforms") . ' ' . - gform_tooltip("form_button_text", "", true) . - ' - - - - - '; - - //form button image path - $tr_form_button_image_path = ' - - - ' . - __("Button image path", "gravityforms") . ' ' . - gform_tooltip("form_button_image", "", true) . - ' - - - - - ' . $subsetting_close; - - //form button conditional logic - $button_conditional_checked = ""; - if (rgars($form, 'button/conditionalLogic')){ - $button_conditional_checked = 'checked="checked"'; - } - - $tr_form_button_conditional = ' - - - ' . __("Button conditional logic", "gravityforms") . ' ' . gform_tooltip("form_button_conditional_logic", "", true) . ' - - - - - - - - - - - - - '; - - //limit entries - $limit_entry_checked = ""; - $limit_entry_style = ""; - $limit_entries_dd = ""; - if(rgar($form, 'limitEntries')){ - $limit_entry_checked = 'checked="checked"'; - - } - else{ - $limit_entry_style = "display:none"; - } - - $limit_periods = array( - '' => __('total entries', 'gravityforms'), - 'day' => __('per day', 'gravityforms'), - 'week' => __('per week', 'gravityforms'), - 'month' => __('per month', 'gravityforms'), - 'year' => __('per year', 'gravityforms') - ); - foreach($limit_periods as $value => $label) { - $selected = rgar($form, 'limitEntriesPeriod') == $value ? 'selected="selected"' : ''; - $limit_entries_dd .= ''; - } - - $tr_limit_entries = ' - - - ' . __("Limit number of entries", "gravityforms") . ' ' . gform_tooltip("form_limit_entries", "", true) . ' - - - - - - '; - - //limit entries count - $tr_limit_entries_count = ' - - ' . $subsetting_open . ' - - ' . - __("Number of Entries", "gravityforms") . - ' - - - -   - - - ' . $subsetting_close . ' - '; - - //limit entries message - $tr_limit_entries_message = ' - - ' . $subsetting_open . ' - - - - - - - ' . $subsetting_close . ' - - '; - - //schedule form - $schedule_form_checked = ""; - $schedule_form_style = ""; - $start_hour_dd = ""; - $start_minute_dd = ""; - $start_am_selected = ""; - $start_pm_selected = ""; - $end_hour_dd = ""; - $end_minute_dd = ""; - $end_am_selected = ""; - $end_pm_selected = ""; - - if (rgar($form, 'scheduleForm')){ - $schedule_form_checked = 'checked="checked"'; - } - else{ - $schedule_form_style = "display:none"; - } - //create start hour dd options - for($i = 1; $i <= 12; $i++) { - $selected = rgar($form, 'scheduleStartHour') == $i ? 'selected="selected"' : ''; - $start_hour_dd .= ''; - } - //create start minute dd options - foreach(array('00', '15', '30', '45') as $value) { - $selected = rgar($form, 'scheduleStartMinute') == $value ? 'selected="selected"' : ''; - $start_minute_dd .= ''; - } - //set start am/pm - if (rgar($form, 'scheduleStartAmpm') == 'am') { - $start_am_selected = 'selected="selected"'; - } - elseif (rgar($form, 'scheduleStartAmpm') == 'pm'){ - $start_pm_selected = 'selected="selected"'; - } - //create end hour dd options - for($i = 1; $i <= 12; $i++) { - $selected = rgar($form, 'scheduleEndHour') == $i ? 'selected="selected"' : ''; - $end_hour_dd .= ''; - } - //create end minute dd options - foreach(array('00', '15', '30', '45') as $value) { - $selected = rgar($form, 'scheduleEndMinute') == $value ? 'selected="selected"' : ''; - $end_minute_dd .= ''; - } - //set end am/pm - if (rgar($form, 'scheduleEndAmpm') == 'am') { - $end_am_selected = 'selected="selected"'; - } - elseif (rgar($form, 'scheduleEndAmpm') == 'pm'){ - $end_pm_selected = 'selected="selected"'; - } - - //schedule form - $tr_schedule_form = ' - - - ' . __("Schedule form", "gravityforms") . ' ' . gform_tooltip("form_schedule_form", "", true) . ' - - - - - - '; - - //schedule start - $tr_schedule_start = ' - - ' . $subsetting_open . ' - - - - - -    - - : - - - - ' . $subsetting_close . ' - '; - - //schedule end - $tr_schedule_end = ' - - ' . $subsetting_open . ' - - ' . __("Schedule Form End Date/Time", "gravityforms") . ' - - - -    - - : - - - - ' . $subsetting_close . ' - '; - - //schedule message - $tr_schedule_message = ' - - ' . $subsetting_open . ' - - ' . __("Form Expired Message", "gravityforms") . ' - - - - - ' . $subsetting_close . ' - '; - - //honey pot - $honey_pot_checked = ""; - if (rgar($form, 'enableHoneypot')){ - $honey_pot_checked = 'checked="checked"'; - } - $tr_honey_pot = ' - - - ' . __("Anti-spam honeypot", "gravityforms") . ' ' . gform_tooltip("form_honeypot", "", true) . ' - - - - - - '; - - //enable animation - $enable_animation_checked = ""; - if (rgar($form, 'enableAnimation')){ - $enable_animation_checked = 'checked="checked"'; - } - $tr_enable_animation = ' - - - ' . __("Animated transitions", "gravityforms") . ' ' . gform_tooltip("form_animation", "", true) . ' - - - - - - '; - - //require login - $require_login_checked = ""; - $require_login_style = ""; - if (rgar($form, 'requireLogin')){ - $require_login_checked = 'checked="checked"'; - } - else{ - $require_login_style = "display:none"; - } - $tr_requires_login = ' - - - ' . __("Require user to be logged in", "gravityforms") . ' ' . gform_tooltip("form_require_login", "", true) . ' - - - - - - '; - - //require login message - $tr_requires_login_message = ' - - ' . $subsetting_open . ' - - ' . __("Require Login Message", "gravityforms") . ' ' . gform_tooltip("form_require_login_message", "", true) . ' - - - - - ' . $subsetting_close . ' - '; - - //populate arrays with table rows - $form_basics = array("form_title" => $tr_form_title, "form_description" => $tr_form_description); - $form_layout = array("form_label_placement" => $tr_form_label_placement, "form_description_placement" => $tr_form_description_placement, "css_class_name" => $tr_css_class_name); - $form_button = array("form_button_type" => $tr_form_button, "form_button_text" => $tr_form_button_text, "form_button_image_path" => $tr_form_button_image_path, "form_button_conditional" => $tr_form_button_conditional); - $form_restrictions = array("limit_entries" => $tr_limit_entries, "number_of_entries" => $tr_limit_entries_count, "entry_limit_message" => $tr_limit_entries_message, "schedule_form" => $tr_schedule_form, "schedule_start" => $tr_schedule_start, "schedule_end" => $tr_schedule_end, "schedule_message" => $tr_schedule_message, "requires_login" => $tr_requires_login, "requires_login_message" => $tr_requires_login_message); - $form_options = array("honey_pot" => $tr_honey_pot, "enable_animation" => $tr_enable_animation); - - $form_settings = array("Form Basics" => $form_basics, "Form Layout" => $form_layout, "Form Button" => $form_button, "Restrictions" => $form_restrictions, "Form Options" => $form_options); - - $form_settings = apply_filters("gform_form_settings", $form_settings, $form); - ?> - -
    - -

    - -
    - - - $value) { - ?> - - - - -

    - - -
    - - - - - - - - - - - - - - - - - -
    - - - - - -
    - -
    - - - - 0)); - ?> - -

    - - -

    - - - - - - prepare_items(); - ?> - -
    - - display(); ?> - - - - - - -
    - - - - - - - -
    - -
    - - - -
    - - - - - - " /> - ' /> - -

    - -

    - - - -
    - -
    - - -
    - - '; - $subsetting_close = ' - -
    -
    - '; - - $ui_settings = array(); - $confirmation_type = rgar($confirmation, 'type') ? rgar($confirmation, 'type') : 'message'; - $is_valid = !empty(GFCommon::$errors); - $is_default = rgar($confirmation, 'isDefault'); - - $form_id = rgget('id'); - $form = RGFormsModel::get_form_meta($form_id); - - ob_start(); ?> - - - - class=""> - - - - - - - - - - value="message" onclick="ToggleConfirmation();" /> - -    - value="page" onclick="ToggleConfirmation();" /> - -    - value="redirect" onclick="ToggleConfirmation();" /> - - - - - - - > - - - - -
    - /> - -
    - - - - - - - - class=""> - - - - "form_confirmation_page", "selected" => rgar($confirmation, 'pageId'), "show_option_none" => __("Select a page", "gravityforms"))); ?> - - - - - - - > - - - - " style="width:98%;" /> - - - - - - - > - - - - onclick="ToggleQueryString()"/> -
    > -
    -
    -
    - - - - - - - > - - - -
    - -
    - - - - - - - -
    - -
    -

    ID:

    - - - - - -
    -
      - $tab["name"]); - if(isset($tab["query"])) - $query = array_merge($query, $tab["query"]); - - ?> -
    • > - -
    • - -
    - -
    -
    - - -
    -
    -
    - -
    - -
    - - - - array("name" => "settings", "label" => __("Form Settings", "gravityforms")), - "20" => array("name" => "confirmation" , "label" => __("Confirmations", "gravityforms"), "query" => array("cid"=>null)), - "30" => array("name" => "notification", "label" => __("Notifications", "gravityforms"), "query" => array("nid"=>null)) - ); - - $setting_tabs = apply_filters("gform_form_settings_menu", $setting_tabs, $form_id); - ksort($setting_tabs, SORT_NUMERIC); - - return $setting_tabs; - } - - - /* Ajax Functions */ - - public static function handle_confirmation_edit_submission($confirmation, $form) { - - if( empty($_POST) || !check_admin_referer('gform_confirmation_edit', 'gform_confirmation_edit') ) - return $confirmation; - - $is_new_confirmation = !$confirmation; - - if($is_new_confirmation) - $confirmation['id'] = uniqid(); - - $confirmation['name'] = rgpost('form_confirmation_name'); - $confirmation['type'] = rgpost('form_confirmation'); - $confirmation['message'] = rgpost('form_confirmation_message'); - $confirmation['disableAutoformat'] = rgpost('form_disable_autoformatting'); - $confirmation['pageId'] = rgpost('form_confirmation_page'); - $confirmation['url'] = rgpost('form_confirmation_url'); - $confirmation['queryString'] = rgpost('form_redirect_querystring'); - $confirmation['isDefault'] = rgpost('is_default'); - - // if is default confirmation, override any submitted conditional logic with empty array - $confirmation['conditionalLogic'] = $confirmation['isDefault'] ? array() : json_decode(rgpost('conditional_logic'), ARRAY_A); - - $failed_validation = false; - - if(!$confirmation['name']) { - $failed_validation = true; - GFCommon::add_error_message(__('You must specify a Confirmation Name.', 'gravityforms')); - } - - switch($confirmation['type']) { - case 'page': - if(empty($confirmation['pageId'])) { - $failed_validation = true; - GFCommon::add_error_message( __('You must select a Confirmation Page.', 'gravityforms') ); - } - break; - case 'redirect': - if(empty($confirmation['url'])) { - $failed_validation = true; - GFCommon::add_error_message( __('You must specify a Redirect URL.', 'gravityforms') ); - } - break; - } - - if($failed_validation) - return $confirmation; - - // allow user to filter confirmation before save - $confirmation = apply_filters("gform_pre_confirmation_save_{$form['id']}", apply_filters('gform_pre_confirmation_save', $confirmation, $form), $form); - - // add current confirmation to confirmations array - $form['confirmations'][$confirmation['id']] = $confirmation; - - // save updated confirmations array - $result = GFFormsModel::save_form_confirmations($form['id'], $form['confirmations']); - - if($result !== false) { - GFCommon::add_message( sprintf( __('Confirmation saved successfully. %sBack to confirmations.%s', 'gravityforms'), '', '') ); - } else { - GFCommon::add_error_message(__('There was an issue saving this confirmation.', 'gravityforms')); - } - - return $confirmation; - } - - public static function maybe_process_confirmation_list_action() { - - if( empty($_POST) || !check_admin_referer('gform_confirmation_list_action', 'gform_confirmation_list_action') ) - return; - - $action = rgpost('action'); - $object_id = rgpost('action_argument'); - - switch($action) { - case 'delete': - $confirmation_deleted = self::delete_confirmation($object_id, rgget('id')); - if($confirmation_deleted) { - GFCommon::add_message( __('Confirmation deleted.', 'gravityforms') ); - } else { - GFCommon::add_error_message( __('There was an issue deleting this confirmation.', 'gravityforms') ); - } - break; - } - - } - - /** - * Delete a form confirmation by ID. - * - * @param mixed $confirmation_id - * @param mixed $form_id Can pass a form ID or a form object - */ - public static function delete_confirmation($confirmation_id, $form_id) { - - if(!$form_id) - return false; - - $form = !is_array($form_id) ? RGFormsModel::get_form_meta($form_id) : $form_id; - unset($form['confirmations'][$confirmation_id]); - - // clear form cache so next retrieval of form meta will reflect deleted notification - RGFormsModel::flush_current_forms(); - - return RGFormsModel::save_form_confirmations($form['id'], $form['confirmations']); - } - - public static function output($a) { - echo $a; - } - -} - - - -require_once(ABSPATH . '/wp-admin/includes/class-wp-list-table.php'); - -class GFConfirmationTable extends WP_List_Table { - - public $form; - - function __construct($form) { - - $this->form = $form; - - $this->_column_headers = array( - array( - 'name' => 'Name', - 'type' => 'Type', - 'content' => 'Content' - ), - array(), - array() - ); - - parent::__construct(); - } - - function prepare_items() { - $this->items = $this->form['confirmations']; - } - - function display() { - extract( $this->_args ); - ?> - - - - print_column_headers(); ?> - - - - - - print_column_headers( false ); ?> - - - - > - - display_rows_or_placeholder(); ?> - - -
    - - '; - echo $this->single_row_columns( $item ); - echo ''; - } - - function column_content($item) { - return self::get_column_content($item); - } - - function column_default($item, $column) { - echo rgar($item, $column); - } - - function column_type($item) { - return self::get_column_type($item); - } - - function column_name($item) { - $edit_url = add_query_arg(array("cid" => $item["id"])); - $actions = apply_filters('gform_confirmation_actions', array( - 'edit' => '' . __('Edit', 'gravityforms') . '', - 'delete' => '' . __('Delete', 'gravityforms') . '' - )); - - if(isset($item['isDefault']) && $item['isDefault']) - unset($actions['delete']); - - ?> - - -
    - - $html) { - $divider = $key == $last_key ? '' : " | "; - ?> - - - - - -
    - - ' . strip_tags($item['message']) . ''; - - case 'page': - - $page = get_post($item['pageId']); - if(empty($page)) - return __('This page does not exist.', 'gravityforms'); - - return '' . $page->post_title . ''; - - case 'redirect': - $url_pieces = parse_url($item['url']); - $url_connector = rgar($url_pieces, 'query') ? '&' : '?'; - $url = $item['queryString'] ? "{$item['url']}{$url_connector}{$item['queryString']}" : $item['url']; - return '' . $url . ''; - } - - return ''; - } - - public static function get_column_type($item) { - switch($item['type']) { - case 'message': - $type = __('Text', 'gravityforms'); - break; - case 'page': - $type = __('Page', 'gravityforms'); - break; - case 'redirect': - $type = __('Redirect', 'gravityforms'); - break; - } - return $type; - } - + + + + + +
    + + ', '') ?> +
    + +
    + +
    + +
    + +
    + +
    + + '; + $subsetting_close = ' + +
    +
    + '; + + + + //create form settings table rows and put them into an array + //form title + $tr_form_title = ' + + + ' . + __("Form title", "gravityforms") . ' ' . + gform_tooltip("form_title", "", true) . + ' + + + + + '; + + //form description + $tr_form_description = ' + + + ' . + __("Form description", "gravityforms") . ' ' . + gform_tooltip("form_description", "", true) . + ' + + + + + '; + + //form label placement + $alignment_options = array( + 'top_label' => __("Top aligned", "gravityforms"), + 'left_label' => __("Left aligned", "gravityforms"), + 'right_label' => __("Right aligned", "gravityforms") + ); + + $label_dd = ""; + foreach($alignment_options as $value => $label) { + $selected = $form['labelPlacement'] == $value ? 'selected="selected"' : ''; + + $label_dd .= ''; + } + $tr_form_label_placement = ' + + + ' . + __("Label placement", "gravityforms") . ' ' . + gform_tooltip("form_label_placement", "", true) . + ' + + + + + '; + + //form description placement + $style = $form['labelPlacement'] != 'top_label' ? 'display:none;' : ''; + $description_dd = ""; + $description_options = array( + 'below' => __("Below inputs", "gravityforms"), + 'above' => __("Above inputs", "gravityforms") + ); + foreach($description_options as $value => $label) { + $selected = rgar( $form, 'descriptionPlacement' ) == $value ? 'selected="selected"' : ''; + + $description_dd .= ''; + } + $tr_form_description_placement = ' + + + ' . + __("Description placement", "gravityforms") . ' ' . + gform_tooltip("form_description_placement", "", true) . + ' + + + + + '; + + + + //css class name + $tr_css_class_name = ' + + + + + + + + '; + + + + //create form advanced settings table rows + //create form button rows + $form_button_type = rgars($form, 'button/type'); + $text_button_checked = ""; + $image_button_checked = ""; + $text_style_display = ""; + $image_style_display = ""; + if ($form_button_type == "text"){ + $text_button_checked = 'checked="checked"'; + $image_style_display = "display:none;"; + } + else if ($form_button_type == "image"){ + $image_button_checked = 'checked="checked"'; + $text_style_display = "display:none;"; + } + //form button + $tr_form_button = ' + + + ' . __("Input type", "gravityforms") . ' + + + + + + +    + + + + + + + '; + + //form button text + $tr_form_button_text = $subsetting_open . ' + + + ' . + __("Button text", "gravityforms") . ' ' . + gform_tooltip("form_button_text", "", true) . + ' + + + + + '; + + //form button image path + $tr_form_button_image_path = ' + + + ' . + __("Button image path", "gravityforms") . ' ' . + gform_tooltip("form_button_image", "", true) . + ' + + + + + ' . $subsetting_close; + + //form button conditional logic + $button_conditional_checked = ""; + if (rgars($form, 'button/conditionalLogic')){ + $button_conditional_checked = 'checked="checked"'; + } + + $tr_form_button_conditional = ' + + + ' . __("Button conditional logic", "gravityforms") . ' ' . gform_tooltip("form_button_conditional_logic", "", true) . ' + + + + + + + + + + + + + '; + + //limit entries + $limit_entry_checked = ""; + $limit_entry_style = ""; + $limit_entries_dd = ""; + if(rgar($form, 'limitEntries')){ + $limit_entry_checked = 'checked="checked"'; + + } + else{ + $limit_entry_style = "display:none"; + } + + $limit_periods = array( + '' => __('total entries', 'gravityforms'), + 'day' => __('per day', 'gravityforms'), + 'week' => __('per week', 'gravityforms'), + 'month' => __('per month', 'gravityforms'), + 'year' => __('per year', 'gravityforms') + ); + foreach($limit_periods as $value => $label) { + $selected = rgar($form, 'limitEntriesPeriod') == $value ? 'selected="selected"' : ''; + $limit_entries_dd .= ''; + } + + $tr_limit_entries = ' + + + ' . __("Limit number of entries", "gravityforms") . ' ' . gform_tooltip("form_limit_entries", "", true) . ' + + + + + + '; + + //limit entries count + $tr_limit_entries_count = ' + + ' . $subsetting_open . ' + + ' . + __("Number of Entries", "gravityforms") . + ' + + + +   + + + ' . $subsetting_close . ' + '; + + //limit entries message + $tr_limit_entries_message = ' + + ' . $subsetting_open . ' + + + + + + + ' . $subsetting_close . ' + + '; + + //schedule form + $schedule_form_checked = ""; + $schedule_form_style = ""; + $start_hour_dd = ""; + $start_minute_dd = ""; + $start_am_selected = ""; + $start_pm_selected = ""; + $end_hour_dd = ""; + $end_minute_dd = ""; + $end_am_selected = ""; + $end_pm_selected = ""; + + if (rgar($form, 'scheduleForm')){ + $schedule_form_checked = 'checked="checked"'; + } + else{ + $schedule_form_style = "display:none"; + } + //create start hour dd options + for($i = 1; $i <= 12; $i++) { + $selected = rgar($form, 'scheduleStartHour') == $i ? 'selected="selected"' : ''; + $start_hour_dd .= ''; + } + //create start minute dd options + foreach(array('00', '15', '30', '45') as $value) { + $selected = rgar($form, 'scheduleStartMinute') == $value ? 'selected="selected"' : ''; + $start_minute_dd .= ''; + } + //set start am/pm + if (rgar($form, 'scheduleStartAmpm') == 'am') { + $start_am_selected = 'selected="selected"'; + } + elseif (rgar($form, 'scheduleStartAmpm') == 'pm'){ + $start_pm_selected = 'selected="selected"'; + } + //create end hour dd options + for($i = 1; $i <= 12; $i++) { + $selected = rgar($form, 'scheduleEndHour') == $i ? 'selected="selected"' : ''; + $end_hour_dd .= ''; + } + //create end minute dd options + foreach(array('00', '15', '30', '45') as $value) { + $selected = rgar($form, 'scheduleEndMinute') == $value ? 'selected="selected"' : ''; + $end_minute_dd .= ''; + } + //set end am/pm + if (rgar($form, 'scheduleEndAmpm') == 'am') { + $end_am_selected = 'selected="selected"'; + } + elseif (rgar($form, 'scheduleEndAmpm') == 'pm'){ + $end_pm_selected = 'selected="selected"'; + } + + //schedule form + $tr_schedule_form = ' + + + ' . __("Schedule form", "gravityforms") . ' ' . gform_tooltip("form_schedule_form", "", true) . ' + + + + + + '; + + //schedule start + $tr_schedule_start = ' + + ' . $subsetting_open . ' + + + + + +    + + : + + + + ' . $subsetting_close . ' + '; + + //schedule end + $tr_schedule_end = ' + + ' . $subsetting_open . ' + + ' . __("Schedule Form End Date/Time", "gravityforms") . ' + + + +    + + : + + + + ' . $subsetting_close . ' + '; + + //schedule message + $tr_schedule_message = ' + + ' . $subsetting_open . ' + + ' . __("Form Expired Message", "gravityforms") . ' + + + + + ' . $subsetting_close . ' + '; + + //honey pot + $honey_pot_checked = ""; + if (rgar($form, 'enableHoneypot')){ + $honey_pot_checked = 'checked="checked"'; + } + $tr_honey_pot = ' + + + ' . __("Anti-spam honeypot", "gravityforms") . ' ' . gform_tooltip("form_honeypot", "", true) . ' + + + + + + '; + + //enable animation + $enable_animation_checked = ""; + if (rgar($form, 'enableAnimation')){ + $enable_animation_checked = 'checked="checked"'; + } + $tr_enable_animation = ' + + + ' . __("Animated transitions", "gravityforms") . ' ' . gform_tooltip("form_animation", "", true) . ' + + + + + + '; + + //require login + $require_login_checked = ""; + $require_login_style = ""; + if (rgar($form, 'requireLogin')){ + $require_login_checked = 'checked="checked"'; + } + else{ + $require_login_style = "display:none"; + } + $tr_requires_login = ' + + + ' . __("Require user to be logged in", "gravityforms") . ' ' . gform_tooltip("form_require_login", "", true) . ' + + + + + + '; + + //require login message + $tr_requires_login_message = ' + + ' . $subsetting_open . ' + + ' . __("Require Login Message", "gravityforms") . ' ' . gform_tooltip("form_require_login_message", "", true) . ' + + + + + ' . $subsetting_close . ' + '; + + //populate arrays with table rows + $form_basics = array("form_title" => $tr_form_title, "form_description" => $tr_form_description); + $form_layout = array("form_label_placement" => $tr_form_label_placement, "form_description_placement" => $tr_form_description_placement, "css_class_name" => $tr_css_class_name); + $form_button = array("form_button_type" => $tr_form_button, "form_button_text" => $tr_form_button_text, "form_button_image_path" => $tr_form_button_image_path, "form_button_conditional" => $tr_form_button_conditional); + $form_restrictions = array("limit_entries" => $tr_limit_entries, "number_of_entries" => $tr_limit_entries_count, "entry_limit_message" => $tr_limit_entries_message, "schedule_form" => $tr_schedule_form, "schedule_start" => $tr_schedule_start, "schedule_end" => $tr_schedule_end, "schedule_message" => $tr_schedule_message, "requires_login" => $tr_requires_login, "requires_login_message" => $tr_requires_login_message); + $form_options = array("honey_pot" => $tr_honey_pot, "enable_animation" => $tr_enable_animation); + + $form_settings = array( + __("Form Basics", "gravityforms") => $form_basics, + __("Form Layout", "gravityforms") => $form_layout, + __("Form Button", "gravityforms") => $form_button, + __("Restrictions", "gravityforms") => $form_restrictions, + __("Form Options", "gravityforms") => $form_options); + + $form_settings = apply_filters("gform_form_settings", $form_settings, $form); + ?> + +
    + +

    + +
    + + + $value) { + ?> + + + + +

    + + +
    + + + + + + + + + + + + + + + + + +
    + + + + + +
    + +
    + + + + 0)); + ?> + +

    + + +

    + + + + + + prepare_items(); + ?> + +
    + + display(); ?> + + + + + + +
    + + + + + + + +
    + +
    + + + +
    + + + + + + " /> + ' /> + +

    + +

    + + + +
    + +
    + + +
    + + '; + $subsetting_close = ' + +
    +
    + '; + + $ui_settings = array(); + $confirmation_type = rgar($confirmation, 'type') ? rgar($confirmation, 'type') : 'message'; + $is_valid = !empty(GFCommon::$errors); + $is_default = rgar($confirmation, 'isDefault'); + + $form_id = rgget('id'); + $form = RGFormsModel::get_form_meta($form_id); + + ob_start(); ?> + + + + class=""> + + + + + + + + + + value="message" onclick="ToggleConfirmation();" /> + +    + value="page" onclick="ToggleConfirmation();" /> + +    + value="redirect" onclick="ToggleConfirmation();" /> + + + + + + + > + + + + +
    + /> + +
    + + + + + + + + class=""> + + + + "form_confirmation_page", "selected" => rgar($confirmation, 'pageId'), "show_option_none" => __("Select a page", "gravityforms"))); ?> + + + + + + + > + + + + " style="width:98%;" /> + + + + + + + > + + + + onclick="ToggleQueryString()"/> +
    > +
    +
    +
    + + + + + + + > + + + +
    + +
    + + + + + + + +
    + +
    +

    ID:

    + + + + + +
    +
      + $tab["name"]); + if(isset($tab["query"])) + $query = array_merge($query, $tab["query"]); + + ?> +
    • > + +
    • + +
    + +
    +
    + + +
    +
    +
    + +
    + +
    + + + + array("name" => "settings", "label" => __("Form Settings", "gravityforms")), + "20" => array("name" => "confirmation" , "label" => __("Confirmations", "gravityforms"), "query" => array("cid"=>null)), + "30" => array("name" => "notification", "label" => __("Notifications", "gravityforms"), "query" => array("nid"=>null)) + ); + + $setting_tabs = apply_filters("gform_form_settings_menu", $setting_tabs, $form_id); + ksort($setting_tabs, SORT_NUMERIC); + + return $setting_tabs; + } + + + /* Ajax Functions */ + + public static function handle_confirmation_edit_submission($confirmation, $form) { + + if( empty($_POST) || !check_admin_referer('gform_confirmation_edit', 'gform_confirmation_edit') ) + return $confirmation; + + $is_new_confirmation = !$confirmation; + + if($is_new_confirmation) + $confirmation['id'] = uniqid(); + + $confirmation['name'] = rgpost('form_confirmation_name'); + $confirmation['type'] = rgpost('form_confirmation'); + $confirmation['message'] = rgpost('form_confirmation_message'); + $confirmation['disableAutoformat'] = rgpost('form_disable_autoformatting'); + $confirmation['pageId'] = rgpost('form_confirmation_page'); + $confirmation['url'] = rgpost('form_confirmation_url'); + $confirmation['queryString'] = rgpost('form_redirect_querystring'); + $confirmation['isDefault'] = rgpost('is_default'); + + // if is default confirmation, override any submitted conditional logic with empty array + $confirmation['conditionalLogic'] = $confirmation['isDefault'] ? array() : json_decode(rgpost('conditional_logic'), ARRAY_A); + + $failed_validation = false; + + if(!$confirmation['name']) { + $failed_validation = true; + GFCommon::add_error_message(__('You must specify a Confirmation Name.', 'gravityforms')); + } + + switch($confirmation['type']) { + case 'page': + if(empty($confirmation['pageId'])) { + $failed_validation = true; + GFCommon::add_error_message( __('You must select a Confirmation Page.', 'gravityforms') ); + } + break; + case 'redirect': + if(empty($confirmation['url'])) { + $failed_validation = true; + GFCommon::add_error_message( __('You must specify a Redirect URL.', 'gravityforms') ); + } + break; + } + + if($failed_validation) + return $confirmation; + + // allow user to filter confirmation before save + $confirmation = apply_filters("gform_pre_confirmation_save_{$form['id']}", apply_filters('gform_pre_confirmation_save', $confirmation, $form), $form); + + // add current confirmation to confirmations array + $form['confirmations'][$confirmation['id']] = $confirmation; + + // save updated confirmations array + $result = GFFormsModel::save_form_confirmations($form['id'], $form['confirmations']); + + if($result !== false) { + GFCommon::add_message( sprintf( __('Confirmation saved successfully. %sBack to confirmations.%s', 'gravityforms'), '', '') ); + } else { + GFCommon::add_error_message(__('There was an issue saving this confirmation.', 'gravityforms')); + } + + return $confirmation; + } + + public static function maybe_process_confirmation_list_action() { + + if( empty($_POST) || !check_admin_referer('gform_confirmation_list_action', 'gform_confirmation_list_action') ) + return; + + $action = rgpost('action'); + $object_id = rgpost('action_argument'); + + switch($action) { + case 'delete': + $confirmation_deleted = self::delete_confirmation($object_id, rgget('id')); + if($confirmation_deleted) { + GFCommon::add_message( __('Confirmation deleted.', 'gravityforms') ); + } else { + GFCommon::add_error_message( __('There was an issue deleting this confirmation.', 'gravityforms') ); + } + break; + } + + } + + /** + * Delete a form confirmation by ID. + * + * @param mixed $confirmation_id + * @param mixed $form_id Can pass a form ID or a form object + */ + public static function delete_confirmation($confirmation_id, $form_id) { + + if(!$form_id) + return false; + + $form = !is_array($form_id) ? RGFormsModel::get_form_meta($form_id) : $form_id; + unset($form['confirmations'][$confirmation_id]); + + // clear form cache so next retrieval of form meta will reflect deleted notification + RGFormsModel::flush_current_forms(); + + return RGFormsModel::save_form_confirmations($form['id'], $form['confirmations']); + } + + public static function output($a) { + echo $a; + } + +} + + + +require_once(ABSPATH . '/wp-admin/includes/class-wp-list-table.php'); + +class GFConfirmationTable extends WP_List_Table { + + public $form; + + function __construct($form) { + + $this->form = $form; + + $this->_column_headers = array( + array( + 'name' => 'Name', + 'type' => 'Type', + 'content' => 'Content' + ), + array(), + array() + ); + + parent::__construct(); + } + + function prepare_items() { + $this->items = $this->form['confirmations']; + } + + function display() { + extract( $this->_args ); + ?> + + + + print_column_headers(); ?> + + + + + + print_column_headers( false ); ?> + + + + > + + display_rows_or_placeholder(); ?> + + +
    + + '; + echo $this->single_row_columns( $item ); + echo ''; + } + + function column_content($item) { + return self::get_column_content($item); + } + + function column_default($item, $column) { + echo rgar($item, $column); + } + + function column_type($item) { + return self::get_column_type($item); + } + + function column_name($item) { + $edit_url = add_query_arg(array("cid" => $item["id"])); + $actions = apply_filters('gform_confirmation_actions', array( + 'edit' => '' . __('Edit', 'gravityforms') . '', + 'delete' => '' . __('Delete', 'gravityforms') . '' + )); + + if(isset($item['isDefault']) && $item['isDefault']) + unset($actions['delete']); + + ?> + + +
    + + $html) { + $divider = $key == $last_key ? '' : " | "; + ?> + + + + + +
    + + ' . strip_tags($item['message']) . ''; + + case 'page': + + $page = get_post($item['pageId']); + if(empty($page)) + return __('This page does not exist.', 'gravityforms'); + + return '' . $page->post_title . ''; + + case 'redirect': + $url_pieces = parse_url($item['url']); + $url_connector = rgar($url_pieces, 'query') ? '&' : '?'; + $url = $item['queryString'] ? "{$item['url']}{$url_connector}{$item['queryString']}" : $item['url']; + return '' . $url . ''; + } + + return ''; + } + + public static function get_column_type($item) { + switch($item['type']) { + case 'message': + $type = __('Text', 'gravityforms'); + break; + case 'page': + $type = __('Page', 'gravityforms'); + break; + case 'redirect': + $type = __('Redirect', 'gravityforms'); + break; + } + return $type; + } + } \ No newline at end of file diff --git a/forms_model.php b/forms_model.php old mode 100755 new mode 100644 index 076d2ad..ee1b8f4 --- a/forms_model.php +++ b/forms_model.php @@ -264,6 +264,7 @@ public static function get_form_meta($form_id){ $description_placement = rgar($form, "descriptionPlacement") == "above" ? "above" : "below"; if(is_array(rgar($form,"fields"))){ foreach($form["fields"] as &$field){ + $field["label"] = !isset($field["label"]) ? "" : $field["label"]; $field["formId"] = $form["id"]; $field["pageNumber"] = $page_number; $field["descriptionPlacement"] = $description_placement; @@ -318,7 +319,7 @@ public static function get_form_meta_by_id($ids){ private static function load_notifications_to_legacy($form){ if(!is_array(rgar($form, "notifications"))) - return; + return $form; foreach($form["notifications"] as $notification){ if(!in_array(rgar($notification,"type"), array("user", "admin"))) @@ -531,8 +532,9 @@ public static function update_lead($lead){ $payment_amount = !rgblank(rgar($lead, "payment_amount")) ? (float) rgar($lead, "payment_amount") : "NULL"; $transaction_type = !rgempty("transaction_type", $lead) ? intval($lead["transaction_type"]) : "NULL"; - $status = !rgempty("status", $lead) ? $lead["status"] : "active"; + $source_url = self::truncate(rgar($lead,"source_url"), 200); + $user_agent = self::truncate(rgar($lead,"user_agent"), 250); $sql = $wpdb->prepare("UPDATE $lead_table SET form_id=%d, @@ -550,13 +552,20 @@ public static function update_lead($lead){ is_fulfilled=%d, transaction_type={$transaction_type}, status='{$status}' - WHERE id=%d", rgar($lead,"form_id"), rgar($lead,"post_id"), rgar($lead,"is_starred"), rgar($lead,"is_read"), rgar($lead,"ip"), rgar($lead,"source_url"), rgar($lead,"user_agent"), - rgar($lead,"currency"), rgar($lead,"payment_status"), rgar($lead,"transaction_id"), rgar($lead,"is_fulfilled"), rgar($lead,"id")); + WHERE id=%d", rgar($lead,"form_id"), rgar($lead,"post_id"), rgar($lead,"is_starred"), rgar($lead,"is_read"), rgar($lead,"ip"), $source_url, $user_agent, + rgar($lead,"currency"), rgar($lead,"payment_status"), rgar($lead,"transaction_id"), rgar($lead,"is_fulfilled"), rgar($lead,"id")); $wpdb->query($sql); self::set_current_lead($lead); } + private static function truncate($str, $length){ + if(strlen($str) > $length){ + $str = substr($str, 0, $length); + } + return $str; + } + public static function delete_leads($leads){ foreach($leads as $lead_id) self::delete_lead($lead_id); @@ -671,8 +680,18 @@ public static function duplicate_form($form_id){ $meta = self::get_form_meta($form_id); $meta["title"] = $title; $meta["id"] = $new_id; + + $notifications = $meta["notifications"]; + $confirmations = $meta["confirmations"]; + unset($meta["notifications"]); + unset($meta["confirmations"]); self::update_form_meta($new_id, $meta); + //copying notification meta + self::update_form_meta($new_id, $notifications, "notifications"); + + //copying confirmation meta + self::update_form_meta($new_id, $confirmations, "confirmations"); return $new_id; } @@ -691,7 +710,8 @@ public static function ensure_tables_exist(){ $form_table_name = self::get_form_table_name(); $form_count = $wpdb->get_var("SELECT count(0) FROM {$form_table_name}"); if($wpdb->last_error){ - GFForms::setup(true); + GFCommon::log_debug("Blog " . get_current_blog_id() . " - Form database table does not exist. Forcing database setup."); + GFForms::setup_site(); } } @@ -717,6 +737,8 @@ public static function update_form_meta($form_id, $form_meta, $meta_name="displa else $result = $wpdb->query( $wpdb->prepare("INSERT INTO $meta_table_name(form_id, $meta_name) VALUES(%d, %s)", $form_id, $form_meta ) ); + self::$_current_forms[$form_id] = null; + return $result; } @@ -990,10 +1012,11 @@ public static function save_lead($form, &$lead){ $user_id = $current_user && $current_user->ID ? $current_user->ID : 'NULL'; $lead_table = RGFormsModel::get_lead_table_name(); - $user_agent = strlen($_SERVER["HTTP_USER_AGENT"]) > 250 ? substr($_SERVER["HTTP_USER_AGENT"], 0, 250) : $_SERVER["HTTP_USER_AGENT"]; + $user_agent = self::truncate($_SERVER["HTTP_USER_AGENT"], 250); $currency = GFCommon::get_currency(); - $wpdb->query($wpdb->prepare("INSERT INTO $lead_table(form_id, ip, source_url, date_created, user_agent, currency, created_by) VALUES(%d, %s, %s, utc_timestamp(), %s, %s, {$user_id})", $form["id"], self::get_ip(), self::get_current_page_url(), $user_agent, $currency)); + $source_url = self::truncate(self::get_current_page_url(), 200); + $wpdb->query($wpdb->prepare("INSERT INTO $lead_table(form_id, ip, source_url, date_created, user_agent, currency, created_by) VALUES(%d, %s, %s, utc_timestamp(), %s, %s, {$user_id})", $form["id"], self::get_ip(), $source_url, $user_agent, $currency)); //reading newly created lead id @@ -1064,10 +1087,12 @@ public static function save_lead($form, &$lead){ if(isset($calculation_field["inputs"]) && is_array($calculation_field["inputs"])){ foreach($calculation_field["inputs"] as $input) { self::save_input($form, $calculation_field, $lead, $current_fields, $input["id"]); + self::refresh_lead_field_value($lead["id"], $input["id"]); } } else{ self::save_input($form, $calculation_field, $lead, $current_fields, $calculation_field["id"]); + self::refresh_lead_field_value($lead["id"], $calculation_field["id"]); } } @@ -1093,7 +1118,7 @@ public static function create_lead($form) { $lead['date_created'] = null; $lead['form_id'] = $form['id']; $lead['ip'] = self::get_ip(); - $lead['source_url'] = self::get_current_page_url(); + $lead['source_url'] = self::truncate(self::get_current_page_url(), 200); $lead['user_agent'] = strlen($_SERVER['HTTP_USER_AGENT']) > 250 ? substr($_SERVER['HTTP_USER_AGENT'], 0, 250) : $_SERVER['HTTP_USER_AGENT']; $lead['currency'] = GFCommon::get_currency(); $lead['created_by'] = $current_user && $current_user->ID ? $current_user->ID : 'NULL'; @@ -1136,6 +1161,11 @@ public static function create_lead($form) { if(!empty($calculation_fields)) { foreach($calculation_fields as $field) { + + // only save fields that are not hidden + if(RGFormsModel::is_field_hidden($form, $field, array()) ) + continue; + if(isset($field["inputs"]) && is_array($field["inputs"])){ foreach($field["inputs"] as $input) { $lead[(string)$input['id']] = self::get_prepared_input_value($form, $field, $lead, $input["id"]); @@ -1144,6 +1174,7 @@ public static function create_lead($form) { else{ $lead[$field['id']] = self::get_prepared_input_value($form, $field, $lead, $field["id"]); } + } self::refresh_product_cache($form, $lead); } @@ -1297,16 +1328,15 @@ public static function get_section($form, $field_id){ return null; } - public static function is_value_match($field_value, $target_value, $operation="is", $source_field=null){ - if($source_field && $source_field["type"] == "post_category"){ + public static function is_value_match( $field_value, $target_value, $operation="is", $source_field = null, $rule = null ){ + + $is_match = false; + + if($source_field && $source_field["type"] == "post_category") $field_value = GFCommon::prepare_post_category_value($field_value, $source_field, "conditional_logic"); - } if (!empty($field_value) && !is_array($field_value) && $source_field["type"] == "multiselect") - { - //convert the comma-delimited string into an array - $field_value = explode(",", $field_value); - } + $field_value = explode(",", $field_value); // convert the comma-delimited string into an array if(is_array($field_value)){ $field_value = array_values($field_value); //returning array values, ignoring keys if array is associative @@ -1316,14 +1346,14 @@ public static function is_value_match($field_value, $target_value, $operation="i $match_count++; } } - //If operation is Is Not, none of the values in the array can match the target value. - return $operation == "isnot" ? $match_count == count($field_value) : $match_count > 0; + // if operation is Is Not, none of the values in the array can match the target value. + $is_match = $operation == "isnot" ? $match_count == count($field_value) : $match_count > 0; } else if(self::matches_operation(GFCommon::get_selection_value($field_value), $target_value, $operation)){ - return true; + $is_match = true; } - return false; + return apply_filters( 'gform_is_value_match', $is_match, $field_value, $target_value, $operation, $source_field, $rule ); } private static function try_convert_float($text){ @@ -1913,7 +1943,7 @@ private static function create_list_array($field, $value){ for($i=0; $i<$row_count; $i++){ $row = array(); foreach($field["choices"] as $column){ - $row[$column["text"]] = $value[$col_index]; + $row[$column["text"]] = rgar($value,$col_index); $col_index++; } $rows[] = $row; @@ -1971,8 +2001,9 @@ public static function get_temp_filename($form_id, $input_name){ if(empty($uploaded_filename)) return false; + $form_unique_id = self::get_form_unique_id($form_id); $pathinfo = pathinfo($uploaded_filename); - return array("uploaded_filename" => $uploaded_filename, "temp_filename" => "{$form_id}_{$input_name}.{$pathinfo["extension"]}"); + return array("uploaded_filename" => $uploaded_filename, "temp_filename" => "{$form_unique_id}_{$input_name}.{$pathinfo["extension"]}"); } @@ -2049,12 +2080,14 @@ public static function create_post($form, &$lead){ $post_data["post_title"] = self::get_default_post_title(); } - //inserting post - if (GFCommon::is_bp_active()){ - //disable buddy press action so save_post is not called because the post data is not yet complete at this point - remove_action("save_post", "bp_blogs_record_post"); - } - $post_id = wp_insert_post($post_data); + // remove original post status and save it for later + $post_status = $post_data['post_status']; + + // replace original post status with 'draft' so other plugins know this post is not fully populated yet + $post_data['post_status'] = 'draft'; + + // inserting post + $post_id = wp_insert_post( $post_data ); //adding form id and entry id hidden custom fields add_post_meta($post_id, "_gform-form-id", $form["id"]); @@ -2152,6 +2185,7 @@ public static function create_post($form, &$lead){ $has_content_field = sizeof(GFCommon::get_fields_by_type($form, array("post_content"))) > 0; $has_title_field = sizeof(GFCommon::get_fields_by_type($form, array("post_title"))) > 0; + $post = false; //if a post field was configured with a content or title template, process template if( (rgar($form, "postContentTemplateEnabled") && $has_content_field) || (rgar($form, "postTitleTemplateEnabled") && $has_title_field) ){ @@ -2186,13 +2220,19 @@ public static function create_post($form, &$lead){ $post->post_name = $post_title; } - if (GFCommon::is_bp_active()){ - //re-enable buddy press action for save_post since the post data is complete at this point - add_action( 'save_post', 'bp_blogs_record_post', 10, 2 ); - } - wp_update_post($post); + + } + + // update post status back to origional status (if not draft) + if( $post_status != 'draft' ) { + $post = is_object( $post ) ? $post : get_post( $post_id ); + $post->post_status = $post_status; } + // if post has been modified since creation, save updates + if( is_object( $post ) ) + wp_update_post($post); + //adding post format if(current_theme_supports('post-formats') && rgar($form, 'postFormat')) { @@ -2214,6 +2254,8 @@ public static function create_post($form, &$lead){ $lead["post_id"] = $post_id; self::update_lead($lead); + do_action( 'gform_after_create_post', $post_id ); + return $post_id; } @@ -2392,10 +2434,6 @@ public static function save_input($form, $field, &$lead, $current_fields, $input } } else{ - //Deleting details for this field - $sql = $wpdb->prepare("DELETE FROM $lead_detail_table WHERE lead_id=%d AND field_number BETWEEN %s AND %s ", $lead["id"], doubleval($input_id) - 0.001, doubleval($input_id) + 0.001); - $wpdb->query($sql); - //Deleting long field if there is one $sql = $wpdb->prepare("DELETE FROM $lead_detail_long_table WHERE lead_detail_id IN( @@ -2403,6 +2441,10 @@ public static function save_input($form, $field, &$lead, $current_fields, $input )", $lead["id"], doubleval($input_id) - 0.001, doubleval($input_id) + 0.001); $wpdb->query($sql); + + //Deleting details for this field + $sql = $wpdb->prepare("DELETE FROM $lead_detail_table WHERE lead_id=%d AND field_number BETWEEN %s AND %s ", $lead["id"], doubleval($input_id) - 0.001, doubleval($input_id) + 0.001); + $wpdb->query($sql); } } @@ -2652,6 +2694,11 @@ public static function get_lead_notes($lead_id){ WHERE lead_id=%d ORDER BY id", $lead_id)); } + public static function refresh_lead_field_value($lead_id, $field_id){ + $cache_key = "GFFormsModel::get_lead_field_value_" . $lead_id . "_" . $field_id; + GFCache::delete($cache_key); + } + public static function get_lead_field_value($lead, $field){ if(empty($lead)) @@ -2771,6 +2818,25 @@ public static function get_leads($form_id, $sort_field_number=0, $sort_direction return $leads; } + public static function get_lead_count($form_id, $search, $star=null, $read=null, $start_date=null, $end_date=null, $status=null, $payment_status = null){ + global $wpdb; + + if(!is_numeric($form_id)) + return ""; + + $detail_table_name = self::get_lead_details_table_name(); + $lead_table_name = self::get_lead_table_name(); + + $where = self::get_leads_where_sql(compact('form_id', 'search', 'status', 'star', 'read', 'start_date', 'end_date', 'payment_status', 'is_default')); + + $sql = "SELECT count(distinct l.id) + FROM $lead_table_name l + INNER JOIN $detail_table_name ld ON l.id = ld.lead_id + $where"; + + return $wpdb->get_var($sql); + } + public static function get_leads_count($form_id) { } private static function sort_by_custom_field_query($form_id, $sort_field_number=0, $sort_direction='DESC', $search='', $offset=0, $page_size=30, $star=null, $read=null, $is_numeric_sort = false, $status='active', $payment_status = false){ @@ -2993,7 +3059,6 @@ public static function build_lead_array($results, $use_long_values = false){ } return $leads; - } public static function save_key($key){ @@ -3007,7 +3072,7 @@ public static function save_key($key){ } } - public static function get_lead_count($form_id, $search, $star=null, $read=null, $start_date=null, $end_date=null, $status=null, $payment_status = null){ + public static function get_lead_ids($form_id, $search, $star=null, $read=null, $start_date=null, $end_date=null, $status=null, $payment_status = null){ global $wpdb; if(!is_numeric($form_id)) @@ -3018,12 +3083,22 @@ public static function get_lead_count($form_id, $search, $star=null, $read=null, $where = self::get_leads_where_sql(compact('form_id', 'search', 'status', 'star', 'read', 'start_date', 'end_date', 'payment_status', 'is_default')); - $sql = "SELECT count(distinct l.id) + $sql = "SELECT distinct l.id FROM $lead_table_name l INNER JOIN $detail_table_name ld ON l.id = ld.lead_id $where"; - return $wpdb->get_var($sql); + $rows = $wpdb->get_results($sql); + + if(empty($rows)) + return array(); + + foreach ($rows as $row){ + $lead_ids[] = $row->id; + } + + return $lead_ids; + } public static function get_grid_columns($form_id, $input_label_only=false){ @@ -3341,7 +3416,6 @@ public static function set_entry_meta($lead, $form){ $paging = array('offset' => 0, 'page_size' => 20 ); */ - public static function search_leads($form_id, $search_criteria, $sorting = null, $paging = null) { global $wpdb; @@ -3363,7 +3437,6 @@ public static function search_leads($form_id, $search_criteria, $sorting = null, return $leads; } - private static function sort_by_field_query($form_id, $search_criteria, $sorting, $paging) { global $wpdb; $sort_field_number = rgar($sorting, "key"); @@ -3373,7 +3446,7 @@ private static function sort_by_field_query($form_id, $search_criteria, $sorting $offset = isset($paging["offset"]) ? $paging["offset"] : 0; $page_size = isset($paging["page_size"]) ? $paging["page_size"] : 20; - if (!is_numeric($form_id) || !is_numeric($sort_field_number) || !is_numeric($offset) || !is_numeric($page_size)) + if (!is_numeric($sort_field_number) || !is_numeric($offset) || !is_numeric($page_size)) return ""; $lead_detail_table_name = GFFormsModel::get_lead_details_table_name(); @@ -3387,7 +3460,15 @@ private static function sort_by_field_query($form_id, $search_criteria, $sorting $info_search_where = " AND " . $info_search_where; $where = empty($where) && empty($info_search_where) ? "" : "WHERE " . $search_where . $info_search_where; - $form_id_where = $form_id > 0 ? $wpdb->prepare(" AND form_id=%d", $form_id) : ""; + if(is_array($form_id)){ + $in_str_arr = array_fill(0, count($form_id), '%s'); + $in_str = join($in_str_arr, ","); + $form_id_where = $wpdb->prepare(" AND form_id IN ($in_str)", $form_id); + } else { + $form_id_where = $form_id > 0 ? $wpdb->prepare(" AND form_id=%d", $form_id) : ""; + } + + $field_number_min = $sort_field_number - 0.001; $field_number_max = $sort_field_number + 0.001; @@ -3435,7 +3516,7 @@ private static function sort_by_column_query($form_id, $search_criteria, $sortin $offset = isset($paging["offset"]) ? $paging["offset"] : 0; $page_size = isset($paging["page_size"]) ? $paging["page_size"] : 20; - if (!is_numeric($form_id) || !is_numeric($offset) || !is_numeric($page_size)) { + if (!is_numeric($offset) || !is_numeric($page_size)) { return ""; } @@ -3443,7 +3524,7 @@ private static function sort_by_column_query($form_id, $search_criteria, $sortin $lead_table_name = GFFormsModel::get_lead_table_name(); $lead_meta_table_name = GFFormsModel::get_lead_meta_table_name(); - $entry_meta = GFFormsModel::get_entry_meta($form_id); + $entry_meta = GFFormsModel::get_entry_meta(is_array($form_id) ? 0 : $form_id); $entry_meta_sql_join = ""; if (false === empty($entry_meta) && array_key_exists($sort_field, $entry_meta)) { $entry_meta_sql_join = $wpdb->prepare("INNER JOIN @@ -3457,7 +3538,7 @@ private static function sort_by_column_query($form_id, $search_criteria, $sortin $is_numeric_sort = $entry_meta[$sort_field]['is_numeric']; } - $grid_columns = RGFormsModel::get_grid_columns($form_id); + $grid_columns = is_array($form_id) || $form_id == 0 ? array() : RGFormsModel::get_grid_columns($form_id); if ($sort_field != "date_created" && false === array_key_exists($sort_field, $grid_columns)) $sort_field = "date_created"; $orderby = $is_numeric_sort ? "ORDER BY ($sort_field+0) $sort_direction" : "ORDER BY $sort_field $sort_direction"; @@ -3469,7 +3550,16 @@ private static function sort_by_column_query($form_id, $search_criteria, $sortin $info_search_where = self::get_info_search_where($search_criteria); if(!empty($info_search_where)) $where_arr[] = $info_search_where; - $form_id_where = $form_id > 0 ? $wpdb->prepare("l.form_id=%d", $form_id) : ""; + + if(is_array($form_id)){ + $in_str_arr = array_fill(0, count($form_id), '%s'); + $in_str = join($in_str_arr, ","); + $form_id_where = $wpdb->prepare("l.form_id IN ($in_str)", $form_id); + } else { + $form_id_where = $form_id > 0 ? $wpdb->prepare("l.form_id=%d", $form_id) : ""; + } + + if(!empty($form_id_where)) $where_arr[] = $form_id_where; $where = empty($where_arr) ? "" : "WHERE " . join($where_arr, " AND ") ; @@ -3503,17 +3593,31 @@ private static function get_search_where($form_id, $search_criteria) { $sql_array = array(); $lead_details_table_name = GFFormsModel::get_lead_details_table_name(); $lead_meta_table_name = GFFormsModel::get_lead_meta_table_name(); - $form_id_where = $form_id > 0 ? $wpdb->prepare("WHERE form_id=%d", $form_id) : ""; + if(is_array($form_id)){ + $in_str_arr = array_fill(0, count($form_id), '%s'); + $in_str = join($in_str_arr, ","); + $form_id_where = $wpdb->prepare("WHERE form_id IN ($in_str)", $form_id); + } else { + $form_id_where = $form_id > 0 ? $wpdb->prepare("WHERE form_id=%d", $form_id) : ""; + } + foreach ($search_criteria as $search) { $key = rgar($search, "key"); $val = rgar($search, "value"); + $operator = isset($search["operator"]) ? strtolower($search["operator"]) : "="; + if("is" == $operator) + $operator = "="; + if("isnot" == $operator) + $operator = "<>"; + if("contains" == $operator) + $operator = "like"; switch (rgar($search, "type")) { case "field": $upper_field_number_limit = (string)(int)$key === $key ? (float)$key + 0.9999 : (float)$key + 0.0001; - $operator = isset($search["operator"]) ? $search["operator"] : "="; - $search_term = "LIKE" == $operator ? "%$val%" : $val; + + $search_term = "like" == $operator ? "%$val%" : $val; /* doesn't support "<>" for checkboxes */ $sql_array[] = $wpdb->prepare("l.id IN ( @@ -3543,14 +3647,16 @@ private static function get_search_where($form_id, $search_criteria) { break; case "meta": /* doesn't support "<>" for multiple values of the same key */ - $operator = isset($search["operator"]) ? $search["operator"] : "="; - $search_term = "LIKE" == $operator ? "%$val%" : $val; + $entry_meta = self::get_entry_meta(is_array($form_id) ? 0 : $form_id); + $meta = rgar($entry_meta, $key); + $placeholder = rgar($meta, "is_numeric") ? "%d" : "%s"; + $search_term = "like" == $operator ? "%$val%" : $val; $sql_array[] = $wpdb->prepare("l.id IN ( SELECT lead_id FROM $lead_meta_table_name - WHERE meta_key=%s AND meta_value $operator %s + WHERE meta_key=%s AND meta_value $operator $placeholder ) ", $search["key"], $search_term); break; @@ -3568,18 +3674,31 @@ private static function get_info_search_where($search_criteria) { global $wpdb; $where_array = array(); foreach ($search_criteria as $search) { + switch (rgar($search, "type")) { case "free-form": $val = $search["value"]; - $operator = isset($search["operator"]) ? $search["operator"] : "LIKE"; - $search_term = "LIKE" == $operator ? "%$val%" : $val; + $operator = isset($search["operator"]) ? strtolower($search["operator"]) : "like"; + if("contains" == $operator) + $operator = "like"; + if("is" == $operator) + $operator = "="; + if("isnot" == $operator) + $operator = "<>"; + $search_term = "like" == $operator ? "%$val%" : $val; $where_array[] = $wpdb->prepare("value $operator %s", $search_term); break; case "info": $col = $search["key"]; $val = $search["value"]; - $operator = isset($search["operator"]) ? $search["operator"] : "="; - $search_term = "LIKE" == $operator ? "%$val%" : $val; + $operator = isset($search["operator"]) ? strtolower($search["operator"]) : "="; + if("contains" == $operator) + $operator = "like"; + if("is" == $operator) + $operator = "="; + if("isnot" == $operator) + $operator = "<>"; + $search_term = "like" == $operator ? "%$val%" : $val; if ("date_created" === $col) $where_array[] = $wpdb->prepare("datediff(date_created, %s) $operator 0", $val); else @@ -3609,7 +3728,15 @@ public static function count_search_leads($form_id, $search_criteria) { $info_search_where = self::get_info_search_where($search_criteria); if(!empty($info_search_where)) $where_arr[] = $info_search_where; - $form_id_where = $form_id > 0 ? $wpdb->prepare("l.form_id=%d", $form_id) : ""; + + if(is_array($form_id)){ + $in_str_arr = array_fill(0, count($form_id), '%s'); + $in_str = join($in_str_arr, ","); + $form_id_where = $wpdb->prepare("l.form_id IN ($in_str)", $form_id); + } else { + $form_id_where = $form_id > 0 ? $wpdb->prepare("l.form_id=%d", $form_id) : ""; + } + if(!empty($form_id_where)) $where_arr[] = $form_id_where; $where = empty($where_arr) ? "" : "WHERE " . join($where_arr, " AND ") ; diff --git a/gravityforms.php b/gravityforms.php old mode 100755 new mode 100644 index d023d43..19520c6 --- a/gravityforms.php +++ b/gravityforms.php @@ -3,7 +3,7 @@ Plugin Name: Gravity Forms Plugin URI: http://www.gravityforms.com Description: Easily create web forms and manage form entries within the WordPress admin. -Version: 1.7.2 +Version: 1.7.8 Author: rocketgenius Author URI: http://www.rocketgenius.com @@ -102,6 +102,7 @@ public static function has_members_plugin(){ public static function init(){ add_filter("gform_logging_supported", array("RGForms", "set_logging_supported")); + add_action( 'admin_head', array( 'GFCommon', 'maybe_output_gf_vars' ) ); self::register_scripts(); @@ -136,6 +137,9 @@ public static function init(){ add_action('admin_footer', array('RGForms', 'check_upload_folder')); add_action('wp_dashboard_setup', array('RGForms', 'dashboard_setup')); + // Support modifying the admin page title for settings + add_filter( 'admin_title' , array( __class__, 'modify_admin_title' ), 10, 2 ); + //Adding "embed form" button add_action('media_buttons', array('RGForms', 'add_form_button'), 20); @@ -193,7 +197,7 @@ public static function init(){ } - add_filter("plugins_api", array("RGForms", "get_addon_info"), 10, 3); + add_filter("plugins_api", array("RGForms", "get_addon_info"), 100, 3); add_action('after_plugin_row_gravityforms/gravityforms.php', array('RGForms', 'plugin_row') ); add_action('install_plugins_pre_plugin-information', array('RGForms', 'display_changelog')); add_filter('plugin_action_links', array('RGForms', 'plugin_settings_link'),10,2); @@ -204,18 +208,17 @@ public static function init(){ else{ add_action('wp_enqueue_scripts', array('RGForms', 'enqueue_scripts')); add_action('wp', array('RGForms', 'ajax_parse_request'), 10); - - // ManageWP premium update filters - add_filter( 'mwp_premium_update_notification', array('RGForms', 'premium_update_push') ); - add_filter( 'mwp_premium_perform_update', array('RGForms', 'premium_update') ); } add_shortcode('gravityform', array('RGForms', 'parse_shortcode')); add_shortcode('gravityforms', array('RGForms', 'parse_shortcode')); + + // ManageWP premium update filters + add_filter( 'mwp_premium_update_notification', array('RGForms', 'premium_update_push') ); + add_filter( 'mwp_premium_perform_update', array('RGForms', 'premium_update') ); } - public static function set_logging_supported($plugins) - { + public static function set_logging_supported($plugins){ $plugins["gravityforms"] = "Gravity Forms Core"; return $plugins; } @@ -269,190 +272,35 @@ public static function check_update($update_plugins_option){ public static function setup($force_setup = false){ global $wpdb; - $version = GFCommon::$version; + if(get_option("rg_form_version") != GFCommon::$version || $force_setup){ + $blog_str = "Blog " . get_current_blog_id(); + GFCommon::log_debug("{$blog_str} - Starting Setup."); + GFCommon::log_debug("{$blog_str} - Previous GF Version: " . get_option("rg_form_version")); + GFCommon::log_debug("{$blog_str} - Current GF Version: " . GFCommon::$version); - if(get_option("rg_form_version") != $version || $force_setup){ + require_once(ABSPATH . '/wp-admin/includes/plugin.php'); - $error = ""; - if(!self::has_database_permission($error)){ - ?> -
    - charset) ) - $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset"; - if ( ! empty($wpdb->collate) ) - $charset_collate .= " COLLATE $wpdb->collate"; - - //Fixes issue with dbDelta lower-casing table names, which cause problems on case sensitive DB servers. - add_filter( 'dbdelta_create_queries', array("RGForms", "dbdelta_fix_case")); - - //------ FORM ----------------------------------------------- - $form_table_name = RGFormsModel::get_form_table_name(); - $sql = "CREATE TABLE " . $form_table_name . " ( - id mediumint(8) unsigned not null auto_increment, - title varchar(150) not null, - date_created datetime not null, - is_active tinyint(1) not null default 1, - PRIMARY KEY (id) - ) $charset_collate;"; - dbDelta($sql); - - //droping table that was created by mistake in version 1.6.3.2 - $wpdb->query("DROP TABLE IF EXISTS A" . $form_table_name); - - //------ META ----------------------------------------------- - $meta_table_name = RGFormsModel::get_meta_table_name(); - $sql = "CREATE TABLE " . $meta_table_name . " ( - form_id mediumint(8) unsigned not null, - display_meta longtext, - entries_grid_meta longtext, - confirmations longtext, - notifications longtext, - PRIMARY KEY (form_id) - ) $charset_collate;"; - dbDelta($sql); - - //droping outdated form_id index (if one exists) - self::drop_index($meta_table_name, 'form_id'); - - //------ FORM VIEW ----------------------------------------------- - $form_view_table_name = RGFormsModel::get_form_view_table_name(); - $sql = "CREATE TABLE " . $form_view_table_name . " ( - id bigint(20) unsigned not null auto_increment, - form_id mediumint(8) unsigned not null, - date_created datetime not null, - ip char(15), - count mediumint(8) unsigned not null default 1, - PRIMARY KEY (id), - KEY form_id (form_id) - ) $charset_collate;"; - dbDelta($sql); - - //------ LEAD ----------------------------------------------- - $lead_table_name = RGFormsModel::get_lead_table_name(); - $sql = "CREATE TABLE " . $lead_table_name . " ( - id int(10) unsigned not null auto_increment, - form_id mediumint(8) unsigned not null, - post_id bigint(20) unsigned, - date_created datetime not null, - is_starred tinyint(1) not null default 0, - is_read tinyint(1) not null default 0, - ip varchar(39) not null, - source_url varchar(200) not null default '', - user_agent varchar(250) not null default '', - currency varchar(5), - payment_status varchar(15), - payment_date datetime, - payment_amount decimal(19,2), - transaction_id varchar(50), - is_fulfilled tinyint(1), - created_by bigint(20) unsigned, - transaction_type tinyint(1), - status varchar(20) not null default 'active', - PRIMARY KEY (id), - KEY form_id (form_id), - KEY status (status) - ) $charset_collate;"; - dbDelta($sql); - - //------ LEAD NOTES ------------------------------------------ - $lead_notes_table_name = RGFormsModel::get_lead_notes_table_name(); - $sql = "CREATE TABLE " . $lead_notes_table_name . " ( - id int(10) unsigned not null auto_increment, - lead_id int(10) unsigned not null, - user_name varchar(250), - user_id bigint(20), - date_created datetime not null, - value longtext, - PRIMARY KEY (id), - KEY lead_id (lead_id), - KEY lead_user_key (lead_id,user_id) - ) $charset_collate;"; - dbDelta($sql); - - //------ LEAD DETAIL ----------------------------------------- - $lead_detail_table_name = RGFormsModel::get_lead_details_table_name(); - $sql = "CREATE TABLE " . $lead_detail_table_name . " ( - id bigint(20) unsigned not null auto_increment, - lead_id int(10) unsigned not null, - form_id mediumint(8) unsigned not null, - field_number float not null, - value varchar(". GFORMS_MAX_FIELD_LENGTH ."), - PRIMARY KEY (id), - KEY form_id (form_id), - KEY lead_id (lead_id), - KEY lead_field_number (lead_id,field_number) - ) $charset_collate;"; - dbDelta($sql); - - //------ LEAD DETAIL LONG ----------------------------------- - $lead_detail_long_table_name = RGFormsModel::get_lead_details_long_table_name(); - - $sql = "CREATE TABLE " . $lead_detail_long_table_name . " ( - lead_detail_id bigint(20) unsigned not null, - value longtext, - PRIMARY KEY (lead_detail_id) - ) $charset_collate;"; - dbDelta($sql); - - //droping outdated form_id index (if one exists) - self::drop_index($lead_detail_long_table_name, 'lead_detail_key'); - - //------ LEAD META ----------------------------------- - $lead_meta_table_name = RGFormsModel::get_lead_meta_table_name(); - $sql = "CREATE TABLE " . $lead_meta_table_name . " ( - id bigint(20) unsigned not null auto_increment, - form_id mediumint(8) unsigned not null default 0, - lead_id bigint(20) unsigned not null, - meta_key varchar(255), - meta_value longtext, - PRIMARY KEY (id), - KEY meta_key (meta_key), - KEY lead_id (lead_id), - KEY form_id_meta_key (form_id,meta_key) - ) $charset_collate;"; - dbDelta($sql); - - remove_filter('dbdelta_create_queries', array("RGForms", "dbdelta_fix_case")); - - //fix form_id value needed to update from version 1.6.11 - self::fix_lead_meta_form_id_values(); - - //fix checkbox value. needed for version 1.0 and below but won't hurt for higher versions - self::fix_checkbox_value(); - - //auto-setting license key based on value configured via the GF_LICENSE_KEY constant or the gf_license_key variable - global $gf_license_key; - $license_key = defined("GF_LICENSE_KEY") && empty($gf_license_key) ? GF_LICENSE_KEY : $gf_license_key; - if(!empty($license_key)) - update_option("rg_gforms_key", md5($license_key)); - - //auto-setting recaptcha keys based on value configured via the constant or global variable - global $gf_recaptcha_public_key, $gf_recaptcha_private_key; - $private_key = defined("GF_RECAPTCHA_PRIVATE_KEY") && empty($gf_recaptcha_private_key) ? GF_RECAPTCHA_PRIVATE_KEY : $gf_recaptcha_private_key; - if(!empty($private_key)) - update_option("rg_gforms_captcha_private_key", $private_key); - - $public_key = defined("GF_RECAPTCHA_PUBLIC_KEY") && empty($gf_recaptcha_public_key) ? GF_RECAPTCHA_PUBLIC_KEY : $gf_recaptcha_public_key; - if(!empty($public_key)) - update_option("rg_gforms_captcha_public_key", $public_key); - - //Auto-importing forms based on GF_IMPORT_FILE AND GF_THEME_IMPORT_FILE - if(defined("GF_IMPORT_FILE") && !get_option("gf_imported_file")){ - GFExport::import_file(GF_IMPORT_FILE); - update_option("gf_imported_file", true); - } + if(self::start_multisite_setup($force_setup)) + { + //if gravity forms is network activated, run the database setup for every site + $sql = $wpdb->prepare("SELECT blog_id FROM $wpdb->blogs WHERE site_id = %d", $wpdb->siteid); + GFCommon::log_debug("Installing multisite. SQL: {$sql}"); + $blog_ids = $wpdb->get_col( $sql ); + GFCommon::log_debug("Blog Ids: " . print_r($blog_ids, true)); + + foreach($blog_ids as $id){ + self::setup_site($id); + } - //adds empty index.php files to upload folders. only for v1.5.2 and below - if(version_compare(get_option("rg_form_version"), "1.6", "<")){ - self::add_empty_index_files(); - } + self::finish_multisite_setup(); + } - update_option("rg_form_version", $version); + } + else{ + self::setup_site(); + } } //Import theme specific forms if configured. Will only import forms once per theme. @@ -473,6 +321,266 @@ public static function setup($force_setup = false){ update_option("gf_imported_theme_file", $themes); } } + + } + + public static function start_multisite_setup($force_setup){ + + $can_start = false; + GFCommon::log_debug("Starting multisite setup from blog: " . get_current_blog_id()); + + //switching to primary blog + if(switch_to_blog(BLOG_ID_CURRENT_SITE)){ + + GFCommon::log_debug("Switched to primary blog: " . BLOG_ID_CURRENT_SITE); + + $is_doing_setup = self::get_wp_option("gf_doing_setup"); + + $is_completed_setup = self::get_wp_option("gf_setup_completed") == GFCommon::$version; + + + //Can start a multisite setup if the setup has not already started and has not been completed. + //Allow setup to start no matter what if "force" mode is specified + $can_start = $force_setup || (!$is_doing_setup && !$is_completed_setup); + + if($can_start) + update_option("gf_doing_setup", 1); + + GFCommon::log_debug("Is doing setup: {$is_doing_setup}. Last setup version: " . self::get_wp_option("gf_setup_completed") . ". Is setup completed {$is_setup_completed}. Force setup: {$force_setup}. Can start: {$can_start}"); + + restore_current_blog(); + } + + return $can_start; + } + + public static function finish_multisite_setup(){ + GFCommon::log_debug("Finishing multisite setup"); + + if(switch_to_blog(BLOG_ID_CURRENT_SITE)){ + + GFCommon::log_debug("Switched to main blog: " . BLOG_ID_CURRENT_SITE); + + update_option("gf_setup_completed", GFCommon::$version); + update_option("gf_doing_setup", 0); + restore_current_blog(); + + } + + } + + public static function get_wp_option($option_name){ + global $wpdb; + return $wpdb->get_var($wpdb->prepare("SELECT option_value FROM {$wpdb->prefix}options WHERE option_name=%s", $option_name)); + } + + public static function setup_site($blog_id=null){ + + GFCommon::log_debug("Blog {$blog_id} - Beginning of setup site"); + + if(empty($blog_id)){ + $blog_id = get_current_blog_id(); + } + + GFCommon::log_debug("Blog {$blog_id} - Trying to switch to blog"); + + //if a blog id is specified, switch to it + if(MULTISITE && !switch_to_blog($blog_id)){ + GFCommon::log_debug("Could not switch to blog {$blog_id}"); + return; + } + + + GFCommon::log_debug("Blog {$blog_id} - Executing database scripts."); + + global $wpdb; + + $error = ""; + if(!self::has_database_permission($error)){ + ?> +
    + charset) ) + $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset"; + if ( ! empty($wpdb->collate) ) + $charset_collate .= " COLLATE $wpdb->collate"; + + //Fixes issue with dbDelta lower-casing table names, which cause problems on case sensitive DB servers. + add_filter( 'dbdelta_create_queries', array("RGForms", "dbdelta_fix_case")); + + //------ FORM ----------------------------------------------- + $form_table_name = RGFormsModel::get_form_table_name(); + $sql = "CREATE TABLE " . $form_table_name . " ( + id mediumint(8) unsigned not null auto_increment, + title varchar(150) not null, + date_created datetime not null, + is_active tinyint(1) not null default 1, + PRIMARY KEY (id) + ) $charset_collate;"; + dbDelta($sql); + + //droping table that was created by mistake in version 1.6.3.2 + $wpdb->query("DROP TABLE IF EXISTS A" . $form_table_name); + + //------ META ----------------------------------------------- + $meta_table_name = RGFormsModel::get_meta_table_name(); + $sql = "CREATE TABLE " . $meta_table_name . " ( + form_id mediumint(8) unsigned not null, + display_meta longtext, + entries_grid_meta longtext, + confirmations longtext, + notifications longtext, + PRIMARY KEY (form_id) + ) $charset_collate;"; + dbDelta($sql); + + //droping outdated form_id index (if one exists) + self::drop_index($meta_table_name, 'form_id'); + + //------ FORM VIEW ----------------------------------------------- + $form_view_table_name = RGFormsModel::get_form_view_table_name(); + $sql = "CREATE TABLE " . $form_view_table_name . " ( + id bigint(20) unsigned not null auto_increment, + form_id mediumint(8) unsigned not null, + date_created datetime not null, + ip char(15), + count mediumint(8) unsigned not null default 1, + PRIMARY KEY (id), + KEY form_id (form_id) + ) $charset_collate;"; + dbDelta($sql); + + //------ LEAD ----------------------------------------------- + $lead_table_name = RGFormsModel::get_lead_table_name(); + $sql = "CREATE TABLE " . $lead_table_name . " ( + id int(10) unsigned not null auto_increment, + form_id mediumint(8) unsigned not null, + post_id bigint(20) unsigned, + date_created datetime not null, + is_starred tinyint(1) not null default 0, + is_read tinyint(1) not null default 0, + ip varchar(39) not null, + source_url varchar(200) not null default '', + user_agent varchar(250) not null default '', + currency varchar(5), + payment_status varchar(15), + payment_date datetime, + payment_amount decimal(19,2), + transaction_id varchar(50), + is_fulfilled tinyint(1), + created_by bigint(20) unsigned, + transaction_type tinyint(1), + status varchar(20) not null default 'active', + PRIMARY KEY (id), + KEY form_id (form_id), + KEY status (status) + ) $charset_collate;"; + dbDelta($sql); + + //------ LEAD NOTES ------------------------------------------ + $lead_notes_table_name = RGFormsModel::get_lead_notes_table_name(); + $sql = "CREATE TABLE " . $lead_notes_table_name . " ( + id int(10) unsigned not null auto_increment, + lead_id int(10) unsigned not null, + user_name varchar(250), + user_id bigint(20), + date_created datetime not null, + value longtext, + PRIMARY KEY (id), + KEY lead_id (lead_id), + KEY lead_user_key (lead_id,user_id) + ) $charset_collate;"; + dbDelta($sql); + + //------ LEAD DETAIL ----------------------------------------- + $lead_detail_table_name = RGFormsModel::get_lead_details_table_name(); + $sql = "CREATE TABLE " . $lead_detail_table_name . " ( + id bigint(20) unsigned not null auto_increment, + lead_id int(10) unsigned not null, + form_id mediumint(8) unsigned not null, + field_number float not null, + value varchar(". GFORMS_MAX_FIELD_LENGTH ."), + PRIMARY KEY (id), + KEY form_id (form_id), + KEY lead_id (lead_id), + KEY lead_field_number (lead_id,field_number) + ) $charset_collate;"; + dbDelta($sql); + + //------ LEAD DETAIL LONG ----------------------------------- + $lead_detail_long_table_name = RGFormsModel::get_lead_details_long_table_name(); + + $sql = "CREATE TABLE " . $lead_detail_long_table_name . " ( + lead_detail_id bigint(20) unsigned not null, + value longtext, + PRIMARY KEY (lead_detail_id) + ) $charset_collate;"; + dbDelta($sql); + + //droping outdated form_id index (if one exists) + self::drop_index($lead_detail_long_table_name, 'lead_detail_key'); + + //------ LEAD META ----------------------------------- + $lead_meta_table_name = RGFormsModel::get_lead_meta_table_name(); + $sql = "CREATE TABLE " . $lead_meta_table_name . " ( + id bigint(20) unsigned not null auto_increment, + form_id mediumint(8) unsigned not null default 0, + lead_id bigint(20) unsigned not null, + meta_key varchar(255), + meta_value longtext, + PRIMARY KEY (id), + KEY meta_key (meta_key), + KEY lead_id (lead_id), + KEY form_id_meta_key (form_id,meta_key) + ) $charset_collate;"; + dbDelta($sql); + + GFCommon::log_debug("Blog {$blog_id} - Finished executing database scripts."); + + remove_filter('dbdelta_create_queries', array("RGForms", "dbdelta_fix_case")); + + //fix form_id value needed to update from version 1.6.11 + self::fix_lead_meta_form_id_values(); + + //fix checkbox value. needed for version 1.0 and below but won't hurt for higher versions + self::fix_checkbox_value(); + + //auto-setting license key based on value configured via the GF_LICENSE_KEY constant or the gf_license_key variable + global $gf_license_key; + $license_key = defined("GF_LICENSE_KEY") && empty($gf_license_key) ? GF_LICENSE_KEY : $gf_license_key; + if(!empty($license_key)) + update_option("rg_gforms_key", md5($license_key)); + + //auto-setting recaptcha keys based on value configured via the constant or global variable + global $gf_recaptcha_public_key, $gf_recaptcha_private_key; + $private_key = defined("GF_RECAPTCHA_PRIVATE_KEY") && empty($gf_recaptcha_private_key) ? GF_RECAPTCHA_PRIVATE_KEY : $gf_recaptcha_private_key; + if(!empty($private_key)) + update_option("rg_gforms_captcha_private_key", $private_key); + + $public_key = defined("GF_RECAPTCHA_PUBLIC_KEY") && empty($gf_recaptcha_public_key) ? GF_RECAPTCHA_PUBLIC_KEY : $gf_recaptcha_public_key; + if(!empty($public_key)) + update_option("rg_gforms_captcha_public_key", $public_key); + + //Auto-importing forms based on GF_IMPORT_FILE AND GF_THEME_IMPORT_FILE + if(defined("GF_IMPORT_FILE") && !get_option("gf_imported_file")){ + GFExport::import_file(GF_IMPORT_FILE); + update_option("gf_imported_file", true); + } + + //adds empty index.php files to upload folders. only for v1.5.2 and below + if(version_compare(get_option("rg_form_version"), "1.6", "<")){ + self::add_empty_index_files(); + } + + update_option("rg_form_version", GFCommon::$version); + + //going back to current blog + if (MULTISITE) + restore_current_blog(); } //Changes form_id values from default value "0" to the correct value. Neededed when upgrading users from 1.6.11 @@ -534,11 +642,11 @@ public static function no_conflict_mode_script(){ $wp_required_scripts = array("admin-bar", "common", "jquery-color", "utils"); $gf_required_scripts = array( - "common" => array("qtip-init", "sack"), + "common" => array("gf_tooltip_init", "sack"), "gf_edit_forms" => array("backbone", "editor", "gform_forms", "gform_form_admin", "gform_form_editor", "gform_gravityforms", "gform_json", "gform_menu", "gform_placeholder", "jquery-ui-autocomplete", "jquery-ui-core", "jquery-ui-datepicker", "jquery-ui-sortable", "jquery-ui-tabs", "json2", "media-editor", "media-models", "media-upload", "media-views", "plupload", "plupload-flash", "plupload-html4", "plupload-html5", "plupload-silverlight", "quicktags", "rg_currency", "thickbox", "word-count", "wp-plupload", "wpdialogs-popup", "wplink"), "gf_edit_forms_notification" => array("editor", "word-count", "quicktags", "wpdialogs-popup", "media-upload", "wplink", "backbone", "jquery-ui-sortable", "json2", "media-editor", "media-models", "media-views", "plupload", "plupload-flash", "plupload-html4", "plupload-html5", "plupload-silverlight", "wp-plupload", "gform_placeholder", "gform_json", "jquery-ui-autocomplete"), - "gf_new_form" => array("thickbox", "jquery-ui-core", "jquery-ui-sortable", "jquery-ui-tabs", "rg_currency", "gforms_gravityforms" ), - "gf_entries" => array("thickbox", "gforms_gravityforms", "wp-lists", "gform_json"), + "gf_new_form" => array("thickbox", "jquery-ui-core", "jquery-ui-sortable", "jquery-ui-tabs", "rg_currency", "gform_gravityforms" ), + "gf_entries" => array("thickbox", "gform_gravityforms", "wp-lists", "gform_json"), "gf_settings" => array(), "gf_export" => array("gform_form_admin","jquery-ui-datepicker"), "gf_help" => array(), @@ -862,6 +970,30 @@ public static function get_parent_menu($addon_menus){ return $parent; } + public static function modify_admin_title( $admin_title, $title ) { + + $subview = rgget( 'subview' ); + $form_id = rgget( 'id' ); + + if( ! $form_id || rgget( 'page' ) != 'gf_edit_forms' || rgget( 'view' ) != 'settings' ) + return $admin_title; + + require_once( GFCommon::get_base_path() . '/form_settings.php' ); + + $setting_tabs = GFFormSettings::get_tabs( $form_id ); + $page_title = ''; + + foreach( $setting_tabs as $tab ) { + if( $tab['name'] == $subview ) + $page_title = $tab['label']; + } + + if( $page_title ) + $admin_title = sprintf( __( '%1$s ‹ %2$s — WordPress' ), $page_title, $admin_title ); + + return $admin_title; + } + //Parses the [gravityform shortcode and returns the front end form UI public static function parse_shortcode( $attributes, $content = null ) { @@ -909,6 +1041,14 @@ public static function parse_shortcode( $attributes, $content = null ) { return $shortcode_string; } + public static function include_addon_framework() { + require_once( GFCommon::get_base_path() . '/includes/addon/class-gf-addon.php' ); + } + + public static function include_feed_addon_framework() { + require_once(GFCommon::get_base_path() . '/includes/addon/class-gf-feed-addon.php' ); + } + //------------------------------------------------- //----------- AJAX -------------------------------- @@ -1197,22 +1337,21 @@ public static function dashboard_dismiss_upgrade(){ public static function register_scripts() { - wp_register_script('gform_chosen', plugins_url('/js/chosen.jquery.min.js', __FILE__), array('jquery'), GFCommon::$version ); - wp_register_script('gform_conditional_logic', plugins_url('/js/conditional_logic.js', __FILE__), array('jquery'), GFCommon::$version ); - wp_register_script('gform_datepicker_init', plugins_url('/js/datepicker.js', __FILE__), array('jquery', 'jquery-ui-datepicker'), GFCommon::$version ); - wp_register_script('gform_dimensions', plugins_url('/js/jquery.dimensions.js', __FILE__), array('jquery'), GFCommon::$version ); - wp_register_script('gform_floatmenu', plugins_url('/js/floatmenu_init.js', __FILE__), array('jquery'), GFCommon::$version ); - wp_register_script('gform_form_admin', plugins_url('/js/form_admin.js', __FILE__), array('jquery', 'jquery-ui-autocomplete'), GFCommon::$version ); - wp_register_script('gform_form_editor', plugins_url('/js/form_editor.js', __FILE__), array('jquery', 'gform_json'), GFCommon::$version ); - wp_register_script('gform_forms', plugins_url('/js/forms.js', __FILE__), array('jquery'), GFCommon::$version ); - wp_register_script('gform_gravityforms', plugins_url('/js/gravityforms.js', __FILE__), array('jquery'), GFCommon::$version ); - wp_register_script('gform_json', plugins_url('/js/jquery.json-1.3.js', __FILE__), array('jquery'), GFCommon::$version ); - wp_register_script('gform_masked_input', plugins_url('/js/jquery.maskedinput-1.3.min.js', __FILE__), array('jquery'), GFCommon::$version ); - wp_register_script('gform_menu', plugins_url('/js/menu.js', __FILE__), array('jquery'), GFCommon::$version ); - wp_register_script('gform_placeholder', plugins_url('/js/jquery.placeholder.1.2.min.js', __FILE__), array('jquery'), GFCommon::$version ); - wp_register_script('gform_qtip', plugins_url('/js/jquery.qtip-1.0.0-rc2.min.js', __FILE__), array('jquery'), GFCommon::$version ); - wp_register_script('gform_qtip_init', plugins_url('/js/qtip_init.js', __FILE__), array('jquery'), GFCommon::$version ); - wp_register_script('gform_textarea_counter', plugins_url('/js/jquery.textareaCounter.plugin.js', __FILE__), array('jquery'), GFCommon::$version ); + wp_register_script('gform_chosen', GFCommon::get_base_url() . '/js/chosen.jquery.min.js', array('jquery'), GFCommon::$version ); + wp_register_script('gform_conditional_logic', GFCommon::get_base_url() . '/js/conditional_logic.js', array('jquery'), GFCommon::$version ); + wp_register_script('gform_datepicker_init', GFCommon::get_base_url() . '/js/datepicker.js', array('jquery', 'jquery-ui-datepicker'), GFCommon::$version ); + wp_register_script('gform_dimensions', GFCommon::get_base_url() . '/js/jquery.dimensions.js', array('jquery'), GFCommon::$version ); + wp_register_script('gform_floatmenu', GFCommon::get_base_url() . '/js/floatmenu_init.js', array('jquery'), GFCommon::$version ); + wp_register_script('gform_form_admin', GFCommon::get_base_url() . '/js/form_admin.js', array('jquery', 'jquery-ui-autocomplete'), GFCommon::$version ); + wp_register_script('gform_form_editor', GFCommon::get_base_url() . '/js/form_editor.js', array('jquery', 'gform_json'), GFCommon::$version ); + wp_register_script('gform_forms', GFCommon::get_base_url() . '/js/forms.js', array('jquery'), GFCommon::$version ); + wp_register_script('gform_gravityforms', GFCommon::get_base_url() . '/js/gravityforms.js', array('jquery'), GFCommon::$version ); + wp_register_script('gform_json', GFCommon::get_base_url() . '/js/jquery.json-1.3.js', array('jquery'), GFCommon::$version ); + wp_register_script('gform_masked_input', GFCommon::get_base_url() . '/js/jquery.maskedinput-1.3.1.min.js', array('jquery'), GFCommon::$version ); + wp_register_script('gform_menu', GFCommon::get_base_url() . '/js/menu.js', array('jquery'), GFCommon::$version ); + wp_register_script('gform_placeholder', GFCommon::get_base_url() . '/js/jquery.placeholder.1.2.min.js', array('jquery'), GFCommon::$version ); + wp_register_script('gf_tooltip_init', GFCommon::get_base_url() . '/js/tooltip_init.js', array('jquery-ui-tooltip'), GFCommon::$version ); + wp_register_script('gform_textarea_counter', GFCommon::get_base_url() . '/js/jquery.textareaCounter.plugin.js', array('jquery'), GFCommon::$version ); // only required for WP versions prior to 3.3 wp_register_script("gf_thickbox", GFCommon::get_base_url() . "/js/thickbox.js", null, GFCommon::$version); @@ -1239,6 +1378,7 @@ public static function enqueue_admin_scripts() { case 'new_form' : case 'form_list': $scripts = array( + 'gform_gravityforms', 'gform_json', 'gform_form_admin', 'thickbox' @@ -1275,6 +1415,10 @@ public static function enqueue_admin_scripts() { 'gform_placeholder', 'jquery-ui-autocomplete' ); + + if ( wp_is_mobile() ) + $scripts[] = 'jquery-touch-punch'; + break; case 'entry_detail': @@ -1451,7 +1595,7 @@ public static function settings_page(){ GFSettings::settings_page(); } - public static function add_settings_page($name, $handle, $icon_path=""){ + public static function add_settings_page( $name, $handle = '', $icon_path = '' ){ require_once(GFCommon::get_base_path() . "/settings.php"); GFSettings::add_settings_page($name, $handle, $icon_path); } @@ -1554,15 +1698,21 @@ public static function get_notification_post_category_values(){ public static function all_leads_page(){ + + $view = rgget("view"); + $lead_id = rgget('lid'); + + //displaying lead detail page if lead id is in the query string - if(rgget('lid') || !rgblank(rgget('pos'))) - { + if($view == 'entry' && (rgget('lid') || !rgblank(rgget('pos')))) { require_once(GFCommon::get_base_path() . "/entry_detail.php"); GFEntryDetail::lead_detail_page(); - } - else{ + } else if ($view == 'entries' || empty($view)){ require_once(GFCommon::get_base_path() . "/entry_list.php"); GFEntryList::all_leads_page(); + } else { + $form_id = rgget('id'); + do_action("gform_entries_view", $view, $form_id, $lead_id); } } @@ -1623,11 +1773,20 @@ public static function post($name){ public static function resend_notifications(){ check_admin_referer('gf_resend_notifications', 'gf_resend_notifications'); - + $form_id = rgpost('formId'); $leads = rgpost('leadIds'); // may be a single ID or an array of IDs - $leads = !is_array($leads) ? array($leads) : $leads; + if(0 == $leads){ + // get all the lead ids for the current filter / search + $filter = rgpost("filter"); + $search = rgpost("search"); + $star = $filter == "star" ? 1 : null; + $read = $filter == "unread" ? 0 : null; + $status = in_array($filter, array("trash", "spam")) ? $filter : "active"; + $leads = GFFormsModel::get_lead_ids($form_id, $search, $star, $read, null, null, $status); + } else { + $leads = !is_array($leads) ? array($leads) : $leads; + } - $form_id = rgpost('formId'); $form = apply_filters("gform_before_resend_notifications_{$form_id}", apply_filters('gform_before_resend_notifications', RGFormsModel::get_form_meta($form_id), $leads), $leads); if(empty($leads) || empty($form)) { @@ -1867,6 +2026,14 @@ function GF_SwitchForm(id){ //remove paging from querystring when changing forms new_query = GF_RemoveQuery("paged", query); new_query = new_query.replace("gf_new_form", "gf_edit_forms"); + + //When switching forms within any form settings tab, go back to main form settings tab + var is_form_settings = new_query.indexOf("page=gf_edit_forms") >=0 && new_query.indexOf("view=settings"); + if(is_form_settings){ + //going back to main form settings tab + new_query = "page=gf_edit_forms&view=settings&id=" + id; + } + document.location = "?" + new_query; } } @@ -1932,7 +2099,10 @@ public static function format_toolbar_menu_items($menu_items, $compact = false){ } array_multisort($priorities, SORT_DESC, $menu_items); - $last_key = array_pop(array_keys($menu_items)); + + $keys = array_keys($menu_items); + $last_key = array_pop($keys); // array_pop(array_keys($menu_items)) causes a Strict Standards warning in WP 3.6 on PHP 5.4 + foreach($menu_items as $key => $menu_item){ if(is_array($menu_item)){ if(GFCommon::current_user_can_any(rgar($menu_item, "capabilities"))){ @@ -1944,6 +2114,7 @@ public static function format_toolbar_menu_items($menu_items, $compact = false){ if(false === GFCommon::current_user_can_any(rgar($sub_menu_items[$k], "capabilities"))) unset($sub_menu_items[$k]); } + $sub_menu_items = array_values($sub_menu_items); //reset numeric keys $count_sub_menu_items = count($sub_menu_items); } @@ -2121,7 +2292,7 @@ private static function toolbar_class($item){ case "entries" : if(rgget("page") == "gf_new_form") return "gf_toolbar_disabled"; - else if(rgget("page") == "gf_entries") + else if(rgget("page") == "gf_entries" && rgempty("view", $_GET)) return "gf_toolbar_active"; break; @@ -2251,4 +2422,4 @@ function rgexplode($sep, $string, $count){ -?> \ No newline at end of file +?> diff --git a/help.php b/help.php old mode 100755 new mode 100644 diff --git a/images/active0.png b/images/active0.png old mode 100755 new mode 100644 diff --git a/images/active1.png b/images/active1.png old mode 100755 new mode 100644 diff --git a/images/add.png b/images/add.png old mode 100755 new mode 100644 diff --git a/images/arrow-handle.png b/images/arrow-handle.png old mode 100755 new mode 100644 diff --git a/images/arrow-right.jpg b/images/arrow-right.jpg old mode 100755 new mode 100644 diff --git a/images/arrow-rightleft.jpg b/images/arrow-rightleft.jpg old mode 100755 new mode 100644 diff --git a/images/blank.gif b/images/blank.gif old mode 100755 new mode 100644 diff --git a/images/calendar.png b/images/calendar.png old mode 100755 new mode 100644 diff --git a/images/captcha_blackglass.jpg b/images/captcha_blackglass.jpg old mode 100755 new mode 100644 diff --git a/images/captcha_clean.jpg b/images/captcha_clean.jpg old mode 100755 new mode 100644 diff --git a/images/captcha_large.png b/images/captcha_large.png old mode 100755 new mode 100644 diff --git a/images/captcha_medium.png b/images/captcha_medium.png old mode 100755 new mode 100644 diff --git a/images/captcha_red.jpg b/images/captcha_red.jpg old mode 100755 new mode 100644 diff --git a/images/captcha_small.png b/images/captcha_small.png old mode 100755 new mode 100644 diff --git a/images/captcha_white.jpg b/images/captcha_white.jpg old mode 100755 new mode 100644 diff --git a/images/chosen-sprite.png b/images/chosen-sprite.png old mode 100755 new mode 100644 diff --git a/images/close.png b/images/close.png old mode 100755 new mode 100644 diff --git a/images/color.png b/images/color.png old mode 100755 new mode 100644 diff --git a/images/datepicker/arrow.png b/images/datepicker/arrow.png old mode 100755 new mode 100644 diff --git a/images/datepicker/ui-icons_222222_256x240.png b/images/datepicker/ui-icons_222222_256x240.png old mode 100755 new mode 100644 diff --git a/images/datepicker/ui-icons_454545_256x240.png b/images/datepicker/ui-icons_454545_256x240.png old mode 100755 new mode 100644 diff --git a/images/datepicker/ui-icons_888888_256x240.png b/images/datepicker/ui-icons_888888_256x240.png old mode 100755 new mode 100644 diff --git a/images/datepicker/ui-icons_cd0a0a_256x240.png b/images/datepicker/ui-icons_cd0a0a_256x240.png old mode 100755 new mode 100644 diff --git a/images/datepicker_arrow_left.gif b/images/datepicker_arrow_left.gif deleted file mode 100755 index d6c523b2b0709af7b51530544cd439f9dbc221c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53 zcmZ?wbhEHbWM^P!XkcLI>FQzp_gC>J3nK#qBZCeD5P)PDn0R`a(FQzp_gC>J3nK#qBZCeD5P)PDn0R~=Dpx#sdt;KfY$yYR FH2_m54LJY+ diff --git a/images/delete.png b/images/delete.png deleted file mode 100755 index 284bb9c13560f87599588040aab76f926fe7061f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 764 zcmV3&9Wx#H1))j4o(Qx;RRld<-=*xVQ0uisf=S(rh-5{|;2o z&dz9LWaQ$HWHLF&;5kK6^o>RXVA5zbWHy^yO!79L&p+^by*0$fVzF}qSTq{dIUJ53 z3?8=GY-BQ-NUzt6uTrT{u~<}Uwc0)QjjgY*dzfSoSWTOtySw|7s;a{S0|R8Y+ll4V z>FFtzN+o&s^z@M1?ItGaV>Mq_S68({0GZp{+jlxTI0-z_@4In_l1N@1@T>Ag@7eq zg#)#Ac6QRt%rxcm1zK8KmIL$qZ;?)?6J_WT-&UT=Wg$SvksaA!cKaoonwp@)!(VbH zCntzYBnAk9#bP0z2)-TC1Aesr%v*w>BpQuzW6#T4S@|pg_;I)g(jUH$MFD3%Mx!7R zfuYa`DijKw`36l--<0?A@<$;?so886i5mR9r-FbV-#KW~>2ykv*LzKR!Q+zS_us}I zh>!P#QmGW0_>&csRg}O@e7?K8JI1vc1_uY};NXDTCBaN4BLfZ8-``J}Oon!LcAAWP zB4fml$K%=J<~-fp+-yN!Z*MPkb#=)CVU4X;D?uH`7>Punao`{*23b zytcMhN+c3=a&mG}29{`JV}rusaE*KP>LD92z^dqa+k8IXi%=-^g*Wp)J4d+$2WL_E uKIFJ>tY|(E2yC_EfmMRRApMX17GMBK;-&Zt!i*^Z0000dr%a09A8B6k(&4fWolg0KoAqbjk%VHeLI9+`wMl0XvZ$09aAx>uV4f3jzl`Cgc^J z9kT~5z#qsel|XK3w$oi&;3hptMmn4prW64l$Q&Hz3xyCBHX%d0lrmShQ3M`>$OR_k zu~T{W9M~dC0M==+WH+YAU_GwEi4=pukOXTn978cJiffZ`14U>l41zCd4nxK?+5Si;FeIghrHnC{B{3s-e{;D~RM!i6C>~WFeF=qQHQVTM7i_fGEJK zBIgo|WD}xz`ZxqW=m_}ya%fas2n{DoNgEpGf+()RP-zIG#y7&U+n>(h`B8L8c7P|& z|F3??SrP=O1BApP$*ok;n=r=I(+#P>;TR}8ClvstidL>L1cnamc8U?*MLZB>8)HHg zsKyiUPzI7o(OYTSqQeb1&SGZLim@1LG!lf~tfkE(T$>P*Il&D^xPd2J@~K?PA^}bo zC8sDBjx=zX&#&NTm zWk@|qSd2P`#c`5Q8o+2E34*p72px+I6Fp;s9wJ&TMuX1CSj@P=s1l7NYi2DhOJi0t zg|+ArRB;1UJ7i49jBF`ws7^=wUs;UaARs6Smz4Wacfn}Vhz(r55 ziQo6)jKRoR^tOtg6OoPBsVIpl>#9E(lV5vU^TwNiqE9aFPf98r-(zOJESs_S4|u(+ zHZN`PeqZ+w+YkSJBMbiZ*cYisQ(NvmSnXTtT(1&~WN}!gcymM*OrH z@9N^u*5-V6dm*&2BK9)1C;PaovAoUW>Z|XV>}`shvZ-~^_#@A5YF)mUfqvhUo%tSE ze!Mj?uJU59bJ;9*g=TjlpI%d6X|;Ub*|%@knb_tZANJn8A9bL*%_ATBZP3^T?LHe- zacW$3`$GI)Or`bJn(I(BzR%uv`%LDpzxw~FKH?pZ&8sZ0ySFAi;+K>D?wg4T=J|EY zn$Wp(&sPEcxogrIQ&m=Zx3Iq{<{e!$ec-$NgGIA-soo7ckFWabgmCzo=ZNyFRY^7H zZk1g5H-2qK#x3H*_UNy>l7mpGulb|-A7A)>@v1w0J@kYnjzv2rMP$XVY`NTdvrTBu zN7tmMUR~N%R>Ijfn%70X-|qDv?pjcLIwGg+NN3;cnf&^${!ib!(A)WEU&rhz(UIF0 z^iFC$)G)KY;D6rAu#R$ diff --git a/images/edit.png b/images/edit.png deleted file mode 100755 index 8095d001618303efcb8cce33149df4ac509424c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 730 zcmV<00ww*4P)RCwB?Q#)u{VH7@BuaCs22#T7Z zQY;-ZWo%r`5>i|`Nl6KmcCn=(B^?_&HSJ)DnL@UP(4huWC^$%J#iSK%a1bk*vP3f# zBbxY#k7&>Lw^vHrt!ME5-gCakIp@F9!NCFjBeY{H5+G8kl-A*J zd}Z*A#bTlH@p01WbRu_oc}a~%L+W-55zrXKek`k~gg}`RBeUN2&#_e{K)oLZS zPpwvqn$4y-+wFGpdcDLXQ|#u`-rk;C5Wr?Gm%FFYXl{8t9-&&R)daBD>k;xB8=JJd z`(C)3o}LEDb-iBy8aWk;SotYb6)^f%Vry%gmY1K<$w_HM!mWb%KCps-E#5!^z4D|- z1PXXF4-c^_9I$c~6W40Bf&if3l>z>Bp~MW%&dyNR=ax${2>9^j z{QUg(TwG8zx-I~UZLABc1UcUmDi(`y^NpRfMGKsKd3=1lz`g0Q@131@f?#&` zrcea|gj_Bcot~c3(b3U>anHpX@#FLP4tY2)vf1nq_MA>9nM@|3ife2(n+fj9{|I<^Tp*8GR`c z35<~b)VT$G#m~eD)qohkw}F8Cw>Sp0C}UN7hxISKL7v# M07*qoM6N<$f|YkvQ2+n{ diff --git a/images/expand_title.png b/images/expand_title.png deleted file mode 100755 index 9ffebb6ca09a785747fc55041f0aee93840905c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmV-61Ihe}P)&6Fc5`pN&!UzRS=Na z0XN|OcYu^5Kx8P2B>?mLAI(f@#1J{^`1 zJ5ZdNa2$)i16UiZ%?(MY9Ttn(l$}A_KgTNB&OF01 zSyj=GsOo*RO}W83D}z?7)M~SDcW7s8!qdKnbvz!Ky?f7wV64bYCq~oLMR!$Fn-wcs z8f!xq0pA#FL)@n>Nw{9G_0_=J?WWX!wKp6Nm&;|zzbl#i(Dj|N))>1q))sz1z6?RW zNk9}uo6SadoBREqCE_?X3!dL4RBlPFDw$nz1Wh1K)7R}U%KW0Ehq3lsy4E<3X0zFN zJU$!_`fZk;PN(HRqWoFL=6n+js~=vhPgpD#tJO-cSY_$pSr{S}_SY zvv+UUkn46<$=uqdcdod-k=cyOV7^)t8U6_{0Caou9aVqDX8-^I07*qoM6N<$g5s8U A>;M1& diff --git a/images/form-button.png b/images/form-button.png old mode 100755 new mode 100644 diff --git a/images/form_options.png b/images/form_options.png old mode 100755 new mode 100644 diff --git a/images/gf-32-iconsprite.png b/images/gf-32-iconsprite.png old mode 100755 new mode 100644 diff --git a/images/gf-creditcard-icons.png b/images/gf-creditcard-icons.png old mode 100755 new mode 100644 diff --git a/images/gf-entry-paging-sprite.jpg b/images/gf-entry-paging-sprite.jpg old mode 100755 new mode 100644 diff --git a/images/gf-expand-title-bg-rtl.png b/images/gf-expand-title-bg-rtl.png old mode 100755 new mode 100644 diff --git a/images/gf-expand-title-bg.png b/images/gf-expand-title-bg.png old mode 100755 new mode 100644 diff --git a/images/gf-fieldsettings-header.jpg b/images/gf-fieldsettings-header.jpg old mode 100755 new mode 100644 diff --git a/images/gf-hovergrad-bg.png b/images/gf-hovergrad-bg.png old mode 100755 new mode 100644 diff --git a/images/gf-html-admin-placeholder.jpg b/images/gf-html-admin-placeholder.jpg old mode 100755 new mode 100644 diff --git a/images/gf-media-button-bg.jpg b/images/gf-media-button-bg.jpg old mode 100755 new mode 100644 diff --git a/images/gf-new-option-bg.png b/images/gf-new-option-bg.png old mode 100755 new mode 100644 diff --git a/images/gf-nofields-steps.png b/images/gf-nofields-steps.png old mode 100755 new mode 100644 diff --git a/images/gf-pagebreak-end.png b/images/gf-pagebreak-end.png old mode 100755 new mode 100644 diff --git a/images/gf-pagebreak-first.png b/images/gf-pagebreak-first.png old mode 100755 new mode 100644 diff --git a/images/gf-pagebreak-inline.png b/images/gf-pagebreak-inline.png old mode 100755 new mode 100644 diff --git a/images/gf-percentbar-bg.png b/images/gf-percentbar-bg.png old mode 100755 new mode 100644 diff --git a/images/gf-percentbar-blue.png b/images/gf-percentbar-blue.png old mode 100755 new mode 100644 diff --git a/images/gf-percentbar-custom.png b/images/gf-percentbar-custom.png old mode 100755 new mode 100644 diff --git a/images/gf-percentbar-gray.png b/images/gf-percentbar-gray.png old mode 100755 new mode 100644 diff --git a/images/gf-percentbar-green.png b/images/gf-percentbar-green.png old mode 100755 new mode 100644 diff --git a/images/gf-percentbar-orange.png b/images/gf-percentbar-orange.png old mode 100755 new mode 100644 diff --git a/images/gf-percentbar-red.png b/images/gf-percentbar-red.png old mode 100755 new mode 100644 diff --git a/images/gf-percentbar-yellow.png b/images/gf-percentbar-yellow.png old mode 100755 new mode 100644 diff --git a/images/gf-tab-container-bg.png b/images/gf-tab-container-bg.png old mode 100755 new mode 100644 diff --git a/images/gf-taboff-bg.png b/images/gf-taboff-bg.png old mode 100755 new mode 100644 diff --git a/images/gf-toolbar-bg.jpg b/images/gf-toolbar-bg.jpg old mode 100755 new mode 100644 diff --git a/images/gf-toolbar-iconsprite.png b/images/gf-toolbar-iconsprite.png old mode 100755 new mode 100644 diff --git a/images/gf_creditcard_icons.png b/images/gf_creditcard_icons.png deleted file mode 100755 index 22f239d786629e60e55e8d652325a3a858a65602..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76461 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 OLq$GtKbGtME diff --git a/images/gf_entry_paging_sprite.jpg b/images/gf_entry_paging_sprite.jpg deleted file mode 100755 index 526b54a73956b54e4ddc446b17d5b04b4d43d98e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2308 zcmZWp30PCd7M{B#gcL9dV0joN*cd>mAkc!cg=zyqWXB?iAUm>sD5w~uVR<$h(EtJl zNf}-*%DrkhND2o^+F%TCJ*9Y=sQBh*^ZX$~B>wo8)nfssr+?jJ`?orB=L%`tY zopI3su-Qui0n9-;3dn2HBI45l1W=4#3xIMAFkB*&!=pgt6^wxpppPPWqBZ~s2LSXc z0Qf%u(1ew8kP8r41*}JK2!h~nD1x9kJWd5X0k44pPatR#i9}6;mKr)LkiGyyP!x~H zYY_-q6df%cik`}%M^@X(p9a$G@Wto>jXv8~bct z;gX+{MWR`Hzh)k38#*l>R}KIz>jM)u(1TX&9;nf@?WB_VPlroR!k4J>6?GGV?Flq!xEKa8O^hj)#oFY=%s zIC?9F`rygb^aynujkbv` zex)f}JlluLbIK=v8GqQ4Y|%fQap~Mdrthodux44r!Kvw|E5@x=|ASTNIPTYQh%9LD&JSMoNuwzzqhfm zNq?#TG2dGEqJIu`>R4e_tRwvDAt6t(asTOW*A^qaT+qOPI{ozu`p9pVNat&c=(^8`Q#y{8#4&4DRKn z*Oc>Cc@)xDb)&%*6F&@ZLaBVc?V?=-s^ygz5u0eJps+Q*TVT{4TgAy7v@!@wwWh~k zZ~eO6v|@er-d#xlOkCL_-+w40uGZhpY{#S11sfi;5ds6v;1=V^CYU8kk?8puqEl^q zI;CSzS1&yA_Hy9yeLJ1oS*0guu1Og@!LmxYtCeP|;BRQ)hx{HcLuQiQW^CQ`h0B{i z&X|UukFRyn?5G41UR9t@?|*K;^s5T$*(g0-#jNLS&HSN8R~GN*JT=-{KFpeOeI!wW zcX_5qED5wM-23tCUaOObi*Leqq|go=lm~V+932FkvCYnK0m6z7b`^0 z#*+eXx%i%ANkixHZRt7kUQb0Av4Z>7n~#LLZZr!0bT8FHK5CjewT_nA#cm#*+`D!l z$i2N)>cRH8Om{w|5-WB)pN7TnMSENYUOq_rX!rAl!CR)G-6gHj9><4Z- zDu#^}F*?kq6|ie4OiK#D7)%Bzka}gTwmOp}<@jf}4>k!I;Lr_$xwi|e(4x@ly(MWs zuE^-zU6Vqqbju5rmrh{GcfL3ZkJW@Rm{nV_!kBAHW7CNR#%oTYxNM!=f0cKmKDBNo zJz;iXQi-)mA$%|c6d1tSXhEf6K3uGYi5_Rvbk*GyItUAAy9{B;P2p^(=CD_XFWmj^ zvFKkJkrUC$jEtJzLn{80>tSLJQQt3{`)Bj<#E>a7m$EnXLEDBtV^i8Lla|=7qdmb! zTI*N1X)Sb*JIw z!`#R{=HStl+wKE|l>m?O7Y?%~qVqoM#nqWWLg_PcX6*6$`&61X9mvqe(vU0f+y_>mIM!v|a{ zdF3UWPOIKyS|u9^kbXSp-L?9!ehX3Z%HbcIAH_y~<9Q-dQuo}w^Q1|eB4EbMzML!< O+pu}L0hdL}{{I2!rH{}6 diff --git a/images/gf_fieldsettings_header.jpg b/images/gf_fieldsettings_header.jpg deleted file mode 100755 index 24c7b12679bcb149677124362dd7638da22c6200..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559 zcmZ9Iy-LJD6ov1dJ2T1bkDFQXr_yXAC|FpD)grjXR_ZJ0Du|$12wG_&h)*Ech*%4P zSZJe&FR)g+R@;iKSXquYi6k3On8|kzbI8rOSJ#En#@@y{K(jdoK4fyAU>9~*H}?TS za=ZlKdN48H+Fn_M)*~lKFeFJA%8b{%UI2vQHSONv2t+DkBFQ^RB_k=VVrlJpzUOIU z3I$_Ic_9%gsf^a9Tr|aUWq?(w#E1S~rNrfXsdG#>oRQxl$IFZegOs}QicEk diff --git a/images/gf_formsettings_header.jpg b/images/gf_formsettings_header.jpg deleted file mode 100755 index 26944c2ba6000b8a2f67a6614ab97505c0b527c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3006 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 DcWqG* diff --git a/images/gf_new_option_bg 2.png b/images/gf_new_option_bg 2.png deleted file mode 100755 index 3486ed76cf4d9b2c20aac8d83522bdf9fa0435df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^Aht0F8<1S*KJx~Uk}PqJC<)F_D=AMbN@Z|N$xljE z@XSq2PYp^CcC6xl+u64Ik|V1Qt(t`gnKwkrl}aNeV(6 z{-_5jepE9OcrO0PS0-%U!hO=78>$W@rD^P#_+o}6S7%d(IiLP&cB8L7YF&cC6M}4I c7@2q&^7#zYdF8fm1X{u1>FVdQ&MBb@0MvdwIRF3v diff --git a/images/gf_new_option_bg.png b/images/gf_new_option_bg.png deleted file mode 100755 index 3486ed76cf4d9b2c20aac8d83522bdf9fa0435df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^Aht0F8<1S*KJx~Uk}PqJC<)F_D=AMbN@Z|N$xljE z@XSq2PYp^CcC6xl+u64Ik|V1Qt(t`gnKwkrl}aNeV(6 z{-_5jepE9OcrO0PS0-%U!hO=78>$W@rD^P#_+o}6S7%d(IiLP&cB8L7YF&cC6M}4I c7@2q&^7#zYdF8fm1X{u1>FVdQ&MBb@0MvdwIRF3v diff --git a/images/gf_pagebreak_end.png b/images/gf_pagebreak_end.png deleted file mode 100755 index 6331e5d5b71d98702710b8d991fcafdd0585ba77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2770 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

    )()E)8MBtyM_- z6-v$$Z)aoPEwYwGJ*`a+sOzv_4)asrlY<4oBF7z%ih?JLuAN!!G!+=*n-&n7wsA%* zbsR0J@Y`U8^Tm7TC;vww0lf48Kq-;$cL97ScwNHNpY?bc|Eng)?$_4pa;jbGT2}2p zRJ*2O4Ye2%1yoFI?8oz|DOcJR8@uu{&;vFld3 zAF}X;uM|0Pnqn&hU*12aXV_AD_}IQlT;mM4M&)?_4A=U0_q((ZJ)5vyx>UTarbLME z_6ln!cnC`}5uD5m_xGlEb}9=iPsl2c$$91Q%a^S`5B02*t2KdBE-#3M6Z|B$@+HDC zmD?BGU8g>WmC2kBXRB95PYyOj>f-dD)pC_L4XMXTwCLFwk$(6HpI!87`FKzHrxO1z z?R2zI`t=5k1}d?hxWNbU_7-uLcpX-1tOpJw`+PfF89(M}1DEekFby zRZvt)OcGgN^VmZD z<>OVf4M%198ts6901US0+l3w1fz5;)KEKyq*EyZ1!p^&_SzT)xt-~-sq;QB>xc|tH8eY2EB&|Wy*IwsMDh?}F(%$w)8*3MMPurgK{F zt!_&jX?!#RRX`AJSog2N;^%R)woxYbvl^Wd)SI?9V~SkQF*?==7I^SPe#>^%BAZL& z1kxLNgr~vy!muY0t(L3(-2BswrVpviTTCho1LgmBVEhS-|7l{sGv|;y|6)&)n6Hk^ zi6%*5|t@^kt00-Cvy=c&k+-AC$WL5_9C>R7y zFh-g=VSwr0Lw5st6+I`od5mO*v|6>oy_VRgMMa%ppMkQ(q9kIcf=s}y!;;tBjt7`-lO5LX)-fA zq{0(Z;`1oB?!a~Fj+blq*LH`WQ$R9Crlv9>k}_xIu^@alWV~pV^Q3ujPTbRXt4T^Q z!fj)$@usi;;tqUhRcdV1HG$qgrXMaoIMVVUyFkn6Jd;Kit*@Hh#@xenC@P4$ghb@s zt~8Tmi!Cl$XTD0ZCQXPpLARy(jlYOF@Chj9i%kSe*yZwf3tJe?#}Q|?(K(bb|Ag?) z4HX6sX|dzpy~QB44HCH4SAIlsZ*`5WaoX9f!O5Yy=pF`{s1!*cL)Q)JNl3zhj?LNl ziN#l*dQzgYci&^+T+a>lWBf8kqR=Tj+wZwLeP0tWu{(bOWjgfRmY}7Mc?aw>Qzw@> zmfU@vc$clts8;G^bY=@N_)!5?!mIw^aYKd8#Os7-IUI%h*EDUEB+tcZRT}SA7uX(U z)!ZZ~w39x}U6TWGEjus41Xo^h5#8vIdkR~@!iT3uZrLzhLOkHllSL8o^i11&DZ8E3 zALg?OU0?78d7$a%T_o~v=9W&5Bm0SB__T!GhN+G!+?imrf&S6E zEG|EpTC=1s-(_W01nL7HMI`Jl-?2G+(ysi0pIF>xY>;vELhC48^T+i%(zFrk%?H`o z47<()GYJA>wK8t1K`&Hn$Ozhxz_DJ$4t!rE!UOC{nbys@3leZohlnEa0owj#mb9-v zjE@dh9_4M=1?x+*(2PG)ew%-H`p8VLT*7@oMA~yccFGryJ`v;t8AVyoc4fg0M<zbGAZ;8*e^!cQaUN7m3fPX*-e`jN=U)ekd{f4HP_kANP7q(?rnUo zbE^Vuh&v?Gd&%Vtb>At-zrqYG@`|1axk;@FiPr^Yq0Mgd+gP` zn0?-cE1#fQ`EKp!)|-UQTe%g<7U-MZjJRLYtrqC5Z+rhLG^;p#p5>Y8L5j%<3i+$% srO5bRp>;7k^FKbK|6d>PIvi+IfQsIeUUgkheg$~rs+FB3$-+DNABt0y=>Px# diff --git a/images/gf_pagebreak_inline.png b/images/gf_pagebreak_inline.png deleted file mode 100755 index 5140d7a9c0d6caaf09b163c5eef8afe7559d8d0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2970 zcmbW3X*}E68pr>!7S(nrs+MZ0UNJ*!CTeL#EwvRvLW$Z!sXd6bcBa*qR!d5$(qdwb zs->|s=rpkvMeOT{q?QOpP)lyynRzw$b6?yS-*e8JbI$Xe^E{v5F9l{{BrJGZ5C8yS z6JrBw007N!*6v66IHOa-9FsFih8W%qu?e^x66PA@0bFwraPyEe@pJX`u=a3uk3e^L zTmb-~D<%fl;NfG-ljcEV?Na153oyUjh5IxfTML(n`6BcVAYR56(Ezaos-CmOwgHt@ zHD#)3Qf^D9KzDA-o4kmIjrVUZJKbUszQfZfe_fDefK z3xMY$@E_#jK)@jY=;)suaRGq8(FM4P1N-~?$dK_4hpbw}5Ei*1YHU`te@R6}C43z? zucOA>5`g*`mR`Fi9{sz0)YBN1Y-`RPRcBN}@YSK@5Y8Qa*Kd`mGq%)w?WH0zaTR*} zK})O@A@G#M0=;}zlUR13NFx^c$Y%!QSPxCX?y-)R)kN9h8+Fa?I}KuUX+q$w^hbDH zEa#*u#CDIuo^Ne-XN6FKsz@AaR6R4=&xNnL*MOC6CN-G*^V8t5xqxb{@%HDTQ}wdL zrr!k$AH#Sf>_~<6jp*JcbmMTr(>Bd~^rr^cu;KtIh(V2<2@WxHuP>}DA9U8x0z$F)#%>_UT{K^~~?_Pzu`VpadYFArm zHxvGk`Uf~Y0B{mMWLq>hFK=ZxBYk3w9lP>0maB1#F@9MQRPilcN!P47qlR8?UM+r7 zS~Pq&)TieMW9QK6waXDQ#NoG4fc5tdZD$lGijr>EXrM`x?n-IgAi@R5b-|W0Q6mTA z5_1@KVqab8TKRdkPP^oCr8(5`tBy#?-8TZSJ`_oNeUyx-HCNI|1OE zBDM>qD%Ub9<)l}dkTPHl#ch;A+7-7=njE3p`Kl^xJ9=%^U11ile+9cVJ3p^i8B1fv zq3`m34Vwa3_3o0UMNRX9ewy zmQqK5dT;%1_hD7JyqKF+D@&9~;5^u{yjbp18s=HV2K2^A-~lrFewE#eSd8}I-g`l| z)9PMhRNi?nX}#JU94(eS3i*6sQ0xqwlwAML|D!b~?d!{K%hzp?iPx{pX^k zcahH_@w`_}e;zx)IKG3ur|8O><}>U2uYz^hsDJZU!vesGmOuH2?s0S}a%*erS||z$ zX8g1~CtZO-qgxg7H#w4~q5Iq(+0Ka4;g1Vj7PSGIQX0#zTJLk^bMeK9nPz$u??rSv z)Vt^SJuAlyvMQz5&+Q6R)v*k#q3c0DsT9@)Oi$HqU(_9cX;iJH5oz-^Y4*ER`wln6 z>1rNKHcTpS*PgZ2yI=0qg>(1q{njAS|A5xVJR=tuFa8cx)j5{RL+PeYPpT-CFV_(S zPs}l*g{f1w-rp0Uu0YD+?K-A_Y{`SW zMWn9@flk2(qM9rBcxXjUE3bkowIxwTsTFS$MxawT;Idli?rHy`)3P{C-XkvgMIqZ) zaNYx)igOmfYP)+SJQ^Y}15YlpN5!(UP?*?4(o!3RZ`^=HB|#8kzFv#?K8rz3`l7}g zTV6$PN=x|eNtuAA;{bWFwj93sa+SpcIx1b+CxkTs6QL&gZQZG8CD*!NcKYkny)kkX z^6^bd^}jEd4$C7pE9JlG_!j!y)c_rFnUUcykBzlPY;MZ=7{ zmprHqK&XVJIaPBj-n}S6gH<}6xfpdec*)t9_8lEeuRQl^t&Wpl&9q~3V#T1pLVgHB z)25)$CX-5ldpF+fnM@KUh)O2zie3n--KZ5rN@PF>gU#E95!LC7+UW?84^F4>Q8#}2 zhb?ytz3ewWc&3kJ*}=2l2B{K$pbE03)gLnx)6+}$WNf0ZSyOqRmmTG1W~IR6^#!oe zL0xlQGRe<{CJneQsqKVy7Q4tkMPX|504qyl92qO$+PI$jaj z_kjCz5OCKmT@F{E02uf4?P`y)<6PsVlQDAkU!h#O=in=Yut#f0q?1Jk! zWal{MD=~-fn5)z2TT`z{JqPpi<8z;ot4t Bmd5}9 diff --git a/images/gf_taboff_bg.png b/images/gf_taboff_bg.png deleted file mode 100755 index 529de9bda8d8fff048b47ec3971dcc37d66e5dc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^sX)xb!3HF&+lym?lw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqF7HC$B>F!Z>F5)JfI-LqRcWyp#E?8B&9csQ`anOuDElU zXAfK24e@y&k1?;Y*zcY3p}T0|LH$#`Z2L7Nd0iTNHCTCdSpO~ZS-JS2PM2EXpL^4< kTzIg3N*9~{GzMmd?JayVQSDP)ffg}%y85}Sb4q9e0BJu$2mk;8 diff --git a/images/gf_toolbar_bg.jpg b/images/gf_toolbar_bg.jpg old mode 100755 new mode 100644 diff --git a/images/gravity-admin-icon.png b/images/gravity-admin-icon.png old mode 100755 new mode 100644 diff --git a/images/gravity-edit-icon-32.png b/images/gravity-edit-icon-32.png old mode 100755 new mode 100644 diff --git a/images/gravity-entry-icon-32.png b/images/gravity-entry-icon-32.png old mode 100755 new mode 100644 diff --git a/images/gravity-export-icon-32.png b/images/gravity-export-icon-32.png old mode 100755 new mode 100644 diff --git a/images/gravity-help-icon-32.png b/images/gravity-help-icon-32.png old mode 100755 new mode 100644 diff --git a/images/gravity-logo.png b/images/gravity-logo.png old mode 100755 new mode 100644 diff --git a/images/gravity-notification-icon-32.png b/images/gravity-notification-icon-32.png old mode 100755 new mode 100644 diff --git a/images/gravity-title-icon-32.png b/images/gravity-title-icon-32.png old mode 100755 new mode 100644 diff --git a/images/gravity_logo.png b/images/gravity_logo.png deleted file mode 100755 index 70e9c8d1f7b7b97c03fb850547fd6cc476dda945..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5684 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 aBftQOzhWL9ARE*G0000>N#Rn;w=PKX# z$!!1dU;HLr{@^-QN;N7KE0i0{knj0a*ep?&-`kE&;}cm*rIS>x)XA;aDV<64cgs|- zxs=VN_`4OVRjZU6&(Qkw0-sgU%eyY zc<~`W1MxFe<=oYBo#sv-=6iQ3>14_C>wF%fTE(ZjSLJhOXm;i#Z4}n1%FprS*#ny3 z^W?|(QZngKp|nZ+^3&vcE)~n0G;?U4D)llguP)&4^zz!`v0AM%zr4Qq&eEgRxj+5m zPyY3@M;o8x8lj=?dGiPP(Ka`ScDJsZQWn{kLyn!0_a6US+gQ%87glH2HlLkYT)zK$ zwO%<_D6PNZy6y}UG7a$OCQ|g>ADsVtH$QvwZ?1gs;NR9N?#5T)d3Qn4N`4_ah;Lgq zS-dl^Qn^}~URif%H;OA43dM~}Rkw1kSlT%2``)zc)*Shs(%`Xp$9u~HkSt0ho!o_Y zXMT9(#MG~U@{_y&bm8{Of8Pbgh)Vz_9SI$k%j9>RO09V0!P3nWPgfqkR;^XeZ@cAS=P@jsg+ic=6@4WRfKd6<9UZDZe*+?z_Ks?!Vpp^4TAM z_TK$}_I#yyeHRovyuq#@U&*cs>t`7NN6WSKv#wWrwN%->P;)C6>RxT8zEsUCusev$ z+>ZAa+dPaPO>nL3MIuB2Ve9~0BjF@jVkovh*u=qqF45d8`+xoL?Bw^ZeDLsJe)-X( zfA7}4(k>`of(jr_M%f|8J>SbGbLv!B%5~+(|n5x4wJgkB*-?@b^Fc>D@nImGXaf zK`}J$_k})?0ua|A1$z_w$gZEP`Q`I#m5o=eT=6yEt(|Zz??}b-Y(MF>=l}PeFP8oj+Z+G9uwJ>l3yPlI zGHMWC(@6fa)7iwqWLlk`*zcS#R##uExz+Qm3g*~0m}cofUd5w;L0NQbTfh%&2|v&& za4q>aa(=cOD49q#xH`}f@qkdB06}tHn?a!GrA9LC?EBXDPW`*Na|eFoqaWS=CyNiB|KD#cC_E;*Csw@%16%A_*7L`c zY3q!gvR+SQ)0dJN`!s)RmO+v6{d(|yaJJtxB9&?YqVBrF?e%&^jyraeSc=e*={b4b zGro_`&b>jOT>A;VbK!6DbpaABj%E*^rBAQ@j6sra4+!cG2oYt0`sjd(7FAehFXh1D ziEn-HH!l6z&C8Gf)$&r|55Cr*5blQ!z{H0ou0^!UXU9^r`KjDFX3WY=Q}A3Fd>OcUoook&peq9nuE#MxtJdUvqCFG)Xnk{q&dk3p-2UnH_vpg> zJ2ZRb4BdTno#toG)Af6o=~v$PzC#nGTP~8E6=hN!L(zc3H zJ&jYnE`YYqym9#Z{POhyh30-wLf;q^5Yu+-y$pa8{QBznRQff3f1WJ=tdq13^6*+h zVBr|~pK2`X5&FhaWoZRot`zC@v%kWsVv}y%`&6Qg$z+<2P9LFkG9!{8n;EABdk+tn zZqxj+3v}hyhvd3-I?n*Pdgmj0w)&XfJol>%f)n)l&G#vj&e8JP6FKM8U{;(hp#1oCmifHz>v+Q4~|dfPLAcX7xzu) zFS0>+F_m`aEyq3pu8}-|r!9Vb-wd|)?|sqz`=^dD=Wfd2BgX(60NnictAB%j{Newk z@4oYEY!ld2t(61_wR)8b<#ig%=IQ$V&*;$pV+@F2(52Jgrd)cAzPSAntBgyu$&%sE z-}_@Ge2VTad>IhTm-9<3B8W`314Q8DXtkiU>hfF$ahW}el1t?cmx}9bui&wc*J0L5=r|wi^)l3FMZ?V^KbDAT`$8NcoP5tbUfTZ1eHLP{Ma<5SoBX%9i>vWC>%SU zn`G`DX9=-E51-tmdyj9>_rLR-^cO$>uQYe$EG@8VI6wauEiB%loA*Db3QLQ}Pwxq_ z%fUGWyuP+wkjDVmAs0bG2-?3{i@=s)i; zD2yuL*Hm^aGc$c?>JWaH;d0jr%z7orAoCV(Zf3rzo7Z!7wG1LD|GVcdAf1`GF6$=VFaF-Imc??17szI z@c8}G>H^(=d{fj)oxKSF4E`vLSkTv24)1<&e}U{*hJZojfxquEQR-EniSIJOne#Ud z=WA(DXJCME4JS7szDN(N``{Y!4~D^SHdpGh=MN-kdOk&CQ;tYa&)X_0l%*8y(AEM9 z4DKrz=YEf0{{c&Z;|z$D3jAzvo(KWgYca3{5bP$(xTC&-4L1xUxIaHOC0w6MWhl)q z-s5NYSv8Ewb)K(3qx~%UVK9R5;BXj$FeaB)9%>t*v`)7fFvky_rq6HuTmS*P0V<%t zQUp>*Q~;3`fnZm}o7afmDb-?t z3-Mv8PmLX*d~QlUIJj>{#P{C(w1|0tWB;DR5-9{ICKxDqk7GC4AbiG_KdgTcVr}CY z8;(_$9<~Sb2K(Ur$+v{~4s-2?SAInAu!m4AZAg{U;_^dUWy23#4t0QYr&wwro^bW{hfM5x zKxdB$>N*3POOhFJFI8h+cQ=qDP-B-)|UyVr+>E8ayRmW4*A<0svXWAU7c% zjxTkR;Pi6Q)e?aBT3L&IudWS89m@y}yraT#re@wGMA&vjZzm;&0SF^0q;?~6J{_O) z8#YE59CaRp2cMUywu5CBt%hc8f)QG>N!40Vpj1SYsIBg+6=VfPXM+0!KVL^9HLk?c zhPziLDWI(c#23ylYd^mph<%g3Hoph)mER=3XH0g#m6%at#~te=5r$bP+fGs(Ih&%w zsw*l3z-ZCdft^&^^hW~}soFGE)Du;=tIdZo(MD>fkxfm2v517>!5PNa_jG^;{yc~+ zy1t}UKu!F7?ZWD4rg0bb*)6-7DsPJaR?cq6(Y>mHxZl5ss_8gGQ-X7o4jn$5k-*mD zYvrcL(;{WmXn>*-YY(Z7hAk1q_l@!72gwSF^3@RO(-wYs2Pj}oOIFjI*JP3{KXCW9 zCm2#hh=$UXQ$0M-h>u@bwEVC_g|#}J`St{@FX^CG*v1$cP*m+z9^k4|XNgv?Af&4$K&_;W zKv?<`xio{Q0)6Of;;T@gCv5Qbn_?HO0)L&QNg}N%GsdoJj$PTTMairZgUqtcJ!n;g z0FSg zi3%Gfu?sZU>0AMsh@rLBb@ltS>|>3=AXtW@nQ@E8_u4eJ&k>*9NtvjsFTp41WeK7N zs>o*Gq{p2AnEG6>T@bWdU#f{gS6HnJcr1rrI2fW5V=MAi5T~$dgQdjL^9jkKdR}YU zMaMYD%L0YxTI5!PLRhOAi)fkh=2PFno^Gz55Q`1W`~ioijwTokwhR)uytvMym3{Z( z^SXE{h)*DPp+mxckd*StNh(6XGd*roHg8jIl0h|P(*&Pu`eaf#ap_K#RvuUR89g0U ze8F2UaSD;Pww7d`*BmFuan$7GNe6#K5dS ztK7BVS5w;yN6E+<=o2D@~B%ia2SopFeMxe4mM62z&;@sIN z;MzqmW!4v;8{X5sPfHAfD$Tu~V^AdM^tWm|8|VO24-dk%~#(&n{Ff!%1W zz9dGm^}3eQGn{r-QfzK+0t7z#GK`Il(bUwGyc&tojqshM1Y#K|M?3OLM%>AVSBtcG zyDVM~s+2lKEr;bHAhwZA+qAjj(Ul)<(Clkjnr3(K_{9v1a-s)UO1ch14NrYURR}yI zxS+W`wgjzE&$)Q39H&MgvDJ=Cil8V2>WnrvHe`pflh5Y`97ddZp;Dn<2!_DYK2{Zn zPp2gCb?4&(Z9J>9duU67Y!KBHCndT8v+>XgOVrlQ_cx``X6AgBj+{$Nfb8KH<(BmN z(CrHT6E+i!-~4n!;wkAdoA0r<#ikeuPz08;750$}g@WwKWKw`JK0Z#VR0=Lr10Zo} z>1LrXv4NMOL#LBG7&W^0Nl~huoTR-4T%A-zzlLuwQo~8utU5{(A31(8OGnRT*yUv# z=T?R6qxEg>k>H!ddT9fl!ve40H65ILE#Bsm5E;Jtu> zKerOP4nbM1M3D0b6=gYsTHA8OK{v!| z00ulO5`W}VY-E#F^ynFyy-Kf!DyjLjcP7ckWr`kMFUbHSXcRAAHP?XPdk!bqMN7(H z88ILJo}suO7_Vk>PpstaXBcC?i?Tli)b<=s3c>I^;OIf6McfzyxOYA&(7}^wHf*z! ztV4~e3jKx|##&fd7)|e^+XFUK03#m+hQE)D=HqLnMo=pHTSPV!3>Ji(_s{D24raO@ z&f~^JBzvNEpF^nHxT@8HM@uX%j$g{r^jwmbA5XJ5f@>~ zi0!nf(~*i(*n_AJp#LE2N?7&RS#7vA6Gp*?Z^~M2-Q0V+D=-K z?qNEq5)d}aq90tp!iL%N$MqI*tAavLNC-%WQ}5L_0|d*Z`Sv7-R{lg(xh$It?BAEhGeHSs!^NtxN8<;GqvGF$~@@#Vj3$ z8~{i57742q+dR1`Tk1v!iBp7ksHP`3%VJp0y^+(MZYUNMYJPrx=OqQg)mD#%fsMEX z4-~uyxSc3>QxV$;fROAc8=!vOZ_XF!nZW%?2}5l3qL9FrqYHgycT}T*7eqldy6>yD zQVPxVByq>TLG4Aqf+B7{DekSbj-=qG*eYNYFTRP%j;W8H!`$uMO1O{+XQMYnTmkA39p8U#=06ERb9=wD8aF+FZB$F zzN!wkC_v$#BFarV6!dTJSz5IlLom?FgBm?z5AE=ov|I!6kVwV3@;q;JT+&Vv%~m&* z4a_M=yomds7R99u%N_)!j-E=1dhu$0cS&I8b66oa)NjT#+`v;oL9Y-R^Gs!~sqQyb zuabO*zX6U$&j&wr-zwC3hB~Vde1_CE&MD<{>_!7js!#P1CxtBAmU2MJ53#gZe^!qM zuv9*uADP@o?|PF59N}7sKlt4$9CYH(;E^EsCE|*G zoMXxJDb_NpMLLb15~Du^A5QgHevXnw1Q0X}vDbj;iy-)^vcXR;#0>KDwzAL@+Uv3mgbZ z5&k-C30T$%esI5ol)!Hvd|seM230cc3@2~})MQ*6#%R4cC)Mk*Bo=lA z1^puia!I96xT2Yh8HxJBAwgj5&PSV6Df$xKi~*B!U3YZUM>{~Y9OtiQ^Ny$nME}CB zD82?;Bhu)8OB?|91H^YCW%mt;&asoATc0-^keNPILC3|ufdRL7oYgEcudqoLZWbl! zhV@9|01-T&H8C+^jf$k`EqY*)x9>O)!1W%=YROp+prks=2KJGLVff|G^*T zZ|QpxRat7=xS&B|@TLqwViQ3#HrN!8uUDkIZftgs)ivWbo z1+|)PYI=-SM@BXC8qquoatlS5Jr*~J=!FR!A#|83W=dTUl!A?bR~U@2;vwEq6M^!1 z8sfa+unRs&i~Z2#lfjtOI9${b+(}6pP zGI_BztYE^du_Z!mD~(2%>oOzE)LU4V-kn4<0*TL1WP@X-)J{H6>CeQgurxT#Dt|#| zgl4N_watimsEeIf_Xh-&t{z)?Sf_<+MVdL6mEIJKx2t;UVEpe?CX*T6dWu-r6jL_% z*KW)jHpmrpqJY$1FoEaZ$m+7XlrFb(9MgM3HF`?4T-t9606$c1g(6{h5Yf;}iH6KB z)7KV*vsW)DsA3Bz#4xSl;gyOc!e%dJskr8eksepTgWs8H6g!&x=yj-6kiZdX;I>BY z@B(+Vo98mIKOrIBy+@PcspRrn9mxQxCbvTeH}=3@Fp)~%r=hBeIFSfo0<>P;?>TT4 zopR9Pg0s%*dWMkn6Pit39qh?P>KQBTpAp&7&&Jb!Bx5Q7*_d_@gR?G8o>P2CBt zhA#=asYysKs4YZNVL!#znf5Vh2}X5g!>8Nqjv|PKn1%1fKk!afURiM=*-omXVRQw% z6~>X@vEYFq%z!^|A}vgz zT2tt#s^57~^fQot(3c9F)Y4rsNL_C&u5Iy9~y!f;BhNM74JFsLCd`q5Vnmo&O# zqI1%rM_*QCCfczJ8A@gBmhYJ97CR1#0R1XDFQZ*J*{zdK=!Cy!sn(i`ek-e9rj+Ob zSm=g>4W$9SHU$XJXNi**(o_Xm+`2`#KP*VnPrR^5k&SKJqY>sd6O210!&K0e3=adB zQL>|cFM~y2oh?ZC!Baqwtj%S&V@9=GtRl=z`(~2jp>3|XQr(5dDN$n+%xSs`jigK3 zPP8Jsm_J~emib$`y;F_lHs@!kh;(UbBp+G}bjvM-BB7ni>tFznvsZ-dXfaq9tRK5C z0E8cu>bG<-9^03Y8Vb{W7{Iv09*Jo>XI#>e=w#DRtOB6GS{nPIpm1T z_?SJt^rd75ur2*FclEe z5C7Km-;7F;aKm+J>r6rCT+%%=QB76XUHm~rSwck7EVflM=w!%{jW9!47z2r z3I(T{wGARQd=*j|p+XpH<}p$kU8WZ&NO8^svq>qxN1Gx9gRq$e+aQvyph+xp5BEMR z(ZUxcI{sRgX4nn9_LGgEv1@C^7=DLh82s_{PGw8&X*UprTPj4$@$i*YR?{16n_vu@ zb3a=9Q`4v z9y{oYtKBgW0-bTu1Xa4?F>szetVw0Fl)=?Bx6Zzvm4+gy%nBE|fS6-@9h!eve=co; z4khT;M+I7bRFRqQ$Sd6abW>0NKbxW1OBu@XHK+KzH{Rc1=~j`(Xf4kKDRDe0Wrpaq zk0z|`CKq>0Aja7g;(Z)X(=Ik-Bv z$7y6Kr9PAig@hVrY~R0J)T)F5h-r&Ux2w`?0`^C76)O&qG$cXuR!mBIa-$?mGerR* z=Vj0yI+c?1J?8Jo)J7E_*6vkuL}!VivK`Nb8qF!TTO{!pnGl2!H(D`|giR3!O1BCu z7)?ljuQ4ztSz3S##dQk+0U{n^g2GVz^v^Z|C8~2H_=Xdtz)flY_*BrThCf5^Dd_so z{$fp@=!u}H} z3KxV!HzOj5)o;M9ZWV>T2|DrC7|p$zqgQ@4FZ%uDTRD*ikFJ+xLJ>sk-lGY+!=fLB zIB2mrzE3x0g>R46Kl#~ghr>B7z0ax;s9D1 z7THFr%UU03191QIA_E~SJt)zj6|sXS*UM6)fIE76uT0M#lw>6WNSzx$*NfR&!4!WC zIBH2z@svndEunbb-Ux-YX{ql3a4?Sr#_5Y$ASS3PSGsMZSq-sLuE>gwrr*~e{^1|i zfB3^6?mQ?ut!UFWIp!*Q%mkYJm2p`#?Z#gf$Sef&C$Hjy3SEdKlsdlqNDtt91K-tb#m zCmHT*0c+@9+i^VNBv@J+{jJbH6Lk(qIc#@LuefAbI7DA}T`CpIbnvVt9$SptKT^$A zt$rU`TiA*gt`=#M^*!1R!W}HJ(FqaUbMGvxy_5n6RW^OP%!Va&a9l5~emn635STG9 zMlFBm_JvZ97jY;cgB*TzC7k69HNJt86Py)q@9p+vPEF{JRON_bKv$FP> zKg7iewzQBMzz_r=5a>Gnt*jWi3ttvR&2b4k6N1B3YC7e%`NSxFnU zYPk1f#t}qpM{JHv=>hRUBX%UN?Kkbo0kG5K2CHie1iAX{nLG5>;?*#mh+9FBp)1Pd3=Z z{!(nxZKR59`dz6fyd*=EBM`~F`$ehZA5p!^ z<;bkUHAGn-Eb!+`HL=1`QyFe!&{E17nw>7uPZqnW2}hc%V=5wE;by|^grWO{CByTj zx=5`-rNf{gh+~po-0ZKk`snV7M3QHsH*GQSP`nCIAS@1I9(g522Tvy@X@$O5C8L(5pB3B2i9h5E+yxL)N)ig%=#xK2+WR9IJ6q}Bp+H=TqvbPn(8?Sxk@8o-+g z0A-H?C{({FA4GD9#m{2|>3|F<2n%&06OAVmG&${%I;=b4cmWv9?Ws^dO?Wl{O_A-D zjaA;C>dGzH4|>-2%Nx`1cs15g^R^wevql9J_Ar3aRdNJ%llWR?)1xQPE7Bbg-a;yC z>m{Eux_2c?_7K{}uXO>iZes|kQZDEYF{t3yZ4%YCau?fq)^=g;L7A%8BI+H9Q}p8w z4gwa-ZkF$%R1Gy1m^~$3>r`{vKx?yG)u`CAupWAH_-y)4UZ{zhw~L?SU7px}p4c$i*@KgeKq`z*RF z<*$E+h(I^y?d7mg+gDzzGTuk*dLR9I9pI8+O)|Q9^Cs=xyO&O$JV~E@_E|&38gPX5uFQuBrJV7d zD_5?_F}#Pwh~7^aWMS@%Ha87_7A~eW*K6rGGbFV)s45;Q_0faxyybnT4I+PabyeyV zr>3T)Wecxc(Zh#o~g$+!Adw`0K3Alaz!rU0(_4ReJ2|#Rc2AZOP z*m2?#-v=1L#c#d!7G1k`O@I_0Y^VfqI|dS90f(E&Apm&bzya9}Aq<8^ZiQ3;7@;a~UVsYU1vqdF zUJ}#{JR~Enw(C*ECD?Eu058-X01hzVdH^;&tWmTnh8m9_k}ZEJz0oGDJ3Bp|>HTF(}|j7>OVR zhy@UUkQgKwlG3k%IUfY>Wlb}gfW-C$t_6SrATZ{zK{bH*FhT)J9EVzhYQgsb3IGS6 zfk4BsE83|K95dH|VQc^Z<``8&bK3!|uvmvgxP19?gR?OhW^ofp1;i{M8Sp)DItT|& zzIyelh*RiT3?7JTta+%GaC8*Lq&X)*gmc1^frJ47jX{bH>H_wL0VmFbbK@B92e!sA z3#jAzhk;Q5bTETq8r(OozhzzY5i&GYyXvDs(&ph1cbEf>-o{{rKMSh@BWev7na{$& z3x8&84&$|$^BPd%T95|jIPL);G{)?(gIDeHNVq>R1AvSBg=huVN-0eu;cXM zcEi14Vj1E@RYCYz__}fF`RH#UHL!<04@30uadQlRoBJ8IDvgsCuyvraa7}>PFhPYI zbHP@CQ5bd|jRhW;Ni`f7l_V-vD~pRJ zsSF6rXAtQy_TYs;ltRawd%*Xgf8pE1o(N}I!wE9zXK)7&*2KGVR~Jm z>-f=yb;7QCyYO~Mg?zPwSG`mrwR>O?81Vym3XmcQCc&_T6^`SG_#u`6>m0ESxT*LY zgol(d0jimqna24{2_ZhicQD|{x8O4vcGwL_@VoKxaRCcL-tb_e!00xu!2qfgQAK^k zWOZ>I*GD|2jVn4@>LY4cZa0e8$tuT&m;?xB+(8frQBS-_fC)RIng9&A3z0{Bj*vA7 zkH{y&=#VZZ#)0qSIL?8f6y8f~MkWwq6}UEBQk)Ox0x$ulb`qnV*VRjJZnsVJ7Qn?l z$ElCdxksn+DxB$ik;WLf8-zi=0|YjM4uD`lje%-F0-{2CfXK*M;QIg+INd}hk#;v> zWRpHevI)OOjseF${`lj@Js|Xc>CzHmBQtGK zy@(pkb}A(ffZ-MQU}J#5AUX(!K@2CZK=iNyYVl$!oXu28TB!= z&BXdY|NL_yURY#9GJrENDEJ)G0mKF;LyQ|q@WmHj2pCW(gJZXD-D>E5sE%m)93&6U zk7N^U2wWe>KzzL7{I9+CTB8&Y#;K85ap2l+jG~jxutSY%23H?_#3}r6z67f=Q*)Ad z(>05Tdm}+i9R(9fg$K)A-vG$y+^}?jZDG`txfWbmlm9?W1Jc4QZUb8b*;#NXBnHj} zNdlmB3VcQ5FTH{#kQCeEs~rIa1{lF16BOdz*UN18#U*}ZK>cpuismbruztJmh0FTG zfK#D0EDhlx8Nx=Ysb(_QGsc}UDmw+QI^|n>ti1BWYl(GWsxScjcH@e;%WwbIZ%Ld5 z((Q$T0yq5byYGsH4g(B2(9@x~wgVD_X1|Mn-}0Spbdrs`Ru~{HR(w16GOWr5;mBSq z+52s4T3udNEHU6)*Fz716?ns( zucFHp7>d7X}K} zt^Q`IR9$%RKs{YrTCKV6ZzmIpv1BSWnMx-2CK8EBOkcAtD`h)Qo^K9+Pw>;F_%&fE zmE+fOe!?uDFC7G2(BmR0(*;aG3>t}v8>kMS|5ly}Xc=HN)k>TMQ2`1XKnbLfA5D4VKnOqPmw(N#($6VSH}2((hR6Hzn`!fKzQXn z$LB>8#Vpo@=U4na=4%NBTPFcvf%u*&V#S~WIKEzyFqosFLQ%tpgfN8l8%yFg!9)=W z6(GQhkwO8Elpj%%Dgq>pfXde30-%z-k1GwR2|njo zK;Se%a_Rfd@H05ljfV(;N(JDu#5E29#~8aIFc~pnMcV1BM);qI+H@1&qRIkWtiT{p z42EQY5f$`?_4)oi<{qB`u#wAVpXc-WrToOi;>5(nlib+Yax$4*<=>a54<6iP@36$b zbpyhNLE!~|*Mehldl(SWSM%NvgGIa#HvHN~V!+*=)|uhaHa88FZ?-eQ zgo9*xMoZWeIO2D90?Q%;T&%))OY!j(OROX)0T4Nf#5hZ<93RgpZIh&+3Pt@vN+Cw0 z6o59yr`ADT_4f&~j3zzYmqcpjd%bLxC;pQV6e z2~c3dFEa>M7z9tp$Hy1bnamo4V3Y3!g{f7oWjsg)A32{uCHrAX7Y1t^!`qJ%J3>o~ zS|zBVhwsFk%#HD#+kry$7;Ncw9;<`SR+4^Z6=5QlA(T@9s$v^gFYNJHQV*(uC0$zi z)d7%r2dGemV=>qOo-F@~Jp&2lK>e}gVvyw-a5)B5md}&ME1wQ(4(8G*Ti@KQK6>(`&gXF{u!+WUIXjchLLGWZ-S5g{DN)?F zZ=cI*$cr$pAEH;7ID+D$`d^STM7b+!QwEi9R8dCcaj1!s6M>6tPC6K*p}AT))v<{ zHr9DBvjJI;x$kz*L#KcG(~W=hd%x!)m(#%=RS`P%;$pWoNL38SCfZ1fULJ({1WzxY zt1jSFJ%D#R*HGPD($Mkf=WgIBSRrxUF=!RDZOqTl*Z=YF|2}mA#_+P*Z6typV?g?C zcIx4Mr*p*phWfZp^lvZpw-@s}ugiVJ>1EY{QNohWitOfk?ZD8B>sVb`S@BQ?fZ7lg z=4>;c(l;nNMg068h|(`Hw*$IP*Y?^F-)lpVZqMcQaKCZqaU<%u*Jlpz5Dh*u!!HXM zb{BQxcL7N+58G}4y%^o*^&xqB1wyaj_1l1`6G)=tje=kJai>QaXZjISyvUbdanP32IVz?t8J1RI9Y-T(${jO{K}^>qcs zivW-6A+Xm@O$|zT)vv@rh5Na4=cE{WP_N{h4vH7yj`ym@UdTjU6kmUN?HaxP&N~CU ztGl3h@y75=UpNI`2^!O)0(=l)?1Ex=U>T_mm2}s>{F2@oKw|8I;%mGuBUb`o^cnfw z1;y8VlgKBll74`(3yN=o#6X+rK7g?cid|srf?^jK-GQ+Sif=G5(8wijD&j6EzQMpa zdE$h$r;Gw)7Zl%MVEpX8_h>SomnAmB&F^+W@eSTEvFd{lKA=Yn3(`x>*crQ^*xl&C z!-w>XU;Khj&d<{!G@{)dlHCm(T0#Bz$3GV1b9dX_cDLPaciY`|x7}@b+ue4z-EDW< z-FCO#ZFk$=y_ Ag#Z8m diff --git a/images/gravityforms_developer_upgrade.png b/images/gravityforms_developer_upgrade.png deleted file mode 100755 index 21732c623c7f2562bd8dfa46cf2fa6c078cafe6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16650 zcmV)SK(fDyP)NxS9R{Gs@}V&dp7No zC0Vle)v}Cj?0Cc2ECy`05SI4>31D90ybwaZZJ)jXPNrbW!}rAcr-}Ed|yFB<708nvYb1ah|tM1dAe#_59LaH9^SXe*DsU< z6p44y;OWDBKAke7W$H`>XoT$!vX@*D$GU|vPzkGTJG?&Li*$evoN%|T*<97i$iOOD)Wj~DIh>$CeUy! zubPgPS;Y!cBvgsN_qy08FI^vc`1WQT%)u=Ib98-2<@81^Q#zlK(OYIJ*Pyd3U_h7SA$-|jbA1(FIKL5$@VRp|S}4)- z`GIwR^}*B~_x-%^?XT|0{_){cmA$i|n5o`xVb!Q?YE&_G{!dP?F2{n_(Bg=7W{qJM zH%7Ig4M8otK`$1Un5Xh71Hu>K8p0o>1<2lHiAJ%&D;oI#!r>eSjUEWGy`n?gP^ke#bxEmHk6jDLZCCF)hL;@r)|W0HreMUl%|Gv|?{4lwT1y((99f z;~USLo7tjM?)*rgvdFT^24quV&%^2VwhGZ40B9~@d#(PK0AYhdH-e-?&EQ&^R<&Dk zNS48|_PpSh&wi-$?j4WkZ~O8OvY$9PSUEHciWXFW$t$Q|6DH8nwnkTnHoq%TS~VwD zSfA97Z|Ml;*9R%TT-VC;*v#V|YC2TUd{80Vh;*pkR{Jbsi}$OP#O*ctvmS^z`_%_T zRh9Sw!ZsNE6$4;} zFqv*cv9PuzY*bdw?>0BYLxl^&Mqy1XY%SBN)M@A@Rcxt?JmA|`SRZJb%Ls%>D+K`+ zfFPU>y&vwPV9yExL%4erW%hrA*s~DVQ=1e+j4=gVSn)(O$3U&Ij20|P#RiXa<;jRHpy+}tX!OWk z6kq-}8z7bqs&LO%8a=v$?aEk9Kxotm5DqMKs1LqRm-eW&;MoC=jmv|t`ogW9_kM3@ z?l1QqE&t&!G$;fBru`X~xOnwCrFuJ!Ws7

    p}r@YbqAlkYX?d^~w@MO9wU0B=q%) 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 G2~7ZXx=_FX diff --git a/images/icon-close.png b/images/icon-close.png old mode 100755 new mode 100644 diff --git a/images/icon-delete.png b/images/icon-delete.png old mode 100755 new mode 100644 diff --git a/images/icon-drop-list.png b/images/icon-drop-list.png old mode 100755 new mode 100644 diff --git a/images/icon-duplicate.png b/images/icon-duplicate.png old mode 100755 new mode 100644 diff --git a/images/icon-edit-gray.png b/images/icon-edit-gray.png old mode 100755 new mode 100644 diff --git a/images/icon-edit.png b/images/icon-edit.png old mode 100755 new mode 100644 diff --git a/images/icon-question.png b/images/icon-question.png old mode 100755 new mode 100644 diff --git a/images/icon-question2.png b/images/icon-question2.png deleted file mode 100755 index ffbab731a7e840745bfddce4e22ac0d5e8d310ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 735 zcmV<50wDc~P)e*M?_A##jC$bX-gn-)-}&x$@0DmEt}iXwFq{Ss>!}~W^ZP3+dxN!_rjazT zcp1a;v5^tGYiNl2{XTWOUCQV48uAZ;YamkoBG9|O4F-dg;c%FoPA93V`U@cF^?H=e zX6fVZ?pM@BKvFUYOgdRA6bem7A`x;p9O4IuPymunr$fib#|aI1TQAYjY^X5dpJ z*qM`4Q$ns_HJN@()O3=zEYs29VHynt0{C^uAh4jzO(aRdVo8$7VzE#nk@&-`iwg^4 zD_zV3em{N6<*s0QLnuIuy4`N-po5|)LIp=G7NdAPF6Qik%3wdB2=)7*+$R(OHp4Iu z9YVgWfV*Bz>ba_=jP_93uUUFXJX!N ztJP{49yDZG_OL{jD$W&Nv|BAYJ3A{*fEV+Ln2~3Lo6TmgR4RQI9$?=ezE`V49v8}3 zAh+9s@dvbatRcQMV9~M+4}k; z`fhNvO7CnjE`5>)^4G`^smQsFdB`{_~ zv*b6I0B1F+&RlKwU6xFBnAQea5~?bkB?0>5I5d(ABkm6*QGVMtL8AK-n&>}5aH3z= zH7+AaR^#@LyNJcYZ_|PzFe_=zWm)1wgECK9g2aS!#SF$)RTYIv_&m?7 gCSu}3u)rAc}U@9~dB)J1&6lAD^)NiCaZ|=>CZOBLw6LfI_L#Y`;MfS%Q=p zaGV^F9J|r3b0t=K#)e^RN?d6oiYr_MV+!f5aLi(rK`cJ1ZGK^`J<}jI298tjLaq{e zgEQUN0)iZuP4UPvrtDcp50qSI6Nl;orYq@Zv*(mafz({omlE{}q(Vd*2zv{8+h%*7 z3KvDN;Z%;~^=v`V?Iypan*pr!!%f;$;z^PH_s1{q!!{j_M(^ay zc-B(#Z9LbW=N;2D#dE|k3=U(sWtL?n5)DvalSxggVF7{0Q4y)J?G z`<Wg~4UPLO`a=G;M{mgY;2$_m7WC;C!KPoBC!`Nc6 z@btYBC`5d_-Q>VfpE*GdCwQW1ik4_xNvYk$+9>}c1kW*PuC@kA-HYb=EkH;Z) zrO{~o2+?sIKAB7c(LIUHTtH~vDi3F~*~ff7--B4KRvQ diff --git a/images/percentbar_gray.png b/images/percentbar_gray.png deleted file mode 100755 index 1e05e883a6649b0c5e7e4f3527a132e4bf5e42d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 375 zcmV--0f_#IP)wSuz+scRw<>m#{YF)>Ld6heO*`eEEXaG@|9&-k|bd-+ey!|%;Lv+ zWKJOAA^=58Jp zLRD2zj4|vr%ps6uI?q#%jgj)9Z)QvqroQi=N=0o1(K)YpBisbAT#!skpAgH$DIX6MeX4{ocf&$4bK^yj57*yPD154g^=Zi@L?YsEGiLC{5WJW{ zh_C`gl|izS8}QPMvn;MlV!+P2@&HwiRpgp2^_LQv-L4&ogtz6Pg_v(iC&R}K!2ahn zQgua5+r^^*u+zmxM#uc}+AIg9GzDN6DqWSZEo3PoAb6)*n?T zE2%J}A?6mvWfBw0>fw3C3$h_Ik*S9uJz^8Pn+E8ZmjI?!Jd#*imuc|=^{`xF+wXmK zO|bmmIV7G>il_FlIE@qfcui&=SMDNkQiS8*2S~kyI@vSTKyy)*+4R9AvQ1{_=L6=5 zo1&aeR*%SLO+ugZh7GSha!g+-8frGdE3_Tb#G7u|l%9hYq*eQ@r>DoZecE^O^m|jywrW5vSO=oD2O?^}GbAi|{^= zwc+$I6FJ}oeXiAlnrzM^qZt6!-7}kWlpcJ`{sb5R(z(+)Kp63h00000NkvXXu0mjf D?E&r- diff --git a/images/percentbar_orange.png b/images/percentbar_orange.png deleted file mode 100755 index 49b53359a33511cdb175b1398bec11970609adf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 483 zcmV<90UZ8`P)5;)pkrCqq_8 znTzxH4OkjI5Mt<#^c$iB%|?jjVND=(AaX>Z1L#g%8DyN71FCsQJ4vL|j?AO5c-%W{ zaUtI?0UQDe#Kk>0ZSzm=7EvMJoWeOb+F)>17GCl}ZeO)TmuuiiNpgh}lHru0GL~9> z<~P*bK1bep?gPN=lU{(x?5kSU$6_W#-^7a&t0LI_5<$sd?6^A8N6ug?V`gc385Tn2TT_xt4b0H8E@MfV+} z`Qso#s>1<#EQA{kgUop`U!-jg^+;i69XP8A!LQAsTb4$Ski(x(*N0qnS?modG zaHkcuacB(jaeiIA*K)hzKHk98R$)-Wi^9%EDVbd+YQ1iP>7`UNHvqN*TOlTfQ_ zwYuIL!1IY3a!S6>-DiSCu9jAy^GF?hJi=^_r&G+h2(fr;O?ns+ATLmeTbt9K-m>yyyIdC zpyr8aiI-6gO%&@+npxcC9AdPJmw7^DBE>bAD#kim+C*Cbt6CDKN%@v0HivPfdh7}^_es{#w_*{In|sF$Kl2azKPaLZ0Rc<8pe!`ajCZ)FR(;Q$4%!t zAq^z@ARGeN4_mFnR2bT$)~XGd$0llS-xK<>lSo z-6)DyRaFfR4o0KV#l=O5L=p%D+-~>s@^V{STWxLa(9n?0X7hMFV`F2Djg1C_p{c2< zy1H7eR^PgHtD>S}e0;pWzkhmqx}>B8!?1;gg_f2Uv)Md6JX~2>>G%7ELSau&&(hM; z%*>3%V(IAUn4h1wTCGZ@a%5!0;c%3emWst+uYooo11HG zZB-}~b#--n zGey~sSmbnG8UHe*k7osq*d%2SCyvIyRr8--#Q@nh(L^PuJ~Mr;;DFgIRZ1+w6)?JQ zo@uT6*b`_^aQf>9s1@9a?qeAvn%yJw@?^A12a=rg$gEk$-X3*7Z%x!W~_sr*G=d+RH z3==1@Ps7y<((okxDMrLSggwM}9Tt$8j@lDssrp%xiff459K~Os)mZcMnJ0I_enable_rg_autoupgrade) { + require_once("class-gf-auto-upgrade.php"); + $is_gravityforms_supported = $this->is_gravityforms_supported($this->_min_gravityforms_version); + new GFAutoUpgrade($this->_slug, $this->_version, $this->_min_gravityforms_version, $this->_title, $this->_full_path, $this->_path, $this->_url, $is_gravityforms_supported); + } + + $this->pre_init(); + } + + /* + * Gets executed before all init functions. Override this function to perform initialization tasks that must be done prior to init + */ + public function pre_init(){ + + if($this->is_gravityforms_supported()){ + + //Entry meta + if ($this->method_is_overridden('get_entry_meta')) + add_filter('gform_entry_meta', array($this, 'get_entry_meta'), 10, 2); + + } + } + + /** + * Plugin starting point. Handles hooks and loading of language files. + */ + public function init() { + + load_plugin_textdomain($this->_slug, FALSE, $this->_slug . '/languages'); + + if(RG_CURRENT_PAGE == 'admin-ajax.php') { + + //If gravity forms is supported, initialize AJAX + if($this->is_gravityforms_supported()){ + $this->init_ajax(); + } + + } + else if (is_admin()) { + + $this->init_admin(); + + } + else { + + if($this->is_gravityforms_supported()){ + $this->init_frontend(); + } + } + + + } + + /** + * Override this function to add initialization code (i.e. hooks) for the admin site (WP dashboard) + */ + protected function init_admin(){ + + // enqueues admin scripts + add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts'), 10, 0); + + // message enforcing min version of Gravity Forms + if (isset($this->_min_gravityforms_version) && RG_CURRENT_PAGE == "plugins.php" && false === $this->_enable_rg_autoupgrade) + add_action('after_plugin_row_' . $this->_path, array($this, 'plugin_row')); + + // STOP HERE IF GRAVITY FORMS IS NOT SUPPORTED + if (isset($this->_min_gravityforms_version) && !$this->is_gravityforms_supported($this->_min_gravityforms_version)) + return; + + $this->setup(); + + // Add form settings only when there are form settings fields configured or form_settings() method is implemented + if (self::has_form_settings_page()) { + $this->form_settings_init(); + } + + // Add plugin page when there is a plugin page configured or plugin_page() method is implemented + if (self::has_plugin_page()) { + $this->plugin_page_init(); + } + + // Add addon settings page only when there are addon settings fields configured or settings_page() method is implemented + if (self::has_plugin_settings_page()) { + if ($this->current_user_can_any($this->_capabilities_settings_page)) { + $this->plugin_settings_init(); + } + } + + // Members plugin integration + if (self::has_members_plugin()) + add_filter('members_get_capabilities', array($this, 'members_get_capabilities')); + + // Results page + + if ($this->method_is_overridden('get_results_page_config')) { + $results_page_config = $this->get_results_page_config(); + $results_capabilities = rgar($results_page_config, "capabilities"); + if($this->current_user_can_any($results_capabilities)) + $this->results_page_init($results_page_config); + } + + // No conflict scripts + add_filter('gform_noconflict_scripts', array($this, 'register_noconflict_scripts')); + add_filter('gform_noconflict_styles', array($this, 'register_noconflict_styles')); + + } + + /** + * Override this function to add initialization code (i.e. hooks) for the public (customer facing) site + */ + protected function init_frontend(){ + + add_filter('gform_preview_styles', array($this, "enqueue_preview_styles"), 10, 2); + add_filter('gform_print_styles', array($this, "enqueue_print_styles"), 10, 2); + add_action("gform_enqueue_scripts", array($this, "enqueue_scripts"), 10, 2); + + } + + /** + * Override this function to add AJAX hooks or to add initialization code when an AJAX request is being performed + */ + protected function init_ajax(){ + if (rgpost("view") == "gf_results_" . $this->_slug) { + require_once(GFCommon::get_base_path() . "/tooltips.php"); + require_once("class-gf-results.php"); + $gf_results = new GFResults($this->_slug, $this->get_results_page_config()); + add_action('wp_ajax_gresults_get_results_gf_results_' . $this->_slug, array($gf_results, 'ajax_get_results')); + add_action('wp_ajax_gresults_get_more_results_gf_results_' . $this->_slug, array($gf_results, 'ajax_get_more_results')); + } + } + + + //-------------- Setup --------------- + + /** + * Performs upgrade tasks when the version of the Add-On changes. To add additional upgrade tasks, override the upgrade() function, which will only get executed when the plugin version has changed. + */ + protected function setup() { + + //upgrading add-on + $installed_version = get_option("gravityformsaddon_" . $this->_slug . "_version"); + if ($installed_version != $this->_version) + $this->upgrade($installed_version); + + update_option("gravityformsaddon_" . $this->_slug . "_version", $this->_version); + } + + /** + * Override this function to add to add database update scripts or any other code to be executed when the Add-On version changes + */ + protected function upgrade($previous_version) { + return; + } + + + //-------------- Script enqueuing --------------- + + /** + * Override this function to provide a list of styles to be enqueued. + * When overriding this function, be sure to call parent::styles() to ensure the base class scripts are enqueued. + * See scripts() for an example of the format expected to be returned. + */ + protected function styles(){ + return array( + array( "handle" => "gaddon_form_settings_css", + "src" => GFAddOn::get_gfaddon_base_url() . "/css/gaddon_form_settings.css", + "version" => GFCommon::$version, + "enqueue" => array( + array("admin_page" => array("form_settings", "plugin_settings", "plugin_page") ) + ) + ), + array( "handle" => "gaddon_results_css", + "src" => GFAddOn::get_gfaddon_base_url() . "/css/gaddon_results.css", + "version" => GFCommon::$version, + "enqueue" => array( + array("admin_page" => array("results") ) + ) + ) + ); + } + + + /** + * Override this function to provide a list of scripts to be enqueued. + * When overriding this function, be sure to call parent::scripts() to ensure the base class scripts are enqueued. + * Following is an example of the array that is expected to be returned by this function: + * + * array( + * array( "handle" => "maskedinput", + * "src" => GFCommon::get_base_url() . "/js/jquery.maskedinput-1.3.min.js", + * "version" => GFCommon::$version, + * "deps" => array("jquery"), + * "in_footer" => false, + * + * //Determines where the script will be enqueued. The script will be enqueued if any of the conditions match + * "enqueue" => array( + * //admin_page - Specified one or more pages (known pages) where the script is supposed to be enqueued. When this setting is specified, scripts will only be enqueued in those pages. + * //To enqueue scripts in the front end (public website), simply don't define this setting + * array("admin_page" => array("form_settings", "plugin_settings") ), + * + * //tab - Specifies a form settings or plugin settings tab in which the script is supposed to be enqueued. If none is specified, the script will be enqueued in any of the form settings or plugin_settings page + * array("tab" => "signature"), + * + * //query - Specifies a set of query string ($_GET) values. If all specified query string values match the current requested page, the script will be enqueued + * array("query" => "page=gf_edit_forms&view=settings&id=_notempty_") + * + * //post - Specifies a set of post ($_POST) values. If all specified posted values match the current request, the script will be enqueued + * array("post" => "posted_field=val") + * + * ) + * ), + * array( + * "handle" => "super_signature_script", + * "src" => $this->get_base_url() . "/super_signature/ss.js", + * "version" => $this->_version, + * "deps" => array("jquery"), + * "callback" => array($this, "localize_scripts"), + * "strings" => array( + * // Accessible in JavaScript using the global variable "[script handle]_strings" + * "stringKey1" => __("The string", "gravityforms"), + * "stringKey2" => __("Another string.", "gravityforms") + * ) + * "enqueue" => array( + * //field_types - Specifies one or more field types that requires this script. The script will only be enqueued if the current form has a field of any of the specified field types. Only applies when a current form is available. + * array("field_types" => array("signature")) + * ) + * ) + * ); + * + * + */ + protected function scripts(){ + return array( + array( + 'handle' => 'gform_form_admin', + 'enqueue' => array( array( "admin_page" => array("form_settings") ) ) + ), + array( + 'handle' => 'gform_gravityforms', + 'enqueue' => array( array( "admin_page" => array("form_settings") ) ) + ), + array("handle" => "google_charts", + "src" => "https://www.google.com/jsapi", + "version" => GFCommon::$version, + "enqueue" => array( + array("admin_page" => array("results")), + ) + ), + array("handle" => "gaddon_results_js", + "src" => GFAddOn::get_gfaddon_base_url() . "/js/gaddon_results.js", + "version" => GFCommon::$version, + "deps" => array('jquery', 'sack', 'jquery-ui-resizable', 'jquery-ui-datepicker' , 'google_charts'), + "callback" => array('GFResults', "localize_results_scripts"), + "enqueue" => array( + array("admin_page" => array("results")), + ) + ) + ); + } + + + + + + /** + * Target of admin_enqueue_scripts and gform_enqueue_scripts hooks. + * Not intended to be overridden by child classes. + * In order to enqueue scripts and styles, override the scripts() and styles() functions + * + * @ignore + */ + public function enqueue_scripts($form="", $is_ajax=false){ + + if(empty($form)) + $form = $this->get_current_form(); + + //Enqueueing scripts + $scripts = $this->scripts(); + foreach($scripts as $script){ + if($this->_can_enqueue_script($script["enqueue"], $form, $is_ajax)){ + $this->add_no_conflict_scripts(array($script["handle"])); + $src = isset($script["src"]) ? $script["src"] : false; + $deps = isset($script["deps"]) ? $script["deps"] : array(); + $version = isset($script["version"]) ? $script["version"] : false; + $in_footer = isset($script["in_footer"]) ? $script["in_footer"] : false; + + wp_enqueue_script($script["handle"],$src, $deps, $version, $in_footer); + + if(isset($script["strings"])) + wp_localize_script($script["handle"], $script["handle"]."_strings", $script["strings"]); + if(isset($script["callback"]) && is_callable($script["callback"])){ + $args = compact("form", "is_ajax"); + call_user_func_array($script["callback"], $args); + } + } + } + + //Enqueueing styles + $styles = $this->styles(); + foreach($styles as $style){ + if($this->_can_enqueue_script($style["enqueue"], $form, $is_ajax)){ + $this->add_no_conflict_styles(array($style["handle"])); + $src = isset($style["src"]) ? $style["src"] : false; + $deps = isset($style["deps"]) ? $style["deps"] : array(); + $version = isset($style["version"]) ? $style["version"] : false; + $media = isset($style["media"]) ? $style["media"] : "all"; + wp_register_style($style["handle"], $src, $deps, $version, $media); + if ($this->is_preview()) { + $this->_preview_styles[] = $style["handle"]; + } elseif ($this->is_print()) { + $this->_print_styles[] = $style["handle"]; + } else { + wp_enqueue_style($style["handle"]); + } + + } + } + } + + /** + * Target of gform_preview_styles. Enqueue styles to the preview page. + * Not intented to be overriden by child classes + * + * @ignore + */ + public function enqueue_preview_styles($preview_styles, $form) { + return array_merge($preview_styles, $this->_preview_styles); + } + + + /** + * Target of gform_print_styles. Enqueue styles to the print entry page. + * Not intented to be overriden by child classes + * + * @ignore + */ + public function enqueue_print_styles($print_styles, $form) { + if(false === $print_styles) + $print_styles = array(); + + $styles = $this->styles(); + foreach($styles as $style){ + if($this->_can_enqueue_script($style["enqueue"], $form, false)){ + $this->add_no_conflict_styles(array($style["handle"])); + $src = isset($style["src"]) ? $style["src"] : false; + $deps = isset($style["deps"]) ? $style["deps"] : array(); + $version = isset($style["version"]) ? $style["version"] : false; + $media = isset($style["media"]) ? $style["media"] : "all"; + wp_register_style($style["handle"], $src, $deps, $version, $media); + $print_styles[] = $style["handle"]; + } + } + + return array_merge($print_styles, $this->_print_styles); + } + + + /** + * Adds scripts to the list of white-listed no conflict scripts. + * + * @param $scripts + */ + private function add_no_conflict_scripts($scripts) { + $this->_no_conflict_scripts = array_merge($scripts, $this->_no_conflict_scripts); + + } + + /** + * Adds styles to the list of white-listed no conflict styles. + * + * @param $styles + */ + private function add_no_conflict_styles($styles) { + $this->_no_conflict_styles = array_merge($styles, $this->_no_conflict_styles); + } + + private function _can_enqueue_script($enqueue_conditions, $form, $is_ajax){ + if(empty($enqueue_conditions)) + return false; + + foreach($enqueue_conditions as $condition){ + if(is_callable($condition)){ + return call_user_func($condition, $form, $is_ajax); + } + else{ + $query_matches = isset($condition["query"]) ? $this->_request_condition_matches($_GET, $condition["query"]) : true; + $post_matches = isset($condition["post"]) ? $this->_request_condition_matches($_POST, $condition["query"]) : true; + $admin_page_matches = isset($condition["admin_page"]) ? $this->_page_condition_matches($condition["admin_page"], rgar($condition,"tab")) : true; + $field_type_matches = isset($condition["field_type"]) ? $this->_field_condition_matches($condition["field_type"], $form) : true; + + //Scripts will only be enqueued in any admin page if "admin_page", "query" or "post" variable is set. + //Scripts will only be enqueued in the front end if "admin_page" is not set. + $site_matches = ( isset($condition["admin_page"]) && is_admin() ) || ( !isset($condition["admin_page"]) && !is_admin() ) || ( isset($condition["query"]) || isset($condition["post"]) ) ; + + if($query_matches && $post_matches && $admin_page_matches && $field_type_matches && $site_matches){ + return true; + } + } + } + return false; + } + + private function _request_condition_matches($request, $query){ + parse_str($query, $query_array); + foreach($query_array as $key => $value){ + + switch ($value){ + case "_notempty_" : + if(rgempty($key, $request)) + return false; + break; + case "_empty_" : + if(!rgempty($key, $request)) + return false; + break; + default : + if (rgar($request, $key) != $value) + return false; + break; + } + + } + return true; + } + + private function _page_condition_matches($pages, $tab){ + if(!is_array($pages)) + $pages = array($pages); + + foreach($pages as $page){ + switch($page){ + case "form_editor" : + if($this->is_form_editor()) + return true; + + break; + + case "form_settings" : + if($this->is_form_settings($tab)) + return true; + + break; + + case "plugin_settings" : + if($this->is_plugin_settings($tab)) + return true; + + break; + + case "plugin_page" : + if($this->is_plugin_page()) + return true; + + break; + + case "entry_view" : + if($this->is_entry_view()) + return true; + + break; + + case "entry_detail" : + if($this->is_entry_edit()) + return true; + + break; + + case "results" : + if($this->is_results()) + return true; + + break; + + } + } + return false; + + } + + private function _field_condition_matches($field_types, $form){ + if(!is_array($field_types)) + $field_types = array($field_types); + + $fields = GFCommon::get_fields_by_type($form, $field_types); + if(count($fields) > 0) + return true; + + return false; + } + + /** + * Target for the gform_noconflict_scripts filter. Adds scripts to the list of white-listed no conflict scripts. + * + * Not intended to be overridden or called directed by Add-Ons. + * + * @ignore + * + * @param array $scripts Array of scripts to be white-listed + * @return array + */ + public function register_noconflict_scripts($scripts) { + //registering scripts with Gravity Forms so that they get enqueued when running in no-conflict mode + return array_merge($scripts, $this->_no_conflict_scripts); + } + + /** + * Target for the gform_noconflict_styles filter. Adds styles to the list of white-listed no conflict scripts. + * + * Not intended to be overridden or called directed by Add-Ons. + * + * @ignore + * + * @param array $styles Array of styles to be white-listed + * @return array + */ + public function register_noconflict_styles($styles) { + //registering styles with Gravity Forms so that they get enqueued when running in no-conflict mode + return array_merge($styles, $this->_no_conflict_styles); + } + + + + //-------------- Entry meta -------------------------------------- + + /** + * Override this method to activate and configure entry meta. + * + * + * @param array $entry_meta An array of entry meta already registered with the gform_entry_meta filter. + * @param int $form_id The form id + * + * @return array The filtered entry meta array. + */ + protected function get_entry_meta($entry_meta, $form_id) { + return $entry_meta; + } + + + //-------------- Results page -------------------------------------- + /** + * Returns the configuration for the results page. By default this is not activated. + * To activate the results page override this function and return an array with the configuration data. + * + * Example: + * public function get_results_page_config() { + * return array( + * "title" => "Quiz Results", + * "capabilities" => array("gravityforms_quiz_results"), + * "callbacks" => array( + * "fields" => array($this, "results_fields"), + * "calculation" => array($this, "results_calculation"), + * "markup" => array($this, "results_markup"), + * ) + * ); + * } + * + */ + public function get_results_page_config() { + return false; + } + + + /** + * Initializes the result page functionality. To activate result page functionality, override the get_results_page_config() function. + * + * @param $results_page_config - configuration returned by get_results_page_config() + */ + protected function results_page_init($results_page_config) { + require_once("class-gf-results.php"); + + if(isset($results_page_config["callbacks"]["filters"])) + add_filter("gform_filters_pre_results", $results_page_config["callbacks"]["filters"], 10, 2); + + $gf_results = new GFResults($this->_slug, $results_page_config); + $gf_results->init(); + } + + + //-------------- Members plugin integration -------------------------------------- + + /** + * Checks whether the Members plugin is installed and activated. + * + * Not intended to be overridden or called directly by Add-Ons. + * + * @ignore + * + * @return bool + */ + protected function has_members_plugin() { + return function_exists('members_get_capabilities'); + } + + /** + * Not intended to be overridden or called directly by Add-Ons. + * + * @ignore + * + * @param $caps + * @return array + */ + public function members_get_capabilities($caps) { + return array_merge($caps, $this->_capabilities); + } + + //-------------- Permissions: Capabilities and Roles ---------------------------- + + /** + * Checks whether the current user is assigned to a capability or role. + * + * @param string|array $caps An string or array of capabilities to check + * @return bool Returns true if the current user is assigned to any of the capabilities. + */ + protected function current_user_can_any($caps) { + return GFCommon::current_user_can_any($caps); + } + + + //------- Settings Helper Methods (Common to all settings pages) ------------------- + + /*** + * Renders the UI of all settings page based on the specified configuration array $sections + * + * @param array $sections - Configuration array containing all fields to be rendered grouped into sections + * @param array $settings - Current saved settings. Will be used to populate the inputs with their current values. Name/Value pair of input name and input value + */ + protected function render_settings( $sections ) { + + if( ! $this->has_setting_field_type( 'save', $sections ) ) + $sections = $this->add_default_save_button( $sections ); + + ?> + + +

    + + settings($sections); ?> + + + + setting_dependency_met( rgar( $section, 'dependency' ) ) ) + $this->single_section( $section, $is_first); + + $is_first = false; + } + } + + /*** + * Displays the UI for a field section + * + * @param array $section - The section to be displayed + * @param bool $is_first - true for the first section in the list, false for all others + */ + protected function single_section( $section, $is_first = false) { + ?> + +
    "> + + +

    + + + +

    + + + + + setting_dependency_met( rgar( $field, 'dependency' ) ) ) + continue; + + if ( is_callable( array( $this, "single_setting_row_{$field["type"]}") ) ) { + call_user_func( array( $this, "single_setting_row_{$field["type"]}" ), $field ); + } else { + $this->single_setting_row( $field ); + } + + } + ?> + +
    + +
    + + + + " > + + get_required_indicator( $field ); + + if( isset( $field['tooltip'] ) ) + echo ' ' . gform_tooltip( $field['tooltip'], rgar( $field, 'tooltip_class'), true ); + + ?> + + + single_setting( $field ); ?> + + + + + + + + single_setting( $field ); ?> + + + + _saved_settings = $settings; + } + + /*** + * Gets settings from $_POST variable, returning a name/value collection of setting name and setting value + */ + protected function get_posted_settings(){ + global $_gaddon_posted_settings; + + if(isset($_gaddon_posted_settings)) + return $_gaddon_posted_settings; + + $_gaddon_posted_settings = array(); + if(count($_POST) > 0){ + foreach($_POST as $key => $value){ + if(preg_match("|_gaddon_setting_(.*)|", $key, $matches)){ + $_gaddon_posted_settings[$matches[1]] = self::maybe_decode_json(stripslashes_deep($value)); + } + } + } + + return $_gaddon_posted_settings; + } + + protected static function maybe_decode_json($value) { + if (self::is_json($value)) + return json_decode($value, ARRAY_A); + + return $value; + } + + protected static function is_json($value) { + if (is_string($value) && substr($value, 0, 1) == '{' && is_array(json_decode($value, ARRAY_A))) + return true; + + return false; + } + + /*** + * Gets the "current" settings, which are settings from $_POST variables if this is a postback request, or the current saved settings for a get request. + */ + protected function get_current_settings(){ + //try getting settings from post + $settings = $this->get_posted_settings(); + + //if nothing has been posted, get current saved settings + if(empty($settings)){ + $settings = $this->_saved_settings; + } + + return $settings; + } + + /*** + * Retrieves the setting for a specific field/input + * + * @param string $setting_name: The field or input name + */ + protected function get_setting($setting_name, $default_value = "") { + + $settings = $this->get_current_settings(); + + if (false === $settings) + return $default_value; + + if (strpos($setting_name, "[") !== false) { + $path_parts = explode("[", $setting_name); + foreach ($path_parts as $part) { + $part = trim($part, "]"); + if (false === isset($settings[$part])) + return $default_value; + $settings = rgar($settings, $part); + } + $setting = $settings; + } else { + if (false === isset($settings[$setting_name])) + return $default_value; + $setting = $settings[$setting_name]; + } + + return $setting; + } + + /*** + * Determines if a dependent field has been populated. + * + * @param string $dependency - Field or input name of the "parent" field. + * @return bool - true if the "parent" field has been filled out and false if it has not. + * + */ + protected function setting_dependency_met( $dependency ) { + + //use a callback if one is specified in the configuration + if(is_callable($dependency)){ + return call_user_func($dependency); + } + + if(is_array($dependency)){ + //supports: "dependency" => array("field" => "myfield", "values" => array("val1", "val2")) + $dependency_field = $dependency["field"]; + $dependency_value = $dependency["values"]; + } + else{ + //supports: "dependency" => "myfield" + $dependency_field = $dependency; + $dependency_value = "_notempty_"; + } + + if(!is_array($dependency_value)) + $dependency_value = array($dependency_value); + + $current_value = $this->get_setting($dependency_field); + + foreach($dependency_value as $val){ + if($current_value == $val) + return true; + + if($val == "_notempty_" && !rgblank($current_value)) + return true; + } + + return false; + } + + protected function has_setting_field_type( $type, $fields ) { + + foreach( $fields as &$section ) { + foreach( $section['fields'] as $field ) { + if( rgar( $field, 'type' ) == $type ) + return true; + } + } + + return false; + } + + protected function add_default_save_button( $sections ) { + $sections[count($sections) - 1]['fields'][] = array( 'type' => 'save' ); + return $sections; + } + + + //------------- Field Types ------------------------------------------------------ + + /*** + * Renders and initializes a text field based on the $field array + * + * @param array $field - Field array containing the configuration options of this field + * @param bool $echo = true - true to echo the output to the screen, false to simply return the contents as a string + */ + protected function settings_text($field, $echo = true) { + $field["type"] = "text"; //making sure type is set to text + $attributes = $this->get_field_attributes($field); + $default_value = rgar( $field, 'value' ) ? rgar( $field, 'value' ) : rgar( $field, 'default_value' ); + $value = $this->get_setting($field["name"], $default_value); + + + $name = esc_attr($field["name"]); + $tooltip = isset( $choice['tooltip'] ) ? gform_tooltip( $choice['tooltip'], rgar( $choice, 'tooltip_class'), true ) : ""; + $html = ""; + + $html .= ''; + + $feedback_callback = rgar($field, 'feedback_callback'); + if(is_callable($feedback_callback)){ + $is_valid = call_user_func($feedback_callback, $value); + $icon = ""; + if($is_valid === true) + $icon = "tick.png"; + else if($is_valid === false) + $icon = "stop.png"; + + if(!empty($icon)) + $html .= "  "; + } + + if( $this->field_failed_validation( $field ) ) + $html .= $this->get_error_icon( $field ); + + if ($echo) + echo $html; + + return $html; + } + + /*** + * Renders and initializes a textarea field based on the $field array + * + * @param array $field - Field array containing the configuration options of this field + * @param bool $echo = true - true to echo the output to the screen, false to simply return the contents as a string + * @return string + */ + protected function settings_textarea($field, $echo = true) { + $field["type"] = "textarea"; //making sure type is set to textarea + $attributes = $this->get_field_attributes($field); + $default_value = rgar( $field, 'value' ) ? rgar( $field, 'value' ) : rgar( $field, 'default_value' ); + $value = $this->get_setting($field["name"], $default_value); + + $name = '' . esc_attr($field["name"]); + $tooltip = isset( $choice['tooltip'] ) ? gform_tooltip( $choice['tooltip'], rgar( $choice, 'tooltip_class'), true ) : ""; + $html = ""; + + $html .= ''; + + if ($echo) + echo $html; + + return $html; + } + + + /*** + * Renders and initializes a hidden field based on the $field array + * + * @param array $field - Field array containing the configuration options of this field + * @param bool $echo = true - true to echo the output to the screen, false to simply return the contents as a string + * @return string + */ + protected function settings_hidden($field, $echo = true) { + $field["type"] = "hidden"; //making sure type is set to hidden + $attributes = $this->get_field_attributes($field); + + $default_value = rgar( $field, 'value' ) ? rgar( $field, 'value' ) : rgar( $field, 'default_value' ); + $value = $this->get_setting($field["name"], $default_value); + + if ( is_array( $value ) ) + $value = json_encode($value); + + $html = ''; + + if ($echo) + echo $html; + + return $html; + } + + /*** + * Renders and initializes a checkbox field or a collection of checkbox fields based on the $field array + * + * @param array $field - Field array containing the configuration options of this field + * @param bool $echo = true - true to echo the output to the screen, false to simply return the contents as a string + * @return string + */ + protected function settings_checkbox( $field, $echo = true ) { + + $field["type"] = "checkbox"; //making sure type is set to checkbox + + $default_attributes = array("onclick" => 'jQuery(this).siblings("input[type=hidden]").val(jQuery(this).prop("checked") ? 1 : 0);'); + $field_attributes = $this->get_field_attributes($field, $default_attributes); + $horizontal = rgar($field, "horizontal") ? " gaddon-setting-inline" : ""; + + $html = ""; + + if(is_array($field["choices"])){ + foreach( $field["choices"] as $choice ) { + $choice['id'] = $choice['name']; + $choice_attributes = $this->get_choice_attributes($choice, $field_attributes); + $value = $this->get_setting($choice['name'], rgar($choice, "default_value")); + $tooltip = isset( $choice['tooltip'] ) ? gform_tooltip( $choice['tooltip'], rgar( $choice, 'tooltip_class'), true ) : ""; + $hidden_field_value = $value == '1' ? '1' : '0'; + $html .= ' +
    + + + +
    + '; + } + } + + if ($echo) + echo $html; + + return $html; + } + + /*** + * Renders and initializes a radio field or a collection of radio fields based on the $field array + * + * @param array $field - Field array containing the configuration options of this field + * @param bool $echo = true - true to echo the output to the screen, false to simply return the contents as a string + * @return string Returns the markup for the radio buttons + * + */ + protected function settings_radio($field, $echo = true) { + + $field["type"] = "radio"; //making sure type is set to radio + + $selected_value = $this->get_setting($field['name'], rgar($field, "default_value")); + $field_attributes = $this->get_field_attributes($field); + $horizontal = rgar($field, "horizontal") ? " gaddon-setting-inline" : ""; + $html = ""; + if (is_array($field["choices"])) { + foreach ($field["choices"] as $i => $choice) { + $choice['id'] = $field['name'] . $i; + $choice_attributes = $this->get_choice_attributes($choice, $field_attributes); + + $tooltip = isset( $choice['tooltip'] ) ? gform_tooltip( $choice['tooltip'], rgar( $choice, 'tooltip_class'), true ) : ""; + + $radio_value = isset($choice["value"]) ? $choice["value"] : $choice["label"]; + $checked = checked($selected_value, $radio_value, false); + $html .= ' +
    + + +
    + '; + } + } + + if ($echo) + echo $html; + + return $html; + } + + /*** + * Renders and initializes a drop down field based on the $field array + * + * @param array $field - Field array containing the configuration options of this field + * @param bool $echo = true - true to echo the output to the screen, false to simply return the contents as a string + * + * @return string + */ + protected function settings_select( $field, $echo = true ) { + + $field["type"] = "select"; //making sure type is set to select + $attributes = $this->get_field_attributes($field); + $value = $this->get_setting($field["name"], rgar($field, "default_value")); + $name = '' . esc_attr($field["name"]); + + $options = ""; + if(is_array($field["choices"])){ + foreach( $field["choices"] as $choice ) { + $options .= ''; + } + } + + $html = ''; + + if( $this->field_failed_validation( $field ) ) + $html .= $this->get_error_icon( $field ); + + if ($echo) + echo $html; + + return $html; + } + + protected function settings_save( $field, $echo = true ) { + + $field['type'] = 'submit'; + $field['name'] = 'gform-settings-save'; + $field['class'] = 'button-primary gfbutton'; + + if( ! rgar( $field, 'value' ) ) + $field['value'] = __( 'Save Settings', 'gravityforms' ); + + $attributes = $this->get_field_attributes( $field ); + + $html = ''; + + if ( $echo ) + echo $html; + + return $html; + } + + /** + * Helper to create a simple conditional logic set of fields. It creates one row of conditional logic with Field/Operator/Value inputs. + * + * @param mixed $setting_name_root - The root name to be used for inputs. It will be used as a prefix to the inputs that make up the conditional logic fields + */ + protected function simple_condition($setting_name_root){ + + $conditional_fields = $this->get_conditional_logic_fields(); + $create_condition_value_script = ""; + + $str = $this->settings_select(array( + "name" => "{$setting_name_root}_field_id", + "type" => "select", + "choices" => $conditional_fields, + "class" => "optin_select", + "onchange" => "jQuery('#" . esc_attr($setting_name_root) . "_container').html(GetRuleValues('gf_setting', 0, jQuery(this).val(), '', '_gaddon_setting_" . esc_attr($setting_name_root) . "_value'));" + ), false); + + $str .= $this->settings_select(array( + "name" => "{$setting_name_root}_operator", + "type" => "select", + "choices" => array( + array( + "value" => "is", + "label" => __("is", "gravityformsmailchimp") + ), + array( + "value" => "isnot", + "label" => __("is not", "gravityformsmailchimp") + ), + array( + "value" => ">", + "label" => __("greater than", "gravityformsmailchimp") + ), + array( + "value" => "<", + "label" => __("less than", "gravityformsmailchimp") + ), + array( + "value" => "contains", + "label" => __("contains", "gravityformsmailchimp") + ), + array( + "value" => "starts_with", + "label" => __("starts with", "gravityformsmailchimp") + ), + array( + "value" => "ends_with", + "label" => __("ends with", "gravityformsmailchimp") + ) + ) + ), false); + + $str .= ""; + + $field_id = $this->get_setting("{$setting_name_root}_field_id"); + + if(!empty($field_id)){ + $current_condition_value = $this->get_setting("{$setting_name_root}_value"); + $str .= ""; + } + return $str; + } + + /** + * Parses the properties of the $field meta array and returns a set of HTML attributes to be added to the HTML element. + * @param array $field - current field meta to be parsed. + * @param array $default - default set of properties. Will be appended to the properties specified in the $field array + * @return array - resulting HTML attributes ready to be included in the HTML element. + */ + protected function get_field_attributes($field, $default = array()){ + + // each nonstandard property will be extracted from the $props array so it is not auto-output in the field HTML + $no_output_props = apply_filters( 'gaddon_no_output_field_properties', + array( 'default_value', 'label', 'choices', 'feedback_callback', 'checked', 'checkbox_label', 'value', 'type', + 'validation_callback', 'required', 'hidden', 'tooltip' ), $field ); + + $default_props = array( + 'class' => '', // will default to gaddon-setting + 'default_value' => '' // default value that should be selected or entered for the field + ); + + // Property switch case + switch( $field['type'] ) { + case 'select': + $default_props['default_choice'] = array(); + $default_props['choices'] = array(); + break; + case 'checkbox': + $default_props['checked'] = false; + $default_props['checkbox_label'] = ''; + $default_props['choices'] = array(); + break; + case 'text': + default: + break; + } + + $props = wp_parse_args( $field, $default_props ); + $props['id'] = rgar( $props, 'name' ); + $props['class'] = trim("{$props['class']} gaddon-setting gaddon-{$props['type']}"); + + // extract no-output properties from $props array so they are not auto-output in the field HTML + foreach( $no_output_props as $prop ) { + if( isset( $props[$prop] ) ) { + ${$prop} = $props[$prop]; + unset( $props[$prop] ); + } + } + + //adding default attributes + foreach($default as $key=>$value){ + if(isset($props[$key])) + $props[$key] = $value . $props[$key]; + else + $props[$key] = $value; + } + + // get an array of property strings, example: name='myFieldName' + $prop_strings = array(); + foreach( $props as $prop => $value ) { + $prop_strings[$prop] = "{$prop}='" . esc_attr($value) . "'"; + } + + return $prop_strings; + } + + /** + * Parses the properties of the $choice meta array and returns a set of HTML attributes to be added to the HTML element. + * @param array $choice - current choice meta to be parsed. + * @param array $field_attributes - current field's attributes. + * @param array $default - default set of properties. Will be appended to the properties specified in the $field array + * @return array - resulting HTML attributes ready to be included in the HTML element. + */ + protected function get_choice_attributes($choice, $field_attributes){ + $choice_attributes = $field_attributes; + foreach( $choice as $prop => $val ) { + $no_output_choice_attributes = array( 'default_value', 'label', 'checked', 'value', 'type', + 'validation_callback', 'required', 'tooltip' ); + if(in_array($prop, $no_output_choice_attributes)) + unset($choice_attributes[$prop]); + else + $choice_attributes[$prop] = "{$prop}='" . esc_attr($val) . "'"; + } + return $choice_attributes; + } + + /** + * Validates settings fields. + * Validates that all fields are valid. Fields can be invalid when they are blank and marked as required or if it fails a custom validation check. + * To specify a custom validation, use the 'validation_callback' field meta property and implement the validation function with the custom logic. + * @param $fields - A list of all fields from the field meta configuration + * @param $settings - A list of submitted settings values + * @return bool - Returns true if all fields have passed validation, and false otherwise. + */ + protected function validate_settings( $fields, $settings ) { + + foreach( $fields as $section ) { + foreach( $section['fields'] as $field ) { + + $field_setting = rgar( $settings, rgar( $field, 'name' ) ); + + if( is_callable( rgar( $field, 'validation_callback' ) ) ) { + call_user_func( rgar( $field, 'validation_callback' ), $field, $field_setting ); + } else if( rgar( $field, 'required' ) ) { + if( rgblank( $field_setting ) ) + $this->set_field_error( $field, rgar( $field, 'error_message' ) ); + } + + } + } + + $field_errors = $this->get_field_errors(); + $is_valid = empty( $field_errors ); + + return $is_valid; + } + + /** + * Sets the validation error message + * Sets the error message to be displayed when a field fails validation. + * When implementing a custom validation callback function, use this function to specify the error message to be displayed. + * + * @param array $field - The current field meta + * @param string $error_message - The error message to be displayed + */ + protected function set_field_error( $field, $error_message = '' ) { + + // set default error message if none passed + if( !$error_message ) + $error_message = __( 'This field is required.', 'gravityforms' ); + + $this->_setting_field_errors[$field['name']] = $error_message; + } + + /** + * Gets the validation errors for a field. + * Returns validation errors associated with the specified field or a list of all validation messages (if a field isn't specified) + * @param array $field - The field meta. When specified, errors for this field will be returned + * @return mixed - If a field is specified, a string containing the error message will be returned. Otherwise, an array of all errors will be returned + */ + protected function get_field_errors( $field = false ) { + + if( !$field ) + return $this->_setting_field_errors; + + return isset( $this->_setting_field_errors[$field['name']] ) ? $this->_setting_field_errors[$field['name']] : array(); + } + + /** + * Gets the invalid field icon + * Returns the markup for an alert icon to indicate and highlight invalid fields. + * @param array $field - The field meta. + * @return string - The full markup for the icon + */ + protected function get_error_icon( $field ) { + + $error = $this->get_field_errors( $field ); + + return ' + '; + } + + /** + * Gets the required indicator + * Gets the markup of the required indicator symbol to highlight fields that are required + * @param $field - The field meta. + * @return string - Returns markup of the required indicator symbol + */ + protected function get_required_indicator( $field ) { + return '*'; + } + + /** + * Checks if the specified field failed validation + * + * @param $field - The field meta to be checked + * @return bool|mixed - Returns a validation error string if the field has failed validation. Otherwise returns false + */ + protected function field_failed_validation( $field ) { + $field_error = $this->get_field_errors( $field ); + return !empty( $field_error ) ? $field_error : false; + } + + //-------------- Form settings --------------------------------------------------- + + /** + * Initializes form settings page + * Hooks up the required scripts and actions for the Form Settings page + */ + protected function form_settings_init() { + $view = rgget("view"); + $subview = rgget("subview"); + add_action('gform_form_settings_menu', array($this, 'add_form_settings_menu'), 10, 2); + if (rgget("page") == "gf_edit_forms" && $view == "settings" && $subview == $this->_slug && $this->current_user_can_any($this->_capabilities_form_settings)) { + require_once(GFCommon::get_base_path() . "/tooltips.php"); + add_action("gform_form_settings_page_" . $this->_slug, array($this, 'form_settings_page')); + } + } + + /** + * Initializes plugin settings page + * Hooks up the required scripts and actions for the Plugin Settings page + */ + protected function plugin_page_init(){ + + if($this->current_user_can_any($this->_capabilities_plugin_page)){ + //creates the subnav left menu + add_filter("gform_addon_navigation", array($this, 'create_plugin_page_menu')); + } + + } + + /** + * Creates plugin page menu item + * Target of gform_addon_navigation filter. Creates a menu item in the left nav, linking to the plugin page + * + * @param $menus - Current list of menu items + * @return array - Returns a new list of menu items + */ + public function create_plugin_page_menu($menus){ + + $menus[] = array("name" => $this->_slug, "label" => $this->get_short_title(), "callback" => array($this, "plugin_page"), "permission" => $this->_capabilities_plugin_page); + + return $menus; + } + + + + /** + * Renders the form settings page. + * + * Not intended to be overridden or called directly by Add-Ons. + * Sets up the form settings page. + * + * @ignore + */ + public function form_settings_page() { + + GFFormSettings::page_header($this->_title); + ?> +
    + +
    + + get_current_form(); + + $form_id = $form["id"]; + $form = apply_filters("gform_admin_pre_render_{$form_id}", apply_filters("gform_admin_pre_render", $form)); + + if($this->method_is_overridden('form_settings')){ + + //enables plugins to override settings page by implementing a form_settings() function + $this->form_settings($form); + } else { + //saves form settings if save button was pressed + $this->maybe_save_form_settings($form); + + //reads current form settings + $settings = $this->get_form_settings($form); + $this->set_settings( $settings ); + + //reading addon fields + $sections = $this->form_settings_fields(); + + //rendering settings based on fields and current settings + $this->render_settings( $sections ); + } + ?> + +
    + +
    + is_save_postback()){ + $settings = $this->get_posted_settings(); + $this->save_form_settings($form, $settings); + } + } + + /*** + * Saves form settings to form object + * + * @param array $form + * @param array $settings + */ + public function save_form_settings($form, $settings){ + $form[$this->_slug] = $settings; + GFFormsModel::update_form_meta($form["id"], $form); + } + + /** + * Checks whether the current Add-On has a form settings page. + * + * @return bool + */ + private function has_form_settings_page() { + return $this->method_is_overridden('form_settings_fields') || $this->method_is_overridden('form_settings'); + } + + /** + * Custom form settings page + * Override this function to implement a complete custom form settings page. + * Before overriding this function, consider using the form_settings_fields() and specifying your field meta. + */ + protected function form_settings($form){} + + /** + * Checks whether the current Add-On has a plugin page. + * + * @return bool + */ + private function has_plugin_page() { + return $this->method_is_overridden('plugin_page'); + } + + /** + * Override this function to create a custom plugin page + */ + protected function plugin_page(){ + } + + /** + * Returns the form settings for the Add-On + * + * @param $form + * @return string + */ + protected function get_form_settings($form) { + return rgar( $form, $this->_slug ); + } + + /** + * Add the form settings tab. + * + * Override this function to add the tab conditionally. + * + * + * @param $tabs + * @param $form_id + * @return array + */ + public function add_form_settings_menu($tabs, $form_id) { + + $tabs[] = array("name" => $this->_slug, "label" => $this->get_short_title(), "query" => array("fid" => null)); + + return $tabs; + } + + /*** + * Override this function to specify the settings fields to be rendered on the form settings page + */ + protected function form_settings_fields(){ + // should return an array of sections, each section contains a title, description and an array of fields + return array(); + } + + //-------------- Plugin Settings --------------------------------------------------- + + protected function plugin_settings_init() { + $subview = rgget("subview"); + RGForms::add_settings_page( array( + 'name' => $this->get_short_title(), + 'tab_label' => $this->get_short_title(), + 'handler' => array($this, 'plugin_settings_page') + ) ); + if (rgget("page") == "gf_settings" && $subview == $this->get_short_title() && $this->current_user_can_any($this->_capabilities_settings_page)) { + require_once(GFCommon::get_base_path() . "/tooltips.php"); + } + } + + /*** + * Plugin settings page + */ + public function plugin_settings_page() { + + if($this->method_is_overridden('plugin_settings')){ + //enables plugins to override settings page by implementing a plugin_settings() function + $this->plugin_settings(); + } + else if($this->maybe_uninstall()){ + ?> +
    + _title, "", ""), "gravityforms")?> +
    + maybe_save_plugin_settings(); + + //reads main addon settings + $settings = $this->get_plugin_settings(); + $this->set_settings( $settings ); + + //reading addon fields + $sections = $this->plugin_settings_fields(); + + //rendering settings based on fields and current settings + $this->render_settings( $sections, $settings); + + //renders uninstall section + $this->render_uninstall(); + + } + + } + + /** + * Override this function to add a custom settings page. + */ + protected function plugin_settings(){ + } + + + /** + * Checks whether the current Add-On has a settings page. + * + * @return bool + */ + public function has_plugin_settings_page() { + return $this->method_is_overridden('plugin_settings_fields') || $this->method_is_overridden('plugin_settings'); + } + + /*** + * Returns the currently saved plugin settings + * + */ + protected function get_plugin_settings() { + $settings = get_option("gravityformsaddon_" . $this->_slug . "_settings"); + return $settings; + } + + /** + * Updates plugin settings with the provided settings + * + * @param array $settings - Plugin settings to be saved + */ + protected function update_plugin_settings($settings){ + update_option("gravityformsaddon_" . $this->_slug . "_settings", $settings); + } + + /*** + * Saves teh plugin settings if the submit button was pressed + * + */ + protected function maybe_save_plugin_settings(){ + if($this->is_save_postback()){ + $settings = $this->get_posted_settings(); + $this->update_plugin_settings($settings); + } + } + + /*** + * Override this function to specify the settings fields to be rendered on the plugin settings page + */ + public function plugin_settings_fields(){ + // should return an array of sections, each section contains a title, description and an array of fields + return array(); + } + + protected function settings_fields_only($settings_type = 'plugin') { + + $fields = array(); + + if (!is_callable(array($this, "{$settings_type}_settings_fields"))) + return $fields; + + $sections = call_user_func(array($this, "{$settings_type}_settings_fields")); + + foreach ($sections as $section) { + foreach ($section['fields'] as $field) { + $fields[] = $field; + } + } + + return $fields; + } + + //-------------- Uninstall --------------- + + public function render_uninstall(){ + + ?> +
    + + current_user_can_any($this->_capabilities_uninstall)) { ?> +
    + +

    +
    + '; + echo $uninstall_button; + ?> +
    + +
    + uninstall_addon(); + } + + return false; + } + + /** + * Removes all settings and deactivates the Add-On. + * + * Not intended to be overridden or called directly by Add-Ons. + * + * @ignore + */ + public function uninstall_addon() { + + if (!$this->current_user_can_any($this->_capabilities_uninstall)) + die(__("You don't have adequate permission to uninstall this addon: " . $this->_title, "gravityforms")); + + $continue = $this->uninstall(); + if (false === $continue) + return false; + + global $wpdb; + $lead_meta_table = GFFormsModel::get_lead_meta_table_name(); + + $forms = GFFormsModel::get_forms(); + $all_form_ids = array(); + + // remove entry meta + foreach ($forms as $form) { + $all_form_ids[] = $form->id; + $entry_meta = $this->get_entry_meta(array(), $form->id); + if(is_array($entry_meta)){ + foreach(array_keys($entry_meta) as $meta_key){ + $sql = $wpdb->prepare("DELETE from $lead_meta_table WHERE meta_key=%s", $meta_key); + $wpdb->query($sql); + } + } + } + + //remove form settings + $form_metas = GFFormsModel::get_form_meta_by_id($all_form_ids); + require_once(GFCommon::get_base_path() . '/form_detail.php'); + foreach ($form_metas as $form_meta) { + if (isset($form_meta[$this->_slug])) { + unset($form_meta[$this->_slug]); + $form_json = json_encode($form_meta); + GFFormDetail::save_form_info($form_meta["id"], addslashes($form_json)); + } + } + + //removing options + delete_option("gravityformsaddon_" . $this->_slug . "_settings"); + delete_option("gravityformsaddon_" . $this->_slug . "_version"); + + + //Deactivating plugin + deactivate_plugins($this->_path); + update_option('recently_activated', array($this->_path => time()) + (array)get_option('recently_activated')); + + return true; + + } + + /** + * Called when the user chooses to uninstall the Add-On - after permissions have been checked and before removing + * all Add-On settings and Form settings. + * + * Override this method to perform additional functions such as dropping database tables. + * + * + * Return false to cancel the uninstall request. + */ + public function uninstall() { + return true; + } + + //-------------- Enforce minimum GF version --------------------------------------------------- + + /** + * Target for the after_plugin_row action hook. Checks whether the current version of Gravity Forms + * is supported and outputs a message just below the plugin info on the plugins page. + * + * Not intended to be overridden or called directly by Add-Ons. + * + * @ignore + */ + public function plugin_row() { + if (!self::is_gravityforms_supported($this->_min_gravityforms_version)) { + $message = $this->plugin_message(); + self::display_plugin_message($message, true); + } + } + + /** + * Returns the message that will be displayed if the current version of Gravity Forms is not supported. + * + * Override this method to display a custom message. + */ + public function plugin_message() { + $message = sprintf(__("Gravity Forms " . $this->_min_gravityforms_version . " is required. Activate it now or %spurchase it today!%s", "gravityformsaddon"), "", ""); + + return $message; + } + + /** + * Formats and outs a message for the plugin row. + * + * Not intended to be overridden or called directly by Add-Ons. + * + * @ignore + * + * @param $message + * @param bool $is_error + */ + public static function display_plugin_message($message, $is_error = false) { + $style = $is_error ? 'style="background-color: #ffebe8;"' : ""; + echo '
    ' . $message . '
    '; + } + + //--------------- Logging ------------------------------------------------------------- + + public function log_error($message){ + if (class_exists("GFLogging")) { + GFLogging::include_logger(); + GFLogging::log_message($this->_slug, $message, KLogger::ERROR); + } + } + + public function log_debug($message){ + if (class_exists("GFLogging")) { + GFLogging::include_logger(); + GFLogging::log_message($this->_slug, $message, KLogger::DEBUG); + } + } + + //-------------- Helper functions --------------------------------------------------- + + private function method_is_overridden($method_name){ + $reflector = new ReflectionMethod($this, $method_name); + return $reflector->getDeclaringClass()->getName() !== 'GFAddOn'; + } + + /** + * Returns the url of the root folder of the current Add-On. + * + * @param string $full_path Optional. The full path the the plugin file. + * @return string + */ + protected function get_base_url($full_path = "") { + if (empty($full_path)) + $full_path = $this->_full_path; + + return plugins_url(null, $full_path); + } + + /** + * Returns the url of the Add-On Framework root folder. + * + * @return string + */ + final public static function get_gfaddon_base_url() { + return plugins_url(null, __FILE__); + } + + /** + * Returns the physical path of the Add-On Framework root folder. + * + * @return string + */ + final public static function get_gfaddon_base_path() { + return self::_get_base_path(); + } + + /** + * Returns the physical path of the plugins root folder. + * + * @param string $full_path + * @return string + */ + protected function get_base_path($full_path = "") { + if (empty($full_path)) + $full_path = $this->_full_path; + $folder = basename(dirname($full_path)); + + return WP_PLUGIN_DIR . "/" . $folder; + } + + /** + * Returns the physical path of the Add-On Framework root folder + * + * @return string + */ + private static function _get_base_path() { + $folder = basename(dirname(__FILE__)); + + return GFCommon::get_base_path() . "/includes/" . $folder; + } + + /** + * Returns the URL of the Add-On Framework root folder + * + * @return string + */ + private static function _get_base_url() { + $folder = basename(dirname(__FILE__)); + + return GFCommon::get_base_url() . "/includes/" . $folder; + } + + /** + * Checks whether the Gravity Forms is installed. + * + * @return bool + */ + public function is_gravityforms_installed() { + return class_exists("GFForms"); + } + + public function table_exists($table_name){ + global $wpdb; + + $count = $wpdb->get_var("SHOW TABLES LIKE '{$table_name}'"); + return !empty($count); + } + + /** + * Checks whether the current version of Gravity Forms is supported + * + * @param $min_gravityforms_version + * @return bool|mixed + */ + public function is_gravityforms_supported($min_gravityforms_version = "") { + if(isset($this->_min_gravityforms_version) && empty($min_gravityforms_version)) + $min_gravityforms_version = $this->_min_gravityforms_version; + + if(empty($min_gravityforms_version)) + return true; + + if (class_exists("GFCommon")) { + $is_correct_version = version_compare(GFCommon::$version, $min_gravityforms_version, ">="); + + return $is_correct_version; + } else { + return false; + } + } + + /** + * Returns this plugin's short title. Used to display the plugin title in small areas such as tabs + */ + protected function get_short_title() { + return isset( $this->_short_title ) ? $this->_short_title : $this->_title; + } + + /** + * Returns the URL for the plugin settings tab associated with this plugin + * + */ + protected function get_plugin_settings_url() { + return add_query_arg( array( 'page' => 'gf_settings', 'subview' => $this->_short_title ), admin_url('admin.php') ); + } + + /** + * When called from a page that supports it (i.e. entry detail, form editor and form settings), + * returns the current form object. Otherwise returns false + */ + protected function get_current_form(){ + if( $this->is_entry_edit() || + $this->is_entry_view() || + $this->is_form_editor() || + $this->is_form_settings() ) + { + return rgempty("id", $_GET) ? false : GFFormsModel::get_form_meta(rgget('id')); + } + + return false; + } + + /** + * Returns TRUE if the current request is a postback, otherwise returns FALSE + */ + protected function is_postback(){ + return is_array($_POST) && count($_POST) > 0; + } + + /** + * Returns TRUE if the settings "Save" button was pressed + */ + protected function is_save_postback(){ + return !rgempty("gform-settings-save"); + } + + /** + * Returns TRUE if the current page is the form editor page. Otherwise, returns FALSE + */ + protected function is_form_editor(){ + + if(rgget("page") == "gf_edit_forms" && !rgempty("id", $_GET) && rgempty("view", $_GET)) + return true; + + return false; + } + + /** + * Returns TRUE if the current page is the form settings page, or a specific form settings tab (specified by the $tab parameter). Otherwise returns FALSE + * + * @param string $tab - Specifies a specific form setting page/tab + */ + protected function is_form_settings($tab = null){ + + $is_form_settings = rgget("page") == "gf_edit_forms" && rgget("view") == "settings"; + $is_tab = $this->_tab_matches($tab); + + if($is_form_settings && $is_tab){ + return true; + } + else{ + return false; + } + } + + private function _tab_matches($tabs){ + if($tabs == null) + return true; + + if(!is_array($tabs)) + $tabs = array($tabs); + + $current_tab = rgempty("subview", $_GET) ? "settings" : rgget("subview"); + + foreach($tabs as $tab){ + if(strtolower($tab) == strtolower($current_tab)) + return true; + } + } + + /** + * Returns TRUE if the current page is the plugin settings main page, or a specific plugin settings tab (specified by the $tab parameter). Otherwise returns FALSE + * + * @param string $tab - Specifies a specific plugin setting page/tab. + */ + protected function is_plugin_settings($tab = ""){ + + $is_plugin_settings = rgget("page") == "gf_settings"; + $is_tab = $this->_tab_matches($tab); + + if($is_plugin_settings && $is_tab){ + return true; + } + else{ + return false; + } + } + + /** + * Returns TRUE if the current page is the plugin page. Otherwise returns FALSE + * + */ + protected function is_plugin_page(){ + + return strtolower(rgget("page")) == strtolower($this->_slug); + } + + /** + * Returns TRUE if the current page is the entry view page. Otherwise, returns FALSE + */ + protected function is_entry_view(){ + if(rgget("page") == "gf_entries" && rgget("view") == "entry" && (!isset($_POST["screen_mode"]) || rgpost("screen_mode") == "view")) + return true; + + return false; + } + + /** + * Returns TRUE if the current page is the entry edit page. Otherwise, returns FALSE + */ + protected function is_entry_edit(){ + if(rgget("page") == "gf_entries" && rgget("view") == "entry" && rgpost("screen_mode") == "edit") + return true; + + return false; + } + + /** + * Returns TRUE if the current page is the results page. Otherwise, returns FALSE + */ + protected function is_results(){ + if(rgget("page") == "gf_entries" && rgget("view") == "gf_results_" . $this->_slug) + return true; + + return false; + } + + /** + * Returns TRUE if the current page is the print page. Otherwise, returns FALSE + */ + protected function is_print(){ + if(rgget("gf_page") == "print-entry") + return true; + + return false; + } + + /** + * Returns TRUE if the current page is the preview page. Otherwise, returns FALSE + */ + protected function is_preview(){ + if(rgget("gf_page") == "preview") + return true; + + return false; + } + +} diff --git a/includes/addon/class-gf-auto-upgrade.php b/includes/addon/class-gf-auto-upgrade.php new file mode 100644 index 0000000..d4e4c6a --- /dev/null +++ b/includes/addon/class-gf-auto-upgrade.php @@ -0,0 +1,215 @@ +_slug = $slug; + $this->_version = $version; + $this->_min_gravityforms_version = $min_gravityforms_version; + $this->_title = $title; + $this->_full_path = $full_path; + $this->_path = $path; + $this->_url = $url; + $this->_is_gravityforms_supported = $is_gravityforms_supported; + add_action('init', array($this, 'init')); + } + + public function init(){ + if (is_admin()) { + load_plugin_textdomain($this->_slug, FALSE, $this->_slug . '/languages'); + + add_filter('transient_update_plugins', array($this, 'check_update')); + add_filter('site_transient_update_plugins', array($this, 'check_update')); + add_action('install_plugins_pre_plugin-information', array($this, 'display_changelog')); + add_action('gform_after_check_update', array($this, 'flush_version_info')); + + if (RG_CURRENT_PAGE == "plugins.php") + add_action('after_plugin_row_' . $this->_path, array($this, 'rg_plugin_row')); + + } + + // ManageWP premium update filters + add_filter('mwp_premium_update_notification', array($this, 'premium_update_push')); + add_filter('mwp_premium_perform_update', array($this, 'premium_update')); + } + + public function rg_plugin_row() { + + if (!$this->_is_gravityforms_supported) { + $message = sprintf(__("Gravity Forms " . $this->_min_gravityforms_version . " is required. Activate it now or %spurchase it today!%s", "gravityformsaddon"), "", ""); + GFAddOn::display_plugin_message($message, true); + } else { + $version_info = $this->get_version_info($this->_slug, $this->get_key(), $this->_version); + + if (!$version_info["is_valid_key"]) { + $title = $this->_title; + $new_version = version_compare($this->_version, $version_info["version"], '<') ? __("There is a new version of {$title} available.", 'gravityformsaddon') . " " . sprintf(__('View version %s Details', 'gravityformsaddon'), $version_info["version"]) . '. ' : ''; + $message = $new_version . sprintf(__('%sRegister%s your copy of Gravity Forms to receive access to automatic upgrades and support. Need a license key? %sPurchase one now%s.', 'gravityformscontacts'), '', '', '', '') . ''; + GFAddOn::display_plugin_message($message); + } + } + } + + //Integration with ManageWP + public function premium_update_push($premium_update) { + + if (!function_exists('get_plugin_data')) + include_once(ABSPATH . 'wp-admin/includes/plugin.php'); + + $update = GFCommon::get_version_info(); + if ($update["is_valid_key"] == true && version_compare($this->_version, $update["version"], '<')) { + $plugin_data = get_plugin_data($this->_full_path); + $plugin_data['type'] = 'plugin'; + $plugin_data['slug'] = $this->_path; + $plugin_data['new_version'] = isset($update['version']) ? $update['version'] : false; + $premium_update[] = $plugin_data; + } + + return $premium_update; + } + + //Integration with ManageWP + public function premium_update($premium_update) { + + if (!function_exists('get_plugin_data')) + include_once(ABSPATH . 'wp-admin/includes/plugin.php'); + + $update = GFCommon::get_version_info(); + if ($update["is_valid_key"] == true && version_compare($this->_version, $update["version"], '<')) { + $plugin_data = get_plugin_data($this->_full_path); + $plugin_data['slug'] = $this->_path; + $plugin_data['type'] = 'plugin'; + $plugin_data['url'] = isset($update["url"]) ? $update["url"] : false; // OR provide your own callback function for managing the update + + array_push($premium_update, $plugin_data); + } + + return $premium_update; + } + + public function flush_version_info() { + $this->set_version_info($this->_slug, false); + } + + private function set_version_info($plugin_slug, $version_info){ + if ( function_exists('set_site_transient') ) + set_site_transient($plugin_slug . "_version", $version_info, 60*60*12); + else + set_transient($plugin_slug . "_version", $version_info, 60*60*12); + } + + public function check_update($option){ + + $key = $this->get_key(); + + $version_info = $this->get_version_info($this->_slug, $key, $this->_version, true); + + if ($version_info == -1) + return $option; + + if(empty($option->response[$this->_path])) + $option->response[$this->_path] = new stdClass(); + + //Empty response means that the key is invalid. Do not queue for upgrade + if(!$version_info["is_valid_key"] || version_compare($this->_version, $version_info["version"], '>=')){ + unset($option->response[$this->_path]); + } + else{ + $option->response[$this->_path]->url = $this->_url; + $option->response[$this->_path]->slug = $this->_slug; + $option->response[$this->_path]->package = str_replace("{KEY}", $key, $version_info["url"]); + $option->response[$this->_path]->new_version = $version_info["version"]; + $option->response[$this->_path]->id = "0"; + } + + return $option; + + } + + private function display_upgrade_message($plugin_name, $plugin_title, $version, $message, $localization_namespace){ + $upgrade_message = $message .' '. sprintf(__('View version %s Details', $localization_namespace), $version) . '. '; + GFAddOn::display_plugin_message($upgrade_message); + } + + // Displays current version details on plugins page + public function display_changelog(){ + if ($_REQUEST["plugin"] != $this->_slug) + return; + $key = $this->get_key(); + $body = "key=$key"; + $options = array('method' => 'POST', 'timeout' => 3, 'body' => $body); + $options['headers'] = array( + 'Content-Type' => 'application/x-www-form-urlencoded; charset=' . get_option('blog_charset'), + 'Content-Length' => strlen($body), + 'User-Agent' => 'WordPress/' . get_bloginfo("version"), + 'Referer' => get_bloginfo("url") + ); + + $raw_response = wp_remote_request(GRAVITY_MANAGER_URL . "/changelog.php?" . $this->get_remote_request_params($this->_slug, $key, $this->_version), $options); + + if ( is_wp_error( $raw_response ) || 200 != $raw_response['response']['code']){ + $page_text = sprintf(__("Oops!! Something went wrong.%sPlease try again or %scontact us%s.", 'gravityformsaddon'), "
    ", "", ""); + } + else{ + $page_text = $raw_response['body']; + if(substr($page_text, 0, 10) != "") + $page_text = ""; + } + echo stripslashes($page_text); + + exit; + } + + private function get_version_info($offering, $key, $version, $use_cache=true){ + + $version_info = function_exists('get_site_transient') ? get_site_transient($this->_slug . "_version") : get_transient($this->_slug . "_version"); + if(!$version_info || !$use_cache){ + + $body = "key=$key"; + $options = array('method' => 'POST', 'timeout' => 3, 'body' => $body); + $options['headers'] = array( + 'Content-Type' => 'application/x-www-form-urlencoded; charset=' . get_option('blog_charset'), + 'Content-Length' => strlen($body), + 'User-Agent' => 'WordPress/' . get_bloginfo("version"), + 'Referer' => get_bloginfo("url") + ); + $url = GRAVITY_MANAGER_URL . "/version.php?" . $this->get_remote_request_params($offering, $key, $version); + $raw_response = wp_remote_request($url, $options); + + if ( is_wp_error( $raw_response ) || 200 != $raw_response['response']['code']) + $version_info = -1; + else + { + $ary = explode("||", $raw_response['body']); + $version_info = array("is_valid_key" => $ary[0], "version" => $ary[1], "url" => $ary[2]); + } + + $this->set_version_info($this->_slug, $version_info); + + } + + return $version_info; + } + + private function get_remote_request_params($offering, $key, $version){ + global $wpdb; + return sprintf("of=%s&key=%s&v=%s&wp=%s&php=%s&mysql=%s", urlencode($offering), urlencode($key), urlencode($version), urlencode(get_bloginfo("version")), urlencode(phpversion()), urlencode($wpdb->db_version())); + } + + private function get_key() { + if ($this->_is_gravityforms_supported) + return GFCommon::get_key(); + else + return ""; + } + + +} diff --git a/includes/addon/class-gf-feed-addon.php b/includes/addon/class-gf-feed-addon.php new file mode 100644 index 0000000..76eb7d7 --- /dev/null +++ b/includes/addon/class-gf-feed-addon.php @@ -0,0 +1,918 @@ +_feed_version) + $this->upgrade_base($installed_version); + + update_option("gravityformsaddon_feed-base_version", $this->_feed_version); + } + + private function upgrade_base($previous_version) { + global $wpdb; + + require_once(ABSPATH . '/wp-admin/includes/upgrade.php'); + if ( ! empty($wpdb->charset) ) + $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset"; + if ( ! empty($wpdb->collate) ) + $charset_collate .= " COLLATE $wpdb->collate"; + + $sql = "CREATE TABLE {$wpdb->prefix}gf_addon_feed ( + id mediumint(8) unsigned not null auto_increment, + form_id mediumint(8) unsigned not null, + is_active tinyint(1) not null default 1, + meta longtext, + addon_slug varchar(50), + PRIMARY KEY (id), + KEY addon_form (addon_slug,form_id) + ) $charset_collate;"; + + //Fixes issue with dbDelta lower-casing table names, which cause problems on case sensitive DB servers. + add_filter( 'dbdelta_create_queries', array("RGForms", "dbdelta_fix_case")); + + dbDelta($sql); + + remove_filter('dbdelta_create_queries', array("RGForms", "dbdelta_fix_case")); + } + + public function scripts() { + + $scripts = array( + array( + 'handle' => 'gform_form_admin', + 'enqueue' => array( array( "admin_page" => array("form_settings") ) ) + ), + array( + 'handle' => 'gform_gravityforms', + 'enqueue' => array( array( "admin_page" => array("form_settings") ) ) + ), + array( + 'handle' => 'gform_forms', + 'enqueue' => array( array( "admin_page" => array("form_settings") ) ) + ), + array( + 'handle' => 'json2', + 'enqueue' => array( array( "admin_page" => array("form_settings") ) ) + ), + array( + 'handle' => 'gform_placeholder', + 'enqueue' => array( + array( + "admin_page" => array("form_settings"), + "field_types" => array("feed_condition") + ) + ) + ) + ); + + return array_merge( parent::scripts(), $scripts ); + } + + public function uninstall(){ + global $wpdb; + $sql = $wpdb->prepare( "DELETE FROM {$wpdb->prefix}gf_addon_feed WHERE addon_slug=%s", $this->_slug); + $wpdb->query($sql); + + } + + //-------- Front-end methods --------------------------- + + public function maybe_process_feed( $entry, $form, $is_delayed = false ) { + + // getting all active feeds + $feeds = $this->get_feeds( $form['id'] ); + + $paypal_feed = $this->get_paypal_feed( $form['id'], $entry ); + if( $paypal_feed && rgar( $paypal_feed['meta'], "delay_{$this->_slug}" ) && $is_delayed ) { + self::log_debug( "Feed processing delayed pending PayPal payment received for entry {$entry['id']}" ); + return; + } + + foreach ( $feeds as $feed ) { + if ( $this->is_feed_condition_met( $feed, $form, $entry ) ) { + $this->process_feed( $feed, $entry, $form ); + } else { + self::log_debug( "Opt-in condition not met; not fulfilling entry {$entry["id"]} to list" ); + } + } + + } + + public function process_feed( $feed, $entry, $form ) { + + return; + } + + public function is_feed_condition_met( $feed, $form, $entry ) { + + $feed_meta = $feed['meta']; + $is_condition_enabled = rgar( $feed_meta, 'feed_condition_conditional_logic' ) == true; + $logic = rgars( $feed_meta, 'feed_condition_conditional_logic_object/conditionalLogic' ); + + if( !$is_condition_enabled || empty( $logic ) ) + return true; + + return GFCommon::evaluate_conditional_logic( $logic, $form, $entry ); + } + + public function get_paypal_feed( $form_id, $entry ) { + + if( !class_exists( 'GFPayPal' ) ) + return false; + + if( method_exists( 'GFPayPal', 'get_config_by_entry' ) ) { + $feed = GFPayPal::get_config_by_entry( $entry ); + } else { + $feed = GFPayPal::get_config( $form_id ); + } + + return $feed; + } + + + //-------- Feed data methods ------------------------- + + public function get_feeds($form_id = null){ + global $wpdb; + + $form_filter = is_numeric($form_id) ? $wpdb->prepare("AND form_id=%d", absint($form_id)) : ""; + + $sql = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}gf_addon_feed + WHERE addon_slug=%s {$form_filter}", $this->_slug); + + $results = $wpdb->get_results($sql, ARRAY_A); + foreach($results as &$result){ + $result["meta"] = json_decode($result["meta"], true); + } + return $results; + } + + public function get_current_feed(){ + $feed_id = $this->get_current_feed_id(); + return empty($feed_id) ? false : $this->get_feed( $feed_id ); + } + + public function get_current_feed_id(){ + $settings = $this->get_posted_settings(); + return rgempty('gf_feed_id') ? rgget("fid") : rgpost('gf_feed_id'); + } + + public function get_feed( $id ) { + global $wpdb; + + $sql = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}gf_addon_feed WHERE id=%d", $id); + + $row = $wpdb->get_row($sql, ARRAY_A); + $row["meta"] = json_decode($row["meta"], true); + + return $row; + } + + public function update_feed_meta($id, $meta){ + global $wpdb; + + $meta = json_encode($meta); + $wpdb->update("{$wpdb->prefix}gf_addon_feed", array( 'meta' => $meta ), array( 'id' => $id ), array('%s'), array('%d') ); + + return $wpdb->rows_affected > 0; + } + + public function update_feed_active($id, $is_active){ + global $wpdb; + $is_active = $is_active ? "1" : "0"; + + $wpdb->update("{$wpdb->prefix}gf_addon_feed", array('is_active'=>$is_active), array("id" => $id), array('%d'), array('%d')); + + return $wpdb->rows_affected > 0; + } + + public function insert_feed($form_id, $is_active, $meta){ + global $wpdb; + + $meta = json_encode($meta); + $wpdb->insert("{$wpdb->prefix}gf_addon_feed", array("addon_slug" => $this->_slug, "form_id"=> $form_id, "is_active"=>$is_active, 'meta'=>$meta), array('%s', '%d', '%d', '%s')); + + return $wpdb->insert_id; + } + + public function delete_feed($id){ + global $wpdb; + + $wpdb->delete("{$wpdb->prefix}gf_addon_feed", array("id" => $id), array('%d')); + } + + public function delete_feeds($form_id = null){ + global $wpdb; + + $where = is_numeric($form_id) ? array("addon_slug" => $this->_slug, "form_id" => $form_id) : array("addon_slug" => $this->_slug); + $format = is_numeric($form_id) ? array('%s','%d') : array('%s'); + + $wpdb->delete("{$wpdb->prefix}gf_addon_feed", $where, $format); + } + + + //---------- Form Settings Pages -------------------------- + + public function form_settings_init(){ + parent::form_settings_init(); + + if (RG_CURRENT_PAGE == "admin-ajax.php") { + add_action("wp_ajax_gf_feed_is_active_{$this->_slug}", array($this, 'ajax_toggle_is_active')); + } + } + + public function ajax_toggle_is_active(){ + $feed_id = rgpost("feed_id"); + $is_active = rgpost("is_active"); + + $this->update_feed_active($feed_id, $is_active); + die(); + } + public function form_settings_sections() { + return array(); + } + + public function form_settings($form) { + if( $this->is_detail_page() ) { + + // feed edit page + $feed_id = $this->get_current_feed_id(); + + $this->feed_edit_page($form, $feed_id); + } + else { + // feed list UI + $this->feed_list_page($form); + } + } + + public function is_list_page(){ + return !isset($_GET["fid"]); + } + + public function is_detail_page(){ + return !$this->is_list_page(); + } + + public function form_settings_header(){ + if($this->is_list_page()){ + $title = $this->form_settings_title(); + return $title . " " . __("Add New", "gravityforms") . ""; + } + } + + public function form_settings_title(){ + return $this->_title . " " . __("Feeds", "gravityforms"); + } + + protected function feed_edit_page($form, $feed_id) { + + // Save feed if appropriate + $feed_id = $this->maybe_save_feed_settings( $feed_id, $form['id'] ); + + ?> + + get_feed( $feed_id ); + $this->set_settings( $feed['meta'] ); + + GFCommon::display_admin_message(); + + $this->render_settings( $this->get_feed_settings_fields() ); + } + + public function feed_list_page($form=null){ + $action = $this->get_bulk_action(); + if($action){ + check_admin_referer("feed_list", "feed_list"); + $this->process_bulk_action($action); + } + + $single_action = rgpost("single_action"); + if(!empty($single_action)){ + check_admin_referer("feed_list", "feed_list"); + $this->process_single_action($single_action); + } + + $columns = $this->feed_list_columns(); + $column_value_callback = array($this, "get_column_value"); + $feeds = $this->get_feeds(rgar($form,"id")); + $bulk_actions = $this->get_bulk_actions(); + $action_links = $this->get_action_links(); + + ?> +

    feed_list_title() ?>

    + _slug, $columns, $bulk_actions, $action_links, $column_value_callback); + $feed_list->prepare_items(); + $feed_list->display(); + + ?> + + + + + " name="id"> + + + + + + "0")); + return $this->_short_title . " " . __("Feeds", "gravityforms") . " " . __("Add New", "gravityforms") . ""; + } + + protected function maybe_save_feed_settings( $feed_id, $form_id ){ + + if( !rgpost( 'gform-settings-save' ) ) + return $feed_id; + + $settings = $this->get_posted_settings(); + $is_valid = $this->validate_settings( $this->get_feed_settings_fields(), $settings ); + $result = false; + + if( $is_valid ) + $result = $this->save_feed_settings( $feed_id, $form_id, $settings ); + + if( $result ) { + GFCommon::add_message( __('Feed updated successfully.', 'gravityforms') ); + } else { + GFCommon::add_error_message( __('There was an error updating this feed. Please review all errors below and try again.', 'gravityforms') ); + } + + // if no $feed_id is passed, assume that a new feed was created and return new $feed_id + if( !$feed_id ) + $feed_id = $result; + + return $feed_id; + } + + protected function save_feed_settings( $feed_id, $form_id, $settings ) { + + if( $feed_id ) { + $this->update_feed_meta( $feed_id, $settings ); + $result = true; + } else { + $result = $this->insert_feed( $form_id, true, $settings ); + } + + return $result; + } + + public function get_feed_settings_values(){ + + $sections = $this->get_feed_settings_fields(); + $settings = $this->get_settings_values( $sections ); + + return $settings; + } + + public function get_feed_settings_fields() { + + if( !empty( $this->_feed_settings_fields ) ) + return $this->_feed_settings_fields; + + $this->_feed_settings_fields = $this->add_default_feed_settings_fields_props( $this->feed_settings_fields() ); + + return $this->_feed_settings_fields; + } + + public function add_default_feed_settings_fields_props( $fields ) { + + foreach( $fields as &$section ) { + foreach( $section['fields'] as &$field ) { + switch( $field['type'] ) { + case 'field_map': + if( !rgar( $field, 'validation_callback' ) ) + $field['validation_callback'] = array( $this, 'validate_feed_map_settings' ); + break; + case 'hidden': + $field['hidden'] = true; + break; + } + } + } + + return $fields; + } + + private function get_bulk_action(){ + $action = rgpost("action"); + if(empty($action) || $action == "-1") + $action = rgpost("action2"); + + return empty($action) || $action == "-1" ? false : $action; + } + + /*** + * Override this function to add custom bulk actions + */ + protected function get_bulk_actions(){ + $bulk_actions = array('delete' => __('Delete', 'gravityforms')); + return $bulk_actions; + } + + /*** + * Override this function to process custom bulk actions added via the get_bulk_actions() function + * + * @param string $action: The bulk action selected by the user + */ + protected function process_bulk_action($action){ + if($action == "delete"){ + $feeds = rgpost("feed_ids"); + if(is_array($feeds)){ + foreach($feeds as $feed_id){ + $this->delete_feed($feed_id); + } + } + } + } + + protected function process_single_action($action){ + if($action == "delete"){ + $feed_id = absint(rgpost("single_action_argument")); + $this->delete_feed($feed_id); + } + } + + protected function get_action_links(){ + $feed_id = "{id}"; + $edit_url = add_query_arg(array("fid" => $feed_id)); + $links = array( + 'edit' => '' . __('Edit', 'gravityforms') . '', + 'delete' => '' . __('Delete', 'gravityforms') . '' + ); + + return $links; + } + + protected function feed_list_columns() { + return array(); + } + + public function get_column_value($item, $column) { + if(is_callable(array($this, "get_column_value_{$column}"))){ + return call_user_func(array($this, "get_column_value_{$column}"), $item); + } + else if(isset($item[$column])){ + return $item[$column]; + } + else if(isset($item["meta"][$column])){ + return $item["meta"][$column]; + } + } + + + + + protected function update_form_settings($form, $new_form_settings) { + $feed_id = rgar($new_form_settings, "id"); + foreach ($new_form_settings as $key => $value) { + $form[$this->_slug]["feeds"][$feed_id][$key] = $value; + } + + return $form; + } + + protected function get_form_settings($form) { + if ($this->is_detail_page()) { + $feed_id = rgget("fid"); + + $add_on_form_settings = rgar($form, $this->_slug); + if (is_array($add_on_form_settings) && is_array(rgar($add_on_form_settings, "feeds"))) + return rgar($add_on_form_settings["feeds"], $feed_id); + else + return array(); + } + + return parent::get_form_settings($form); + } + + protected function settings_feed_condition( $field, $echo = true ) { + + $checkbox_field = array( + 'name' => 'feed_condition_conditional_logic', + 'type' => 'checkbox', + 'choices' => array( + array( + 'label' => __('Enable Opt-In Condition', 'gravityforms'), + 'name' => 'feed_condition_conditional_logic' + ) + ), + 'onclick' => 'ToggleConditionalLogic( false, "feed_condition" );' + ); + + $conditional_logic = $this->get_setting( 'feed_condition_conditional_logic_object' ) ? json_encode( $this->get_setting( 'feed_condition_conditional_logic_object' ) ) : '{}'; + $hidden_field = array( + 'name' => 'feed_condition_conditional_logic_object', + 'value' => $conditional_logic + ); + + $html = $this->settings_checkbox( $checkbox_field, '', false ); + $html .= $this->settings_hidden( $hidden_field, '', false ); + $html .= '
    '; + $html .= ''; + + if( $echo ) + echo $html; + + return $html; + } + + public function settings_field_map( $field, $echo = true ) { + + $html = ''; + $field_map = rgar( $field, 'field_map' ); + + if( empty( $field_map ) ) + return $html; + + $form_id = rgget( 'id' ); + + $html .= ' + + + + + + + + '; + + foreach( $field['field_map'] as $child_field ) { + + $child_field['name'] = $this->get_mapped_field_name( $field, $child_field['name'] ); + $required = rgar( $child_field, 'required' ) ? $this->get_required_indicator( $child_field ) : ''; + + $html .= ' + + + + '; + } + + $html .= ' + +
    FieldForm Field
    + ' . + $this->settings_field_map_select( $child_field, $form_id ) . + '
    '; + + if( $echo ) + echo $html; + + return $html; + } + + public function settings_field_map_select( $field, $form_id ) { + + $field['choices'] = self::get_field_map_choices( $form_id ); + + return $this->settings_select( $field, false ); + } + + public static function get_field_map_choices( $form_id ) { + + $form = RGFormsModel::get_form_meta($form_id); + $fields = array(); + + // Adding default fields + $fields[] = array( "value" => "", "label" => "" ); + $fields[] = array( "value" => "date_created" , "label" => __("Entry Date", "gravityforms") ); + $fields[] = array( "value" => "ip" , "label" => __("User IP", "gravityformsmailchimp") ); + $fields[] = array( "value" => "source_url" , "label" => __("Source Url", "gravityforms") ); + $fields[] = array( "value" => "form_title" , "label" => __("Form Title", "gravityforms") ); + + // Populate entry meta + $entry_meta = GFFormsModel::get_entry_meta( $form["id"] ); + foreach( $entry_meta as $meta_key => $meta ) { + $fields[] = array( 'value' => $meta_key , 'label' => rgars($entry_meta, "{$meta_key}/label") ); + } + + // Populate form fields + if( is_array( $form["fields"] ) ) { + foreach( $form["fields"] as $field ) { + if( is_array( rgar( $field, "inputs") ) ) { + + //If this is an address field, add full name to the list + if(RGFormsModel::get_input_type($field) == "address") + $fields[] = array( 'value' => $field["id"], 'label' => GFCommon::get_label($field) . " (" . __("Full" , "gravityformsmailchimp") . ")" ); + + //If this is a name field, add full name to the list + if(RGFormsModel::get_input_type($field) == "name") + $fields[] = array( 'value' => $field["id"], 'label' => GFCommon::get_label($field) . " (" . __("Full" , "gravityformsmailchimp") . ")" ); + + foreach($field["inputs"] as $input) + $fields[] = array( 'value' => $input["id"], 'label' => GFCommon::get_label($field, $input["id"]) ); + } + else if(!rgar($field,"displayOnly")){ + $fields[] = array( 'value' => $field["id"], 'label' => GFCommon::get_label($field)); + } + } + } + + return $fields; + } + + public function get_mapped_field_name( $parent_field, $field_name ) { + return "field_map_{$parent_field['name']}_{$field_name}"; + } + + public function validate_feed_map_settings( $field ) { + + $settings = $this->get_posted_settings(); + $field_map = rgar( $field, 'field_map' ); + + if( empty( $field_map ) ) + return; + + foreach( $field_map as $child_field ) { + + $child_field['name'] = $this->get_mapped_field_name( $field, $child_field['name'] ); + $setting_value = rgar( $settings, $child_field['name'] ); + + if( rgar( $child_field, 'required' ) && rgblank( $setting_value ) ) + $this->set_field_error( $child_field ); + + } + + } + + public static function get_field_map_fields( $feed, $field_name ) { + + $fields = array(); + $prefix = "field_map_{$field_name}_"; + + foreach( $feed['meta'] as $name => $value ) { + if( strpos( $name, $prefix ) === 0 ) { + $name = str_replace( $prefix, '', $name ); + $fields[$name] = $value; + } + } + + return $fields; + } + + protected function has_feed_condition_field() { + + $fields = $this->settings_fields_only( 'feed' ); + + foreach( $fields as $field ) { + if( $field['type'] == 'feed_condition' ) + return true; + } + + return false; + } + + protected function add_delayed_payment_support( $options ) { + + $this->delayed_payment_integration = $options; + + if( is_admin() ) { + add_action( 'gform_paypal_action_fields', array( $this, 'add_paypal_settings' ), 10, 2); + add_filter( 'gform_paypal_save_config', array( $this, 'save_paypal_settings' ) ); + } else { + add_action( 'gform_paypal_fulfillment', array( $this, 'paypal_fulfillment' ), 10, 4 ); + } + + } + + public function add_paypal_settings( $feed, $form ) { + + $form_id = rgar( $form, 'id' ); + $feed_meta = $feed['meta']; + $settings_style = $this->has_feed_for_this_addon( $form_id ) ? '' : 'display:none;'; + + $addon_name = $this->_slug; + $addon_feeds = array(); + foreach( $this->get_feeds( $form_id ) as $feed ) { + $addon_feeds[] = $feed['form_id']; + } + + ?> + +
  • + /> + +
  • + + + + _slug}"] = rgpost( "paypal_delay_{$this->_slug}" ); + return $feed; + } + + public function paypal_fulfillment( $entry, $config, $transaction_id, $amount ) { + + self::log_debug( "Checking PayPal fulfillment for transaction {$transaction_id}" ); + + $is_fulfilled = gform_get_meta( $entry['id'], "{$this->_slug}_is_fulfilled" ); + + if ( !$is_fulfilled ) { + + self::log_debug( "Entry {$entry['id']} has not been fulfilled." ); + $form = RGFormsModel::get_form_meta( $entry['form_id'] ); + $this->maybe_process_feed( $entry, $form, true ); + + // updating meta to indicate this entry has been fulfilled for the current add-on + self::log_debug( "Marking entry {$entry['id']} as fulfilled" ); + gform_update_meta( $entry['id'], "{$this->_slug}_is_fulfilled", true ); + + } else { + self::log_debug( "Entry {$entry['id']} is already fulfilled." ); + } + + } + + // @ALEX Naming might be improved here + protected function has_feed_for_this_addon( $form_id ) { + return $this->get_feeds( $form_id ) != false; + } + +} + + +if (!class_exists('WP_List_Table')) + require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php'); + +class GFAddOnFeedsTable extends WP_List_Table { + + public $_column_value_callback = array(); + public $_no_items_callback = array(); + + private $_feeds; + private $_slug; + private $_columns; + private $_bulk_actions; + private $_action_links; + + function __construct($feeds, $slug, $columns = array(), $bulk_actions, $action_links, $column_value_callback, $no_items_callback=null) { + $this->_bulk_actions = $bulk_actions; + $this->_feeds = $feeds; + $this->_slug = $slug; + $this->_columns = $columns; + $this->_column_value_callback = $column_value_callback; + $this->_action_links = $action_links; + $this->_no_items_callback = $no_items_callback; + + $standard_cols = array( + 'cb' => __('Checkbox', 'gravityforms'), + 'is_active' => '' + ); + + $all_cols = array_merge($standard_cols, $columns); + + $this->_column_headers = array( + $all_cols, + array(), + array() + ); + + parent::__construct(array( + 'singular' => __('feed', 'gravityforms'), + 'plural' => __('feeds', 'gravityforms'), + 'ajax' => false + )); + } + + function prepare_items() { + $this->items = isset($this->_feeds) ? $this->_feeds : array(); + } + + function get_bulk_actions() { + return $this->_bulk_actions; + } + + function no_items() { + $default = sprintf(__("You don't have any feeds configured. Let's go %screate one%s"), "", ""); + $message = is_callable($this->_no_items_callback) ? $value = call_user_func($this->_no_items_callback) : $default; + + echo $message; + } + + function column_default($item, $column) { + if (is_callable($this->_column_value_callback)) { + $value = call_user_func($this->_column_value_callback, $item, $column); + } + + //adding action links to the first column of the list + $columns = array_keys($this->_columns); + if(is_array($columns) && count($columns) > 0 && $columns[0] == $column){ + $value = $this->add_action_links($item, $column, $value); + } + + return $value; + } + + function column_cb($item) { + $feed_id = rgar($item, "id"); + + return sprintf( + '', $feed_id + ); + } + + function add_action_links($item, $column, $value){ + + $actions = apply_filters($this->_slug . '_feed_actions', $this->_action_links, $item, $column); + + //replacing {id} merge variable with actual feed id + foreach($actions as $action => &$link){ + $link = str_replace("{id}", $item["id"], $link); + } + + return sprintf('%1$s %2$s', $value, $this->row_actions($actions)); + } + + /*function column_feed_name($item) { + $name = isset($item["name"]) ? $item["name"] : __("Untitled feed", "gravityforms"); + $feed_id = rgar($item, "id"); + $edit_url = add_query_arg(array("fid" => $feed_id)); + $actions = apply_filters($this->_slug . '_feed_actions', array( + 'edit' => '' . __('Edit', 'gravityforms') . '', + 'delete' => '' . __('Delete', 'gravityforms') . '' + )); + + return sprintf('%1$s %2$s', $name, $this->row_actions($actions)); + }*/ + + function column_is_active($item) { + $is_active = intval(rgar($item, "is_active")); + $src = GFCommon::get_base_url() . "/images/active{$is_active}.png"; + + $title = $is_active ? __("Active", "gravityforms") : __("Inactive", "gravityforms"); + $img = ""; + + return $img; + } +} diff --git a/includes/addon/class-gf-results.php b/includes/addon/class-gf-results.php new file mode 100644 index 0000000..23d98d8 --- /dev/null +++ b/includes/addon/class-gf-results.php @@ -0,0 +1,899 @@ +_slug = $slug; + $this->_title = rgar($config, "title"); + $this->_callbacks = isset($config["callbacks"]) ? $config["callbacks"] : array(); + $this->_capabilities = isset($config["capabilities"]) ? $config["capabilities"] : array(); + + } + + public function init() { + + if(!GFCommon::current_user_can_any($this->_capabilities)) + return; + + //add top toolbar menu item + add_filter("gform_toolbar_menu", array($this, 'add_toolbar_menu_item'), 10, 2); + //add custom form action + add_filter("gform_form_actions", array($this, 'add_form_action'), 10, 2); + //add the results view + add_action("gform_entries_view", array($this, 'add_view'), 10, 2); + + add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts')); + + require_once(GFCommon::get_base_path() . "/tooltips.php"); + + add_filter('gform_tooltips', array($this, 'add_tooltips')); + + } + + public function enqueue_admin_scripts() { + wp_enqueue_script('jquery-ui-resizable'); + wp_enqueue_script('jquery-ui-datepicker'); + + wp_enqueue_script('google_charts'); + wp_enqueue_style('gaddon_results_css'); + wp_enqueue_script("gaddon_results_js"); + $this->localize_results_scripts(); + } + + public static function localize_results_scripts() { + + $filter_fields = rgget("f"); + $filter_types = rgget("t"); + $filter_operators = rgget("o"); + $filter_values = rgget("v"); + + // Get current page protocol + $protocol = isset($_SERVER["HTTPS"]) ? 'https://' : 'http://'; + // Output admin-ajax.php URL with same protocol as current page + + $vars = array( + 'ajaxurl' => admin_url('admin-ajax.php', $protocol), + 'imagesUrl' => GFCommon::get_base_url() . "/images", + 'filterFields' => $filter_fields, + 'filterTypes' => $filter_types, + 'filterOperators' => $filter_operators, + 'filterValues' => $filter_values + ); + + wp_localize_script('gaddon_results_js', 'gresultsVars', $vars); + + $strings = array( + 'noFilters' => __("No filters", "gravityforms"), + 'addFieldFilter' => __("Add a field filter", "gravityforms"), + 'removeFieldFilter' => __("Remove a field filter", "gravityforms"), + 'ajaxError' => __("Error retrieving results. Please contact support.", "gravityforms") + ); + + + wp_localize_script('gaddon_results_js', 'gresultsStrings', $strings); + + $strings = array( + 'is' => __("is", "gravityforms"), + 'isnot' => __("is not", "gravityforms"), + '>' => __("greater than", "gravityforms"), + '<' => __("less than", "gravityforms"), + 'contains' => __("contains", "gravityforms") + ); + + wp_localize_script('gaddon_results_js', 'gresultsOperatorStrings', $strings); + + } + + private function get_fields($form){ + return isset($this->_callbacks["fields"]) ? call_user_func($this->_callbacks["fields"], $form) : $form["fields"]; + } + + public function add_form_action($actions, $form_id) { + return $this->filter_menu_items($actions, $form_id, true); + } + + public function add_toolbar_menu_item($menu_items, $form_id) { + return $this->filter_menu_items($menu_items, $form_id, false); + } + + public function filter_menu_items($menu_items, $form_id, $compact) { + $form_meta = GFFormsModel::get_form_meta($form_id); + $results_fields = $this->get_fields($form_meta); + if (false === empty($results_fields)) { + $form_id = $form_meta["id"]; + $link_class = ""; + if (rgget("page") == "gf_new_form") + $link_class = "gf_toolbar_disabled"; + else if (rgget("page") == "gf_entries" && rgget("view") == "gf_results_" . $this->_slug) + $link_class = "gf_toolbar_active"; + + $sub_menu_items = array(); + $sub_menu_items[] = array( + 'label' => $this->_title, + 'title' => __("View results generated by this form", "gravityforms"), + 'link_class' => $link_class, + 'url' => admin_url("admin.php?page=gf_entries&view=gf_results_{$this->_slug}&id={$form_id}"), + 'capabilities' => $this->_capabilities + ); + + // If there's already a menu item with the key "results" then merge the two. + if (isset($menu_items["results"])) { + $existing_link_class = $menu_items["results"]["link_class"]; + $link_class == empty($existing_link_class) ? $link_class : $existing_link_class; + $existing_capabilities = $menu_items["results"]["capabilities"]; + $merged_capabilities = array_merge($existing_capabilities, $this->_capabilities); + $existing_sub_menu_items = $menu_items["results"]["sub_menu_items"]; + $merged_sub_menu_items = array_merge($existing_sub_menu_items, $sub_menu_items); + $menu_items["results"]["link_class"] = $link_class; + $menu_items["results"]["capabilities"] = $merged_capabilities; + $menu_items["results"]["sub_menu_items"] = $merged_sub_menu_items; + $menu_items["results"]["label"] = __("Results", "gravityforms"); + + } else { + // so far during the page cycle this is the only menu item for this key + $menu_items["results"] = array( + 'label' => $compact ? __("Results", "gravityforms") : $this->_title, + 'title' => __("View results generated by this form", "gravityforms"), + 'url' => "", + 'onclick' => "return false;", + 'menu_class' => 'gf_form_toolbar_results', + 'link_class' => $link_class, + 'capabilities' => $this->_capabilities, + 'sub_menu_items' => $sub_menu_items, + 'priority' => 750 + ); + } + + } + + return $menu_items; + } + + + public function add_view($view, $form_id) { + if ($view == "gf_results_" . $this->_slug) + GFResults::results_page($form_id, $this->_title, "gf_entries", $view); + + } + + public function results_page($form_id, $page_title, $gf_page, $gf_view) { + if (empty($form_id)) { + + $forms = RGFormsModel::get_forms(); + if (!empty($forms)) { + $form_id = $forms[0]->id; + } + } + $form = GFFormsModel::get_form_meta($form_id); + $form = apply_filters("gform_form_pre_results_$form_id", apply_filters("gform_form_pre_results", $form)); + + + + // set up filter vars + $start_date = rgget("start"); + $end_date = rgget("end"); + + $all_fields = $form["fields"]; + + // set up filters + $fields = $all_fields; + $exclude_types = array("rank", "page"); + + for ($i = 0; $i < count($all_fields); $i++) { + $field_type = GFFormsmodel::get_input_type($all_fields[$i]); + if (in_array($field_type, $exclude_types)) + unset($fields[$i]); + } + $fields = array_values($fields); + + $field_filters = array(); + + foreach ($fields as $field) { + $operators = array(); + $field_type = GFFormsmodel::get_input_type($field); + $operators[] = "is"; + if ($field_type != "checkbox") + $operators[] = "isnot"; + $field_filter = array(); + $key = $field["id"]; + if ($field_type == "likert" && rgar($field, "gsurveyLikertEnableMultipleRows")) { + $field_filter["key"] = $key; + $field_filter["type"] = "group"; + $field_filter["text"] = rgar($field, "label"); + $sub_filters = array(); + $rows = rgar($field, "gsurveyLikertRows"); + foreach ($rows as $row) { + $sub_filter = array(); + $sub_filter["key"] = $key . "|" . rgar($row, "value"); + $sub_filter["text"] = rgar($row, "text"); + $sub_filter["type"] = "field"; + $sub_filter["preventMultiple"] = false; + $sub_filter["operators"] = $operators; + $sub_filter["values"] = $field["choices"]; + $sub_filters[] = $sub_filter; + } + $field_filter["filters"] = $sub_filters; + } else { + $field_filter["key"] = $key; + $field_filter["type"] = "field"; + $field_filter["preventMultiple"] = false; + $field_filter["text"] = rgar($field, "label"); + + if (isset($field["choices"])) + $field_filter["values"] = $field["choices"]; + else + $operators[] = "contains"; + + $field_filter["operators"] = $operators; + + } + $field_filters[] = $field_filter; + + } + + $entry_meta_filters = self::get_entry_meta_filters($form_id); + $field_filters = array_merge($field_filters, $entry_meta_filters); + + $field_filters = apply_filters("gform_filters_pre_results", $field_filters, $form); + $field_filters = array_values($field_filters); // reset the numeric keys in case some filters have been unset + ?> + + + +
    + +

    + +

    + + + + +
    +
    +
      +
    +
    + +
    +

    + +
    +
    + + + + +
    +
    + +
    +
    + +
    + + + +
    +
    + + +
    +
    + +
    + + + + +
    +
    +
    +
    +
    + +
    + + + " . __("Total Score", "gravityforms") . "" . __("Scores are weighted calculations. Items ranked higher are given a greater score than items that are ranked lower. The total score for each item is the sum of the weighted scores.", "gravityforms"); + $tooltips["gresults_agg_rank"] = "
    " . __("Aggregate Rank", "gravityforms") . "
    " . __("The aggregate rank is the overall rank for all entries based on the weighted scores for each item.", "gravityforms"); + $tooltips["gresults_date_range"] = "
    " . __("Date Range", "gravityforms") . "
    " . __("Date Range is optional, if no date range is specified it will be ignored.", "gravityforms"); + $tooltips["gresults_filters"] = "
    " . __("Filters", "gravityforms") . "
    " . __("Narrow the results by adding filters. Note that some field types support more options than others.", "gravityforms"); + + return $tooltips; + } + + private function get_entry_meta_filters($form_id){ + $filters = array(); + //$entry_meta = is_callable($this->_callbacks["get_entry_meta"]) ? call_user_func($this->_callbacks["get_entry_meta"], array(), $form_id) : array(); + $entry_meta = GFFormsModel::get_entry_meta($form_id); + if(empty($entry_meta)) + return $filters; + + foreach($entry_meta as $key => $meta){ + if(isset($meta["filter"])){ + $filter = array(); + $filter["key"] = $key; + $filter["type"] = "meta"; + $filter["preventMultiple"] = isset($meta["filter"]["preventMultiple"]) ? $meta["filter"]["preventMultiple"] : false; + $filter["text"] = rgar($meta, "label"); + $filter["operators"] = isset($meta["filter"]["operators"]) ? $meta["filter"]["operators"] : array("is", "isnot") ; + if (isset($meta["filter"]["choices"])) + $filter["values"] = $meta["filter"]["choices"]; + $filters[] = $filter; + } + + } + return $filters; + } + + public function ajax_get_results() { + $output = array(); + $html = ""; + $form_id = rgpost("id"); + $form = GFFormsModel::get_form_meta($form_id); + $form = apply_filters("gform_form_pre_results_$form_id", apply_filters("gform_form_pre_results", $form)); + $search_criteria = array(); + $fields = $this->get_fields($form); + $total_entries = GFFormsModel::count_search_leads($form_id, $search_criteria); + if ($total_entries == 0) { + $html = __("No results.", "gravityforms"); + } else { + + $filter_fields = rgpost("f"); + if (is_array($filter_fields)) { + $filter_types = rgpost("t"); + $filter_operators = rgpost("o"); + $filter_values = rgpost("v"); + for ($i = 0; $i < count($filter_fields); $i++) { + $field_filter = array(); + $field_filter["type"] = "field"; + $key = $filter_fields[$i]; + $filter_type = $filter_types[$i]; + $operator = $filter_operators[$i]; + $val = $filter_values[$i]; + $strpos_row_key = strpos($key, "|"); + if ($strpos_row_key !== false) { //multi-row + $key_array = explode("|", $key); + $key = $key_array[0]; + $val = $key_array[1] . ":" . $val; + } + $field_filter["key"] = $key; + $field_filter["type"] = $filter_type; + $field_filter["operator"] = $operator; + $field_filter["value"] = $val; + $search_criteria[] = $field_filter; + } + } + + $start_date = rgpost("start"); + $end_date = rgpost("end"); + if ($start_date) + $search_criteria[] = array( + 'key' => 'date_created', + 'type' => 'info', + 'operator' => '>=', + 'value' => $start_date + ); + if ($end_date) + $search_criteria[] = array( + 'key' => 'date_created', + 'type' => 'info', + 'operator' => '<=', + 'value' => $end_date + ); + + $search_criteria[] = array("type" => "info", "key" => "status", "value" => "active"); + $output["s"] = http_build_query($search_criteria); + $state_array = null; + if (isset($_POST["state"])) { + $state = $_POST["state"]; + $posted_check_sum = rgpost("checkSum"); + $generated_check_sum = self::generate_checksum($state); + $state_array = json_decode(base64_decode($state), true); + if ( $generated_check_sum !== $posted_check_sum) { + $output["status"] = "complete"; + $output["html"] = __('There was an error while processing the entries. Please contact support.', "gravityforms"); + echo json_encode($output); + die(); + } + + } + $data = $this->get_results_data($form, $fields, $search_criteria, $state_array); + $entry_count = $data["entry_count"]; + + if ("incomplete" === rgar($data, "status")) { + $state = base64_encode(json_encode($data)); + $output["status"] = "incomplete"; + $output["stateObject"] = $state; + $output["checkSum"] = self::generate_checksum($state); + $output["html"] = sprintf(__('Entries processed: %1$d of %2$d', "gravityforms"), rgar($data, "offset"), $entry_count); + echo json_encode($output); + die(); + } + + if ($total_entries > 0) { + $html = isset($this->_callbacks["markup"]) ? call_user_func($this->_callbacks["markup"], $html, $data, $form, $fields) : ""; + if (empty($html)) { + foreach ($fields as $field) { + $field_id = $field['id']; + $html .= "
    "; + $html .= "
    " . esc_html(GFCommon::get_label($field)) . "
    "; + $html .= "
    " . self::get_field_results($form_id, $data, $field, $search_criteria) . "
    "; + $html .= "
    "; + } + } + + } else { + $html .= __("No results", "gravityforms"); + } + } + + $output["html"] = $html; + $output["status"] = "complete"; + $output["searchCriteria"] = $search_criteria; + echo json_encode($output); + die(); + } + + public static function ajax_get_more_results() { + $form_id = rgpost("form_id"); + $field_id = rgpost("field_id"); + $offset = rgpost("offset"); + $search_criteria = rgpost("search_criteria"); + + if (empty($search_criteria)) + $search_criteria = array(); + $page_size = 10; + + $form = RGFormsModel::get_form_meta($form_id); + $form_id = $form["id"]; + $field = RGFormsModel::get_field($form, $field_id); + $entry_count = GFFormsModel::count_search_leads($form_id, $search_criteria); + $html = self::get_default_field_results($form_id, $field, $search_criteria, $offset, $page_size); + $remaining = $entry_count - ($page_size + $offset); + $remaining = $remaining < 0 ? 0 : $remaining; + $response = array(); + $response["remaining"] = $remaining; + $response['html'] = $html; + + echo json_encode($response); + die(); + } + + private static function generate_checksum($data) { + return wp_hash(crc32(($data))); + } + + + public static function get_total_entries($form) { + $totals = RGFormsModel::get_form_counts($form["id"]); + + return $totals["total"]; + } + + public static function get_field_results($form_id, $data, $field, $search_criteria) { + $field_data = $data["field_data"]; + $entry_count = $data["entry_count"]; + $field_results = ""; + if (empty($field_data[$field["id"]])) { + $field_results .= __("No entries for this field", "gravityforms"); + + return $field_results; + } + $field_type = GFFormsModel::get_input_type($field); + switch ($field_type) { + case "radio" : + case "checkbox" : + case "select" : + case "rating" : + case "multiselect" : + $results = $field_data[$field["id"]]; + $non_zero_results = is_array($results) ? array_filter($results) : $results; + if (empty($non_zero_results)) { + $field_results .= __("No entries for this field", "gravityforms"); + + return $field_results; + } + $choices = $field["choices"]; + + $data_table = array(); + $data_table [] = array(__('Choice', "gravityforms"), __('Frequency', "gravityforms")); + + foreach ($choices as $choice) { + $text = $choice["text"]; + $val = $results[$choice['value']]; + $data_table [] = array($text, $val); + } + + $bar_height = 40; + $chart_area_height = (count($choices) * $bar_height); + + $chart_options = array( + 'isStacked' => true, + 'height' => ($chart_area_height + $bar_height), + 'chartArea' => array( + 'top' => 0, + 'left' => 200, + 'height' => $chart_area_height, + 'width' => '100%' + ), + 'series' => array( + '0' => array( + 'color' => 'silver', + 'visibleInLegend' => 'false' + ) + ), + 'hAxis' => array( + 'viewWindowMode' => 'explicit', + 'viewWindow' => array('min' => 0), + 'title' => __('Frequency', "gravityforms") + ) + + ); + + $data_table_json = htmlentities(json_encode($data_table), ENT_QUOTES, 'UTF-8', true); + $options_json = htmlentities(json_encode($chart_options), ENT_QUOTES, 'UTF-8', true); + $div_id = "gresults-results-chart-field-" . $field["id"]; + $height = ""; // = sprintf("height:%dpx", (count($choices) * $bar_height)); + + $field_results .= sprintf('
    ', $height, $div_id, $data_table_json, $options_json); + + + break; + case "likert" : + $results = $field_data[$field["id"]]; + $multiple_rows = rgar($field, "gsurveyLikertEnableMultipleRows"); + + $n = 100; + + $xr = 255; + $xg = 255; + $xb = 255; + + $yr = 100; + $yg = 250; + $yb = 100; + + $field_results .= "
    "; + $field_results .= ""; + $field_results .= ""; + if ($multiple_rows) + $field_results .= ""; + + foreach ($field["choices"] as $choice) { + $field_results .= ""; + } + $field_results .= ""; + + foreach ($field["gsurveyLikertRows"] as $row) { + $row_text = $row["text"]; + $row_value = $row["value"]; + $max = 0; + foreach ($field["choices"] as $choice) { + if ($multiple_rows) { + $choice_value = rgar($choice, "value"); + $results_row = rgar($results, $row_value); + $results_for_choice = rgar($results_row, $choice_value); + $max = max(array($max, $results_for_choice)); + } else { + $max = max(array($max, $results[$choice['value']])); + } + + } + + $field_results .= ""; + + if ($multiple_rows) + $field_results .= ""; + + foreach ($field["choices"] as $choice) { + $val = $multiple_rows ? $results[$row_value][$choice['value']] : $results[$choice['value']]; + $percent = $max > 0 ? round($val / $max * 100, 0) : 0; + $red = (int)(($xr + (($percent * ($yr - $xr)) / ($n - 1)))); + $green = (int)(($xg + (($percent * ($yg - $xg)) / ($n - 1)))); + $blue = (int)(($xb + (($percent * ($yb - $xb)) / ($n - 1)))); + $clr = 'rgb(' . $red . ',' . $green . ',' . $blue . ')'; + $field_results .= ""; + } + $field_results .= ""; + + if (false === $multiple_rows) + break; + + } + $field_results .= "
    " . $choice['text'] . "
    " . $row_text . "" . $val . "
    "; + $field_results .= "
    "; + + if (rgar($field, "gsurveyLikertEnableScoring") && class_exists("GFSurvey")) { + $sum = $results["sum_of_scores"]; + $average_score = $sum == 0 ? 0 : round($sum / $entry_count,3); + $field_results .= "
    " . __("Average score: ", "gravityforms") . $average_score . "
    "; + } + + break; + case "rank" : + $results = $field_data[$field["id"]]; + arsort($results); + $field_results .= "
    "; + $field_results .= " "; + $field_results .= " "; + $field_results .= " "; + $field_results .= " "; + $field_results .= " "; + $field_results .= " "; + + $agg_rank = 1; + foreach ($results as $choice_val => $score) { + $field_results .= ""; + $field_results .= " "; + $field_results .= " "; + $field_results .= " "; + $field_results .= ""; + $agg_rank++; + } + $field_results .= "
    "; + $field_results .= __("Item", "gravityforms"); + $field_results .= " "; + $field_results .= __("Total Score", "gravityforms") . " " . gform_tooltip("gresults_total_score", null, true); + $field_results .= " "; + $field_results .= __("Aggregate Rank", "gravityforms") . " " . gform_tooltip("gresults_agg_rank", null, true); + $field_results .= "
    "; + $field_results .= RGFormsModel::get_choice_text($field, $choice_val); + $field_results .= " "; + $field_results .= $score; + $field_results .= " "; + $field_results .= $agg_rank; + $field_results .= "
    "; + $field_results .= "
    "; + + break; + default : + $page_size = 5; + $offset = 0; + $field_id = $field["id"]; + + $field_results .= "
    " . __("Latest entries:", "gravityforms") . "
    "; + + $field_results .= "
      "; + $field_results .= self::get_default_field_results($form_id, $field, $search_criteria, $offset, $page_size); + $field_results .= "
    "; + + if ($entry_count > 5) { + $field_results .= "Show more"; + } + break; + } + + return $field_results; + + } + + public function get_results_data($form, $fields, $search_criteria = array(), $state_array = array(), $max_execution_time = 15 /* seconds */) { + // todo: add hooks to modify $max_execution_time and $page_size? + + $page_size = 200; + + $time_start = microtime(true); + + $form_id = $form["id"]; + $data = array(); + $offset = 0; + $entry_count = 0; + $field_data = array(); + + + if ($state_array) { + //get counts from state + $data = $state_array; + $offset = (int)rgar($data, "offset"); + + unset($data["offset"]); + $entry_count = $offset; + $field_data = rgar($data, "field_data"); + } else { + //initialize counts + foreach ($fields as $field) { + $field_type = GFFormsModel::get_input_type($field); + if (false === isset($field["choices"])) { + $field_data[$field["id"]] = 0; + continue; + } + $choices = $field["choices"]; + + if ($field_type == "likert" && rgar($field, "gsurveyLikertEnableMultipleRows")) { + foreach ($field["gsurveyLikertRows"] as $row) { + foreach ($choices as $choice) { + $field_data[$field["id"]][$row["value"]][$choice['value']] = 0; + } + } + } else { + foreach ($choices as $choice) { + $field_data[$field["id"]][$choice['value']] = 0; + } + } + if ($field_type == "likert" && rgar($field, "gsurveyLikertEnableScoring")) { + $field_data[$field["id"]]["sum_of_scores"] = 0; + } + + } + } + + $count_search_leads = GFFormsModel::count_search_leads($form_id, $search_criteria); + $data["entry_count"] = $count_search_leads; + + $entries_left = $count_search_leads - $offset; + + while ($entries_left >= 0) { + + $paging = array( + 'offset' => $offset, + 'page_size' => $page_size + ); + + $search_leads_time_start = microtime(true); + $leads = GFFormsModel::search_leads($form_id, $search_criteria, null, $paging); + $search_leads_time_end = microtime(true); + $search_leads_time = $search_leads_time_end - $search_leads_time_start; + + $leads_in_search = count($leads); + + $entry_count += $leads_in_search; + + foreach ($leads as $lead) { + foreach ($fields as $field) { + $field_type = GFFormsModel::get_input_type($field); + $field_id = $field["id"]; + $value = RGFormsModel::get_lead_field_value($lead, $field); + + if ($field_type == "likert" && rgar($field, "gsurveyLikertEnableMultipleRows")) { + + if (empty($value)) + continue; + foreach ($value as $value_vector) { + if (empty($value_vector)) + continue; + list($row_val, $col_val) = explode(":", $value_vector, 2); + if (isset($field_data[$field["id"]][$row_val]) && isset($field_data[$field["id"]][$row_val][$col_val])) { + $field_data[$field["id"]][$row_val][$col_val]++; + } + } + } elseif ($field_type == "rank") { + $score = count(rgar($field, "choices")); + $values = explode(",", $value); + foreach ($values as $ranked_value) { + $field_data[$field["id"]][$ranked_value] += $score; + $score--; + } + } else { + + if (false === isset($field["choices"])) { + if (false === empty($value)) + $field_data[$field_id]++; + continue; + } + $choices = $field["choices"]; + foreach ($choices as $choice) { + $choice_is_selected = false; + if (is_array($value)) { + $choice_value = rgar($choice, "value"); + if (in_array($choice_value, $value)) + $choice_is_selected = true; + } else { + if (RGFormsModel::choice_value_match($field, $choice, $value)) + $choice_is_selected = true; + } + if ($choice_is_selected) { + $field_data[$field_id][$choice['value']]++; + } + } + + } + if ($field_type == "likert" && rgar($field, "gsurveyLikertEnableScoring")) { + $field_data[$field["id"]]["sum_of_scores"] += $this->get_likert_score($field, $lead); + } + + + } + + } + $data["field_data"] = $field_data; + if (isset($this->_callbacks["calculation"])) + $data = call_user_func($this->_callbacks["calculation"],$data, $form, $fields, $leads); + + $offset += $page_size; + $entries_left -= $page_size; + + $time_end = microtime(true); + $execution_time = ($time_end - $time_start); + + if ($entries_left > 0 && $execution_time + $search_leads_time > $max_execution_time) { + $data["status"] = "incomplete"; + $data["offset"] = $offset; + $progress = $data["entry_count"] > 0 ? round($data["offset"] / $data["entry_count"] * 100) : 0; + $data["progress"] = $progress; + break; + } + + if ($entries_left <= 0) { + $data["status"] = "complete"; + } + } + + $data["timestamp"] = time(); + return $data; + } + + public function get_likert_score($field, $entry){ + return is_callable(array("GFSurvey", "get_field_score")) ? GFSurvey::get_field_score($field, $entry) : 0; + } + + + public static function get_default_field_results($form_id, $field, $search_criteria, $offset, $page_size) { + $field_results = ""; + + $paging = array('offset' => $offset, 'page_size' => $page_size); + + $sorting = array('key' => "date_created", 'direction' => "DESC"); + + $leads = GFFormsModel::search_leads($form_id, $search_criteria, $sorting, $paging); + + foreach ($leads as $lead) { + + $value = RGFormsModel::get_lead_field_value($lead, $field); + $content = apply_filters("gform_entries_field_value", $value, $form_id, $field["id"], $lead); + + $field_results .= "
  • {$content}
  • "; + } + + return $field_results; + + } + } +} diff --git a/includes/addon/css/gaddon_form_settings.css b/includes/addon/css/gaddon_form_settings.css new file mode 100644 index 0000000..632c959 --- /dev/null +++ b/includes/addon/css/gaddon_form_settings.css @@ -0,0 +1,9 @@ +.settings-field-map-table { } +.settings-field-map-table thead th { font-weight: bold; border-bottom: 1px solid #ccc; } +.settings-field-map-table tbody td { border-bottom: 1px dotted #eee; } +.settings-field-map-table select { max-width: 90%; } +.gaddon-section .required { color: #f00; } +.gaddon-setting-inline{ + display:inline; + margin-right:6px; +} \ No newline at end of file diff --git a/includes/addon/css/gaddon_results.css b/includes/addon/css/gaddon_results.css new file mode 100644 index 0000000..77bf291 --- /dev/null +++ b/includes/addon/css/gaddon_results.css @@ -0,0 +1,217 @@ + +table#gquiz-results-summary { + table-layout: fixed; +} + +table#gquiz-results-summary td { + font-weight: bold; + text-align: center; + padding: 10px; +} + +table#gquiz-results-summary td.gquiz-results-summary-label { + font-size: 1.2em; +} + +table#gquiz-results-summary td.gquiz-results-summary-data { + font-size: 2em; +} + +.gquiz-results-summary-data-box { + border: 1px solid silver; + padding: 10px; + width: 75%; + margin: auto; +} + +.gquiz-field-precentages-correct { + float: left; + margin: 15px 0 0 50px; +} + + +/*-------------*/ + +#gresults-results-wrapper { + float:left; + width:100%; + height:100%; +} + +#gresults-results { + margin-right:300px; + min-height:460px;; +} + +.gresults-results-field { + margin-bottom:20px; +} + +.gresults-results-field-label { + font-size:1.2em; + margin-bottom:10px; +} + +.gresults-results-field table{ + border-bottom: 1px solid silver; + border-spacing: 0; +} + +.gresults-results-field table td{ + padding:5px; + border-right: 1px solid silver; + border-top: 1px solid silver; + text-align:center; +} + +.gresults-results-field-table-header{ + background-color: #EEEEEE; +} + +.gresults-results-field table td:first-child { + border-left: 1px solid silver; +} + + +ul.gresults-results-field-content, +ul.gresults-results-field-content li{ + list-style:disc outside none; +} +ul.gresults-results-field-content{ + margin:10px; +} + +td.gresults-rank-field-score, +td.gresults-rank-field-rank{ + width:110px; +} + +.gsurvey-rank-field-results table{ + width:100%; +} + + +/* filter box */ + +#gresults-results-filter { + position:absolute; + width:270px; +} + +#gresults-results-filter-content { + padding:10px; +} + +#gresults-results-filter.sticky { + position:fixed; + top:30px; +} + +.gresults-results-filter-section-label { + font-size:1.2em; + font-weight:bold; + margin-top:10px; + margin-bottom:10px; +} + +#gresults-results-filter label { + margin-top:10px; + display:block; +} + +.gresults-remove, +.gresults-add { + margin-top:2px; + vertical-align:middle; + cursor:pointer; +} + +.gresults-add { + margin-left:5px; +} + +#gresults-no-filters{ + color:silver; +} + +.gresults-datepicker, +.gresults-filter-value, +.gresults-filter-field { + width:150px; + box-sizing:border-box; + -ms-box-sizing:border-box; + -moz-box-sizing:border-box; + -webkit-box-sizing:border-box; + height: 2em; + padding: 2px; +} + +.gresults-filter-operator { + width:70px; +} + +#gresults-results-filter-buttons { + clear:both; + margin-top:20px; + width:180px; +} + +.gresults-results-filter-field-label { + font-size:1.1em; + font-weight:bold; + margin-bottom:10px; +} + +.gresults-results-filter-field { + margin-bottom:20px; +} + +.gresults-results-filter-field ul li label { + margin-left:5px; +} + +.gresults-results-filter-title { + font-size:1.5em; + font-weight:bold; +} + +#gresults-results-filter { + visibility: hidden; +} + +#gresults-results-field-filters-container.resizable { + border-bottom:5px double #DDD; + min-height:120px; +} + +#gresults-results-field-filters { + height:100%; + overflow-y:auto; +} + +.ui-resizable { + position:relative; +} + +.ui-resizable-handle { + position:absolute; + font-size:0.1px; + z-index:99999; + display:block; +} + +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { + display:none; +} + +.ui-resizable-s { + cursor:s-resize; + height:7px; + width:100%; + bottom:-5px; + left:0px; +} + +.gsurvey-likert-score{ + margin-top:5px; +} \ No newline at end of file diff --git a/includes/addon/js/gaddon_results.js b/includes/addon/js/gaddon_results.js new file mode 100644 index 0000000..8c9a901 --- /dev/null +++ b/includes/addon/js/gaddon_results.js @@ -0,0 +1,468 @@ +var gresultsAjaxRequest; + +var gresults = { + + drawCharts: function () { + var containers = jQuery('.gresults-chart-wrapper'); + containers.each(function (index, elem) { + var id = jQuery(elem).attr('id'); + var options = jQuery(elem).data('options'); + var datatable = jQuery(elem).data('datatable'); + var chartType = jQuery(elem).data('charttype'); + var data_array = datatable; + var data = google.visualization.arrayToDataTable(data_array); + var cont = document.getElementById(id); + var chart; + if (chartType == "bar") { + chart = new google.visualization.BarChart(cont); + } else if (chartType == "pie") { + chart = new google.visualization.PieChart(cont); + } else if (chartType == "column") { + chart = new google.visualization.ColumnChart(cont); + } + chart.draw(data, options); + }); + }, + + renderStateData: function (state) { + jQuery("#gresults-results").data('searchcriteria', state.searchCriteria) + jQuery("#gresults-results-filter").html(state.filterUI); + jQuery("#gresults-results").css('opacity', 0); + jQuery("#gresults-results").html(state.html); + gresults.drawCharts(); + jQuery("#gresults-results").fadeTo("slow", 1); + + var filterContainer = jQuery("#gresults-results-field-filters-container"); + filterContainer.resizable(); + filterContainer.resizable('destroy'); + filterContainer.resizable({ + handles: 's' + }); + }, + + getResults: function () { + gresults.recordFormState(); + var gresultsData = jQuery('#gresults-results-filter-form').serialize(); + gresults.sendRequest(gresultsData) + }, + + sendRequest: function (gresultsData, serverStateObject, checkSum) { + var results = jQuery("#gresults-results"); + var filterButtons = jQuery("#gresults-results-filter-buttons input"); + var loading = jQuery(".gresults-filter-loading"); + var viewSlug = jQuery("#gresults-view-slug").val(); + var data_str = "action=gresults_get_results_" + viewSlug + "&" + gresultsData; + if (serverStateObject) + data_str += "&state=" + serverStateObject + "&checkSum=" + checkSum; + + gresultsAjaxRequest = jQuery.ajax({ + url : ajaxurl, + type : 'POST', + dataType : 'json', + data : data_str, + beforeSend: function (xhr, opts) { + results.fadeTo("slow", 0.33); + results.html(''); + loading.show(); + filterButtons.attr('disabled', 'disabled'); + } + }) + .done(function (response) { + if (response === -1) { + //permission denied + } + else { + if (response.status === "complete") { + filterButtons.removeAttr('disabled'); + loading.hide(); + results.html(response.html); + jQuery("#gresults-results").data('searchcriteria', response.searchCriteria) //used in 'more' links + + var filterUI = jQuery("#gresults-results-filter").html(); + + gresults.drawCharts(); + results.fadeTo("slow", 1); + if (window.history.replaceState) { + if (!history.state) { + history.replaceState({"html": response.html, "filterUI": filterUI, "searchCriteria": response.searchCriteria}, "", "?" + gresultsData); + } else { + history.pushState({"html": response.html, "filterUI": filterUI, "searchCriteria": response.searchCriteria}, "", "?" + gresultsData); + } + } + gresults.drawCharts(); + if (window["gform_initialize_tooltips"]) + gform_initialize_tooltips(); + } else if (response.status === "incomplete") { + serverStateObject = response.stateObject; + gresults.sendRequest(gresultsData, serverStateObject, response.checkSum); + results.html(response.html); + } else { + loading.hide(); + results.html(gresultsStrings.ajaxError); + } + } + }) + .fail(function (error) { + filterButtons.removeAttr('disabled'); + results.fadeTo("fast", 1); + var msg = error.statusText; + loading.hide(); + if (msg == "abort") { + msg = "Request cancelled"; + } else { + msg = gresultsStrings.ajaxError; + } + results.html(msg); + }) + }, + + getMoreResults: function (formId, fieldId) { + var container = jQuery('#gresults-results-field-content-' + fieldId); + var results = jQuery("#gresults-results"); + var offset = jQuery(container).data('offset'); + var viewSlug = jQuery("#gresults-view-slug").val(); + var searchCriteria = jQuery("#gresults-results").data('searchcriteria'); + jQuery.ajax({ + url : ajaxurl, + type : 'POST', + dataType: 'json', + data : {action: 'gresults_get_more_results_' + viewSlug, view: viewSlug, form_id: formId, field_id: fieldId, offset: offset, search_criteria: searchCriteria}, + success : function (response) { + if (response === -1) { + //permission denied + } + else { + + if (response.html) + jQuery(container).append(response.html); + if (response.remaining <= 0) + jQuery('#gresults-results-field-more-link-' + fieldId).hide(); + + jQuery(container).data('offset', offset + 10); + } + } + }); + + return false; + + }, + + setUpFilter: function () { + var i, j, k, l; + if (gresultsVars.filterFields.length == 0) + gresults.displayNoFieldsMessage(); + for (var i = 0; i < gresultsVars.filterFields.length; i++) { + jQuery("#gresults-results-field-filters").append(gresults.getNewFilterRow()); + } + jQuery(".gresults-filter-field").each(function (j) { + var fieldId = gresultsVars.filterFields[j]; + jQuery(this).val(fieldId); + jQuery(this).change(); + }); + jQuery(".gresults-filter-operator").each(function (k) { + var operator = gresultsVars.filterOperators[k]; + jQuery(this).val(operator); + jQuery(this).change(); + }); + jQuery(".gresults-filter-value").each(function (l) { + var value = gresultsVars.filterValues[l]; + jQuery(this).val(value); + jQuery(this).change(); + }); + gresults.maybeMakeResizable() + }, + + clearFilterForm: function () { + gresults.displayNoFieldsMessage(); + jQuery('#gresults-results-filter-form').find('input, select').each(function () { + switch (this.type) { + case 'text': + case 'select-one': + jQuery(this).val('').change(); + break; + case 'checkbox': + case 'radio': + this.checked = false; + } + }); + }, + + recordFormState: function () { + jQuery("#gresults-results-filter-form input[type='radio']").each(function () { + if (this.checked) { + jQuery(this).prop("defaultChecked", true); + } else { + jQuery(this).prop("defaultChecked", false); + } + }); + jQuery("#gresults-results-filter-form input[type='checkbox']").each(function () { + if (this.checked) { + jQuery(this).prop("defaultChecked", true); + } else { + jQuery(this).prop("defaultChecked", false); + } + }); + jQuery("#gresults-results-filter-form input[type='text']").each(function () { + jQuery(this).prop("defaultValue", jQuery(this).val()); + }); + jQuery("#gresults-results-filter-form select option").each(function () { + jQuery(this).prop("defaultSelected", jQuery(this).prop('selected')); + }); + }, + + getNewFilterRow: function () { + var str; + str = "
    "; + str += gresults.getFilterFields() + gresults.getFilterOperators() + gresults.getFilterValues() + gresults.getAddRemoveButtons(); + str += "
    "; + return str; + }, + + getFilterFields: function () { + var i, j, key, val, label, question, options = "", disabled = "", multipleRows, numRows, + str = ""; + str += ""; + return str; + }, + + changeField: function (fieldSelect) { + var filter = gresults.getFilter(fieldSelect.value) + if (filter) { + jQuery(fieldSelect).siblings(".gresults-filter-value").replaceWith(gresults.getFilterValues(filter)); + jQuery(fieldSelect).siblings(".gresults-filter-type").val(filter.type); + jQuery(fieldSelect).siblings(".gresults-filter-operator").replaceWith(gresults.getFilterOperators(filter)); + } + gresults.setDisabledFields(); + }, + + isFieldSelected: function (fieldId) { + fieldId = fieldId.toString(); + var selectedFields = []; + jQuery('.gresults-filter-field :selected').each(function (i, selected) { + selectedFields[i] = jQuery(selected).val(); + }); + return jQuery.inArray(fieldId, selectedFields) > -1 ? true : false; + }, + + getFilterOperators: function (filter) { + var str = ""; + return str; + }, + + getFilterValues: function (filter) { + var i, val, text, str, options = ""; + str = ""; + + if (filter) { + if (filter.values) { + for (i = 0; i < filter.values.length; i++) { + val = filter.values[i].value; + text = filter.values[i].text; + options += ""; + } + str = ""; + } + } + + return str; + }, + + cleanFieldId: function (fieldId) { + if (fieldId.indexOf("-") !== -1) { + var fieldIdArray = fieldId.split('-'); + fieldId = fieldIdArray[0]; + } + return fieldId + }, + + getFilter: function (key) { + if (!key) + return; + for (var i = 0; i < gresultsFilters.length; i++) { + if (key == gresultsFilters[i].key) + return gresultsFilters[i]; + if (gresultsFilters[i].type == "group") { + for (var j = 0; j < gresultsFilters[i].filters.length; j++) { + if (key == gresultsFilters[i].filters[j].key) + return gresultsFilters[i].filters[j]; + } + } + + } + }, + + getFieldIndex: function (fieldId) { + for (var i = 0; i < gresultsFields.length; i++) { + if (gresultsFields[i].id == fieldId) + return i; + } + }, + + getAddRemoveButtons: function () { + var str = ""; + str += "" + gresultsStrings.addFieldFilter + ""; + str += "" + gresultsStrings.removeFieldFilter + ""; + return str; + }, + + addNewFieldFilter: function (img) { + jQuery(img).parent().after(gresults.getNewFilterRow()); + jQuery(img).parent().next("div").find(".gresults-filter-field").change(); + gresults.maybeMakeResizable(); + }, + + maybeMakeResizable: function () { + var filterBox = jQuery("#gresults-results-field-filters"); + var filters = jQuery(".gresults-results-field-filter"); + var filtersContainer = jQuery("#gresults-results-field-filters-container"); + if (filters.length <= 1) { + if (jQuery(filtersContainer).hasClass('ui-resizable')) + filtersContainer.resizable('destroy'); + return; + } + var isResizable = (filterBox.get(0).scrollHeight > filtersContainer.height()) || filtersContainer.height() >= 120; + filtersContainer.toggleClass("resizable", isResizable); + if (isResizable) { + filtersContainer.resizable({ + handles : 's', + minHeight: 120 + }); + filterBox.css("min-height", 120); + } + }, + + removeFieldFilter: function (img) { + jQuery(img).parent().remove(); + if (jQuery(".gresults-results-field-filter").length == 0) + gresults.displayNoFieldsMessage(); + gresults.setDisabledFields(); + gresults.maybeMakeResizable(); + }, + + displayNoFieldsMessage: function () { + var str = ""; + str += "
    " + gresultsStrings.noFilters; + str += "" + gresultsStrings.addFieldFilter + "
    "; + jQuery("#gresults-results-field-filters").html(str); + jQuery("#gresults-results-field-filters-container").removeClass('resizable'); + jQuery("#gresults-results-field-filters-container").height(55); + jQuery("#gresults-results-field-filters").css("min-height", ''); + }, + + setDisabledFields: function () { + jQuery("select.gresults-filter-field option").removeAttr("disabled"); + jQuery("select.gresults-filter-field").each(function (i) { + var filter = gresults.getFilter(this.value); + if (typeof(filter) != 'undefined' && filter.preventMultiple && gresults.isFieldSelected(this.value)) { + jQuery("select.gresults-filter-field option[value='" + this.value + "']:not(:selected)").attr('disabled', 'disabled'); + } + }); + + }, + + getFieldType: function (fieldId) { + for (var i = 0; i < gresultsFields.length; i++) { + if (gresultsFields[i].id == fieldId) + return gresultsFields[i].inputType; + } + } + + +}; + +google.load('visualization', '1', {packages: ['corechart']}); +google.setOnLoadCallback(gresults.drawCharts); + + +jQuery(document).ready(function () { + + if (jQuery("#gresults-results").length > 0) { + var $window = jQuery(window), + filter = jQuery('#gresults-results-filter'), + filterTop = filter.offset().top, + gresultsIsFilterSticky, + resultsDiv = jQuery('#gresults-results'), + gresultsFilterLeftMargin = 20, + gresultsFilterLeft, + gresultsFilterRelativeLeft; + + function gresultsPostionFilterUI() { + gresultsFilterLeft = resultsDiv.width() + resultsDiv.offset().left + gresultsFilterLeftMargin; + filter.offset({left: gresultsFilterLeft}); + gresultsFilterRelativeLeft = resultsDiv.width() + gresultsFilterLeftMargin; + jQuery("#gresults-results-filter").css('visibility', 'visible'); + } + + $window.scroll(function (e) { + var newIsFilterSticky = $window.scrollTop() > filterTop - 30; + if (gresultsIsFilterSticky != newIsFilterSticky) { + gresultsIsFilterSticky = newIsFilterSticky + if (gresultsIsFilterSticky) { + filter.css("left", gresultsFilterLeft); + } else { + filter.css("left", gresultsFilterRelativeLeft); + } + } + filter.toggleClass('sticky', gresultsIsFilterSticky); + }); + + window.onpopstate = function (e) { + if (e.state) + gresults.renderStateData(e.state) + }; + + $window.resize(function (e) { + if (e.target === window) { + gresultsPostionFilterUI(); + gresults.drawCharts(); + } + + }); + + gresultsPostionFilterUI(); + gresults.setUpFilter(); + + jQuery("#gresults-results-filter-date-start, #gresults-results-filter-date-end").datepicker({dateFormat: 'yy-mm-dd', changeMonth: true, changeYear: true}); + + jQuery("#gresults-results-filter-form").submit(function (e) { + gresults.getResults(); + return false; + }); + + if (history.state) { + gresults.renderStateData(history.state) + } else { + gresults.getResults(); + } + if (window["gform_initialize_tooltips"]) + gform_initialize_tooltips(); + + } +}); \ No newline at end of file diff --git a/js.php b/js.php old mode 100755 new mode 100644 index 118cd0c..6ea8424 --- a/js.php +++ b/js.php @@ -309,7 +309,14 @@ function SaveForm(isNew){ if(!ValidateForm()){ return false; } - + + // remove data that is no longer stored in the form object (as of 1.7) + delete form.notification; + delete form.autoResponder; + delete form.notifications; + delete form.confirmation; + delete form.confirmations; + //updating original json. used when verifying if there has been any changes unsaved changed before leaving the page var form_json = jQuery.toJSON(form); gforms_original_json = form_json; @@ -570,7 +577,10 @@ function SetDefaultValues(field){ field.inputType = "singleproduct"; if(field.inputType == "singleproduct" || field.inputType == "hiddenproduct" || field.inputType == "calculation"){ - field.inputs = [new Input(field.id + 0.1, ''), new Input(field.id + 0.2, ''), new Input(field.id + 0.3, '')]; + //convert field id to a number so it isn't treated as a string + //caused concatenation below instead of addition + field_id = parseFloat(field.id); + field.inputs = [new Input(field_id + 0.1, ''), new Input(field_id + 0.2, ''), new Input(field_id + 0.3, '')]; field.enablePrice = null; } diff --git a/js/chosen.jquery.min.js b/js/chosen.jquery.min.js old mode 100755 new mode 100644 index 28a4e6c..1215390 --- a/js/chosen.jquery.min.js +++ b/js/chosen.jquery.min.js @@ -1,10 +1,10 @@ // Chosen, a Select Box Enhancer for jQuery and Protoype // by Patrick Filler for Harvest, http://getharvest.com // -// Version 0.9.8 +// Version 0.9.12 // Full source at https://github.com/harvesthq/chosen // Copyright (c) 2011 Harvest http://getharvest.com // MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md // This file is generated by `cake build`, do not edit it by hand. -((function(){var a;a=function(){function a(){this.options_index=0,this.parsed=[]}return a.prototype.add_node=function(a){return a.nodeName==="OPTGROUP"?this.add_group(a):this.add_option(a)},a.prototype.add_group=function(a){var b,c,d,e,f,g;b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:a.label,children:0,disabled:a.disabled}),f=a.childNodes,g=[];for(d=0,e=f.length;d"+a.html+"")},a.prototype.results_update_field=function(){return this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.result_single_selected=null,this.results_build()},a.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},a.prototype.results_search=function(a){return this.results_showing?this.winnow_results():this.results_show()},a.prototype.keyup_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale();switch(b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:a.preventDefault();if(this.results_showing)return this.result_select(a);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},a.prototype.generate_field_id=function(){var a;return a=this.generate_random_id(),this.form_field.id=a,a},a.prototype.generate_random_char=function(){var a,b,c;return a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",c=Math.floor(Math.random()*a.length),b=a.substring(c,c+1)},a}(),b.AbstractChosen=a}.call(this),function(){var a,b,c,d,e=Object.prototype.hasOwnProperty,f=function(a,b){function d(){this.constructor=a}for(var c in b)e.call(b,c)&&(a[c]=b[c]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a};d=this,a=jQuery,a.fn.extend({chosen:function(c){return!a.browser.msie||a.browser.version!=="6.0"&&a.browser.version!=="7.0"?this.each(function(d){var e;e=a(this);if(!e.hasClass("chzn-done"))return e.data("chosen",new b(this,c))}):this}}),b=function(b){function e(){e.__super__.constructor.apply(this,arguments)}return f(e,b),e.prototype.setup=function(){return this.form_field_jq=a(this.form_field),this.current_value=this.form_field_jq.val(),this.is_rtl=this.form_field_jq.hasClass("chzn-rtl")},e.prototype.finish_setup=function(){return this.form_field_jq.addClass("chzn-done")},e.prototype.set_up_html=function(){var b,d,e,f;return this.container_id=this.form_field.id.length?this.form_field.id.replace(/[^\w]/g,"_"):this.generate_field_id(),this.container_id+="_chzn",this.f_width=this.form_field_jq.outerWidth(),b=a("
    ",{id:this.container_id,"class":"chzn-container"+(this.is_rtl?" chzn-rtl":""),style:"width: "+this.f_width+"px;"}),this.is_multiple?b.html('
      '):b.html(''+this.default_text+'
        '),this.form_field_jq.hide().after(b),this.container=a("#"+this.container_id),this.container.addClass("chzn-container-"+(this.is_multiple?"multi":"single")),this.dropdown=this.container.find("div.chzn-drop").first(),d=this.container.height(),e=this.f_width-c(this.dropdown),this.dropdown.css({width:e+"px",top:d+"px"}),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chzn-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chzn-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chzn-search").first(),this.selected_item=this.container.find(".chzn-single").first(),f=e-c(this.search_container)-c(this.search_field),this.search_field.css({width:f+"px"})),this.results_build(),this.set_tab_index(),this.form_field_jq.trigger("liszt:ready",{chosen:this})},e.prototype.register_observers=function(){var a=this;return this.container.mousedown(function(b){return a.container_mousedown(b)}),this.container.mouseup(function(b){return a.container_mouseup(b)}),this.container.mouseenter(function(b){return a.mouse_enter(b)}),this.container.mouseleave(function(b){return a.mouse_leave(b)}),this.search_results.mouseup(function(b){return a.search_results_mouseup(b)}),this.search_results.mouseover(function(b){return a.search_results_mouseover(b)}),this.search_results.mouseout(function(b){return a.search_results_mouseout(b)}),this.form_field_jq.bind("liszt:updated",function(b){return a.results_update_field(b)}),this.search_field.blur(function(b){return a.input_blur(b)}),this.search_field.keyup(function(b){return a.keyup_checker(b)}),this.search_field.keydown(function(b){return a.keydown_checker(b)}),this.is_multiple?(this.search_choices.click(function(b){return a.choices_click(b)}),this.search_field.focus(function(b){return a.input_focus(b)})):this.container.click(function(a){return a.preventDefault()})},e.prototype.search_field_disabled=function(){this.is_disabled=this.form_field_jq[0].disabled;if(this.is_disabled)return this.container.addClass("chzn-disabled"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind("focus",this.activate_action),this.close_field();this.container.removeClass("chzn-disabled"),this.search_field[0].disabled=!1;if(!this.is_multiple)return this.selected_item.bind("focus",this.activate_action)},e.prototype.container_mousedown=function(b){var c;if(!this.is_disabled)return c=b!=null?a(b.target).hasClass("search-choice-close"):!1,b&&b.type==="mousedown"&&!this.results_showing&&b.stopPropagation(),!this.pending_destroy_click&&!c?(this.active_field?!this.is_multiple&&b&&(a(b.target)[0]===this.selected_item[0]||a(b.target).parents("a.chzn-single").length)&&(b.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),a(document).click(this.click_test_action),this.results_show()),this.activate_field()):this.pending_destroy_click=!1},e.prototype.container_mouseup=function(a){if(a.target.nodeName==="ABBR"&&!this.is_disabled)return this.results_reset(a)},e.prototype.blur_test=function(a){if(!this.active_field&&this.container.hasClass("chzn-container-active"))return this.close_field()},e.prototype.close_field=function(){return a(document).unbind("click",this.click_test_action),this.is_multiple||(this.selected_item.attr("tabindex",this.search_field.attr("tabindex")),this.search_field.attr("tabindex",-1)),this.active_field=!1,this.results_hide(),this.container.removeClass("chzn-container-active"),this.winnow_results_clear(),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},e.prototype.activate_field=function(){return!this.is_multiple&&!this.active_field&&(this.search_field.attr("tabindex",this.selected_item.attr("tabindex")),this.selected_item.attr("tabindex",-1)),this.container.addClass("chzn-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},e.prototype.test_active_click=function(b){return a(b.target).parents("#"+this.container_id).length?this.active_field=!0:this.close_field()},e.prototype.results_build=function(){var a,b,c,e,f;this.parsing=!0,this.results_data=d.SelectParser.select_to_array(this.form_field),this.is_multiple&&this.choices>0?(this.search_choices.find("li.search-choice").remove(),this.choices=0):this.is_multiple||(this.selected_item.addClass("chzn-default").find("span").text(this.default_text),this.form_field.options.length<=this.disable_search_threshold?this.container.addClass("chzn-container-single-nosearch"):this.container.removeClass("chzn-container-single-nosearch")),a="",f=this.results_data;for(c=0,e=f.length;c'+a("
        ").text(b.label).html()+"")},e.prototype.result_do_highlight=function(a){var b,c,d,e,f;if(a.length){this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClass("highlighted"),d=parseInt(this.search_results.css("maxHeight"),10),f=this.search_results.scrollTop(),e=d+f,c=this.result_highlight.position().top+this.search_results.scrollTop(),b=c+this.result_highlight.outerHeight();if(b>=e)return this.search_results.scrollTop(b-d>0?b-d:0);if(c'+b.html+''),d=a("#"+c).find("a").first(),d.click(function(a){return e.choice_destroy_link_click(a)}))},e.prototype.choice_destroy_link_click=function(b){return b.preventDefault(),this.is_disabled?b.stopPropagation:(this.pending_destroy_click=!0,this.choice_destroy(a(b.target)))},e.prototype.choice_destroy=function(a){return this.choices-=1,this.show_search_field_default(),this.is_multiple&&this.choices>0&&this.search_field.val().length<1&&this.results_hide(),this.result_deselect(a.attr("rel")),a.parents("li").first().remove()},e.prototype.results_reset=function(){this.form_field.options[0].selected=!0,this.selected_item.find("span").text(this.default_text),this.is_multiple||this.selected_item.addClass("chzn-default"),this.show_search_field_default(),this.results_reset_cleanup(),this.form_field_jq.trigger("change");if(this.active_field)return this.results_hide()},e.prototype.results_reset_cleanup=function(){return this.selected_item.find("abbr").remove()},e.prototype.result_select=function(a){var b,c,d,e;if(this.result_highlight)return b=this.result_highlight,c=b.attr("id"),this.result_clear_highlight(),this.is_multiple?this.result_deactivate(b):(this.search_results.find(".result-selected").removeClass("result-selected"),this.result_single_selected=b,this.selected_item.removeClass("chzn-default")),b.addClass("result-selected"),e=c.substr(c.lastIndexOf("_")+1),d=this.results_data[e],d.selected=!0,this.form_field.options[d.options_index].selected=!0,this.is_multiple?this.choice_build(d):(this.selected_item.find("span").first().text(d.text),this.allow_single_deselect&&this.single_deselect_control_build()),(!a.metaKey||!this.is_multiple)&&this.results_hide(),this.search_field.val(""),(this.is_multiple||this.form_field_jq.val()!==this.current_value)&&this.form_field_jq.trigger("change",{selected:this.form_field.options[d.options_index].value}),this.current_value=this.form_field_jq.val(),this.search_field_scale()},e.prototype.result_activate=function(a){return a.addClass("active-result")},e.prototype.result_deactivate=function(a){return a.removeClass("active-result")},e.prototype.result_deselect=function(b){var c,d;return d=this.results_data[b],d.selected=!1,this.form_field.options[d.options_index].selected=!1,c=a("#"+this.container_id+"_o_"+b),c.removeClass("result-selected").addClass("active-result").show(),this.result_clear_highlight(),this.winnow_results(),this.form_field_jq.trigger("change",{deselected:this.form_field.options[d.options_index].value}),this.search_field_scale()},e.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect&&this.selected_item.find("abbr").length<1)return this.selected_item.find("span").first().after('')},e.prototype.winnow_results=function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;this.no_results_clear(),j=0,k=this.search_field.val()===this.default_text?"":a("
        ").text(a.trim(this.search_field.val())).html(),g=this.search_contains?"":"^",f=new RegExp(g+k.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),n=new RegExp(k.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),s=this.results_data;for(o=0,q=s.length;o=0||c.html.indexOf("[")===0){e=c.html.replace(/\[|\]/g,"").split(" ");if(e.length)for(p=0,r=e.length;p"+c.html.substr(l+k.length),m=m.substr(0,l)+""+m.substr(l)):m=c.html,h.html(m),this.result_activate(h),c.group_array_index!=null&&a("#"+this.results_data[c.group_array_index].dom_id).css("display","list-item")):(this.result_highlight&&i===this.result_highlight.attr("id")&&this.result_clear_highlight(),this.result_deactivate(h))}}return j<1&&k.length?this.no_results(k):this.winnow_results_set_highlight()},e.prototype.winnow_results_clear=function(){var b,c,d,e,f;this.search_field.val(""),c=this.search_results.find("li"),f=[];for(d=0,e=c.length;d'+this.results_none_found+' ""'),c.find("span").first().html(b),this.search_results.append(c)},e.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},e.prototype.keydown_arrow=function(){var b,c;this.result_highlight?this.results_showing&&(c=this.result_highlight.nextAll("li.active-result").first(),c&&this.result_do_highlight(c)):(b=this.search_results.find("li.active-result").first(),b&&this.result_do_highlight(a(b)));if(!this.results_showing)return this.results_show()},e.prototype.keyup_arrow=function(){var a;if(!this.results_showing&&!this.is_multiple)return this.results_show();if(this.result_highlight)return a=this.result_highlight.prevAll("li.active-result"),a.length?this.result_do_highlight(a.first()):(this.choices>0&&this.results_hide(),this.result_clear_highlight())},e.prototype.keydown_backstroke=function(){return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke()):(this.pending_backstroke=this.search_container.siblings("li.search-choice").last(),this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus"))},e.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},e.prototype.keydown_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale(),b!==8&&this.pending_backstroke&&this.clear_backstroke();switch(b){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(a),this.mouse_on_container=!1;break;case 13:a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},e.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j;if(this.is_multiple){d=0,h=0,f="position:absolute; left: -1000px; top: -1000px; display:none;",g=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(i=0,j=g.length;i",{style:f}),c.text(this.search_field.val()),a("body").append(c),h=c.width()+25,c.remove(),h>this.f_width-10&&(h=this.f_width-10),this.search_field.css({width:h+"px"}),b=this.container.height(),this.dropdown.css({top:b+"px"})}},e.prototype.generate_random_id=function(){var b;b="sel"+this.generate_random_char()+this.generate_random_char()+this.generate_random_char();while(a("#"+b).length>0)b+=this.generate_random_char();return b},e}(AbstractChosen),c=function(a){var b;return b=a.outerWidth()-a.width()},d.get_side_border_padding=c}.call(this); \ No newline at end of file +(function(){var e;e=function(){function e(){this.options_index=0,this.parsed=[]}return e.prototype.add_node=function(e){return e.nodeName.toUpperCase()==="OPTGROUP"?this.add_group(e):this.add_option(e)},e.prototype.add_group=function(e){var t,n,r,i,s,o;t=this.parsed.length,this.parsed.push({array_index:t,group:!0,label:e.label,children:0,disabled:e.disabled}),s=e.childNodes,o=[];for(r=0,i=s.length;r"+e.html+"")},e.prototype.results_update_field=function(){return this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.result_single_selected=null,this.results_build()},e.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},e.prototype.results_search=function(e){return this.results_showing?this.winnow_results():this.results_show()},e.prototype.keyup_checker=function(e){var t,n;t=(n=e.which)!=null?n:e.keyCode,this.search_field_scale();switch(t){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:e.preventDefault();if(this.results_showing)return this.result_select(e);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},e.prototype.generate_field_id=function(){var e;return e=this.generate_random_id(),this.form_field.id=e,e},e.prototype.generate_random_char=function(){var e,t,n;return e="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",n=Math.floor(Math.random()*e.length),t=e.substring(n,n+1)},e}(),t.AbstractChosen=e}.call(this),function(){var e,t,n,r,i={}.hasOwnProperty,s=function(e,t){function r(){this.constructor=e}for(var n in t)i.call(t,n)&&(e[n]=t[n]);return r.prototype=t.prototype,e.prototype=new r,e.__super__=t.prototype,e};r=this,e=jQuery,e.fn.extend({chosen:function(n){var r,i,s;return s=navigator.userAgent.toLowerCase(),i=/(msie) ([\w.]+)/.exec(s)||[],r={name:i[1]||"",version:i[2]||"0"},r.name==="msie"&&(r.version==="6.0"||r.version==="7.0"&&document.documentMode===7)?this:this.each(function(r){var i;i=e(this);if(!i.hasClass("chzn-done"))return i.data("chosen",new t(this,n))})}}),t=function(t){function i(){return i.__super__.constructor.apply(this,arguments)}return s(i,t),i.prototype.setup=function(){return this.form_field_jq=e(this.form_field),this.current_value=this.form_field_jq.val(),this.is_rtl=this.form_field_jq.hasClass("chzn-rtl")},i.prototype.finish_setup=function(){return this.form_field_jq.addClass("chzn-done")},i.prototype.set_up_html=function(){var t,r,i,s,o,u;return this.container_id=this.form_field.id.length?this.form_field.id.replace(/[^\w]/g,"_"):this.generate_field_id(),this.container_id+="_chzn",t=["chzn-container"],t.push("chzn-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&t.push(this.form_field.className),this.is_rtl&&t.push("chzn-rtl"),this.f_width=this.form_field_jq.outerWidth(),i={id:this.container_id,"class":t.join(" "),style:"width: "+this.f_width+"px;",title:this.form_field.title},r=e("
        ",i),this.is_multiple?r.html('
          '):r.html(''+this.default_text+'
            '),this.form_field_jq.hide().after(r),this.container=e("#"+this.container_id),this.dropdown=this.container.find("div.chzn-drop").first(),s=this.container.height(),o=this.f_width-n(this.dropdown),this.dropdown.css({width:o+"px",top:s+"px"}),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chzn-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chzn-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chzn-search").first(),this.selected_item=this.container.find(".chzn-single").first(),u=o-n(this.search_container)-n(this.search_field),this.search_field.css({width:u+"px"})),this.results_build(),this.set_tab_index(),this.form_field_jq.trigger("liszt:ready",{chosen:this})},i.prototype.register_observers=function(){var e=this;return this.container.mousedown(function(t){return e.container_mousedown(t)}),this.container.mouseup(function(t){return e.container_mouseup(t)}),this.container.mouseenter(function(t){return e.mouse_enter(t)}),this.container.mouseleave(function(t){return e.mouse_leave(t)}),this.search_results.mouseup(function(t){return e.search_results_mouseup(t)}),this.search_results.mouseover(function(t){return e.search_results_mouseover(t)}),this.search_results.mouseout(function(t){return e.search_results_mouseout(t)}),this.form_field_jq.bind("liszt:updated",function(t){return e.results_update_field(t)}),this.form_field_jq.bind("liszt:activate",function(t){return e.activate_field(t)}),this.form_field_jq.bind("liszt:open",function(t){return e.container_mousedown(t)}),this.search_field.blur(function(t){return e.input_blur(t)}),this.search_field.keyup(function(t){return e.keyup_checker(t)}),this.search_field.keydown(function(t){return e.keydown_checker(t)}),this.search_field.focus(function(t){return e.input_focus(t)}),this.is_multiple?this.search_choices.click(function(t){return e.choices_click(t)}):this.container.click(function(e){return e.preventDefault()})},i.prototype.search_field_disabled=function(){this.is_disabled=this.form_field_jq[0].disabled;if(this.is_disabled)return this.container.addClass("chzn-disabled"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind("focus",this.activate_action),this.close_field();this.container.removeClass("chzn-disabled"),this.search_field[0].disabled=!1;if(!this.is_multiple)return this.selected_item.bind("focus",this.activate_action)},i.prototype.container_mousedown=function(t){var n;if(!this.is_disabled)return n=t!=null?e(t.target).hasClass("search-choice-close"):!1,t&&t.type==="mousedown"&&!this.results_showing&&t.preventDefault(),!this.pending_destroy_click&&!n?(this.active_field?!this.is_multiple&&t&&(e(t.target)[0]===this.selected_item[0]||e(t.target).parents("a.chzn-single").length)&&(t.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),e(document).click(this.click_test_action),this.results_show()),this.activate_field()):this.pending_destroy_click=!1},i.prototype.container_mouseup=function(e){if(e.target.nodeName==="ABBR"&&!this.is_disabled)return this.results_reset(e)},i.prototype.blur_test=function(e){if(!this.active_field&&this.container.hasClass("chzn-container-active"))return this.close_field()},i.prototype.close_field=function(){return e(document).unbind("click",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass("chzn-container-active"),this.winnow_results_clear(),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},i.prototype.activate_field=function(){return this.container.addClass("chzn-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},i.prototype.test_active_click=function(t){return e(t.target).parents("#"+this.container_id).length?this.active_field=!0:this.close_field()},i.prototype.results_build=function(){var e,t,n,i,s;this.parsing=!0,this.results_data=r.SelectParser.select_to_array(this.form_field),this.is_multiple&&this.choices>0?(this.search_choices.find("li.search-choice").remove(),this.choices=0):this.is_multiple||(this.selected_item.addClass("chzn-default").find("span").text(this.default_text),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?this.container.addClass("chzn-container-single-nosearch"):this.container.removeClass("chzn-container-single-nosearch")),e="",s=this.results_data;for(n=0,i=s.length;n'+e("
            ").text(t.label).html()+"")},i.prototype.result_do_highlight=function(e){var t,n,r,i,s;if(e.length){this.result_clear_highlight(),this.result_highlight=e,this.result_highlight.addClass("highlighted"),r=parseInt(this.search_results.css("maxHeight"),10),s=this.search_results.scrollTop(),i=r+s,n=this.result_highlight.position().top+this.search_results.scrollTop(),t=n+this.result_highlight.outerHeight();if(t>=i)return this.search_results.scrollTop(t-r>0?t-r:0);if(n'+t.html+"":r='
          • '+t.html+'
          • ',this.search_container.before(r),i=e("#"+n).find("a").first(),i.click(function(e){return s.choice_destroy_link_click(e)}))},i.prototype.choice_destroy_link_click=function(t){return t.preventDefault(),this.is_disabled?t.stopPropagation:(this.pending_destroy_click=!0,this.choice_destroy(e(t.target)))},i.prototype.choice_destroy=function(e){if(this.result_deselect(e.attr("rel")))return this.choices-=1,this.show_search_field_default(),this.is_multiple&&this.choices>0&&this.search_field.val().length<1&&this.results_hide(),e.parents("li").first().remove(),this.search_field_scale()},i.prototype.results_reset=function(){this.form_field.options[0].selected=!0,this.selected_item.find("span").text(this.default_text),this.is_multiple||this.selected_item.addClass("chzn-default"),this.show_search_field_default(),this.results_reset_cleanup(),this.form_field_jq.trigger("change");if(this.active_field)return this.results_hide()},i.prototype.results_reset_cleanup=function(){return this.current_value=this.form_field_jq.val(),this.selected_item.find("abbr").remove()},i.prototype.result_select=function(e){var t,n,r,i;if(this.result_highlight)return t=this.result_highlight,n=t.attr("id"),this.result_clear_highlight(),this.is_multiple?this.result_deactivate(t):(this.search_results.find(".result-selected").removeClass("result-selected"),this.result_single_selected=t,this.selected_item.removeClass("chzn-default")),t.addClass("result-selected"),i=n.substr(n.lastIndexOf("_")+1),r=this.results_data[i],r.selected=!0,this.form_field.options[r.options_index].selected=!0,this.is_multiple?this.choice_build(r):(this.selected_item.find("span").first().text(r.text),this.allow_single_deselect&&this.single_deselect_control_build()),(!e.metaKey&&!e.ctrlKey||!this.is_multiple)&&this.results_hide(),this.search_field.val(""),(this.is_multiple||this.form_field_jq.val()!==this.current_value)&&this.form_field_jq.trigger("change",{selected:this.form_field.options[r.options_index].value}),this.current_value=this.form_field_jq.val(),this.search_field_scale()},i.prototype.result_activate=function(e){return e.addClass("active-result")},i.prototype.result_deactivate=function(e){return e.removeClass("active-result")},i.prototype.result_deselect=function(t){var n,r;return r=this.results_data[t],this.form_field.options[r.options_index].disabled?!1:(r.selected=!1,this.form_field.options[r.options_index].selected=!1,n=e("#"+this.container_id+"_o_"+t),n.removeClass("result-selected").addClass("active-result").show(),this.result_clear_highlight(),this.winnow_results(),this.form_field_jq.trigger("change",{deselected:this.form_field.options[r.options_index].value}),this.search_field_scale(),!0)},i.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect&&this.selected_item.find("abbr").length<1)return this.selected_item.find("span").first().after('')},i.prototype.winnow_results=function(){var t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y;this.no_results_clear(),f=0,l=this.search_field.val()===this.default_text?"":e("
            ").text(e.trim(this.search_field.val())).html(),o=this.search_contains?"":"^",s=new RegExp(o+l.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),p=new RegExp(l.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),y=this.results_data;for(d=0,m=y.length;d=0||n.html.indexOf("[")===0)){i=n.html.replace(/\[|\]/g,"").split(" ");if(i.length)for(v=0,g=i.length;v"+n.html.substr(c+l.length),h=h.substr(0,c)+""+h.substr(c)):h=n.html,u.html(h),this.result_activate(u),n.group_array_index!=null&&e("#"+this.results_data[n.group_array_index].dom_id).css("display","list-item")):(this.result_highlight&&a===this.result_highlight.attr("id")&&this.result_clear_highlight(),this.result_deactivate(u))}}return f<1&&l.length?this.no_results(l):this.winnow_results_set_highlight()},i.prototype.winnow_results_clear=function(){var t,n,r,i,s;this.search_field.val(""),n=this.search_results.find("li"),s=[];for(r=0,i=n.length;r'+this.results_none_found+' ""'),n.find("span").first().html(t),this.search_results.append(n)},i.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},i.prototype.keydown_arrow=function(){var t,n;this.result_highlight?this.results_showing&&(n=this.result_highlight.nextAll("li.active-result").first(),n&&this.result_do_highlight(n)):(t=this.search_results.find("li.active-result").first(),t&&this.result_do_highlight(e(t)));if(!this.results_showing)return this.results_show()},i.prototype.keyup_arrow=function(){var e;if(!this.results_showing&&!this.is_multiple)return this.results_show();if(this.result_highlight)return e=this.result_highlight.prevAll("li.active-result"),e.length?this.result_do_highlight(e.first()):(this.choices>0&&this.results_hide(),this.result_clear_highlight())},i.prototype.keydown_backstroke=function(){var e;if(this.pending_backstroke)return this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke();e=this.search_container.siblings("li.search-choice").last();if(e.length&&!e.hasClass("search-choice-disabled"))return this.pending_backstroke=e,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus")},i.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},i.prototype.keydown_checker=function(e){var t,n;t=(n=e.which)!=null?n:e.keyCode,this.search_field_scale(),t!==8&&this.pending_backstroke&&this.clear_backstroke();switch(t){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(e),this.mouse_on_container=!1;break;case 13:e.preventDefault();break;case 38:e.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},i.prototype.search_field_scale=function(){var t,n,r,i,s,o,u,a,f;if(this.is_multiple){r=0,u=0,s="position:absolute; left: -1000px; top: -1000px; display:none;",o=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(a=0,f=o.length;a",{style:s}),n.text(this.search_field.val()),e("body").append(n),u=n.width()+25,n.remove(),u>this.f_width-10&&(u=this.f_width-10),this.search_field.css({width:u+"px"}),t=this.container.height(),this.dropdown.css({top:t+"px"})}},i.prototype.generate_random_id=function(){var t;t="sel"+this.generate_random_char()+this.generate_random_char()+this.generate_random_char();while(e("#"+t).length>0)t+=this.generate_random_char();return t},i}(AbstractChosen),r.Chosen=t,n=function(e){var t;return t=e.outerWidth()-e.width()},r.get_side_border_padding=n}.call(this); \ No newline at end of file diff --git a/js/conditional_logic.js b/js/conditional_logic.js old mode 100755 new mode 100644 index 8d8add3..01d3f02 --- a/js/conditional_logic.js +++ b/js/conditional_logic.js @@ -1,292 +1,293 @@ - -var __gf_timeout_handle; - -function gf_apply_rules(formId, fields, isInit){ - var rule_applied = 0; - for(var i=0; i < fields.length; i++){ - gf_apply_field_rule(formId, fields[i], isInit, function(){ - rule_applied++; - if(rule_applied == fields.length){ - jQuery(document).trigger('gform_post_conditional_logic', [formId, fields, isInit]); - if(window["gformCalculateTotalPrice"]) - window["gformCalculateTotalPrice"](formId); - } - }); - } -} - -function gf_check_field_rule(formId, fieldId, isInit, callback){ - - //if conditional logic is not specified for that field, it is supposed to be displayed - if(!window["gf_form_conditional_logic"][formId] || !window["gf_form_conditional_logic"][formId]["logic"][fieldId]) - return "show"; - - var conditionalLogic = window["gf_form_conditional_logic"][formId]["logic"][fieldId]; - var action = gf_get_field_action(formId, conditionalLogic["section"]); - - //If section is hidden, always hide field. If section is displayed, see if field is supposed to be displayed or hidden - if(action != "hide") - action = gf_get_field_action(formId, conditionalLogic["field"]); - - return action; -} - -function gf_apply_field_rule(formId, fieldId, isInit, callback){ - - var action = gf_check_field_rule(formId, fieldId, isInit, callback); - - gf_do_field_action(formId, action, fieldId, isInit, callback); - - var conditionalLogic = window["gf_form_conditional_logic"][formId]["logic"][fieldId]; - //perform conditional logic for the next button - if(conditionalLogic["nextButton"]){ - action = gf_get_field_action(formId, conditionalLogic["nextButton"]); - gf_do_next_button_action(formId, action, fieldId, isInit); - } - -} - -function gf_get_field_action(formId, conditionalLogic){ - if(!conditionalLogic) - return "show"; - - var matches = 0; - for(var i = 0; i < conditionalLogic["rules"].length; i++){ - var rule = conditionalLogic["rules"][i]; - if(gf_is_match(formId, rule)) - matches++; - } - - var action; - if( (conditionalLogic["logicType"] == "all" && matches == conditionalLogic["rules"].length) || (conditionalLogic["logicType"] == "any" && matches > 0) ) - action = conditionalLogic["actionType"]; - else - action = conditionalLogic["actionType"] == "show" ? "hide" : "show"; - - return action; -} - -function gf_is_match(formId, rule){ - - var inputs = jQuery("#input_" + formId + "_" + rule["fieldId"] + " input"); - - if(inputs.length > 0){ - //handling checkboxes/radio - for(var i=0; i< inputs.length; i++){ - var fieldValue = gf_get_value(jQuery(inputs[i]).val()); - - //find specific checkbox/radio item. Skip if this is not the specific item and the operator is not one that targets a range of values (i.e. greater than and less than) - var isRangeOperator = jQuery.inArray(rule["operator"], ["<", ">"]) >= 0; - if(fieldValue != rule["value"] && !isRangeOperator) - continue; - - //blank value if item isn't checked - if(!jQuery(inputs[i]).is(":checked")) - fieldValue = ""; - - if(gf_matches_operation(fieldValue, rule["value"], rule["operator"])){ - return true; - } - } - } - else{ - //handling all other fields (non-checkboxes) - var val = jQuery("#input_" + formId + "_" + rule["fieldId"]).val(); - - //transform regular value into array to support multi-select (which returns an array of selected items) - var values = (val instanceof Array) ? val : [val]; - - var matchCount = 0; - for(var i=0; i < values.length; i++){ - var fieldValue = gf_get_value(values[i]); - if(gf_matches_operation(fieldValue, rule["value"], rule["operator"])){ - matchCount++; - } - } - //If operator is Is Not, none of the value can match - return rule["operator"] == "isnot" ? matchCount == values.length : matchCount > 0; - } - return false; -} - -function gf_try_convert_float(text){ - var format = window["gf_number_format"] == "decimal_comma" ? "decimal_comma" : "decimal_dot"; - - if(gformIsNumeric(text, format)){ - var decimal_separator = format == "decimal_comma" ? "," : "."; - return gformCleanNumber(text, "", "", decimal_separator); - } - - return text; -} - -function gf_matches_operation(val1, val2, operation){ - val1 = val1 ? val1.toLowerCase() : ""; - val2 = val2 ? val2.toLowerCase() : ""; - - switch(operation){ - case "is" : - return val1 == val2; - break; - - case "isnot" : - return val1 != val2; - break; - - case ">" : - val1 = gf_try_convert_float(val1); - val2 = gf_try_convert_float(val2); - - return val1 > val2; - break; - - case "<" : - val1 = gf_try_convert_float(val1); - val2 = gf_try_convert_float(val2); - - return val1 < val2; - break; - - case "contains" : - return val1.indexOf(val2) >=0; - break; - - case "starts_with" : - return val1.indexOf(val2) ==0; - break; - - case "ends_with" : - var start = val1.length - val2.length; - if(start < 0) - return false; - - var tail = val1.substring(start); - return val2 == tail; - break; - } - return false; -} - -function gf_get_value(val){ - if(!val) - return ""; - - val = val.split("|"); - return val[0]; -} - -function gf_do_field_action(formId, action, fieldId, isInit, callback){ - var conditional_logic = window["gf_form_conditional_logic"][formId]; - var dependent_fields = conditional_logic["dependents"][fieldId]; - - for(var i=0; i < dependent_fields.length; i++){ - var targetId = fieldId == 0 ? "#gform_submit_button_" + formId : "#field_" + formId + "_" + dependent_fields[i]; - - //calling callback function on the last dependent field, to make sure it is only called once - do_callback = (i+1) == dependent_fields.length ? callback : null; - - gf_do_action(action, targetId, conditional_logic["animation"], conditional_logic["defaults"][dependent_fields[i]], isInit, do_callback); - } -} - -function gf_do_next_button_action(formId, action, fieldId, isInit){ - var conditional_logic = window["gf_form_conditional_logic"][formId]; - var targetId = "#gform_next_button_" + formId + "_" + fieldId; - - gf_do_action(action, targetId, conditional_logic["animation"], null, isInit); -} - -function gf_do_action(action, targetId, useAnimation, defaultValues, isInit, callback){ - if(action == "show"){ - if(useAnimation && !isInit){ - if(jQuery(targetId).length > 0) - jQuery(targetId).slideDown(callback); - else if(callback) - callback(); - - } - else{ - jQuery(targetId).show(); - if(callback) - callback(); - - } - } - else{ - //if field is not already hidden, reset its values to the default - var child = jQuery(targetId).children().first(); - - if(!gformIsHidden(child)){ - gf_reset_to_default(targetId, defaultValues); - } - - if(useAnimation && !isInit){ - if(jQuery(targetId).length > 0) - jQuery(targetId).slideUp(callback); - else if(callback) - callback(); - } - else{ - jQuery(targetId).hide(); - if(callback) - callback(); - } - } -} - -function gf_reset_to_default(targetId, defaultValue){ - //cascading down conditional logic to children to suppport nested conditions - //text fields and drop downs - var target = jQuery(targetId).find('select, input[type="text"], input[type="number"], textarea'); - - var target_index = 0; - - target.each(function(){ - var val = ""; - - if(jQuery(this).is('select:not([multiple])')){ - val = jQuery(this).find('option').eq(0).val(); - } - - //get name of previous input field to see if it is the radio button which goes with the "Other" text box - //otherwise field is populated with input field name - var radio_button_name = jQuery(this).prev("input").attr("value"); - if(radio_button_name == "gf_other_choice"){ - val = jQuery(this).attr("value"); - } - else if(jQuery.isArray(defaultValue)){ - val = defaultValue[target_index]; - } - else if(jQuery.isPlainObject(defaultValue)){ - val = defaultValue[jQuery(this).attr("name")]; - } - else if(defaultValue){ - val = defaultValue; - } - - jQuery(this).val(val).trigger('change'); - target_index++; - }); - - //checkboxes and radio buttons - var elements = jQuery(targetId).find('input[type="radio"], input[type="checkbox"]'); - - elements.each(function(){ - - //is input currently checked? - var isChecked = jQuery(this).is(':checked') ? true : false; - - //does input need to be marked as checked or unchecked? - var doCheck = defaultValue ? jQuery.inArray(jQuery(this).attr('id'), defaultValue) > -1 : false; - - //if value changed, trigger click event - if(isChecked != doCheck){ - //setting input as checked or unchecked appropriately - jQuery(this).prop("checked", doCheck); - - //need to set the prop again after the click is triggered - jQuery(this).trigger('click').prop('checked', doCheck); - } - }); -} - + +var __gf_timeout_handle; + +function gf_apply_rules(formId, fields, isInit){ + var rule_applied = 0; + for(var i=0; i < fields.length; i++){ + gf_apply_field_rule(formId, fields[i], isInit, function(){ + rule_applied++; + if(rule_applied == fields.length){ + jQuery(document).trigger('gform_post_conditional_logic', [formId, fields, isInit]); + if(window["gformCalculateTotalPrice"]) + window["gformCalculateTotalPrice"](formId); + } + }); + } +} + +function gf_check_field_rule(formId, fieldId, isInit, callback){ + + //if conditional logic is not specified for that field, it is supposed to be displayed + if(!window["gf_form_conditional_logic"] || !window["gf_form_conditional_logic"][formId] || !window["gf_form_conditional_logic"][formId]["logic"][fieldId]) + return "show"; + + var conditionalLogic = window["gf_form_conditional_logic"][formId]["logic"][fieldId]; + var action = gf_get_field_action(formId, conditionalLogic["section"]); + + //If section is hidden, always hide field. If section is displayed, see if field is supposed to be displayed or hidden + if(action != "hide") + action = gf_get_field_action(formId, conditionalLogic["field"]); + + return action; +} + +function gf_apply_field_rule(formId, fieldId, isInit, callback){ + + var action = gf_check_field_rule(formId, fieldId, isInit, callback); + + gf_do_field_action(formId, action, fieldId, isInit, callback); + + var conditionalLogic = window["gf_form_conditional_logic"][formId]["logic"][fieldId]; + //perform conditional logic for the next button + if(conditionalLogic["nextButton"]){ + action = gf_get_field_action(formId, conditionalLogic["nextButton"]); + gf_do_next_button_action(formId, action, fieldId, isInit); + } + +} + +function gf_get_field_action(formId, conditionalLogic){ + if(!conditionalLogic) + return "show"; + + var matches = 0; + for(var i = 0; i < conditionalLogic["rules"].length; i++){ + var rule = conditionalLogic["rules"][i]; + if(gf_is_match(formId, rule)) + matches++; + } + + var action; + if( (conditionalLogic["logicType"] == "all" && matches == conditionalLogic["rules"].length) || (conditionalLogic["logicType"] == "any" && matches > 0) ) + action = conditionalLogic["actionType"]; + else + action = conditionalLogic["actionType"] == "show" ? "hide" : "show"; + + return action; +} + +function gf_is_match(formId, rule){ + + var isMatch = false; + var inputs = jQuery("#input_" + formId + "_" + rule["fieldId"] + " input"); + + if(inputs.length > 0){ + //handling checkboxes/radio + for(var i=0; i< inputs.length; i++){ + var fieldValue = gf_get_value(jQuery(inputs[i]).val()); + + //find specific checkbox/radio item. Skip if this is not the specific item and the operator is not one that targets a range of values (i.e. greater than and less than) + var isRangeOperator = jQuery.inArray(rule["operator"], ["<", ">"]) >= 0; + if(fieldValue != rule["value"] && !isRangeOperator) + continue; + + //blank value if item isn't checked + if(!jQuery(inputs[i]).is(":checked")) + fieldValue = ""; + + if(gf_matches_operation(fieldValue, rule["value"], rule["operator"])) + isMatch = true; + } + } + else{ + //handling all other fields (non-checkboxes) + var val = jQuery("#input_" + formId + "_" + rule["fieldId"]).val(); + + //transform regular value into array to support multi-select (which returns an array of selected items) + var values = (val instanceof Array) ? val : [val]; + + var matchCount = 0; + for(var i=0; i < values.length; i++){ + var fieldValue = gf_get_value(values[i]); + if(gf_matches_operation(fieldValue, rule["value"], rule["operator"])){ + matchCount++; + } + } + //If operator is Is Not, none of the value can match + isMatch = rule["operator"] == "isnot" ? matchCount == values.length : matchCount > 0; + } + + return gform.applyFilters( 'gform_is_value_match', isMatch, formId, rule ); +} + +function gf_try_convert_float(text){ + var format = window["gf_number_format"] == "decimal_comma" ? "decimal_comma" : "decimal_dot"; + + if(gformIsNumeric(text, format)){ + var decimal_separator = format == "decimal_comma" ? "," : "."; + return gformCleanNumber(text, "", "", decimal_separator); + } + + return text; +} + +function gf_matches_operation(val1, val2, operation){ + val1 = val1 ? val1.toLowerCase() : ""; + val2 = val2 ? val2.toLowerCase() : ""; + + switch(operation){ + case "is" : + return val1 == val2; + break; + + case "isnot" : + return val1 != val2; + break; + + case ">" : + val1 = gf_try_convert_float(val1); + val2 = gf_try_convert_float(val2); + + return val1 > val2; + break; + + case "<" : + val1 = gf_try_convert_float(val1); + val2 = gf_try_convert_float(val2); + + return val1 < val2; + break; + + case "contains" : + return val1.indexOf(val2) >=0; + break; + + case "starts_with" : + return val1.indexOf(val2) ==0; + break; + + case "ends_with" : + var start = val1.length - val2.length; + if(start < 0) + return false; + + var tail = val1.substring(start); + return val2 == tail; + break; + } + return false; +} + +function gf_get_value(val){ + if(!val) + return ""; + + val = val.split("|"); + return val[0]; +} + +function gf_do_field_action(formId, action, fieldId, isInit, callback){ + var conditional_logic = window["gf_form_conditional_logic"][formId]; + var dependent_fields = conditional_logic["dependents"][fieldId]; + + for(var i=0; i < dependent_fields.length; i++){ + var targetId = fieldId == 0 ? "#gform_submit_button_" + formId : "#field_" + formId + "_" + dependent_fields[i]; + + //calling callback function on the last dependent field, to make sure it is only called once + do_callback = (i+1) == dependent_fields.length ? callback : null; + + gf_do_action(action, targetId, conditional_logic["animation"], conditional_logic["defaults"][dependent_fields[i]], isInit, do_callback); + } +} + +function gf_do_next_button_action(formId, action, fieldId, isInit){ + var conditional_logic = window["gf_form_conditional_logic"][formId]; + var targetId = "#gform_next_button_" + formId + "_" + fieldId; + + gf_do_action(action, targetId, conditional_logic["animation"], null, isInit); +} + +function gf_do_action(action, targetId, useAnimation, defaultValues, isInit, callback){ + if(action == "show"){ + if(useAnimation && !isInit){ + if(jQuery(targetId).length > 0) + jQuery(targetId).slideDown(callback); + else if(callback) + callback(); + + } + else{ + jQuery(targetId).show(); + if(callback) + callback(); + + } + } + else{ + //if field is not already hidden, reset its values to the default + var child = jQuery(targetId).children().first(); + + if(!gformIsHidden(child)){ + gf_reset_to_default(targetId, defaultValues); + } + + if(useAnimation && !isInit){ + if(jQuery(targetId).length > 0) + jQuery(targetId).slideUp(callback); + else if(callback) + callback(); + } + else{ + jQuery(targetId).hide(); + if(callback) + callback(); + } + } +} + +function gf_reset_to_default(targetId, defaultValue){ + //cascading down conditional logic to children to suppport nested conditions + //text fields and drop downs + var target = jQuery(targetId).find('select, input[type="text"], input[type="number"], textarea'); + + var target_index = 0; + + target.each(function(){ + var val = ""; + + if(jQuery(this).is('select:not([multiple])')){ + val = jQuery(this).find('option').eq(0).val(); + } + + //get name of previous input field to see if it is the radio button which goes with the "Other" text box + //otherwise field is populated with input field name + var radio_button_name = jQuery(this).prev("input").attr("value"); + if(radio_button_name == "gf_other_choice"){ + val = jQuery(this).attr("value"); + } + else if(jQuery.isArray(defaultValue)){ + val = defaultValue[target_index]; + } + else if(jQuery.isPlainObject(defaultValue)){ + val = defaultValue[jQuery(this).attr("name")]; + } + else if(defaultValue){ + val = defaultValue; + } + + jQuery(this).val(val).trigger('change'); + target_index++; + }); + + //checkboxes and radio buttons + var elements = jQuery(targetId).find('input[type="radio"], input[type="checkbox"]'); + + elements.each(function(){ + + //is input currently checked? + var isChecked = jQuery(this).is(':checked') ? true : false; + + //does input need to be marked as checked or unchecked? + var doCheck = defaultValue ? jQuery.inArray(jQuery(this).attr('id'), defaultValue) > -1 : false; + + //if value changed, trigger click event + if(isChecked != doCheck){ + //setting input as checked or unchecked appropriately + jQuery(this).prop("checked", doCheck); + + //need to set the prop again after the click is triggered + jQuery(this).trigger('click').prop('checked', doCheck); + } + }); +} + diff --git a/js/confirmation_editor.js b/js/confirmation_editor.js old mode 100755 new mode 100644 diff --git a/js/datepicker.js b/js/datepicker.js old mode 100755 new mode 100644 diff --git a/js/floatmenu_init.js b/js/floatmenu_init.js old mode 100755 new mode 100644 index 316ec9b..ec307f5 --- a/js/floatmenu_init.js +++ b/js/floatmenu_init.js @@ -1,15 +1,15 @@ -// change the menu position based on the scroll positon -window.onscroll = function() -{ - if( window.XMLHttpRequest ) { - - basePosition = jQuery('#gf_form_toolbar').offset().top; - - if (document.documentElement.scrollTop > basePosition || self.pageYOffset > basePosition) { - jQuery('#floatMenu').css('position','fixed'); - jQuery('#floatMenu').css('top', '40px'); - } else { - jQuery('#floatMenu').css('position','static'); - } - } +// change the menu position based on the scroll positon +window.onscroll = function() +{ + if( window.XMLHttpRequest ) { + + basePosition = jQuery('#gf_form_toolbar').offset().top; + + if (document.documentElement.scrollTop > basePosition || self.pageYOffset > basePosition) { + jQuery('#floatMenu').css('position','fixed'); + jQuery('#floatMenu').css('top', '40px'); + } else { + jQuery('#floatMenu').css('position','static'); + } + } } \ No newline at end of file diff --git a/js/form_admin.js b/js/form_admin.js old mode 100755 new mode 100644 index 80cbae7..f38b7ad --- a/js/form_admin.js +++ b/js/form_admin.js @@ -5,6 +5,8 @@ jQuery(document).ready(function($){ + gaddon.init(); + if($(document).on){ $(document).on('change', '.gfield_rule_value_dropdown', function(){ SetRuleValueDropDown($(this)); @@ -44,29 +46,36 @@ function ToggleConditionalLogic(isInit, objectType){ } function GetConditionalObject(objectType){ + + var object = false; + switch(objectType){ - case "page" : - case "field" : - return GetSelectedField(); + case "page": + case "field": + object = GetSelectedField(); break; - case "next_button" : - var field = GetSelectedField(); - return field["nextButton"]; + case "next_button" : + var field = GetSelectedField(); + object = field["nextButton"]; break; - case "confirmation": - return confirmation; + case "confirmation": + object = confirmation; break; - case "notification": - return current_notification; + case "notification": + object = current_notification; break; - default: - return form.button; + default: + object = typeof form != 'undefined' ? form.button : false; break; } + + object = gform.applyFilters( 'gform_conditional_object', object, objectType ) + + return object; } function CreateConditionalLogic(objectType, obj){ @@ -78,7 +87,6 @@ function CreateConditionalLogic(objectType, obj){ var showSelected = obj.conditionalLogic.actionType == "show" ? "selected='selected'" :""; var allSelected = obj.conditionalLogic.logicType == "all" ? "selected='selected'" :""; var anySelected = obj.conditionalLogic.logicType == "any" ? "selected='selected'" :""; - var imagesUrl = ''; var objText; if(objectType == "field") @@ -92,23 +100,23 @@ function CreateConditionalLogic(objectType, obj){ else objText = gf_vars.thisFormButton; - var str = ""; - str += objText; - str += ""; - str += " " + gf_vars.ofTheFollowingMatch; - - for(var i=0; i < obj.conditionalLogic.rules.length; i++){ - var isSelected = obj.conditionalLogic.rules[i].operator == "is" ? "selected='selected'" :""; - var isNotSelected = obj.conditionalLogic.rules[i].operator == "isnot" ? "selected='selected'" :""; - var greaterThanSelected = obj.conditionalLogic.rules[i].operator == ">" ? "selected='selected'" :""; - var lessThanSelected = obj.conditionalLogic.rules[i].operator == "<" ? "selected='selected'" :""; - var containsSelected = obj.conditionalLogic.rules[i].operator == "contains" ? "selected='selected'" :""; - var startsWithSelected = obj.conditionalLogic.rules[i].operator == "starts_with" ? "selected='selected'" :""; - var endsWithSelected = obj.conditionalLogic.rules[i].operator == "ends_with" ? "selected='selected'" :""; - - str += "
            " + GetRuleFields(objectType, i, obj.conditionalLogic.rules[i].fieldId); - str += ""; - str += GetRuleValues(objectType, i, obj.conditionalLogic.rules[i].fieldId, obj.conditionalLogic.rules[i].value); + var descPieces = {}; + descPieces.actionType = ""; + descPieces.objectDescription = objText; + descPieces.logicType = ""; + descPieces.ofTheFollowingMatch = gf_vars.ofTheFollowingMatch; + + var descPiecesArr = makeArray( descPieces ); + + var str = descPiecesArr.join(' '); + var str = gform.applyFilters( 'gform_conditional_logic_description', str, descPieces, objectType, obj ); + var i, rule; + for(i=0; i < obj.conditionalLogic.rules.length; i++){ + rule = obj.conditionalLogic.rules[i]; + str += "
            "; + str += GetRuleFields(objectType, i, rule.fieldId); + str += GetRuleOperators(objectType, i, rule.fieldId, rule.operator); + str += GetRuleValues(objectType, i, rule.fieldId, rule.value); str += "add another rule"; if(obj.conditionalLogic.rules.length > 1 ) str += "remove this rule"; @@ -122,32 +130,117 @@ function CreateConditionalLogic(objectType, obj){ jQuery.Placeholder.init(); } -function GetRuleFields(objectType, ruleIndex, selectedFieldId){ - var str = ""; + operators = IsEntryMeta(fieldId) ? GetOperatorsForMeta(supportedOperators, fieldId) : supportedOperators; + + operators = gform.applyFilters( 'gform_conditional_logic_operators', operators, objectType, fieldId ) + + jQuery.each(operators,function(operator, stringKey){ + selected = selectedOperator == operator ? "selected='selected'" : ""; + str += "" + }); + str +=""; + return str; +} + +function GetOperatorsForMeta(supportedOperators, key){ + var operators = {}; + if(entry_meta[key] && entry_meta[key].filter && entry_meta[key].filter.operators ){ + + jQuery.each(supportedOperators,function(operator, stringKey){ + if(jQuery.inArray(operator, entry_meta[key].filter.operators) >= 0) + operators[operator] = stringKey; + }); + } else { + operators = supportedOperators; + } + return operators; +} + +function GetRuleFields( objectType, ruleIndex, selectedFieldId ) { + + var str = ""; return str; } +function GetEntryMetaFields( selectedFieldId ) { + + var options = [], selected, label; + + if(typeof entry_meta == 'undefined') + return options; + + jQuery.each( entry_meta, function( key, meta ) { + + if(typeof meta.filter == 'undefined') + return; + + options.push( { + label: meta.label, + value: key, + isSelected: selectedFieldId == key ? "selected='selected'" : "" + } ); + + }); + + return options; +} + function IsConditionalLogicField(field){ - inputType = field.inputType ? field.inputType : field.type; + var inputType = field.inputType ? field.inputType : field.type; var supported_fields = ["checkbox", "radio", "select", "text", "website", "textarea", "email", "hidden", "number", "phone", "multiselect", "post_title", "post_tags", "post_custom_field", "post_content", "post_excerpt"]; var index = jQuery.inArray(inputType, supported_fields); var isConditionalLogicField = index >= 0 ? true : false; - isConditionalLogicField = gform.applyFilters('gform_is_conditional_logic_field', isConditionalLogicField, field); + isConditionalLogicField = gform.applyFilters( 'gform_is_conditional_logic_field', isConditionalLogicField, field ); return isConditionalLogicField; } -function GetRuleValues(objectType, ruleIndex, selectedFieldId, selectedValue){ +function IsEntryMeta(key){ + + return typeof entry_meta != 'undefined' && typeof entry_meta[key] != 'undefined'; +} + +function GetRuleValues(objectType, ruleIndex, selectedFieldId, selectedValue, inputName){ + + if(!inputName) + inputName = false; + + var dropdown_id = inputName == false ? objectType + '_rule_value_' + ruleIndex : inputName; if(selectedFieldId == 0) selectedFieldId = GetFirstRuleField(); @@ -155,17 +248,16 @@ function GetRuleValues(objectType, ruleIndex, selectedFieldId, selectedValue){ if(selectedFieldId == 0) return ""; - var isAnySelected = false; var field = GetFieldById(selectedFieldId); - - if(!field) - return ""; + var isEntryMeta = IsEntryMeta(selectedFieldId); + // @STEVE - removed this to allow for non-field-based conditional logic + /*if(!field && !isEntryMeta) + return "";*/ var str = ""; - if(field["type"] == "post_category" && field["displayAllCategories"]){ + if(field && field["type"] == "post_category" && field["displayAllCategories"]){ - var dropdown_id = objectType + '_rule_value_' + ruleIndex; var dropdown = jQuery('#' + dropdown_id + ".gfield_category_dropdown"); //don't load category drop down if it already exists (to avoid unecessary ajax requests) @@ -176,14 +268,17 @@ function GetRuleValues(objectType, ruleIndex, selectedFieldId, selectedValue){ str = ""; } else{ + var placeholderName = inputName == false ? "gfield_ajax_placeholder_" + ruleIndex : inputName + "_placeholder"; + //loading categories via AJAX jQuery.post(ajaxurl,{ action:"gf_get_post_categories", objectType: objectType, ruleIndex: ruleIndex, + inputName: inputName, selectedValue: selectedValue}, function(dropdown_string){ if(dropdown_string){ - jQuery('#gfield_ajax_placeholder_' + ruleIndex).replaceWith(dropdown_string.trim()); + jQuery('#' + placeholderName).replaceWith(dropdown_string.trim()); SetRuleProperty(objectType, ruleIndex, "value", jQuery("#" + dropdown_id).val()); } @@ -191,24 +286,28 @@ function GetRuleValues(objectType, ruleIndex, selectedFieldId, selectedValue){ ); //will be replaced by real drop down during the ajax callback - str = ""; + str = ""; } } - else if(field.choices){ - str = GetRuleValuesDropDown(field.choices, objectType, ruleIndex, selectedValue); + else if(field && field.choices){ + str = GetRuleValuesDropDown(field.choices, objectType, ruleIndex, selectedValue, inputName); + } + else if (isEntryMeta && entry_meta && entry_meta[selectedFieldId] && entry_meta[selectedFieldId].filter && typeof entry_meta[selectedFieldId].filter.choices != 'undefined') { + str = GetRuleValuesDropDown(entry_meta[selectedFieldId].filter.choices, objectType, ruleIndex, selectedValue, inputName); } else{ selectedValue = selectedValue ? selectedValue.replace(/'/g, "'") : ""; //create a text field for fields that don't have choices (i.e text, textarea, number, email, etc...) - str = ""; + str = ""; } + str = gform.applyFilters( 'gform_conditional_logic_values_input', str, objectType, ruleIndex, selectedFieldId, selectedValue ) + return str; } function GetFirstRuleField(){ - var inputType; for(var i=0; i"; + var str = "'); - this._dialogInput.keydown(this._doKeyDown); - $('body').append(this._dialogInput); - inst = this._dialogInst = this._newInst(this._dialogInput, false); - inst.settings = {}; - $.data(this._dialogInput[0], PROP_NAME, inst); - } - extendRemove(inst.settings, settings || {}); - this._dialogInput.val(dateText); - - this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null); - if (!this._pos) { - var browserWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; - var browserHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; - var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; - var scrollY = document.documentElement.scrollTop || document.body.scrollTop; - this._pos = // should use actual width/height below - [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]; - } - - // move input on screen for focus, but hidden behind dialog - this._dialogInput.css('left', this._pos[0] + 'px').css('top', this._pos[1] + 'px'); - inst.settings.onSelect = onSelect; - this._inDialog = true; - this.dpDiv.addClass(this._dialogClass); - this._showDatepicker(this._dialogInput[0]); - if ($.blockUI) - $.blockUI(this.dpDiv); - $.data(this._dialogInput[0], PROP_NAME, inst); - return this; - }, - - /* Detach a datepicker from its control. - @param target element - the target input field or division or span */ - _destroyDatepicker: function(target) { - var $target = $(target); - if (!$target.hasClass(this.markerClassName)) { - return; - } - var nodeName = target.nodeName.toLowerCase(); - $.removeData(target, PROP_NAME); - if (nodeName == 'input') { - $target.siblings('.' + this._appendClass).remove().end(). - siblings('.' + this._triggerClass).remove().end(). - removeClass(this.markerClassName). - unbind('focus', this._showDatepicker). - unbind('keydown', this._doKeyDown). - unbind('keypress', this._doKeyPress); - } else if (nodeName == 'div' || nodeName == 'span') - $target.removeClass(this.markerClassName).empty(); - }, - - /* Enable the date picker to a jQuery selection. - @param target element - the target input field or division or span */ - _enableDatepicker: function(target) { - var $target = $(target); - if (!$target.hasClass(this.markerClassName)) { - return; - } - var nodeName = target.nodeName.toLowerCase(); - if (nodeName == 'input') { - target.disabled = false; - $target.siblings('button.' + this._triggerClass). - each(function() { this.disabled = false; }).end(). - siblings('img.' + this._triggerClass). - css({opacity: '1.0', cursor: ''}); - } - else if (nodeName == 'div' || nodeName == 'span') { - $target.children('.' + this._disableClass).remove(); - } - this._disabledInputs = $.map(this._disabledInputs, - function(value) { return (value == target ? null : value); }); // delete entry - }, - - /* Disable the date picker to a jQuery selection. - @param target element - the target input field or division or span */ - _disableDatepicker: function(target) { - var $target = $(target); - if (!$target.hasClass(this.markerClassName)) { - return; - } - var nodeName = target.nodeName.toLowerCase(); - if (nodeName == 'input') { - target.disabled = true; - $target.siblings('button.' + this._triggerClass). - each(function() { this.disabled = true; }).end(). - siblings('img.' + this._triggerClass). - css({opacity: '0.5', cursor: 'default'}); - } - else if (nodeName == 'div' || nodeName == 'span') { - var inline = $target.children('.' + this._inlineClass); - var offset = inline.offset(); - var relOffset = {left: 0, top: 0}; - inline.parents().each(function() { - if ($(this).css('position') == 'relative') { - relOffset = $(this).offset(); - return false; - } - }); - $target.prepend('
            '); - } - this._disabledInputs = $.map(this._disabledInputs, - function(value) { return (value == target ? null : value); }); // delete entry - this._disabledInputs[this._disabledInputs.length] = target; - }, - - /* Is the first field in a jQuery collection disabled as a datepicker? - @param target element - the target input field or division or span - @return boolean - true if disabled, false if enabled */ - _isDisabledDatepicker: function(target) { - if (!target) - return false; - for (var i = 0; i < this._disabledInputs.length; i++) { - if (this._disabledInputs[i] == target) - return true; - } - return false; - }, - - /* Retrieve the instance data for the target control. - @param target element - the target input field or division or span - @return object - the associated instance data - @throws error if a jQuery problem getting data */ - _getInst: function(target) { - try { - return $.data(target, PROP_NAME); - } - catch (err) { - throw 'Missing instance data for this datepicker'; - } - }, - - /* Update the settings for a date picker attached to an input field or division. - @param target element - the target input field or division or span - @param name object - the new settings to update or - string - the name of the setting to change or - @param value any - the new value for the setting (omit if above is an object) */ - _optionDatepicker: function(target, name, value) { - var settings = name || {}; - if (typeof name == 'string') { - settings = {}; - settings[name] = value; - } - var inst = this._getInst(target); - if (inst) { - if (this._curInst == inst) { - this._hideDatepicker(null); - } - extendRemove(inst.settings, settings); - var date = new Date(); - extendRemove(inst, {rangeStart: null, // start of range - endDay: null, endMonth: null, endYear: null, // end of range - selectedDay: date.getDate(), selectedMonth: date.getMonth(), - selectedYear: date.getFullYear(), // starting point - currentDay: date.getDate(), currentMonth: date.getMonth(), - currentYear: date.getFullYear(), // current selection - drawMonth: date.getMonth(), drawYear: date.getFullYear()}); // month being drawn - this._updateDatepicker(inst); - } - }, - - // change method deprecated - _changeDatepicker: function(target, name, value) { - this._optionDatepicker(target, name, value); - }, - - /* Redraw the date picker attached to an input field or division. - @param target element - the target input field or division or span */ - _refreshDatepicker: function(target) { - var inst = this._getInst(target); - if (inst) { - this._updateDatepicker(inst); - } - }, - - /* Set the dates for a jQuery selection. - @param target element - the target input field or division or span - @param date Date - the new date - @param endDate Date - the new end date for a range (optional) */ - _setDateDatepicker: function(target, date, endDate) { - var inst = this._getInst(target); - if (inst) { - this._setDate(inst, date, endDate); - this._updateDatepicker(inst); - this._updateAlternate(inst); - } - }, - - /* Get the date(s) for the first entry in a jQuery selection. - @param target element - the target input field or division or span - @return Date - the current date or - Date[2] - the current dates for a range */ - _getDateDatepicker: function(target) { - var inst = this._getInst(target); - if (inst && !inst.inline) - this._setDateFromField(inst); - return (inst ? this._getDate(inst) : null); - }, - - /* Handle keystrokes. */ - _doKeyDown: function(event) { - var inst = $.datepicker._getInst(event.target); - var handled = true; - inst._keyEvent = true; - if ($.datepicker._datepickerShowing) - switch (event.keyCode) { - case 9: $.datepicker._hideDatepicker(null, ''); - break; // hide on tab out - case 13: var sel = $('td.' + $.datepicker._dayOverClass + - ', td.' + $.datepicker._currentClass, inst.dpDiv); - if (sel[0]) - $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]); - else - $.datepicker._hideDatepicker(null, $.datepicker._get(inst, 'duration')); - return false; // don't submit the form - break; // select the value on enter - case 27: $.datepicker._hideDatepicker(null, $.datepicker._get(inst, 'duration')); - break; // hide on escape - case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ? - -$.datepicker._get(inst, 'stepBigMonths') : - -$.datepicker._get(inst, 'stepMonths')), 'M'); - break; // previous month/year on page up/+ ctrl - case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ? - +$.datepicker._get(inst, 'stepBigMonths') : - +$.datepicker._get(inst, 'stepMonths')), 'M'); - break; // next month/year on page down/+ ctrl - case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target); - handled = event.ctrlKey || event.metaKey; - break; // clear on ctrl or command +end - case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target); - handled = event.ctrlKey || event.metaKey; - break; // current on ctrl or command +home - case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -1, 'D'); - handled = event.ctrlKey || event.metaKey; - // -1 day on ctrl or command +left - if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ? - -$.datepicker._get(inst, 'stepBigMonths') : - -$.datepicker._get(inst, 'stepMonths')), 'M'); - // next month/year on alt +left on Mac - break; - case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D'); - handled = event.ctrlKey || event.metaKey; - break; // -1 week on ctrl or command +up - case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +1, 'D'); - handled = event.ctrlKey || event.metaKey; - // +1 day on ctrl or command +right - if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ? - +$.datepicker._get(inst, 'stepBigMonths') : - +$.datepicker._get(inst, 'stepMonths')), 'M'); - // next month/year on alt +right - break; - case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D'); - handled = event.ctrlKey || event.metaKey; - break; // +1 week on ctrl or command +down - default: handled = false; - } - else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home - $.datepicker._showDatepicker(this); - else { - handled = false; - } - if (handled) { - event.preventDefault(); - event.stopPropagation(); - } - }, - - /* Filter entered characters - based on date format. */ - _doKeyPress: function(event) { - var inst = $.datepicker._getInst(event.target); - if ($.datepicker._get(inst, 'constrainInput')) { - var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')); - var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode); - return event.ctrlKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1); - } - }, - - /* Pop-up the date picker for a given input field. - @param input element - the input field attached to the date picker or - event - if triggered by focus */ - _showDatepicker: function(input) { - input = input.target || input; - if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger - input = $('input', input.parentNode)[0]; - if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here - return; - var inst = $.datepicker._getInst(input); - var beforeShow = $.datepicker._get(inst, 'beforeShow'); - extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {})); - $.datepicker._hideDatepicker(null, ''); - $.datepicker._lastInput = input; - $.datepicker._setDateFromField(inst); - if ($.datepicker._inDialog) // hide cursor - input.value = ''; - if (!$.datepicker._pos) { // position below input - $.datepicker._pos = $.datepicker._findPos(input); - $.datepicker._pos[1] += input.offsetHeight; // add the height - } - var isFixed = false; - $(input).parents().each(function() { - isFixed |= $(this).css('position') == 'fixed'; - return !isFixed; - }); - if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled - $.datepicker._pos[0] -= document.documentElement.scrollLeft; - $.datepicker._pos[1] -= document.documentElement.scrollTop; - } - var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]}; - $.datepicker._pos = null; - inst.rangeStart = null; - // determine sizing offscreen - inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'}); - $.datepicker._updateDatepicker(inst); - // fix width for dynamic number of date pickers - inst.dpDiv.width($.datepicker._getNumberOfMonths(inst)[1] * - $('.ui-datepicker', inst.dpDiv[0])[0].offsetWidth); - // and adjust position before showing - offset = $.datepicker._checkOffset(inst, offset, isFixed); - inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ? - 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none', - left: offset.left + 'px', top: offset.top + 'px'}); - if (!inst.inline) { - var showAnim = $.datepicker._get(inst, 'showAnim') || 'show'; - var duration = $.datepicker._get(inst, 'duration'); - var postProcess = function() { - $.datepicker._datepickerShowing = true; - if ($.browser.msie && parseInt($.browser.version,10) < 7) // fix IE < 7 select problems - $('iframe.ui-datepicker-cover').css({width: inst.dpDiv.width() + 4, - height: inst.dpDiv.height() + 4}); - }; - if ($.effects && $.effects[showAnim]) - inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess); - else - inst.dpDiv[showAnim](duration, postProcess); - if (duration == '') - postProcess(); - if (inst.input[0].type != 'hidden') - inst.input[0].focus(); - $.datepicker._curInst = inst; - } - }, - - /* Generate the date picker content. */ - _updateDatepicker: function(inst) { - var dims = {width: inst.dpDiv.width() + 4, - height: inst.dpDiv.height() + 4}; - inst.dpDiv.empty().append(this._generateHTML(inst)). - find('iframe.ui-datepicker-cover'). - css({width: dims.width, height: dims.height}); - var numMonths = this._getNumberOfMonths(inst); - inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') + - 'Class']('ui-datepicker-multi'); - inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') + - 'Class']('ui-datepicker-rtl'); - if (inst.input && inst.input[0].type != 'hidden' && inst == $.datepicker._curInst) - $(inst.input[0]).focus(); - }, - - /* Check positioning to remain on screen. */ - _checkOffset: function(inst, offset, isFixed) { - var pos = inst.input ? this._findPos(inst.input[0]) : null; - var browserWidth = window.innerWidth || (document.documentElement ? - document.documentElement.clientWidth : document.body.clientWidth); - var browserHeight = window.innerHeight || (document.documentElement ? - document.documentElement.clientHeight : document.body.clientHeight); - var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; - var scrollY = document.documentElement.scrollTop || document.body.scrollTop; - // reposition date picker horizontally if outside the browser window - if (this._get(inst, 'isRTL') || (offset.left + inst.dpDiv.width() - scrollX) > browserWidth) - offset.left = Math.max((isFixed ? 0 : scrollX), - pos[0] + (inst.input ? inst.input.width() : 0) - (isFixed ? scrollX : 0) - inst.dpDiv.width() - - (isFixed && $.browser.opera ? document.documentElement.scrollLeft : 0)); - else - offset.left -= (isFixed ? scrollX : 0); - // reposition date picker vertically if outside the browser window - if ((offset.top + inst.dpDiv.height() - scrollY) > browserHeight) - offset.top = Math.max((isFixed ? 0 : scrollY), - pos[1] - (isFixed ? scrollY : 0) - (this._inDialog ? 0 : inst.dpDiv.height()) - - (isFixed && $.browser.opera ? document.documentElement.scrollTop : 0)); - else - offset.top -= (isFixed ? scrollY : 0); - return offset; - }, - - /* Find an object's position on the screen. */ - _findPos: function(obj) { - while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) { - obj = obj.nextSibling; - } - var position = $(obj).offset(); - return [position.left, position.top]; - }, - - /* Hide the date picker from view. - @param input element - the input field attached to the date picker - @param duration string - the duration over which to close the date picker */ - _hideDatepicker: function(input, duration) { - var inst = this._curInst; - if (!inst || (input && inst != $.data(input, PROP_NAME))) - return; - var rangeSelect = this._get(inst, 'rangeSelect'); - if (rangeSelect && inst.stayOpen) - this._selectDate('#' + inst.id, this._formatDate(inst, - inst.currentDay, inst.currentMonth, inst.currentYear)); - inst.stayOpen = false; - if (this._datepickerShowing) { - duration = (duration != null ? duration : this._get(inst, 'duration')); - var showAnim = this._get(inst, 'showAnim'); - var postProcess = function() { - $.datepicker._tidyDialog(inst); - }; - if (duration != '' && $.effects && $.effects[showAnim]) - inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), - duration, postProcess); - else - inst.dpDiv[(duration == '' ? 'hide' : (showAnim == 'slideDown' ? 'slideUp' : - (showAnim == 'fadeIn' ? 'fadeOut' : 'hide')))](duration, postProcess); - if (duration == '') - this._tidyDialog(inst); - var onClose = this._get(inst, 'onClose'); - if (onClose) - onClose.apply((inst.input ? inst.input[0] : null), - [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback - this._datepickerShowing = false; - this._lastInput = null; - inst.settings.prompt = null; - if (this._inDialog) { - this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' }); - if ($.blockUI) { - $.unblockUI(); - $('body').append(this.dpDiv); - } - } - this._inDialog = false; - } - this._curInst = null; - }, - - /* Tidy up after a dialog display. */ - _tidyDialog: function(inst) { - inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker'); - $('.' + this._promptClass, inst.dpDiv).remove(); - }, - - /* Close date picker if clicked elsewhere. */ - _checkExternalClick: function(event) { - if (!$.datepicker._curInst) - return; - var $target = $(event.target); - if (($target.parents('#' + $.datepicker._mainDivId).length == 0) && - !$target.hasClass($.datepicker.markerClassName) && - !$target.hasClass($.datepicker._triggerClass) && - $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI)) - $.datepicker._hideDatepicker(null, ''); - }, - - /* Adjust one of the date sub-fields. */ - _adjustDate: function(id, offset, period) { - var target = $(id); - var inst = this._getInst(target[0]); - this._adjustInstDate(inst, offset, period); - this._updateDatepicker(inst); - }, - - /* Action for current link. */ - _gotoToday: function(id) { - var target = $(id); - var inst = this._getInst(target[0]); - if (this._get(inst, 'gotoCurrent') && inst.currentDay) { - inst.selectedDay = inst.currentDay; - inst.drawMonth = inst.selectedMonth = inst.currentMonth; - inst.drawYear = inst.selectedYear = inst.currentYear; - } - else { - var date = new Date(); - inst.selectedDay = date.getDate(); - inst.drawMonth = inst.selectedMonth = date.getMonth(); - inst.drawYear = inst.selectedYear = date.getFullYear(); - } - this._notifyChange(inst); - this._adjustDate(target); - }, - - /* Action for selecting a new month/year. */ - _selectMonthYear: function(id, select, period) { - var target = $(id); - var inst = this._getInst(target[0]); - inst._selectingMonthYear = false; - inst['selected' + (period == 'M' ? 'Month' : 'Year')] = - inst['draw' + (period == 'M' ? 'Month' : 'Year')] = - parseInt(select.options[select.selectedIndex].value,10); - this._notifyChange(inst); - this._adjustDate(target); - }, - - /* Restore input focus after not changing month/year. */ - _clickMonthYear: function(id) { - var target = $(id); - var inst = this._getInst(target[0]); - if (inst.input && inst._selectingMonthYear && !$.browser.msie) - inst.input[0].focus(); - inst._selectingMonthYear = !inst._selectingMonthYear; - }, - - /* Action for changing the first week day. */ - _changeFirstDay: function(id, day) { - var target = $(id); - var inst = this._getInst(target[0]); - inst.settings.firstDay = day; - this._updateDatepicker(inst); - }, - - /* Action for selecting a day. */ - _selectDay: function(id, month, year, td) { - if ($(td).hasClass(this._unselectableClass)) - return; - var target = $(id); - var inst = this._getInst(target[0]); - var rangeSelect = this._get(inst, 'rangeSelect'); - if (rangeSelect) { - inst.stayOpen = !inst.stayOpen; - if (inst.stayOpen) { - $('.ui-datepicker td', inst.dpDiv).removeClass(this._currentClass); - $(td).addClass(this._currentClass); - } - } - inst.selectedDay = inst.currentDay = $('a', td).html(); - inst.selectedMonth = inst.currentMonth = month; - inst.selectedYear = inst.currentYear = year; - if (inst.stayOpen) { - inst.endDay = inst.endMonth = inst.endYear = null; - } - else if (rangeSelect) { - inst.endDay = inst.currentDay; - inst.endMonth = inst.currentMonth; - inst.endYear = inst.currentYear; - } - this._selectDate(id, this._formatDate(inst, - inst.currentDay, inst.currentMonth, inst.currentYear)); - if (inst.stayOpen) { - inst.rangeStart = this._daylightSavingAdjust( - new Date(inst.currentYear, inst.currentMonth, inst.currentDay)); - this._updateDatepicker(inst); - } - else if (rangeSelect) { - inst.selectedDay = inst.currentDay = inst.rangeStart.getDate(); - inst.selectedMonth = inst.currentMonth = inst.rangeStart.getMonth(); - inst.selectedYear = inst.currentYear = inst.rangeStart.getFullYear(); - inst.rangeStart = null; - if (inst.inline) - this._updateDatepicker(inst); - } - }, - - /* Erase the input field and hide the date picker. */ - _clearDate: function(id) { - var target = $(id); - var inst = this._getInst(target[0]); - if (this._get(inst, 'mandatory')) - return; - inst.stayOpen = false; - inst.endDay = inst.endMonth = inst.endYear = inst.rangeStart = null; - this._selectDate(target, ''); - }, - - /* Update the input field with the selected date. */ - _selectDate: function(id, dateStr) { - var target = $(id); - var inst = this._getInst(target[0]); - dateStr = (dateStr != null ? dateStr : this._formatDate(inst)); - if (this._get(inst, 'rangeSelect') && dateStr) - dateStr = (inst.rangeStart ? this._formatDate(inst, inst.rangeStart) : - dateStr) + this._get(inst, 'rangeSeparator') + dateStr; - if (inst.input) - inst.input.val(dateStr); - this._updateAlternate(inst); - var onSelect = this._get(inst, 'onSelect'); - if (onSelect) - onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback - else if (inst.input) - inst.input.trigger('change'); // fire the change event - if (inst.inline) - this._updateDatepicker(inst); - else if (!inst.stayOpen) { - this._hideDatepicker(null, this._get(inst, 'duration')); - this._lastInput = inst.input[0]; - if (typeof(inst.input[0]) != 'object') - inst.input[0].focus(); // restore focus - this._lastInput = null; - } - }, - - /* Update any alternate field to synchronise with the main field. */ - _updateAlternate: function(inst) { - var altField = this._get(inst, 'altField'); - if (altField) { // update alternate field too - var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat'); - var date = this._getDate(inst); - dateStr = (isArray(date) ? (!date[0] && !date[1] ? '' : - this.formatDate(altFormat, date[0], this._getFormatConfig(inst)) + - this._get(inst, 'rangeSeparator') + this.formatDate( - altFormat, date[1] || date[0], this._getFormatConfig(inst))) : - this.formatDate(altFormat, date, this._getFormatConfig(inst))); - $(altField).each(function() { $(this).val(dateStr); }); - } - }, - - /* Set as beforeShowDay function to prevent selection of weekends. - @param date Date - the date to customise - @return [boolean, string] - is this date selectable?, what is its CSS class? */ - noWeekends: function(date) { - var day = date.getDay(); - return [(day > 0 && day < 6), '']; - }, - - /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. - @param date Date - the date to get the week for - @return number - the number of the week within the year that contains this date */ - iso8601Week: function(date) { - var checkDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); - var firstMon = new Date(checkDate.getFullYear(), 1 - 1, 4); // First week always contains 4 Jan - var firstDay = firstMon.getDay() || 7; // Day of week: Mon = 1, ..., Sun = 7 - firstMon.setDate(firstMon.getDate() + 1 - firstDay); // Preceding Monday - if (firstDay < 4 && checkDate < firstMon) { // Adjust first three days in year if necessary - checkDate.setDate(checkDate.getDate() - 3); // Generate for previous year - return $.datepicker.iso8601Week(checkDate); - } else if (checkDate > new Date(checkDate.getFullYear(), 12 - 1, 28)) { // Check last three days in year - firstDay = new Date(checkDate.getFullYear() + 1, 1 - 1, 4).getDay() || 7; - if (firstDay > 4 && (checkDate.getDay() || 7) < firstDay - 3) { // Adjust if necessary - return 1; - } - } - return Math.floor(((checkDate - firstMon) / 86400000) / 7) + 1; // Weeks to given date - }, - - /* Provide status text for a particular date. - @param date the date to get the status for - @param inst the current datepicker instance - @return the status display text for this date */ - dateStatus: function(date, inst) { - return $.datepicker.formatDate($.datepicker._get(inst, 'dateStatus'), - date, $.datepicker._getFormatConfig(inst)); - }, - - /* Parse a string value into a date object. - See formatDate below for the possible formats. - - @param format string - the expected format of the date - @param value string - the date in the above format - @param settings Object - attributes include: - shortYearCutoff number - the cutoff year for determining the century (optional) - dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) - dayNames string[7] - names of the days from Sunday (optional) - monthNamesShort string[12] - abbreviated names of the months (optional) - monthNames string[12] - names of the months (optional) - @return Date - the extracted date value or null if value is blank */ - parseDate: function (format, value, settings) { - if (format == null || value == null) - throw 'Invalid arguments'; - value = (typeof value == 'object' ? value.toString() : value + ''); - if (value == '') - return null; - var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff; - var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; - var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; - var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; - var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; - var year = -1; - var month = -1; - var day = -1; - var doy = -1; - var literal = false; - // Check whether a format character is doubled - var lookAhead = function(match) { - var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); - if (matches) - iFormat++; - return matches; - }; - // Extract a number from the string value - var getNumber = function(match) { - lookAhead(match); - var origSize = (match == '@' ? 14 : (match == 'y' ? 4 : (match == 'o' ? 3 : 2))); - var size = origSize; - var num = 0; - while (size > 0 && iValue < value.length && - value.charAt(iValue) >= '0' && value.charAt(iValue) <= '9') { - num = num * 10 + parseInt(value.charAt(iValue++),10); - size--; - } - if (size == origSize) - throw 'Missing number at position ' + iValue; - return num; - }; - // Extract a name from the string value and convert to an index - var getName = function(match, shortNames, longNames) { - var names = (lookAhead(match) ? longNames : shortNames); - var size = 0; - for (var j = 0; j < names.length; j++) - size = Math.max(size, names[j].length); - var name = ''; - var iInit = iValue; - while (size > 0 && iValue < value.length) { - name += value.charAt(iValue++); - for (var i = 0; i < names.length; i++) - if (name == names[i]) - return i + 1; - size--; - } - throw 'Unknown name at position ' + iInit; - }; - // Confirm that a literal character matches the string value - var checkLiteral = function() { - if (value.charAt(iValue) != format.charAt(iFormat)) - throw 'Unexpected literal at position ' + iValue; - iValue++; - }; - var iValue = 0; - for (var iFormat = 0; iFormat < format.length; iFormat++) { - if (literal) - if (format.charAt(iFormat) == "'" && !lookAhead("'")) - literal = false; - else - checkLiteral(); - else - switch (format.charAt(iFormat)) { - case 'd': - day = getNumber('d'); - break; - case 'D': - getName('D', dayNamesShort, dayNames); - break; - case 'o': - doy = getNumber('o'); - break; - case 'm': - month = getNumber('m'); - break; - case 'M': - month = getName('M', monthNamesShort, monthNames); - break; - case 'y': - year = getNumber('y'); - break; - case '@': - var date = new Date(getNumber('@')); - year = date.getFullYear(); - month = date.getMonth() + 1; - day = date.getDate(); - break; - case "'": - if (lookAhead("'")) - checkLiteral(); - else - literal = true; - break; - default: - checkLiteral(); - } - } - if (year == -1) - year = new Date().getFullYear(); - else if (year < 100) - year += new Date().getFullYear() - new Date().getFullYear() % 100 + - (year <= shortYearCutoff ? 0 : -100); - if (doy > -1) { - month = 1; - day = doy; - do { - var dim = this._getDaysInMonth(year, month - 1); - if (day <= dim) - break; - month++; - day -= dim; - } while (true); - } - var date = this._daylightSavingAdjust(new Date(year, month - 1, day)); - if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day) - throw 'Invalid date'; // E.g. 31/02/* - return date; - }, - - /* Standard date formats. */ - ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601) - COOKIE: 'D, dd M yy', - ISO_8601: 'yy-mm-dd', - RFC_822: 'D, d M y', - RFC_850: 'DD, dd-M-y', - RFC_1036: 'D, d M y', - RFC_1123: 'D, d M yy', - RFC_2822: 'D, d M yy', - RSS: 'D, d M y', // RFC 822 - TIMESTAMP: '@', - W3C: 'yy-mm-dd', // ISO 8601 - - /* Format a date object into a string value. - The format can be combinations of the following: - d - day of month (no leading zero) - dd - day of month (two digit) - o - day of year (no leading zeros) - oo - day of year (three digit) - D - day name short - DD - day name long - m - month of year (no leading zero) - mm - month of year (two digit) - M - month name short - MM - month name long - y - year (two digit) - yy - year (four digit) - @ - Unix timestamp (ms since 01/01/1970) - '...' - literal text - '' - single quote - - @param format string - the desired format of the date - @param date Date - the date value to format - @param settings Object - attributes include: - dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) - dayNames string[7] - names of the days from Sunday (optional) - monthNamesShort string[12] - abbreviated names of the months (optional) - monthNames string[12] - names of the months (optional) - @return string - the date in the above format */ - formatDate: function (format, date, settings) { - if (!date) - return ''; - var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; - var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; - var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; - var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; - // Check whether a format character is doubled - var lookAhead = function(match) { - var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); - if (matches) - iFormat++; - return matches; - }; - // Format a number, with leading zero if necessary - var formatNumber = function(match, value, len) { - var num = '' + value; - if (lookAhead(match)) - while (num.length < len) - num = '0' + num; - return num; - }; - // Format a name, short or long as requested - var formatName = function(match, value, shortNames, longNames) { - return (lookAhead(match) ? longNames[value] : shortNames[value]); - }; - var output = ''; - var literal = false; - if (date) - for (var iFormat = 0; iFormat < format.length; iFormat++) { - if (literal) - if (format.charAt(iFormat) == "'" && !lookAhead("'")) - literal = false; - else - output += format.charAt(iFormat); - else - switch (format.charAt(iFormat)) { - case 'd': - output += formatNumber('d', date.getDate(), 2); - break; - case 'D': - output += formatName('D', date.getDay(), dayNamesShort, dayNames); - break; - case 'o': - var doy = date.getDate(); - for (var m = date.getMonth() - 1; m >= 0; m--) - doy += this._getDaysInMonth(date.getFullYear(), m); - output += formatNumber('o', doy, 3); - break; - case 'm': - output += formatNumber('m', date.getMonth() + 1, 2); - break; - case 'M': - output += formatName('M', date.getMonth(), monthNamesShort, monthNames); - break; - case 'y': - output += (lookAhead('y') ? date.getFullYear() : - (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100); - break; - case '@': - output += date.getTime(); - break; - case "'": - if (lookAhead("'")) - output += "'"; - else - literal = true; - break; - default: - output += format.charAt(iFormat); - } - } - return output; - }, - - /* Extract all possible characters from the date format. */ - _possibleChars: function (format) { - var chars = ''; - var literal = false; - for (var iFormat = 0; iFormat < format.length; iFormat++) - if (literal) - if (format.charAt(iFormat) == "'" && !lookAhead("'")) - literal = false; - else - chars += format.charAt(iFormat); - else - switch (format.charAt(iFormat)) { - case 'd': case 'm': case 'y': case '@': - chars += '0123456789'; - break; - case 'D': case 'M': - return null; // Accept anything - case "'": - if (lookAhead("'")) - chars += "'"; - else - literal = true; - break; - default: - chars += format.charAt(iFormat); - } - return chars; - }, - - /* Get a setting value, defaulting if necessary. */ - _get: function(inst, name) { - return inst.settings[name] !== undefined ? - inst.settings[name] : this._defaults[name]; - }, - - /* Parse existing date and initialise date picker. */ - _setDateFromField: function(inst) { - var dateFormat = this._get(inst, 'dateFormat'); - var dates = inst.input ? inst.input.val().split(this._get(inst, 'rangeSeparator')) : null; - inst.endDay = inst.endMonth = inst.endYear = null; - var date = defaultDate = this._getDefaultDate(inst); - if (dates.length > 0) { - var settings = this._getFormatConfig(inst); - if (dates.length > 1) { - date = this.parseDate(dateFormat, dates[1], settings) || defaultDate; - inst.endDay = date.getDate(); - inst.endMonth = date.getMonth(); - inst.endYear = date.getFullYear(); - } - try { - date = this.parseDate(dateFormat, dates[0], settings) || defaultDate; - } catch (event) { - this.log(event); - date = defaultDate; - } - } - inst.selectedDay = date.getDate(); - inst.drawMonth = inst.selectedMonth = date.getMonth(); - inst.drawYear = inst.selectedYear = date.getFullYear(); - inst.currentDay = (dates[0] ? date.getDate() : 0); - inst.currentMonth = (dates[0] ? date.getMonth() : 0); - inst.currentYear = (dates[0] ? date.getFullYear() : 0); - this._adjustInstDate(inst); - }, - - /* Retrieve the default date shown on opening. */ - _getDefaultDate: function(inst) { - var date = this._determineDate(this._get(inst, 'defaultDate'), new Date()); - var minDate = this._getMinMaxDate(inst, 'min', true); - var maxDate = this._getMinMaxDate(inst, 'max'); - date = (minDate && date < minDate ? minDate : date); - date = (maxDate && date > maxDate ? maxDate : date); - return date; - }, - - /* A date may be specified as an exact value or a relative one. */ - _determineDate: function(date, defaultDate) { - var offsetNumeric = function(offset) { - var date = new Date(); - date.setDate(date.getDate() + offset); - return date; - }; - var offsetString = function(offset, getDaysInMonth) { - var date = new Date(); - var year = date.getFullYear(); - var month = date.getMonth(); - var day = date.getDate(); - var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g; - var matches = pattern.exec(offset); - while (matches) { - switch (matches[2] || 'd') { - case 'd' : case 'D' : - day += parseInt(matches[1],10); break; - case 'w' : case 'W' : - day += parseInt(matches[1],10) * 7; break; - case 'm' : case 'M' : - month += parseInt(matches[1],10); - day = Math.min(day, getDaysInMonth(year, month)); - break; - case 'y': case 'Y' : - year += parseInt(matches[1],10); - day = Math.min(day, getDaysInMonth(year, month)); - break; - } - matches = pattern.exec(offset); - } - return new Date(year, month, day); - }; - date = (date == null ? defaultDate : - (typeof date == 'string' ? offsetString(date, this._getDaysInMonth) : - (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : date))); - date = (date && date.toString() == 'Invalid Date' ? defaultDate : date); - if (date) { - date.setHours(0); - date.setMinutes(0); - date.setSeconds(0); - date.setMilliseconds(0); - } - return this._daylightSavingAdjust(date); - }, - - /* Handle switch to/from daylight saving. - Hours may be non-zero on daylight saving cut-over: - > 12 when midnight changeover, but then cannot generate - midnight datetime, so jump to 1AM, otherwise reset. - @param date (Date) the date to check - @return (Date) the corrected date */ - _daylightSavingAdjust: function(date) { - if (!date) return null; - date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); - return date; - }, - - /* Set the date(s) directly. */ - _setDate: function(inst, date, endDate) { - var clear = !(date); - var origMonth = inst.selectedMonth; - var origYear = inst.selectedYear; - date = this._determineDate(date, new Date()); - inst.selectedDay = inst.currentDay = date.getDate(); - inst.drawMonth = inst.selectedMonth = inst.currentMonth = date.getMonth(); - inst.drawYear = inst.selectedYear = inst.currentYear = date.getFullYear(); - if (this._get(inst, 'rangeSelect')) { - if (endDate) { - endDate = this._determineDate(endDate, null); - inst.endDay = endDate.getDate(); - inst.endMonth = endDate.getMonth(); - inst.endYear = endDate.getFullYear(); - } else { - inst.endDay = inst.currentDay; - inst.endMonth = inst.currentMonth; - inst.endYear = inst.currentYear; - } - } - if (origMonth != inst.selectedMonth || origYear != inst.selectedYear) - this._notifyChange(inst); - this._adjustInstDate(inst); - if (inst.input) - inst.input.val(clear ? '' : this._formatDate(inst) + - (!this._get(inst, 'rangeSelect') ? '' : this._get(inst, 'rangeSeparator') + - this._formatDate(inst, inst.endDay, inst.endMonth, inst.endYear))); - }, - - /* Retrieve the date(s) directly. */ - _getDate: function(inst) { - var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null : - this._daylightSavingAdjust(new Date( - inst.currentYear, inst.currentMonth, inst.currentDay))); - if (this._get(inst, 'rangeSelect')) { - return [inst.rangeStart || startDate, - (!inst.endYear ? inst.rangeStart || startDate : - this._daylightSavingAdjust(new Date(inst.endYear, inst.endMonth, inst.endDay)))]; - } else - return startDate; - }, - - /* Generate the HTML for the current state of the date picker. */ - _generateHTML: function(inst) { - var today = new Date(); - today = this._daylightSavingAdjust( - new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time - var showStatus = this._get(inst, 'showStatus'); - var initStatus = this._get(inst, 'initStatus') || ' '; - var isRTL = this._get(inst, 'isRTL'); - // build the date picker HTML - var clear = (this._get(inst, 'mandatory') ? '' : - ''); - var controls = '
            ' + (isRTL ? '' : clear) + - '' + (isRTL ? clear : '') + '
            '; - var prompt = this._get(inst, 'prompt'); - var closeAtTop = this._get(inst, 'closeAtTop'); - var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext'); - var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat'); - var showBigPrevNext = this._get(inst, 'showBigPrevNext'); - var numMonths = this._getNumberOfMonths(inst); - var showCurrentAtPos = this._get(inst, 'showCurrentAtPos'); - var stepMonths = this._get(inst, 'stepMonths'); - var stepBigMonths = this._get(inst, 'stepBigMonths'); - var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1); - var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) : - new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); - var minDate = this._getMinMaxDate(inst, 'min', true); - var maxDate = this._getMinMaxDate(inst, 'max'); - var drawMonth = inst.drawMonth - showCurrentAtPos; - var drawYear = inst.drawYear; - if (drawMonth < 0) { - drawMonth += 12; - drawYear--; - } - if (maxDate) { - var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), - maxDate.getMonth() - numMonths[1] + 1, maxDate.getDate())); - maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw); - while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) { - drawMonth--; - if (drawMonth < 0) { - drawMonth = 11; - drawYear--; - } - } - } - // controls and links - var prevText = this._get(inst, 'prevText'); - prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText, - this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), - this._getFormatConfig(inst))); - var prevBigText = (showBigPrevNext ? this._get(inst, 'prevBigText') : ''); - prevBigText = (!navigationAsDateFormat ? prevBigText : this.formatDate(prevBigText, - this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepBigMonths, 1)), - this._getFormatConfig(inst))); - var prev = '
            ' + (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? - (showBigPrevNext ? '' + prevBigText + '' : '') + - '' + prevText + '' : - (hideIfNoPrevNext ? '' : (showBigPrevNext ? '' : '') + - '')) + '
            '; - var nextText = this._get(inst, 'nextText'); - nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText, - this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), - this._getFormatConfig(inst))); - var nextBigText = (showBigPrevNext ? this._get(inst, 'nextBigText') : ''); - nextBigText = (!navigationAsDateFormat ? nextBigText : this.formatDate(nextBigText, - this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepBigMonths, 1)), - this._getFormatConfig(inst))); - var next = '
            ' + (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? - '' + nextText + '' + - (showBigPrevNext ? '' + nextBigText + '' : '') : - (hideIfNoPrevNext ? '' : '' + - (showBigPrevNext ? '' : ''))) + '
            '; - var currentText = this._get(inst, 'currentText'); - var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today); - currentText = (!navigationAsDateFormat ? currentText : - this.formatDate(currentText, gotoDate, this._getFormatConfig(inst))); - var html = (closeAtTop && !inst.inline ? controls : '') + - '' + - (prompt ? '
            ' + prompt + '
            ' : ''); - var firstDay = parseInt(this._get(inst, 'firstDay')); - firstDay = (isNaN(firstDay) ? 0 : firstDay); - var changeFirstDay = this._get(inst, 'changeFirstDay'); - var dayNames = this._get(inst, 'dayNames'); - var dayNamesShort = this._get(inst, 'dayNamesShort'); - var dayNamesMin = this._get(inst, 'dayNamesMin'); - var monthNames = this._get(inst, 'monthNames'); - var beforeShowDay = this._get(inst, 'beforeShowDay'); - var highlightWeek = this._get(inst, 'highlightWeek'); - var showOtherMonths = this._get(inst, 'showOtherMonths'); - var showWeeks = this._get(inst, 'showWeeks'); - var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week; - var weekStatus = this._get(inst, 'weekStatus'); - var status = (showStatus ? this._get(inst, 'dayStatus') || initStatus : ''); - var dateStatus = this._get(inst, 'statusForDate') || this.dateStatus; - var endDate = inst.endDay ? this._daylightSavingAdjust( - new Date(inst.endYear, inst.endMonth, inst.endDay)) : currentDate; - var defaultDate = this._getDefaultDate(inst); - for (var row = 0; row < numMonths[0]; row++) - for (var col = 0; col < numMonths[1]; col++) { - var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay)); - html += '
            ' + - this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, - selectedDate, row > 0 || col > 0, showStatus, initStatus, monthNames) + // draw month headers - '' + - '' + - (showWeeks ? '' + - this._get(inst, 'weekHeader') + '' : ''); - for (var dow = 0; dow < 7; dow++) { // days of the week - var day = (dow + firstDay) % 7; - var dayStatus = (status.indexOf('DD') > -1 ? status.replace(/DD/, dayNames[day]) : - status.replace(/D/, dayNamesShort[day])); - html += '= 5 ? ' class="ui-datepicker-week-end-cell"' : '') + '>' + - (!changeFirstDay ? '' + - dayNamesMin[day] + (changeFirstDay ? '' : '') + ''; - } - html += ''; - var daysInMonth = this._getDaysInMonth(drawYear, drawMonth); - if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth) - inst.selectedDay = Math.min(inst.selectedDay, daysInMonth); - var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7; - var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate - var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays)); - for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows - html += '' + - (showWeeks ? '' : ''); - for (var dow = 0; dow < 7; dow++) { // create date picker days - var daySettings = (beforeShowDay ? - beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']); - var otherMonth = (printDate.getMonth() != drawMonth); - var unselectable = otherMonth || !daySettings[0] || - (minDate && printDate < minDate) || (maxDate && printDate > maxDate); - html += ''; // display for this month - printDate.setDate(printDate.getDate() + 1); - printDate = this._daylightSavingAdjust(printDate); - } - html += ''; - } - drawMonth++; - if (drawMonth > 11) { - drawMonth = 0; - drawYear++; - } - html += '
            ' + - calculateWeek(printDate) + '' + // actions - (otherMonth ? (showOtherMonths ? printDate.getDate() : ' ') : // display for other months - (unselectable ? printDate.getDate() : '' + printDate.getDate() + '')) + '
            '; - } - html += (showStatus ? '
            ' + initStatus + '
            ' : '') + - (!closeAtTop && !inst.inline ? controls : '') + - '
            ' + - ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ? - '' : ''); - inst._keyEvent = false; - return html; - }, - - /* Generate the month and year header. */ - _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, - selectedDate, secondary, showStatus, initStatus, monthNames) { - minDate = (inst.rangeStart && minDate && selectedDate < minDate ? selectedDate : minDate); - var changeMonth = this._get(inst, 'changeMonth'); - var changeYear = this._get(inst, 'changeYear'); - var showMonthAfterYear = this._get(inst, 'showMonthAfterYear'); - var html = '
            '; - var monthHtml = ''; - // month selection - if (secondary || !changeMonth) - monthHtml += monthNames[drawMonth]; - else { - var inMinYear = (minDate && minDate.getFullYear() == drawYear); - var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear); - monthHtml += ''; - } - if (!showMonthAfterYear) - html += monthHtml + (secondary || changeMonth || changeYear ? ' ' : ''); - // year selection - if (secondary || !changeYear) - html += drawYear; - else { - // determine range of years to display - var years = this._get(inst, 'yearRange').split(':'); - var year = 0; - var endYear = 0; - if (years.length != 2) { - year = drawYear - 10; - endYear = drawYear + 10; - } else if (years[0].charAt(0) == '+' || years[0].charAt(0) == '-') { - year = endYear = new Date().getFullYear(); - year += parseInt(years[0], 10); - endYear += parseInt(years[1], 10); - } else { - year = parseInt(years[0], 10); - endYear = parseInt(years[1], 10); - } - year = (minDate ? Math.max(year, minDate.getFullYear()) : year); - endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); - html += ''; - } - if (showMonthAfterYear) - html += (secondary || changeMonth || changeYear ? ' ' : '') + monthHtml; - html += '
            '; // Close datepicker_header - return html; - }, - - /* Provide code to set and clear the status panel. */ - _addStatus: function(showStatus, id, text, initStatus) { - return (showStatus ? ' onmouseover="jQuery(\'#ui-datepicker-status-' + id + - '\').html(\'' + (text || initStatus) + '\');" ' + - 'onmouseout="jQuery(\'#ui-datepicker-status-' + id + - '\').html(\'' + initStatus + '\');"' : ''); - }, - - /* Adjust one of the date sub-fields. */ - _adjustInstDate: function(inst, offset, period) { - var year = inst.drawYear + (period == 'Y' ? offset : 0); - var month = inst.drawMonth + (period == 'M' ? offset : 0); - var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + - (period == 'D' ? offset : 0); - var date = this._daylightSavingAdjust(new Date(year, month, day)); - // ensure it is within the bounds set - var minDate = this._getMinMaxDate(inst, 'min', true); - var maxDate = this._getMinMaxDate(inst, 'max'); - date = (minDate && date < minDate ? minDate : date); - date = (maxDate && date > maxDate ? maxDate : date); - inst.selectedDay = date.getDate(); - inst.drawMonth = inst.selectedMonth = date.getMonth(); - inst.drawYear = inst.selectedYear = date.getFullYear(); - if (period == 'M' || period == 'Y') - this._notifyChange(inst); - }, - - /* Notify change of month/year. */ - _notifyChange: function(inst) { - var onChange = this._get(inst, 'onChangeMonthYear'); - if (onChange) - onChange.apply((inst.input ? inst.input[0] : null), - [inst.selectedYear, inst.selectedMonth + 1, inst]); - }, - - /* Determine the number of months to show. */ - _getNumberOfMonths: function(inst) { - var numMonths = this._get(inst, 'numberOfMonths'); - return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths)); - }, - - /* Determine the current maximum date - ensure no time components are set - may be overridden for a range. */ - _getMinMaxDate: function(inst, minMax, checkRange) { - var date = this._determineDate(this._get(inst, minMax + 'Date'), null); - return (!checkRange || !inst.rangeStart ? date : - (!date || inst.rangeStart > date ? inst.rangeStart : date)); - }, - - /* Find the number of days in a given month. */ - _getDaysInMonth: function(year, month) { - return 32 - new Date(year, month, 32).getDate(); - }, - - /* Find the day of the week of the first of a month. */ - _getFirstDayOfMonth: function(year, month) { - return new Date(year, month, 1).getDay(); - }, - - /* Determines if we should allow a "next/prev" month display change. */ - _canAdjustMonth: function(inst, offset, curYear, curMonth) { - var numMonths = this._getNumberOfMonths(inst); - var date = this._daylightSavingAdjust(new Date( - curYear, curMonth + (offset < 0 ? offset : numMonths[1]), 1)); - if (offset < 0) - date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); - return this._isInRange(inst, date); - }, - - /* Is the given date in the accepted range? */ - _isInRange: function(inst, date) { - // during range selection, use minimum of selected date and range start - var newMinDate = (!inst.rangeStart ? null : this._daylightSavingAdjust( - new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay))); - newMinDate = (newMinDate && inst.rangeStart < newMinDate ? inst.rangeStart : newMinDate); - var minDate = newMinDate || this._getMinMaxDate(inst, 'min'); - var maxDate = this._getMinMaxDate(inst, 'max'); - return ((!minDate || date >= minDate) && (!maxDate || date <= maxDate)); - }, - - /* Provide the configuration settings for formatting/parsing. */ - _getFormatConfig: function(inst) { - var shortYearCutoff = this._get(inst, 'shortYearCutoff'); - shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff : - new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); - return {shortYearCutoff: shortYearCutoff, - dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'), - monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')}; - }, - - /* Format the given date for display. */ - _formatDate: function(inst, day, month, year) { - if (!day) { - inst.currentDay = inst.selectedDay; - inst.currentMonth = inst.selectedMonth; - inst.currentYear = inst.selectedYear; - } - var date = (day ? (typeof day == 'object' ? day : - this._daylightSavingAdjust(new Date(year, month, day))) : - this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); - return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst)); - } -}); - -/* jQuery extend now ignores nulls! */ -function extendRemove(target, props) { - $.extend(target, props); - for (var name in props) - if (props[name] == null || props[name] == undefined) - target[name] = props[name]; - return target; -}; - -/* Determine whether an object is an array. */ -function isArray(a) { - return (a && (($.browser.safari && typeof a == 'object' && a.length) || - (a.constructor && a.constructor.toString().match(/\Array\(\)/)))); -}; - -/* Invoke the datepicker functionality. - @param options string - a command, optionally followed by additional parameters or - Object - settings for attaching new datepicker functionality - @return jQuery object */ -$.fn.datepicker = function(options){ - - /* Initialise the date picker. */ - if (!$.datepicker.initialized) { - $(document.body).append($.datepicker.dpDiv). - mousedown($.datepicker._checkExternalClick); - $.datepicker.initialized = true; - } - - var otherArgs = Array.prototype.slice.call(arguments, 1); - if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate')) - return $.datepicker['_' + options + 'Datepicker']. - apply($.datepicker, [this[0]].concat(otherArgs)); - return this.each(function() { - typeof options == 'string' ? - $.datepicker['_' + options + 'Datepicker']. - apply($.datepicker, [this].concat(otherArgs)) : - $.datepicker._attachDatepicker(this, options); - }); -}; - -$.datepicker = new Datepicker(); // singleton instance -$.datepicker.initialized = false; -$.datepicker.uuid = new Date().getTime(); -$.datepicker.version = "1.6"; - -})(jQuery); diff --git a/js/jquery.dimensions.js b/js/jquery.dimensions.js old mode 100755 new mode 100644 diff --git a/js/jquery.json-1.3.js b/js/jquery.json-1.3.js old mode 100755 new mode 100644 diff --git a/js/jquery.maskedinput-1.3.1.min.js b/js/jquery.maskedinput-1.3.1.min.js new file mode 100644 index 0000000..011b647 --- /dev/null +++ b/js/jquery.maskedinput-1.3.1.min.js @@ -0,0 +1,7 @@ +/* + Masked Input plugin for jQuery + Copyright (c) 2007-2013 Josh Bush (digitalbush.com) + Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) + Version: 1.3.1 + */ +(function(e){function t(){var e=document.createElement("input"),t="onpaste";return e.setAttribute(t,""),"function"==typeof e[t]?"paste":"input"}var n,a=t()+".mask",r=navigator.userAgent,i=/iphone/i.test(r),o=/android/i.test(r);e.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},dataName:"rawMaskFn",placeholder:"_"},e.fn.extend({caret:function(e,t){var n;if(0!==this.length&&!this.is(":hidden"))return"number"==typeof e?(t="number"==typeof t?t:e,this.each(function(){this.setSelectionRange?this.setSelectionRange(e,t):this.createTextRange&&(n=this.createTextRange(),n.collapse(!0),n.moveEnd("character",t),n.moveStart("character",e),n.select())})):(this[0].setSelectionRange?(e=this[0].selectionStart,t=this[0].selectionEnd):document.selection&&document.selection.createRange&&(n=document.selection.createRange(),e=0-n.duplicate().moveStart("character",-1e5),t=e+n.text.length),{begin:e,end:t})},unmask:function(){return this.trigger("unmask")},mask:function(t,r){var c,l,s,u,f,h;return!t&&this.length>0?(c=e(this[0]),c.data(e.mask.dataName)()):(r=e.extend({placeholder:e.mask.placeholder,completed:null},r),l=e.mask.definitions,s=[],u=h=t.length,f=null,e.each(t.split(""),function(e,t){"?"==t?(h--,u=e):l[t]?(s.push(RegExp(l[t])),null===f&&(f=s.length-1)):s.push(null)}),this.trigger("unmask").each(function(){function c(e){for(;h>++e&&!s[e];);return e}function d(e){for(;--e>=0&&!s[e];);return e}function m(e,t){var n,a;if(!(0>e)){for(n=e,a=c(t);h>n;n++)if(s[n]){if(!(h>a&&s[n].test(R[a])))break;R[n]=R[a],R[a]=r.placeholder,a=c(a)}b(),x.caret(Math.max(f,e))}}function p(e){var t,n,a,i;for(t=e,n=r.placeholder;h>t;t++)if(s[t]){if(a=c(t),i=R[t],R[t]=n,!(h>a&&s[a].test(i)))break;n=i}}function g(e){var t,n,a,r=e.which;8===r||46===r||i&&127===r?(t=x.caret(),n=t.begin,a=t.end,0===a-n&&(n=46!==r?d(n):a=c(n-1),a=46===r?c(a):a),k(n,a),m(n,a-1),e.preventDefault()):27==r&&(x.val(S),x.caret(0,y()),e.preventDefault())}function v(t){var n,a,i,l=t.which,u=x.caret();t.ctrlKey||t.altKey||t.metaKey||32>l||l&&(0!==u.end-u.begin&&(k(u.begin,u.end),m(u.begin,u.end-1)),n=c(u.begin-1),h>n&&(a=String.fromCharCode(l),s[n].test(a)&&(p(n),R[n]=a,b(),i=c(n),o?setTimeout(e.proxy(e.fn.caret,x,i),0):x.caret(i),r.completed&&i>=h&&r.completed.call(x))),t.preventDefault())}function k(e,t){var n;for(n=e;t>n&&h>n;n++)s[n]&&(R[n]=r.placeholder)}function b(){x.val(R.join(""))}function y(e){var t,n,a=x.val(),i=-1;for(t=0,pos=0;h>t;t++)if(s[t]){for(R[t]=r.placeholder;pos++a.length)break}else R[t]===a.charAt(pos)&&t!==u&&(pos++,i=t);return e?b():u>i+1?(x.val(""),k(0,h)):(b(),x.val(x.val().substring(0,i+1))),u?t:f}var x=e(this),R=e.map(t.split(""),function(e){return"?"!=e?l[e]?r.placeholder:e:void 0}),S=x.val();x.data(e.mask.dataName,function(){return e.map(R,function(e,t){return s[t]&&e!=r.placeholder?e:null}).join("")}),x.attr("readonly")||x.one("unmask",function(){x.unbind(".mask").removeData(e.mask.dataName)}).bind("focus.mask",function(){clearTimeout(n);var e;S=x.val(),e=y(),n=setTimeout(function(){b(),e==t.length?x.caret(0,e):x.caret(e)},10)}).bind("blur.mask",function(){y(),x.val()!=S&&x.change()}).bind("keydown.mask",g).bind("keypress.mask",v).bind(a,function(){setTimeout(function(){var e=y(!0);x.caret(e),r.completed&&e==x.val().length&&r.completed.call(x)},0)}),y()}))}})})(jQuery); \ No newline at end of file diff --git a/js/jquery.maskedinput-1.3.min.js b/js/jquery.maskedinput-1.3.min.js old mode 100755 new mode 100644 index fdbd520..011b647 --- a/js/jquery.maskedinput-1.3.min.js +++ b/js/jquery.maskedinput-1.3.min.js @@ -1,7 +1,7 @@ /* - Masked Input plugin for jQuery - Copyright (c) 2007-2011 Josh Bush (digitalbush.com) - Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) - Version: 1.3 -*/ -(function(a){var b=(a.browser.msie?"paste":"input")+".mask",c=window.orientation!=undefined;a.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},dataName:"rawMaskFn"},a.fn.extend({caret:function(a,b){if(this.length!=0){if(typeof a=="number"){b=typeof b=="number"?b:a;return this.each(function(){if(this.setSelectionRange)this.setSelectionRange(a,b);else if(this.createTextRange){var c=this.createTextRange();c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",a),c.select()}})}if(this[0].setSelectionRange)a=this[0].selectionStart,b=this[0].selectionEnd;else if(document.selection&&document.selection.createRange){var c=document.selection.createRange();a=0-c.duplicate().moveStart("character",-1e5),b=a+c.text.length}return{begin:a,end:b}}},unmask:function(){return this.trigger("unmask")},mask:function(d,e){if(!d&&this.length>0){var f=a(this[0]);return f.data(a.mask.dataName)()}e=a.extend({placeholder:"_",completed:null},e);var g=a.mask.definitions,h=[],i=d.length,j=null,k=d.length;a.each(d.split(""),function(a,b){b=="?"?(k--,i=a):g[b]?(h.push(new RegExp(g[b])),j==null&&(j=h.length-1)):h.push(null)});return this.trigger("unmask").each(function(){function v(a){var b=f.val(),c=-1;for(var d=0,g=0;db.length)break}else l[d]==b.charAt(g)&&d!=i&&(g++,c=d);if(!a&&c+1=i)u(),a||f.val(f.val().substring(0,c+1));return i?d:j}function u(){return f.val(l.join("")).val()}function t(a,b){for(var c=a;c=k&&e.completed.call(f)}}return!1}}function r(a){var b=a.which;if(b==8||b==46||c&&b==127){var d=f.caret(),e=d.begin,g=d.end;g-e==0&&(e=b!=46?o(e):g=n(e-1),g=b==46?n(g):g),t(e,g),p(e,g-1);return!1}if(b==27){f.val(m),f.caret(0,v());return!1}}function q(a){for(var b=a,c=e.placeholder;b=0&&!h[a]);return a}function n(a){while(++a<=k&&!h[a]);return a}var f=a(this),l=a.map(d.split(""),function(a,b){if(a!="?")return g[a]?e.placeholder:a}),m=f.val();f.data(a.mask.dataName,function(){return a.map(l,function(a,b){return h[b]&&a!=e.placeholder?a:null}).join("")}),f.attr("readonly")||f.one("unmask",function(){f.unbind(".mask").removeData(a.mask.dataName)}).bind("focus.mask",function(){m=f.val();var b=v();u();var c=function(){b==d.length?f.caret(0,b):f.caret(b)};(a.browser.msie?c:function(){setTimeout(c,0)})()}).bind("blur.mask",function(){v(),f.val()!=m&&f.change()}).bind("keydown.mask",r).bind("keypress.mask",s).bind(b,function(){setTimeout(function(){f.caret(v(!0))},0)}),v()})}})})(jQuery) \ No newline at end of file + Masked Input plugin for jQuery + Copyright (c) 2007-2013 Josh Bush (digitalbush.com) + Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) + Version: 1.3.1 + */ +(function(e){function t(){var e=document.createElement("input"),t="onpaste";return e.setAttribute(t,""),"function"==typeof e[t]?"paste":"input"}var n,a=t()+".mask",r=navigator.userAgent,i=/iphone/i.test(r),o=/android/i.test(r);e.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},dataName:"rawMaskFn",placeholder:"_"},e.fn.extend({caret:function(e,t){var n;if(0!==this.length&&!this.is(":hidden"))return"number"==typeof e?(t="number"==typeof t?t:e,this.each(function(){this.setSelectionRange?this.setSelectionRange(e,t):this.createTextRange&&(n=this.createTextRange(),n.collapse(!0),n.moveEnd("character",t),n.moveStart("character",e),n.select())})):(this[0].setSelectionRange?(e=this[0].selectionStart,t=this[0].selectionEnd):document.selection&&document.selection.createRange&&(n=document.selection.createRange(),e=0-n.duplicate().moveStart("character",-1e5),t=e+n.text.length),{begin:e,end:t})},unmask:function(){return this.trigger("unmask")},mask:function(t,r){var c,l,s,u,f,h;return!t&&this.length>0?(c=e(this[0]),c.data(e.mask.dataName)()):(r=e.extend({placeholder:e.mask.placeholder,completed:null},r),l=e.mask.definitions,s=[],u=h=t.length,f=null,e.each(t.split(""),function(e,t){"?"==t?(h--,u=e):l[t]?(s.push(RegExp(l[t])),null===f&&(f=s.length-1)):s.push(null)}),this.trigger("unmask").each(function(){function c(e){for(;h>++e&&!s[e];);return e}function d(e){for(;--e>=0&&!s[e];);return e}function m(e,t){var n,a;if(!(0>e)){for(n=e,a=c(t);h>n;n++)if(s[n]){if(!(h>a&&s[n].test(R[a])))break;R[n]=R[a],R[a]=r.placeholder,a=c(a)}b(),x.caret(Math.max(f,e))}}function p(e){var t,n,a,i;for(t=e,n=r.placeholder;h>t;t++)if(s[t]){if(a=c(t),i=R[t],R[t]=n,!(h>a&&s[a].test(i)))break;n=i}}function g(e){var t,n,a,r=e.which;8===r||46===r||i&&127===r?(t=x.caret(),n=t.begin,a=t.end,0===a-n&&(n=46!==r?d(n):a=c(n-1),a=46===r?c(a):a),k(n,a),m(n,a-1),e.preventDefault()):27==r&&(x.val(S),x.caret(0,y()),e.preventDefault())}function v(t){var n,a,i,l=t.which,u=x.caret();t.ctrlKey||t.altKey||t.metaKey||32>l||l&&(0!==u.end-u.begin&&(k(u.begin,u.end),m(u.begin,u.end-1)),n=c(u.begin-1),h>n&&(a=String.fromCharCode(l),s[n].test(a)&&(p(n),R[n]=a,b(),i=c(n),o?setTimeout(e.proxy(e.fn.caret,x,i),0):x.caret(i),r.completed&&i>=h&&r.completed.call(x))),t.preventDefault())}function k(e,t){var n;for(n=e;t>n&&h>n;n++)s[n]&&(R[n]=r.placeholder)}function b(){x.val(R.join(""))}function y(e){var t,n,a=x.val(),i=-1;for(t=0,pos=0;h>t;t++)if(s[t]){for(R[t]=r.placeholder;pos++a.length)break}else R[t]===a.charAt(pos)&&t!==u&&(pos++,i=t);return e?b():u>i+1?(x.val(""),k(0,h)):(b(),x.val(x.val().substring(0,i+1))),u?t:f}var x=e(this),R=e.map(t.split(""),function(e){return"?"!=e?l[e]?r.placeholder:e:void 0}),S=x.val();x.data(e.mask.dataName,function(){return e.map(R,function(e,t){return s[t]&&e!=r.placeholder?e:null}).join("")}),x.attr("readonly")||x.one("unmask",function(){x.unbind(".mask").removeData(e.mask.dataName)}).bind("focus.mask",function(){clearTimeout(n);var e;S=x.val(),e=y(),n=setTimeout(function(){b(),e==t.length?x.caret(0,e):x.caret(e)},10)}).bind("blur.mask",function(){y(),x.val()!=S&&x.change()}).bind("keydown.mask",g).bind("keypress.mask",v).bind(a,function(){setTimeout(function(){var e=y(!0);x.caret(e),r.completed&&e==x.val().length&&r.completed.call(x)},0)}),y()}))}})})(jQuery); \ No newline at end of file diff --git a/js/jquery.placeholder.1.2.min.js b/js/jquery.placeholder.1.2.min.js old mode 100755 new mode 100644 diff --git a/js/jquery.qtip-1.0.0-rc2.min.js b/js/jquery.qtip-1.0.0-rc2.min.js deleted file mode 100755 index 6203ac5..0000000 --- a/js/jquery.qtip-1.0.0-rc2.min.js +++ /dev/null @@ -1,15 +0,0 @@ -/* - * jquery.qtip. The jQuery tooltip plugin - * - * Copyright (c) 2009 Craig Thompson - * http://craigsworks.com - * - * Licensed under MIT - * http://www.opensource.org/licenses/mit-license.php - * - * Launch : February 2009 - * Version : 1.0.0-rc2 - * Released: Monday 27th April, 2009 - 23:30 - * Debug: jquery.qtip.debug.js - */ -(function(f){f.fn.qtip=function(z,t){var x,s,y,r,w,v,u;if(!t){t=false}if(typeof z=="string"){if(z=="api"){if(typeof f(this).eq(0).data("qtip")=="object"){return f(this).eq(0).data("qtip")}else{f.fn.qtip.log.error.call(self,1,f.fn.qtip.constants.NO_TOOLTIP_PRESENT,false)}}}else{if(!z){z={}}if(typeof z.content!=="object"){z.content={text:z.content}}if(typeof z.content.title!=="object"){z.content.title={text:z.content.title}}if(typeof z.position!=="object"){z.position={corner:z.position}}if(typeof z.position.corner!=="object"){z.position.corner={target:z.position.corner,tooltip:z.position.corner}}if(typeof z.show!=="object"){z.show={when:z.show}}if(typeof z.show.when!=="object"){z.show.when={event:z.show.when}}if(typeof z.show.effect!=="object"){z.show.effect={type:z.show.effect}}if(typeof z.hide!=="object"){z.hide={when:z.hide}}if(typeof z.hide.when!=="object"){z.hide.when={event:z.hide.when}}if(typeof z.hide.effect!=="object"){z.hide.effect={type:z.hide.effect}}if(typeof z.style!=="object"){z.style={name:z.style}}z.style=c(z.style);r=f.extend(true,{},f.fn.qtip.defaults,z);r.style=a.call({options:r},r.style);r.user=f.extend(true,{},z)}return f(this).each(function(){if(typeof z=="string"){v=z.toLowerCase();y=f(this).data("interfaces");if(typeof y=="object"){if(t&&v=="destroy"){while(y.length>0){y[y.length-1].destroy()}}else{if(t===false){y=[y[y.length-1]]}for(x=0;x0))}if(typeof r.options.show.solo=="object"){y=f(r.options.show.solo)}else{if(r.options.show.solo===true){y=f("div.qtip").not(r.elements.tooltip)}}if(y){y.each(function(){if(f(this).qtip("api").status.rendered===true){f(this).qtip("api").hide()}})}if(typeof r.options.show.effect.type=="function"){r.options.show.effect.type.call(r.elements.tooltip,r.options.show.effect.length);r.elements.tooltip.queue(function(){v();f(this).dequeue()})}else{switch(r.options.show.effect.type.toLowerCase()){case"fade":r.elements.tooltip.fadeIn(r.options.show.effect.length,v);break;case"slide":r.elements.tooltip.slideDown(r.options.show.effect.length,function(){v();if(r.options.position.type!=="static"){r.updatePosition(x,true)}});break;case"grow":r.elements.tooltip.show(r.options.show.effect.length,v);break;default:r.elements.tooltip.show(null,v);break}r.elements.tooltip.addClass(r.options.style.classes.active)}r.onShow.call(r,x);f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.EVENT_SHOWN,"show");return r},hide:function(x){var w;if(!r.status.rendered){f.fn.qtip.log.error.call(r,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"hide");return r}if(r.elements.tooltip.css("display")==="none"){return r}clearTimeout(r.timers.show);r.elements.tooltip.stop(true,true);w=r.beforeHide.call(r,x);if(w===false){return r}function v(){r.onHide.call(r,x)}if(typeof r.options.show.when.target.data("qtip-toggle")=="number"){r.options.show.when.target.data("qtip-toggle",0)}if(typeof r.options.hide.effect.type=="function"){r.options.hide.effect.type.call(r.elements.tooltip,r.options.hide.effect.length);r.elements.tooltip.queue(function(){v();f(this).dequeue()})}else{switch(r.options.hide.effect.type.toLowerCase()){case"fade":r.elements.tooltip.fadeOut(r.options.hide.effect.length,v);break;case"slide":r.elements.tooltip.slideUp(r.options.hide.effect.length,v);break;case"grow":r.elements.tooltip.hide(r.options.hide.effect.length,v);break;default:r.elements.tooltip.hide(null,v);break}r.elements.tooltip.removeClass(r.options.style.classes.active)}r.onHide.call(r,x);f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.EVENT_HIDDEN,"hide");return r},updatePosition:function(v,w){var B,F,K,I,G,D,x,H,A,C,J,z,E,y;if(!r.status.rendered){f.fn.qtip.log.error.call(r,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"updatePosition");return r}else{if(r.options.position.type=="static"){f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.CANNOT_POSITION_STATIC,"updatePosition");return r}}F={position:{left:0,top:0},dimensions:{height:0,width:0},corner:r.options.position.corner.target};K={position:r.getPosition(),dimensions:r.getDimensions(),corner:r.options.position.corner.tooltip};if(r.options.position.target!=="mouse"){if(r.options.position.target.get(0).nodeName.toLowerCase()=="area"){I=r.options.position.target.attr("coords").split(",");for(B=0;BF.dimensions.width){F.dimensions.width=I[B]}if(I[B]F.dimensions.height){F.dimensions.height=I[B]}if(I[B]0){if(K.corner.search(/Left/)!==-1){x.left-=r.options.style.border.radius}else{if(K.corner.search(/Right/)!==-1){x.left+=r.options.style.border.radius}}if(K.corner.search(/Top/)!==-1){x.top-=r.options.style.border.radius}else{if(K.corner.search(/Bottom/)!==-1){x.top+=r.options.style.border.radius}}}if(H){if(K.corner.search(/top/)!==-1){x.top-=H}else{if(K.corner.search(/bottom/)!==-1){x.top+=H}}if(K.corner.search(/left/)!==-1){x.left-=H}else{if(K.corner.search(/right/)!==-1){x.left+=H}}if(K.corner.search(/leftMiddle|rightMiddle/)!==-1){x.top-=1}}if(r.options.position.adjust.screen===true){x=n.call(r,x,F,K)}if(r.options.position.target==="mouse"&&r.options.position.adjust.mouse===true){if(r.options.position.adjust.screen===true&&r.elements.tip){J=r.elements.tip.attr("rel")}else{J=r.options.position.corner.tooltip}x.left+=(J.search(/right/i)!==-1)?-6:6;x.top+=(J.search(/bottom/i)!==-1)?-6:6}if(!r.elements.bgiframe&&f.browser.msie&&parseInt(f.browser.version.charAt(0))==6){f("select, object").each(function(){z=f(this).offset();z.bottom=z.top+f(this).height();z.right=z.left+f(this).width();if(x.top+K.dimensions.height>=z.top&&x.left+K.dimensions.width>=z.left){j.call(r)}})}x.left+=r.options.position.adjust.x;x.top+=r.options.position.adjust.y;E=r.getPosition();if(x.left!=E.left||x.top!=E.top){y=r.beforePositionUpdate.call(r,v);if(y===false){return r}if(w===true){r.elements.tooltip.animate(x,200,"swing")}else{r.elements.tooltip.css(x)}r.onPositionUpdate.call(r,v);if(typeof v!=="undefined"&&v.type&&v.type!=="mousemove"){f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.EVENT_POSITION_UPDATED,"updatePosition")}}return r},updateWidth:function(v){if(!r.status.rendered){f.fn.qtip.log.error.call(r,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"updateWidth");return r}if(v&&typeof v!=="number"){f.fn.qtip.log.error.call(r,2,"newWidth must be of type number","updateWidth");return r}if(!v){if(typeof r.options.style.width.value=="number"){v=r.options.style.width.value}else{r.elements.tooltip.css({width:"auto"});r.elements.contentWrapper.siblings().add(r.elements.tip).hide();if(f.browser.msie){r.elements.wrapper.add(r.elements.contentWrapper.children()).css({zoom:"normal"})}v=r.getDimensions().width+1;if(!r.options.style.width.value){if(v>r.options.style.width.max){v=r.options.style.width.max}if(v").get(0).getContext){y=r.elements.tooltip.find(".qtip-tip canvas:first");w=y.get(0).getContext("2d");w.clearRect(0,0,300,300);x=y.parent("div[rel]:first").attr("rel");A=b(x,r.options.style.tip.size.width,r.options.style.tip.size.height);h.call(r,y,A,r.options.style.tip.color||r.options.style.border.color)}else{if(f.browser.msie){y=r.elements.tooltip.find('.qtip-tip [nodeName="shape"]');y.attr("fillcolor",r.options.style.tip.color||r.options.style.border.color)}}}if(r.options.style.border.radius>0){r.elements.tooltip.find(".qtip-betweenCorners").css({backgroundColor:r.options.style.border.color});if(f("").get(0).getContext){z=g(r.options.style.border.radius);r.elements.tooltip.find(".qtip-wrapper canvas").each(function(){w=f(this).get(0).getContext("2d");w.clearRect(0,0,300,300);x=f(this).parent("div[rel]:first").attr("rel");q.call(r,f(this),z[x],r.options.style.border.radius,r.options.style.border.color)})}else{if(f.browser.msie){r.elements.tooltip.find('.qtip-wrapper [nodeName="arc"]').each(function(){f(this).attr("fillcolor",r.options.style.border.color)})}}}f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.EVENT_STYLE_UPDATED,"updateStyle");return r},updateContent:function(z,x){var y,w,v;if(!r.status.rendered){f.fn.qtip.log.error.call(r,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"updateContent");return r}else{if(!z){f.fn.qtip.log.error.call(r,2,"You must specify some content with which to update","updateContent");return false}}y=r.beforeContentUpdate.call(r,z);if(typeof y=="string"){z=y}else{if(y===false){return}}if(f.browser.msie){r.elements.contentWrapper.children().css({zoom:"normal"})}if(z.jquery&&z.length>0){z.clone(true).appendTo(r.elements.content)}else{r.elements.content.html(z)}w=r.elements.content.find("img[complete=false]");if(w.length>0){v=0;w.each(function(B){f('').load(function(){if(++v==w.length){A()}})})}else{A()}function A(){r.updateWidth();if(x!==false){if(r.options.position.type!=="static"){r.updatePosition(r.elements.tooltip.is(":visible"),true)}if(r.options.style.tip.corner!==false){m.call(r)}}}r.onContentUpdate.call(r);f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.EVENT_CONTENT_UPDATED,"loadContent");return r},loadContent:function(v,y,z){var x;if(!r.status.rendered){f.fn.qtip.log.error.call(r,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"loadContent");return r}x=r.beforeContentLoad.call(r);if(x===false){return r}if(z=="post"){f.post(v,y,w)}else{f.get(v,y,w)}function w(A){r.onContentLoad.call(r);f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.EVENT_CONTENT_LOADED,"loadContent");r.updateContent(A)}return r},focus:function(y){var w,v,x;if(!r.status.rendered){f.fn.qtip.log.error.call(r,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"focus");return r}else{if(r.options.position.type=="static"){f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.CANNOT_FOCUS_STATIC,"focus");return r}}w=parseInt(r.elements.tooltip.css("z-index"));v=6000+f(".qtip").length-1;if(!r.status.focussed&&w!==v){x=r.beforeFocus.call(r,y);if(x===false){return r}f(".qtip").not(r.elements.tooltip).each(function(){if(f(this).qtip("api").status.rendered===true){if(typeof parseInt(f(this).css("z-index"))=="number"){f(this).css({zIndex:parseInt(f(this).css("z-index"))-1})}f(this).qtip("api").status.focused=false}});r.elements.tooltip.css({zIndex:v});r.status.focused=true;r.onFocus.call(r,y);f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.EVENT_FOCUSED,"focus")}return r},disable:function(v){if(!r.status.rendered){f.fn.qtip.log.error.call(r,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"disable");return r}if(v){if(!r.status.disabled){r.status.disabled=true;f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.EVENT_DISABLED,"disable")}else{f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.TOOLTIP_ALREADY_DISABLED,"disable")}}else{if(r.status.disabled){r.status.disabled=false;f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.EVENT_ENABLED,"disable")}else{f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.TOOLTIP_ALREADY_ENABLED,"disable")}}return r},destroy:function(){var v,w,x;w=r.beforeDestroy.call(r);if(w===false){return r}if(r.status.rendered){r.options.show.when.target.unbind("mousemove.qtip",r.updatePosition);r.options.show.when.target.unbind("mouseout.qtip",r.hide);r.options.show.when.target.unbind(r.options.show.when.event+".qtip");r.options.show.when.target.removeData("qtip-toggle");r.options.hide.when.target.unbind(r.options.hide.when.event+".qtip");r.elements.tooltip.unbind(r.options.hide.when.event+".qtip");r.elements.tooltip.unbind("mouseover.qtip",r.focus);r.elements.tooltip.remove()}else{r.options.show.when.target.unbind(r.options.show.when.event+".qtip-create")}x=r.elements.target.data("interfaces");if(typeof x=="object"&&x.length>0){for(v=0;v0){r.elements.target.data("qtip",x[x.length-1])}else{r.elements.target.removeData("qtip")}r.onDestroy.call(r);f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.EVENT_DESTROYED,"destroy");return r.elements.target},getPosition:function(){var v,w;if(!r.status.rendered){f.fn.qtip.log.error.call(r,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"getPosition");return r}v=(r.elements.tooltip.css("display")!=="none")?false:true;if(v){r.elements.tooltip.css({visiblity:"hidden"}).show()}w=r.elements.tooltip.offset();if(v){r.elements.tooltip.css({visiblity:"visible"}).hide()}return w},getDimensions:function(){var v,w;if(!r.status.rendered){f.fn.qtip.log.error.call(r,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"getDimensions");return r}v=(!r.elements.tooltip.is(":visible"))?true:false;if(v){r.elements.tooltip.css({visiblity:"hidden"}).show()}w={height:r.elements.tooltip.outerHeight(),width:r.elements.tooltip.outerWidth()};if(v){r.elements.tooltip.css({visiblity:"visible"}).hide()}return w}});o.call(r)}function o(){var r,u,s;r=this;if(r.options.content.prerender===false&&r.options.show.when.event!==false&&r.options.show.ready!==true){u=r.options.show.when.target;s=r.options.show.when.event;u.bind(s+".qtip-create",function(v){u.unbind(s+".qtip-create");t();r.cache.mouse={x:v.pageX,y:v.pageY};u.trigger(s)})}else{t()}function t(){var y,w,v,x,A,z;r.status.rendered=true;r.beforeRender.call(r);r.elements.tooltip='';r.elements.tooltip=f(r.elements.tooltip);r.elements.tooltip.appendTo(r.options.position.container).data("qtip",r);r.elements.wrapper=r.elements.tooltip.children("div:first").css({zoom:(f.browser.msie)?1:0});r.elements.contentWrapper=r.elements.wrapper.children("div:first").css({background:r.options.style.background});r.elements.content=r.elements.contentWrapper.children("div:first").css(p(r.options.style)).css({zoom:(f.browser.msie)?1:0});if(typeof r.options.style.width.value=="number"){r.updateWidth()}if(f("").get(0).getContext||f.browser.msie){if(r.options.style.border.radius>0){l.call(r)}else{r.elements.contentWrapper.css({border:r.options.style.border.width+"px solid "+r.options.style.border.color})}if(r.options.style.tip.corner!==false){e.call(r)}}else{r.elements.contentWrapper.css({border:r.options.style.border.width+"px solid "+r.options.style.border.color});r.options.style.border.radius=0;r.options.style.tip.corner=false;f.fn.qtip.log.error.call(r,2,f.fn.qtip.constants.CANVAS_VML_NOT_SUPPORTED,"render")}if(typeof r.options.content.text=="string"){w=r.options.content.text}else{if(r.options.content.text.jquery&&r.options.content.text.length>0){w=r.options.content.text}else{if(r.options.content.text===false){w=r.elements.target.attr("title").replace("\\n","
            ");r.elements.target.attr("title","")}else{w=" ";f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.NO_VALID_CONTENT,"render")}}}if(r.options.content.title.text!==false){i.call(r)}r.updateContent(w);if(r.options.content.url!==false){v=r.options.content.url;x=r.options.content.data;A=r.options.content.method||"get";r.loadContent(v,x,A)}k.call(r);if(r.options.show.ready===true){r.show()}r.onRender.call(r);f.fn.qtip.log.error.call(r,1,f.fn.qtip.constants.EVENT_RENDERED,"render")}}function l(){var E,y,s,A,w,D,t,F,C,x,v,B,z,r,u;E=this;E.elements.wrapper.find(".qtip-borderBottom, .qtip-borderTop").remove();s=E.options.style.border.width;A=E.options.style.border.radius;w=E.options.style.border.color||E.options.style.tip.color;D=g(A);t={};for(y in D){t[y]='
            ';if(f("").get(0).getContext){t[y]+=''}else{if(f.browser.msie){F=A*2+3;t[y]+=''}}t[y]+="
            "}C=E.getDimensions().width-(Math.max(s,A)*2);x='
            ';v='
            '+t.topLeft+t.topRight+x;E.elements.wrapper.prepend(v);B='
            '+t.bottomLeft+t.bottomRight+x;E.elements.wrapper.append(B);if(f("").get(0).getContext){E.elements.wrapper.find("canvas").each(function(){z=D[f(this).parent("[rel]:first").attr("rel")];q.call(E,f(this),z,A,w)})}else{if(f.browser.msie){E.elements.tooltip.append('')}}r=Math.max(A,(A+(s-A)));u=Math.max(s-A,0);E.elements.contentWrapper.css({border:"0px solid "+w,borderWidth:u+"px "+r+"px"})}function q(t,v,r,s){var u=t.get(0).getContext("2d");u.fillStyle=s;u.beginPath();u.arc(v[0],v[1],r,0,Math.PI*2,false);u.fill()}function e(u){var s,r,w,t,v;s=this;if(s.elements.tip!==null){s.elements.tip.remove()}r=s.options.style.tip.color||s.options.style.border.color;if(s.options.style.tip.corner===false){return}else{if(!u){u=s.options.style.tip.corner}}w=b(u,s.options.style.tip.size.width,s.options.style.tip.size.height);s.elements.tip='
            ';if(f("").get(0).getContext){s.elements.tip+=''}else{if(f.browser.msie){t=s.options.style.tip.size.width+","+s.options.style.tip.size.height;v="m"+w[0][0]+","+w[0][1];v+=" l"+w[1][0]+","+w[1][1];v+=" "+w[2][0]+","+w[2][1];v+=" xe";s.elements.tip+='';s.elements.tip+='';s.elements.contentWrapper.css("position","relative")}}s.elements.tooltip.prepend(s.elements.tip+"
            ");s.elements.tip=s.elements.tooltip.find("."+s.options.style.classes.tip).eq(0);if(f("").get(0).getContext){h.call(s,s.elements.tip.find("canvas:first"),w,r)}if(u.search(/top/)!==-1&&f.browser.msie&&parseInt(f.browser.version.charAt(0))===6){s.elements.tip.css({marginTop:-4})}m.call(s,u)}function h(s,u,r){var t=s.get(0).getContext("2d");t.fillStyle=r;t.beginPath();t.moveTo(u[0][0],u[0][1]);t.lineTo(u[1][0],u[1][1]);t.lineTo(u[2][0],u[2][1]);t.fill()}function m(u){var s,w,r,x,t,v;s=this;if(s.options.style.tip.corner===false||!s.elements.tip){return}if(!u){u=s.elements.tip.attr("rel")}w=positionAdjust=(f.browser.msie)?1:0;s.elements.tip.css(u.match(/left|right|top|bottom/)[0],0);if(u.search(/top|bottom/)!==-1){if(f.browser.msie){if(parseInt(f.browser.version.charAt(0))===6){positionAdjust=(u.search(/top/)!==-1)?-3:1}else{positionAdjust=(u.search(/top/)!==-1)?1:2}}if(u.search(/Middle/)!==-1){s.elements.tip.css({left:"50%",marginLeft:-(s.options.style.tip.size.width/2)})}else{if(u.search(/Left/)!==-1){s.elements.tip.css({left:s.options.style.border.radius-w})}else{if(u.search(/Right/)!==-1){s.elements.tip.css({right:s.options.style.border.radius+w})}}}if(u.search(/top/)!==-1){s.elements.tip.css({top:-positionAdjust})}else{s.elements.tip.css({bottom:positionAdjust})}}else{if(u.search(/left|right/)!==-1){if(f.browser.msie){positionAdjust=(parseInt(f.browser.version.charAt(0))===6)?1:((u.search(/left/)!==-1)?1:2)}if(u.search(/Middle/)!==-1){s.elements.tip.css({top:"50%",marginTop:-(s.options.style.tip.size.height/2)})}else{if(u.search(/Top/)!==-1){s.elements.tip.css({top:s.options.style.border.radius-w})}else{if(u.search(/Bottom/)!==-1){s.elements.tip.css({bottom:s.options.style.border.radius+w})}}}if(u.search(/left/)!==-1){s.elements.tip.css({left:-positionAdjust})}else{s.elements.tip.css({right:positionAdjust})}}}r="padding-"+u.match(/left|right|top|bottom/)[0];x=s.options.style.tip.size[(r.search(/left|right/)!==-1)?"width":"height"];s.elements.tooltip.css("padding",0);s.elements.tooltip.css(r,x);if(f.browser.msie&&parseInt(f.browser.version.charAt(0))==6){t=parseInt(s.elements.tip.css("margin-top"));v=t+parseInt(s.elements.content.css("margin-top"));s.elements.tip.css({marginTop:v})}}function i(){var r=this;if(r.elements.title!==null){r.elements.title.remove()}r.elements.title=f("
            ").addClass(r.options.style.classes.title).css(p(r.options.style.title,true)).css({zoom:(f.browser.msie)?1:0}).html(r.options.content.title.text).prependTo(r.elements.contentWrapper);if(r.options.content.title.button!==false&&typeof r.options.content.title.button=="string"){f('').attr("href","#").addClass(r.options.style.classes.button).html(r.options.content.title.button).prependTo(r.elements.title).click(function(){if(!r.status.disabled){r.hide()}})}}function k(){var s,u,t,r;s=this;u=s.options.show.when.target;t=s.options.hide.when.target;if(s.options.hide.fixed){t=t.add(s.elements.tooltip)}if(s.options.hide.when.event=="inactive"){r=["click","dblclick","mousedown","mouseup","mousemove","mouseout","mouseenter","mouseleave","mouseover"];function x(){if(s.status.disabled===true){return}clearTimeout(s.timers.inactive);s.timers.inactive=setTimeout(function(){f(r).each(function(){t.unbind(this+".qtip-inactive");s.elements.content.unbind(this+".qtip-inactive")});s.hide()},s.options.hide.delay)}}else{if(s.options.hide.fixed===true){s.elements.tooltip.bind("mouseover.qtip",function(){if(s.status.disabled===true){return}clearTimeout(s.timers.hide)})}}function w(y){if(s.status.disabled===true){return}if(s.options.hide.when.event=="inactive"){f(r).each(function(){t.bind(this+".qtip-inactive",x);s.elements.content.bind(this+".qtip-inactive",x)});x()}clearTimeout(s.timers.show);clearTimeout(s.timers.hide);s.timers.show=setTimeout(function(){s.show(y)},s.options.show.delay)}function v(y){if(s.status.disabled===true){return}if(s.options.hide.fixed===true&&s.options.hide.when.event.search(/mouse(out|leave)/i)!==-1&&f(y.relatedTarget).parents(".qtip").length>0){y.stopPropagation();y.preventDefault();clearTimeout(s.timers.hide);return false}clearTimeout(s.timers.show);clearTimeout(s.timers.hide);s.timers.hide=setTimeout(function(){s.hide(y)},s.options.hide.delay)}if((s.options.show.when.target.add(s.options.hide.when.target).length===1&&s.options.show.when.event==s.options.hide.when.event&&s.options.hide.when.event!=="inactive")||s.options.hide.when.event=="unfocus"){u.data("qtip-toggle",0);if(s.options.hide.when.event=="unfocus"){s.elements.tooltip.attr("unfocus",true)}u.bind(s.options.show.when.event+".qtip",function(y){if(parseInt(f(this).data("qtip-toggle"))===0){w(y)}else{v(y)}})}else{u.bind(s.options.show.when.event+".qtip",w);if(s.options.hide.when.event!=="inactive"){t.bind(s.options.hide.when.event+".qtip",v)}}if(s.options.position.type.search(/(fixed|absolute)/)!==-1){s.elements.tooltip.bind("mouseover.qtip",s.focus)}if(s.options.position.target==="mouse"&&s.options.position.type!=="static"){u.bind("mousemove.qtip",function(y){s.cache.mouse={x:y.pageX,y:y.pageY};if(s.status.disabled===false&&s.options.position.adjust.mouse===true&&s.options.position.type!=="static"&&s.elements.tooltip.css("display")!=="none"){s.updatePosition(y)}})}}function n(r,w,v){var s,y,u,x,t;s=this;if(v.corner=="center"){return w.position}y=f.extend({},r);u={x:false,y:false};x={left:(y.left=f.fn.qtip.cache.screen.width+f.fn.qtip.cache.screen.scroll.left),top:(y.top=f.fn.qtip.cache.screen.height+f.fn.qtip.cache.screen.scroll.top)};s.cache.position.adjust={left:(x.left&&(v.corner.search(/right/i)!=-1||(v.corner.search(/right/i)==-1&&!x.right))),right:(x.right&&(v.corner.search(/left/i)!=-1||(v.corner.search(/left/i)==-1&&!x.left))),top:(x.top&&v.corner.search(/top/i)==-1),bottom:(x.bottom&&v.corner.search(/bottom/i)==-1)};if(s.cache.position.adjust.left){if(s.options.position.target!=="mouse"){y.left=w.position.left+w.dimensions.width}else{y.left=s.cache.mouse.x}u.x="Left"}else{if(s.cache.position.adjust.right){if(s.options.position.target!=="mouse"){y.left=w.position.left-v.dimensions.width}else{y.left=s.cache.mouse.x-v.dimensions.width}u.x="Right"}}if(s.cache.position.adjust.top){if(s.options.position.target!=="mouse"){y.top=w.position.top+w.dimensions.height}else{y.top=s.cache.mouse.y}u.y="top"}else{if(s.cache.position.adjust.bottom){if(s.options.position.target!=="mouse"){y.top=w.position.top-v.dimensions.height}else{y.top=s.cache.mouse.y-v.dimensions.height}u.y="bottom"}}if(y.left<0){y.left=r.left;u.x=false}if(y.top<0){y.top=r.top;u.y=false}if(s.options.style.tip.corner!==false){y.corner=new String(v.corner);if(u.x!==false){y.corner=y.corner.replace(/Left|Right|Middle/,u.x)}if(u.y!==false){y.corner=y.corner.replace(/top|bottom/,u.y)}if(y.corner!==s.elements.tip.attr("rel")){e.call(s,y.corner)}}return y}function p(s,u){var t,r;t=f.extend(true,{},s);for(r in t){if(u===true&&r.search(/(tip|classes)/i)!==-1){delete t[r]}else{if(r.search(/(width|border|tip|title|classes|user)/i)!==-1){delete t[r]}}}return t}function c(r){if(typeof r.tip!=="object"){r.tip={corner:r.tip}}if(typeof r.tip.size!=="object"){r.tip.size={width:r.tip.size,height:r.tip.size}}if(typeof r.border!=="object"){r.border={width:r.border}}if(typeof r.width!=="object"){r.width={value:r.width}}if(typeof r.width.max=="string"){r.width.max=parseInt(r.width.max.replace(/([0-9]+)/i,"$1"))}if(typeof r.width.min=="string"){r.width.min=parseInt(r.width.min.replace(/([0-9]+)/i,"$1"))}if(typeof r.tip.size.x=="number"){r.tip.size.width=r.tip.size.x;delete r.tip.size.x}if(typeof r.tip.size.y=="number"){r.tip.size.height=r.tip.size.y;delete r.tip.size.y}return r}function a(){var r,s,t,w,u,v;r=this;t=[true,{}];for(s=0;s0){u.tip.size.width+=1}if(u.tip.size.height%2>0){u.tip.size.height+=1}if(u.tip.corner===true){u.tip.corner=(r.options.position.corner.tooltip==="center")?false:r.options.position.corner.tooltip}return u}function b(u,t,s){var r={bottomRight:[[0,0],[t,s],[t,0]],bottomLeft:[[0,0],[t,0],[0,s]],topRight:[[0,s],[t,0],[t,s]],topLeft:[[0,0],[0,s],[t,s]],topMiddle:[[0,s],[t/2,0],[t,s]],bottomMiddle:[[0,0],[t,0],[t/2,s]],rightMiddle:[[0,0],[t,s/2],[0,s]],leftMiddle:[[t,0],[t,s],[0,s/2]]};r.leftTop=r.bottomRight;r.rightTop=r.bottomLeft;r.leftBottom=r.topRight;r.rightBottom=r.topLeft;return r[u]}function g(r){var s;if(f("").get(0).getContext){s={topLeft:[r,r],topRight:[0,r],bottomLeft:[r,0],bottomRight:[0,0]}}else{if(f.browser.msie){s={topLeft:[-90,90,0],topRight:[-90,90,-r],bottomLeft:[90,270,0],bottomRight:[90,270,-r]}}}return s}function j(){var r,s,t;r=this;t=r.getDimensions();s='
            "); - jQuery("#TB_overlay").click(tb_remove); - } - }else{//all others - if(document.getElementById("TB_overlay") === null){ - jQuery("body").append("
            "); - jQuery("#TB_overlay").click(tb_remove); - } - } - - if(tb_detectMacXFF()){ - jQuery("#TB_overlay").addClass("TB_overlayMacFFBGHack");//use png overlay so hide flash - }else{ - jQuery("#TB_overlay").addClass("TB_overlayBG");//use background and opacity - } - - if(caption===null){caption="";} - jQuery("body").append("
            ");//add loader to the page - jQuery('#TB_load').show();//show loader - - var baseURL; - if(url.indexOf("?")!==-1){ //ff there is a query string involved - baseURL = url.substr(0, url.indexOf("?")); - }else{ - baseURL = url; - } - - var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/; - var urlType = baseURL.toLowerCase().match(urlString); - - if(urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif' || urlType == '.bmp'){//code to show images - - TB_PrevCaption = ""; - TB_PrevURL = ""; - TB_PrevHTML = ""; - TB_NextCaption = ""; - TB_NextURL = ""; - TB_NextHTML = ""; - TB_imageCount = ""; - TB_FoundURL = false; - if(imageGroup){ - TB_TempArray = jQuery("a[rel="+imageGroup+"]").get(); - for (TB_Counter = 0; ((TB_Counter < TB_TempArray.length) && (TB_NextHTML === "")); TB_Counter++) { - var urlTypeTemp = TB_TempArray[TB_Counter].href.toLowerCase().match(urlString); - if (!(TB_TempArray[TB_Counter].href == url)) { - if (TB_FoundURL) { - TB_NextCaption = TB_TempArray[TB_Counter].title; - TB_NextURL = TB_TempArray[TB_Counter].href; - TB_NextHTML = "  
            "+thickboxL10n.next+""; - } else { - TB_PrevCaption = TB_TempArray[TB_Counter].title; - TB_PrevURL = TB_TempArray[TB_Counter].href; - TB_PrevHTML = "  "+thickboxL10n.prev+""; - } - } else { - TB_FoundURL = true; - TB_imageCount = thickboxL10n.image + ' ' + (TB_Counter + 1) + ' ' + thickboxL10n.of + ' ' + (TB_TempArray.length); - } - } - } - - imgPreloader = new Image(); - imgPreloader.onload = function(){ - imgPreloader.onload = null; - - // Resizing large images - orginal by Christian Montoya edited by me. - var pagesize = tb_getPageSize(); - var x = pagesize[0] - 150; - var y = pagesize[1] - 150; - var imageWidth = imgPreloader.width; - var imageHeight = imgPreloader.height; - if (imageWidth > x) { - imageHeight = imageHeight * (x / imageWidth); - imageWidth = x; - if (imageHeight > y) { - imageWidth = imageWidth * (y / imageHeight); - imageHeight = y; - } - } else if (imageHeight > y) { - imageWidth = imageWidth * (y / imageHeight); - imageHeight = y; - if (imageWidth > x) { - imageHeight = imageHeight * (x / imageWidth); - imageWidth = x; - } - } - // End Resizing - - TB_WIDTH = imageWidth + 30; - TB_HEIGHT = imageHeight + 60; - jQuery("#TB_window").append(""+caption+"" + "
            "+caption+"
            " + TB_imageCount + TB_PrevHTML + TB_NextHTML + "
            "); - - jQuery("#TB_closeWindowButton").click(tb_remove); - - if (!(TB_PrevHTML === "")) { - function goPrev(){ - if(jQuery(document).unbind("click",goPrev)){jQuery(document).unbind("click",goPrev);} - jQuery("#TB_window").remove(); - jQuery("body").append("
            "); - tb_show(TB_PrevCaption, TB_PrevURL, imageGroup); - return false; - } - jQuery("#TB_prev").click(goPrev); - } - - if (!(TB_NextHTML === "")) { - function goNext(){ - jQuery("#TB_window").remove(); - jQuery("body").append("
            "); - tb_show(TB_NextCaption, TB_NextURL, imageGroup); - return false; - } - jQuery("#TB_next").click(goNext); - - } - - jQuery(document).bind('keydown.thickbox', function(e){ - e.stopImmediatePropagation(); - - if ( e.which == 27 ){ // close - if ( ! jQuery(document).triggerHandler( 'wp_CloseOnEscape', [{ event: e, what: 'thickbox', cb: tb_remove }] ) ) - tb_remove(); - - } else if ( e.which == 190 ){ // display previous image - if(!(TB_NextHTML == "")){ - jQuery(document).unbind('thickbox'); - goNext(); - } - } else if ( e.which == 188 ){ // display next image - if(!(TB_PrevHTML == "")){ - jQuery(document).unbind('thickbox'); - goPrev(); - } - } - return false; - }); - - tb_position(); - jQuery("#TB_load").remove(); - jQuery("#TB_ImageOff").click(tb_remove); - jQuery("#TB_window").css({'visibility':'visible'}); //for safari using css instead of show - }; - - imgPreloader.src = url; - }else{//code to show html - - var queryString = url.replace(/^[^\?]+\??/,''); - var params = tb_parseQuery( queryString ); - __inlineId = params["inlineId"]; - - TB_WIDTH = (params['width']*1) + 30 || 630; //defaults to 630 if no paramaters were added to URL - TB_HEIGHT = (params['height']*1) + 40 || 440; //defaults to 440 if no paramaters were added to URL - ajaxContentW = TB_WIDTH - 30; - ajaxContentH = TB_HEIGHT - 45; - - if(url.indexOf('TB_iframe') != -1){// either iframe or ajax window - urlNoQuery = url.split('TB_'); - jQuery("#TB_iframeContent").remove(); - if(params['modal'] != "true"){//iframe no modal - jQuery("#TB_window").append("
            "+caption+"
            "); - }else{//iframe modal - jQuery("#TB_overlay").unbind(); - jQuery("#TB_window").append(""); - } - }else{// not an iframe, ajax - if(jQuery("#TB_window").css("visibility") != "visible"){ - if(params['modal'] != "true"){//ajax no modal - jQuery("#TB_window").append("
            "+caption+"
            "); - }else{//ajax modal - jQuery("#TB_overlay").unbind(); - jQuery("#TB_window").append("
            "); - } - }else{//this means the window is already up, we are just loading new content via ajax - jQuery("#TB_ajaxContent")[0].style.width = ajaxContentW +"px"; - jQuery("#TB_ajaxContent")[0].style.height = ajaxContentH +"px"; - jQuery("#TB_ajaxContent")[0].scrollTop = 0; - jQuery("#TB_ajaxWindowTitle").html(caption); - } - } - - jQuery("#TB_closeWindowButton").click(tb_remove); - - if(url.indexOf('TB_inline') != -1){ - jQuery("#TB_ajaxContent").append(jQuery('#' + params['inlineId']).children()); - jQuery("#TB_window").unload(function () { - - jQuery('#' + params['inlineId']).append( jQuery("#TB_ajaxContent").children() ); // move elements back when you're finished - }); - tb_position(); - jQuery("#TB_load").remove(); - jQuery("#TB_window").css({'visibility':'visible'}); - }else if(url.indexOf('TB_iframe') != -1){ - tb_position(); - if(jQuery.browser.safari){//safari needs help because it will not fire iframe onload - jQuery("#TB_load").remove(); - jQuery("#TB_window").css({'visibility':'visible'}); - } - }else{ - jQuery("#TB_ajaxContent").load(url += "&random=" + (new Date().getTime()),function(){//to do a post change this load method - tb_position(); - jQuery("#TB_load").remove(); - tb_init("#TB_ajaxContent a.thickbox"); - jQuery("#TB_window").css({'visibility':'visible'}); - }); - } - - } - - if(!params['modal']){ - jQuery(document).bind('keyup.thickbox', function(e){ - - if ( e.which == 27 ){ // close - e.stopImmediatePropagation(); - if ( ! jQuery(document).triggerHandler( 'wp_CloseOnEscape', [{ event: e, what: 'thickbox', cb: tb_remove }] ) ) - tb_remove(); - - return false; - } - }); - } - - } catch(e) { - //nothing here - } -} - -//helper functions below -function tb_showIframe(){ - jQuery("#TB_load").remove(); - jQuery("#TB_window").css({'visibility':'visible'}); -} - -function tb_remove() { - jQuery("#TB_imageOff").unbind("click"); - jQuery("#TB_closeWindowButton").unbind("click"); - - jQuery("#TB_window").fadeOut("fast", - function(){ - - if(__inlineId){ - jQuery('#'+ __inlineId).append( jQuery("#TB_ajaxContent").children() ); // move elements back when you're finished - __inlineId = ""; - } - - jQuery('#TB_window,#TB_overlay,#TB_HideSelect').unbind().remove(); - - }); - - jQuery("#TB_load").remove(); - if (typeof document.body.style.maxHeight == "undefined") {//if IE 6 - jQuery("body","html").css({height: "auto", width: "auto"}); - jQuery("html").css("overflow",""); - } - jQuery(document).unbind('.thickbox'); - - return false; -} - -function tb_position() { -var isIE6 = typeof document.body.style.maxHeight === "undefined"; -jQuery("#TB_window").css({marginLeft: '-' + parseInt((TB_WIDTH / 2),10) + 'px', width: TB_WIDTH + 'px'}); - if ( ! isIE6 ) { // take away IE6 - jQuery("#TB_window").css({marginTop: '-' + parseInt((TB_HEIGHT / 2),10) + 'px'}); - } -} - -function tb_parseQuery ( query ) { - var Params = {}; - if ( ! query ) {return Params;}// return empty object - var Pairs = query.split(/[;&]/); - for ( var i = 0; i < Pairs.length; i++ ) { - var KeyVal = Pairs[i].split('='); - if ( ! KeyVal || KeyVal.length != 2 ) {continue;} - var key = unescape( KeyVal[0] ); - var val = unescape( KeyVal[1] ); - val = val.replace(/\+/g, ' '); - Params[key] = val; - } - return Params; -} - -function tb_getPageSize(){ - var de = document.documentElement; - var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth; - var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight; - arrayPageSize = [w,h]; - return arrayPageSize; -} - -function tb_detectMacXFF() { - var userAgent = navigator.userAgent.toLowerCase(); - if (userAgent.indexOf('mac') != -1 && userAgent.indexOf('firefox')!=-1) { - return true; - } -} +/* + * Thickbox 3.1 - One Box To Rule Them All. + * By Cody Lindley (http://www.codylindley.com) + * Copyright (c) 2007 cody lindley + * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php +*/ + +if ( typeof tb_pathToImage != 'string' ) { + var tb_pathToImage = thickboxL10n.loadingAnimation; +} +if ( typeof tb_closeImage != 'string' ) { + var tb_closeImage = thickboxL10n.closeImage; +} + +/*!!!!!!!!!!!!!!!!! edit below this line at your own risk !!!!!!!!!!!!!!!!!!!!!!!*/ + +//on page load call tb_init +jQuery(document).ready(function(){ + tb_init('a.thickbox, area.thickbox, input.thickbox');//pass where to apply thickbox + imgLoader = new Image();// preload image + imgLoader.src = tb_pathToImage; +}); + +//add thickbox to href & area elements that have a class of .thickbox +function tb_init(domChunk){ + jQuery(domChunk).live('click', tb_click); +} + +function tb_click(){ + var t = this.title || this.name || null; + var a = this.href || this.alt; + var g = this.rel || false; + tb_show(t,a,g); + this.blur(); + return false; +} +var __inlineId = ""; +function tb_show(caption, url, imageGroup) {//function called when the user clicks on a thickbox link + + try { + if (typeof document.body.style.maxHeight === "undefined") {//if IE 6 + jQuery("body","html").css({height: "100%", width: "100%"}); + jQuery("html").css("overflow","hidden"); + if (document.getElementById("TB_HideSelect") === null) {//iframe to hide select elements in ie6 + jQuery("body").append("
            "); + jQuery("#TB_overlay").click(tb_remove); + } + }else{//all others + if(document.getElementById("TB_overlay") === null){ + jQuery("body").append("
            "); + jQuery("#TB_overlay").click(tb_remove); + } + } + + if(tb_detectMacXFF()){ + jQuery("#TB_overlay").addClass("TB_overlayMacFFBGHack");//use png overlay so hide flash + }else{ + jQuery("#TB_overlay").addClass("TB_overlayBG");//use background and opacity + } + + if(caption===null){caption="";} + jQuery("body").append("
            ");//add loader to the page + jQuery('#TB_load').show();//show loader + + var baseURL; + if(url.indexOf("?")!==-1){ //ff there is a query string involved + baseURL = url.substr(0, url.indexOf("?")); + }else{ + baseURL = url; + } + + var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/; + var urlType = baseURL.toLowerCase().match(urlString); + + if(urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif' || urlType == '.bmp'){//code to show images + + TB_PrevCaption = ""; + TB_PrevURL = ""; + TB_PrevHTML = ""; + TB_NextCaption = ""; + TB_NextURL = ""; + TB_NextHTML = ""; + TB_imageCount = ""; + TB_FoundURL = false; + if(imageGroup){ + TB_TempArray = jQuery("a[rel="+imageGroup+"]").get(); + for (TB_Counter = 0; ((TB_Counter < TB_TempArray.length) && (TB_NextHTML === "")); TB_Counter++) { + var urlTypeTemp = TB_TempArray[TB_Counter].href.toLowerCase().match(urlString); + if (!(TB_TempArray[TB_Counter].href == url)) { + if (TB_FoundURL) { + TB_NextCaption = TB_TempArray[TB_Counter].title; + TB_NextURL = TB_TempArray[TB_Counter].href; + TB_NextHTML = "  "+thickboxL10n.next+""; + } else { + TB_PrevCaption = TB_TempArray[TB_Counter].title; + TB_PrevURL = TB_TempArray[TB_Counter].href; + TB_PrevHTML = "  "+thickboxL10n.prev+""; + } + } else { + TB_FoundURL = true; + TB_imageCount = thickboxL10n.image + ' ' + (TB_Counter + 1) + ' ' + thickboxL10n.of + ' ' + (TB_TempArray.length); + } + } + } + + imgPreloader = new Image(); + imgPreloader.onload = function(){ + imgPreloader.onload = null; + + // Resizing large images - orginal by Christian Montoya edited by me. + var pagesize = tb_getPageSize(); + var x = pagesize[0] - 150; + var y = pagesize[1] - 150; + var imageWidth = imgPreloader.width; + var imageHeight = imgPreloader.height; + if (imageWidth > x) { + imageHeight = imageHeight * (x / imageWidth); + imageWidth = x; + if (imageHeight > y) { + imageWidth = imageWidth * (y / imageHeight); + imageHeight = y; + } + } else if (imageHeight > y) { + imageWidth = imageWidth * (y / imageHeight); + imageHeight = y; + if (imageWidth > x) { + imageHeight = imageHeight * (x / imageWidth); + imageWidth = x; + } + } + // End Resizing + + TB_WIDTH = imageWidth + 30; + TB_HEIGHT = imageHeight + 60; + jQuery("#TB_window").append(""+caption+"" + "
            "+caption+"
            " + TB_imageCount + TB_PrevHTML + TB_NextHTML + "
            "); + + jQuery("#TB_closeWindowButton").click(tb_remove); + + if (!(TB_PrevHTML === "")) { + function goPrev(){ + if(jQuery(document).unbind("click",goPrev)){jQuery(document).unbind("click",goPrev);} + jQuery("#TB_window").remove(); + jQuery("body").append("
            "); + tb_show(TB_PrevCaption, TB_PrevURL, imageGroup); + return false; + } + jQuery("#TB_prev").click(goPrev); + } + + if (!(TB_NextHTML === "")) { + function goNext(){ + jQuery("#TB_window").remove(); + jQuery("body").append("
            "); + tb_show(TB_NextCaption, TB_NextURL, imageGroup); + return false; + } + jQuery("#TB_next").click(goNext); + + } + + jQuery(document).bind('keydown.thickbox', function(e){ + e.stopImmediatePropagation(); + + if ( e.which == 27 ){ // close + if ( ! jQuery(document).triggerHandler( 'wp_CloseOnEscape', [{ event: e, what: 'thickbox', cb: tb_remove }] ) ) + tb_remove(); + + } else if ( e.which == 190 ){ // display previous image + if(!(TB_NextHTML == "")){ + jQuery(document).unbind('thickbox'); + goNext(); + } + } else if ( e.which == 188 ){ // display next image + if(!(TB_PrevHTML == "")){ + jQuery(document).unbind('thickbox'); + goPrev(); + } + } + return false; + }); + + tb_position(); + jQuery("#TB_load").remove(); + jQuery("#TB_ImageOff").click(tb_remove); + jQuery("#TB_window").css({'visibility':'visible'}); //for safari using css instead of show + }; + + imgPreloader.src = url; + }else{//code to show html + + var queryString = url.replace(/^[^\?]+\??/,''); + var params = tb_parseQuery( queryString ); + __inlineId = params["inlineId"]; + + TB_WIDTH = (params['width']*1) + 30 || 630; //defaults to 630 if no paramaters were added to URL + TB_HEIGHT = (params['height']*1) + 40 || 440; //defaults to 440 if no paramaters were added to URL + ajaxContentW = TB_WIDTH - 30; + ajaxContentH = TB_HEIGHT - 45; + + if(url.indexOf('TB_iframe') != -1){// either iframe or ajax window + urlNoQuery = url.split('TB_'); + jQuery("#TB_iframeContent").remove(); + if(params['modal'] != "true"){//iframe no modal + jQuery("#TB_window").append("
            "+caption+"
            "); + }else{//iframe modal + jQuery("#TB_overlay").unbind(); + jQuery("#TB_window").append(""); + } + }else{// not an iframe, ajax + if(jQuery("#TB_window").css("visibility") != "visible"){ + if(params['modal'] != "true"){//ajax no modal + jQuery("#TB_window").append("
            "+caption+"
            "); + }else{//ajax modal + jQuery("#TB_overlay").unbind(); + jQuery("#TB_window").append("
            "); + } + }else{//this means the window is already up, we are just loading new content via ajax + jQuery("#TB_ajaxContent")[0].style.width = ajaxContentW +"px"; + jQuery("#TB_ajaxContent")[0].style.height = ajaxContentH +"px"; + jQuery("#TB_ajaxContent")[0].scrollTop = 0; + jQuery("#TB_ajaxWindowTitle").html(caption); + } + } + + jQuery("#TB_closeWindowButton").click(tb_remove); + + if(url.indexOf('TB_inline') != -1){ + jQuery("#TB_ajaxContent").append(jQuery('#' + params['inlineId']).children()); + jQuery("#TB_window").unload(function () { + + jQuery('#' + params['inlineId']).append( jQuery("#TB_ajaxContent").children() ); // move elements back when you're finished + }); + tb_position(); + jQuery("#TB_load").remove(); + jQuery("#TB_window").css({'visibility':'visible'}); + }else if(url.indexOf('TB_iframe') != -1){ + tb_position(); + if(jQuery.browser.safari){//safari needs help because it will not fire iframe onload + jQuery("#TB_load").remove(); + jQuery("#TB_window").css({'visibility':'visible'}); + } + }else{ + jQuery("#TB_ajaxContent").load(url += "&random=" + (new Date().getTime()),function(){//to do a post change this load method + tb_position(); + jQuery("#TB_load").remove(); + tb_init("#TB_ajaxContent a.thickbox"); + jQuery("#TB_window").css({'visibility':'visible'}); + }); + } + + } + + if(!params['modal']){ + jQuery(document).bind('keyup.thickbox', function(e){ + + if ( e.which == 27 ){ // close + e.stopImmediatePropagation(); + if ( ! jQuery(document).triggerHandler( 'wp_CloseOnEscape', [{ event: e, what: 'thickbox', cb: tb_remove }] ) ) + tb_remove(); + + return false; + } + }); + } + + } catch(e) { + //nothing here + } +} + +//helper functions below +function tb_showIframe(){ + jQuery("#TB_load").remove(); + jQuery("#TB_window").css({'visibility':'visible'}); +} + +function tb_remove() { + jQuery("#TB_imageOff").unbind("click"); + jQuery("#TB_closeWindowButton").unbind("click"); + + jQuery("#TB_window").fadeOut("fast", + function(){ + + if(__inlineId){ + jQuery('#'+ __inlineId).append( jQuery("#TB_ajaxContent").children() ); // move elements back when you're finished + __inlineId = ""; + } + + jQuery('#TB_window,#TB_overlay,#TB_HideSelect').unbind().remove(); + + }); + + jQuery("#TB_load").remove(); + if (typeof document.body.style.maxHeight == "undefined") {//if IE 6 + jQuery("body","html").css({height: "auto", width: "auto"}); + jQuery("html").css("overflow",""); + } + jQuery(document).unbind('.thickbox'); + + return false; +} + +function tb_position() { +var isIE6 = typeof document.body.style.maxHeight === "undefined"; +jQuery("#TB_window").css({marginLeft: '-' + parseInt((TB_WIDTH / 2),10) + 'px', width: TB_WIDTH + 'px'}); + if ( ! isIE6 ) { // take away IE6 + jQuery("#TB_window").css({marginTop: '-' + parseInt((TB_HEIGHT / 2),10) + 'px'}); + } +} + +function tb_parseQuery ( query ) { + var Params = {}; + if ( ! query ) {return Params;}// return empty object + var Pairs = query.split(/[;&]/); + for ( var i = 0; i < Pairs.length; i++ ) { + var KeyVal = Pairs[i].split('='); + if ( ! KeyVal || KeyVal.length != 2 ) {continue;} + var key = unescape( KeyVal[0] ); + var val = unescape( KeyVal[1] ); + val = val.replace(/\+/g, ' '); + Params[key] = val; + } + return Params; +} + +function tb_getPageSize(){ + var de = document.documentElement; + var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth; + var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight; + arrayPageSize = [w,h]; + return arrayPageSize; +} + +function tb_detectMacXFF() { + var userAgent = navigator.userAgent.toLowerCase(); + if (userAgent.indexOf('mac') != -1 && userAgent.indexOf('firefox')!=-1) { + return true; + } +} diff --git a/js/tooltip_init.js b/js/tooltip_init.js new file mode 100644 index 0000000..a12a350 --- /dev/null +++ b/js/tooltip_init.js @@ -0,0 +1,9 @@ +jQuery(document).ready(function() { + jQuery( ".gf_tooltip" ).tooltip({ + show: 500, + hide: 1000, + content: function () { + return jQuery(this).prop('title'); + } + }); +}); \ No newline at end of file diff --git a/languages/gravityforms-cs_CZ.mo b/languages/gravityforms-cs_CZ.mo old mode 100755 new mode 100644 diff --git a/languages/gravityforms-da_DK.mo b/languages/gravityforms-da_DK.mo new file mode 100644 index 0000000000000000000000000000000000000000..10d2e5769e64871ee5c68564795f9f7c760b394e GIT binary patch literal 135109 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
            A@3G$OIrcX3!FI;Gv-lKfdLB1 zL?l9a8u?psHt;Ib3ERd5Fasm1+o4vHhY+)G1MUJKh#>AabO&p zA$4czwluW^44e2?hB;8C?jT64mDv7sC|1ycHaR23#gh~^T35l2^&9nAHI9>L_5n?e?zU^%vC z;M5^#L{`8f#ulPT9>up(kBq(+v*P>0;Uu_%nH^G~BCgo&OAudIahj^rq}VizYJuer znS824*#vZ8dPTcUik{ntnAGqoJ&^s@%WdYJ{@W{6|L4%Mz(DFG)2qTYm8Zqjv})5W zb6QBnP}*^n9!BpSeX#5m6^O1`sP_VDPP#m8S7mNuScDNq2Z@n?|#`s+5M1k#yx@=L0u9QH-HjQ>G+MckodL`nh ze{rj_^1$q`&k<|tTaT$OoxEtS6LHiE(%`_en7yakUst?1j7a6`fL{RpgK!ASXW{}V zlv#+Poyu3riGh-fFwR+};A18jq`+|OIT*suuCyVTLCkWF84eGaN=sULQu&@ez%@d2 zOilO{83;TuhXF77X5p1;Q$mjG^IpP|IIq|?)0=ierto2zDx}AzAvC~&8aV5-_AMy` zpbh3RVVZPmBELWz>E9}ELA`;?StjWrpH1JK%z9G=0E{%QD9DP2e_ju zRI~)Y>K$EJAF!I_p*10sW<(Og66zoSzK9t)Um(57uL%vavZ=y;E9^q1O%&ZmtDDea zQ(bV@WJqWbDuY=Ftuv*T)$A?L(Qg^N1%bLqiwFiJx1j7w%7bl-{>ul$>Vy^m$Xaxf zi$k%2wOU)dyIUvxXIb9S5Ud-b-^9_xXHmPQr2H!Cd(JmtTCE-`+g8UWIeU!=ukXD>hAh%8++(<@>jAF=4-jOimvI?z7jN+ zJ-g7}PO4yFZgRkCj4fXuI{;Au%=iXWVkKw2#i@3h$~#BzF}K2$hDI6Ri>%hbmg>9=X$etQW8iL zowE(W_@Ywl5VuHJI^~7iaRm1QA^QAi($+Ac@EHyn602an z;Fka`tW)yGfoVd~T>1{)vFIiUsE!6@nvFXbFg2EQAz;9;ki9MqB63k2iexs3+7Q!@6w2c0rmVJty& z%XdQ$40i0S091U&jVT2{IOdmQ4KUAFrXeCwcCNrT^&o}7Jb+Te_~`|cm@J5B@E0S( z{TZxhZiDjdH?}5J=Ou#yK4^MQ!2ml{$C?gT)Cg+F z@TaRSgUDepZBxRl@|60pPMKe8>Q=-wzoJ*(P(e{*o1q_$M*+LAr){u?j~S@37Ewjv zyjV4L1Haj^&D4zW?5Z={%wp3G?&{KBuNXo^`hywrxq)=3sO&I$@o!h5WS89-ub z(%TZ9W@>g5CfPiuQ8LMs^ig)i=9}A#7x~5b{6&5{;p%pH{+w2B3A~n{KL$H29|oxk zZVS*%>e+(S4f~be9KlArO|hypD#J?f>oT}-ATzJO)m5==_%CTWE`gk+wG2h0 zZ8IuHWcL39^?S%eMISXM^Sm6toC-aqk<{}GoIVTys)pIX@BqSl@B*QpD>TdC?`)ec+r@eb3-T~H3f#=_&AV$+mnu-zs{3k$z7x=<^)Fgi5Mn}$3LPNFUgQdQo`$z)Wh6ZLirGz zneJVbRGy1e1X{oYt4HcMhnZuq7f0^))<@41R_*EKpFe|Na-FMkG}{ zk;-40gJI*6Z-B779FPJ%6=O)la;?jC_z9N^aN~GyQYC~N4m&LFQnZ^t4AE|W3}qy{sJ;TSRXA z1=N!LHe6cF2h*#4X3vlk<_I$eVUdY6-Xcj@lkqv+^f{&+tHctHNU6p?5YjY_gnbqN z8Crz*-4b`<{ywV(JoBTesXDr~KN=&50Utz{1npLbz`(Ia?;~ok8T5o7INBP#i@p|a zcjGx+y#?AzZ7@55yyrgkS@^}aYzF~^AGeL_Ms`$%mEjf`?mTcHglJUCG$7pOdP}AM zu)lCm+9KRY-N}yygvY#e73A!mnLxmfbRvF6qT0ezi(WSC-3@*mo6}~Gb2v#qqMvxi zATV-A40^tY2U}YJ}h&vNU{eo>F}>gqb5ozrEki zI1g&Smi2MmXzbQ@-Cw1>UDK1}qlR3n`p4bF`icFta2>JyCH>>qwdQfwCxamlVkB@f zKw7=eU)w={=1kcijO9_`KNf@&(rNVvZ^j{Rr$3ndXf8Q@oudP$y|~Z%lCsf-BOAfV zW3`%7Bo&G5U8)?tG&;c2RXdt;Kc)j<$5gsV+j8YS=Pz^MIUYi^+V^~&J^ z@aQ@n0p8Zd9kA4x6sKw-Do*YObGeU4!7gMKl`OcAtf`z}W{bz71pJT-Lm_K=pZ;So zu?*bmomm!QBTAApxW;>SsDo*Urjg{F;@GSftwsT~XzAx$W*o8M1$oPg#6OQW`m??L z6>WM)gDbfu45txO4`^8n_i-IWcmo`r!Ij{YF2jaqGejkMD+Pb@YnLJ!P|Y}Ms5Gp1 zFa`OCe!g1X3bfix#GXIt94=$3Gqf#@4l57d;BTD+xRM)zb~YH0dNFWfcbcE zhO_M?jI&1J1TEKNa?Vi~WTO}jy@N;`8u=!)uXQmNgg8MZycA)s8ibR6#0E&0^olq@ z(~+g8w%00eZW5Iur$DTVc0wf_;}f>94U1LayX+hVDx~d)kS$zpj8OcV)l8|=bRM`^ z2q>^Nw5Fj#uix_)bEsFC8A~(|KUC@pM;ma4r0GMQ9KOGr1(ACPm<>7Eqy>1W)oS%} zhac=j=&7;it8I^2$Q|>a;X}G<8&%T{9dYBaJIz><4O^^$Bv2Kxd)6?7`viG(kF{d! zx`th=sqvlAy{Kl%EEBcavl#__X#$FO#rsCP1v;0&Cb3nF} z#w$e^vMV%Qj5Dc+ga{1X8t~_Ypdh8k{hxR}Gr7P{+4eEaTyBHqfWMqeHW2e*q`*K^ z>ZmkZD6|3CAcX`SaM*`Jt*aeNYP6LOr}8|6e*}~&+ps*mQAawz^k{?C7qtN_T**-0 z^#CcLw30qg;hVl|J;;l%D)|st^68WLQ|Jm0S4l~^=kIMoeK5}4)%`XiCenzN5vH}K z~q=!*%)6c5I5K-VG4*yNRB*r!FGZOX4p<#udIBj z@&}#p>u~j-(IFfFB@_LZb;zZn51SyX`wQnMZA@EW$y0*N}+A%C58wOJ{C1Ewq*ipj*||$ovFGpagD2Q}tnS3JTaXY`{%k3dnytXl z;N&ePMmq#QN0hP2t558wdI8E={kk~C)LLZ%Hc`PWh_$>>z^D5^$%W+!N&}lj1#>ti z^eiW&E+es9g(#biAjLLn^NlAu+fsO#E)>|X z67{#>b)Bj;z81MCM}$CoBggWT^qfivnsRSCrUrv#JuAY9qx#^CFc- zj(X7wdvc2aWEezsq_Mmz$d+)c}DSuEw@;5nba815H|BD=n z5Kc-w^Fc>zV7GD%u`RXLgeJ)g2o}~-xb>NOas;!^kkLMYV)_8Fmj*6SDRp3$Pe6w%E3I#}g+v!{JR*4LR|OCd3uXJpV&=+p6Gmq3krhVV*J?tKn*U+HvZJ`IJP<^TTq zr!PMJ^wV(n+3&f4CMyqZaaBbmDqp}5DLzn_teS!*P)h5-9`)S|4*^gdsN!uLm?uU& zX1*1Up$Lp)P!Soai;HT^MSSeq5m$s~{!@5~#ezN1e)$@mZ_uxYH;ziSl~9o$&z5-A z+-JuYc_nnTvqb3zU%@pJC+O4zYV~N4|6z3V_0#|M^bcG73K;~&mL7r9OqmLzi+K_^ zX;zQqHi%MUz>PI9c&Gskzt^{yI38Idko88`(10R4`$jn_t(|WkXvfW1LbtIOiV3H? z3}1oZ>Ua&iXz{pkf&)q_o#PQl>{21dy~Mcd_-DOsnKJGrMebyop99=_svS`+VY$ zs!(G1yFyH}6trEhYeyVba-6*;MKGR%`A(yMk`bI$|NfX9?%C@`y-zR| zznp`T;9nAyDeg%?6$lmk=_@G6PcuV`(w~jcXqER&~BUiZDa*w z;@jY!EuyY1Y3cx5QdOjfQV%S(RHy=^Sn-m#K^K9>Am|RPT;Jf3mSm}6;_wI&VqGow ziL=UJ;n&IgCi|||JpxgFl&|nh%o+4bj1P)lSSk*QvP0gDm;EOH^V9a#pCPkY%!}ep zig%Rj?%E&8_5?fo;h!Mq5B3UX0^PSWZ0wV3JA0%2Nq_YIue~$|&K#315SE^X7R3R^ zRaq5tjW0Dx9_+0J0zJh3Ki=ZnmP}**nRoOBqn7XM6Q`|_*7VPkfJO&&tiO+M740xrFq834} zIdXys-HQtpbCCRul02j-;$uT}_F{a#gD&O18`*f@Day*bAqFieBoPQu+<(J!)Yk5U z!r2Pa<61TmKj6#75x5Ys%JOEou(V#M$PZ}tRr$t{9iiRuPQfE(tqpy_Id6FxXd(hj zyKWRWRRqfbDE)8jm-ZyQZ&D~e)+;DKsE~<3AVX)w24-wvQA9w{2{hxvEqOL<$$5;- zm0PaxGuStHM0))05(X~gbR)$y@T>G*kh`pKaDg`1c}T8aMq1>VPFSm~Yf1I;fqPwe zu8cz;1MGV{5+XaPW3I~N>7QAyIf&?TX ze27OJ46Smt2i0^5iZo2-PhbD}cLGLMZ%~)~!nc0Smq3so{vESj{=&Z5JM+L>f9QbZ zbR)X|i$=7J@<>$*`Ot6L2Ok}r7*xbQ5T*C&F*VEDI`iWC8xh0EzVl@M(TBZM*5<6e zQh*-b3}wF#i(C}&nH*hCGaF(d*q$zKdz&UAyDA%0Vg8m*l4#WhW+=4jldacQJ*oP4 z%2=smA*=dyrBXTdQgmf3lWBF|%{RVs{&I2~seIxHlfi?vx`3UX%4iw>=)+TRpmS~5 zeWf6SVrl@hDzHS8U`$U{u_Cx(Ni*c5r>f|3&i6y!d3}Di#4;j+gNZ^xf zj`ndQF$DU#{tIe#b{V=Qpo#W7u(j#mg}h5E66_GB(8(gO80;JLF8Y*sfMoUX^36X_()vCEGxrg^9v_!kIawc5NC{p&6y3h3?c)wG zF!kbcwxzx@C0ZbC0+!$|B#49IH|lSmmZE%^do1o1@`reCAZ!XCX2gsk4&6a9ZL=<= zm51AS$OP4u?P*6ON?xg11{u|me9N?@_}L7F@R zq19%kZM-A3DB#1CNjSNYJB@}IjYuev(N5q~gHW%8v-1f#E#_`?Tq^?jAk!P z%ZHx|f|iC*(m}wTBEJ(q>RMO_=lMOSir@@n4BJQf$N4w;zvoZ#|C=oH1diFLWA`2e z?>WO%Z?f>pJXL2B9ejn;N;`@1?99XT5j>x<^Xl0T@#FZ_7V@5eXf zWx5+>-;Zy@gK&}GZ3T-c?{=<<0@?#avp;_vn2eA0aWNTC{*R&jcJFj~Gh1gx9^wz) zUrWdh#84PtPro?{lGr_d|nP>Q9@l{0&;p&6# zC3tcRBB@S(7uJ;P@DnlMnkR~(0e5yN)Vw7t0O%^Es?2T%KNL!$c{V-g|3IIDp9CNd zHhq~1q9u3eR~n8>yRz)#D!NDL$&&9!aV5RwTTP};2TITLPC72WRG3tU)C)T2W(dDi ztx&YmU@R>+Smb>Q5P`GNT~H`E8qBOjYGI}p@ShPTF65jQODjikzY_^@#k&^>w`L3J zv-7x^o!M0BXEz$djljRZT%m}&=D7JAl2D<$*l5i!#>0*6<;8rXKYf}1rqk|k>}dT_ zHE!%OUoZ2|KmF{BjZeSa`24f{v){e^?f=E~r=L=BqpM^;tM&9a|LlvGUw-j_e)<{p znrI6*Os{@Dz?Aed-x+YQ+AKdL!s^EjG6(7Knfwoz_IH=LkCam%Pk>e>z_L=1&`)sdm@~&?1yPR~o99`Cmp~{pByk!);W$w*wB%%Qq?X z1BPvk{&N1==9ima{sx@Hu_PONk{e#;6FlO%o&WLkudul2@{i9Z`A2`uKYRXF8um*P z^~k-p_!O>*IP&hG)MXGab00CEPDvix(L$gYV8NA=JA5`=&A?k6&_ zAUm}nGb6V4P^tG;?w~kwyvg58Pv`Icfl6;U%08~~ck!_d{uemz>dePs_Pb9%-Nbr; zwT)@_>nvU6@+)U|$~P4lh!wxItL!uX<<-x_i{V!#p-%Xve|jobYLuaR zREGbFT^NxBt5Yb2J0pR%GK<&m{!XIUwPLqFuU1|bwdXgaC&|Y!IvnSIwVdIkZmlrI zWU4x)J9yi__hI_PeDQ{eb2v@!mNhfJg8cI}ja-K3wHj?ium$~Nc~PpMLCvAV5XLYI z=kI<(dx#sR805|DlWQ{=^1Jv-))&~PQ5LL-+0)km)(}4oo1^d=S|thgoIb;W;^-q# zmxZQ9dT-IL2C+Mq+RIO~&&sQoeYWvM{_dw4zrTy{%8fu7Sjs;8{l@3N&DH>W$sA?` zynCh3zufrZx7in8Zv2+NyV-BQ-1zdh*_Q<<3?2uC2nb((x$(Q-X21I~fbqM(UlZAy zMI-IU#gzp}Zr)zrej`l$$BXm7usNmrn}7UuIByz&vy`~t7H0f*td3L+3UQjW0)wG; zt8LsUbda$ara`=u%)V@@=|v>Co8)FvI0fWzsdaU?$!}6l-;dvuK>Xvc58wUcRBug| z>fdH28_}*ofE{x&x>Ay1fN7Qswl>Xjl>OoIcV8zHHYXXR+Xb0c^NV-?pf79`!x9J= z=Gdhf8l zi%rgX_ODT*=J&G9+GdW@C}%0UWU-m|u3%vp0RD9sh$=!_5f;$(PIv&jC(Ft>XQD>) z1PMC zg`E`URQ!cdV4Rcioiw_C)d$J&&C*}}SA8x5k>bk#%RU-G#g>j5Y+stZv`v*iOSYSb|$$_Q~^tQDoXU$;(%`k!1 zT3jC1j(Uf=C(p#up-r00tfoUG^~0{<2$D8iqt@LfC1qCY?vs9#Y?NFnYC$a?_xfFO zTypvDZ(KI^vl=-mw`+}8L`q;gL=DDy)qW(3k$Pxl1~xW2yM@6RjxVdRIB)$gB#*!X zNFT8Uu_nz3WOO1u?qYmCuzmt8NcBOYWizP>Ov1RMn(Vm3#o=oGHx z8rPY<`$q|X!BaR|)>zS(Y_zp7mPBF{e_>JI=!E%DoJ+yT4TnYR@H>tW_Uj`v3zG2@ ztioBlliZ3SV3u8pm93fl4GWa6L}0`S7SB?N2E#Z+iinV9wX^{5euC57h45&hjnWNb zoAx|VXwmm6YNoi-sZq{NfA^C($fLnq;K95SUeHhQ^c-E|bpCb|DCMB7o6%OMn>Cl` zi*vSHRy)6dS9kv*1@94KR=d{0K=sM^!v2UIuf0Kj4rh&re6im|#j0 zX;a!JpVieSOm~nPVTsl%1O-K^vtA|mwHpMlz3*yfy-m29VElm^#!is{0;ele$#f=rd}8p(tWP6r$v#IKHytX-cnqcDwJ(4Y$7tZ;nb0y#i`;2}aH zQQ$-O4l4#0$o&vmFAgGyu`2no5?a87r05ZfA6$ZtOLY z(hwHmG5l7Qj|Y+o*kR3<Ge&3z~k`Q-x*1>4@BN>^A!&32L zPV^`jc++yenR?_`+TXbbLxH(>@u6${z10@;G8$*w%j=5)I6A1WHrN2hs%;5$m+0B$ z3211btfm4+s@kq?+;QnjzBk}dHEx*maYhSp27=i6a`<+9WqPqvVdU*-?Qk-<1D)ejFP7#%}PF9dtpp(Pz-&c)4VJK)6gDgJE(F0suG-`K@y zHWiDDh6AWFjvK%S=}W&v^_y?<{+ki8#n30`%Hcf3X-F!>AVxZ3|3N2{E)u%63ewhK zMPSFyxBBVqVu+&X9J&rZew)7@aX2Ln*l8NV#&~fPgC!(Dst5o?N*PfpyPc5W)QXMK z)Rmtwh#3iH*dA320`rya$gF{N!x>*=0ijw%1R8sb z_Li3f+xE=SQZD`0{N>ixCInUDwSx0ymNmVUDfJCe={3_1=v1p0z=Fd=e49}L3Ba+h z`t{AGH5}R%h(!dJi&bM+*$CK((sJ>dtG+nByVuOmkSv_B#-CfrFhFSls6fA%ZK7l<6>_ga3i5`j@WgXrA<6zImh~wAN#I9MJXit@c*<=hlZyOb+ z;g;Fm2trTXb5ZnR=z2*yURz)EQ3%ye`Fb#m5OETDD5nDkJ-RZz*z(>SOs7}4lZT}! zb%h>bS{9w+(`zB4g{LARN(o)zfX-yGWuZ=E; zOg|#No{ENj0Fu)eedf~G1gT+~eGSP&Y53Wusyq}DIo%+@p`3!kd!2Lc79_7l6{! zq;o=C+zCNw&>g8bGQx~-^e-7DN3(33(_Hu@2p_6~eQUN=(gc}u2-0DVi)%J>ASe#) zRGcur8H6ilFp0f!V+kb%fXoinQkdrQZq`PwJhU$fyu!>^9x|QqNjg%g+#b24vI>@Ql7)zXAPw$A!Z5yL zU)1vkZW?V9BL;5fWOyeCbH-kInKn=>MHw(l>t zY7?OeNfZwBGG)Or0gCWpDEYF6BM&P=Vi6y$+6y5aL#FKN1Tb{PxAM&g)zN2Wd`FEl zPMS8hvUDTOrp5=KpyQa(@I{?WNsS=F>y$HCbjaaqz+k8+?#RvjfNd^}z#cFR6mUOA zWz)i-(-ay(($Qi_npl_+0O-axP>ZuBSEUZpoDj??|MJr(?07kZaAjs~>p{4rf#9JV3izC`^;}kVgl5{ZIHzkyQXwm z7CB~0aHie4JT(e|MkA|Bv$r4DhC5#+mq6^+#IA;HFH1MwxfOs^fJPnQ5oB6`rwHfU z?O=yjeh?wzhk`#YSIh$Xo7h*)Doz=aOS@HQ;c70gF#-Q3-@VX3=vrh}j1|0~j3e7$EzeZ-p267)fK$Gyb}UDzB*>V+PBmu6zqghBKQQzM1$( zqn0JzfprFNakVAz6g`wYlLjE;h=6&Ne}o{&QnPW@Bx0o3{*I?T}&Eg z`;8ZLL9=AoEwWSeBf8}TJcfA`NQi~y8xkjb50bYHT><9|Aq~&T27$F4&-nQ@KImb? zlBPpuTJiaSy1i`j(={AqbTBa5&LWH?Qo8u987ggGormVFJ81?>thYbJ9xot4@$l{+ znh4Om^=Q3nY-Odw4dwx*)~C1O2?;Wsdh4{l^>$D%(i56vSw`c!>};$3T&zYjt_WsVMIa8gU8gn zf1oQ#?>^L?OXU%p9}kCE9}RC8ms<-!!Q{I7#XT9mCt3X(%PIaEnj3RF;O{A`%n(FY zw=~kcvHMV|Z*i|Kk{7OK5(?*6vQ}agmK-J#VKE-A79(J&w5FUNE6=k2yMNr2Jzm`# zM_B)3KxNJ0*t8P0SG7MC_1JGPWs>S^QgR!?c%QvDR$3;NdwNeO*4z+rovUgTQk9a` zCx1qO1uQ6^h6GsVGR(=bc{g5H*qroC_9Y1j$Bm+Xxnb?RlBn@;r3b!l5U7PL%|(pY zVWE{sBK0AabG!jA#KnU&pKOj)8wypipqD;S>UdE_z75Jahp8xPoMQh4M9pe# zG{=absNX6sEZ#YX@D+H}%PEndD)s3ERg5@Av2YuwfToh=wtTt06o%U7L)=7A5eZ8FvJ7QGzB#bJm8uIz)0Juw$*}3){hh!LU0tKPY$yH`3fX(^_Q|G^%TSfM~5C719Kw zg-w)K_tEN%x>P92)%U&y0YFEGCqG z!&7a@=qGJ}33K##B<_a?#0Bb5S(a(nl+9`6GfAi7o95SYE2k>&^6`LDY?Ilmu(q*l zq=&}XdS=E}MYlympl|8O&`A4dKvQC{$uJ(I7A73RuTB4f?WRRDwc-N}Gt^Hw()=rs z0_m-Rh!svDeuu$9UJXuJOGRkll2sjo_9?B%CsWj2AfJSUr+|WaLj=y?sVPIWrUC5! z$>t@DMj3LoZS^~t?e0dWxcbCyn+_{&9(suUV)3`kg6w6ECtbDT28`HUGYf#BNoKs* z!gUWVrS@TIc?2=~jxQ$gA_SxD=1K$2;RLw_gL-I&VAo`{@|Yh1VcC}!S*5T>K-dc~ zMmdJeB!?QB6(o5_f;132O`-Ouq@es6B#CX}47Cu#^J2?H_Me7=-6pm`>nk`-bprF6 zHc82EP?Hjon1l{(47+!m*yS5+3%72S4}DQ2L(p#7l%hkM;in#H78EmfMpIa!9#u*Z zP`Rx!J9Gvi@zJ`}lwMX;6YEV+lUFcH;-@VKX(I06)$bKZMjOW>PRovpH2HX60Syr} z-~1*|qllN!P_(45_zw`BV$B}_J_$31+)uBkS8+K~$cw3KU{MS{VCKQ(?wH}LDnH`l zZ8wAkHJfYT4-32Q!pI5g9RU&qi*;SW>wB*b|XBM<)f$j02FCfy8i(X}ANB zEAcXRs|R5`%E}1=BQ4sNGhIp4umK#7>nnVigRP*|7CRUQVt08bw)GgT5I!zR5m*%p zLhy6%>a%+u@n_bK;$;Ifz8*GL^596zEX9vLT^4;nMUqMa0*?xTIF?JK(sFwRnl#Qr zjp=2#x}axulYbeG#mdIkQU~dWahj=-Xj?H1fS(5Kx{HYQYvQ&YllXnTeo;#_n(T`# zm|`Vedl1@Eic7a{CLR^lr#!j?z(*zq7p_9~=)l_|Cn#J!xC9uYVDin`1dEV%C%5wT z0jmeaQwZc_ctX77X2H76jlINXKn~w5eZ=`HbCYMG+^!L4Q=Kh!Cxx~DSNEntuVoxH z6;#n7;#A#V=m}Y?O1hX0gSRJUX^nQqk(pqVNmRTO@06bMjd+*;TV#Zd&H6VtuLy;d zUMW|>K)-9c4Fm^cGS*n@Ou^$OkCmFBPo=NU#s8HHQUGJYm|K6`EqSq0l38KieC<0pK9B?33u<0jiRy!7zApzA$S`9sR|v%w+QKwm-Ktg2Ho=9WYlU zSwLqDzRT)YbDd;Ik5My`luZR15#9;t$d1t>{o|BWaG0xjAp4LsG3b5V@Ki3Wj=xl! zjyd5&MOC!n7KEU8EI$xZh!1(Q`l$TGh+S&aGzOJEY~smClC-Ghl^=$z66~C;{)7DB znld1SYd=y<5rwPj>Al9QMz+^DGS%c>w{~=>xU_eFGv%z~n0rYU_#@($#tMNmNmFqs zKaLT%h~z73Co9vO8Vx{uW(6hw&-@L=U(Q-iRp=NOB#jWlby$2GH=Y% z)%Xp*&}hW@7i2RoCk88fc%nk0R=l7keDw z4$PN)L`)kZTp1wBs=F5yDk2iG;?5`k3v9*i0y)j;9|vW-{Fcb1S_IDnA#YjPvKCr2)L>6T6SJ2;VG)897Bb z$L!hxld4i%Ad-r1RYX?*7%o~23-);pE0Np;r37PFmXj-fM#AabId@xJ#Vu$hzR{KG zv5YXP_gMGLH(P6#?X5insfs1Bz5if^0}Pkd=du&**S6b7{55C%{d${}$yj*$C%r>M ztcowLVa5ajQMdck-#-Dz@RU@=G7?J#EW4qDo)s87VQG5FX z0$ccNj&x*2ke5i<;o$?HDWixU`i$>FDx-*WOSR0eggtSOHYY4wL=bN z0!ZBu5rT;-AfnoDb%wSep8&5AW?L;Kz<`q-307=z^cr|4R9ktsVxe7ob~iC)-by*d zaSE!L7X7^RxOi{^iZevp!*E;-I3I zt~;7rnw|Mdy&{VPJWzG&%u9*&6AR9+Ws^SGi`Tw`S6(LjD$YeKg{-*n8>j`M!Zwm) zfG}eWJI8o$dRz((0ZIIPGAEUg<%SL1uR%#^-6iu9btj97z$vlOsBKb0m}vC~asZ8^ zSaThcza@!#Ok5I?DQ4$BRfZtsY?RdOUX&hc+A6sKA2>SEA)$QPWFWRv@QMO5IS6b@ zi34=0t4^d6FE;ZDZO@n0yyWK&kGz_zAGGp>`LfD+{(V+3{no``)+B zJZ5~klv{=9WaZW9^q+SQIv-lK7{uE&irBgqGz{Z{Ev@w|s)up-2w-=a(Z{L4{_NdP z^cB4eUcE3ox)vVO-*E4tKl{r8dqBtobq~nL1qc7x*v5Bzu%z%_h>7DR@mK5jvxD~0 z?lBRLy4cST`IAWvW`BUx=@nP~PTn1nMvIk}9AgExGipHVf&(fDhdjy-2AE9wdp8)5 z?RZTh*8$won^AUPaE2gEm^0QY?qB_SWNUviIIXG4lojv;A@Wi0}6Yb zaxaRjJVdy5M{n3m2wcD|)_5#^eytn=1QZ$Ra3$k1J6K8uQXr{gjy9P=*oE8J;KX(6 zK6^E~Fxk&c+83NRiMFGxqj1NQtkE;t*&renBFj(vsNSe;4h0G^0=YZj_L3x!#+dzVAGCHU*iLc@!0sz4}&(=0b`0!T^ENAJo?xat_h6``=9XEfxqYidDy zd`S*E98W532Q}78$Fl|r2PRV-)txyfRVY4DKSH(qvL!4^o=XM6k10E!@<-V@m^TEA%8h1!DJLc_WZuw3k2%cp zI=@&-?v^APmn%Rvpc~+rU=NGRW$%rB(P1PMQ)Titpkl@f|0)(vx1>uIA$T$UH@+34 zb66b`$cjqt8TM3W7P@b`I)N3vPWLOyjaaQ^Ay)9Z9Ozw@-~!`g92Knq_t?6Pz3PE~ z3285vZM`0m%kW}k7{|05gzk*lWgy&+0wR<^LKDc!xSt>npneDUbsVGiJdhrF4rSR= zQ-m%kKGOiu6}J-O-m%7rVES{#A0tE!v|~ta{sRs_x+iLF zgsvlNh{2Lt&YgByIIXf7n56eBms*HR_KM60@+p5+>wvjmwY#{TXRk;cAcx6UIwoeu z52tx`A%2gfJiz)spVy=oQSdndGy{bf8 zm!;bTX{e(VW?`pkhV8&#irq?}CnX(ObL7g|4yhCtqRt{DGJTghCRf*2vb^wj5+F zG7#+7dWW?xrOn!R4f{FKG3(s#HpolB(QRDXgT6|;y#pPA<4jkNf@2(7Jx7{fH%Lm- zs{g66)6QBAG6)1_tkud|?dER#HI1~7YI>^V1b}^CS3rJ!ze{1Q+de$hLrbmw?J=K6 zyFoDtFyJ4M>ltBdfc|FyAELAv*bMkfAjH^y?sa&b?zsRRbpcdFJ(UaE(vZ+m0EDh(AIJ-3*IOfc<$9oo$6b#NN`4_eQDpCK1hRlfIdl?QrI zDnerqdD_RFM_-y>Lf~@etmi7YHzKj;q`w7gOwJfs=>;>_BF%43_5(<<#D&&iiQ$K7 zw*}Vq82Z>6{J_6x*Ox`VbQ>)6l)TAWsG3oX_)i7jrJ@yVlgg_oZ`&AE8u|gUBdMeV zM)F&J#%Gsf@D3MOif%Gy2UI1@BsYM0@I~d8hh((o!5psV>{1s%;emTb^J0tHq6*N2b~2@kxMct87bJ0kfvaWtkHZfXmE?3kNqfm;Pp__~SSRky zqhJLn#7dR&@_Mz^!q)Uh=?^)hj{z%Q4F76e>-}0RFgJVV!Ybw7Z`hI? z6W34{k|S`#aduSi)R3gxO%uV6>fhzx*TFSMyP4w0x;2!WT#;ST|LQ#m|6yBB^15pB zENA~W&~fJP{-%29Q|sB0%sBcJHP&`RbT@cXe1@5AOb`;v#66t?5i*2`lIu}P3gU6J zoUonY&Dc`PCk72Y8r+PP!{-PPU1mpEy@Y(YxP<{b@R$I^pAlZj6Gz}Y!zF<9RHWQR zp(Gx5ksaMre3x$%UN^tv+(8PQy;SJ|x=W70VuE$|3OyV7-F0bzIJL`@DPc}3`<@g- z!Z@XC05yo>v|7dn=+*QgdS|+KbPr`VkC>g5wJq9e+0gFv6AjZVN;!S@e2TlL`at+d zbHIeiEC1*o;?CrMV!ndxFQwjtk>!cGCWN2-lZ(Yy@mgl3@--k=glU(YKZ1ivrK-6% z#1gG|cEp~=vb$u+Fw%Tif3H*m_(Sp-)_c*v?^tTVC$a(sAJ^^$RDc!*mr*E98^ ziNx+iwi((&_gkOoSFmoy;cgpN^^oCil-pX_*yreqi{Od6VubdtwR3n9< zhCmsPxJN9ropXd7QgAp?>Q_mS`QZb__5*k1<_6XrLZ$A|^5aZZ$>S%ENj3}lUUQxW z-n1@EqJMB_SqIed1Qmlwk2E$%Cikw&ag>&v_Ef33#U@f1;G!xQ`&;ylspL5>8#2f8 zV}LlwOA~=x+7a`iwoat>3z4b(Rnx71Kx%;UI|c)#j(b$<6S5b0nt_SDdy%B8-!~oC z12x_b^4=NqAaHvNb4lyF%=5$?1W-c~Vg{&~#^h#zT|w?Uq%pZQeNJ{HksI@n`-Y(w z(51BdGbjszHpq@;ET*m#l>Cn+1>wg`C zz^Z^yDzi}EBRSKe%A%hjMZ8QnUgRd2skAnQvJ0j~aEC@7?7@|Ecb{+=_2R2`%$=bhT(lADpmb{Ps1~(vp&#K3 z>b=EKf@n+6F>06qu(&g_+u}Cpny$L6IY%;Qm>@^uwF?k7bnO2tIsF9 zk$1gXsVxO8Aa#5@|0w4$%F^zx<|sq2qAH|2f4mBo&9!8~?|sjXA;Zn%f%p7#yDa4e zUK*AS2@qEnB|Agufj5GlE2jL9`P1+2?lv*i$XF#fnJYWr)32d}A-jjCPJdkrAhY~5 z5GZH1Y}VL)ZInR}kM>MVVjBlOC~3`T9X!s3A{pHMM0S=hb5CXM2P3q_j!1u8abKp% zPA#1E4cCZmo4@b=SI;tMqZ2|uL`mnkmLHwu!4}?e9`Yn39o;d$OU*{7L!_kySJ}5- z2ZLp&m37)pR4Sczx6j$+&8%}=@Alg{neN(B{bQxzj~Esr<+-ZxAy#1AW7Zjj1Cz1T z4wl@SG$vx)fzpD2I)hu1vBGf$t5hF%3;9G3&WRLT@Ywj1d%Hjf%xc13j$UTFY&(1h zdeV598dI*1<$O^7$e`M_(Y(4=r-O*4gI>^NNc~1g6$6oDTTvhtXmRJfZq`AHoZk~& zsYHFdgA3ecS=r7AephnR83VlD5;hod00^@r=PHRZNkEGCCSv!QMii@A_%)g?9PhwPe62M3i#n0W`1)D2K^4%0z1XVhqUhBvw<%IQRjX+H@vvl;tY4_6<@+9&vL-Ar%FT>hj`T(BcYZdK{2uGGwq+ zBu0{&N=V(Xw~Qmv6g+wp{Zvy=sfO`!y*RjO>#JqYv1ot0zUZNP!JeWfCnc7K z&Y^TgEXP);Jz8`P9WHU~Mqxhe1&FYpqd-tiG-_@s)+U;~N{4&g08Py0=I{z@()yR9 z4%^{5CL1gImOdo_XTxde@Zac6pUi2{q3e)%VQRia1My7h21ZFkffEP3I&%5}&z z1^Kb0J!Ot>b+`|=E8)V-Ta_h=6XV+c_f|2r=Gq{NjDPkV*D>|p!$6JO0jS+7!HCW* z!~&zj>Vy`pfXC*y%gGg-lJir=w*Z@e~zcnL2CTeWwGbuVRZ_1A8N>=M#^?VXEnfDb`I zl6a525b7m1uk%Z0EDVB_K)Gj>Qy?8#;RC8J*4}xz`*4x;(a}&s&`qOO(AoL%$5bhM z%|&`TS_nJ6Uxoy3!sy+g0l-$zU7i>97vM)*y5F71S9_OVAfIffyuR|S_X02uij1to z$l5!^M*YUMd(l7%s!av8`w6?cWUsg1QY!onLtT`u^>cPX zV?WdB-K2)OIE=>m2vMzIVL}Pyyzsc9r=L*_k^qBy` zG6nF&g@qd;Y+*rbT_8AB@R)Desh%$j$!y4svQ)BB!nOu4nUDlNiJy_PtenH7Git>3 zld_m_LAjCSpPXYQ%$USH;$0%%GBd@j;v~tnFAFEv)mh3dx#NYS%Gwk|*Wi>ww(*Hk z`ug~ctr%Xg9B1g#=?h*HLLWCP`-dk)C8vC}m_*%yyw^fLqG6L#($#EBEh1l4H!0pR zUu`o>l2OuFt6j(y(0aKi465#T|MoJ#C6y1k4~QfC^Gv1UfLvso(qS*|CW z-svvUa>PlelbPKre*>A$G_gM(gfoIjq~)^z<>_0TqE4T-3DONItQ@{lr-$b;8OT-744f)G;A7En0ZFPW!>;@CnatOGs9loW0 z8A1MJ$b0@A{)IG@)(NF%rh`qk%Y&3R&OX<~I;2aol7-s=IT}=2-DJo^{7XO()k5KC zA7u{EX+SFqWW!16oU0+_zaFUaL-M=)NaLg7Fe#-)3P%!x8{x}(^_+nw4}7lNU3~@Q z$#p0L!0xWm91dm@Udm>~+7NH|1ThDWMU#As*j=`)J|ps3&?QV+h*A=$vLYPg z*4650UgUHb@PzU;QEvX7#A0Rwg6cp3<6$jsQHqy2d z`WhbB5h$BGvc1`|a-VP&8_CcyeXh1#$5;B!E*1@&#=PG2@*WW=f}6G(J^cRVaPu|I zdDEED1a{uCH8PeCY9B69_--8Bn!N#MitoFU1YF1^k4eRZM>wvQv$&W?lan*DIi0yV zJ-*+bs{+zDe|w=n_ka8Mf3|i0&EJM6(98X=|IYQN_IjP3@%5}7p8>qnu*JPE;gM% z`ttm~cA2;&>LFZ+k}7gt=%xKNeDPLcH9I6r0iIrFcy`fhP9_AMm6VRazpyHFNJAXI zq%owgSzTvx;#@9on0}VGPQR1p64&m-$kVqp*rgfqrO<$+Me}UwhmHr5h>J5-WcBIU zU8=D4-NI|Gre|v}IdrH(5n&4oLEi_^m3`2rEi6UhRtzvoWE_$!PZX~hCW?I>2fkPw z##!*xC<0srg>bkt716POj?QA>Kq}NZ_I*pqGX_g?L;w%AV-+PYMuUblPWe}F>@^Lb z!0AHVrfBj9g#0fa(F-w*=M!X@T2>k`B z6G?Inx+|)jf?=W|Asc8{-Flf@7MhaoY{1X;n!?Jg>K3G;a^0FsmNpClK^9r^WyK}7 z9zLD7r1HA>R@8&eCAymz_5(MMQxJ>9tLHvgW4VlouOJ zys&~4r241!6}?7ccvMC!j76i@XJtxdh7GgW!#|E)0E#22DDu?NnqK1UwbW8>oF^H` zqPC&(oMq^XR}4(Z9X3qmH_nCn0%+08*q~)F`<0PmT5@Zd8-7t^k``zIQTng$k(3H_ z@~9?l(?bNEB8ffI`R!!#2D?xIporpndY>agjg$!}gXm$zORx}+s7CVx9LEeID2M~Dj@^V~6|tPJ7gc#>CmO0Q z?Q><_lQUOko85Gwg^F8+JqdbHJ+A1Vj@l>17ne{Jb%;kyqMRV}Cvn9Tj zJI#eC69c!Cg^YP|_XW>P5EirNXXe3(Ms$PbWSS~XXcgPY{9RY$`=b5d|M>5g$S|VN zOq4~fFqCswLVB9>16B!ll1>_nH#S2RS;4Fm)Mh1RwlCBzlZZ@toG2Ot5-{Ow7Yv=y zZua`MXGYHTf}aG1AF-^z`Za#>ViY8F=+J8hgCvI-G zy<9eHA5PPp1vrZ~$T>LpU6u;lnoUZeOd9Db$MA5)oTO6&2RYe{HUSP?}* zxWpYLMx44B?`sBLkh0uVkBy77Nt4JoI(jNgWOar`sKv{(oShoA^AEz0*GZ0%irV#qU1>p`linsh9K~@wrf!`z1M12M3s?S?QrqRs}6R=P~tjd&7$L}gM%dd~q& z%zVictmO)x;9cx!Ce}|#8ay-D(u#MnMPu`$^Ph-jQo-tq06kcw+oD9z-ds?8MqkP679|oaVN!Tya3shtSCDSmgWwACgmj|yz~7+CD!o7j484L{6c(G zRqUZ3HzCm!z;!8?nY1&xeBx^9*3pogkYR0y5F$+wfP@^jJ9f?d= zEKoO)$*|XX88>k{hBu+;PL$6|ba4xr)8cUBo`?eC8F52;#PnjlGZv-vWZoMSX?r?% zBP#{4IPKY?KBx7Nf|id&E1kGVqCFcEG%kV($&mHev{;!G9gjZ7qeY%*=1QEFL<@MP z<5;;fiS7vDkV`HKLMPrKQq3xuoKkuE(=!V$W6zgWNU;2R&+uI_m=yPy*dD!9N_cuI zGapVbznR&6tW9aFBd-WLw%U$yTqWtcS*zghsTyUQ{B-(0_ii~lrz&T73qS_aTWLgR zpe^qU&*@vG^fHVrwBs^3i>REO#a?Q8qCc-&5m6glI~c4%2(e(;x z-HaHYo3aEDElRQn_`1TYL13sCs<9-VZzjwZ3<5tqhKw|x`ryC(NjoDmzrO+^yIG9$ z$gb(rcU4`ShV@9+8bifjVMOrUnaubC8?USQhhwo=7uJrWz!SG*;L`!T6hoocRR2MzLx^cx z4V%T_bvQfouOt`pPv4NPA9VoWqlp6H2)N4`TccyLPLGsfs&8zog^O!T)Z9FLv7O3B zG$U=xN_h-rkMV9J(rb?K+U=Y|8YB}+Xx}k)?pt0T9K2^tenUGH!AXguFa_p3CzG*G zltKDnO570u;A%A|;tHW6x|?Cl?YBz6LDnoK-@#pw2TBt(^!H}cPvmB)3Fls7sjwq7CC=aUnC;1W;K zu{=u@3SyyE6kQ8bC^#z%HizFJMzw3PE=wK+MwnvA-42#n4TAFuL<^5y_&W+hB;-l) zy&i;#-QuD$SE4^Bz<2-f4SDQ;Xqyo@{1(L*dEF$|%9qf#$d$Hp*ekpc9!kq!|b1Lzo?*XxVB zwc(KP{SOn4lzaREI9D>QH}7#ZCN)fBvKMKKW^!O@3D=l;`4sy^0uvH*X~KtR;t$>ZoLH z=B-IdX+}RzemWGIOzaATPCf{KmGBXHqN6utlOF!0%)Up2dc1+)h|ThxH|ZR!gq$IU zaIi@P5P$x(nbLcx8S$D>gF!Q*=-Z0+Te)5#~23Khr@9Yk?cA7CIv5*nDB-Z@zWGQf%IK%Pe&>;Z+qja5=Jw2Yh zKTH`u3NJ5pPSx-W;b?~nf+BU!TC)F=6C@10X z_nYxM!W0-#hU~%Q9SJe%H@%5HxTPPzo3iUMZ$X0?K-3PC@xc;8$eiJi!DY?@%8|)g zDf;6&79?c@zU^yNXuydvMv?$~5f5IBAAUc8eXyIcS!T9AU{l&eW6g!u=mAceFr*!A zgS-aG{h50VXK%3nA_N|0+Ia!tA!X5X1rINVm^d1Z2UjZ1b5R#gzeW^>i_E7svvPAo ztB2OGZf;hbt?E^yzKb*UUm!gUSZuM=kLx5D&5>`P>wCSpO6_Mo8djs?a8=0mq~zQa zoud3vhx+nhMmYs?uQi?d{e^QyYE}R}nHK02vKA^@dPatKEhBkVrDh)=thwsX7|zWw z+G9{fv`Q?Qr1*<-6*sp;m9+UfYz9k(L1Bv7^iLZvB7)yKguQF&yWBX>RVYlVT|gK5 z$|x^V050}(j1F;6H>R5Va)}9{*Mjy{M~S1CEMY_vs@rY$*Q6mu>oErCS4sx30;`FK z=Vx6c9!RDHB8O*M&wV@T87`7>45QwX0ZGwxiip({7Va#BRqi0N=h}-uAPN&I3YYNI zbf}gaKRdrfO|1J>Pk~%+?o^cHy7n3KuX6o8pZFZR+Ih?vX+u3rK^*n>42Mu*1D{l2 zK|wgWGN0|OOoGKxB<9&kB*nsErDSZNNiZ=Cbzws3E)-EfhMEcK78FD7(Bz0@Q*S~aqaaLZ0{0liw+;gVKeDK7s64%vr$8W&GLk@k(#DV)4g|b_9Jpb&z!?` zG)6M6um!{ws8O5NmRCuTMSY8(0kJ1MDABGkBhtAd?xlL+E2%yPltPK>G06Ge6#PnK z+V#`gV}ex~kU7R~VkXd8sVY{T^1V0T24j_9@(vIrZ(ZDr`DXVvz%-U;k{wAY=K7V} zmn+xIcirpdH$yYxN)l#il~3VdHT8%Ob5TgLOePW}Tp#&y7le_Z6^5!CJ8H_xfdZp2 zh3P@lCb~BM%o8IE%qF}v`G{tSm6_OQy$Zf-#{z0soNG|%5<*lL@i<-2gFp>%C^4z-`}E=yd;h6j?S}BpVn@ml=5_Lk z4~GT=1iOCdfFW$IIQa{^#*&{9cX!{vn5x~AsF4tu7@TXmLaYZElXPJ1*b3M zNG!Q2Dtyg>^-HczmS4P0`{%fR54ffxC4HFb` zCq(^!kj_c&$;`TK!6lkjs5tBy?a51l%I{m_Ib8wXP6)^MAcP+Egbw{Y2e=(t)%O8|*DV$GlY7B;VD)p$kaxil4Fef>&j@QaPUTwh(-yH3o z{WZB6D2;V^*6z)&u7J`srQYqLYdwhr{x^4$e0{eVB4% zyhKTbw(y1glS4~ORnv)OdUkNe2bg4(>F^EAJcXs8GktOmR{o`2C8PukpYU(R+^x$t z#{YdpQH%4#i=)}a2TtPEe5-|f(2gmjsOAq7jm=WwyfH9}Fi8K^UK6v6Bj662QgHqZ z$uZ*`QTsbVC&PC5lmg&m zipGuDhW!DhDpRdW!gU&|(@}ixRkQQ@!7!l`J49=d`LT0!LFxjJWoRzi-`=~ocJJQ3 z{Ok7wqZ4evh#Vtmdq4Ud2TWF(-S}lMg_*M1hqDRV;mIM;@D$`2hwmOPTi#Y6iTecb ziTkbDVKq55fjd!$C~L=3kVIbQ{Vh0R7lz@W>C4n+^qjgEUn5~$W8S~ zvuam!0MnXHKDyEi(5|BWq)LZNE!GgWjvOc1DHKIv{y07PcIDqz{^l>*s*+18`3Qb1&Uh?_uw=d`EE%g(pVgUtVjFO zT)HeeJ5V>=OhnMkx6a~}Ls}KxngGSe> zbwsJ@s~LY?ahsL5iz@RIKIjSGE^vutq&GV@0_-hoHetWz_byBhMAhyhp$#%e`?`Zp z#bK@BP%wO~r(sAjVRguySm;-gJJ|@IAevUpj#N~kO<7c%59SBBi9tV z_|w@5E`eWu7I?vUst_x@xqsB-xqHYyL8=!tayX0gbT)P=5j@cENvzs<_6{K|+eUb3MCe@HtN%$@774LK?GbE8`ns z3Cuq`^vKV6_I)7&EGR)U(vqx)qK0k_`!g*)Dck7iQQ|eVGaV=(zs>b6E-va%yF+v( zS-jXIc!XiPPiv>vQMltRI2mq{^5xbN%^N6CNlBOUdEMEK72^d~!6+`!iUbP1%*3?T zicp?(#1J>HUP~yzVCQHMxuds=1rRq0pULJS>QS;D(2xSZflg#Ma1ru}RU08i6+qyj z%MDylF3|&>TkLc5azfG9(*txvR-nbk$rSp8KkJ1h3PF}`5nLVntY%a`21Ij8r?FUo zveZSYo-mfMf>{a)MGVt4RJ-dw>Nh)>-NAzN)f zoqgAkQ{llfB7zbK?+`vBeF5biZLAfl?LsCA&-MZA2YHCD4^&YN20l__YJwD!_W!S+wFE|&S<=De&&7plF0Xe+<5ws%)2x|z z&yE@*2#-h}1x+*O_9<`z8?lSjE_W|?EAb2oM(iexydeyc;Z^f8g=(K?Vq7{Ia*mP+`yJ_{gG(j z&uoc4Eg2X^B4*pDn!G;5)h&HtT;(-<@6wxkxY(^PyXg}b1FsotP>@%%k%0DphG@_Z<)-;i=mgY{g(A8H!@9eH1v>@DKJU`51SCj0?LMp5ebWDw0gEr zcKr52-a-nxO|f}ou7Y#4@Z?{qJj%KJ7aCp)W)&LBa4d5*vjdN6CbYoKr#cTk}q%;PiZZHacp`?o&Xlm4DFX(BOXbU zpF%Ps9Wu=?bP%0%mn5QlVH)))8+{HBslh{ylyxZHHF*d_8P*BWmnmVPMJOT_nH7mw zC^yUJ>U~q9$kp=R{K@^UHeb%?e^ce+(Yt5?}ftroCpBXf-H=jNjJa|bh;V3vpXxM8I5B_Jm;CZiOyWQ7^Cwr5u(Qoce<>5f_lTWgloYnXWHoFY~krrGhHk28aeR5PJUuy_!!hm@<(LgfIK_sQC0HjbM5Y}qMW95F4D z-UUU$sLmhHR70Mf<)#gv$>G{a6XFAWor#1!H3aftWg4*R31QuoV>cR+wm%Zq!tz$O zJa7KCakP0PyUIebhSUIzBx-L`9!(V6NOAYw>ST~0F-^Vd?-2;CSGiKX&$UK^idOWH zlgVF=AvTkJ{^@!~KG66~y!RX63GB}U|4mz9=@9Up55bYTD536~s@;6R25XENR20ASx>2 zf`}lXXhlE}H$X($iU^213Mwe5poroE?%V(UIp?`|?j)h$_x1bFt2gg^)_eBzoadZ- z`_nzQy&~W@Wt$*47`7b{1oO8Ig7ap}HV8H@41#^&2;3RI7w!VDG5ed%{ysPX`)|VO z@JYBm+-^}2OoThbJ>mYwW8mJHPcd^hJP7kzcp$t8D%`bD&$|gW!aLy(@Oh~8zGUW! zEkUpp^IlNyXTzP~S~C~nc9=K9z2F6A{{geV+W0Z!4aQrb((!rtU3d@N8oqCF5bO#s zhkD+}q2j$6>bdtAABHNo??L7NXK;J?C#dj$hr7caPxbK}0C&VZ$#^tWd~@KT@MO3H zJQFH>8Y=!WR65@R^_)wg>f@tO@!bq}gI|Cux6M%go`Fiw%Wxa`4|oXt4-DbKOT7P+ z;UvtboB2E_|5rh!<65ZrZh@-Td*M|0INT5Z%eZ%|H&2I3-y*1ZI^cG&+qfDk9c$pW z@O-FrUIh1m?}Q5f5x4`q0qzJt0~Oz$Q2y^W_Xps)I!XQ9gd*HHfdZsvbO#k=cL zU#g!_Tl~B*W z8LE801m*8hsPujZD&D7!&l`Ua74C0P<*|L6_rD)hIUETYQi2np($fuC(*GAIe>=AObnOk*Zzn^An`WE^ zRW40X^)MeQoy(!ZuZHS388cU57v>A0+Rfuo@jVHZzGtDrzW^2P6{vFAcDXO7eT+vy zrF#~Xzj<(1xCH9CtDx$q&&xE%K<1(^R0Rqto@wkimZ0K4AG&&kYFC#*rSpSuPk234_%A~FyB8{d-+;Tr zr=jxql9{(Y-TT`MDxHTx<+A~*ycQUjntc~k`|gK&?s}+j7eGDtQg|S|5-NS4hbo6J z8SjPi_YhQizY7)LFQK0Ml9{(T!-v}iDjj=6rT<{FZ-6R~W1*gZ0#v=63ipF&!NXt` z>N!_H$s0GqgW%Vp>h%{;;r;=qz}?UE=HsE#(+=MWd*L+rTPT0~oaN=Wlc3Tu2$kO= z)VMrs_9Mm%pvvK`Q04Y6v%eB5{ntR%%gyircn_4nC!x~+oVouEsvLGc+n4hpP~|rd z%6g)llu^CaCA#4wcRa%=`#c`hEx%?=PXA^EcU1Pl7>~Da| z$8Avgyxr`-X7=BLO6TKH;h%$QcfWy3&!3_4yThBjd2gt4m;%*)W*e76h3|zbzkV~X zgL-}esvN6O@m*|uKa~A-Q1x>wRJ*$qD*o?7)$@x`&)qKN^SuXDxC5ZZ@oC2CP~|og zD*eYpl~XI!b5Dcve>RlAUa0hC;lZ!~RUel^`M=uCpMuKY?NI6XGE}?|L6z6HpyK@z zR6RWn70>hL{)+Lx=02gs&&A7GpU)j#GyJ#Q&gdRD@1;cBRGXG4`&7OG!tgevz-;DPW1Fod^4<^Nky z{-1z)-t%UD+1$5Y>(ez6%6$*0etalY{mq7p;2U5Ad>cF*egPfiILF>gg1y^mRg&&soMSRQRfy z-vSl>QnUY%*8=>NTJCy&=nf+Z*`T06L3_fn=SD?ykt93qKd&8YD9|pI9M?s~d0V5*&=Pow)9;or>bg2GPfod=Bf{N#AsPNaB`=_AF=c`cV`#mWCKZWx55>&hRE7Z6< zanQ$mFx2=n8_Hh?RC&A+D!zVrJUq|LUxdo{BXA=8Aym2i94gsO)j{UB64kDL3` z#utr$H|{Xx>uDdT_7pah`9I747gNpBs@DjKVcEFb*Q(~~N=)-*iy7p-1yP)Fvx|yFg z_ZQ&|g@-ENBi4I=4G2Jp&c*^XC3XsPt}C@%?X4D1XzTo--Tn37etv z*#i~-8BqTE%$$X;oS^)j1C{Ozq0)UB+zVb~{4A8e2hIEqsP^_VsC>K#Ri1w^^FN@{ z{a>i(PN>pG;qI^nreQO@8J-G%3+3 zbG-ZRQ1<&l#eW1;I*)-GFK0nLXE{`R=!S}aEtLQDQ0;BR?B5CZ!2Cfd|2IIzcNbLo z-wPGrV^HnyyHM%-IaEIX2sK}Ccdn23D5&^OfXd%8sQCJz(vgK7umY8y2O&)$c+AWT z&hz!N6e>SGP~q1@`QHE)|C`|;d_PqB{%zd)d_NEE09&!22PlAWM+1sBEm5z5n)z4LMGW@uiABL{H;DOlx9PSVQ4OOoD zzQxz)5m4oFG*tfPLgn{lsC+Fn^AaezZ8=mwJiP4a^0yc&-c@Fwg2$530^Aq-O>gz> z3V}Gc89Rat44N&cUj@h4T_NN(F8P78I zLD$~lqlBwK)!+Pg`0`i)m7dd}%6B!?^K!;vsC>T#>bW0+itlEq^1B@#3?GGRPrrgY zz*nI9=fBK;;w64u+#ha_eKSgTS3#BY^-%rd3-CDjC{#Ucb*Z=C9V-5* zQ1Q)$3jYQue@o1M71TK1Yb?PNF<%6ChWD8LH=x4*#P|!ScwdBi&R>k%zQ@<&o>2Dt zL6ys7sPb-vDwp{%go~l-r5~z%-V9ZbS3s4^O>k#;8&o`BF@DYXEvSC{1XQ`a3{{TX zUFP$(8&o+R26utSLAft7E{AIWZ!}h+()j^%{{&RKycMcmKM$3jJD}3D8LAu}Gy5l? z((_BG^aStq<-I3VznugX?nq+;+zs<_P~*>HsPwLdYRBh8mCu#N+u$0^Ux%uXsqgdg z&44P`c~JSAZ)}CTV(x~!!Ct8JmZ1Ef57nM8hDz_1P~~(JR6X1Y7492Q?eQm2`TGNu z|DE6O<2e*6p2<+@ooDu)@CeMS;NkFGsQK$UsQle&{4P{}UW7{j%WyLMH`H^F_<+yH zJg9bYs+rrN@^L1Vzdoq)-3TYb3!&nD4^;VH0r!NrL#5+kGd~OGV15Ovey3gT>tQZD z1aq62*Fm{o2-PkwgL}ctq4M)7cqqIdD&NnT{k9+U^Z%jnSnOM%%IO@a{CohaoIebe z{u`mj(a*u%;bV{~DR>%Q1beUW^6+!8iur^OQO58#sPye{C259x!xT(Gyat=$S#b4- z84KZ^#=WjWCc<2RE8(x;>F|`Ry?lKYRQWv%8{k$S@$F~^R5>>p7sCTFcR{tIA*l9z zF5C-#0ID6_09AgEK;`#aQ1$o(RQ>-Hs=xgjDxTlMJ>fs#esGs-e0!J-_r`oIl)qM} z=d6PAKM41M7r-g-gHY+c8|wLAhkE{FP|yDXRCzxIC&AxA)yrhI>h-6y>J{!ryS6DmIo%)S>YpXWf8$7N9Ua}5mP z=it`xdr;~60aSVZ7^=KqfC~2)xDDKvOv}8ZabM$+Q0bfv4}eRd@{xvWpEO+3)yC?|%=daz7BN9Z!PW!P&-n zQ006IRQ#tw#eX_fy7T6K2~@lJ2voYh2vz;LC4&xGlz=pwhJ~R6h5I zs+XzI^<$`V>NNWScr@m7pxW6dq2m80l)v9WwU6yS<=frvQ1vhcD*Z=8rEd;Ydu@i> z!!ymk56b^~sB~4K!o3+PKbJt|{|2aX{W4U&KLnMZ??dI|NvQC@f~v1Sn)_Ba`f%Gr zrDIR1^oGV`;EtG&gUbJWGp~fIpEXe7icszF0;qIc2$hcanE7hBBjy{R!rf-P4=R1% zH9iA(#Qb}x`urPo>AK06X9(5L=b3p0)bobmR5${6g4aXk|I<*<`z%yE_d|^X--h!4 z98~%4aK3mjI0&lzmO!Qd zG^lz@!HICA@nWcSz7MLMe%Sa~sDAS>TmqkkDyO4w_48sET#R`Hs-53wd5~%!s1S;I8pvw14Q1j(xqEJ?8#1sCa%4m9M|SL*Wje_w_mjDqZbR`8orJFb_4(ycf#- zR;cp38%~2yK$UCo1s`rA)bkI8C&A;Po>PG;m&>8*>1L>MyAQhd29@t;;a>11xI5hX zi$4CnpwfRRJPJ;QO3!If;ntXY&RB&imkZ#Y@G`guydEmt7mW8q^|Nooz2W0f{$7A8 zr+-4_Z^G@K`#{-;#u>&_pu)97o_G569RZc!c~JGx0;j_iboqqqF<%c?!o9xa<@j|_<@zvGIX(py{y8`aZgrQ% z4`n|O&V)Ts_4GD#e-CWJ{BfxIeHyBr9{6S7Uyp?QV?GJaf-8*gfO_s-Q0?>qsCXZS zQ{Z=?%H^+6@oj&%&(H2q;f^r#bmM%edg+3yzq6p??S)Nn03HiJ0p;&WsQ7;YRo;Ix zZv7SC9`=MvPYC6InwjT7)!&Iw<=zJMywyt4^X4L`c6Bb)b8dlh{}UX9)9&~A{2)|2`WRF??}93y`=QeRkl8;D^_-`m z>Sx*mKD~3H@_!;!Iu}E=s})e?w+1TS5>&aIW4zGpFM)ew|30X2pM;A4Hn<=BikTmW zD&J?J{QU;1{9iHm?KXS&J)!!;K~VMB4iAT`;bHJRsCIb`)Hrzy)OfNPsvLe`?k_== z!+)Tjx6Ok-AG^Q%OJD;WfQs)!Q0?SKsC+yKRX$Ha#rGmy1^*0{ulBF` z{gahY>Au1Ec^G282P)jp;CAo@sQmvPE``BEKE2DJ+&iJldnG&)o(0vOE`kTc>*0a$ z9<%?E+5Zh5hy6ZZ_wq#>RC~M_s=Pi2<^C{KeE)??@1YNS9u3t#kAuor2`c~RLZ#z! zI2C>gs-B;L+r!_P`4y=6wtB?pcNZx4{mgtQ+y?VBsCt+Vw}y+M{Ix=b?}Uo~OsMvm zg*(BD@dBv)UjkK+pMV;-zXH`hzGLpsnEOAW#+AJv_4zp(s(mkj3cmvCxp^pm=fJI? zem9W72Cgq*@fWjHne4#*YS_Vb9rr)ux|HiD_&tJ5o{PPHyD7u`KI;)Y2mgw{v&?)x z{@;T63V0)z%K3TBJ=`C~{d>*d*D?PV`$J*$`wRCPkCMOT=KdM@Asjwv<{uOGPOh(W zeF^(r%|03S0~mf|_D8|X?7m7E{m$n4mF~^_0eGMJIRT!*HGti*=6;TGBK$tVZicsT zZO8RT%=&4Z)9?M*>GvKkjVbGh>jzvfa%rymFN}VBa{u>)`4aBWBK$_Klkk+ne1y4w z7XAghUEt54+V4;C$J7w4f|qmA4c)m1_30Zhui(<}ty~v#y-fyw+hcz)^*N3ECgNL; zd8$3<5bRUftNk5_-7mS+#`U`$e;?#(;5rBUM!1&iXxtWIevJETxIV=-iFm#NFT?G6 z1-9Rg`1>4JGv-flF$D#a@p~k8`u*M`c%PYNJeBM7Tve|5*r$m1hg|yg8Pf^>dvpJ! zcMi6~U1QX)JmVJl6mI{lL;PR5RI7@UXs=a@eN^_$53Zg#J}TETp^nYZTtLA(DhZkrT< z-yqj!+@^DVj{DEUVf+otk>8OP#+w+|?B=WZ)4OM7Grt*LZuh@33M=uapT?38SzMEi z$6)t7?l;K;zmV$&-SB$?`-|YOE&LPQ|5gtCo=&7`Z_=ROwOkKje-zgU_w%@NT$2d@ zJFXdA)40BaoqkVqmGHXf8mz4`_s5T1G_(CzTLTUZ#*8mspjvG_|tErM{oz`%W&J%++W20c&>MHy`O6> z?tii{|AxOdf46f#h5Mi2XEQvAbm`Y>es%wE{o!{g?$a#XPPlL2elM;O?q5#$|Caet zm>0R9-AT-{b!8-WUvG-Wl_3bMMFg3GAMS515}{Vvc?faU*%54ZGtA z^AQUdxo_s?N$m1)9e(};Cvr*F`SK{gSDCqBdg#F|7x?nce=F z_1lYZC;Qvrd$0xj3Fap2UvU2}!W6mR9rkm5n(Jd+`dtgJfV<-FQnM>_e*$)kF|XwQ z&+u`~k8r;?*H^e^aeV>1ZFqi&`{i73!%n}mxc??s@^>eOSFrm6*GlfcW$s%O{wIXH z+dQv_J8=ET;@SisH^09#KfQ2wE3dn7-;etec8FuaKg{pjxj&Kn>A2s|^=r)Ufcm`* zx3&BC8TYYp9q?cH`4apt*Ad+Rlk3CWZ_o90?pp~nz`cH7_6WXV=3ipI7k4G^_i%~D zFK=tPKFRea>~7_1Bg`EMclnvbb)#i0F{JF)u{=EpD}%k>7X1(*xiZwH$(zn4qD zFB&hzZ9Uf-F8!Xy{xfhVGk+Oousa4?kl+{Gyoc)`{2j{m7ViHB--w?-alL_i{SL-H z`t8ZhLAdF+GuL;_?OAw@-7m)e-P|vNC*b$nTp6xAFweKJ+`4t@m6$)w^;xbdgn0`4 zN4fu}#q~J%`rU^4PP1DIzkvNoW**}HYVL34y1?ud=BIYQ+TsX}a(l1c4<`KI!~K7- zzng1E+Sx1k`v>>uat(3+IrtUxe+&FkBCO(Eqd$q?_wc_v*F60F82euC59iWv2F!CU z^TyzGi|e<>XU$%CjOz#ZJsG$6bDd^xUEF_5_wetye+d2&J_A3>HOzIWIv>CDxIT}Y zeg&=-ruG6tQ2VNr!e%E4tl54s* z1|Nf;Ak1v+I=S?l%QeFNAGjXm{tad?x2^E|Fy&&lQ{>J@F@D#335M~1A_sN0Zx!fNMU*`HKS10B-!NvHynCmUv>vuKRo>oUPUyr}9 z;(i!*o4EfN_xD5nw&wnP_*OW>_F1?PyPM$GxRzn3-;LadJnxI#f13M4xT4<+-0YDs|Bd@+%zOo0 zMI8NRKGov;fd#%E`wI8p=E~vr9M@c~!+F->*zL#tMy`F$e+xVY^O=e-oE=sQ;heCN z9mR{({1t`?$s>A7sq%pHSIU$tg%Y-F zONF7ZGLYG#TO574k}46(MN!QsOx@Z3d{`}#PL)N9XfqiKuCGwdSM=om4B#n)nUTg| zN-nj&S~xLc*qiDblqV~#FqbV?f+;2MY3iy%l>!+^5Y%ViDJag*8 zRK72hJ9Dbs$y%`yyN+ev?EOy-X1OPf1hX3Egd>?$sT|Cj9S#(#rC`>)hS|pkquRiR zOlB~ceXRE}dv3#=V}m(!8;(6TICgHs++%~ea~qC3HaKo>NQRqxDdOOyR5(z|tUdYg zRC*|zZ!8WJ=ND7`nUnk1t|@0K6TE_7#dFA5DK^cRv0=l8M#Ab*)YVYAv9B<6_$i&$Qr|#|Fok?3%ojE&d5uAH zJO5g`S{F7i54)S&JDP*$<%>GHy2PH=Q&%*Hn8O9lT?1O+i;aW=0S!>U3S4dKE(?|9L{2SW`k#;LI8Yp(;D4P zDl8Seo60-vrR5KXy_pI%n2%bOJksi2++x_4C8x6^>#%2}s934Eur1Y_$=Ut#LM6L4 z+eeu*1bF9;d~Sr>VWmGE--L_Rkrn-Lrc}w6mC4R(FI5qCWpXY&j+s({&eWHg(L9{B zIMFZJ(!%V59(PV&j9j4N0H@qn3v97LJ$L>_t=-_24*^f>`<2W+5Q1-af zTWJSleN>C-R3&4Mj7!bAT(}UM{(>9RWb7pEiXzH8R^8R!p=^awD`8pKP#flYGhwk% ztWqL)Nsr`HLu5av63yib8(c7Q-mL*oGDF5tDx32oL7rwouL+v- zGz)U3LgoFK=3-Hi7fZZ5*IcTUXSC$$eU(%;Kg4+BtEfCcCW7X2mLS#sDx*&`e@dxb zHkA(-6>>SXGj%;01C4b-^OCOS*5$BkLGz-H?qI>fg~5WBw${^IKv%o^!h(+O<*mMZ zENSUFz2(%7mFgG^x>hW2X$=-I;`Nsp9Mfv@g%TENuDoWG8SQlCe%dh>^hXsjw;2j2 z>P8E48Zb}IrD)9ya#dUl>5*VTDNC~(@O`M4thmWb{bUA_WYU?nGK4H&_~ z?(T4*(ikpJ4P}Cbsaz(XPL;yeK6(k9D!a=;f$>x-eBrhs&!&y_u4~cb(hXE}0m}^bPhFHc|>vX)JV^ z%VqQox~!j$G(8s!w1(KK>^eFA`4qP!)TOQm@AaYwEl*x$R^{HAKb!O z(ar4WW)3&`wb{~8*rMhfn>r~x#ENue;Rg)!>kMH#wWg*ro@LlWZ;?xdatv3HS#DLc zBK4hTME18;Ivkl*Pj-{4W}uo=Ch6pc3WX{Wsr)e7sh@JoRPP1`e@8LX=qN!|MzFAo z+>r0Xl8#j%atA*|)ETU?cxT^K+I;h&1&fxpF6da%(;6)5Xm4Gv*0zZ8 z#Qg~ul?p}L$A-K&x}nK#$yTc3?^`t^`8KPdVJDSNYjO8osXVg??XOVOu%F6J53_5T z6hk*2mLgZ*80bhbVE9&k%`elP@@S@&DfRqCPC_(<43%LwqF`ihu^REdoL~_-b!I3FwE+f4bJhSG z-Pf9dIXVlxmqxUro_qk&K+IEbC$}g$bX?f{8~a9SET8cq_H+$?32`f1DtW!*HRb`Fjx+ z>?Zf`rEctxe|7&+dG#|4N>lnM90Dk zs|>0u>>Wuw)(Vdan!{WXW}{u&vOa?TZ{zqvKG;j~|Dh`I9-8 z$m}F<K=(1%D23Zf-ZU6R%A;wtnpHd>ng zpFg--CZ}6^UZQWgWnDZ|H-_iNdeL?a=T)q5j%0R)`qtbCG9!2cksQrICFDj?jayMRA*M@WD!$<8D3aMcRb~h@RrG{!ZddF>|7Q%YW|2;94Lb5ntGl#Au$F}=g#$JDH zt~!X%>1C9oQij!rABfyAV6|@5H};{)M^RvzT+|X&Z@$DDL*LuzaC(9(Mf6n6ZqDp- zUs@d`*dF36|`S4>p~TpIHsLpHr~baN}HwMo?!g^oH5O0P;GpGr|o&c^6Ti7jnJe>YBM50m;|sMmlb!wDe*TtxXi2D}tCd5WIaW+hTQR5oNPLFUgbUPu9bUEpH9BU#N>le$& ztD0ZNmt7;`Uq&n04XJEJODDIsPa}FQZe7|MEY9?ns;SZlH$yBD1NX#umFi6{LyL(X z>D_D+VxPBZU1UyPd*dy&@^q3@9I!ikPV@}7DD?g+QvNupPJgIENqbn7kgVKaOOP2P zdxafN&MgOvSqz1K6|W?sGgcqLI=&BE)ywK^+|tZ>8MRDyc1bzfSxCA=OOUt^o6Mvp zKt)9hLFYwfp~urE9bJ(mq;O~HR^{#v?SNawIzzYh03Wi)Nzu;1tAnI$>_dN0UW>?x zE>}*JffjcIAe&~jvsgOi7PpkG-Nq|pXXPJG6rm~v!F(aDB|}DnnkafI^Epd0kUFr9A(wc zWVdi2J5(G$L}zNGGnE_Pt(KWO<*y$@Mkj5B1U9cfwqEbEHYzzQZAD(6-&NT(O88M; zvlKeI;0of&hAfjpJS~#g^wU(@0DyCYD z2Vcf`H43*H=q*&rjp3-2lrrn9G~{yFKGJo)_86sh&Ds?fNDp}q}*(H5P z3w-Cz3`zHB!Jo8qYyL47Ga|1u)EXFUmK25A&c(`2{Mi4)Exxb7ul~g)aNqI}wpp}89w!j}+VkK;L zQAZ}1-nC9kj(Y`tjGq)$dR4{5(2_Se7lspWNsnk{OO9E&%pA<598cFvQ+YQnEiLqV zHPO;4s*77-Hs)VZA-S%5w)IKmLYH!ZM*3@B|9og=?uJm-swPPPm;}^hqt!} z?V4-bQIrqpFM19}VqaPq+4C&ZQkViGgVQQSh81pW(YtAr(cdLBM1-aeU2h-HO{2hg z_I}IKyVUMUww}P~v~Yl$&7hmZxRGllXlErER)lsE|(;^oPMoz(L)Eq=An$+dGaQ-v;`IoDRW$u8Z6Mwms5+b z>UEPbZIQE$3~v8Xl|5!JoFKGA{?_yvv1nXpOR2k!wMcDK9|l*=dv%ue(K2@-IWTuQ zg;%|JvYZ-ridWkW@Q5qQcMqrU4a_OghdMfn0J7nuVOMx5HXT@E^&UL8p0>!2I*w_1^s9tkIVZnYK2)Q$eOGq}#8wcoxy5!eQo+G!3}7%()Y%XPTC6WWL`*r5)8cek9ELPSq7@1dsx! zO)kHh?>ZgK_z~85d6kFiG|qTV>{ms*`;+|%h{@=c#%3OW{ZzLK!%d(xT*OQo9-Zq| zL$K1e`F4xm^E8zBnWhD^opeh`WXagb`WF>3=M6LsvudjM5tXSEsS|rgK_>$>`_T++ z+!6yDBm*o1-M!oMb$9W;rZ**b)|^eGHgE>lUg;i+Zn0}M{@zP@&N^y|^3s#)H_v`0 zC=Zn1!U6&@QuSK(7zTe0;rTMduq@qL(&%SbJt%VVHfpeAZ4{3bMsC^A=QEOJ5TU>n zZ2?&>x{0Q~*z9|_+bnlm=5z)bnnFj7Yf;wey!1i+jin`TvNW3;vPPtg^EJt!tm;F$ z(h;u$!@JT|NTckIXp*|w`n}A^;N;VBHkWXxk<#WCq*Q!nko3y{uiCC{1iAAh6h^!HU70?= zsgClItvh_BbveCreB)Y>D$NyskI`@Ghe74Q^Dxsv=d6SS_KD zEck+KLoN!sq$iA*1YK3B1G}naPORjEZl@k>3X7UCPCnPo2u-ujpW;T?b6cc`X_|dL z-Z&nzR%E~liRaPM*eq`}tcC^TgOzarjt&MnE=R`KPgfydO*3dV6 zv$4(}n^^rs_q2gHo|I+GZ&I`6Mns%{!m#0YLQ zt#6$v(ul==Tvzlaj_Y;D`{+&s={DEPp_fzF75k@${n@qC!(yJhVtVaS@{hts3#{%; ziDPbV0jlLZYGRJmVXGq3W?2EzBpS!-D>7{dPE_c{T(zI=AE%yVVx(cZb5L%jkzAmt zWdEPU9M!$nH7-&;PXmzcJSDX|v8An?<*Qosr7XcKURo!%mlyjHN&b8zNw%AWKR;#< zWQ#>DX1Wn9>3~9=t}t zXn&dtaOzNZ9EMxzMf`zWGnkUZn_?x2H=2?J1qrf-Q|hpImU{(Bwy~r2g%$ zpjt)n?bd08pu5_;PMRzuv$Q*BVbG4GgoJ9Z4p-6Fw3B2ex9b(HWb5pdR3!9nPPIy$ z@MqGg_L{P?n=alr;HOx(vglzTDU`JP=Ng9o*jAcun}QxXsM@LRcgOP}8PR5uJ0qH7 z-bu6Pjt-l5Dr{xtJZPTd*y?(gfwf3noJ?=g0eQv2fap)Ks6lD<$6oW6Puja!YJFlu zsx0+Tl&n5lEv3u;Sa>Q&1f*5hv?~n?@_^G6HM$tk)3F7mhiksnE~IbZ67}3^=*F;} zWsnAVtsc=$`O!m;H2Wr|m(4Z`&%`OMOm{aINV7)2yy=y4^JtevOv>_^pzPERpx(8!UFN)-0%4CwN$ z{a9C$xfC~k1)fNbrG@;&^-hgQH>bjK(GL^r^VQ7saJA$jopM!q&@kOGA9_qFqqQ+&9#S6_tJjNE z(k0jTI7^G}#jl=~TokW)#JAdAQhASasjM-?oy^l8H)J3mdL=|p-D=F1slG*Ogcwqf z;W#ya(_W#!mLvSW!vsAX4n`~Hc2;^&agzl7WvD^_SoW(UjdmCr$9vEcu%#`DSz=DF z-plHt3Aw~oOM@Eg-7$g{+Nus`%?noKbpTGfgSvhvd(Lb+^@MGoctq43h zlr`sjxN&Dm41U~+B~a=gJ}4^fM8S~{@U(ZW!fhl`onm0PsPFHCWK}S&6*uZ&O z&2AX;OtABDL^B+4HbAf51hu{LNOity%P-$)q0@5|YjiQO&&~Yo27BgPbihnNI>+v3I2DO4Uscb{NqYKghq1b| z=I}p;`oBDhAvg27Q^(TIi6qikzTUJIz53RV*<%AS@%hbr^ANUWDx6jCmpa`F5IJSC zuf0V1)faWFQ$UNMuByWJ>W#$FBBwG)yd5;jd2?fX*>o{U#k!N7kaj4ccu}NkWhP>Y z>T*&Fqv2qTRKz&Ka!DP7hS3 z_yFy&W6G;%)6tGuW{Dj*cG0?xDTsSZ^7vUFFZ_==fwr&1zJH=CLk9 zr$Bba(dXV>3-tQ5cB7*=Ldrp{uvqY$Nn?}O$9M~;KB{Q4cLS|Tj8&FaK@F|x1{?62 z>Zk2+cvj<_#^WZSsb+cH&|dD(rW+Pi`^ybIg{E*qXGc#1Z#lWCuwfD9(iF~~IcrwK z%o7@B&kJYGZkjW@Vdk+jXX3G;iwz8kUV3VIQ>DV*1vtxV|5 zRXN?zuvjByQ=UI+;r8TwIO*hY)`=6|*w9%}TW(;v%#kCGZ|EsaVYRZB z$HcBQ8|{*orRZ)7*Q_~lP3FWkYgpj(7AcFsS<`2qxF+ur+pftM3Pp2D-1kjilkaOf zwr{!%v{4@V2)r@2%5U_(y%*A;b!M7(sI+$Wv&ASa8N8xX!z;T>BW6)?LLTQC*JyYSG%CNHej%;P~CjYg7!5o99 zeJ%iH18;!hBuBls$)8Gl^q<+28cTB z_M#2bU9mu!61v(blZ(DWuVEEbsScL2u`MrLRe6WHJcuTTqs2)l;!=P?bV=woIb>$R z%GoT7TsgXMgS-^XJMaGSk&7N*b4DzFRd@H;$b-`9QbaBX81HhMH@SduZYaS`0~MG2 zC31f@{9{kvk51=1}OaIu!mL>xe~%-%{+Y zL|-9T!pbpK87%k`r4mTN(B@6lCGt8&R>;q1x35@6@=hUwbY@Cb?vP8?6?EiVfsxaT zs>oCdM*aP4ogET|F#r-jvmc2B?EdxQ^^q2eZXg zj+cz9>uAv{3rHxMW%bDd=4tI``Fe^Em>j-^vkHfw;<`bOzy5qlsu(m=XxTy5Anb}2 z^agkuU5r@Cawtz}V4JnKn#PL5dDwE~shI^M;}%7#lYLYHn;^8gVzrQ?@p0ZSTUwXO z7de7GqbtP}BrR9-U?oe|XmQc4vRLLE$>1Ogxq!h;-MDT#2^(_iKpYG-$11N_M}~;j zwqqj`ZtRDiJzULGLIa2@QR{H+b$Iip9Q`loD3d%MK>x@V+ad z@_7y8<3?8VXswzAZ#kWQKwjn$QfX=zX5yfgQ&_s9GCOKxfC8$F)C#eiv}WV6#uqJT zRQYNGpH0wcNB9v<2F}EuE#517>nH0+B~nUVRP^96ZbQ{Vnu$tHB|{AM6n%z~;8NpI-iZyHCKD3a@ zX#;Not2cGy1%+~+T_8I4l1%9wHf!mW*p@h`n+@IRpt}Q>Ujr(is@osj*=VO)Ztd&3A;k&3BBX zsaro@G3}JI^TU-Xt(Tn?qxQm*gpnf^kAscG#b+8QKvz=UP^(v)5|vu_t%hYh&x&vv zvNZ*ouQH?+0yA0Co9Q+TJ`^}Q&uTSY)llU6DTi((tGLo(2S!5)uUV|)kU~5W)5H-Z zA_*X>I*zqQGqt+Bx$B@tY@ZaY+;>4Fc;)%NLxUew+1;R(`oAHMuF~YXHTGxtyo24$ zj&A0V;sJzzN{%6IfbwS}SqvXnzVC0)2(%fhwu2aTlZ;YE@2QiQE8krjjXsSGg zIq?n}liMbt^Djkqp(V#doeG8=x$4}qW4pCi3fSs3`s4%AqmkuL&?d=*;l0G%Ng8vA zKI&5R9=@2ucoa0##Pb@xG(L2>F^MEf3LdffB5I9s7-VbL9-F;5XF@~J*%>Tam(>ZT zY_O=nsHZmFDJjFrW3FqBHZxOH>09b(yof!>2vF}oO4ulCBtr64$mXh}15ogO1|1c` zwI)Q#(f&)Rb#!y}7WrTtPzPxYmm(T^C-o_Yd4_<^n|Q01IY6zA0%xGId7c(oAwg<} zjZysk_vck4bH>pQG>o(tk8pByH$>%lJML(t)QUGUF_RQDxMoh3hA9>;7AQ@J#A-kt z&9z=HaVRB`jUOLsCcf*#46X?zvWsS-*zD@b2A0S&5@j}p#gXy|RT)P>wraDXh75A) z!0eqz99l!ZxxDmf9@N)-v~rP98da$i9zv!srmQ>4YL-zRt-V{LsPnSi z&v1!;q((}L#yaqdlWS_uMboPUmdW-7iW%JTI%okQL@$C2tWzgpRJS`PEc4+n)p&tz zK|hLBQVb!IR~XPZ*{ko(@amPH=FKuTu9S7qS>NiH6^hvc1HMBv+gk-L(d4UwY~eK! zTcEV{QX?}bYp&1dNsDs@)I?7&k+i_h4Kq0-vulVJ#j8gym)atIAQADH2oe$2O*##6DI%)7SN$_= z<)QLy$u`(jK589PC>GrSNNcQ&Fkz_Bf));Txc1UbdAZt6R7f;MMouZ4*R+hHrL)DuzdmM_D8){SOQ zwL)Z+|GyJqCGS^ITTVjMUa0`-Z`@eISrg9TP`)LNkyijp3+0FhQB z&X$SqTH~nLV&#KVh1B|x2G2xcqX3ys0+@5`X*7Qn7Ew97p@=lp_s_&r^*CEO=&AWy zlU6xsUCeyLK+Y4`hJVd?qgLf4)Mh43ot1K8D-o|N&{9mL5+#?yi3*dFag!lav_8re z77&?h<)p~+dK1C~Ii;3kvr&A7fprY8$x=v;Dh${(M-~?9x>4Dv2J#`f%xQI*D3fIQ z`YsU_jY~X5&W96hK|OwpO+1D88EdDr*vdK~q9W}1cTFV3s8+Kp#J13O%fmFXm%}~j|2=kJPU z{1df=(E8oGXCh;hnW>XJNB_wu4FoN#Tfo&)NADPGaI*^|S2SFr>+@MhOIS_#cSTnV zPEST9!w$ar(U)PYv}&HB)swTaPT)Hv9W9!JStHWwtO$8S1|=ktDZAI`>X|0%)(G|U zis?KV$lX*icB0-wSW{H=xWxs1o-LsUW`#1nS_1}S!(hR!E2J&#W^pcUqIB&Urxg?Z zIOZBiH@c}*utZ~LP`9O0Z(`$s)s_bP(I4<=aBbAZRTn-?e8$8F&Ww%{S!c8zI(z$& z$@pP-aTOJtrDk;CT1D2U#D-J12Q(@T?vz>G2TjI*Zi7F#F)H*h2hi1~>mTRzf$VId zbap!k@k~OOqKTB16z4oX%A|_pe;f7t&;-k8!f|;Xmvgv zXF5D`LAhF3r(G;-j!ajzg&JDl(H}7x*2*y(ee1-s$6SnbhmJGD_XUxv>honm{8vw2 zhsWAkF1~v*?h}F~D0I;ft<3V(axHgz{AW-))G#`=uJY4e?beAubQ^PZI{ykfPxfCM z1{psRP9~k2E#KMpv82K_1n03^Q<1CEvy2H$-y=z-#zcypQ)7*NSftO2B8oL!Gommv z+~m28^Fgd6>G+#B(d$qR(mnY$#1hWPhn%#~yCAi#2(*@3uA&p)#MfciX+~+uI`R%g zDyNawB<^N3Rsqb2taPmnpxIz`#s)HD=Q6}I_eV3ReLqEZ+QC8uY%(`*2svNM98}di z4ou3f%VR>2XD5XsW*UlD>KbBdruuce*8=CXBg1q^V#qZwC!h?|o261S_vowwDaL~D zsz8Ni*&-y1jlgaOVjBugl$0)!6tjtjFT3$3?v)H?bV99a+56C0gkYr>e473>HPc8)CTBnV z{%yQ-%`2xVuj7cG;&x{V=G8sSP`B=h~()K zc44UNvQu`pvqi+Y6Q?9YJnU z+F8aD{vp#yPb|^a>!jF#^aegOhcjr`VJz)LQ)jG4 zbfX6q7|$ziPv57dWr$ZSwC9VvJH+8<0qR|cy z)w}o%X#Um4R_OgG4;fPhdC%ED;i|k{6a$apQniw zO6)ZaN82v1vEYkTgo=d3Mg22Mxm#cikF#09E=rs#EdfL2#~mk%(iE$=v}-GsKrXAp zYfgUVPfh(Lcd74eol@qVIrfKjU{7-(s|~~*FNVB&C^}o7L(*Fa7pGPdQX?IP!w?cG zTvv&W^xhPwQbQJS(PlJhsCh?SfSJr#CvzfeCx-#5{hA{ZCuRnH5mx9wNo&(*Bs}V@ zRMH3IY3=+#!XFEinzyKL`*}XmND~316p?NWLBM3#grj?kPGGQM9Bog=nqH&gU)@HX^R+V)Y5KMDqmIuojm}X6sgr`@yLh6n z*{IX;ElZsRaDST;$a`s?!@ho)v|%tF4!tPn6pY@p>M0y|asSB>X^H*t zWf%LXP6K%zLR?}Cw^m_fA9+gi(TZqJlsQ^ahMHKIDH~tKIo{NY&g zOiTvuKqx(&RC6$8%y<~ZU>%Cj z;SNC3W@!JuNyk!2?9400QLVV6Vx*I*p)Y86_72y$kp!4`IrkmWHdks(AkJ5?uBF3j z-_QAqYL^D(guV{V8PsyT?(B9lcOLmTSefB*XfC3Sgu(1+HJ8BylYlpHUn^7_Y zC2Jw0fiE&UF-w~Qk%h~qo8jtg{1HV>o(zQUKSOglrdMy|on#6TxiT79 zq*J87GsbJ$Pet>QUa^QGazT9XXsa(V+%hevUDIJ{K`iVt>A)%TgLM2+Hdt_R&cHkH ze9OMlK}Rw{8u6K#Z}d)-6J9vPrnogivIo}2Oqgo0r6p^J(O(JT*r~n^)DRV_vgTTz z7MRp9%>*ZZPMo&oC$%WE@!C1E@M*OPBeHapTWp|XM~5v(R|3UR+k6XI>bt=raU@Zb zQWTM9S>{^pAw^d8x>ht zPd!mP_|Zt`b~Q%r;@W`)JBpTwmPQtZw-jsAQDaCB*KvbMEQk}EDx(iUXg#l!fRrM0 zG5sRXv}xn)sLd58LP;^{#6maYL?&j5L>1aR z(IR8KFAQm@bV@h>eIYtS;`2gLb+m98L-P#1$`zaMxM-be)krUD(0RXnY;Z#tTL7;b zbe)MM*85!~$l(6eix15qN|BnQG18d^9ZU3YQ8YwvzeGkxZl^&r zbF4r!bEH2**3Gke>WW|0Ll*E>-S){L z5)WD~qbAU9gO=6^R{ZA)jDk$O)@5Dl*)NX|CUcP1PqFT8IYq{}gU}VdE~m$!RixWD zCSJU@6}9Oq$%-MbS&BbFkHYGjnQjW((2nn}>jy8azTuc1~urY6yz@rIt{ zY1*^a4AH#pv>6P0k}C(x>gSB|{!>J5RZ}-NN~~3>p$_Hbn)@nIUC-#?JzrkkOcb^2 zeEyU!3Y7wmWiPl;pFP%9qsia-<&R%(@R*`45wzv%Jx8ktH!6Bp>V=w%^f_({(Tay$ zGeYoc6-E3y!!jl}sC3z!ciT)+K;~lC3vHdFw=q;&! zpwqsQ2(1(1vQbDIW4xdz%`)!sJ_J#@6uep}WJ1N~lt`MHqgbdw<@nWt#r_kz`z<~v z4p6Z%h==M~+DJ=m2x;}Tg~!&mi|89sQr+33sCwLnA`RWk|6yIjGl7ipeJRs45)Dsh zdx3XSM|f3{hN6`k+mKo{T0d7GleAs`EX^2Hj#C{a?&~*~cv+u@u0fB%ltoZN{nTNv z0w@_KVL8#tD~Fg6{R>gGB`L!QW1Y60-8|y-jWikCszDZS;y6kCdMdj*RkkXF)w}@2 zz^KKQO~!6OW&hbt7TUV1ea?s`YhN>BlfxyPMV53Z4BdJ)v{~aAUo$clLS4ZI%Zj-M zRPS_0_CT~fr55RO{W)7Xn66RuLd;a-U%&=Hjiy8 zj$SVuqd0J)iQd(kOHEW>~@+i6M_R zCt>4eO-;fsZ<;tM{pj#3T1Vc(S;=;%-tuA7(1a*s)XIJ9bVWPLC7P~c`78O}eo_|~ zMJ+*ROsCgtNW7dl&SRo}u_+EeSSw=p-6i&@S=v|ltdSq;dFO?%>1EwZI4-f&y{Sqt za%NOoiIvS=9j!epx|_ldEmD1_cB`{78dQz7%bHu4E#tq|<^u%!TrICXbM9(bGiH=N ze?F0tEID~c?|lxj;WldSu;-YpI8b05@h`pFXi^_P?bkBW7_3^gD%!gU+|e&>#35U@ zyA7>q-RIusin}cW!hBMcvwi9|?ONBqw-jw3E#ZvHxStt_s@Bcrz63@UfD%}%GoHmS zSXnKw%eBlMGuK&_aZ5KUHf90d13?+UEX7(KK}wT$JT)^q#?H~e8wK^FvW1NtYoqGe zaEV=AJ_Haw70H58dh}p#(Z*V4W~$Z_>fVO!NxB&bUOX zB8GKen~^3{(uqodx4`wS3(cP-El|ZVXhr?ie2w*2)@!rT3$s4vpzQYkiBghs)Sx7h z#P@-(ZV#t?Luv|~2AMC{D>?NioLC%sG0A=2C|d4tGPHJRM+WP)?$-5_cyXGLu+=Im zBW{pLp%cp|oV08o&!M5FE=|nt?wnF=c6$V)V*vSBOpLoM{u63}XHgTqgz*^P zd1Mv-Qh@wB%f}t%tuQI7qYS96%Zuu$yv3^_b9Ne|F2PCEgsx#+yk|bO_-oS{&Hk(7 zxFmFK)1X$A1GTk^-%-0MXf9XwKI{ZYd8co;B?eVXPNV{2KmLPmET77^BA?G zuTW3bJ0A&klyaOm!`!Hf;|7H3AFg4}Dz~!iwu0_4;V^IwcqdGie{)*w`Z=u>Ho#d6LLA@_RQCnRIL$EHYpT?*O zwVTBLE76sJI_`s7(Gb*xW@Bxfk9F_{HpTpt9j6P9!wz^KmtoB*ygTp#YM_Nvy&YL) zu1Afx1=at~sqB9+iM<5$-2Z@jVO&P7{0ZuAeT%A>c$zoSlx8MWhdD7m7C_Z6jcQ*9 zb+5FB(O(pP_at!E~>FN?brbi{*D>Jn}!F z`Z5Cd@Aco*5)J-=5wZb`=09T?`xEWRN z0IJ>*)WXhV0NzGT=pL%yC!Rj%ZxY&a=X0-N3e*HbF+PT&1}cQQsmfWtE;b_H0yTjR zsE+rb20Dyte-hR166z^?fU5r%6Y2R+G|RhI8Bh)KU}7wW>aZ$mWpypy7&W0zW*=0C z!!Z#~M@?X%l`lu_$R^az?XvO{m{`yMc@nxtx6Oae6tlgK^P$Sipke8S< z7B$h}Io`mDQBP57)Xo+}t-K2A1=I{xzZd$H7)T-vM_Iv2RKtyy-;cTpkD@xbjaunz z%#I;*y_+ttSqwE`1=Lg12(_~t1!!qMon-Ts)Mx_k3rod zyHS_w0P3zkZTVj<{{WK{e}S4vaFloH5}@*F^o2teG7-?07D9FOiP;cU-pcHan$Q^3 zgr=evFb|XBSE%QFD{7~Xqb|h_i~oZ;$fua+eO8q6kd$RFLIn2_zl*uj}>t{R>fDyr=`y+y@W;t zn&TwAjzzHRQhSV0mteW&x1lb<9@Hf`Z22>of&8ziOZW=4Bkxi7R^ny0W2l=pw?FS= zwj|VH6Vy%B7WKS$vUm@(KWfWISbjXJ;~A)dmZJYT$JFF^VM;uUsqh|V#kZ*OGJnOT z^pVJ=1QtcDpdxA_tx*GZKuxGS>K^Ee>R=2iJ{9#i&PGjWsksH!??KC-LhaZM^AGeX z@D~XU=q~pRK{ZT(nm`&1#w@56hM7fBm!=}BUL#b0t&q#>M4x{nz#V5LnM+mH{#zBmpu;|tWz zC0oV*E0K1UXBJe4IZ-PsjJlbsne|Z*WQ3BQRV5)tf+o+qwa}9sGY82@y4k7 zzSb7#gh>eW#9$nbK{y6=ttO%dUWmGz*I*d#McuTwQ6Ez8Q3Iw~&HaLTP&-)*we@XK z^+zC=%I8Fr$VFfqs^cq|6JJ<9-5PJp3u0&D)o?1V#oSnAtyjM_YQp0%1SexKevaDN zc^C(mqUx>o$GQF+NT|Vf)C%`l{uru*v#4wJ3&zFYP#xYzb@Ui@&%8iw@qehDOuWt; zFf*#3oTzc~qv{vMAU*#Tte`6D?yju@Y>t{x8`LG}iMrWFqv|a{ZSB`qz7sWp6R4-* zD(b0vjqxyOy|;kGsC*jqsXZpiSsBRVNqh{O!wW9W@`h8JbIR-*B)WEw?{r=#ObN!E!(6v5=dbeLky@+0-D#qX9z0s1OCYTj<4RfO=R2j8% zwNMjjX7M(tH(?jlJuukfGg0;CV~2K}G^J4tAOA5a~fL=A8r^*CNft@M_a|Bf2qIjY_p zD-ZtG%O^tBPmAg|)Z%$j6DW=vr|h>}e|1!aKr*a@%C|+$xU1O<)$lXaB^r#XHyw2; z=2`hBOiVrobx96d{xoVL*HCZJ2k3u4#IXM=NE~A`Mr}@yH%GPW zgn<}|$?-GGk4LR=GHPL;qwcA%Q1`+P)DE5Wkpl4g3%_&1#b<|G%Vdbw-?f>=4eNNzZ?;0jS%{Vve+80E1R1EdGUkTN46>7kZs2%v$ z^1D&>zem+OiR$kHYNc0DJ9!_qkUuak_n-5R1p;<>6_c77Py^&dbzBg&Q)Mv)*2j9- z3H8`+LEVf;Q46?L442 zVL{Xcn__BgjSa9rs@*}u~>xs4lINZEuVgu?Ih+P-V{sVaO{a&cX9nS!;E~p(3WOLQCV z>2Vx};u2K7eW->OTi+!NrgX`kYE6)X^uX$Eq>v zX6lBzSq9+{oQ#F>y;*o4KMRoWjN!Nzv*AUoga2T5tiIp-fujdzB0mweu$BI}j}?)~ zMc_Bo009TQzkn=;x+glLZkC~#6K|t-ApZB>mZn23AQZLoaMYzKfm&&0)Q;9eEvz}} z@r%G@jPH!Ff|;m}7NZ)j#Xh(V^|)j|=yjYARbB$saTSZ#MeSg7EANGx=n&M4YZ7Wf z3sLvNH|SHx+ev7v_nN0MFZr9O6(#(^yLPEiGY>;`R2H?OhNzpZ9jd=BsDUFy@u$7-h zP4JHSI|h<}c8L8~!Ak;a_y)D5frq^sh}U*JdYL#GVtS~fyWv?Xe*JEC@Q z5Nb!qS@~>p0R|KIeMKUK#A++pWclr=mFz(ccn(AH8mi%Y)RqSy@#-Z-4VV)(k)jqa zi>mi2s=N(qhkGD9;&TRg31=i~%O+wRoR4a-1T}&6sDXE&I@n|RA5mL-!r~V&g#2|> zyL+g1FHj45ZSllMwIHs4dJ?Ko)~t-0aSc?1MyQE&HwU36Fb?D542#dlAo43vZ7#@{x;cu_eC42yAi6`yKMWQ|x~)0`X3B{csTW#wus{tp;wvyx8n4KWyMwjKTru zyx)$;`Ps7@wjh24TVd#V-hwy+3**mb@C82F$(O_p_}K;azdtL>c##hr0<(VMZ?f=j zoR4cRIZi$-|EpKt1N)Odi(RqWZ~X9q8*nmKy3BV1Jc@}h=M`_qieVh`warFYkbEm2 ziFhQYVJe)5+N$-~1cR=6_d-idNxl>6^Lq&9!YSq!j8Fa&>fX7Hx~U(bZps&!5dX%U z7Og3;EOX&Mj~2 zUZ}I%AK@kGls?w-|>!1d1X8HE0E$)e0*(h@|YM?o&2`xo+yb9INI*V^Z zwcCa2_YhXZlegIa#v~Hm=8GbB#LBn^bK*m+fl2Rp1GK;*%IoqQ8_eGM>HJpfXaG|*z)nJ|Fx1d(I)8dCw6FGqz=&X6w z${%7J;?GbEdW{-5(F5;h%!rixoV+A-t%{%qEbkRK)lheBU5tyZFb#G_)gOWCcoM4P z#i;u0QT^;hO>95L#p4z~k9w>xV*Kw%Jh~ z-ofIqGA0 zJ?eA4(i3kYi&5>CquQ-QO*qE#hp`v=)2Mo7pL*@8qE=qZ^7Wsx|A7RW5U7PMuqdv; z;&{>W37>iKO6EW;M)_LvDpnw${JB@}Q`B=m5mj#=>b>zN=Es~by!T6EABm9!hNGVI zzp*DK`;*Ezl0TN>XD_{*G07{hgZ!vV(h_yIw?|!yu9yt_T7ImRPqX|S45NGz=0M*8 zE4YhE2|U5{_#X9wNdK32lNCh`R0*|(HBb|%ivifkY>KMa0uy6T@a1)xr|9BHgiz#T34-;ZVEQ)necl#Kugws(s*$MMJwjh56bxDf9@m@p~ zP&-x|S-I0tc|HGKtsv6uZw|!-l#fO(zcUS|q3>T_CK&&%_iZ^AbL%=!@#-4r-#$P!oHNK3zNay|<-7s0yi2*Dw?6lH@?GxTKX=L2Z3)i#I{-P|e>M08MkT zJ;ve;Jcrq^JwKPJ-8j?$QK*$IMy-4W>XK|i?c@Q}4*qC)-x(6061a%kn%u!&N5xPx zFNeBT)lpm98ub|Uwekt5iOfU|u*Kp#P!rgXYIn@?*HG;rB0KGK-jUGE6NGrCKsC&O znm|s}E4rYS7e%eGtXTy$a4jouVDaXbZ--hyS5$u^&50PI=l^pO+LHOGYrhONp^c~p z+fZA)7d7xHi(f$1yM~(ZJ=7(7ZsiH%c=1%Ioef3R&yVV-82X?8vQ|*p3TmM`Y>1jr zYt#z6Tf7gdqhY8w-dNN`7oZlh9Cc4^Ks`-+QT0z)`FYGk{u=uK{x5D^Z=e*YilL}$ zl-n$i>bQ~F1~p(;voC5zLs1j*q5Am(HG!p=2{)nY9Y-zbTwI=iB`y(Ahu2UI@1u6$ zspa3GItqyAJvPZu9i>KH+f1m>hN7r;l~MiGHJf5-^6gOV7Fc{)Jf8m~1lAJBfIF?= zJnEWVMNQ}->QX#M?Zi9OisHuiI?RbR$%kV#9E^2vH@3q#30(gdlCHRy{5d>}vwaD@ zm32zwZAm|K2x_LIP%D{W`I)Hq!93K2x1t`elc?wXCThYjQSIKE!HKP&eCp)POrt_ryMnA4R<{E~0kk zKI$I$6ZKd&O5yd}1^s{j*PDc{$q>{GC!jirLaksG>JsfVkD~vnK~3};YN8KO1HM3A zqIanFsZ)C9Ma3(i`fG;%=f5inO`sp@CK`>Jz#P=gv;y@$SdVFOKWZl~p>D#bsFfv1 z<=vc_Q1!}~jd2e7NYvK9L-iY+n&)4y%tWcZ8RkYk&*e}9HbSki8)}99F(;0&{0h{i z+koouC(EBjP4FpdK_O{eCo85yU8=HX^)x*H+L8tY`~#W&Q5}v#&3GbeYiFQ3TwvuJ z%ox-Jccc0_WbxCe_P?MebPct$uTTpN@ul@7cZSRvoKUaIn)5HurLn69JmfOfm5h@56qDC zuK!o9IZ!v{NYn(zp(ZvDwV9OlmCO=tr)B!31+Vb;v9|7XT!*qnUHEUy1oF0(L({7I~bV?$m4uY68pLp}f5 zvwGiv24Wd1{D_s%&F1=lrmKS4)DZPzT4mFp|*4@>dm(swY3KhL=&{{gk~Q>X!dM!hjFTmE;{ zfG zD_)4&fhDMwZ$wRSJ7&fssK@sn>Jlf&=k-?@)t|2{3Ef1MQ61N`3JtA7D-0ms0X5Oi zR^As?e;DeLjJ5bARDZKkI~r~IuTcYTwEVZogniC;Ucxzuy7tFWPs3%4KSwougSr=- z{N76Aqv9!06G(^JiOi^h!%_W|#W4I7^;t6n^&*;!{?GsQB(f0LgL)@lL2cc0)GIP+ zxIM2}fP5`f$3s!q@^e(X?dCCzAb%ZKVD$ptWA^|xk)#E^iI+hCzyB|1ftsil)<R#e_rg3>e@jsPtg-w?)Q8Xx^l8hFSivu-0dATP zP~}fi9lS?%7*xpH>cpstW7oxfC_AmF5Q28#2br z`<#zkH~CJ?w|QP&;-NHNZXdnfV4a(V)^^ zd6LpR|7wuV0@+Y2&yU)w!l)USL^Z65>bNm#Vr?zn1@$=gwetQ}J`&accvSltsD(va zepzXre+AZC;9GMqY63@51D!$*d;xU{uA@5s6ZJ9t7Bz9FjMpw0btw{{>SaZ>&uity zP)}JI9|>)JUDR{i5%q!?iaBr!YQRmX4!%cqcpSAe=PiF1b%~y!9?!R^H)4XaUb{4? z31&qNoD(&1Unvq=VL8-9s-kYH7O3|@f7A}mL``fys{YrgiEKn|?RL}v2T=76qkqRx z^{%5P^uY2jy>g%P9|?6Br<^xXVpPM_mJdY@kQ+6@q86`d@rGt=)DCn-y&ndmCO+1j zin^q8%xH|K=YI(aHC*Eluo6_m{pJzW%uk~xa2YkhXQ&mwK@IpGyJN!g-iimI1{`hq z36`IUY9FPzexO)FLOZY;b?r8x8ty?&>>z4O&shEjYDb=!|Dd)wsDf875$aybWEMmH zL{ta$K3Iu*%y*;zzyJM(ga){QVfYMn?Ne9u?&89z@*1d_H%CpdBWkC*p>C$WsColX z6C95k@N?8otwz<~fLd5gMV^1H_shAx#;}WP9RIq$i%hy2- z)X?%RQ44B^nrLs-ghpU4{0g(-QOp0~vkEDycmtKfJXENJWw9rY#MP)R&tBDg?(?AT znKGyysBHPVW@C%DLM*88eKd(>|dW(92#jopKsxVZ% zENUleq3SoN%k!_BqZxsT*apr8$n8@Dx(PMGeW-zdM72MM zn($Rr`#Y9@f@=TD;_npK^B?z9uY)A0Yo7r%)2tRRfqKJLK@HduRj&tXz`m#j3`ebO zwz&i~;CeF#b*c8C`Zx3Gx2WlsL=pWcz zVy;I$rm?7d;WX-t$#qn_zZ&uUtD`uLy+9_^1PY+yl~5ftGyC9n@{>?cOSvXqc>`=f zz8e;D84z{1KWOTGp>dmeZ_-?Nmv{}Fh2hP4{=1Uc+uZg4!{Zz+yx-l-#XiJeqdtba zwRHXe6Kg9mhJ2=0uK%A_oW(WdKWWXt_yp54fh=vOx(eB_FyACOUFq%dK0|a$#vEeuhH3c7U452hSR&a&KNv^ zBd~IW>$JzcI2bc^b)BI&4?CkTQ8(`<>W8{HMp}M4>L&RD^Waj{-Fy`N?{=(7{w}t_ z0^PlPU^41nnTNV`>rnU7_vTa7O`EBQU!RkkgkC&F%~GhFsXVG-ZPdU+&2gxkX9ntK zT!QLw6>8wks8{VFi(f+Ze;f6g@Br0cU{A?KN<>1BQyNsqnNW{S0n|-Y5;Z_W)Xmu% z^{SwFRwg3s=r+5fBuUoL7+5hW|dGAsf}f@HEPSh zKuvTVs)Nmz--T*-0QKQ>47K7rs7v?|wIk0_3kZ(11*89e|0@#-b(kO3prlo(i0Zhy zl{c__E7VH6pjOro^?Z*(4KN$EpcSZ{T4(uK)Fs-7+TougdHyxP6{~O$)!}1QM{iL( zk+`?FrCCrN=QE3-CQ=&J;U{JT)DE;j?O0pX4t7Q@aIiVLH_yL1m_$GwN1;}-2=xM5 zkLu`vl^;gk)hAHx?w|&Kj=JV=P!kU6syPoe;4;)q*Pt5gviNcHXUswTGV0nogS-jlLM@~)>f^RP>Sm5W z?aT;Nzf;iv{4XYv@l~3L{YYDOMpG)zLE41Xp7i?nABU4(b*C2DRc8L%abBp(a)a zHL*`om!dc7o*ImuaKaFte%)2x*P%DW>b+ioC(OO)9J1`m> z40rwi9npQ%Z$ui5@cM0xT6qW5rR<4X*a#nqVI;<(26&6Qi-Sgbmm)qYp9BLi752uo zsK<1Yc@Xtk@y_z4M|mGkgRmU&Z?H1{ft4_PwAbF(heSmJ>&@TIyzGoR?1{R$zQ(?I z0<&ScF|N}E+v5Q|gx})CvEJA3QscZIR$HPLFafpVX{a5Xldj^G-u;`4^V|3Ux^~qIPl%`k((85_~eM#KJ z8P55dX+5GwdZt+oJF7O&V_nYFnli^@(#x%viR24Ww;!>hlo#imO#Tw*ccc$;KBlgZ zd@OZzv?rEd1KZ)NMCJ{ZzUFLbl~gu|ir-;2s~nHK-tRizQMVR0rK~5Nry#H64e30b zI)>2~50&!;=bxNaIGa&F=A$vF=5wafv5w?cFpqpS&Y7GEXpjqoXuO1uUCyrLb)=$x zYs$|P8%UmSS^h)+L)IUTG}dPa?@1^=P&jC_>%Y~;svd(qPgk23jL;~{cj4`_)bzP4&y9C zK|UJjhWv0u5F0|n+SrA%@97{Ot|TACspBEBkB^?jj}YT&b_&q85$d?jxrX#Q#%e>_ zKYkz?ektYjrea>}a51qdoI|Ko7k{8U6h9p6$mgVP7OTIXypH$`I_sl)^S!YDhnkUA z_W|W2saG|S@h@9L)%)Hm@o?(Q zw!&Wc4Q1Pj=}1SNJ=RxN;zx8R^4Z}GBvYQoeW*Bq^EP=MC7IY#@=G`ykmiHVIba?9 zNO>pH=dA7;Tui+&#N%6?Cb-kmg#AZj{%mP!-+e2b!{Gnfsut3T4!v$Gab~4XYtCJi z^Ah_%$2Iabm{@jfM>~GHauVPL&R3+1a+c+c%jD*B&LsWO;q!mUN*_`xM&Ldtm|6SX}Cfma%t0Mi^3~xF2Qa1-@1!CEmoJ(vR=l?%W1laW-XPq6T zvnf_90SyikuSZA6h^Hm}3};zgK9BszKjdSq^Z$r_O*#&PHpkR>kMfx|$+VOgvUbBM z|5G#WNu>o=K|Qv$3QC`(F+aNV-vw~DD!@^Td^0k;txYG=d|CGY7~Y3^nK+Yu)JHLE zm=e>`rUK)2rJv%Q{`F_Jjv8B|#dOfZ8hwH-Y4G8AN}`YD>zX%c|BUz=+Ue*-{#*Jw zO4~}-k5|Ia1Jv2WIhjC!en~Q(L@Uk$RJ=(+D2=m_&W20rs zNMRGHMc%b^eXDbWzHV`5p=~8%Z7Cl@y+^bg=l|c|^LN4BZViH{%r7aNZ#aukwvzl& z()X?2R62M-Iw758Q^({dQa%(bB47Rf&+(Lc!#Q<~<9tB*7{*G3RedA|6XeG={}In7 z5n>H$U@FdL#QAFI|0dLzfmT|%*NT^qC1zWE1oZ<+@3;Qy(B_tnF_}qcPYcXr?b3})0>LnR#~AVbodizSI#@+$68yf?v!Vcqt?%I>gcF!?f)j-j`|(RPw>io zPEo6Tmxdb%KC(vjsQ4YRR5t4*A5AVh=?KngA5CoTN9i_{6{4T=Ho2b}coXH7q z@37}z8Ga+?|NEI#G}=kyYjjeDbbiv=X&i2youuvxVquiG`DoCWwC_h9eQDK^m2w@W zaK5Ft<9h1d;k?P2Q_sJStrXm}^hFBBbLt0+vL6j_mOAmt*JAJ=aT}&1)(Sh}$44yX zUl41=8AADH3fGbD#st@q&xGYTeM$La7nO?;)RB+$6e{Y+DIFEb>$pfv$CucS$pujV zI_c-chEQiO>8Dn=q}BB|us;@2zaQmsC~HAFA>-x@=J_8)W-T42q2RG~!0#aZ$DhOo zQ&C46^PZRW|JmFI3bWWLYd?VYmFYJbZTLlr|0ro?%1j~tkbGi({&c2MAtN3A#`!bn zb_%-V1}csqtskF0rNM4u)5)Kt{u9#6IU6uYX=0(IqeyS!+)e#6oO?NS=!X&=gXlxY zDeA;hUq@m+|LMK7vxttHQZNtK5FcO-RGgdGCzLHjmvaV#cBZ^L^#&3@O-x4_;(u^P z6W4Ksw2npQUtZS#)3K8N`@b-aH`B>70-s}ED%U2KnRI&6bx3!{6XYk6&OrJs{zyKG zvlQ*>t2aCTqP!U8cggSI9BuIsCj1%aG1}z9LmGb~iMRyxGn|gxq&4{fI?>UW%xO;j zIDT0LcI3wZ+BU?t7ArwM*3tu+z{f`i`qiNy>GXrDj<>r0kqorND(@rM&0oa(nFjYP zKA3c2IzMimG_i@?rhG8%b6J}Yl>TV&7u0QHiy1_P2>Q`6ns{b?|I-mhusVU{4A6|T zxed^dvS4fMugD)sD4WCiD{X7h?i#T;R#=dH5zeyo@um7B-o^TQMS3CeE?APb>(Q5) zKSpvsv5EX{5^^e#Uc%tl=%5u1kCC21x&ZNit=@LbZUd-|j!qs&;JqxE)!TzK*uu%%t5Ra>X?dE8K^SpLFzz3 zjx4nKmvag4!+ch;5(Qt8Zf_M-DH-X@ zn3lSut$tk_Xe@*LM*X3be@DGMq~mb*ru;|FN>)$(bmtsOox+@xsWYCweC-L|r<3Aj z(i5CTgZHT87Ux6G+?0>u97V%(oUp&d(`#i0zOZkEu6__*v3X#ESW& zJYCeu%vkzOC`UH`pLeOef=WMdenz?*XH`lDQTeZ^?|Y>1eMPDxk(QL`(65kmG$cQO zGbLT#Ww`(7VLYdfEyT|dOKkb1!w~=p8o8R%KDsW7q ztQWBvw7-%Sq!0bxER=Y0Vh=eN5<5+7yDHdGl=8!*zh*MN%vAVu+jv{oTBb$e_gM0_;Fd?xq`y^1(jSf*q}$QBF`l5j0R!{5jsD{*@!vTIQnO}M||=TWP`EThhI~vv5vI_Z&105 zb-0&&9wwK7vz~Qu4bxls2(Ov*6KyJ6>jOLte*z&N`gm z5_`)ziS!=*--NB8@>0%!2V;aG2znNREt=_!;ar_(X)NFgevu)409n({`Z zyW5W4rcHig=cwD6GbicCxD1&(&n2DJqd^t2=Ln9VVF4O#u$kv1eM5EaI6!LvVJQw*a zq~~xhBE1^lQU9TJK9uxlq&rgf8+~1%e7W^kmsl0j!zmwV^;c3piI~Rs|J%ne$$Up) z7>(mIyWXUSlAccad&)xb6lYQE;3erO%HPwuL;dEQ`^cZ5d=)O>{DgFIm2;dU9Zu{E z`sz>m7V%>GF;z!C8vp+zDV48KS;x<$4`4dWe~QcKqz3WHwB1a8m<<%7GR`){(^g@`vLEmBv%}HG$fkWvM)h@@n{&_&&~2q`&5D$+?X> z8909>-jcQ-j#uP$e8c$}XIuJc$bhYB6UM0{9{E3fRGdpg(oRh(btG|vd{Zh_dz8?J1kw8i+ zA0xe+^dZiEoLk5@<0Uz@8a|DCe~1GKQo_MmP>(j}?W zj&m>h0@OK9okyf=VhPG?5{toYa@UQ7OzLySn`u7?@8O*oF9%t)a^oiss)Bxo5R$9M!icG_l>6@n2OIizvWy@;RVhg zh(~gkw}y3TFo1I(`M7l6pHs&#)a{G4ur{$DNT;Tsg48RBT{%w>`<1gev5nT>JMwb_ z`T2e{6&8}wQJ+q>;sX3|d_#Go;Fu>PtGZG3M>mRjG&;8nb@p*ua>*bB4K5EuxY|^^Iy5b1iCPP|TMLj=C|U7Dc*IslQAY z)8xx7Zd9tJX`)6f?GW{F=_gTXzp4|HaQThEn15HFc4KC&I~Ew#XVbcveBW#dh zYRsu3Q3XziL_IwGOrpo)xZgg_jEf(9}bt?o!Hwtox#}*56w+6)~kLQ*Mh#r){{WnjohM@&R8}=PA zuw!Is)xKRKoK{4B9ydko zqug$f;MhI|+&|se!G+uzZgjOGZo$~Ei@5)|(OZhSnWJ+TciTsQQQWN;eZ7R+IW~PM zH!?7`YI*mT8$G|0TO>BDlDjJ~`gK+JMC{XQZk52;>NS~9Y?gZNJ2$pY19ww!Y__Iu znt<4<&D~+au|KwPgM*?6baV?u@9gL{%uqL5?D0rl1?%ROa z-{-jdf@9xByP4hCyNld}0q%h4-@kM-#O7GyCJBgMQ_W2tJz$xeC3e>`cY8o|=t_4~ zY|u)#VsPxRwQh=l*lp|GRBq;mksUh@9N-wO{_h>)M2CLumW<2j!1f8X!A{(YV8y{cBNTD5A0y?2A2ryk1x+420L z6Q%Pm^>BTj&*P~AFNAwM9~AI-c8rtOCAPfnS#YuxAY zOooeK61)zjkDKf9kR;D%Q2s{T?*<%UoD9RzC&S_}O?vwB+)qIxe*`L(8Bim7UIuWJ z$y-f+3u>hALpeGImC`d%ett9kUvN5d@dsS{`A}1o0p)iM3>BpCG6nH<*a_}3gFlV= zA9On^4z&iVLXEH?R3NRO+IN8^U|&cQJfor3)Cs5nZ$PyxKF)~;bN$PE;T+KqRjssnelRbLg$f`M%3m7Pb__w;FNTHTQ^wF5 ztJrAFwu;?Q0qlp0{IJ!3Vmt}e(K)CQT{Qg_)BkRAo`*f2+o&%B<*z1GyGAZUo)%Wo z7HV;Ig^F|_ROBO}GbK=~cNSDYi=gZ>j8DVD$j?F9ZGh@p#ln;em0cdJXlrx z|1k>cXag(?w;A7o>fi`e2EH)<47I58FSIoQ$w61@?$>2~@jhphmV9Dxh7kFMJF3gT)u|+<>ED zBz$!d`JYIk++!ZkvoIa@fwwJox8+3mD)M@$jz{r8P^Kb{lc54hg6eRZ>Fm^!-}v!l;bF< zH5CsP$TV0SJ_hCYS*U(OFPdUA)GFNxE5U=tZ=nLryTol+3_gim!Q@R)2h9#Bhx?#9 zJO~5uESw1YFC}~M6?iu+@PuO@@=Tcg z+XFSi51<~iUqA(P63Xv6<4>?O@-yu;)ka0v2Xr~uYL zIes0gqg_z#_d&J$2$q3gLD~NTHHG;}pI8zepnWH22{I6%gDb9Pok&;S6Rh7P!2vc`82GA zd;!Wqfv4ROSAn&V8$vC@0mi$bI*x$a4e3x*GZQL9^Gv_!Y4WdBEk&Uetuliw<94V3 z--2>*!1SL$E!vZ&{{|{UKboBX88^kHpaS#3+OVPN2bz9-h=N8M0~P5#Pyx*`d7;&3 zK&5^ibhevupVfb8JPj4_uTTO11?8{sa(7B^gB6kML1i-3g@Wd6gjEEgB7F!}g&Uwc zJ^*F+HPqU;0p+OZ3ZCV#F02WMzzHx7=7C3{7UySB?ao03^c!RLcp1iAg-GWcUC|F>%d+;Q}c;q7x7oIN9x$lZ!!H&oU z*U(1$zbA!9P<#!C!Qfg}EPNZLz|!m7_x%UqLgb%e3=BQ*26i5*earRk`~M!;9l7HR z?nCE3*c<`Po==Ku{yVAdBD}_$*ci0Vfc*#xuY&Z{j1$+?Jec9t_0bhZn&T|TC z?VLCH1}uo2=M{JEi$cleVP)upT00$}GTjq8`+qnEt^Nck$01k?&NKNXC`VZ^FWdq1 z!#7R;uJI$N_Me;lHI(1)p*s8nYFifF;2uoA4dh?jrU?qI#_mvyZ4}h|eGsbS#jprm zW?Tm~qRmhN9fa!mFjQd2p%&ZMQ0*_9{&!dmInPEnuu>bzzap%KLLJ;;6mlVpzPj*8p%UbQ~i5iNbP=&%=sK{5sv2Yy> z!aSRKBEl4?)IM%}%D58B;q$OG+zhqI_8JdC1^5}%`Ee2I+$fOc*o8bbD5&E`P#rXf z8c7>tXRGfG!_W_avKtK5(cMt?5l~Yz+4MmuyXjCPpKbD^Q2i}+Waj^At5^-?=ml5` zZh|G@Tc$q(sUYEjpRb>N*)i#HOM*Z!YPK^;B` ztHT#zX}BLM^W68r)_1UtV$FmOK% zsljCm;jmJ+JAyt?BOL%Wvf)sv9s`x30MtkmOrH#8KND)ib4^|h)&5DSsapZH9alm5 zdof$*KZVy&Xc29NO8MJRsXYqS;Tb4LKR|VK8Or`TRQr5eTzz4v)m{opUkxgtTCfak z4z>7tK-o>$LjINNcryq=1&{%?J=Q>Nx7|y=bF_Q-Rjzxg9^Ah z)PU+j*|&lkSg#O;+7t$wA{A<+God=X4{9Wj7#Bk|d;-ex3Ml)vrhf@4)mf&01D-dPang3y?7zLHu@lXz;pyo6ID&pBz|Def_LfI`b{nN(h zto|ja%x!`Sd>2$82cg=10`qGBpHKmwhDzmms17efHMj=VAZ(XgUkFMrYjR~MySh;A znwoqEl--?BetSUmGsyJAVMrq$OF@h@#zQ$ug-YQJsMOAfa`d>>FNYf0b5H?fL3Oah z>feM~1Mff`M4!TP@CPWnJiD2H&27QmZlsl<=CTGz)NKkcD1)!pO~PytUch9W7bVJy@f1)&<=4>c7Ft$rQUx$rX7lx#QoU8q1l zffeCbQ0K-C(--)c1q_v$ictO=LZ&F>X-PqjyFiU(5R}6)Fb@nsZNpfTXF`o|Hq^-G zK`pAMpw_}hsEqA{3iKe9{c)&{zlQ4Pdzgp*J-<>=WY?iOF7lRZSPp6=)l6;(<+vr3 z!}i9mR^P|!hd^~O8Y=LB>8F`~Hk99oCDXqrlY+L>Oh?^dXh zd<65t@1WZK2&=*yP-~*%K6gqRL1m_cu_w%jJP2w4BleO1Fbd;QC}O`=1fh1rRH%*~ zf%)NLD7z=27VSEyMfN&WApe32@F3KpJO}f`KcJ>K?>lb$vQPuB8KNKujbI(v2F`}# zp&~sAwW`lRIs6?Cgr(ngM;rka=xnIKmO=&c94rVoLItn|s-N9Z89D$9z|aW_8sS;k z0)7vbk!tU`1~s7S8^D4v+~n3!4m&_~*azMYhZ`3_`P&Vf!AmCB+Ha|cwYC4pQ)q?3 zTsRqSgNnG$`|ijZL&;sBGSb`R0VWTJh0%|J3Mk5$0u}IVsCEy*LU0k3zo%eH?f;b& zWVi`xq}yN-xZC(XR7O65YWO*n{a0519aOttp#r%9HD&n^xN=n}`}$CUG=~bLHO#O5 z--Ut>px#i6Y7|t17^p=v1**XuSP4E1eQ+I=-8)e2K7>W#Ns}*_d;`j^;0JD?rJw@5 z4TjV~6ADFON2mzQ2L>;9t=WtlnKM(d+;MKU%ybhVgJYO zS~>~qBKJM)W@rl36wZbk;Jm}+U#VGwLUXqqDiiCWQvMn&26sVizXMPi_}cVWpd5uA zaod%EiO7|qw$}nEzmHq}awxwqm_92+p$v*$X7DjAj(h@^hCjfv&~wy{yd0F{Do`EQ zh6<>;u^ViNJRE9ZvtbGN5G)6ug7UW!YG9$aDQM0=hDyz+P#v6v3gjG|41a|R)PKx% zkOtMk0;oVTpxUj3a=hO3Z@}uvZ^3f#wCS%w1{m_>|HK_>MW|FYhH~5*YAQNgeSfGx zCl~`z51TlXgHY|#pi(>wYC!X$0$XHqrf~(#r~SW{g5F$Sg6eQDRHPq4rS2S5M^~Xb zxMB5qKXo%v394OFsQUI$nd%Np!n;i$3zgAis418OTWkM6K|u}4tx zL3MQ4^v9v>ezyAGp;BJxb2kHJj8&jASO=>89Z>!{LIu$GbMmi_N1%{{u~2dpR4U_5 zp9VFe5LCklq3j-q3iL_SZ-74JZB~EW_!X>+{v1@`#gDt~Djp~Qil`|Hu>({feV_su zYWlHIXMC*HCqhlZG*}rvX!2^<5cyS;k3+42Z=nWo9V#Q-!2xEOu{)jsx1w_Ru&g_bBDgn2nax4|*U zyHB`_uJTDYRZU@a^gW;)2H-k470!p%PLVD6JRA;hz)^7USJ=Xr;6PaFYxh@kKaA7< zf0@DoDk_}jQyZRvYvIsu+*DqJKO@&Z!yyB2JL~=d!;8kk=iEO~oD4@({}vnxtDSeB z5$VSDunqdp;Y+a0x9kA@C86CEqEWQ?o?{U%gG*uG3+|t6oPw$^`U4GMDvW~X;1W3C zqWd%bX*do!?ngJZ?-@UVTBK)8z5xp$7y60J(7&e?1u3S&rZ5Dx2sc7C+zOS-LvR>u zKspM-Sx^VbJXjJw11rK;U_JPb@kgjNRQ{6Nt|rWf+z2{<{@l zra*OYkLe#VIRh3$zXobiZ8rUzP`l-0tN#Ql;4{XHPyt-M#Qc|_@COQIpx9+MkaAG^ zny@r%0o6eds5u-4>%)amBYOjC0B=GCbP&q^3)6oOiy;37)p6b{ZhwWZkbjM^GzxWC z1vZC`&0suKgD9wu;-T!OntmQsW)?!Feg)LXw^;p7s6gI=8py{`nLT6r3n2=nP~3n{ z27YlnEC(f5hDu#6sD_Q9M%of;q@7_IIKUVI6>vI~{Y>Lrt6u=+Zw1uAL(iMRCMbtn zpi;HZ__6T>l;iK99RCEBk*iP+!+v#H1S$h%q3kO{1y~(wKrNx#w}%WQ{%0 zun?5vGO!b@0*At}um^kp$EEDNqfjL9K;ZCNF@RyT_nbbtY8D>!9X%H`E*-HXetv zKW*}NP*ZWq^nd+9{uN>VKi!Us7|TO7tOez;AuJ19Ky};;YO#*6`bg+(PpEcNO+O3D z?m?)GEP>_Wawz-P|78Bj0mEv~%LgLn-Z4bMUa)Fq$mpcj;b zflyO6%H%j0hnxnL$*-W=eG8SDA5Fdj^B`Y`ec+!^f9KfKJHOX+2b>98!p+9B#!3ae z&QB`?jC0|g*lmHbzY2AJG%D!YMM51wPr=6Ufbklvi(I#m*ZGUecfpVjjQtcQ!*Aea zIIytWuv-zYX9aQ+)aor!)YUhJ8sR9YT`~b`ilR&onw$=msgTKwVIAaUur}ONl=m++ zJcB}u>LS#3`3q{1R4V2!rj}40b%vU|UQnqW4i(5~7zQUACqdaqK`q_{)6axjYaytq z%q$l2IuDywD74tJp|-~X<4LH8(Iu-dSlkVuDpbIYpd598RlR(2!P}4{OSp^g9^->h z9WRFJ=LO@g5CwI3*m%}>%~-UgyN#+tZL5}0bKV(hb*IA4Fa)*u_Q3k^U6X%?cOzee z32;a$cdGV49ay3FC@6(Tp+*FFXDnRC>sf&O7kn8mDC>6E zx}3YV*1{nAlDB!CUr1)dRQmV)NI{WAmUl;x1hponLCxtLs8ru?^-H1Vb~#k$)<9(< z+v@)XH6{B^e*`LXC!y>wz%uYJ==}ZPG8NnoD#6F8Xk_v(sEiyk`3#ifU!fM2r=q)$ zOF*T56jUbtP#s1?*{4DUILq`8K@Io`SVsGQHHD4v4JgB?O77~P0%f=WYQ#@KWoEf? z9aKjfp%3nW&Ec1@9xPGWJ$hTiy2xW-D|jE&HrxuGKmR*PK^>ff>fj>Oh_0Ia7u0qu zSjFAX#h|97I@GFe1{=fPQ0GJ%)HZ$`J_28XHDNoph}w;V@}F3h{jZMGQE24%Le0^9 zs8l`;mBLjfzXWymZ-UB9o@%b65>SDchng}U)Eu{h+HQTVegae=F;M;=uEzdX!^J2R zz%rW@O%pMVNHbe4kV>Sr@3 z>T@f~L8aIS)u1tyquZfI(BAZ2Oy38};UK8M#z5J{m_8B8&vd90ats7y_9$o`u_K_iz|1TcGTYL5=K7<7p^|-$J#!Wcuq+fqH7X`XW&N%0TU=n$Y?Eza9n6 zc{tS5tvgi1AyAIT8KYoZOj)xU$yKg#E;ZEe!Z~$CY$9-e^34Vm!udX}Ns`cDVH8!?@ z>Zc9Vz&h2l{ofmf4vv9PBZ!CEhV!A$gJ+;duo0?ZwsDW?--8<2M^NofKxO2T$zk=~ zOxy-lUlZ!Zr&axs8{r@`7y&g$5oS0A>V$g$D)Qw}DP04#$Xi)|rPASa+#ISNJE9m-$~Y!2h0 zGO+?G&@3qXolp)xgbL^r<7udU{Ug+QQmCa{Ul*!<3#j%Tpr&kKOZLAi{ALgbwaU|= zQaTrEj#ohixYP7UpgOn&6=;du-N$Yhr~sm%+RujSXobnI!Y0TEVI%l^h{8w;_3v<3 z_iU)$@E}yfrBDGr4>jUVP*b%9Y9t@Rsqi$M3&*tbdLrOS7z4Yuc3-z&f-fOgYU6%C z?1QokU8gXd!nn3x=Xd`scpq|!cJ7EChl7x_;k~e6d$02=_=B(~@-^5CcJAPH{*|iv zQ2u^^nXp?&cYw!XN92}wdOcZi3Z$Qqr%orY^Y{DL!@H=s42Qxlo!yR?!okRAVLRBS zi~Gfs0`EkA4c3I0p?1@4U0pr_+e_}|u7M#?866L`-IHJewYb*|9J4?24u!It1U2%Y)lY}&@P4QcAA(xki%nkH)4u=L zqtKjeGVX%f_wSqGDd-$1a2xu|P*by^mmByFsHr(-{1GaX1$(=JSBE-bn?q%=2ULI2 zz1jcGDWsxM2G$w(n8D{z5ubx~;jd7Rs`hb5+#F6u?g;0=_0R_!_H{GS59*;c94Z52 zpne0I1m!n6L_sM}hf1;JYH%^E4PS+t>!VPqy#eJgUq5$I6@hYG8mhh$RDEq21{*?6 zO%tnc3uWI8YHC9LtYQ$+g=dGSml37pRkOEL5gaVRiT*)LK~wmAUOuNA~AX z?S6&Y&ZX}1I)7Ir9LoPVSXcW$g@PO`Gj4Wm9Y26|kbi+qVC8}C2>U># zc%aE+phoP6N_8Ams#8oq4Jy<3!D8C~51AqpDrGC6=57sCs-K5)_$rj6Z6@!AdRo2* zH3grW{yV4+t{87veb^wkeQ79vAy0ENXbZK-Izb(={h>xW z5o)AyP=TZwXIOm*s)Gek9XtjV*i%sLRzVH$B`ANJq3m`-=kNdQGsOX@hDV_qehJm# zIn!S-UNQb|%sbKzpeR&IOG9U*P<|R%eM^(uLiz0`YXA2(gS((cJ{0O{77dls*-()$ zgIY{$p#t3wHJ5Lhd>m@GoQCT7is}D^+Q#|sc2CC2Q0-g8kW$l$f+Ft;^`bBgYCk8N zyaY}`-V8Oe+N0bKniyLfyFdln&*TwM_7hExg&KJZ)Ravd#r{{svrwqvA~ReD71$cn zzXY{S->~|vR{s`M2m7JgABGy)36sy7{Iki|jCn`90hAcc{#QrkP$*?ppr)WMl;d_# z&+Bebk@td%yg$@b41uzXfoea+>hFQtZgZegp8>Tk*F&8fyJ2m3C`3UWUV(B@aE$A) zG*o6Po7@;`itd2grrn^9&>>Lm#zO@d1J!W?RNx_~0nUXAWC7HgdKT*G7}`ofDLVoc z*%wd^EPyj=rI*x^Em;%+&9H@>KTm3VzHu5_7JbWK2Gbw)eP9A z52%B!W`r9^_lS@i$zT+6Fb-;tqRb!x>ajWlYD5d6Mz|DKhs&T2rfpWg)9Uv^`P*;u zVW>I(6l!4SpaS|OM4=vqN|W5L*sf4=0Low?RL7fP1Go+9tM(f>6Z#_EDOwJ7UOWdi zfY+chw%z1?#t%$?1ZpZmCn+e!7oZ~k9cs?=1>C790_CtA)In7R%B~qyCfY*H<(*I+ z_JzvGa40`_L)njqvWtfDmjVeOO00Wk zcY^(pM?tNPwa^FmLp`>?hgy_{CcCS=0c?oe54M8o##i9mUe*wF{{8pP zLH2)tD%PTq!%I;6^BUBmERf{RX-z178>o!*gtG5%9169%N5cnT6jb0BphkWTDr3c` zxEZSewZ`g&D5zmmV|%DM?*%oI$xtc2AIeb%)aqXk)xi!Z$L~S;ISiG-lTd+PGX4e? z@Sji}=Sz0wP%#Qplr=>as5!1>`o^Ze-Pj&#Zo5JSHU?_dPlihMY^YuH7?hu-P=T+2 zdKhIvP1PYtz#-2m3QF|_s5vf>;*O{yR0p-7^etdJ*d3~)5Y&hk8J~daa5>a2SO=A% zeNY`9hRW18Py@aQoj?Eo)f9g~ImnmlIxY@1vT{(VZ3KO=HB@TvhFWCfp+*=B)!{6t z4jzVTp8;j}g4MqU708>S_W%17)bUZMNKZgH_z|k(t56Q|q*-844$7Ha9jbj@(>FDJ zTd4M(p#ts?73dJtN5hc5UQ;Nj!^fcvm%#>bB~-`zp+<5PYJ}e#e}hiO(p?sZnzHgx z{^~+aT{u+7onaj~-1PUPv;Ui*ScpQacDorKgqqvaP#u25--oFi}BYOxq3(SD2FnqTA2J{?khTLxsyNSSNLanXL``jbF{9O0X2?oMA^zXn} z7;1UHt5^=3qbT%%`(tu@*bO-j?tmNNM>vju&<*s?`CiX@^lRWUc-KSjUp_kzXCqf# z;Pu=CSHKCd(!*X)I-CKg!JpwI?f=P-xQpx{)XU{(P>bkGsJXjf^?yLU@f2L>F0Kcl z7U@E$-H;8nhTep|;SqQ@too?CX40V+;asSxd=fTRj$WmpMfjz$$RanOw#M#IC)z;c zFsNNH3aVWcQ~*niE1&{j54DK5LhYhGPyxITb%dXiUUPJXf;#vM>LkqjnCq~*u>sV! zYzgJKE!4K_3$@sWLUj-iwW_DWV(=l@24+I7jSry$_bztNh2k(IMI{PKc|9n(6_mqn zP$L*%91bLKNOFiz+>1|M{ zsRlKY7ElhmLj~9u%JC?u118ey=P(IKUn=Gs8xOqs$HoiZpYQ20;~rWaHu5( zrLMbi091p!p#lmR$w8jc5_<3ZH~JA&{X~Qq3}%iZ^cZ8!;#m(2Jkw(57vIt9pLj& z?KeTa&c6q%YX6@#gS=0!3!w z4XXY7P;2C<@f1{m-$P~KPbmAM%UxDo&i+?K;V8sbur|CCY7I<+a=ZX4kR?#h^-WN# z{#~dHoq$e9P}}lPsJSk-!p&G6s1Y}WPCroX?p(qCR|oy9VmMR>gAY3oulY!U780pysZ}YIlT# zpw__MP>%diDGkCW;XIfLeb0HFe>-jq)Z^Q?#_gasRDjK)GT0t!PZYKk6t(d*d^UxPjv z{gV6nJs)a-Sx_0+3YFPClC}TeGsTBy@R{)x)Jb;^wuIGQcBf(p)b^VQoka?@HXei8 zzAr$n_N`E<-wQPr$4q|;YN{^4kW%~;1+D7KP;20Z8RUP(eNGpKa!?y;QHDc39lJv< zzEM!CKFR7sR=*T#vAt;eY^cCKfV@iT()js!MAE9)^_gavjQ za&M;o3%JVcpEG;4(Ob_x>PnznlS}^zx(~7M!9AaHmwY2-&foXrjxxhAwnNZ0rThkEE;qL-<#QFD z4m2*w{f;#}OWhV3a6LpPADCSXj>28F=K=J&uM4z)gj?4r>VBflP~`heC;bk`5B)cm zWY@d!E$%zH19Y&<^q&$;q%}T;emwUj?r3yv=%4^)4kynx>}F8jW_rT_1Y%+5kp__zU5Ss@nr=tH6 zn{<4XL#J2S4zQ=%pg&G|Il9nl6yH#2%dM*h4R_FJC;FT#7UTKo%2TIJ+#d%A;9KbH zbC0Gj=URe1mHPxXS7GjJI6@)xx{l!gE&bW%D+oSQzCeR}sAxw=%dGKz$h)kAgQkne zJ{;p}`z(Ui_VZJH%AAU z_cW}^U5tw2+&@z;LW5RN*O!p*znj+#>aNgkC(b5Q9%glW&_yB_#)qy?kq;rSfVvh@ zZfNCDEmwE*pB1Up^%ae4Q!ZmpzQOsO$opYQI@Fbd%!B3TH5S`1keZ_($gQh0x_Ip0 zq+FZwF0=22+}8d6XGNRw6)Ha@vT)>%l!wDVY{D7hb_e<75&&azlzMVQ=z1{z~2H1dHmiq|0 zHaPrEbzG%s_Y}OJy0PfX&|x=pk0ZB6znXF{^t=Z+*J>A@5zey>p$di_xp!DaU&?n; zE(mk3bR6hfi0%@1CFGVkY)&~EePg&CKFR$h9R{eYi0(G-oa=T9=eWCCAfdcgc%240 z*BGML^{NZcYvy1kHuI=c96k8QPPh(v8a}3Ca{}EqRdRg|&tkuk`vq)%GauWi8;UNO z`ls~YHXA_U73)w9532)oA5h*+`FV_|Ar~?S5fIZYTrfw`1Kj`l^+-Z(wSk#O1#_+)*kn`w z%@v)0cEWBXx+jqCp%Y!pa`}G-AG!u&Q(pz`|Ccb>kMV5o1{QH&44>j&!~HY5oitd2 z-DK>$aQ}q-t=aaW-AF5^Q|`|FG4*A*KjLoAt?M>yHc?Kc{#VM$=tAFEbXQR%QrVG8 zU9-3|xL@M#YtDU?b^S`4q1JAn*-M{Hu~vMrN|fIUD!N9{U`Z& zsmWuG{)ORr0vLqR2i(6oN{+rE@|JGm}kxs{^1NQ*)ok968%3Em9 z74lTIiskS=G!-ydOSvf2^*(nO9PLK;0elR(20TL$x+m>sK`AQk;7+vB>ljQ#E`fZRax)z2H>=_>+S*m3 zT|IPnSjX?d+iAm>hx7Y(BkI4Ud=~q+vFl6SD0mEgXf}?wBCJRGusLXLj$cF-Z`cHK;05Su2He}#LjZFkB!7vI{>b;YUUm?=c#H*<9oW97Oy zzs&+^NTVky56$rc%OdB&c9?bC1o;MbYpBzwsE2YDkO#KMrV;)0Mead42~I~Jum6P0 z=Lou*pqPS_Nw5`iVH%91Ue`buo|@D*p*)d$74rO z5oAB|81By~r_fH{r~iVw>S42i@)+*zbgb)p?upo+=dMBh@w`5%Z(XOX=(W!83Udxg zwB<3+x%4@`2Kiwa3uj_o!CJhB+>`G1LViW{@WX}Y7`Lt}bi3Q^ex~e2zlZxIb)TC) zfp)siQLn2u`cNuHe^|vNtLP2SpwB=*&$abTqx=_l5_M&%+iY!qr~E6rx@Ol6-bIj~ z!qR3l-S{55*DPOAv>U8<(N9r4KqOO9T*FYm#WY8LlKU|nf5Ux&vaTW2KSg<#$rCt)tK_#@LuF4P|aV#CWSjh-AvhWcSmlar^7nr^6;=Z7)-@* zS{=stZOY$K*O~G%%6@Eft{WDNxP&NSdBSx+Z)AEJwdRdCdm^1olT(LZF$BedI$t*-Uh?x#*yWpp1? zPQqvI>mAMiV$)Qk!AH3|xDDeG+<8s+0Oe22_PpszsUF9F(m^viZws@Ko1%Y=yBXzP z=!;^X26eSUr>h|K<2C=O=Bx`mVwHR0dhRrgbZvwBNln)#I{67cf&G_`hP6U{L&^tf z^CS8Q?)xck#Wt2(*I@#96y0woH-Y-^%yPB7w0SM(Tl5SVua^WcB8T$a$#D(#+`>o6_IsO?YWzO%;Ju~K9A|UV-w4*YZ>i}q5lFN!0rV# z;#$GofHwTei*t=e|CdTi+rP{x2#1=}+hHA?-pBnWcLD4+r~%hE)V+_c2&_e$r=5{7 z-{#!4B8$jxV5jR*vr##PHow5%VWW{G1H6ild#Jkso1y!V_T#yqrmi$?tHFoEY}veyVR4LpRIglxjf*jyfV=`H z>#-?j`Y7ZVaG>iQ%5mubMR^7GKT%#y-4EO+(A@#g(sn%MSFp{wCQ{y`{y#EJ42^YI z&!NHHuqWb=lyzOk_-&k2Va^Z2~sSgvLTIzQ2r8r3{PS+!8+ZA?pbsPx!*_kTCTQ}sngZdY(oU+<1UGQ zJAOM@eJ9!^Q(lKI^a;jaTLU$2L<3ztFsep5A4a+s!ZGF`4Shd!esl@g)ucRu@+*{Q z#0T>q>+ZX}f@1*J;iF1e^}B0NUa}*HrFzDKA1_-Ha4nYb+^4z2X|o9X z5tJD}3Jk8o;jp9>T|?uurc>TIDZqPT9o^lab>uYy9Q34#Wow8MbuYA_M`tEovu64 z?PU=2UC|Sd-CX2zRxfoHcQkfI(7hkV_#Z>ax$0oN4B^ong>f~VY*An|nvKoMTy0un z^R~$u*y%cn-ED9syq9*ZxZmcEMfVxHoNGnSuLBopcnHUBFnSQ?T*=5kaO+yi-Gy=@ z4(6Ma7il-hsb!H`yEDj7=IW$4`eGK~y}1HcvruOg4_VX^l=qsm2IxM<$yit(T@yMk zYIO^81t?X3c3ZKnhfNjpbqP+Q?hn|?>@OiVLcW1K3)=&F{*R?`&ef9gy(T<}fvzMR z-@$!=x{l_k4^AGTejIlIo2QVsbL%>Z?sm#Wt^GB0JCLv7qb?kWpWo5#q`tP^|H`4* zO2tN$QIvIE$5_|XE+xwUuw`7NK8$R4W#(uV^dNyHclPpt(UR<`>GjfKQ_+tPOIn5c=&q5j5*V~Wn`Q# zlXYy`jlB7L#s=aeQ!)SCRA#4VEm(BOTP`WyKRq@v+E*vi*F^saM)A+g!MAyD%Zgh(+FP%OOg%j! zV^e)S8C1O#Us7@~i7_%Wx6~;ayC1J!Ju#RX8x=dri6F(7LNC6E>28l2Sk|YHzu_$& z>qhA5k*ImdELG84HsjeP`Fr~U3CxWzw-3#NKQbXUkp+gh63$$?3M z*z|zU@9WyFn~XGfe+%R9K{`IdiHzk#qyI%$P5!YfjpCnr$mqIsSSZ1rS6@URJ~&nR zx#i+-nR5p=H71bgbF$(~NsCBe4xRO;$+#8pf4F4gBCVA_(dSP~4Qk3J(G`;)WP$q} zzocdQf4I$hWa)Q#LVruEZ+bAzH#L|Rue8UpFPMxJADE=z12$u- z@!j0aIm(<(7m7^D8Q!fXHp&0*(WD0dr%p54JyZCOf0zzuM=13F>PQRF9}!UYBYpl9 zXT-^YB+f2pD>%zkhs6IViT~GLI{i<3`7g^cYw}aay@M0|34#CjjQ+#?W&{tGtL%7n zPtV+AkUFE$GZm};UsIcL=;^juDNjF>r?gHkUkq7{2(S$zSwk6xp52(W=GnKy3UHp0 z#dcZ#)jjeS2&ATR1g2y?vF=B2#`yJRi;WB>M-I}F;A;`yCTr^YUiqs1{Z#k#anJd5 ze{!sjv8-*cgoPDjQ}S5xPYNV(^kr?`_;cQ3Y4NGCN$~++x0qn;q^##(+nguV&Nobl zKL6uHicL_hHYDe2AU!rPHQcRsR0;m+zR1`VozXBVDqs&XXaBLFStP6r_E)kmiPN4Z zr`8R}e{5o8YSQ?`t&D<55QAG289 zI>=Q!oFggY%`JD|J}@bzhHqqmLyqm7SdRxCJ-Gq!IF0bY*kgW1s8|2FTPn5Gxsfv&HP4eH2-8qdC zQ}nK&b1E@_i}ctOj>=$IT5`sW-`fw>ahJ@Y$N$urjT7TfN^-a4&6dfzI#yi%loXy? zj?byFsWH49OxKf>wUUq$?#rk)vswuYDaOykh9#YOva7dFbkn4?_;*W3O8R8s0=(@O1$gFqw&Izln zCEL!I6cbDgbi8Mf(60Htb)7T+o*sILw`*~4M$dO=R3d)fEENCEg)!A1n;IS-p0(@U zx_L^v>)zSu?1UMCjJ}7fwD-B|-$`{!z&-S*#zvAtdlWnN;hv%HGr{k>by{Q{fB#}w zH}~P=>>t;4Y78%Dn&zvT3!K@tzAK<@eGgJ>kM(+$NCkHpRJ@tC$ zN~uAI8g1^g$w|ICO(E}7(qdUeH)C<))8RyHdJ|>6CEk3x$#ZxaU!4@^z029(vagep zHTa7`-mH0Fz7|%5x6GV(oUB%-w&%;(aHgg+%5;A`TfkWj>Rd07I!_w=BGO`cZ2NtK(*m5OLwO%(h-oSMrxIGvj=@{WuIG#7 z^^ko!H8I@R!S9Pn4n%dV7n7Qr)UIjMKw|jR*tpnGQXn$cA0AAOZYr^<<9q_Ic(|?S zOZ6v52U0uMn-CH2PmHT~XLxu*ki^9%Mg?`UvAvV0yS6F5y2;KLgSLT(c_P&s1ZO+@ zpQA567#%yQv5)2IS50z&GmpW9Zid*{H%V{d5y5GC%SgyMtS9NP=2Uj3A;)p`N*z(JwVgdKn-CdqpJ%7F3+opMwX04hu zYw2s=rrjNFn>4$ zK9?2zEy`QZJ{ei&Y3x0}KbfO(G82)&$q}14gAL3y1rjq3UyCSLudkkiesaMIjlm!( zEipB-=}d22goOp1w(iy#zM9tVB^Gj-;CUUED{``Cvm;jiE8?VP{% zuv>8l(*wyfVkgC<`qFvp&J}z1j{M$H-ps-Uz324FnSHUKcWa*8)7`lAOys#ANLI_( zL=G~Z|4Ba9d4fNVxcMI@h>AY*U=eTS&e&_erp3n+*+02SjZI}Vx0<0K;$1Tt1=oE`0b98a9J~}f~i+h9F2a9_b=PN;wGqi_oLb8XK_5R^4J1oe@ z@Xaqz4ZBWcHlLmgy@raJQ6?q_*$spA{i35rMS(}*oWqEJ2hPO5? zC!!L}>A-LzgKT$w(%wu&cy_)DUT;{%E_~moYs&nI&WCEiGn78!0`dA#EtBc1rDDomY`}TJMS$V z06GLT4RWMU+qmS|$t2NPZ!8Mu6SqmOVTF6F-_ZY$9cydc%0RB(Z8e26x0xST^7=!= zrYG?d!=lw3y6G?*ADdN!%GFv+K4*OXcuqsAZ+7GC$D32nJVXc5^?AztMe)nbKX=sG z*_-rq(+$sV`!;4i{waWz)HGh$ed>QkEdN?xF>hIKe0I~y-lRM>8U~+h;%?4Fl=g{s zC)4*&Gox1__nSE9bjj@{jfI_ile>F7XIyTVA^i@f#li!DLz6Y~kNxOG<>=FkZz^Y} zhGVNj^On2QoKXKQ^xRY8>=O432$W9dW5iirjw5ZT%%3NCE5|z7l8)!pRJK*58>Q2h z5N~d>|J+Z1AK=aLY1uP8O~T(?X8Ol?E0o9;pJK>fUd{WB*WGXQ#_$ugO(SCi@{tq7 zf9w=DKRFA-*?k&9y%Bt8I7ckMV&tB&9M_h#o6ij1b2M3Z{nsoL%YP)=Im?_c2>bDk z!Ln{F(VQwZYItwY&hmM;U;O(EyBUZvmstPCc9x1Z}G6q(oMbp_Pw0lsHt~bKIhj$=NY3B5se-| z9ET&EFJ|7|vyb2Itr3=Q1hw(mS6g{!&}uU zV(nt?be?h?|9p`JlB4zYq?{<>H}`b7)8eM+i^G7gGM%xds(Z`csaMp1zL{ea{f&M8 zs2E-~101GtIqA*$fF@9m625r!>Zp%s!U@lu-r3ue0oxLM#_724R{d^quNM>Zok3dc>l^Uw zm=U#eKeGdTbY?vENA=1n(&c_Pp=8pxK8NsCY7k0TNj+18l@hIwmcpY82^EG+Y}e%=b1 z{O4%TWDo1_T@u!~>&-Db8`!?Xd9!Tb>0*bW{CCl@oqcYAcYaud5o~_mFykZtzrM#a z69;>jW_~f)Td*t(ES*TB1Ce^>`NPw~Bf_(<4fg(#C#0Xn9JTutQNFmCnkykw+lUhUbazW4~teG*}l$e&P{Gjn!jZ@J8i zG2Uj`KgD=I2rK6P9>8nkFwXSst#RIe<;(0c#ap4-BtF90Yp#^P$Uyy+2070&4rP`= zKrbhHOVPIGh|EryLch*haDN_fQlq)f^{($8ol1cFR=`gM!L+H`X`1Q3{am0=F&^7& zf}F!O_s<5mK11A}4w~3c2cdud?cjg)(}6EMoDV@(pZnv1HvND7`9M3#nK_%@kQ409 zUla5ku%8nWG$9(LenxP@ZS2eSI|6^GL|x8r2~F%vUlXnup1*gJlaO4?xQYF=(7Um_ zn8@g@$JpO`ZF1|!g(iBv&`6!fr?a@2EI->gF+7|9a8=2$Mz>BR*0uej;8@@Mec{&E z+16BV`LGh6{sCSOgFNcv`D#ea+?4Je#5+PJ?+Deiucv!=gq0u3yA`j7ns&XIC;FX3 zuv6xM8QxjhEoXQ;>zU?VXv(dp(W+A`eH7gdR^eOcvtt6iV#z zybD#S$FpXF$CDn{Vls@w0&jd39#6nzPV&i7D@%)suz-~pH_Monun6@vEI$Y}fuVQ~y|@6IPw{xR z;vF2s_@22_J)Zvf9tUIJX;k1<9E`NwESdP;JyDX@%PI?x=u6t$s9)B0n8}6_^xvq5>bllz0re{GJP_o44I8w|x`_ zlAns2cr+%!Wf*{~P!rlPi~Y||Vh06z@dpgTe=s+une7HHgSp7J#QYd#<;zhE*oPYE zYs-Ico;5F{CU66NmkPD8f4wAh7YEGocp76CEP#D5BhEE9V;K1(md`iW4O9g+fySr_ zv_|bzC)Bm?jT(3~YUQ7rldv9n?+g;!iu0&I*HBx07xmo#jS7@to;%TusCGqBJ69V0 zu_dO$cBqN;Ma7Lky$432`pra5Fxu7YS!ETUn_pOi{iul?N3GzD)&FE(MGbTdwX*wG z{>aK-SpGd`pgv%}8!sEGUp}8)|Dsk=3X@S$88y=em>OGPD(s1xNEE7mq&W_?qG_mh z(Wr@Uu=4Gw_WR7QQ4=_U$@Ki6C7~5uvj(@V!2{G?{158Q_8zs>nR$!I9H_u~P%A8g z8n`BEfJT@CTcRcwYUPorcB9a%YdC>~23mvKfo-V3`%yRNH|8buI3CYmsC(jJw5w;K z8!(-j9W{acsGSK$#Ve1BUmY`HlZ8D0T1jsTv;zaoA*dOSKy@64zAd(VG-_qbQT?}| z2Ha`odoelrZ&Cd&pyFLO|G;4KPZqNO>X?JiKsCsRDX|!8%d4X5JE8)Gq9!!Zj6&_) zSk&D<4HahrYK6;D6WomraX&Uf|HU3p8*J_+(Tl_;T!n!#9#41Nf~%EZ!s`;ZVh#KU zcVVfe?u725cJ8tH95unWsDTqKbL$hM-X|$A4dyq!6-a2S8e?kghzd9mb*&;%EApDt z%=zXrb3JO{ZK$2vjf!^!75^vHO?U${;}c}(yq=`X-I--TUDINy098-{>s!7#W+C6n z9FCgUe5+rEY>sE6<*Tl6FG&MboK~ny)d{r|eK1U)|6UT^Dfk^bVBM7-PkUU0>hKyB zAb{(mElrLZI1TFF$coyj+^7{7NA;_LnXn0J<-JkuN1)n&iYfH`&m^JG@nxuiR-y*j zXzoB=vp7`8Q>cktM(x-&)Q*bvl&hM`vjO(CIy=b{3| zpaQHzJ?CGdI(&z^mY2=nQSG0iCh`FlFZmjGr5R9hvZLyQQ4^|+DzCqW{nyIcQ=p0g zsDVacO`L|=@ic1SKT#8XiE955(_`RTcV}{;E!YrDJ2S$Zy4LFsxY`PK zpZMx>p^bb`3_pW^Z+vo;J zZRSNyq#SA@)lmT(p#rqC{21%YKtnJG&P3fbTd*4*#RQmpvpaBp^ld3>t7}=l5o)K};Q;K7xP9t81k9N zvzYNc3rT3DMLu^sl*QiU*I^hY+2Vdzi$Dd4!-43x)%}c!!2IM>ZsVbE@@Jn}RK0#fA$(CP&iOH||Qty8fpIgCh%u4<%RQXlZ&2ksDrH{<_sJl2> ztUEvs%tJoE#V2@_&>EAL|tj%EMVa1;fJaDr9LK)s=&Q3I_?QS=284M&})oh4bU|ZD0BE2Lu@Ceill~09JP!o%>@-?XU!DiHi z_L$$J+FeBrblb`wp?1)-$2HK*fEqZL>CI0<9gCnQQVs*K8fv9=%$Asjd^c3PNYntM zkq=JKWK^8od))~ZLoK8_ro|SP4@0#Zj_FvhX95WYjKQL~+O6>XfSSN9)XE>B27HHl zQznXYe>BUDz6oPz%IjbRu0uV>Y4*808)B9>t6@?-|8+@dWi3!QTQAgmAl&lPPy;ML zU7{tZ39mLcTm4S-qkIpl-9A*jBdGQ#QCt6$m0!YyjPJQgLM!}31^65_;5*Cv?RU$Q zpaP{r-2<6WTU^-6E1~+=vV23-P23U{uLo)ZeNmTW5PEZx7*9eISc~a#C+5R%QFrTK zm=O~la0kwb>KB5(okMMPFI4-9mCNSXBG3PzyY6`SYm$R}ZoOx@I>h&|`EP z74R=qpy#NY?hR_I1HN*%Gy`hD{HQ?1Py>}lwXcNgU)RbTp>F1uR^AOYpcB}syHGzwm1%F39MxMj&gp;8bkiqgfQSA$%;#9QyCRX1THDPae61qwH zpgN2|t!x_R#d((BgIeiVs2w_nTHzVt8+WHNpa#ri`NF8JEr;q?2Q}g5s2%EvT4+y9 zuIE3BgaS-JU5e?bfmfndv>p{;D=NSq)XEQ|1~`V}@ki9a&5ybh?TQ)54?@MAgqd&& zD&809d;SlSP{*UF0nTAoyoy!vIcmVt$6PCzRZ$bHg<3!()U|GjT0j_T0s~M_*#uPk z7^`26UUl4P72C|+*5DB8W;}|zN6w-qcmvh%K5Al*&1a|`d5xNY|8ci{QdIl2sQN6H z&v%^tS3yy0SPs>(y5;Ly!)B;xF`=dP%So?- z?)H^){l6ih8J$BtcE6yu{sroloZ^Igi3+0HmBvI^6}4k^F)_A7O|U!aQih=h9*WwL z38?|hPLqXzDW8ej-&%g3T#G!v|T5oRO561DOJsP-pN z175KF4b%c2pxV7W$@8xP0#3ODB}WaA-pq;$kjo6lB;+eteJxb~23Fq!b?v*L7Bn1n zNj|aq3D}eT98|x5PqF_R@C^mpBF||zp9D2szFsDODeDHcXu!!oFqR6zBwXZhx+ zc3sVWRv(3dlz)QS!RcNSdfr!H6WoQm`97dllHmt;1;sItd}+*%)lpAJSJbs0jM|y; z=1kPW7NHif9QD|)M@@K>m3w!S&`b`Y9;36UExU_a@t>#;Pf&OB2TX>^&$tuHf|_W4 z)El!Js$Uz_XGUjCjssCUG}@eq#PND&k;q5IQk;)RP&04wqkH$a!)D~eF*zQ_V)z3V zz_+NK$#d2npg3v*Y_R}Ky_$t z^&L?C!cY_HkD9VcdE4KLv>s6sW^xOo=y99iE`R?Y_Yv zOn<>`R~FT;8fqt+TE3Iz`=jEGKuvTUYJ!td@mHW0yzPQL|NAKLZ7HUu;xy{!xq+$i zZ`3vXh$ArXMgEo)SD@Z}w=ft#pe9`OXZIHp^-!NF15l6cR8;*&EC1R{LU-{s3_<@( z?%iD$(~u8C)sMu&xCS$DZBAo4^0%+Jzi@box~Vc>b$?=-gxaC4s4YK$THrURo%s=U z>AaUoXe(}`w)_!l<*zV3Cj7lt)LSsa1Yca>2Hoj?aUn1%J!qK@ln(Q&ZFYoM=jtz z>ZT05rg&Wc)Fd=;X4DoIL}uoRMs?hb>Tn1Z;HY^HHSl%Rz)5~{cP0&LqB&9R3s`v> z%t^i`YGOT9uIGOw39WdtxdgR!TTy}cqPF^o)t^R9=(>3q^O?uPqm+7Y0O$1S(l@~+>D257L#`0BAGp~)BKt~M1-l%?4QI~8ss@)RQ zfICoe4x-ABq1s(V)!+4!&^7u8wG(em|6A_XB}WCwj_QyPHGz_-fvckW*S369RGijU z-UYRwKB#`-sD7hS6Y`F;ip3a2!8%lfW9CWJjL)Jv{DPXu6Z1W40!eSX1E)jPXGec5 zjH)k=+WHEp1=U0DF|VhYRrJHcRE)6vI@E{6F4PLXLEp`UzMBaZ@Rs@5d~XKcaqBaq z7El27-YAKB+-v*tT>n-i6etX}MMF_5@LKsSa~bxa{4<=7fp^_ND^dNoVJSR-{tjP0jebrUYb0=U(@fV!#PVq#4A#(ip1qCffcsCy_2=Enk<5SyYV z(gqc`o7XA^Tfqp_%BG?2(#2N35fyl^)gMF+e9}CRdTf8i40sDu;wwyqiQl>tN`)%V zj(THygGp$h>R29|VL_aR+PW`LE4_tU(L>Y(U!(dZdgqpBz(DeOP!lPRns6D^1S(=v ztcluz`N#sip5-JoqYbE=X*a6FJyf7as0lo?{72N*1-y4Zq%xoeDuHTW1~suts1-Iu zZG9Ij?}e$!4@KYS|6~&CINMjilYrXV<*1GuP%GbxTKPUqi{F{Qpl_n6_Rq|>R`2)0 zjh6wn@|>u4g)q6E{}Lp$bydxVW?NL?9;gm|Q9BWVn&4=2B5DU_q1w+!O)v(vlUq^! zV^Iq^VEOOStF8Z$gdU6Qs6fxG!E4l3c|N)Wr$G&z-SYWSTO5K~S#7f^YM}P035B8J z4nQqnu$7Pb$n{sp@f0ZVOss(mu^L{&R+z!#_#V&xScm)(RJ#Dj@jYJkupaqv)PQ@j zBp$+A_!tXeDL==uK zLCnnyKNmK_qBsckVq1oKC4YyRu|a_2TWC+zjtumY(6t|en)xTF7tutlgjY}v(RuRaPC)hZ&ai^{s2x~p6`N24Z$}OIrFq!u zPoV<-gnCn6MNQxl>M40|^?`{T-!)H*8ZZZ{Up}Or*Aq-a*S->J%WI=;f>A53iJC}L)QUn;6X=7A6M>2|*2<@#c5sfl67>e%hQ8nbeMLeu`_?K> zp*sAEdGG;hWhnyP73DxptORNT^)25NHPPOvOELzvLzA!t&c$YU3pL@8WRBM}iA05D zj%OGiMs+Bi+-*<|wUTV~|Hdqy+VTBWPA^pd z^{7wV%U%*{m@19?#;SvQfsDlbxDhMk4>%T+q;+2;Q?NhzH8>Ch(>b1}I1*Rk!1V6T z8<@e3R}i(JHmIkk6Y3Iqdyvo;4X}bwticq^&o&oh4%)58e0Ui1;$76um?WbcFdORT z%7=Q)%3^kGfqF4Tpl;G>$V9xJMI?01SD>!RX4Fh~qAtlE%O5~L@?WFwg=3cg3ALh& z=(}mH`~m7F{TmfGAd`C!BuA}0qfef{Agd^Z>8U7%x{Dj2R@T)VV)c`(ewmf;MD5^F z)Wj~LcHlPZCVXn;@390c2+Zuh4=QKnsnYY`oP;`bM}2o2q6(abS#b$!Lc38PA}7r| z=6f?^Hh0TIP+Q#C?0{v-_eM=m5r~$mFfKyQe%(3zqb2VxLn^8~CcGT7$M%}bmusJ?O?NIH4?&BS4PQ!8f z{9i>vGtODaz2=os6KIT@Kx@>s?S#7ay-^byg=#keHIW(E7U!XM^bf252i5*HYJz@+ zU9({}J^y7%C{Qa5!cM4wV^J%cfSO1&Y9h-}6WNFgywA$NLEUsepyFLIZ(99*RQso> z54Csb`~3G5aVrv|21<>ZKqge699Etm6(AV(-Y9GN##Z0P?2Ouho~V0f5Gu}SRR0N9 zKC=kVzh<(;8murkpjNsKwF7aejwetn{0SBCH!J@gHStHN$M!jD0Rctbc7dq+w5a}B zP#;S9i}L*IL#8$bnsEbE;8v&=c0vt21QlR3YJl;m$8WxsZ$!1*hJ|qts@+Z04m?4{ zeUG}=0)pLpAh(x9GKXK8pgJ@t=Gp<(p&x2uLo7cAwKEefKL^!sG3u`0gj)GG=J)0q zRGbUw+c{Jm@9!iu^CzgA>NRRdk`=dm0d)y7p?0JYY748O0yRPfZiP*;iY~Hlyp27FnKA*_sgqW*htTRh0>1aD=H?Vwxm`WcYvm5Yt)Q8qV9p7R^A`= z!WxYFW)qFN1lv%r?C-7o5~|;0)Mvp9R6PH(sOLYq5}3ivX%@*dp}9&8QV`K@GSYwbO@CH}kg@dH%Jfzfz!yJVFI{ zin@jYmE0{%hq|_T(RcS_ck+!;FR*Q>_PbC696=3u0(DQFLoMuA)WCnD+JE#~B1L7l zL3Y$ND}q{aB~-xXsFij=1?Y}yHypL4Q>=U$>Z{u>)Bqi5ln&)I`2P1wMtkXReyhQI{rlRkwd(RK6PK#P+CrWF)S}MaYhL zJ!Pu7TU85lQPBwXZXSf1z)aMHR-*>qjhe_Y)C=VY%m0honYWftUETeGB@1c-6;Say zSot9AqUV1W3GKiGRN!Z*&*}G8p0S3zGr3ULG#GU$%2;`2)IC!l)xV?J(;SG}*kRo>J!&;^SLpId^IeD-LVADz=C)XbqVgG`oBT- z&sf`?a0n{j47*{!+V=T>k^)`hGpHT7jhgA-sGILO>e>g?aXgbT9qL|Lh6;2D!!cW3 z$MXfwL_Ka*>bbvuYlJ-N)h)1??%Q+raT`!PQt88#Z)2)o~b( zz`eK{i#2jQ{qRSuhvgf)A4cPFI{AyJ@~%zX?}VGM3;Flh5<4|@f1kL+OQJpn53v!J zY34qk<8d+hO&Eh!n!CRr_!)IA6Sr_5uQaF~D}uU&Wl=j;)AB7**Sag}(ng>@3&x{% z+&hPa9*gzXAPzOaNi2XDPm{S94X=E4%}0B3)7UP(Reb zLs0!Epe8)ar(_xt}nB=o}g78Uq6)I>g_9;;;S9M5nZgStfjqON_)_U_6u zpk7otQCpnPERNcd3YZUTSa}~*{~_&p{?%Y41=^x<=5*ASEJpu?{IBM1^G{T~C+&IuHS<>#Xp26ezF4H};5Nu_7DG+2EUH~K)WFSA zpZ{%8TiyW+;sDeH7NXvG>rgvz2y^0X)TQ(Dc62*t$2=4iM_r0msJnjv>K#4@b?vuU z`AN$^#Qc;8c5(+QiMoj!V;>B~C3q4GVUN!4Ju(ZmaPMvs+KK~Ka1^!0C#?Ku)JlIt zZSif?7C%I-@TujUE^ffYs7satwPUGK{j#9qgzTi(Q;vl0#`>s8Od$Lk+YNbqO}1J{|X=w)zt4lD$A(ibP#qbD{5l|5u5Gwz>uCxsO5x z9)}7%8?}PPs5j*rb2s{S3blZrQP2DDr~#i?xzo*ESZdVMl^GSU68irAUmX(a*ci1% z?NouCQ9IJp@&ha%i3%_pwbheQJ2n;H;A}jI)4IEV`&B#CUC1<4-1+7b^!@vv)g<&S zcoS-c`%x=DgWCE_sI7g7TJZ0B&w;wOB~TNpirVtpmhXyMP%qR12KM0j zSD@h(XyxNk6PSVRt8Lrr8iY9U9l5T3^R_#8D} z)m~mVQLC4`HT6+}npwUbY6rSnKFacAP%EB~YQNs#NFn8-xn;B6ZvZDqnj2fUM>RMJt?LaNdH$}B?gNoO~$_H3J((+?a?Yt96 zXe;JggN3MpR-y*jXyw~1zX!Fohfotag_^)cRKFWm{s$`VKd3k_P%pCgR-d`IFYoo_ zA)%R8!-7~J6=(?RUKnNh*{DE^P>b;Puk84?s z()a(?By_i)M6Kwoc@?#?JLV(vHEJUMecgcr&2*?0XGg`$jrzDPhRuTXK0q57Rd?dS!||AAi3 z=m`nU{0*w(M^wXres0IisIO$XQ2{HVZl0Q`OVP~ij(S>#Sp8Jgn{^>->*G)#azCRk z(d&LZ|C&Hxe|LrHQCk*-nsITnJnCB3Kt1=(P&?2Y)jtyTF+3JEfpMq-7NZvS8EWF& zQ8(dkRQz-OdHxmnDh1lgKdj<0YJgX$!2Sc=i6ur2m=P5q7ph%h%a^tKYN&V(Q1M$> zc{eNXhq|Ogyd*Tkv8XK_j|w~o^?4tITFGA2KqpY`E}{b5viw8TrFe~+VA6qZoOGy5 zn%&HUnph#!PJ2U0C{T6O7Bxampe5?X)Cu*b8i49J5jEkNRzD9%kza%Amt~MUU>;Py zkmXCF`jL&dP74H&u z!rQ0?R1J6Ujkc(M12LtZ|6wHZQ!p9zLfM82^c`vfH&6pVLCyRvDu7>vJK;do1XH2f zC|{1C_6ex&(F2CT8nlJpZ~`I#HmV=wl8?-3yaZ*K{>% z3%8&iuU)9X2T<4YC~9ICQ9JM(s@-i=+=r-F{99DJ4`w3oaCZW!Pyw@{0_H_M|79)T z1~rjBsEI_P1{jIzHv!de2Kw$H)Ii%&H{o8?O?nFTD!zic>Af#V_+Ahr+-sW$6{sxg zCajOT7rLVY4nnmbjtVpu6?hqHLZ6}9eTf?Qpm`Q`&)h-9e}y58?@2n+@hqjFGSM^;43jEaSKbXnKxtAszs$C(}3M-)Ev_jqWJy2WU z5B2H!De9hCgkH^br8U@!y5?V_9=j{3m8Ku>4v+&iKrz%-*GJuKp{Ri(QSC>eRy+X* z<3d!sfC=sdGN9T8Pq62|ECtypXn>`#H~MZW)cfHx)Qk_J0v$uG_#)~axQm*2iivLf z{HS;pP%CbWx`_v&c5<{ic_Le>FAVc2&|SUB+-81h?n8AvjCx<3M6LK|)Jm?QCiuIR z|BYI}GgMr^N$#~zjG9PZ)VLvD5?V<;RG@a&pgZdM9E57P5Y=uA`reqRYkUTEDXyWO zisz`uFzaOZn&(5^)D^KBc17*fDpY^(UJ|;d-=cmaaRU|L4QlKBr?@N4it3OXHDCy8 zB@Iy%YKK}te=8q~+M#i%otcW-iMdw32#MqMtRSH+-Gjd86V>on)Rx~uP2?eJ2NFzm z1ExjY)mc&PN|=>U3#f~V+uX`KqZZHyHPPX|JkOukD(0YOx)K#&BWeXZQ62W8R(u52 z?g#TCs@*lz0`8#Ny|;YQX>NU9)WV9OCLDsk-~U%8p$@Ig?$%%sYM_y*m5)OWG!M1q zF{qu{f?DY}s5j*qD}RFeG)*+!ZPx(xO74zYU=(__g`bkpK+&jymYZ8q&+$RjO?U=% z?eCx-!*{6u$!E9|%8kmGv3x_zcR}5Bk*NMNP!nH2gXh05i31dz#ym6KK#x%k{bsrU z6f-MkbeK76fRVG^3C%`5=j*XBevSH2`U_8Bk~xm=f7oyyyO8fa*Zp<>aqLAt+dQ8C zZY0LfV=M3$mc!8b?mrY-inGZlTi|$h<1*}r&7$4E8QqV|$oF69zPJJwaj!7Z3ivtY zH5a>=;32jqUo6J)bjOL<5$}3Q3?xx)iR1g;qAn_4JFJ9ZSQOV{W&F|V z12+;+H(h2D3Q*82j|xy<4X`b02f|QaE(f8uJ`%OnV^BMA8P)CZA^Lv**U>6M&AzBh5MlXYr~$^Jws?xwFSGm_b2qBp3Dk?~JZeH$Q4_vp;x=mF`>286peB^yGk2gsRNyR_4s)SCP0OOw^CGxD>s2YP=aq35*v7Pn#<>TZ32)iL8%cLnXSB>67b2=({QP2G;tc~}urk?*I+ueVi8jc!ZBj(2|=0~f~zr%gAbwRyy7odJZ3f}4N zKx5QacR)>`E9w%3quzwWQJ;pFQ0+49(oXXHWhbGT=J6HqkIzwCSrK*3YoI>8TA>0C zu=1g(t)Gm#Cl*-!a?~YSkGcszN5$KR8u*BnA4lJR|Kox+xQ7b#H)_BasCyvA7jB>| zs0kE84IF|BTou)?4(jG=YW2NPpQ1xhab}?6F1Gv*^!@yQfP`+slc>NKtieqye~1eF z0=1%Kd;)1ASup|TL0yUhSRU(Q9rWUQ{1zKyzgYJttG%cRUy0@U*N4U}3UmoRqVE1w zyWN5EpjJ>4ea}7WD^?fOV>SY{rL#~IpO2c@DpZ_JsD*|?-8}!gSzb|~ ztx3Gcy>>yUK>1ODilGA4u<}Nz3AZwPq1p|z`e~@0nTPsxTxj)Mu`v0=s0ID$wFYld zFN`#M-3bMwW?BUmxE*Q&{ZT88LcROPo4=uMx(acQ@4x+64fWabE9yPaX`j2G-l+cJ zs27lT42dsDOvhNPwBPZJ#K)+ctM36fKm=+6qfz(5B-DV*a1^dV?O2wBZok~9OH&B7 z6UD5&q~$AMJ3aqZNR*_(A}oa`%y(Fne2GKuKQifp<;c&$>i8Y%<2BJ&Zhb8*O+E@k z@N+DVznX!E-QNjS!uphV!sXhd4J7nts(!@%$0eO{4*Al}Do{z8uwlBWj1gMost{>Zy2roabK+Qhn<-D1v&f>!F_e z&ZvnEL+!vs)XZa0kIx3=3i*z6{5h4(Pn;>)|Mphy&x$s3rlDnjbkORz5}*t1Kc&t~T9Ye=V>#oGRP=p7eI?p0;Cx7a8TBbh zKjHkIbQ#LFaQdFni3Cs0vzCNTe~|u!^9YsgYy#KG&mg}<9qiD5wlAlW2TZzO>8uBUY>1>s$8F($}*PK(VqdI3L{|D_h zQ@;pXlRrz}+SFwso!lnOyU63ugjSOuOZg#U#L#9BZ9{Q9^~)&xMgRSsdlbYUpHWzq zM!KmI(C7>DI|%X%`Dv7AAZRnn^_fwgeEd<3vZS1CIajC-bu6cUMK|gD^Dcd6+a$00 z+Hn0lsv`|`ETgiv1x{pTr`#&vpA9XY-hy!d`HolQKc`=)>Tw62%w`c?V54cAw7%o51dbF z*O{_lo6JJ%7lx1NH<~u>sH=zGRBY*|WInS2pP3tJSeA4p8tM3!^aKmkoVqQX^{uVy zixNZcjKP$@A{~c1!f-bI@)G9}r@DMY*?bbg`u=r*L@i%azIxeUEzQdoL~qAM1o?$? z0>O0zTbqTn$xS|ym6xZyFzqU8Bs;E?E<*i6^6zNBoBVLnQ+WS)wvu^7hxj8s4IYq* zw81Zt9!8rA1ZYkABj;-ytUqmd0+D-n&`fpK<(Io5@|{jN<%2(43Urr0q+B@50O0 z|0U(Eso#S`Z4&x~`;)v5e%A3F%c;9YYHjorHsA~tuj;NzBL7Pzbf%LzWcR_~D-3&GScx!dODS$!$T`e#40mVR+;<`+BP9Q z3(MGG1<2Q=E(c|ONVg{DLe3+czi}4fJV4w0dj54(;oL;yI#lFSVDfn_*hid3c|#1~ zylmy_cT<0G?4z%~D^4dph_>-ZKiUqWya@Hntgr%UeR1umb{hYg0@LUo1?x!vf@8`5 z%tSKNcqVN!kq)G6FZtB8Nkf~KlsUdX zqU60f_~ZX~6sJLA0u12%ivXF)>!?cl0DV?-R^fcg$v13IH?^g1Bm?V<|179u1Bc*1 z%51Yed8qr6c)j)cum9sQ9p7@EwLzL$N0pZ(;A#c6V+;e;C)jM-#8Q5cbOkKUxrR2G zC{IJ#I$|}TtN>+oIR}$IPI)KJ!o)~S-Z!N<8vf4NnCvtvn^94SbUgxTt#% z5!5HA{A-)6%1_ZYG5OzUSC_hDw3$kN7U_%Br(lu&NKd03Kh^twGHOM6UcH_E_h>+X z78GP7z*YQ;4s$q%Sfl6Ge&7FgBK;5Tbv!3{B4T{W8AAGJ`kr^Ie19gSERf0cB=>?k z?@|gX(>aFo9-ZDYz;n`A9rCIos0i9_`*zUXnn|sT)qZ9cMbb zq%CRJioA~Ew0%JOSI*m6?|z&|+mEEr*g)|?a!`JX`uHOaF-j}09*NwVHD^lBE!JW` zj^=!CfhLnCuIF3Y@MEIqI^{oE-DoQQrtC3w=Q(@Pt~qY!j6a&hC$I`_3o)6;oZbs` zen3G&oM{0=sOYCk%5QP%80Y)b{bLwqJvn=D{%C_F#A4*P6Qc{U9@2Cx>Ucw0Q_|C^ zFU6US*e5t|=yw!@Y*4o;9SO9L%K9{H!P&$H*iSmt0;+8v%KxG7bL&5pKL1eOiFT!} zT}kT3Qr?)dG@Lqq=Ilk;2-gPCFFMU8|D_E)g0h)(cw%{~d_TQr z;TonU-JSAY^yy5%R-Ea{ZzP|d`UIQ}Nl&7G{P72gyq3wP-@kXK!F&c8N29+9@F(*7 zD9x(+pavrCA0OxrNKArSD(idps(Ek`|Kl*$mJ&E=iF#c#lIwz<1 znH6TI@lnpA23RUnc69OuKN}w8P4rdui9z+Npjfv0qbmjxzm< zCk^RrwCl}Ti@M?oeD^;;`BKq?2HVt&qYjln)2S-KCt!9ue9Kvg^DFXUHn9)ncXL*= zy!!rZ3(CmO#vetf|AbRTBdxw5`JM64|3`xAm|>OMuo(FXoNZ`WPcz3nsAD>VZXvw{ z{pdRu6Ih+w!u>NHajO46<+o`2pF_|8D;iwDO9WcSAm4F5vKFtgs7)>@p0Ej4r+g`a zPSJM;=>gO&w7M3QCnP`K20ljlQj3w!%C=eFdz;FiDJ)|JKhXIr^82jeVk_Uvq$W|8 znf4PI@FDG{a@M45C3V$FpSHH!NtdC`K-xx=jz2Q7|3_(C!V3QJ1Mu`e7q9xAn9G4qeyq4 z%|#o-nz--(_{>rg`3SgyAP$2}u|ZW|i?Y2qRT+*iG$=r$ss>;* z1N=*$=j2p&fsl-H7)q=@0b(kuw)@_Yh+)cDIR)ro5JZ@mQIP z;+)@6a2FpDv>u&%kk_#u|Dr7ZNNxe*^ARLwP*ziYt?m=b8j>DG-!lyQ$^Z2KiMk4$ z<0$w2`|r{;`j*Z*zTq6{OYzm2PWuURgfohBCg&JB>9}K)ON8?%3#P6SKgewoW1q@pCrIaG6gtakZzBQnamm+U>?0bCBMlg7#}1%`A=y3BL&Y$XJ7&a znQ(K?!lc(w_m;Zj#Cd`DDH}q&7Mv9*J3;;b{rr*5PUrkoru9`KjpL7tl)bS`AZ_ju zP{()po_>FkK1TaM^1qRQ1>aF8`D_7es5`=-dON*1UzFCR)>MUUhW_3X)}_#X=I1~Px*MtZgWPsF}$9q z43eG(wHQ2#^be%V*+B9Az9aFk4f=|9X~=J-?GDcPV;%L&sQZNALr8Zb#tZU)ViAki zhw{nRrvYwD!1F)CB1D>B(MiX6&N_6=$oYUX1)Yyz2kHxPRw6xwApIzRO51&uRcCM= zJuQZt<9h<_!YxxmJ3ycIlx_CXuo>qc)^P?w|Dj?a4dRb1md;9f{L#VMe{Kag=y#Sl zqio>yl&9shVFP_z(Dn}b$Mo+&yQZAaDNjLL*3V4Hlu`in9i(+kr@>*)44mg|@Y=Nb zoxF~}2|R+fjcqb2OUj@P$p1l`lo-lc%Gzh9PRC@+ll1!j8udpDo*I)WpfxCOfhUm< z<=jGj*Z4`2o=5sAZDL68qCTZBJZ)?Nmi62sA4}VooLOj}%VI3h@Bb!{NoF%UMW8=9 zZ&-tq1pS5%hsk#&T76tfuvD~(KUPuJoi=x^U@T^_`m2;5B1Q`O?4Ue9>4LO(IG58V zP|trV8ZDwCF9k!b<0{HaTfkAIlTp5hb_F?C(>Wujjz{DRkp7qSH?$c-K0EEdAzu7( zp8AfIeQmMxQ4vD@7wFwg;dDBEPC-Q)eMR8{(pN}FTaY%i`H42eEr0@FBOgP3tTJ|- zq5cMC^KEiJ;!e(1wAGQ;Olff%>HS~V8uxeG`2NgG*)|*e4rxEqb2#tQaWfM;k9jP} zZt^3{sNwm0RrjnzBCRv*2A!$9dCYAJYB5ivf~w{m0`F8XYI_5jt0-(Q6u4 z<<#+#^5eA8QH-)moTEsmqR&NZGsfz(QQnI7V~DYsvfpj8>Z_xeO&~n}_dosw$xXxi zRD@fQ2WD?N@1)Z@&M`JnUD`b)ec$rEXnTeF6qbKweJS!p5?el;0!&JMN@^C!63Q z`X$r#k3Z^@xX<||jU5`*w1(Bmzu`R0`750UayBBZqdbEgu=GjN{g_l98+eIgsF6L| zO2*N5B=s4oi}dyT@A#gSG~7<3i!`WbgYUN0uC+nJ3815si|;?HXGtGP=-bHp#Ftm3 z?+?V=!ui4CB&5xH&ZqkRr=yx?h2LA=SI8f~GvFJW%yK+IeSXS9IG>Q-X93@nKEv6P zHiPK*uTAt<>hD^cchn8%+(iDCP12i-#v>?PM`3je@6&N2=RnGGT9D7E8$i3QoW&UA zFm(s5E+2Uv0XUzsceK?p*Tr+4d@ss7kl%&LXjjeZw(0l(6Bx886=f_?YdTz|ECXda z29v&xQRELXa9i>LnANW9U!+&k=P_+ck?u*mxfp+hk+?(sNsAX>KFpW5>p#Ofq@eaF z6X{8Q6$3?LQ_dS!|2uVU={N}&S(yUPqHGBUb4ICv<8$hBa(-?LdqTWTZk6xP(eznV zfaD*(nedYh4d!y{IFB{3uhqql>HXeu3PczDm@{@y--S+W)&ZFVVxtCMOAs3xRXZSd z>!`B+u|q$t>=%7#T;hPB)?p)~V(*R{n<%>9wEEGfrd^EQF#SRFt{E9(|C({tiT-(3 z=IAQ37e(KkJuSM$-1)IH=Ut_DOiI7#tILYTMlKuaANyg|e!u8%*QSrYy|zJYnRO=; z#HQPH!->uP*`0vc0z1k&v7tLtInm>H6>*|skM64I7waF}!HMm=J7L1;Ne7xmCp@?- z_Tj;&31a*soD8x4UoT7?yZXcyC$`n8+)nJW(~taOcm7!1Kf2c^ze$0s-`LaoZ=&Ns*#14P^ zixWHOeTjg$Q-01(znIGb&fCllngo{p3#5pyn~lRoZcLdV~U zOOn_b&0&3p2Dgr=7?iYmv(~}2BEv$X=owr)G%Czj7Thvycs~WRqLL*- zN(GlF7hIxLP)JC{(xl6jD3P>r=umG|aO=p>@Sy`kqaq^d+Bh`4&#=%wVZp7#LI;s= z(x6G5|4uBVSc#;yBEqA>!s#|@Fk?k=g^Ld!7}_tqQc%ynp^-zwqN=oMT{pP=f7>a1 z@36?=I^jJddi4wMQ!%J~kA6`}n-3fo89LA#>|12Tpzy)I{Lm^TD+Rg9D&ax7ssx2p zO4>fSURZcoq&vgr5n;XhMFoWvD^sitHEuSzRm8B!o?*4z2~-Rk7S)>>{HL~2*r*W^ zk-dgC?l&~5Voeem1Pgqoxm-$x=DO$2pw{RD?n9^?H5fOu}>VMKbi*^g| zS+R7_qP|We)u1Qw;uGN`|5Fz}((UH9{qJmQh7JuI92(WPVoc&pNm>P|p;c=%MJL&x6oEA<}zqm@RoG%i_W$oxRb>aqfa>_U{v7Mcgi6eSMhJ{BA z3XAja;;i(G`@EYo&xzx|2k|~(OqagSu$aJp&e^z}{hf2fiEx6F#uXanB=n1`Fve-? z#2p{&v`G+GW1Q0>Am-o6PR6)wQ=AJ4;;PJWj;D-Uw9F|S5ckt+r=}B^WvvsKFec3^ zCtb|-%}&yol%F|CV*Oe{XS~I&sgoIS&)?Z%_Bdef5Qt#xG|1Zf9|v qcefK55cl1FCo(}?udkdGPNG_MntM27h8$+ZS%;ncOyr1j!udb&M=1CJ delta 32266 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 D7p*r4 diff --git a/languages/gravityforms-sv_SE.mo b/languages/gravityforms-sv_SE.mo old mode 100755 new mode 100644 diff --git a/languages/gravityforms.pot b/languages/gravityforms.pot old mode 100755 new mode 100644 index 25f08f7..b91a120 --- a/languages/gravityforms.pot +++ b/languages/gravityforms.pot @@ -7,2707 +7,2732 @@ msgid "" msgstr "" "Project-Id-Version: Gravity Forms\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-04-18 12:52-0500\n" -"PO-Revision-Date: 2012-04-18 12:52-0500\n" -"Last-Translator: Alex Cancado \n" +"POT-Creation-Date: 2013-06-19 16:45-0500\n" +"PO-Revision-Date: 2013-06-19 16:46-0500\n" +"Last-Translator: Dana Cobb \n" "Language-Team: Rocketgenius \n" +"Language: en_US\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-KeywordsList: _e;__\n" "X-Poedit-Basepath: .\n" -"X-Poedit-Language: English\n" -"X-Poedit-Country: UNITED STATES\n" +"X-Generator: Poedit 1.5.5\n" "X-Poedit-SearchPath-0: ..\n" -#: ../common.php:194 -msgid "Select image size" +#: ../common.php:209 ../common.php:251 ../common.php:645 +#: ../form_detail.php:2154 +msgid "Insert Merge Tag" msgstr "" -#: ../common.php:195 -msgid "Thumbnail" +#: ../common.php:255 ../common.php:423 ../js.php:885 +msgid "All Submitted Fields" msgstr "" -#: ../common.php:196 -msgid "Thumbnail - Left Aligned" +#: ../common.php:310 ../common.php:530 +msgid "Required form fields" msgstr "" -#: ../common.php:197 -msgid "Thumbnail - Centered" +#: ../common.php:322 ../common.php:534 +msgid "Optional form fields" msgstr "" -#: ../common.php:198 -msgid "Thumbnail - Right Aligned" +#: ../common.php:334 ../common.php:538 +msgid "Pricing form fields" msgstr "" -#: ../common.php:200 -#: ../form_detail.php:1046 -#: ../form_detail.php:1613 -#: ../form_detail.php:2026 -msgid "Medium" +#: ../common.php:338 ../common.php:492 +msgid "All Pricing Fields" msgstr "" -#: ../common.php:201 -msgid "Medium - Left Aligned" +#: ../common.php:352 ../common.php:542 ../common.php:4696 +#: ../form_detail.php:1267 ../form_detail.php:1269 +msgid "Other" msgstr "" -#: ../common.php:202 -msgid "Medium - Centered" +#: ../common.php:353 ../common.php:500 ../form_detail.php:2156 +msgid "Client IP Address" msgstr "" -#: ../common.php:203 -msgid "Medium - Right Aligned" +#: ../common.php:354 ../common.php:355 ../common.php:501 ../common.php:502 +#: ../common.php:2217 ../form_detail.php:655 ../form_detail.php:1500 +#: ../form_detail.php:2157 ../form_detail.php:2158 ../js.php:504 ../js.php:885 +msgid "Date" msgstr "" -#: ../common.php:205 -#: ../form_detail.php:1047 -#: ../form_detail.php:1613 -#: ../form_detail.php:2027 -msgid "Large" +#: ../common.php:356 ../common.php:503 ../form_detail.php:2159 +msgid "Embed Post/Page Id" msgstr "" -#: ../common.php:206 -msgid "Large - Left Aligned" +#: ../common.php:357 ../common.php:504 ../form_detail.php:2160 +msgid "Embed Post/Page Title" msgstr "" -#: ../common.php:207 -msgid "Large - Centered" +#: ../common.php:358 ../common.php:505 ../form_detail.php:2161 +msgid "Embed URL" msgstr "" -#: ../common.php:208 -msgid "Large - Right Aligned" +#: ../common.php:359 ../common.php:506 ../entry_detail.php:290 +#: ../export.php:666 ../select_columns.php:88 +msgid "Entry Id" msgstr "" -#: ../common.php:210 -msgid "Full Size" +#: ../common.php:360 ../common.php:507 +msgid "Entry URL" msgstr "" -#: ../common.php:211 -msgid "Full Size - Left Aligned" +#: ../common.php:361 ../common.php:508 +msgid "Form Id" msgstr "" -#: ../common.php:212 -msgid "Full Size - Centered" +#: ../common.php:362 ../common.php:509 ../form_list.php:187 ../js.php:885 +#: ../tooltips.php:29 ../includes/addon/class-gf-feed-addon.php:550 +msgid "Form Title" msgstr "" -#: ../common.php:213 -msgid "Full Size - Right Aligned" +#: ../common.php:363 ../common.php:511 ../form_detail.php:2163 +msgid "HTTP Referer URL" msgstr "" -#: ../common.php:231 -msgid "Insert Merge Tag" +#: ../common.php:364 ../common.php:510 ../form_detail.php:2162 +msgid "HTTP User Agent" msgstr "" -#: ../common.php:235 -#: ../js.php:905 -msgid "All Submitted Fields" +#: ../common.php:368 ../common.php:514 ../export.php:673 +msgid "Post Id" msgstr "" -#: ../common.php:290 -msgid "Required form fields" +#: ../common.php:369 ../common.php:515 +msgid "Post Edit URL" msgstr "" -#: ../common.php:302 -msgid "Optional form fields" +#: ../common.php:372 ../common.php:518 ../form_detail.php:2164 +msgid "User Display Name" msgstr "" -#: ../common.php:314 -msgid "Pricing form fields" +#: ../common.php:373 ../common.php:519 ../form_detail.php:2165 +msgid "User Email" msgstr "" -#: ../common.php:318 -msgid "All Pricing Fields" +#: ../common.php:374 ../common.php:520 ../form_detail.php:2166 +msgid "User Login" msgstr "" -#: ../common.php:332 -#: ../common.php:4136 -#: ../form_detail.php:1601 -#: ../form_detail.php:1603 -msgid "Other" +#: ../common.php:382 ../common.php:546 ../common.php:675 +#: ../form_detail.php:210 ../form_detail.php:1474 +msgid "Custom" msgstr "" -#: ../common.php:333 -#: ../form_detail.php:2468 -msgid "Client IP Address" +#: ../common.php:611 +msgid "Select image size" msgstr "" -#: ../common.php:334 -#: ../common.php:335 -#: ../common.php:1698 -#: ../form_detail.php:995 -#: ../form_detail.php:1834 -#: ../form_detail.php:2469 -#: ../form_detail.php:2470 -#: ../js.php:497 -#: ../js.php:905 -msgid "Date" +#: ../common.php:612 +msgid "Thumbnail" msgstr "" -#: ../common.php:336 -#: ../form_detail.php:2471 -msgid "Embed Post/Page Id" +#: ../common.php:613 +msgid "Thumbnail - Left Aligned" msgstr "" -#: ../common.php:337 -#: ../form_detail.php:2472 -msgid "Embed Post/Page Title" +#: ../common.php:614 +msgid "Thumbnail - Centered" msgstr "" -#: ../common.php:338 -#: ../form_detail.php:2473 -msgid "Embed URL" +#: ../common.php:615 +msgid "Thumbnail - Right Aligned" msgstr "" -#: ../common.php:339 -#: ../entry_detail.php:287 -#: ../export.php:514 -#: ../gravityforms.php:1449 -msgid "Entry Id" +#: ../common.php:617 ../form_detail.php:706 ../form_detail.php:1279 +#: ../form_detail.php:1691 +msgid "Medium" msgstr "" -#: ../common.php:340 -msgid "Entry URL" +#: ../common.php:618 +msgid "Medium - Left Aligned" msgstr "" -#: ../common.php:341 -msgid "Form Id" +#: ../common.php:619 +msgid "Medium - Centered" msgstr "" -#: ../common.php:342 -#: ../js.php:905 -msgid "Form Title" +#: ../common.php:620 +msgid "Medium - Right Aligned" msgstr "" -#: ../common.php:343 -#: ../form_detail.php:2474 -msgid "HTTP User Agent" +#: ../common.php:622 ../form_detail.php:707 ../form_detail.php:1279 +#: ../form_detail.php:1692 +msgid "Large" msgstr "" -#: ../common.php:346 -msgid "Post Id" +#: ../common.php:623 +msgid "Large - Left Aligned" msgstr "" -#: ../common.php:347 -msgid "Post Edit URL" +#: ../common.php:624 +msgid "Large - Centered" msgstr "" -#: ../common.php:350 -#: ../form_detail.php:2476 -msgid "User Display Name" +#: ../common.php:625 +msgid "Large - Right Aligned" msgstr "" -#: ../common.php:351 -#: ../form_detail.php:2477 -msgid "User Email" +#: ../common.php:627 +msgid "Full Size" msgstr "" -#: ../common.php:352 -#: ../form_detail.php:2478 -msgid "User Login" +#: ../common.php:628 +msgid "Full Size - Left Aligned" msgstr "" -#: ../common.php:360 -#: ../form_detail.php:614 -#: ../form_detail.php:1808 -msgid "Custom" +#: ../common.php:629 +msgid "Full Size - Centered" msgstr "" -#: ../common.php:908 -#: ../entry_detail.php:758 +#: ../common.php:630 +msgid "Full Size - Right Aligned" +msgstr "" + +#: ../common.php:646 +msgid "Allowable form fields" +msgstr "" + +#: ../common.php:1212 ../entry_detail.php:767 msgid "Order" msgstr "" -#: ../common.php:939 -#: ../common.php:1742 -#: ../entry_detail.php:833 -#: ../gravityforms.php:1004 -#: ../js.php:596 +#: ../common.php:1243 ../common.php:2261 ../entry_detail.php:842 +#: ../gravityforms.php:1143 ../js.php:603 msgid "Total" msgstr "" -#: ../common.php:956 -#: ../common.php:1734 -#: ../entry_detail.php:770 +#: ../common.php:1260 ../common.php:2253 ../entry_detail.php:779 msgid "Product" msgstr "" -#: ../common.php:957 -#: ../entry_detail.php:771 +#: ../common.php:1261 ../entry_detail.php:780 msgid "Qty" msgstr "" -#: ../common.php:958 -#: ../entry_detail.php:772 +#: ../common.php:1262 ../entry_detail.php:781 msgid "Unit Price" msgstr "" -#: ../common.php:959 -#: ../common.php:2339 -#: ../entry_detail.php:773 -#: ../form_detail.php:820 -#: ../form_detail.php:1580 -#: ../js.php:573 -#: ../js.php:632 +#: ../common.php:1263 ../common.php:2877 ../entry_detail.php:782 +#: ../form_detail.php:480 ../form_detail.php:1246 ../js.php:580 ../js.php:639 msgid "Price" msgstr "" -#: ../common.php:1011 +#: ../common.php:1315 msgid "Total:" msgstr "" -#: ../common.php:1415 +#: ../common.php:1848 +#, php-format +msgid "" +"Gravity Forms require WordPress %s or greater. You must upgrade WordPress in " +"order to use Gravity Forms" +msgstr "" + +#: ../common.php:1934 #, php-format msgid "%s ago" msgstr "" -#: ../common.php:1417 -#: ../common.php:1420 +#: ../common.php:1936 ../common.php:1939 #, php-format msgid "%1$s at %2$s" msgstr "" -#: ../common.php:1593 -#: ../common.php:1665 +#: ../common.php:2112 ../common.php:2184 #, php-format msgid "%d of %d items shown. Edit field to view all" msgstr "" -#: ../common.php:1674 +#: ../common.php:2193 msgid "Single Line Text" msgstr "" -#: ../common.php:1676 -#: ../form_detail.php:986 +#: ../common.php:2195 ../form_detail.php:646 msgid "Paragraph Text" msgstr "" -#: ../common.php:1678 -#: ../form_detail.php:794 -#: ../form_detail.php:811 -#: ../form_detail.php:845 -#: ../form_detail.php:859 -#: ../form_detail.php:874 -#: ../form_detail.php:987 -#: ../form_detail.php:1014 -#: ../form_detail.php:1203 +#: ../common.php:2197 ../form_detail.php:454 ../form_detail.php:471 +#: ../form_detail.php:505 ../form_detail.php:519 ../form_detail.php:534 +#: ../form_detail.php:647 ../form_detail.php:674 ../form_detail.php:868 msgid "Drop Down" msgstr "" -#: ../common.php:1680 -#: ../form_detail.php:988 -#: ../form_detail.php:1015 -#: ../form_detail.php:1206 +#: ../common.php:2199 ../form_detail.php:648 ../form_detail.php:675 +#: ../form_detail.php:871 msgid "Multi Select" msgstr "" -#: ../common.php:1682 -#: ../form_detail.php:873 -#: ../form_detail.php:989 -#: ../js.php:482 +#: ../common.php:2201 ../form_detail.php:533 ../form_detail.php:649 +#: ../js.php:489 msgid "Number" msgstr "" -#: ../common.php:1684 -#: ../form_detail.php:846 -#: ../form_detail.php:990 -#: ../form_detail.php:1016 -#: ../form_detail.php:1204 +#: ../common.php:2203 ../form_detail.php:506 ../form_detail.php:650 +#: ../form_detail.php:676 ../form_detail.php:869 msgid "Checkboxes" msgstr "" -#: ../common.php:1686 -#: ../form_detail.php:795 -#: ../form_detail.php:812 -#: ../form_detail.php:847 -#: ../form_detail.php:861 -#: ../form_detail.php:991 -#: ../form_detail.php:1017 -#: ../form_detail.php:1205 +#: ../common.php:2205 ../form_detail.php:455 ../form_detail.php:472 +#: ../form_detail.php:507 ../form_detail.php:521 ../form_detail.php:651 +#: ../form_detail.php:677 ../form_detail.php:870 msgid "Radio Buttons" msgstr "" -#: ../common.php:1688 -#: ../form_detail.php:797 -#: ../form_detail.php:875 -#: ../form_detail.php:992 +#: ../common.php:2207 ../form_detail.php:457 ../form_detail.php:535 +#: ../form_detail.php:652 msgid "Hidden" msgstr "" -#: ../common.php:1690 +#: ../common.php:2209 msgid "HTML" msgstr "" -#: ../common.php:1692 -#: ../js.php:370 +#: ../common.php:2211 ../js.php:377 msgid "Section Break" msgstr "" -#: ../common.php:1694 -#: ../form_display.php:2074 +#: ../common.php:2213 ../form_display.php:2235 msgid "Page Break" msgstr "" -#: ../common.php:1696 -#: ../js.php:401 -#: ../js.php:573 +#: ../common.php:2215 ../js.php:408 ../js.php:580 ../notification.php:495 +#: ../notification.php:977 msgid "Name" msgstr "" -#: ../common.php:1700 -#: ../form_detail.php:996 -#: ../js.php:502 +#: ../common.php:2219 ../form_detail.php:656 ../js.php:509 msgid "Time" msgstr "" -#: ../common.php:1702 -#: ../form_detail.php:997 -#: ../js.php:491 +#: ../common.php:2221 ../form_detail.php:657 ../js.php:498 msgid "Phone" msgstr "" -#: ../common.php:1704 -#: ../js.php:456 +#: ../common.php:2223 ../js.php:463 msgid "Address" msgstr "" -#: ../common.php:1706 -#: ../form_detail.php:998 -#: ../js.php:507 +#: ../common.php:2225 ../form_detail.php:658 ../js.php:514 msgid "Website" msgstr "" -#: ../common.php:1708 -#: ../form_detail.php:999 -#: ../js.php:475 -#: ../notification.php:404 +#: ../common.php:2227 ../form_detail.php:659 ../js.php:482 msgid "Email" msgstr "" -#: ../common.php:1710 -#: ../js.php:513 +#: ../common.php:2229 ../js.php:520 msgid "Password" msgstr "" -#: ../common.php:1712 -#: ../form_detail.php:1000 +#: ../common.php:2231 ../form_detail.php:660 msgid "File Upload" msgstr "" -#: ../common.php:1714 +#: ../common.php:2233 msgid "CAPTCHA" msgstr "" -#: ../common.php:1716 -#: ../form_detail.php:1001 -#: ../js.php:393 +#: ../common.php:2235 ../form_detail.php:661 ../js.php:400 msgid "List" msgstr "" -#: ../common.php:1718 -#: ../js.php:463 +#: ../common.php:2237 ../js.php:470 msgid "Credit Card" msgstr "" -#: ../common.php:1720 -#: ../common.php:2605 -#: ../common.php:3692 -#: ../form_detail.php:285 -#: ../form_detail.php:1318 -#: ../form_list.php:171 -#: ../form_list.php:189 -#: ../gravityforms.php:1002 +#: ../common.php:2239 ../common.php:3142 ../common.php:4248 +#: ../form_detail.php:980 ../form_list.php:328 ../form_list.php:346 +#: ../gravityforms.php:1141 ../widget.php:70 msgid "Title" msgstr "" -#: ../common.php:1722 +#: ../common.php:2241 msgid "Body" msgstr "" -#: ../common.php:1724 +#: ../common.php:2243 msgid "Excerpt" msgstr "" -#: ../common.php:1726 +#: ../common.php:2245 msgid "Tags" msgstr "" -#: ../common.php:1728 -#: ../form_detail.php:1215 +#: ../common.php:2247 ../form_detail.php:880 msgid "Category" msgstr "" -#: ../common.php:1730 -#: ../form_detail.php:338 -#: ../form_detail.php:714 -#: ../form_detail.php:908 -#: ../form_detail.php:945 +#: ../common.php:2249 ../form_detail.php:374 ../form_detail.php:568 +#: ../form_detail.php:605 ../form_settings.php:432 ../gravityforms.php:1258 msgid "Image" msgstr "" -#: ../common.php:1732 +#: ../common.php:2251 msgid "Custom Field" msgstr "" -#: ../common.php:1736 -#: ../js.php:573 -#: ../js.php:643 +#: ../common.php:2255 ../js.php:580 ../js.php:650 msgid "Quantity" msgstr "" -#: ../common.php:1738 -#: ../js.php:602 +#: ../common.php:2257 ../js.php:609 msgid "Option" msgstr "" -#: ../common.php:1740 -#: ../js.php:585 +#: ../common.php:2259 ../js.php:592 msgid "Shipping" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Afghanistan" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Albania" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Algeria" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "American Samoa" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Andorra" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Angola" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Antigua and Barbuda" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Argentina" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Armenia" msgstr "" -#: ../common.php:1823 -#: ../form_detail.php:1595 +#: ../common.php:2356 ../form_detail.php:1261 msgid "Australia" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Austria" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Azerbaijan" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Bahamas" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Bahrain" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Bangladesh" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Barbados" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Belarus" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Belgium" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Belize" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Benin" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Bermuda" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Bhutan" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Bolivia" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Bosnia and Herzegovina" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Botswana" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Brazil" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Brunei" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Bulgaria" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Burkina Faso" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Burundi" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Cambodia" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Cameroon" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Canada" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Cape Verde" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Central African Republic" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Chad" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Chile" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "China" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Colombia" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Comoros" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Congo, Democratic Republic of the" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Congo, Republic of the" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Costa Rica" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Côte d'Ivoire" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Croatia" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Cuba" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Cyprus" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Czech Republic" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Denmark" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Djibouti" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Dominica" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Dominican Republic" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "East Timor" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Ecuador" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Egypt" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "El Salvador" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Equatorial Guinea" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Eritrea" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Estonia" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Ethiopia" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Fiji" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Finland" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "France" msgstr "" -#: ../common.php:1823 +#: ../common.php:2356 msgid "Gabon" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Gambia" msgstr "" -#: ../common.php:1824 -#: ../common.php:2043 -#: ../common.php:2058 +#: ../common.php:2357 ../common.php:2576 ../common.php:2591 msgid "Georgia" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Germany" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Ghana" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Greece" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Greenland" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Grenada" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Guam" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Guatemala" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Guinea" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Guinea-Bissau" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Guyana" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Haiti" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Honduras" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Hong Kong" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Hungary" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Iceland" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "India" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Indonesia" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Iran" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Iraq" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Ireland" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Israel" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Italy" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Jamaica" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Japan" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Jordan" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Kazakhstan" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Kenya" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Kiribati" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "North Korea" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "South Korea" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Kuwait" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Kyrgyzstan" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Laos" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Latvia" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Lebanon" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Lesotho" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Liberia" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Libya" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Liechtenstein" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Lithuania" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Luxembourg" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Macedonia" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Madagascar" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Malawi" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Malaysia" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Maldives" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Mali" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Malta" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Marshall Islands" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Mauritania" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Mauritius" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Mexico" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Micronesia" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Moldova" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Monaco" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Mongolia" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Montenegro" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Morocco" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Mozambique" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Myanmar" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Namibia" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Nauru" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Nepal" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "Netherlands" msgstr "" -#: ../common.php:1824 +#: ../common.php:2357 msgid "New Zealand" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Nicaragua" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Niger" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Nigeria" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Norway" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Northern Mariana Islands" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Oman" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Pakistan" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Palau" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Palestine" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Panama" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Papua New Guinea" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Paraguay" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Peru" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Philippines" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Poland" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Portugal" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Puerto Rico" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Qatar" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Romania" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Russia" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Rwanda" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Saint Kitts and Nevis" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Saint Lucia" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Saint Vincent and the Grenadines" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Samoa" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "San Marino" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Sao Tome and Principe" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Saudi Arabia" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Senegal" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Serbia and Montenegro" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Seychelles" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Sierra Leone" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Singapore" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Slovakia" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Slovenia" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Solomon Islands" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Somalia" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "South Africa" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Spain" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Sri Lanka" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Sudan" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Sudan, South" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Suriname" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Swaziland" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Sweden" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Switzerland" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Syria" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Taiwan" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Tajikistan" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Tanzania" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Thailand" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Togo" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Tonga" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Trinidad and Tobago" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Tunisia" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Turkey" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Turkmenistan" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Tuvalu" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Uganda" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "Ukraine" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "United Arab Emirates" msgstr "" -#: ../common.php:1825 +#: ../common.php:2358 msgid "United Kingdom" msgstr "" -#: ../common.php:1826 -#: ../common.php:3490 +#: ../common.php:2359 ../common.php:4046 msgid "United States" msgstr "" -#: ../common.php:1826 +#: ../common.php:2359 msgid "Uruguay" msgstr "" -#: ../common.php:1826 +#: ../common.php:2359 msgid "Uzbekistan" msgstr "" -#: ../common.php:1826 +#: ../common.php:2359 msgid "Vanuatu" msgstr "" -#: ../common.php:1826 +#: ../common.php:2359 msgid "Vatican City" msgstr "" -#: ../common.php:1826 +#: ../common.php:2359 msgid "Venezuela" msgstr "" -#: ../common.php:1826 +#: ../common.php:2359 msgid "Vietnam" msgstr "" -#: ../common.php:1826 +#: ../common.php:2359 msgid "Virgin Islands, British" msgstr "" -#: ../common.php:1826 +#: ../common.php:2359 msgid "Virgin Islands, U.S." msgstr "" -#: ../common.php:1826 +#: ../common.php:2359 msgid "Yemen" msgstr "" -#: ../common.php:1826 +#: ../common.php:2359 msgid "Zambia" msgstr "" -#: ../common.php:1826 +#: ../common.php:2359 msgid "Zimbabwe" msgstr "" -#: ../common.php:1833 +#: ../common.php:2366 msgid "AFGHANISTAN" msgstr "" -#: ../common.php:1834 +#: ../common.php:2367 msgid "ALBANIA" msgstr "" -#: ../common.php:1835 +#: ../common.php:2368 msgid "ALGERIA" msgstr "" -#: ../common.php:1836 +#: ../common.php:2369 msgid "AMERICAN SAMOA" msgstr "" -#: ../common.php:1837 +#: ../common.php:2370 msgid "ANDORRA" msgstr "" -#: ../common.php:1838 +#: ../common.php:2371 msgid "ANGOLA" msgstr "" -#: ../common.php:1839 +#: ../common.php:2372 msgid "ANTIGUA AND BARBUDA" msgstr "" -#: ../common.php:1840 +#: ../common.php:2373 msgid "ARGENTINA" msgstr "" -#: ../common.php:1841 +#: ../common.php:2374 msgid "ARMENIA" msgstr "" -#: ../common.php:1842 +#: ../common.php:2375 msgid "AUSTRALIA" msgstr "" -#: ../common.php:1843 +#: ../common.php:2376 msgid "AUSTRIA" msgstr "" -#: ../common.php:1844 +#: ../common.php:2377 msgid "AZERBAIJAN" msgstr "" -#: ../common.php:1845 +#: ../common.php:2378 msgid "BAHAMAS" msgstr "" -#: ../common.php:1846 +#: ../common.php:2379 msgid "BAHRAIN" msgstr "" -#: ../common.php:1847 +#: ../common.php:2380 msgid "BANGLADESH" msgstr "" -#: ../common.php:1848 +#: ../common.php:2381 msgid "BARBADOS" msgstr "" -#: ../common.php:1849 +#: ../common.php:2382 msgid "BELARUS" msgstr "" -#: ../common.php:1850 +#: ../common.php:2383 msgid "BELGIUM" msgstr "" -#: ../common.php:1851 +#: ../common.php:2384 msgid "BELIZE" msgstr "" -#: ../common.php:1852 +#: ../common.php:2385 msgid "BENIN" msgstr "" -#: ../common.php:1853 +#: ../common.php:2386 msgid "BERMUDA" msgstr "" -#: ../common.php:1854 +#: ../common.php:2387 msgid "BHUTAN" msgstr "" -#: ../common.php:1855 +#: ../common.php:2388 msgid "BOLIVIA" msgstr "" -#: ../common.php:1856 +#: ../common.php:2389 msgid "BOSNIA AND HERZEGOVINA" msgstr "" -#: ../common.php:1857 +#: ../common.php:2390 msgid "BOTSWANA" msgstr "" -#: ../common.php:1858 +#: ../common.php:2391 msgid "BRAZIL" msgstr "" -#: ../common.php:1859 +#: ../common.php:2392 msgid "BRUNEI" msgstr "" -#: ../common.php:1860 +#: ../common.php:2393 msgid "BULGARIA" msgstr "" -#: ../common.php:1861 +#: ../common.php:2394 msgid "BURKINA FASO" msgstr "" -#: ../common.php:1862 +#: ../common.php:2395 msgid "BURUNDI" msgstr "" -#: ../common.php:1863 +#: ../common.php:2396 msgid "CAMBODIA" msgstr "" -#: ../common.php:1864 +#: ../common.php:2397 msgid "CAMEROON" msgstr "" -#: ../common.php:1865 +#: ../common.php:2398 msgid "CANADA" msgstr "" -#: ../common.php:1866 +#: ../common.php:2399 msgid "CAPE VERDE" msgstr "" -#: ../common.php:1867 +#: ../common.php:2400 msgid "CENTRAL AFRICAN REPUBLIC" msgstr "" -#: ../common.php:1868 +#: ../common.php:2401 msgid "CHAD" msgstr "" -#: ../common.php:1869 +#: ../common.php:2402 msgid "CHILE" msgstr "" -#: ../common.php:1870 +#: ../common.php:2403 msgid "CHINA" msgstr "" -#: ../common.php:1871 +#: ../common.php:2404 msgid "COLOMBIA" msgstr "" -#: ../common.php:1872 +#: ../common.php:2405 msgid "COMOROS" msgstr "" -#: ../common.php:1873 +#: ../common.php:2406 msgid "CONGO, DEMOCRATIC REPUBLIC OF THE" msgstr "" -#: ../common.php:1874 +#: ../common.php:2407 msgid "CONGO, REPUBLIC OF THE" msgstr "" -#: ../common.php:1875 +#: ../common.php:2408 msgid "COSTA RICA" msgstr "" -#: ../common.php:1876 +#: ../common.php:2409 msgid "C&OCIRC;TE D'IVOIRE" msgstr "" -#: ../common.php:1877 +#: ../common.php:2410 msgid "CROATIA" msgstr "" -#: ../common.php:1878 +#: ../common.php:2411 msgid "CUBA" msgstr "" -#: ../common.php:1879 +#: ../common.php:2412 msgid "CYPRUS" msgstr "" -#: ../common.php:1880 +#: ../common.php:2413 msgid "CZECH REPUBLIC" msgstr "" -#: ../common.php:1881 +#: ../common.php:2414 msgid "DENMARK" msgstr "" -#: ../common.php:1882 +#: ../common.php:2415 msgid "DJIBOUTI" msgstr "" -#: ../common.php:1883 +#: ../common.php:2416 msgid "DOMINICA" msgstr "" -#: ../common.php:1884 +#: ../common.php:2417 msgid "DOMINICAN REPUBLIC" msgstr "" -#: ../common.php:1885 +#: ../common.php:2418 msgid "EAST TIMOR" msgstr "" -#: ../common.php:1886 +#: ../common.php:2419 msgid "ECUADOR" msgstr "" -#: ../common.php:1887 +#: ../common.php:2420 msgid "EGYPT" msgstr "" -#: ../common.php:1888 +#: ../common.php:2421 msgid "EL SALVADOR" msgstr "" -#: ../common.php:1889 +#: ../common.php:2422 msgid "EQUATORIAL GUINEA" msgstr "" -#: ../common.php:1890 +#: ../common.php:2423 msgid "ERITREA" msgstr "" -#: ../common.php:1891 +#: ../common.php:2424 msgid "ESTONIA" msgstr "" -#: ../common.php:1892 +#: ../common.php:2425 msgid "ETHIOPIA" msgstr "" -#: ../common.php:1893 +#: ../common.php:2426 msgid "FIJI" msgstr "" -#: ../common.php:1894 +#: ../common.php:2427 msgid "FINLAND" msgstr "" -#: ../common.php:1895 +#: ../common.php:2428 msgid "FRANCE" msgstr "" -#: ../common.php:1896 +#: ../common.php:2429 msgid "GABON" msgstr "" -#: ../common.php:1897 +#: ../common.php:2430 msgid "GAMBIA" msgstr "" -#: ../common.php:1898 +#: ../common.php:2431 msgid "GEORGIA" msgstr "" -#: ../common.php:1899 +#: ../common.php:2432 msgid "GERMANY" msgstr "" -#: ../common.php:1900 +#: ../common.php:2433 msgid "GHANA" msgstr "" -#: ../common.php:1901 +#: ../common.php:2434 msgid "GREECE" msgstr "" -#: ../common.php:1902 +#: ../common.php:2435 msgid "GREENLAND" msgstr "" -#: ../common.php:1903 +#: ../common.php:2436 msgid "GRENADA" msgstr "" -#: ../common.php:1904 +#: ../common.php:2437 msgid "GUAM" msgstr "" -#: ../common.php:1905 +#: ../common.php:2438 msgid "GUATEMALA" msgstr "" -#: ../common.php:1906 +#: ../common.php:2439 msgid "GUINEA" msgstr "" -#: ../common.php:1907 +#: ../common.php:2440 msgid "GUINEA-BISSAU" msgstr "" -#: ../common.php:1908 +#: ../common.php:2441 msgid "GUYANA" msgstr "" -#: ../common.php:1909 +#: ../common.php:2442 msgid "HAITI" msgstr "" -#: ../common.php:1910 +#: ../common.php:2443 msgid "HONDURAS" msgstr "" -#: ../common.php:1911 +#: ../common.php:2444 msgid "HONG KONG" msgstr "" -#: ../common.php:1912 +#: ../common.php:2445 msgid "HUNGARY" msgstr "" -#: ../common.php:1913 +#: ../common.php:2446 msgid "ICELAND" msgstr "" -#: ../common.php:1914 +#: ../common.php:2447 msgid "INDIA" msgstr "" -#: ../common.php:1915 +#: ../common.php:2448 msgid "INDONESIA" msgstr "" -#: ../common.php:1916 +#: ../common.php:2449 msgid "IRAN" msgstr "" -#: ../common.php:1917 +#: ../common.php:2450 msgid "IRAQ" msgstr "" -#: ../common.php:1918 +#: ../common.php:2451 msgid "IRELAND" msgstr "" -#: ../common.php:1919 +#: ../common.php:2452 msgid "ISRAEL" msgstr "" -#: ../common.php:1920 +#: ../common.php:2453 msgid "ITALY" msgstr "" -#: ../common.php:1921 +#: ../common.php:2454 msgid "JAMAICA" msgstr "" -#: ../common.php:1922 +#: ../common.php:2455 msgid "JAPAN" msgstr "" -#: ../common.php:1923 +#: ../common.php:2456 msgid "JORDAN" msgstr "" -#: ../common.php:1924 +#: ../common.php:2457 msgid "KAZAKHSTAN" msgstr "" -#: ../common.php:1925 +#: ../common.php:2458 msgid "KENYA" msgstr "" -#: ../common.php:1926 +#: ../common.php:2459 msgid "KIRIBATI" msgstr "" -#: ../common.php:1927 +#: ../common.php:2460 msgid "NORTH KOREA" msgstr "" -#: ../common.php:1928 +#: ../common.php:2461 msgid "SOUTH KOREA" msgstr "" -#: ../common.php:1929 +#: ../common.php:2462 msgid "KUWAIT" msgstr "" -#: ../common.php:1930 +#: ../common.php:2463 msgid "KYRGYZSTAN" msgstr "" -#: ../common.php:1931 +#: ../common.php:2464 msgid "LAOS" msgstr "" -#: ../common.php:1932 +#: ../common.php:2465 msgid "LATVIA" msgstr "" -#: ../common.php:1933 +#: ../common.php:2466 msgid "LEBANON" msgstr "" -#: ../common.php:1934 +#: ../common.php:2467 msgid "LESOTHO" msgstr "" -#: ../common.php:1935 +#: ../common.php:2468 msgid "LIBERIA" msgstr "" -#: ../common.php:1936 +#: ../common.php:2469 msgid "LIBYA" msgstr "" -#: ../common.php:1937 +#: ../common.php:2470 msgid "LIECHTENSTEIN" msgstr "" -#: ../common.php:1938 +#: ../common.php:2471 msgid "LITHUANIA" msgstr "" -#: ../common.php:1939 +#: ../common.php:2472 msgid "LUXEMBOURG" msgstr "" -#: ../common.php:1940 +#: ../common.php:2473 msgid "MACEDONIA" msgstr "" -#: ../common.php:1941 +#: ../common.php:2474 msgid "MADAGASCAR" msgstr "" -#: ../common.php:1942 +#: ../common.php:2475 msgid "MALAWI" msgstr "" -#: ../common.php:1943 +#: ../common.php:2476 msgid "MALAYSIA" msgstr "" -#: ../common.php:1944 +#: ../common.php:2477 msgid "MALDIVES" msgstr "" -#: ../common.php:1945 +#: ../common.php:2478 msgid "MALI" msgstr "" -#: ../common.php:1946 +#: ../common.php:2479 msgid "MALTA" msgstr "" -#: ../common.php:1947 +#: ../common.php:2480 msgid "MARSHALL ISLANDS" msgstr "" -#: ../common.php:1948 +#: ../common.php:2481 msgid "MAURITANIA" msgstr "" -#: ../common.php:1949 +#: ../common.php:2482 msgid "MAURITIUS" msgstr "" -#: ../common.php:1950 +#: ../common.php:2483 msgid "MEXICO" msgstr "" -#: ../common.php:1951 +#: ../common.php:2484 msgid "MICRONESIA" msgstr "" -#: ../common.php:1952 +#: ../common.php:2485 msgid "MOLDOVA" msgstr "" -#: ../common.php:1953 +#: ../common.php:2486 msgid "MONACO" msgstr "" -#: ../common.php:1954 +#: ../common.php:2487 msgid "MONGOLIA" msgstr "" -#: ../common.php:1955 +#: ../common.php:2488 msgid "MONTENEGRO" msgstr "" -#: ../common.php:1956 +#: ../common.php:2489 msgid "MOROCCO" msgstr "" -#: ../common.php:1957 +#: ../common.php:2490 msgid "MOZAMBIQUE" msgstr "" -#: ../common.php:1958 +#: ../common.php:2491 msgid "MYANMAR" msgstr "" -#: ../common.php:1959 +#: ../common.php:2492 msgid "NAMIBIA" msgstr "" -#: ../common.php:1960 +#: ../common.php:2493 msgid "NAURU" msgstr "" -#: ../common.php:1961 +#: ../common.php:2494 msgid "NEPAL" msgstr "" -#: ../common.php:1962 +#: ../common.php:2495 msgid "NETHERLANDS" msgstr "" -#: ../common.php:1963 +#: ../common.php:2496 msgid "NEW ZEALAND" msgstr "" -#: ../common.php:1964 +#: ../common.php:2497 msgid "NICARAGUA" msgstr "" -#: ../common.php:1965 +#: ../common.php:2498 msgid "NIGER" msgstr "" -#: ../common.php:1966 +#: ../common.php:2499 msgid "NIGERIA" msgstr "" -#: ../common.php:1967 +#: ../common.php:2500 msgid "NORTHERN MARIANA ISLANDS" msgstr "" -#: ../common.php:1968 +#: ../common.php:2501 msgid "NORWAY" msgstr "" -#: ../common.php:1969 +#: ../common.php:2502 msgid "OMAN" msgstr "" -#: ../common.php:1970 +#: ../common.php:2503 msgid "PAKISTAN" msgstr "" -#: ../common.php:1971 +#: ../common.php:2504 msgid "PALAU" msgstr "" -#: ../common.php:1972 +#: ../common.php:2505 msgid "PALESTINE" msgstr "" -#: ../common.php:1973 +#: ../common.php:2506 msgid "PANAMA" msgstr "" -#: ../common.php:1974 +#: ../common.php:2507 msgid "PAPUA NEW GUINEA" msgstr "" -#: ../common.php:1975 +#: ../common.php:2508 msgid "PARAGUAY" msgstr "" -#: ../common.php:1976 +#: ../common.php:2509 msgid "PERU" msgstr "" -#: ../common.php:1977 +#: ../common.php:2510 msgid "PHILIPPINES" msgstr "" -#: ../common.php:1978 +#: ../common.php:2511 msgid "POLAND" msgstr "" -#: ../common.php:1979 +#: ../common.php:2512 msgid "PORTUGAL" msgstr "" -#: ../common.php:1980 +#: ../common.php:2513 msgid "PUERTO RICO" msgstr "" -#: ../common.php:1981 +#: ../common.php:2514 msgid "QATAR" msgstr "" -#: ../common.php:1982 +#: ../common.php:2515 msgid "ROMANIA" msgstr "" -#: ../common.php:1983 +#: ../common.php:2516 msgid "RUSSIA" msgstr "" -#: ../common.php:1984 +#: ../common.php:2517 msgid "RWANDA" msgstr "" -#: ../common.php:1985 +#: ../common.php:2518 msgid "SAINT KITTS AND NEVIS" msgstr "" -#: ../common.php:1986 +#: ../common.php:2519 msgid "SAINT LUCIA" msgstr "" -#: ../common.php:1987 +#: ../common.php:2520 msgid "SAINT VINCENT AND THE GRENADINES" msgstr "" -#: ../common.php:1988 +#: ../common.php:2521 msgid "SAMOA" msgstr "" -#: ../common.php:1989 +#: ../common.php:2522 msgid "SAN MARINO" msgstr "" -#: ../common.php:1990 +#: ../common.php:2523 msgid "SAO TOME AND PRINCIPE" msgstr "" -#: ../common.php:1991 +#: ../common.php:2524 msgid "SAUDI ARABIA" msgstr "" -#: ../common.php:1992 +#: ../common.php:2525 msgid "SENEGAL" msgstr "" -#: ../common.php:1993 +#: ../common.php:2526 msgid "SERBIA AND MONTENEGRO" msgstr "" -#: ../common.php:1994 +#: ../common.php:2527 msgid "SEYCHELLES" msgstr "" -#: ../common.php:1995 +#: ../common.php:2528 msgid "SIERRA LEONE" msgstr "" -#: ../common.php:1996 +#: ../common.php:2529 msgid "SINGAPORE" msgstr "" -#: ../common.php:1997 +#: ../common.php:2530 msgid "SLOVAKIA" msgstr "" -#: ../common.php:1998 +#: ../common.php:2531 msgid "SLOVENIA" msgstr "" -#: ../common.php:1999 +#: ../common.php:2532 msgid "SOLOMON ISLANDS" msgstr "" -#: ../common.php:2000 +#: ../common.php:2533 msgid "SOMALIA" msgstr "" -#: ../common.php:2001 +#: ../common.php:2534 msgid "SOUTH AFRICA" msgstr "" -#: ../common.php:2002 +#: ../common.php:2535 msgid "SPAIN" msgstr "" -#: ../common.php:2003 +#: ../common.php:2536 msgid "SRI LANKA" msgstr "" -#: ../common.php:2004 +#: ../common.php:2537 msgid "SUDAN" msgstr "" -#: ../common.php:2005 +#: ../common.php:2538 msgid "SUDAN, SOUTH" msgstr "" -#: ../common.php:2006 +#: ../common.php:2539 msgid "SURINAME" msgstr "" -#: ../common.php:2007 +#: ../common.php:2540 msgid "SWAZILAND" msgstr "" -#: ../common.php:2008 +#: ../common.php:2541 msgid "SWEDEN" msgstr "" -#: ../common.php:2009 +#: ../common.php:2542 msgid "SWITZERLAND" msgstr "" -#: ../common.php:2010 +#: ../common.php:2543 msgid "SYRIA" msgstr "" -#: ../common.php:2011 +#: ../common.php:2544 msgid "TAIWAN" msgstr "" -#: ../common.php:2012 +#: ../common.php:2545 msgid "TAJIKISTAN" msgstr "" -#: ../common.php:2013 +#: ../common.php:2546 msgid "TANZANIA" msgstr "" -#: ../common.php:2014 +#: ../common.php:2547 msgid "THAILAND" msgstr "" -#: ../common.php:2015 +#: ../common.php:2548 msgid "TOGO" msgstr "" -#: ../common.php:2016 +#: ../common.php:2549 msgid "TONGA" msgstr "" -#: ../common.php:2017 +#: ../common.php:2550 msgid "TRINIDAD AND TOBAGO" msgstr "" -#: ../common.php:2018 +#: ../common.php:2551 msgid "TUNISIA" msgstr "" -#: ../common.php:2019 +#: ../common.php:2552 msgid "TURKEY" msgstr "" -#: ../common.php:2020 +#: ../common.php:2553 msgid "TURKMENISTAN" msgstr "" -#: ../common.php:2021 +#: ../common.php:2554 msgid "TUVALU" msgstr "" -#: ../common.php:2022 +#: ../common.php:2555 msgid "UGANDA" msgstr "" -#: ../common.php:2023 +#: ../common.php:2556 msgid "UKRAINE" msgstr "" -#: ../common.php:2024 +#: ../common.php:2557 msgid "UNITED ARAB EMIRATES" msgstr "" -#: ../common.php:2025 +#: ../common.php:2558 msgid "UNITED KINGDOM" msgstr "" -#: ../common.php:2026 +#: ../common.php:2559 msgid "UNITED STATES" msgstr "" -#: ../common.php:2027 +#: ../common.php:2560 msgid "URUGUAY" msgstr "" -#: ../common.php:2028 +#: ../common.php:2561 msgid "UZBEKISTAN" msgstr "" -#: ../common.php:2029 +#: ../common.php:2562 msgid "VANUATU" msgstr "" -#: ../common.php:2030 +#: ../common.php:2563 msgid "VATICAN CITY" msgstr "" -#: ../common.php:2031 +#: ../common.php:2564 msgid "VENEZUELA" msgstr "" -#: ../common.php:2032 +#: ../common.php:2565 msgid "VIRGIN ISLANDS, BRITISH" msgstr "" -#: ../common.php:2033 +#: ../common.php:2566 msgid "VIRGIN ISLANDS, U.S." msgstr "" -#: ../common.php:2034 +#: ../common.php:2567 msgid "VIETNAM" msgstr "" -#: ../common.php:2035 +#: ../common.php:2568 msgid "YEMEN" msgstr "" -#: ../common.php:2036 +#: ../common.php:2569 msgid "ZAMBIA" msgstr "" -#: ../common.php:2037 +#: ../common.php:2570 msgid "ZIMBABWE" msgstr "" -#: ../common.php:2043 -#: ../common.php:2048 +#: ../common.php:2576 ../common.php:2581 msgid "Alabama" msgstr "" -#: ../common.php:2043 -#: ../common.php:2049 +#: ../common.php:2576 ../common.php:2582 msgid "Alaska" msgstr "" -#: ../common.php:2043 -#: ../common.php:2050 +#: ../common.php:2576 ../common.php:2583 msgid "Arizona" msgstr "" -#: ../common.php:2043 -#: ../common.php:2051 +#: ../common.php:2576 ../common.php:2584 msgid "Arkansas" msgstr "" -#: ../common.php:2043 -#: ../common.php:2052 +#: ../common.php:2576 ../common.php:2585 msgid "California" msgstr "" -#: ../common.php:2043 -#: ../common.php:2053 +#: ../common.php:2576 ../common.php:2586 msgid "Colorado" msgstr "" -#: ../common.php:2043 -#: ../common.php:2054 +#: ../common.php:2576 ../common.php:2587 msgid "Connecticut" msgstr "" -#: ../common.php:2043 -#: ../common.php:2055 +#: ../common.php:2576 ../common.php:2588 msgid "Delaware" msgstr "" -#: ../common.php:2043 -#: ../common.php:2056 +#: ../common.php:2576 ../common.php:2589 msgid "District of Columbia" msgstr "" -#: ../common.php:2043 -#: ../common.php:2057 +#: ../common.php:2576 ../common.php:2590 msgid "Florida" msgstr "" -#: ../common.php:2043 -#: ../common.php:2059 +#: ../common.php:2576 ../common.php:2592 msgid "Hawaii" msgstr "" -#: ../common.php:2043 -#: ../common.php:2060 +#: ../common.php:2576 ../common.php:2593 msgid "Idaho" msgstr "" -#: ../common.php:2043 -#: ../common.php:2061 +#: ../common.php:2576 ../common.php:2594 msgid "Illinois" msgstr "" -#: ../common.php:2043 -#: ../common.php:2062 +#: ../common.php:2576 ../common.php:2595 msgid "Indiana" msgstr "" -#: ../common.php:2043 -#: ../common.php:2063 +#: ../common.php:2576 ../common.php:2596 msgid "Iowa" msgstr "" -#: ../common.php:2043 -#: ../common.php:2064 +#: ../common.php:2576 ../common.php:2597 msgid "Kansas" msgstr "" -#: ../common.php:2043 -#: ../common.php:2065 +#: ../common.php:2576 ../common.php:2598 msgid "Kentucky" msgstr "" -#: ../common.php:2043 -#: ../common.php:2066 +#: ../common.php:2576 ../common.php:2599 msgid "Louisiana" msgstr "" -#: ../common.php:2043 -#: ../common.php:2067 +#: ../common.php:2576 ../common.php:2600 msgid "Maine" msgstr "" -#: ../common.php:2043 -#: ../common.php:2068 +#: ../common.php:2576 ../common.php:2601 msgid "Maryland" msgstr "" -#: ../common.php:2043 -#: ../common.php:2069 +#: ../common.php:2576 ../common.php:2602 msgid "Massachusetts" msgstr "" -#: ../common.php:2043 -#: ../common.php:2070 +#: ../common.php:2576 ../common.php:2603 msgid "Michigan" msgstr "" -#: ../common.php:2043 -#: ../common.php:2071 +#: ../common.php:2576 ../common.php:2604 msgid "Minnesota" msgstr "" -#: ../common.php:2043 -#: ../common.php:2072 +#: ../common.php:2576 ../common.php:2605 msgid "Mississippi" msgstr "" -#: ../common.php:2043 -#: ../common.php:2073 +#: ../common.php:2576 ../common.php:2606 msgid "Missouri" msgstr "" -#: ../common.php:2043 -#: ../common.php:2074 +#: ../common.php:2576 ../common.php:2607 msgid "Montana" msgstr "" -#: ../common.php:2043 -#: ../common.php:2075 +#: ../common.php:2576 ../common.php:2608 msgid "Nebraska" msgstr "" -#: ../common.php:2043 -#: ../common.php:2076 +#: ../common.php:2576 ../common.php:2609 msgid "Nevada" msgstr "" -#: ../common.php:2043 -#: ../common.php:2077 +#: ../common.php:2576 ../common.php:2610 msgid "New Hampshire" msgstr "" -#: ../common.php:2043 -#: ../common.php:2078 +#: ../common.php:2576 ../common.php:2611 msgid "New Jersey" msgstr "" -#: ../common.php:2043 -#: ../common.php:2079 +#: ../common.php:2576 ../common.php:2612 msgid "New Mexico" msgstr "" -#: ../common.php:2043 -#: ../common.php:2080 +#: ../common.php:2576 ../common.php:2613 msgid "New York" msgstr "" -#: ../common.php:2043 -#: ../common.php:2081 +#: ../common.php:2576 ../common.php:2614 msgid "North Carolina" msgstr "" -#: ../common.php:2043 -#: ../common.php:2082 +#: ../common.php:2576 ../common.php:2615 msgid "North Dakota" msgstr "" -#: ../common.php:2043 -#: ../common.php:2083 +#: ../common.php:2576 ../common.php:2616 msgid "Ohio" msgstr "" -#: ../common.php:2043 -#: ../common.php:2084 +#: ../common.php:2576 ../common.php:2617 msgid "Oklahoma" msgstr "" -#: ../common.php:2043 -#: ../common.php:2085 +#: ../common.php:2576 ../common.php:2618 msgid "Oregon" msgstr "" -#: ../common.php:2043 -#: ../common.php:2086 +#: ../common.php:2576 ../common.php:2619 msgid "Pennsylvania" msgstr "" -#: ../common.php:2043 -#: ../common.php:2087 +#: ../common.php:2576 ../common.php:2620 msgid "Rhode Island" msgstr "" -#: ../common.php:2043 -#: ../common.php:2088 +#: ../common.php:2576 ../common.php:2621 msgid "South Carolina" msgstr "" -#: ../common.php:2043 -#: ../common.php:2089 +#: ../common.php:2576 ../common.php:2622 msgid "South Dakota" msgstr "" -#: ../common.php:2043 -#: ../common.php:2090 +#: ../common.php:2576 ../common.php:2623 msgid "Tennessee" msgstr "" -#: ../common.php:2043 -#: ../common.php:2091 +#: ../common.php:2576 ../common.php:2624 msgid "Texas" msgstr "" -#: ../common.php:2043 -#: ../common.php:2092 +#: ../common.php:2576 ../common.php:2625 msgid "Utah" msgstr "" -#: ../common.php:2043 -#: ../common.php:2093 +#: ../common.php:2576 ../common.php:2626 msgid "Vermont" msgstr "" -#: ../common.php:2043 -#: ../common.php:2094 +#: ../common.php:2576 ../common.php:2627 msgid "Virginia" msgstr "" -#: ../common.php:2043 -#: ../common.php:2095 +#: ../common.php:2576 ../common.php:2628 msgid "Washington" msgstr "" -#: ../common.php:2043 -#: ../common.php:2096 +#: ../common.php:2576 ../common.php:2629 msgid "West Virginia" msgstr "" -#: ../common.php:2043 -#: ../common.php:2097 +#: ../common.php:2576 ../common.php:2630 msgid "Wisconsin" msgstr "" -#: ../common.php:2043 -#: ../common.php:2098 +#: ../common.php:2576 ../common.php:2631 msgid "Wyoming" msgstr "" -#: ../common.php:2043 -#: ../common.php:2099 +#: ../common.php:2576 ../common.php:2632 msgid "Armed Forces Americas" msgstr "" -#: ../common.php:2043 -#: ../common.php:2100 +#: ../common.php:2576 ../common.php:2633 msgid "Armed Forces Europe" msgstr "" -#: ../common.php:2043 -#: ../common.php:2101 +#: ../common.php:2576 ../common.php:2634 msgid "Armed Forces Pacific" msgstr "" -#: ../common.php:2111 +#: ../common.php:2644 msgid "Alberta" msgstr "" -#: ../common.php:2111 +#: ../common.php:2644 msgid "British Columbia" msgstr "" -#: ../common.php:2111 +#: ../common.php:2644 msgid "Manitoba" msgstr "" -#: ../common.php:2111 +#: ../common.php:2644 msgid "New Brunswick" msgstr "" -#: ../common.php:2111 +#: ../common.php:2644 msgid "Newfoundland & Labrador" msgstr "" -#: ../common.php:2111 +#: ../common.php:2644 msgid "Northwest Territories" msgstr "" -#: ../common.php:2111 +#: ../common.php:2644 msgid "Nova Scotia" msgstr "" -#: ../common.php:2111 +#: ../common.php:2644 msgid "Nunavut" msgstr "" -#: ../common.php:2111 +#: ../common.php:2644 msgid "Ontario" msgstr "" -#: ../common.php:2111 +#: ../common.php:2644 msgid "Prince Edward Island" msgstr "" -#: ../common.php:2111 +#: ../common.php:2644 msgid "Quebec" msgstr "" -#: ../common.php:2111 +#: ../common.php:2644 msgid "Saskatchewan" msgstr "" -#: ../common.php:2111 +#: ../common.php:2644 msgid "Yukon" msgstr "" -#: ../common.php:2162 +#: ../common.php:2695 #, php-format msgid "Please enter a value between %s and %s." msgstr "" -#: ../common.php:2164 +#: ../common.php:2697 #, php-format msgid "Please enter a value greater than or equal to %s." msgstr "" -#: ../common.php:2166 +#: ../common.php:2699 #, php-format msgid "Please enter a value less than or equal to %s." msgstr "" -#: ../common.php:2168 +#: ../common.php:2701 msgid "Please enter a valid number" msgstr "" -#: ../common.php:2201 -#: ../common.php:3254 +#: ../common.php:2739 ../common.php:3808 msgid "Month" msgstr "" -#: ../common.php:2205 +#: ../common.php:2743 msgid "Day" msgstr "" -#: ../common.php:2211 -#: ../common.php:3264 +#: ../common.php:2749 ../common.php:3818 msgid "Year" msgstr "" -#: ../common.php:2285 +#: ../common.php:2823 msgid "Product fields are not editable" msgstr "" -#: ../common.php:2288 +#: ../common.php:2826 msgid "Donations are not editable" msgstr "" -#: ../common.php:2324 -#: ../common.php:2328 +#: ../common.php:2862 ../common.php:2866 msgid "Quantity:" msgstr "" -#: ../common.php:2407 -#: ../common.php:2415 +#: ../common.php:2945 ../common.php:2953 ../notification.php:550 msgid "Enter Email" msgstr "" -#: ../common.php:2407 -#: ../common.php:2415 +#: ../common.php:2945 ../common.php:2953 msgid "Confirm Email" msgstr "" -#: ../common.php:2508 -#: ../js.php:896 +#: ../common.php:3043 ../js.php:876 msgid "Phone format:" msgstr "" -#: ../common.php:2595 -#: ../common.php:2957 +#: ../common.php:3132 ../common.php:3494 msgid "delete" msgstr "" -#: ../common.php:2599 -#: ../js.php:518 +#: ../common.php:3136 ../js.php:525 msgid "File" msgstr "" -#: ../common.php:2608 -#: ../common.php:3693 -#: ../form_detail.php:1323 +#: ../common.php:3145 ../common.php:4249 ../form_detail.php:985 msgid "Caption" msgstr "" -#: ../common.php:2611 -#: ../common.php:3694 -#: ../form_detail.php:293 -#: ../form_detail.php:1328 -#: ../form_detail.php:1747 +#: ../common.php:3148 ../common.php:4250 ../form_detail.php:990 +#: ../form_detail.php:1413 msgid "Description" msgstr "" -#: ../common.php:2621 +#: ../common.php:3158 msgid "Click to select..." msgstr "" -#: ../common.php:2660 -#: ../form_display.php:1781 +#: ../common.php:3197 ../form_display.php:1940 msgid "Strength indicator" msgstr "" -#: ../common.php:2667 +#: ../common.php:3204 msgid "Enter Password" msgstr "" -#: ../common.php:2667 +#: ../common.php:3204 msgid "Confirm Password" msgstr "" -#: ../common.php:2687 -#: ../js.php:407 +#: ../common.php:3224 ../js.php:414 msgid "Prefix" msgstr "" -#: ../common.php:2687 -#: ../common.php:2696 -#: ../js.php:407 -#: ../js.php:413 +#: ../common.php:3224 ../common.php:3233 ../js.php:414 ../js.php:420 msgid "First" msgstr "" -#: ../common.php:2687 -#: ../common.php:2696 -#: ../js.php:407 -#: ../js.php:413 +#: ../common.php:3224 ../common.php:3233 ../js.php:414 ../js.php:420 msgid "Last" msgstr "" -#: ../common.php:2687 -#: ../js.php:407 +#: ../common.php:3224 ../js.php:414 msgid "Suffix" msgstr "" -#: ../common.php:2720 -#: ../common.php:3490 -#: ../form_detail.php:1365 +#: ../common.php:3257 ../common.php:4046 ../form_detail.php:1027 msgid "State" msgstr "" -#: ../common.php:2721 -#: ../common.php:3490 +#: ../common.php:3258 msgid "Zip Code" msgstr "" -#: ../common.php:2741 -#: ../js.php:457 +#: ../common.php:3278 ../js.php:464 msgid "Street Address" msgstr "" -#: ../common.php:2748 -#: ../js.php:457 +#: ../common.php:3285 ../js.php:464 msgid "Address Line 2" msgstr "" -#: ../common.php:2758 -#: ../common.php:2774 -#: ../js.php:457 +#: ../common.php:3295 ../common.php:3311 ../js.php:464 msgid "City" msgstr "" -#: ../common.php:2795 -#: ../js.php:458 +#: ../common.php:3332 ../js.php:465 msgid "Country" msgstr "" -#: ../common.php:2817 -#: ../common.php:2859 -#: ../common.php:2876 -#: ../common.php:2890 -#: ../common.php:2943 +#: ../common.php:3354 ../common.php:3396 ../common.php:3413 ../common.php:3427 +#: ../common.php:3480 msgid "MM" msgstr "" -#: ../common.php:2818 -#: ../common.php:2854 -#: ../common.php:2881 -#: ../common.php:2895 +#: ../common.php:3355 ../common.php:3391 ../common.php:3418 ../common.php:3432 msgid "DD" msgstr "" -#: ../common.php:2819 -#: ../common.php:2864 -#: ../common.php:2872 -#: ../common.php:2900 +#: ../common.php:3356 ../common.php:3401 ../common.php:3409 ../common.php:3437 msgid "YYYY" msgstr "" -#: ../common.php:2941 +#: ../common.php:3478 msgid "AM" msgstr "" -#: ../common.php:2941 +#: ../common.php:3478 msgid "PM" msgstr "" -#: ../common.php:2943 +#: ../common.php:3480 msgid "HH" msgstr "" -#: ../common.php:2951 +#: ../common.php:3488 msgid "Download file" msgstr "" -#: ../common.php:2951 +#: ../common.php:3488 msgid "Delete file" msgstr "" -#: ../common.php:3002 +#: ../common.php:3539 msgid "To use the reCaptcha field you must first do the following:" msgstr "" -#: ../common.php:3002 +#: ../common.php:3539 #, php-format msgid "Sign up%s for a free reCAPTCHA account" msgstr "" -#: ../common.php:3002 +#: ../common.php:3539 #, php-format msgid "Enter your reCAPTCHA keys in the %ssettings page%s" msgstr "" -#: ../common.php:3078 -msgid "Cardholder Name" -msgstr "" - -#: ../common.php:3079 -#: ../js.php:465 +#: ../common.php:3626 ../js.php:472 msgid "Card Number" msgstr "" -#: ../common.php:3098 -#: ../js.php:466 +#: ../common.php:3642 ../js.php:473 msgid "Expiration Date" msgstr "" -#: ../common.php:3108 -#: ../js.php:467 +#: ../common.php:3652 ../js.php:474 msgid "Security Code" msgstr "" -#: ../common.php:3193 +#: ../common.php:3657 +msgid "Cardholder Name" +msgstr "" + +#: ../common.php:3739 msgid "Add a row" msgstr "" -#: ../common.php:3194 +#: ../common.php:3740 msgid "Remove this row" msgstr "" -#: ../common.php:3489 -#: ../form_detail.php:1566 +#: ../common.php:4045 ../form_detail.php:1228 msgid "International" msgstr "" -#: ../common.php:3489 -#: ../js.php:458 -msgid "Zip / Postal Code" +#: ../common.php:4045 ../js.php:465 +msgid "ZIP / Postal Code" msgstr "" -#: ../common.php:3489 +#: ../common.php:4045 msgid "State / Province / Region" msgstr "" -#: ../common.php:3491 +#: ../common.php:4046 +msgid "ZIP Code" +msgstr "" + +#: ../common.php:4047 msgid "Canadian" msgstr "" -#: ../common.php:3491 -#: ../form_detail.php:1369 +#: ../common.php:4047 ../form_detail.php:1031 msgid "Postal Code" msgstr "" -#: ../common.php:3491 +#: ../common.php:4047 msgid "Province" msgstr "" -#: ../common.php:3698 -#: ../common.php:3713 -#: ../entry_list.php:891 -#: ../entry_list.php:901 +#: ../common.php:4254 ../common.php:4269 ../entry_list.php:894 +#: ../entry_list.php:904 msgid "Click to view" msgstr "" -#: ../common.php:3749 +#: ../common.php:4305 msgid "Qty: " msgstr "" -#: ../common.php:3749 +#: ../common.php:4305 msgid "Price: " msgstr "" +#: ../common.php:5116 ../form_list.php:227 ../form_list.php:284 +#: ../form_list.php:371 ../includes/addon/class-gf-feed-addon.php:725 +msgid "Active" +msgstr "" + +#: ../common.php:5117 ../form_list.php:223 ../form_list.php:285 +#: ../form_list.php:371 ../includes/addon/class-gf-feed-addon.php:725 +msgid "Inactive" +msgstr "" + +#: ../common.php:5118 ../common.php:5147 ../form_detail.php:1314 +#: ../select_columns.php:149 +msgid "Save" +msgstr "" + +#: ../common.php:5119 ../entry_detail.php:397 +msgid "Update" +msgstr "" + +#: ../common.php:5120 ../form_display.php:540 ../form_display.php:2119 +#: ../js.php:389 +msgid "Previous" +msgstr "" + +#: ../common.php:5121 +msgid "Select a format" +msgstr "" + +#: ../common.php:5122 +#, php-format +msgid "5 of %d items shown. Edit field to view all" +msgstr "" + +#: ../common.php:5123 +msgid "Enter a value" +msgstr "" + +#: ../common.php:5124 +msgid "Untitled Form" +msgstr "" + +#: ../common.php:5125 +msgid "" +"We would love to hear from you! Please fill out this form and we will get in " +"touch with you shortly." +msgstr "" + +#: ../common.php:5126 ../common.php:5155 ../form_detail.php:2298 +msgid "Thanks for contacting us! We will get in touch with you shortly." +msgstr "" + +#: ../common.php:5127 ../form_display.php:729 ../form_list.php:481 +msgid "Submit" +msgstr "" + +#: ../common.php:5128 ../notification.php:311 +msgid "Loading..." +msgstr "" + +#: ../common.php:5129 +msgid "this field if" +msgstr "" + +#: ../common.php:5130 +msgid "this page" +msgstr "" + +#: ../common.php:5131 +msgid "this form button" +msgstr "" + +#: ../common.php:5132 +msgid "Show" +msgstr "" + +#: ../common.php:5133 +msgid "Hide" +msgstr "" + +#: ../common.php:5134 ../entry_list.php:581 ../form_list.php:283 +msgid "All" +msgstr "" + +#: ../common.php:5135 +msgid "Any" +msgstr "" + +#: ../common.php:5136 +msgid "of the following match:" +msgstr "" + +#: ../common.php:5137 ../notification.php:191 ../notification.php:645 +#: ../includes/addon/class-gf-addon.php:1112 +msgid "is" +msgstr "" + +#: ../common.php:5138 ../notification.php:192 ../notification.php:646 +#: ../includes/addon/class-gf-addon.php:1116 +msgid "is not" +msgstr "" + +#: ../common.php:5139 ../notification.php:193 ../notification.php:647 +#: ../includes/addon/class-gf-addon.php:1120 +msgid "greater than" +msgstr "" + +#: ../common.php:5140 ../notification.php:194 ../notification.php:648 +#: ../includes/addon/class-gf-addon.php:1124 +msgid "less than" +msgstr "" + +#: ../common.php:5141 ../notification.php:195 ../notification.php:649 +#: ../includes/addon/class-gf-addon.php:1128 +msgid "contains" +msgstr "" + +#: ../common.php:5142 ../notification.php:196 ../notification.php:650 +#: ../includes/addon/class-gf-addon.php:1132 +msgid "starts with" +msgstr "" + +#: ../common.php:5143 ../notification.php:197 ../notification.php:651 +#: ../includes/addon/class-gf-addon.php:1136 +msgid "ends with" +msgstr "" + +#: ../common.php:5145 +msgid "Use this confirmation if" +msgstr "" + +#: ../common.php:5146 +msgid "Send this notification if" +msgstr "" + +#: ../common.php:5148 +msgid "Saving..." +msgstr "" + +#: ../common.php:5149 +msgid "Are you sure you wish to cancel these changes?" +msgstr "" + +#: ../common.php:5150 ../form_settings.php:1243 +msgid "There was an issue saving this confirmation." +msgstr "" + +#: ../common.php:5151 +msgid "Are you sure you wish to delete this confirmation?" +msgstr "" + +#: ../common.php:5152 ../form_settings.php:1263 +msgid "There was an issue deleting this confirmation." +msgstr "" + +#: ../common.php:5153 +msgid "" +"There are unsaved changes to the current confirmation. Would you like to " +"discard these changes?" +msgstr "" + +#: ../common.php:5154 +msgid "Untitled Confirmation" +msgstr "" + +#: ../common.php:5156 +msgid "Please select a page." +msgstr "" + +#: ../common.php:5157 +msgid "Please enter a URL." +msgstr "" + +#: ../common.php:5158 +msgid "Please enter a confirmation name." +msgstr "" + +#: ../common.php:5160 +msgid "" +"This form contains conditional logic dependent upon this field. Are you sure " +"you want to delete this field? 'OK' to delete, 'Cancel' to abort." +msgstr "" + +#: ../common.php:5161 +msgid "" +"This form contains conditional logic dependent upon this choice. Are you " +"sure you want to delete this choice? 'OK' to delete, 'Cancel' to abort." +msgstr "" + +#: ../common.php:5162 +msgid "" +"This form contains conditional logic dependent upon this choice. Are you " +"sure you want to modify this choice? 'OK' to delete, 'Cancel' to abort." +msgstr "" + +#: ../common.php:5164 +msgid "" +"
            Merge Tags
            Merge tags allow you to dynamically populate submitted " +"field values in your form content wherever this merge tag icon is present." +msgstr "" + #: ../currency.php:94 msgid "Australian Dollar" msgstr "" @@ -2800,273 +2825,220 @@ msgstr "" msgid "U.S. Dollar" msgstr "" -#: ../entry_detail.php:56 +#: ../entry_detail.php:57 msgid "Oops! We couldn't find your lead. Please try again" msgstr "" -#: ../entry_detail.php:145 -msgid "'Would you like to delete this file? \\'Cancel\\' to stop. \\'OK\\' to delete'" +#: ../entry_detail.php:146 +msgid "" +"'Would you like to delete this file? \\'Cancel\\' to stop. \\'OK\\' to " +"delete'" msgstr "" -#: ../entry_detail.php:155 -#: ../js.php:349 +#: ../entry_detail.php:155 ../js.php:356 msgid "Ajax error while deleting field." msgstr "" -#: ../entry_detail.php:200 -#: ../entry_list.php:364 +#: ../entry_detail.php:202 ../entry_list.php:359 msgid "You must select at least one type of notification to resend." msgstr "" -#: ../entry_detail.php:219 +#: ../entry_detail.php:220 msgid "Notifications were resent successfully." msgstr "" -#: ../entry_detail.php:263 +#: ../entry_detail.php:264 msgid "Entry #" msgstr "" -#: ../entry_detail.php:281 +#: ../entry_detail.php:284 msgid "Info" msgstr "" -#: ../entry_detail.php:288 +#: ../entry_detail.php:291 msgid "Submitted on" msgstr "" -#: ../entry_detail.php:290 -#: ../export.php:516 -#: ../gravityforms.php:1451 +#: ../entry_detail.php:293 ../export.php:675 ../select_columns.php:90 +#: ../includes/addon/class-gf-feed-addon.php:548 msgid "User IP" msgstr "" -#: ../entry_detail.php:295 +#: ../entry_detail.php:298 ../select_columns.php:96 msgid "User" msgstr "" -#: ../entry_detail.php:295 +#: ../entry_detail.php:298 msgid "View user profile" msgstr "" -#: ../entry_detail.php:301 +#: ../entry_detail.php:304 msgid "Embed Url" msgstr "" -#: ../entry_detail.php:307 +#: ../entry_detail.php:310 msgid "Edit Post" msgstr "" -#: ../entry_detail.php:307 +#: ../entry_detail.php:310 msgid "Click to edit post" msgstr "" -#: ../entry_detail.php:313 -#: ../export.php:518 -#: ../gravityforms.php:1453 +#: ../entry_detail.php:316 ../export.php:672 ../select_columns.php:92 msgid "Payment Status" msgstr "" -#: ../entry_detail.php:313 +#: ../entry_detail.php:316 msgid "Subscription Status" msgstr "" -#: ../entry_detail.php:317 -#: ../export.php:519 -#: ../gravityforms.php:1454 +#: ../entry_detail.php:320 ../export.php:671 ../select_columns.php:95 msgid "Payment Date" msgstr "" -#: ../entry_detail.php:317 +#: ../entry_detail.php:320 msgid "Start Date" msgstr "" -#: ../entry_detail.php:323 -#: ../export.php:520 -#: ../gravityforms.php:1455 +#: ../entry_detail.php:326 ../export.php:669 ../select_columns.php:93 msgid "Transaction Id" msgstr "" -#: ../entry_detail.php:323 +#: ../entry_detail.php:326 msgid "Subscriber Id" msgstr "" -#: ../entry_detail.php:329 +#: ../entry_detail.php:332 ../export.php:670 ../select_columns.php:94 msgid "Payment Amount" msgstr "" -#: ../entry_detail.php:329 +#: ../entry_detail.php:332 msgid "Subscription Amount" msgstr "" -#: ../entry_detail.php:344 -#: ../entry_list.php:626 -#: ../entry_list.php:996 -#: ../entry_list.php:1134 +#: ../entry_detail.php:347 ../entry_list.php:618 ../entry_list.php:1006 +#: ../entry_list.php:1142 msgid "Not Spam" msgstr "" -#: ../entry_detail.php:350 -#: ../entry_detail.php:363 -msgid "You are about to delete this entry. \\'Cancel\\' to stop, \\'OK\\' to delete." +#: ../entry_detail.php:353 ../entry_detail.php:366 +msgid "" +"You are about to delete this entry. \\'Cancel\\' to stop, \\'OK\\' to delete." msgstr "" -#: ../entry_detail.php:350 -#: ../entry_detail.php:363 -#: ../entry_list.php:620 -#: ../entry_list.php:630 -#: ../entry_list.php:980 -#: ../entry_list.php:1006 -#: ../entry_list.php:1128 -#: ../entry_list.php:1138 +#: ../entry_detail.php:353 ../entry_detail.php:366 ../entry_list.php:612 +#: ../entry_list.php:622 ../entry_list.php:990 ../entry_list.php:1016 +#: ../entry_list.php:1136 ../entry_list.php:1146 msgid "Delete Permanently" msgstr "" -#: ../entry_detail.php:358 -#: ../entry_list.php:616 -#: ../entry_list.php:970 -#: ../entry_list.php:1124 +#: ../entry_detail.php:361 ../entry_list.php:608 ../entry_list.php:980 +#: ../entry_list.php:1132 msgid "Restore" msgstr "" -#: ../entry_detail.php:372 +#: ../entry_detail.php:375 msgid "Move to Trash" msgstr "" -#: ../entry_detail.php:378 +#: ../entry_detail.php:381 msgid "Mark as Spam" msgstr "" -#: ../entry_detail.php:394 -#: ../entry_list.php:764 -#: ../entry_list.php:787 -#: ../form_detail.php:266 -#: ../form_detail.php:567 -#: ../form_detail.php:691 -#: ../form_display.php:2057 -#: ../form_list.php:217 -#: ../form_list.php:223 -#: ../js.php:136 +#: ../entry_detail.php:397 ../entry_list.php:765 ../entry_list.php:788 +#: ../form_detail.php:163 ../form_detail.php:351 ../form_display.php:2214 +#: ../form_list.php:374 ../form_settings.php:1375 ../gravityforms.php:2040 +#: ../js.php:135 ../notification.php:1034 +#: ../includes/addon/class-gf-feed-addon.php:404 msgid "Edit" msgstr "" -#: ../entry_detail.php:394 -#: ../form_detail.php:64 -msgid "Update" -msgstr "" - -#: ../entry_detail.php:399 -#: ../form_detail.php:1649 -#: ../gravityforms.php:911 +#: ../entry_detail.php:402 ../form_detail.php:1315 ../gravityforms.php:1049 +#: ../select_columns.php:150 msgid "Cancel" msgstr "" -#: ../entry_detail.php:411 -#: ../form_list.php:229 -#: ../gravityforms.php:1537 -#: ../notification.php:375 +#: ../entry_detail.php:415 ../form_settings.php:1172 ../notification.php:90 +#: ../notification.php:417 ../notification.php:421 msgid "Notifications" msgstr "" -#: ../entry_detail.php:418 -#: ../entry_list.php:679 -msgid "Admin Notification" -msgstr "" - -#: ../entry_detail.php:421 -#: ../entry_list.php:682 -msgid "User Notification" -msgstr "" - -#: ../entry_detail.php:428 -#: ../entry_list.php:689 +#: ../entry_detail.php:433 ../entry_list.php:690 ../notification.php:542 msgid "Send To" msgstr "" -#: ../entry_detail.php:434 -#: ../entry_list.php:327 -#: ../entry_list.php:641 -#: ../entry_list.php:694 -#: ../entry_list.php:1149 +#: ../entry_detail.php:439 ../entry_list.php:319 ../entry_list.php:633 +#: ../entry_list.php:695 ../entry_list.php:1157 msgid "Resend Notifications" msgstr "" -#: ../entry_detail.php:436 -#: ../entry_list.php:696 +#: ../entry_detail.php:441 ../entry_list.php:697 msgid "Resending..." msgstr "" -#: ../entry_detail.php:447 -#: ../entry_list.php:642 -#: ../entry_list.php:728 -#: ../entry_list.php:1150 +#: ../entry_detail.php:452 ../entry_list.php:634 ../entry_list.php:729 +#: ../entry_list.php:1158 msgid "Print" msgstr "" -#: ../entry_detail.php:450 +#: ../entry_detail.php:455 msgid "include notes" msgstr "" -#: ../entry_detail.php:470 +#: ../entry_detail.php:478 msgid "Notes" msgstr "" -#: ../entry_detail.php:506 +#: ../entry_detail.php:516 msgid "Entry Updated." msgstr "" -#: ../entry_detail.php:518 +#: ../entry_detail.php:527 msgid "Details" msgstr "" -#: ../entry_detail.php:567 +#: ../entry_detail.php:576 msgid " Bulk action" msgstr "" -#: ../entry_detail.php:569 -#: ../entry_list.php:611 -#: ../entry_list.php:1119 +#: ../entry_detail.php:578 ../entry_list.php:603 ../entry_list.php:1127 msgid " Bulk action " msgstr "" -#: ../entry_detail.php:570 -#: ../form_detail.php:1650 -#: ../form_display.php:2054 -#: ../form_list.php:142 -#: ../form_list.php:235 -#: ../form_list.php:285 +#: ../entry_detail.php:579 ../form_detail.php:1316 ../form_display.php:2211 +#: ../form_list.php:297 ../form_list.php:392 ../form_list.php:393 +#: ../form_list.php:441 ../form_settings.php:1376 ../notification.php:1035 +#: ../includes/addon/class-gf-feed-addon.php:373 +#: ../includes/addon/class-gf-feed-addon.php:405 msgid "Delete" msgstr "" -#: ../entry_detail.php:573 -#: ../entry_list.php:659 -#: ../entry_list.php:1166 -#: ../form_list.php:147 -#: ../form_list.php:290 +#: ../entry_detail.php:582 ../entry_list.php:651 ../entry_list.php:1174 +#: ../form_list.php:304 ../form_list.php:448 msgid "Apply" msgstr "" -#: ../entry_detail.php:620 +#: ../entry_detail.php:629 msgid "added on" msgstr "" -#: ../entry_detail.php:634 +#: ../entry_detail.php:643 msgid "Add Note" msgstr "" -#: ../entry_detail.php:641 +#: ../entry_detail.php:650 msgid "Also email this note to" msgstr "" -#: ../entry_detail.php:649 +#: ../entry_detail.php:658 msgid "Subject:" msgstr "" -#: ../entry_detail.php:676 -#: ../print-entry.php:50 +#: ../entry_detail.php:685 ../print-entry.php:50 msgid "Entry # " msgstr "" -#: ../entry_detail.php:682 +#: ../entry_detail.php:691 msgid "show empty fields" msgstr "" @@ -3133,4204 +3105,4726 @@ msgstr "" msgid "%s unstarred." msgstr "" -#: ../entry_list.php:177 +#: ../entry_list.php:176 msgid "«" msgstr "" -#: ../entry_list.php:178 +#: ../entry_list.php:177 msgid "»" msgstr "" -#: ../entry_list.php:264 +#: ../entry_list.php:257 msgid "Ajax error while setting lead property" msgstr "" -#: ../entry_list.php:319 +#: ../entry_list.php:311 msgid "Please select at least one entry." msgstr "" -#: ../entry_list.php:333 +#: ../entry_list.php:325 msgid "Print Entries" msgstr "" -#: ../entry_list.php:386 +#: ../entry_list.php:380 #, php-format msgid "Notifications for %s were resent successfully." msgstr "" -#: ../entry_list.php:387 +#: ../entry_list.php:381 msgid "entry" msgstr "" -#: ../entry_list.php:387 +#: ../entry_list.php:381 msgid "entries" msgstr "" -#: ../entry_list.php:491 +#: ../entry_list.php:484 msgid "Entry List" msgstr "" -#: ../entry_list.php:577 -#: ../form_list.php:173 -#: ../form_list.php:191 -#: ../form_list.php:227 -#: ../gravityforms.php:732 -#: ../gravityforms.php:1544 +#: ../entry_list.php:569 ../form_list.php:330 ../form_list.php:348 +#: ../gravityforms.php:834 ../gravityforms.php:2070 msgid "Entries" msgstr "" -#: ../entry_list.php:589 -#: ../form_list.php:128 -#: ../js.php:820 -msgid "All" +#: ../entry_list.php:582 ../gravityforms.php:1142 +msgid "Unread" msgstr "" -#: ../entry_list.php:590 -#: ../gravityforms.php:1003 -msgid "Unread" -msgstr "" - -#: ../entry_list.php:591 +#: ../entry_list.php:583 msgid "Starred" msgstr "" -#: ../entry_list.php:595 -#: ../entry_list.php:647 -#: ../entry_list.php:1029 -#: ../entry_list.php:1154 +#: ../entry_list.php:587 ../entry_list.php:639 ../entry_list.php:1039 +#: ../entry_list.php:1162 msgid "Spam" msgstr "" -#: ../entry_list.php:599 -#: ../entry_list.php:653 -#: ../entry_list.php:1039 -#: ../entry_list.php:1160 +#: ../entry_list.php:591 ../entry_list.php:645 ../entry_list.php:1049 +#: ../entry_list.php:1168 msgid "Trash" msgstr "" -#: ../entry_list.php:602 +#: ../entry_list.php:594 msgid "Search Entries:" msgstr "" -#: ../entry_list.php:603 +#: ../entry_list.php:595 msgid "Search" msgstr "" -#: ../entry_list.php:609 -#: ../entry_list.php:1117 -#: ../form_list.php:139 -#: ../form_list.php:141 -#: ../form_list.php:282 -#: ../form_list.php:284 +#: ../entry_list.php:601 ../entry_list.php:1125 ../form_list.php:294 +#: ../form_list.php:296 ../form_list.php:438 ../form_list.php:440 msgid "Bulk action" msgstr "" -#: ../entry_list.php:637 -#: ../entry_list.php:1145 +#: ../entry_list.php:629 ../entry_list.php:1153 msgid "Mark as Read" msgstr "" -#: ../entry_list.php:638 -#: ../entry_list.php:1146 +#: ../entry_list.php:630 ../entry_list.php:1154 msgid "Mark as Unread" msgstr "" -#: ../entry_list.php:639 -#: ../entry_list.php:1147 +#: ../entry_list.php:631 ../entry_list.php:1155 msgid "Add Star" msgstr "" -#: ../entry_list.php:640 -#: ../entry_list.php:1148 +#: ../entry_list.php:632 ../entry_list.php:1156 msgid "Remove Star" msgstr "" -#: ../entry_list.php:663 -msgid "WARNING! This operation cannot be undone. Empty trash? \\'Ok\\' to empty trash. \\'Cancel\\' to abort." +#: ../entry_list.php:655 +msgid "" +"WARNING! This operation cannot be undone. Empty trash? \\'Ok\\' to empty " +"trash. \\'Cancel\\' to abort." msgstr "" -#: ../entry_list.php:663 -msgid "WARNING! This operation cannot be undone. Permanently delete all spam? \\'Ok\\' to delete. \\'Cancel\\' to abort." +#: ../entry_list.php:655 +msgid "" +"WARNING! This operation cannot be undone. Permanently delete all spam? \\'Ok" +"\\' to delete. \\'Cancel\\' to abort." msgstr "" -#: ../entry_list.php:664 +#: ../entry_list.php:656 msgid "Empty Trash" msgstr "" -#: ../entry_list.php:664 +#: ../entry_list.php:656 msgid "Delete All Spam" msgstr "" -#: ../entry_list.php:676 -msgid "Specify which notifications you would like to resend for the selected entries." +#: ../entry_list.php:668 +msgid "" +"Specify which notifications you would like to resend for the selected " +"entries." +msgstr "" + +#: ../entry_list.php:673 +msgid "This form does not have any notifications configured" msgstr "" -#: ../entry_list.php:702 +#: ../entry_list.php:703 msgid "Close Window" msgstr "" -#: ../entry_list.php:716 +#: ../entry_list.php:717 msgid "Print all of the selected entries at once." msgstr "" -#: ../entry_list.php:720 +#: ../entry_list.php:721 msgid "Include notes" msgstr "" -#: ../entry_list.php:725 +#: ../entry_list.php:726 msgid "Add page break between entries" msgstr "" -#: ../entry_list.php:764 +#: ../entry_list.php:765 msgid "Select Columns" msgstr "" -#: ../entry_list.php:965 -#: ../entry_list.php:991 -#: ../entry_list.php:1018 +#: ../entry_list.php:975 ../entry_list.php:1001 ../entry_list.php:1028 msgid "View this entry" msgstr "" -#: ../entry_list.php:965 -#: ../entry_list.php:991 -#: ../entry_list.php:1018 +#: ../entry_list.php:975 ../entry_list.php:1001 ../entry_list.php:1028 msgid "View" msgstr "" -#: ../entry_list.php:970 +#: ../entry_list.php:980 msgid "Restore this entry" msgstr "" -#: ../entry_list.php:980 -#: ../entry_list.php:1006 +#: ../entry_list.php:990 ../entry_list.php:1016 msgid "Delete this entry permanently" msgstr "" -#: ../entry_list.php:996 +#: ../entry_list.php:1006 msgid "Mark this entry as not spam" msgstr "" -#: ../entry_list.php:1022 +#: ../entry_list.php:1032 msgid "Mark read" msgstr "" -#: ../entry_list.php:1022 +#: ../entry_list.php:1032 msgid "Mark this entry as unread" msgstr "" -#: ../entry_list.php:1022 +#: ../entry_list.php:1032 msgid "Mark unread" msgstr "" -#: ../entry_list.php:1029 +#: ../entry_list.php:1039 msgid "Mark this entry as spam" msgstr "" -#: ../entry_list.php:1039 +#: ../entry_list.php:1049 msgid "Move this entry to the trash" msgstr "" -#: ../entry_list.php:1081 +#: ../entry_list.php:1089 msgid "This form does not have any unread entries." msgstr "" -#: ../entry_list.php:1085 +#: ../entry_list.php:1093 msgid "This form does not have any starred entries." msgstr "" -#: ../entry_list.php:1089 +#: ../entry_list.php:1097 msgid "This form does not have any spam." msgstr "" -#: ../entry_list.php:1094 +#: ../entry_list.php:1102 msgid "This form does not have any entries in the trash." msgstr "" -#: ../entry_list.php:1099 +#: ../entry_list.php:1107 msgid "This form does not have any entries yet." msgstr "" -#: ../entry_list.php:1313 +#: ../entry_list.php:1320 #, php-format msgid "Displaying %s - %s of %s" msgstr "" -#: ../export.php:26 -msgid "Please select the forms to be exported" +#: ../export.php:12 +msgid "Please select the fields to be exported" msgstr "" -#: ../export.php:183 -msgid "Export Entries" +#: ../export.php:35 +msgid "Please select the forms to be exported" msgstr "" -#: ../export.php:184 -#: ../export.php:307 -msgid "Export Forms" +#: ../export.php:290 +msgid "" +"Forms could not be imported. Please make sure your XML export file is in the " +"correct format." msgstr "" -#: ../export.php:185 -#: ../export.php:272 -msgid "Import Forms" +#: ../export.php:293 +msgid "" +"Forms could not be imported. Your XML export file is not compatible with " +"your current version of Gravity Forms." msgstr "" -#: ../export.php:250 -msgid "Forms could not be imported. Please make sure your XML export file is in the correct format." +#: ../export.php:297 +msgid "forms" msgstr "" -#: ../export.php:255 -msgid "Forms could not be imported. Your XML export file is not compatible with your current version of Gravity Forms." +#: ../export.php:297 +msgid "form" msgstr "" -#: ../export.php:260 -msgid "forms" +#: ../export.php:298 +msgid "Edit Form" msgstr "" -#: ../export.php:260 -msgid "form" +#: ../export.php:304 ../export.php:810 +msgid "Import Forms" msgstr "" -#: ../export.php:277 -msgid "Select the Gravity Forms XML file you would like to import. When you click the import button below, Gravity Forms will import the forms." +#: ../export.php:313 +msgid "" +"Select the Gravity Forms XML file you would like to import. When you click " +"the import button below, Gravity Forms will import the forms." msgstr "" -#: ../export.php:289 +#: ../export.php:323 msgid "Select File" msgstr "" -#: ../export.php:294 +#: ../export.php:328 msgid "Import" msgstr "" -#: ../export.php:312 -msgid "Select the forms you would like to export. When you click the download button below, Gravity Forms will create a XML file for you to save to your computer. Once you've saved the download file, you can use the Import tool to import the forms." +#: ../export.php:340 ../export.php:809 +msgid "Export Forms" +msgstr "" + +#: ../export.php:344 +msgid "" +"Select the forms you would like to export. When you click the download " +"button below, Gravity Forms will create a XML file for you to save to your " +"computer. Once you've saved the download file, you can use the Import tool " +"to import the forms." msgstr "" -#: ../export.php:318 +#: ../export.php:350 msgid "Select Forms" msgstr "" -#: ../export.php:338 -#: ../export.php:446 +#: ../export.php:370 ../export.php:485 msgid "Download Export File" msgstr "" -#: ../export.php:359 +#: ../export.php:381 ../export.php:496 ../export.php:808 +msgid "Export Entries" +msgstr "" + +#: ../export.php:405 msgid "Ajax error while selecting a form" msgstr "" -#: ../export.php:372 +#: ../export.php:421 msgid "Deselect All" msgstr "" -#: ../export.php:372 +#: ../export.php:421 msgid "Select All" msgstr "" -#: ../export.php:388 -msgid "Export Form Entries" -msgstr "" - -#: ../export.php:393 -msgid "Select a form below to export entries. Once you have selected a form you may select the fields you would like to export and an optional date range. When you click the download button below, Gravity Forms will create a CSV file for you to save to your computer." +#: ../export.php:432 +msgid "" +"Select a form below to export entries. Once you have selected a form you may " +"select the fields you would like to export and an optional date range. When " +"you click the download button below, Gravity Forms will create a CSV file " +"for you to save to your computer." msgstr "" -#: ../export.php:400 -#: ../gravityforms.php:1557 +#: ../export.php:439 ../gravityforms.php:1942 msgid "Select A Form" msgstr "" -#: ../export.php:404 +#: ../export.php:443 msgid "Select a form" msgstr "" -#: ../export.php:418 +#: ../export.php:457 msgid "Select Fields" msgstr "" -#: ../export.php:425 +#: ../export.php:464 msgid "Select Date Range" msgstr "" -#: ../export.php:430 +#: ../export.php:469 ../includes/addon/class-gf-results.php:298 msgid "Start" msgstr "" -#: ../export.php:435 +#: ../export.php:474 ../includes/addon/class-gf-results.php:306 msgid "End" msgstr "" -#: ../export.php:438 -msgid "Date Range is optional, if no date range is selected all entries will be exported." +#: ../export.php:477 +msgid "" +"Date Range is optional, if no date range is selected all entries will be " +"exported." msgstr "" -#: ../export.php:448 +#: ../export.php:487 msgid "Exporting entries. Please wait..." msgstr "" -#: ../export.php:515 -#: ../gravityforms.php:1450 -msgid "Entry Date" -msgstr "" - -#: ../export.php:517 -#: ../gravityforms.php:1452 -msgid "Source Url" -msgstr "" - -#: ../forms_model.php:406 -#: ../forms_model.php:724 -msgid "You don't have adequate permission to delete entries." -msgstr "" - -#: ../forms_model.php:460 -msgid "You don't have adequate permission to delete forms." -msgstr "" - -#: ../forms_model.php:488 -msgid "You don't have adequate permission to create forms." -msgstr "" - -#: ../forms_model.php:773 -msgid "You don't have adequate permission to delete notes." -msgstr "" - -#: ../forms_model.php:802 -msgid "You don't have adequate permission to edit entries." -msgstr "" - -#: ../form_detail.php:63 -#: ../form_detail.php:1648 -msgid "Save" -msgstr "" - -#: ../form_detail.php:66 -#: ../form_display.php:525 -#: ../form_display.php:1962 -#: ../js.php:382 -msgid "Previous" -msgstr "" - -#: ../form_detail.php:67 -msgid "Select a format" -msgstr "" - -#: ../form_detail.php:69 -#, php-format -msgid "5 of %d items shown. Edit field to view all" -msgstr "" - -#: ../form_detail.php:70 -msgid "Enter a value" -msgstr "" - -#: ../form_detail.php:71 -msgid "Untitled Form" -msgstr "" - -#: ../form_detail.php:72 -msgid "We would love to hear from you! Please fill out this form and we will get in touch with you shortly." +#: ../export.php:665 +msgid "Created By (User Id)" msgstr "" -#: ../form_detail.php:73 -msgid "Thanks for contacting us! We will get in touch with you shortly." +#: ../export.php:667 ../select_columns.php:89 +#: ../includes/addon/class-gf-feed-addon.php:547 +msgid "Entry Date" msgstr "" -#: ../form_detail.php:74 -#: ../form_display.php:686 -msgid "Submit" +#: ../export.php:668 ../select_columns.php:91 +#: ../includes/addon/class-gf-feed-addon.php:549 +msgid "Source Url" msgstr "" -#: ../form_detail.php:75 -#: ../notification.php:300 -msgid "Loading..." +#: ../export.php:674 +msgid "User Agent" msgstr "" -#: ../form_detail.php:218 -#: ../gravityforms.php:730 +#: ../form_detail.php:113 ../gravityforms.php:832 msgid "New Form" msgstr "" -#: ../form_detail.php:218 -msgid "Form Editor :" +#: ../form_detail.php:115 ../gravityforms.php:2040 +msgid "Form Editor" msgstr "" -#: ../form_detail.php:227 -#: ../form_detail.php:2328 +#: ../form_detail.php:125 ../form_detail.php:1990 ../form_settings.php:255 msgid "There was an error while saving your form." msgstr "" -#: ../form_detail.php:228 -#: ../form_detail.php:2329 +#: ../form_detail.php:126 ../form_detail.php:1991 ../form_settings.php:256 #, php-format msgid "Please %scontact our support team%s." msgstr "" -#: ../form_detail.php:236 -msgid "The form title you have entered is already taken. Please enter an unique form title." +#: ../form_detail.php:134 +msgid "" +"The form title you have entered is already taken. Please enter an unique " +"form title." msgstr "" -#: ../form_detail.php:244 -#: ../form_detail.php:2324 +#: ../form_detail.php:142 ../form_detail.php:1986 ../form_settings.php:273 msgid "Form updated successfully." msgstr "" -#: ../form_detail.php:262 -#: ../gravityforms.php:1536 -msgid "Form Settings" -msgstr "" - -#: ../form_detail.php:264 -msgid "Form ID" +#: ../form_detail.php:163 ../form_detail.php:351 +msgid "Edit Last Page" msgstr "" -#: ../form_detail.php:266 -msgid "Edit Form's properties" +#: ../form_detail.php:165 +msgid "First Page Options" msgstr "" -#: ../form_detail.php:276 -#: ../form_detail.php:572 -#: ../form_detail.php:696 -#: ../form_detail.php:759 +#: ../form_detail.php:168 ../form_detail.php:356 ../form_detail.php:419 msgid "Properties" msgstr "" -#: ../form_detail.php:277 -#: ../form_detail.php:573 -#: ../form_detail.php:760 +#: ../form_detail.php:169 ../form_detail.php:420 msgid "Advanced" msgstr "" -#: ../form_detail.php:278 -msgid "Confirmation" -msgstr "" - -#: ../form_detail.php:301 -msgid "Label Placement" -msgstr "" - -#: ../form_detail.php:305 -msgid "Top aligned" -msgstr "" - -#: ../form_detail.php:306 -msgid "Left aligned" -msgstr "" - -#: ../form_detail.php:307 -msgid "Right aligned" -msgstr "" - -#: ../form_detail.php:313 -msgid "Description Placement" -msgstr "" - -#: ../form_detail.php:317 -msgid "Below inputs" -msgstr "" - -#: ../form_detail.php:318 -msgid "Above inputs" -msgstr "" - -#: ../form_detail.php:328 -msgid "Form Button" -msgstr "" - -#: ../form_detail.php:332 -#: ../form_detail.php:708 -#: ../form_detail.php:902 -#: ../form_detail.php:939 -msgid "Default" -msgstr "" - -#: ../form_detail.php:344 -#: ../form_detail.php:720 -#: ../form_detail.php:914 -#: ../form_detail.php:951 -msgid "Text:" -msgstr "" - -#: ../form_detail.php:351 -#: ../form_detail.php:727 -#: ../form_detail.php:921 -#: ../form_detail.php:958 -msgid "Image Path:" -msgstr "" - -#: ../form_detail.php:359 -#: ../form_detail.php:2176 -msgid "Enable Conditional Logic" -msgstr "" - -#: ../form_detail.php:370 -#: ../form_detail.php:665 -#: ../form_detail.php:2105 -msgid "CSS Class Name" -msgstr "" - -#: ../form_detail.php:377 -msgid "Limit number of entries" -msgstr "" - -#: ../form_detail.php:383 -msgid "Number of Entries" +#: ../form_detail.php:176 ../tooltips.php:92 +msgid "Progress Indicator" msgstr "" -#: ../form_detail.php:388 -msgid "total entries" +#: ../form_detail.php:182 +msgid "Progress Bar" msgstr "" -#: ../form_detail.php:389 -msgid "per day" +#: ../form_detail.php:187 +msgid "Steps" msgstr "" -#: ../form_detail.php:390 -msgid "per week" +#: ../form_detail.php:192 ../form_detail.php:1385 +msgid "None" msgstr "" -#: ../form_detail.php:391 -msgid "per month" +#: ../form_detail.php:201 +msgid "Style" msgstr "" -#: ../form_detail.php:392 -msgid "per year" +#: ../form_detail.php:205 +msgid "Blue" msgstr "" -#: ../form_detail.php:396 -msgid "Entry Limit Reached Message" +#: ../form_detail.php:206 +msgid "Gray" msgstr "" -#: ../form_detail.php:403 -msgid "Schedule form" +#: ../form_detail.php:207 ../form_detail.php:1267 +msgid "Green" msgstr "" -#: ../form_detail.php:408 -msgid "Start Date/Time" +#: ../form_detail.php:208 +msgid "Orange" msgstr "" -#: ../form_detail.php:439 -msgid "End Date/Time" +#: ../form_detail.php:209 ../form_detail.php:739 +msgid "Red" msgstr "" -#: ../form_detail.php:471 -msgid "Form Expired Message" +#: ../form_detail.php:216 +msgid "Text Color" msgstr "" -#: ../form_detail.php:478 -msgid "Enable anti-spam honeypot" +#: ../form_detail.php:223 ../form_detail.php:724 +msgid "Background Color" msgstr "" -#: ../form_detail.php:482 -msgid "Enable animation" +#: ../form_detail.php:230 ../tooltips.php:94 +msgid "Page Names" msgstr "" -#: ../form_detail.php:486 -msgid "Require user to be logged in" +#: ../form_detail.php:241 +msgid "Display completed progress bar on confirmation" msgstr "" -#: ../form_detail.php:491 -msgid "Require Login Message" +#: ../form_detail.php:249 +msgid "Completion Text" msgstr "" -#: ../form_detail.php:503 -msgid "Confirmation Message" +#: ../form_detail.php:261 ../form_detail.php:1769 ../form_settings.php:389 +#: ../tooltips.php:82 +msgid "CSS Class Name" msgstr "" -#: ../form_detail.php:507 -msgid "Text" +#: ../form_detail.php:283 +msgid "" +"This form doesn't have any fields yet. Follow the steps below to get " +"started." msgstr "" -#: ../form_detail.php:513 -#: ../js.php:78 -msgid "Page" +#: ../form_detail.php:287 +msgid "Select A Field Type" msgstr "" -#: ../form_detail.php:519 -msgid "Redirect" +#: ../form_detail.php:288 +msgid "" +"Start by seleting a field type from the nifty floating panels on the right." msgstr "" -#: ../form_detail.php:529 -#: ../notification.php:606 -#: ../notification.php:737 -msgid "Disable Auto-formatting" +#: ../form_detail.php:291 +msgid "Start Over There" msgstr "" -#: ../form_detail.php:535 -msgid "Select a page" +#: ../form_detail.php:292 +msgid "Pick a field.. any field. Don't be shy." msgstr "" -#: ../form_detail.php:544 -msgid "Pass Field Data Via Query String" +#: ../form_detail.php:297 +msgid "Click to Add A Field" msgstr "" -#: ../form_detail.php:551 -msgid "Sample: phone={Phone:1}&email{Email:2}" +#: ../form_detail.php:298 +msgid "" +"Once you've found the field type you want, click to add it to the form " +"editor here on the left side of your screen." msgstr "" -#: ../form_detail.php:567 -#: ../form_detail.php:691 -msgid "Edit Last Page" +#: ../form_detail.php:301 +msgid "Now your new field magically appears over here." msgstr "" -#: ../form_detail.php:569 -msgid "First Page Options" +#: ../form_detail.php:306 +msgid "Edit Field Options" msgstr "" -#: ../form_detail.php:580 -msgid "Progress Indicator" +#: ../form_detail.php:307 +msgid "Click on the edit link to configure the various field options" msgstr "" -#: ../form_detail.php:586 -msgid "Progress Bar" +#: ../form_detail.php:310 +msgid "Preview your changes up here." msgstr "" -#: ../form_detail.php:591 -msgid "Steps" +#: ../form_detail.php:311 +msgid "Edit the field options. Go ahead.. go crazy." msgstr "" -#: ../form_detail.php:596 -#: ../form_detail.php:1719 -msgid "None" +#: ../form_detail.php:312 +msgid "If you get stuck, mouseover the tool tips for a little help." msgstr "" -#: ../form_detail.php:605 -msgid "Style" +#: ../form_detail.php:317 +msgid "Drag to Arrange Fields" msgstr "" -#: ../form_detail.php:609 -msgid "Blue" +#: ../form_detail.php:318 +msgid "Drag the fields to arrange them the way you prefer" msgstr "" -#: ../form_detail.php:610 -msgid "Gray" +#: ../form_detail.php:321 +msgid "Grab here with your cursor." msgstr "" -#: ../form_detail.php:611 -#: ../form_detail.php:1601 -msgid "Green" +#: ../form_detail.php:322 +msgid "Drag up or down to arrange your fields." msgstr "" -#: ../form_detail.php:612 -msgid "Orange" +#: ../form_detail.php:327 +msgid "Save Your Form" msgstr "" -#: ../form_detail.php:613 -#: ../form_detail.php:1079 -msgid "Red" +#: ../form_detail.php:328 +msgid "" +"Once you're happy with your form, remember to click on the "update " +"form" button to save all your hard work." msgstr "" -#: ../form_detail.php:620 -msgid "Text Color" +#: ../form_detail.php:331 +msgid "Save Your New Form" msgstr "" -#: ../form_detail.php:627 -#: ../form_detail.php:1064 -msgid "Background Color" +#: ../form_detail.php:332 +msgid "You're done. That's it." msgstr "" -#: ../form_detail.php:634 -msgid "Page Names" +#: ../form_detail.php:353 +msgid "Last Page Options" msgstr "" -#: ../form_detail.php:645 -msgid "Display completed progress bar on confirmation" +#: ../form_detail.php:362 ../form_detail.php:593 +msgid "Previous Button" msgstr "" -#: ../form_detail.php:653 -msgid "Completion Text" +#: ../form_detail.php:368 ../form_detail.php:562 ../form_detail.php:599 +msgid "Default" msgstr "" -#: ../form_detail.php:693 -msgid "Last Page Options" +#: ../form_detail.php:380 ../form_detail.php:574 ../form_detail.php:611 +msgid "Text:" msgstr "" -#: ../form_detail.php:702 -#: ../form_detail.php:933 -msgid "Previous Button" +#: ../form_detail.php:387 ../form_detail.php:581 ../form_detail.php:618 +msgid "Image Path:" msgstr "" -#: ../form_detail.php:741 +#: ../form_detail.php:401 msgid "You have successfully saved your form!" msgstr "" -#: ../form_detail.php:742 +#: ../form_detail.php:402 msgid "What would you like to do next?" msgstr "" -#: ../form_detail.php:743 -#: ../form_detail.php:2325 -#: ../form_list.php:224 +#: ../form_detail.php:403 ../form_detail.php:1987 ../gravityforms.php:2085 msgid "Preview this form" msgstr "" -#: ../form_detail.php:743 +#: ../form_detail.php:403 msgid "Preview this Form" msgstr "" -#: ../form_detail.php:746 +#: ../form_detail.php:406 msgid "Setup email notifications for this form" msgstr "" -#: ../form_detail.php:746 +#: ../form_detail.php:406 msgid "Setup Email Notifications for this Form" msgstr "" -#: ../form_detail.php:749 +#: ../form_detail.php:409 msgid "Continue editing this form" msgstr "" -#: ../form_detail.php:749 +#: ../form_detail.php:409 msgid "Continue Editing this Form" msgstr "" -#: ../form_detail.php:751 +#: ../form_detail.php:411 msgid "I am done. Take me back to form list" msgstr "" -#: ../form_detail.php:751 +#: ../form_detail.php:411 msgid "Return to Form List" msgstr "" -#: ../form_detail.php:769 +#: ../form_detail.php:429 ../tooltips.php:43 ../tooltips.php:44 msgid "Field Label" msgstr "" -#: ../form_detail.php:777 +#: ../form_detail.php:437 ../tooltips.php:115 msgid "Product Field" msgstr "" -#: ../form_detail.php:789 -#: ../form_detail.php:806 -#: ../form_detail.php:841 -#: ../form_detail.php:855 -#: ../form_detail.php:869 -#: ../form_detail.php:980 -#: ../form_detail.php:1009 -#: ../form_detail.php:1199 +#: ../form_detail.php:449 ../form_detail.php:466 ../form_detail.php:501 +#: ../form_detail.php:515 ../form_detail.php:529 ../form_detail.php:640 +#: ../form_detail.php:669 ../form_detail.php:864 msgid "Field Type" msgstr "" -#: ../form_detail.php:793 +#: ../form_detail.php:453 msgid "Single Product" msgstr "" -#: ../form_detail.php:796 -#: ../form_detail.php:860 +#: ../form_detail.php:456 ../form_detail.php:520 msgid "User Defined Price" msgstr "" -#: ../form_detail.php:798 +#: ../form_detail.php:458 msgid "Calculation" msgstr "" -#: ../form_detail.php:810 +#: ../form_detail.php:470 msgid "Single Method" msgstr "" -#: ../form_detail.php:831 +#: ../form_detail.php:491 msgid "Disable quantity field" msgstr "" -#: ../form_detail.php:884 +#: ../form_detail.php:544 ../tooltips.php:112 msgid "Content" msgstr "" -#: ../form_detail.php:897 +#: ../form_detail.php:557 msgid "Next Button" msgstr "" -#: ../form_detail.php:971 +#: ../form_detail.php:631 msgid "Disable default margins" msgstr "" -#: ../form_detail.php:984 -#: ../form_detail.php:2276 +#: ../form_detail.php:644 ../form_detail.php:1940 ../tooltips.php:117 msgid "Standard Fields" msgstr "" -#: ../form_detail.php:985 -#: ../form_detail.php:1013 +#: ../form_detail.php:645 ../form_detail.php:673 msgid "Single line text" msgstr "" -#: ../form_detail.php:994 -#: ../form_detail.php:2277 +#: ../form_detail.php:654 ../form_detail.php:1941 ../tooltips.php:118 msgid "Advanced Fields" msgstr "" -#: ../form_detail.php:1028 +#: ../form_detail.php:688 msgid "Type" msgstr "" -#: ../form_detail.php:1032 +#: ../form_detail.php:692 msgid "reCAPTCHA" msgstr "" -#: ../form_detail.php:1033 +#: ../form_detail.php:693 msgid "Really Simple CAPTCHA" msgstr "" -#: ../form_detail.php:1034 +#: ../form_detail.php:694 msgid "Math Challenge" msgstr "" -#: ../form_detail.php:1042 -#: ../form_detail.php:1613 +#: ../form_detail.php:702 ../form_detail.php:1279 msgid "Size" msgstr "" -#: ../form_detail.php:1045 -#: ../form_detail.php:1613 -#: ../form_detail.php:2025 +#: ../form_detail.php:705 ../form_detail.php:1279 ../form_detail.php:1690 msgid "Small" msgstr "" -#: ../form_detail.php:1055 +#: ../form_detail.php:715 msgid "Font Color" msgstr "" -#: ../form_detail.php:1075 +#: ../form_detail.php:735 msgid "Theme" msgstr "" -#: ../form_detail.php:1080 +#: ../form_detail.php:740 msgid "White" msgstr "" -#: ../form_detail.php:1081 +#: ../form_detail.php:741 msgid "Black Glass" msgstr "" -#: ../form_detail.php:1082 +#: ../form_detail.php:742 msgid "Clean" msgstr "" -#: ../form_detail.php:1090 +#: ../form_detail.php:750 ../tooltips.php:48 msgid "Custom Field Name" msgstr "" -#: ../form_detail.php:1096 +#: ../form_detail.php:756 msgid "Existing" msgstr "" -#: ../form_detail.php:1102 +#: ../form_detail.php:762 msgid "New" msgstr "" -#: ../form_detail.php:1108 +#: ../form_detail.php:768 msgid "Select an existing custom field" msgstr "" -#: ../form_detail.php:1125 +#: ../form_detail.php:785 ../tooltips.php:102 msgid "Post Status" msgstr "" -#: ../form_detail.php:1129 -msgid "Draft" -msgstr "" - -#: ../form_detail.php:1130 -msgid "Pending Review" -msgstr "" - -#: ../form_detail.php:1131 -msgid "Published" -msgstr "" - -#: ../form_detail.php:1139 +#: ../form_detail.php:804 msgid "Default Post Author" msgstr "" -#: ../form_detail.php:1149 +#: ../form_detail.php:814 msgid "Use logged in user as author" msgstr "" -#: ../form_detail.php:1161 +#: ../form_detail.php:826 ../tooltips.php:104 msgid "Post Format" msgstr "" -#: ../form_detail.php:1187 -#: ../js.php:362 +#: ../form_detail.php:852 ../js.php:369 ../tooltips.php:101 +#: ../tooltips.php:107 msgid "Post Category" msgstr "" -#: ../form_detail.php:1221 +#: ../form_detail.php:886 msgid "All Categories" msgstr "" -#: ../form_detail.php:1227 +#: ../form_detail.php:892 msgid "Select Categories" msgstr "" -#: ../form_detail.php:1250 +#: ../form_detail.php:915 msgid "Display placeholder" msgstr "" -#: ../form_detail.php:1256 +#: ../form_detail.php:921 msgid "Placeholder Label" msgstr "" -#: ../form_detail.php:1266 -#: ../form_detail.php:1283 -#: ../form_detail.php:1300 +#: ../form_detail.php:931 ../form_detail.php:948 ../form_detail.php:962 msgid "Create content template" msgstr "" -#: ../form_detail.php:1315 +#: ../form_detail.php:977 msgid "Image Metadata" msgstr "" -#: ../form_detail.php:1338 +#: ../form_detail.php:1000 ../tooltips.php:110 msgid "Set as Featured Image" msgstr "" -#: ../form_detail.php:1350 +#: ../form_detail.php:1012 ../tooltips.php:53 msgid "Address Type" msgstr "" -#: ../form_detail.php:1378 +#: ../form_detail.php:1040 #, php-format msgid "Default %s" msgstr "" -#: ../form_detail.php:1394 +#: ../form_detail.php:1056 ../tooltips.php:56 msgid "Default Country" msgstr "" -#: ../form_detail.php:1404 +#: ../form_detail.php:1066 msgid "Hide Country Field" msgstr "" -#: ../form_detail.php:1416 +#: ../form_detail.php:1078 #, php-format msgid "Hide %s Field" msgstr "" -#: ../form_detail.php:1428 +#: ../form_detail.php:1090 msgid "Hide Address Line 2 Field" msgstr "" -#: ../form_detail.php:1438 +#: ../form_detail.php:1100 msgid "Name Format" msgstr "" -#: ../form_detail.php:1442 +#: ../form_detail.php:1104 msgid "Normal" msgstr "" -#: ../form_detail.php:1443 +#: ../form_detail.php:1105 msgid "Extended" msgstr "" -#: ../form_detail.php:1444 +#: ../form_detail.php:1106 msgid "Simple" msgstr "" -#: ../form_detail.php:1452 +#: ../form_detail.php:1114 ../tooltips.php:52 msgid "Date Input Type" msgstr "" -#: ../form_detail.php:1456 +#: ../form_detail.php:1118 msgid "Date Field" msgstr "" -#: ../form_detail.php:1457 +#: ../form_detail.php:1119 msgid "Date Picker" msgstr "" -#: ../form_detail.php:1458 +#: ../form_detail.php:1120 msgid "Date Drop Down" msgstr "" -#: ../form_detail.php:1464 +#: ../form_detail.php:1126 msgid "No Icon" msgstr "" -#: ../form_detail.php:1469 +#: ../form_detail.php:1131 msgid "Calendar Icon" msgstr "" -#: ../form_detail.php:1474 +#: ../form_detail.php:1136 msgid "Custom Icon" msgstr "" -#: ../form_detail.php:1479 +#: ../form_detail.php:1141 msgid "Image Path: " msgstr "" -#: ../form_detail.php:1482 +#: ../form_detail.php:1144 msgid "Preview this form to see your custom icon." msgstr "" -#: ../form_detail.php:1491 +#: ../form_detail.php:1153 msgid "Date Format" msgstr "" -#: ../form_detail.php:1509 +#: ../form_detail.php:1171 msgid "Allowed file extensions" msgstr "" -#: ../form_detail.php:1513 +#: ../form_detail.php:1175 msgid "Separated with commas (i.e. jpg, gif, png, pdf)" msgstr "" -#: ../form_detail.php:1522 +#: ../form_detail.php:1184 msgid "Enable multiple columns" msgstr "" -#: ../form_detail.php:1534 +#: ../form_detail.php:1196 ../tooltips.php:51 msgid "Maximum Rows" msgstr "" -#: ../form_detail.php:1546 +#: ../form_detail.php:1208 ../tooltips.php:67 msgid "Time Format" msgstr "" -#: ../form_detail.php:1550 +#: ../form_detail.php:1212 msgid "12 hour" msgstr "" -#: ../form_detail.php:1551 +#: ../form_detail.php:1213 msgid "24 hour" msgstr "" -#: ../form_detail.php:1561 +#: ../form_detail.php:1223 msgid "Phone Format" msgstr "" -#: ../form_detail.php:1575 -msgid "enable values" +#: ../form_detail.php:1238 +msgid "show values" msgstr "" -#: ../form_detail.php:1577 +#: ../form_detail.php:1241 msgid "Choices" msgstr "" -#: ../form_detail.php:1580 +#: ../form_detail.php:1246 msgid "Label" msgstr "" -#: ../form_detail.php:1580 +#: ../form_detail.php:1246 msgid "Value" msgstr "" -#: ../form_detail.php:1584 +#: ../form_detail.php:1250 msgid "Bulk Add / Predefined Choices" msgstr "" -#: ../form_detail.php:1592 +#: ../form_detail.php:1258 msgid "Countries" msgstr "" -#: ../form_detail.php:1593 +#: ../form_detail.php:1259 msgid "U.S. States" msgstr "" -#: ../form_detail.php:1594 +#: ../form_detail.php:1260 msgid "Canadian Province/Territory" msgstr "" -#: ../form_detail.php:1595 +#: ../form_detail.php:1261 msgid "Continents" msgstr "" -#: ../form_detail.php:1595 +#: ../form_detail.php:1261 msgid "Africa" msgstr "" -#: ../form_detail.php:1595 +#: ../form_detail.php:1261 msgid "Antarctica" msgstr "" -#: ../form_detail.php:1595 +#: ../form_detail.php:1261 msgid "Asia" msgstr "" -#: ../form_detail.php:1595 +#: ../form_detail.php:1261 msgid "Europe" msgstr "" -#: ../form_detail.php:1595 +#: ../form_detail.php:1261 msgid "North America" msgstr "" -#: ../form_detail.php:1595 +#: ../form_detail.php:1261 msgid "South America" msgstr "" -#: ../form_detail.php:1596 +#: ../form_detail.php:1262 msgid "Gender" msgstr "" -#: ../form_detail.php:1596 +#: ../form_detail.php:1262 msgid "Male" msgstr "" -#: ../form_detail.php:1596 +#: ../form_detail.php:1262 msgid "Female" msgstr "" -#: ../form_detail.php:1596 -#: ../form_detail.php:1597 -#: ../form_detail.php:1599 -#: ../form_detail.php:1602 -#: ../form_detail.php:1603 +#: ../form_detail.php:1262 ../form_detail.php:1263 ../form_detail.php:1265 +#: ../form_detail.php:1268 ../form_detail.php:1269 msgid "Prefer Not to Answer" msgstr "" -#: ../form_detail.php:1597 +#: ../form_detail.php:1263 msgid "Age" msgstr "" -#: ../form_detail.php:1597 +#: ../form_detail.php:1263 msgid "Under 18" msgstr "" -#: ../form_detail.php:1597 +#: ../form_detail.php:1263 msgid "18-24" msgstr "" -#: ../form_detail.php:1597 +#: ../form_detail.php:1263 msgid "25-34" msgstr "" -#: ../form_detail.php:1597 +#: ../form_detail.php:1263 msgid "35-44" msgstr "" -#: ../form_detail.php:1597 +#: ../form_detail.php:1263 msgid "45-54" msgstr "" -#: ../form_detail.php:1597 +#: ../form_detail.php:1263 msgid "55-64" msgstr "" -#: ../form_detail.php:1597 +#: ../form_detail.php:1263 msgid "65 or Above" msgstr "" -#: ../form_detail.php:1598 +#: ../form_detail.php:1264 msgid "Marital Status" msgstr "" -#: ../form_detail.php:1598 +#: ../form_detail.php:1264 msgid "Single" msgstr "" -#: ../form_detail.php:1598 +#: ../form_detail.php:1264 msgid "Married" msgstr "" -#: ../form_detail.php:1598 +#: ../form_detail.php:1264 msgid "Divorced" msgstr "" -#: ../form_detail.php:1598 +#: ../form_detail.php:1264 msgid "Widowed" msgstr "" -#: ../form_detail.php:1599 +#: ../form_detail.php:1265 msgid "Employment" msgstr "" -#: ../form_detail.php:1599 +#: ../form_detail.php:1265 msgid "Employed Full-Time" msgstr "" -#: ../form_detail.php:1599 +#: ../form_detail.php:1265 msgid "Employed Part-Time" msgstr "" -#: ../form_detail.php:1599 +#: ../form_detail.php:1265 msgid "Self-employed" msgstr "" -#: ../form_detail.php:1599 +#: ../form_detail.php:1265 msgid "Not employed" msgstr "" -#: ../form_detail.php:1599 +#: ../form_detail.php:1265 msgid " but looking for work" msgstr "" -#: ../form_detail.php:1599 +#: ../form_detail.php:1265 msgid "Not employed and not looking for work" msgstr "" -#: ../form_detail.php:1599 +#: ../form_detail.php:1265 msgid "Homemaker" msgstr "" -#: ../form_detail.php:1599 +#: ../form_detail.php:1265 msgid "Retired" msgstr "" -#: ../form_detail.php:1599 +#: ../form_detail.php:1265 msgid "Student" msgstr "" -#: ../form_detail.php:1600 +#: ../form_detail.php:1266 msgid "Job Type" msgstr "" -#: ../form_detail.php:1600 +#: ../form_detail.php:1266 msgid "Full-Time" msgstr "" -#: ../form_detail.php:1600 +#: ../form_detail.php:1266 msgid "Part-Time" msgstr "" -#: ../form_detail.php:1600 +#: ../form_detail.php:1266 msgid "Per Diem" msgstr "" -#: ../form_detail.php:1600 +#: ../form_detail.php:1266 msgid "Employee" msgstr "" -#: ../form_detail.php:1600 +#: ../form_detail.php:1266 msgid "Temporary" msgstr "" -#: ../form_detail.php:1600 +#: ../form_detail.php:1266 msgid "Contract" msgstr "" -#: ../form_detail.php:1600 +#: ../form_detail.php:1266 msgid "Intern" msgstr "" -#: ../form_detail.php:1600 +#: ../form_detail.php:1266 msgid "Seasonal" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Industry" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Accounting/Finance" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Advertising/Public Relations" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Aerospace/Aviation" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Arts/Entertainment/Publishing" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Automotive" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Banking/Mortgage" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Business Development" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Business Opportunity" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Clerical/Administrative" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Construction/Facilities" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Consumer Goods" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Customer Service" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Education/Training" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Energy/Utilities" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Engineering" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Government/Military" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Healthcare" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Hospitality/Travel" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Human Resources" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Installation/Maintenance" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Insurance" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Internet" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Job Search Aids" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Law Enforcement/Security" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Legal" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Management/Executive" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Manufacturing/Operations" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Marketing" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Non-Profit/Volunteer" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Pharmaceutical/Biotech" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Professional Services" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "QA/Quality Control" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Real Estate" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Restaurant/Food Service" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Retail" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Sales" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Science/Research" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Skilled Labor" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Technology" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Telecommunications" msgstr "" -#: ../form_detail.php:1601 +#: ../form_detail.php:1267 msgid "Transportation/Logistics" msgstr "" -#: ../form_detail.php:1602 +#: ../form_detail.php:1268 msgid "Income" msgstr "" -#: ../form_detail.php:1602 +#: ../form_detail.php:1268 msgid "Under $20,000" msgstr "" -#: ../form_detail.php:1602 +#: ../form_detail.php:1268 msgid "$20,000 - $30,000" msgstr "" -#: ../form_detail.php:1602 +#: ../form_detail.php:1268 msgid "$30,000 - $40,000" msgstr "" -#: ../form_detail.php:1602 +#: ../form_detail.php:1268 msgid "$40,000 - $50,000" msgstr "" -#: ../form_detail.php:1602 +#: ../form_detail.php:1268 msgid "$50,000 - $75,000" msgstr "" -#: ../form_detail.php:1602 +#: ../form_detail.php:1268 msgid "$75,000 - $100,000" msgstr "" -#: ../form_detail.php:1602 +#: ../form_detail.php:1268 msgid "$100,000 - $150,000" msgstr "" -#: ../form_detail.php:1602 +#: ../form_detail.php:1268 msgid "$150,000 or more" msgstr "" -#: ../form_detail.php:1603 +#: ../form_detail.php:1269 msgid "Education" msgstr "" -#: ../form_detail.php:1603 +#: ../form_detail.php:1269 msgid "High School" msgstr "" -#: ../form_detail.php:1603 +#: ../form_detail.php:1269 msgid "Associate Degree" msgstr "" -#: ../form_detail.php:1603 +#: ../form_detail.php:1269 msgid "Bachelor's Degree" msgstr "" -#: ../form_detail.php:1603 +#: ../form_detail.php:1269 msgid "Graduate of Professional Degree" msgstr "" -#: ../form_detail.php:1603 +#: ../form_detail.php:1269 msgid "Some College" msgstr "" -#: ../form_detail.php:1604 +#: ../form_detail.php:1270 msgid "Days of the Week" msgstr "" -#: ../form_detail.php:1604 +#: ../form_detail.php:1270 msgid "Sunday" msgstr "" -#: ../form_detail.php:1604 +#: ../form_detail.php:1270 msgid "Monday" msgstr "" -#: ../form_detail.php:1604 +#: ../form_detail.php:1270 msgid "Tuesday" msgstr "" -#: ../form_detail.php:1604 +#: ../form_detail.php:1270 msgid "Wednesday" msgstr "" -#: ../form_detail.php:1604 +#: ../form_detail.php:1270 msgid "Thursday" msgstr "" -#: ../form_detail.php:1604 +#: ../form_detail.php:1270 msgid "Friday" msgstr "" -#: ../form_detail.php:1604 +#: ../form_detail.php:1270 msgid "Saturday" msgstr "" -#: ../form_detail.php:1605 +#: ../form_detail.php:1271 msgid "Months of the Year" msgstr "" -#: ../form_detail.php:1605 +#: ../form_detail.php:1271 msgid "January" msgstr "" -#: ../form_detail.php:1605 +#: ../form_detail.php:1271 msgid "February" msgstr "" -#: ../form_detail.php:1605 +#: ../form_detail.php:1271 msgid "March" msgstr "" -#: ../form_detail.php:1605 +#: ../form_detail.php:1271 msgid "April" msgstr "" -#: ../form_detail.php:1605 +#: ../form_detail.php:1271 msgid "May" msgstr "" -#: ../form_detail.php:1605 +#: ../form_detail.php:1271 msgid "June" msgstr "" -#: ../form_detail.php:1605 +#: ../form_detail.php:1271 msgid "July" msgstr "" -#: ../form_detail.php:1605 +#: ../form_detail.php:1271 msgid "August" msgstr "" -#: ../form_detail.php:1605 +#: ../form_detail.php:1271 msgid "September" msgstr "" -#: ../form_detail.php:1605 +#: ../form_detail.php:1271 msgid "October" msgstr "" -#: ../form_detail.php:1605 +#: ../form_detail.php:1271 msgid "November" msgstr "" -#: ../form_detail.php:1605 +#: ../form_detail.php:1271 msgid "December" msgstr "" -#: ../form_detail.php:1606 +#: ../form_detail.php:1272 msgid "How Often" msgstr "" -#: ../form_detail.php:1606 +#: ../form_detail.php:1272 msgid "Everyday" msgstr "" -#: ../form_detail.php:1606 +#: ../form_detail.php:1272 msgid "Once a week" msgstr "" -#: ../form_detail.php:1606 +#: ../form_detail.php:1272 msgid "2 to 3 times a week" msgstr "" -#: ../form_detail.php:1606 +#: ../form_detail.php:1272 msgid "Once a month" msgstr "" -#: ../form_detail.php:1606 +#: ../form_detail.php:1272 msgid " 2 to 3 times a month" msgstr "" -#: ../form_detail.php:1606 +#: ../form_detail.php:1272 msgid "Less than once a month" msgstr "" -#: ../form_detail.php:1607 +#: ../form_detail.php:1273 msgid "How Long" msgstr "" -#: ../form_detail.php:1607 +#: ../form_detail.php:1273 msgid "Less than a month" msgstr "" -#: ../form_detail.php:1607 +#: ../form_detail.php:1273 msgid "1-6 months" msgstr "" -#: ../form_detail.php:1607 +#: ../form_detail.php:1273 msgid "1-3 years" msgstr "" -#: ../form_detail.php:1607 +#: ../form_detail.php:1273 msgid "Over 3 Years" msgstr "" -#: ../form_detail.php:1607 +#: ../form_detail.php:1273 msgid "Never used" msgstr "" -#: ../form_detail.php:1608 +#: ../form_detail.php:1274 msgid "Satisfaction" msgstr "" -#: ../form_detail.php:1608 +#: ../form_detail.php:1274 msgid "Very Satisfied" msgstr "" -#: ../form_detail.php:1608 +#: ../form_detail.php:1274 msgid "Satisfied" msgstr "" -#: ../form_detail.php:1608 +#: ../form_detail.php:1274 msgid "Neutral" msgstr "" -#: ../form_detail.php:1608 +#: ../form_detail.php:1274 msgid "Unsatisfied" msgstr "" -#: ../form_detail.php:1608 +#: ../form_detail.php:1274 msgid "Very Unsatisfied" msgstr "" -#: ../form_detail.php:1609 +#: ../form_detail.php:1275 msgid "Importance" msgstr "" -#: ../form_detail.php:1609 +#: ../form_detail.php:1275 msgid "Very Important" msgstr "" -#: ../form_detail.php:1609 +#: ../form_detail.php:1275 msgid "Important" msgstr "" -#: ../form_detail.php:1609 +#: ../form_detail.php:1275 msgid "Somewhat Important" msgstr "" -#: ../form_detail.php:1609 +#: ../form_detail.php:1275 msgid "Not Important" msgstr "" -#: ../form_detail.php:1610 +#: ../form_detail.php:1276 msgid "Agreement" msgstr "" -#: ../form_detail.php:1610 +#: ../form_detail.php:1276 msgid "Strongly Agree" msgstr "" -#: ../form_detail.php:1610 +#: ../form_detail.php:1276 msgid "Agree" msgstr "" -#: ../form_detail.php:1610 +#: ../form_detail.php:1276 msgid "Disagree" msgstr "" -#: ../form_detail.php:1610 +#: ../form_detail.php:1276 msgid "Strongly Disagree" msgstr "" -#: ../form_detail.php:1611 +#: ../form_detail.php:1277 msgid "Comparison" msgstr "" -#: ../form_detail.php:1611 +#: ../form_detail.php:1277 msgid "Much Better" msgstr "" -#: ../form_detail.php:1611 +#: ../form_detail.php:1277 msgid "Somewhat Better" msgstr "" -#: ../form_detail.php:1611 +#: ../form_detail.php:1277 msgid "About the Same" msgstr "" -#: ../form_detail.php:1611 +#: ../form_detail.php:1277 msgid "Somewhat Worse" msgstr "" -#: ../form_detail.php:1611 +#: ../form_detail.php:1277 msgid "Much Worse" msgstr "" -#: ../form_detail.php:1612 +#: ../form_detail.php:1278 msgid "Would You" msgstr "" -#: ../form_detail.php:1612 +#: ../form_detail.php:1278 msgid "Definitely" msgstr "" -#: ../form_detail.php:1612 +#: ../form_detail.php:1278 msgid "Probably" msgstr "" -#: ../form_detail.php:1612 +#: ../form_detail.php:1278 msgid "Not Sure" msgstr "" -#: ../form_detail.php:1612 +#: ../form_detail.php:1278 msgid "Probably Not" msgstr "" -#: ../form_detail.php:1612 +#: ../form_detail.php:1278 msgid "Definitely Not" msgstr "" -#: ../form_detail.php:1613 +#: ../form_detail.php:1279 msgid "Extra Small" msgstr "" -#: ../form_detail.php:1613 +#: ../form_detail.php:1279 msgid "Extra Large" msgstr "" -#: ../form_detail.php:1622 -msgid "Select a category and customize the predefined choices or paste your own list to bulk add choices." +#: ../form_detail.php:1288 +msgid "" +"Select a category and customize the predefined choices or paste your own " +"list to bulk add choices." msgstr "" -#: ../form_detail.php:1640 +#: ../form_detail.php:1306 msgid "Insert Choices" msgstr "" -#: ../form_detail.php:1645 +#: ../form_detail.php:1311 msgid "Save as new custom choice" msgstr "" -#: ../form_detail.php:1647 +#: ../form_detail.php:1313 msgid "Save as" msgstr "" -#: ../form_detail.php:1647 +#: ../form_detail.php:1313 msgid "Enter name" msgstr "" -#: ../form_detail.php:1647 +#: ../form_detail.php:1313 msgid "enter name" msgstr "" -#: ../form_detail.php:1674 +#: ../form_detail.php:1340 msgid "Enable \"other\" choice" msgstr "" -#: ../form_detail.php:1687 +#: ../form_detail.php:1353 msgid "Enable Email Confirmation" msgstr "" -#: ../form_detail.php:1697 +#: ../form_detail.php:1363 msgid "Enable Password Strength" msgstr "" -#: ../form_detail.php:1708 +#: ../form_detail.php:1374 msgid "Enable enhanced user interface" msgstr "" -#: ../form_detail.php:1715 +#: ../form_detail.php:1381 msgid "Minimum Strength" msgstr "" -#: ../form_detail.php:1720 -#: ../form_display.php:1781 +#: ../form_detail.php:1386 ../form_display.php:1940 msgid "Short" msgstr "" -#: ../form_detail.php:1721 -#: ../form_display.php:1781 +#: ../form_detail.php:1387 ../form_display.php:1940 msgid "Bad" msgstr "" -#: ../form_detail.php:1722 -#: ../form_display.php:1781 +#: ../form_detail.php:1388 ../form_display.php:1940 msgid "Good" msgstr "" -#: ../form_detail.php:1723 -#: ../form_display.php:1781 +#: ../form_detail.php:1389 ../form_display.php:1940 msgid "Strong" msgstr "" -#: ../form_detail.php:1733 +#: ../form_detail.php:1399 ../tooltips.php:63 msgid "Number Format" msgstr "" -#: ../form_detail.php:1756 +#: ../form_detail.php:1422 msgid "Supported Credit Cards" msgstr "" -#: ../form_detail.php:1776 +#: ../form_detail.php:1442 msgid "Card Icon Style" msgstr "" -#: ../form_detail.php:1780 -#: ../form_detail.php:1802 +#: ../form_detail.php:1446 ../form_detail.php:1468 msgid "Standard" msgstr "" -#: ../form_detail.php:1781 +#: ../form_detail.php:1447 msgid "3D" msgstr "" -#: ../form_detail.php:1791 +#: ../form_detail.php:1457 ../tooltips.php:116 msgid "Input Mask" msgstr "" -#: ../form_detail.php:1816 +#: ../form_detail.php:1482 msgid "Enter a custom mask" msgstr "" -#: ../form_detail.php:1817 +#: ../form_detail.php:1483 msgid "Custom Mask Instructions" msgstr "" -#: ../form_detail.php:1817 -#: ../gravityforms.php:748 +#: ../form_detail.php:1483 ../gravityforms.php:850 msgid "Help" msgstr "" -#: ../form_detail.php:1822 -#: ../form_detail.php:1945 +#: ../form_detail.php:1488 ../form_detail.php:1611 msgid "Usage" msgstr "" -#: ../form_detail.php:1824 -#: ../form_detail.php:1947 +#: ../form_detail.php:1490 ../form_detail.php:1613 msgid "Use a '9' to indicate a numerical character." msgstr "" -#: ../form_detail.php:1825 -#: ../form_detail.php:1948 +#: ../form_detail.php:1491 ../form_detail.php:1614 msgid "Use a lower case 'a' to indicate an alphabetical character." msgstr "" -#: ../form_detail.php:1826 -#: ../form_detail.php:1949 +#: ../form_detail.php:1492 ../form_detail.php:1615 msgid "Use an asterick '*' to indicate any alphanumeric character." msgstr "" -#: ../form_detail.php:1827 -#: ../form_detail.php:1950 -msgid "Use a question mark '?' to indicate optional characters. Note: All characters after the question mark will be optional." +#: ../form_detail.php:1493 ../form_detail.php:1616 +msgid "" +"Use a question mark '?' to indicate optional characters. Note: All characters after the question mark will be optional." msgstr "" -#: ../form_detail.php:1828 -#: ../form_detail.php:1951 -msgid "All other characters are literal values and will be displayed automatically." +#: ../form_detail.php:1494 ../form_detail.php:1617 +msgid "" +"All other characters are literal values and will be displayed automatically." msgstr "" -#: ../form_detail.php:1831 +#: ../form_detail.php:1497 msgid "Examples" msgstr "" -#: ../form_detail.php:1835 -#: ../form_detail.php:1840 -#: ../form_detail.php:1845 -#: ../form_detail.php:1850 -#: ../form_detail.php:1855 +#: ../form_detail.php:1501 ../form_detail.php:1506 ../form_detail.php:1511 +#: ../form_detail.php:1516 ../form_detail.php:1521 msgid "Mask" msgstr "" -#: ../form_detail.php:1836 -#: ../form_detail.php:1841 -#: ../form_detail.php:1846 -#: ../form_detail.php:1851 -#: ../form_detail.php:1856 +#: ../form_detail.php:1502 ../form_detail.php:1507 ../form_detail.php:1512 +#: ../form_detail.php:1517 ../form_detail.php:1522 msgid "Valid Input" msgstr "" -#: ../form_detail.php:1839 +#: ../form_detail.php:1505 msgid "Social Security Number" msgstr "" -#: ../form_detail.php:1844 +#: ../form_detail.php:1510 msgid "Course Code" msgstr "" -#: ../form_detail.php:1849 +#: ../form_detail.php:1515 msgid "License Key" msgstr "" -#: ../form_detail.php:1854 +#: ../form_detail.php:1520 msgid "Zip Code w/ Optional Plus Four" msgstr "" -#: ../form_detail.php:1864 +#: ../form_detail.php:1530 msgid "Select a Mask" msgstr "" -#: ../form_detail.php:1883 +#: ../form_detail.php:1549 ../tooltips.php:50 msgid "Maximum Characters" msgstr "" -#: ../form_detail.php:1893 +#: ../form_detail.php:1559 msgid "Range" msgstr "" -#: ../form_detail.php:1899 +#: ../form_detail.php:1565 msgid "Min" msgstr "" -#: ../form_detail.php:1905 +#: ../form_detail.php:1571 msgid "Max" msgstr "" -#: ../form_detail.php:1921 +#: ../form_detail.php:1587 ../tooltips.php:74 msgid "Enable Calculation" msgstr "" -#: ../form_detail.php:1929 +#: ../form_detail.php:1595 ../tooltips.php:75 msgid "Formula" msgstr "" -#: ../form_detail.php:1959 +#: ../form_detail.php:1625 ../tooltips.php:76 msgid "Rounding" msgstr "" -#: ../form_detail.php:1984 +#: ../form_detail.php:1649 msgid "Rules" msgstr "" -#: ../form_detail.php:1987 +#: ../form_detail.php:1652 msgid "Required" msgstr "" -#: ../form_detail.php:1993 +#: ../form_detail.php:1658 ../tooltips.php:72 msgid "No Duplicates" msgstr "" -#: ../form_detail.php:2011 +#: ../form_detail.php:1676 ../tooltips.php:77 msgid "Admin Label" msgstr "" -#: ../form_detail.php:2021 +#: ../form_detail.php:1686 ../tooltips.php:78 msgid "Field Size" msgstr "" -#: ../form_detail.php:2035 -#: ../form_detail.php:2046 +#: ../form_detail.php:1700 ../form_detail.php:1710 ../tooltips.php:79 msgid "Default Value" msgstr "" -#: ../form_detail.php:2056 +#: ../form_detail.php:1720 ../tooltips.php:80 msgid "Validation Message" msgstr "" -#: ../form_detail.php:2066 +#: ../form_detail.php:1730 ../tooltips.php:65 msgid "Credit Card Icon Style" msgstr "" -#: ../form_detail.php:2086 +#: ../form_detail.php:1750 msgid "Language" msgstr "" -#: ../form_detail.php:2090 +#: ../form_detail.php:1754 msgid "English" msgstr "" -#: ../form_detail.php:2091 +#: ../form_detail.php:1755 msgid "Dutch" msgstr "" -#: ../form_detail.php:2092 +#: ../form_detail.php:1756 msgid "French" msgstr "" -#: ../form_detail.php:2093 +#: ../form_detail.php:1757 msgid "German" msgstr "" -#: ../form_detail.php:2094 +#: ../form_detail.php:1758 msgid "Portuguese" msgstr "" -#: ../form_detail.php:2095 +#: ../form_detail.php:1759 msgid "Russian" msgstr "" -#: ../form_detail.php:2096 +#: ../form_detail.php:1760 msgid "Spanish" msgstr "" -#: ../form_detail.php:2097 +#: ../form_detail.php:1761 msgid "Turkish" msgstr "" -#: ../form_detail.php:2115 +#: ../form_detail.php:1779 ../tooltips.php:36 msgid "Add Icon URL" msgstr "" -#: ../form_detail.php:2125 +#: ../form_detail.php:1789 ../tooltips.php:37 msgid "Delete Icon URL" msgstr "" -#: ../form_detail.php:2134 +#: ../form_detail.php:1798 msgid "Enable Password Input" msgstr "" -#: ../form_detail.php:2141 +#: ../form_detail.php:1805 ../tooltips.php:64 msgid "Force SSL" msgstr "" -#: ../form_detail.php:2148 +#: ../form_detail.php:1812 ../tooltips.php:83 msgid "Visibility" msgstr "" -#: ../form_detail.php:2152 +#: ../form_detail.php:1816 msgid "Everyone" msgstr "" -#: ../form_detail.php:2157 +#: ../form_detail.php:1821 msgid "Admin Only" msgstr "" -#: ../form_detail.php:2166 +#: ../form_detail.php:1830 msgid "Allow field to be populated dynamically" msgstr "" -#: ../form_detail.php:2187 +#: ../form_detail.php:1840 ../form_settings.php:479 +msgid "Enable Conditional Logic" +msgstr "" + +#: ../form_detail.php:1851 msgid "Enable Page Conditional Logic" msgstr "" -#: ../form_detail.php:2199 +#: ../form_detail.php:1863 msgid "Enable Next Button Conditional Logic" msgstr "" -#: ../form_detail.php:2278 +#: ../form_detail.php:1942 ../tooltips.php:119 msgid "Post Fields" msgstr "" -#: ../form_detail.php:2282 +#: ../form_detail.php:1946 ../tooltips.php:120 msgid "Pricing Fields" msgstr "" -#: ../form_detail.php:2310 +#: ../form_detail.php:1972 msgid "Delete this Form" msgstr "" -#: ../form_detail.php:2310 -msgid "Would you like to delete this form and ALL entries associated with it? \\'Cancel\\' to stop. \\'OK\\' to delete" +#: ../form_detail.php:1972 +msgid "" +"Would you like to delete this form and ALL entries associated with it? " +"\\'Cancel\\' to stop. \\'OK\\' to delete" msgstr "" -#: ../form_detail.php:2310 +#: ../form_detail.php:1972 msgid "Delete Form" msgstr "" -#: ../form_detail.php:2314 +#: ../form_detail.php:1976 msgid "Update Form" msgstr "" -#: ../form_detail.php:2314 +#: ../form_detail.php:1976 msgid "Save Form" msgstr "" -#: ../form_detail.php:2325 -#: ../form_list.php:224 -#: ../gravityforms.php:1551 +#: ../form_detail.php:1987 ../gravityforms.php:2084 msgid "Preview" msgstr "" -#: ../form_detail.php:2466 -msgid "Insert variable" +#: ../form_detail.php:2278 ../forms_model.php:373 +msgid "Admin Notification" msgstr "" -#: ../form_detail.php:2475 -msgid "HTTP Referer URL" +#: ../form_detail.php:2281 +msgid "New submission from" msgstr "" -#: ../form_detail.php:2582 -msgid "New submission from" +#: ../form_detail.php:2295 ../forms_model.php:3272 +msgid "Default Confirmation" msgstr "" -#: ../form_display.php:371 +#: ../form_display.php:386 msgid "Oops! We could not locate your form." msgstr "" -#: ../form_display.php:388 +#: ../form_display.php:403 msgid "Sorry. You must be logged in to view this form." msgstr "" -#: ../form_display.php:494 +#: ../form_display.php:509 msgid "There was a problem with your submission." msgstr "" -#: ../form_display.php:494 +#: ../form_display.php:509 msgid "Errors have been highlighted below." msgstr "" -#: ../form_display.php:525 -#: ../form_display.php:1962 +#: ../form_display.php:540 ../form_display.php:2119 msgid "Previous Page" msgstr "" -#: ../form_display.php:965 -#: ../form_display.php:1188 -#: ../form_display.php:1299 -#: ../form_display.php:1311 +#: ../form_display.php:776 +msgid "This field is for validation purposes and should be left unchanged." +msgstr "" + +#: ../form_display.php:1027 ../form_display.php:1256 ../form_display.php:1360 +#: ../form_display.php:1376 ../includes/addon/class-gf-addon.php:1237 msgid "This field is required." msgstr "" -#: ../form_display.php:974 +#: ../form_display.php:1038 msgid "This date has already been taken. Please select a new date." msgstr "" -#: ../form_display.php:978 -msgid "This field requires an unique entry and the values you entered have been already been used." +#: ../form_display.php:1042 +msgid "" +"This field requires an unique entry and the values you entered have been " +"already been used." msgstr "" -#: ../form_display.php:979 +#: ../form_display.php:1043 #, php-format msgid "This field requires an unique entry and '%s' has already been used" msgstr "" -#: ../form_display.php:989 +#: ../form_display.php:1053 msgid "Please enter a valid value." msgstr "" -#: ../form_display.php:989 +#: ../form_display.php:1053 msgid "Invalid selection. Please select one of the available choices." msgstr "" -#: ../form_display.php:998 +#: ../form_display.php:1062 msgid "Your passwords do not match." msgstr "" -#: ../form_display.php:1006 -msgid "Your password does not meet the required strength.
            Hint: To make it stronger, use upper and lower case letters, numbers and symbols like ! \" ? $ % ^ & )." +#: ../form_display.php:1070 +msgid "" +"Your password does not meet the required strength.
            Hint: To make it " +"stronger, use upper and lower case letters, numbers and symbols like ! \" ? " +"$ % ^ & )." msgstr "" -#: ../form_display.php:1018 +#: ../form_display.php:1082 msgid "This field is required. Please enter the first and last name." msgstr "" -#: ../form_display.php:1034 +#: ../form_display.php:1098 msgid "This field is required. Please enter a complete address." msgstr "" -#: ../form_display.php:1047 +#: ../form_display.php:1111 msgid "Please enter your credit card information." msgstr "" -#: ../form_display.php:1055 +#: ../form_display.php:1119 msgid "Please enter your card's security code." msgstr "" -#: ../form_display.php:1059 +#: ../form_display.php:1123 msgid "Invalid credit card number." msgstr "" -#: ../form_display.php:1063 +#: ../form_display.php:1127 msgid "is not supported. Please enter one of the supported credit cards." msgstr "" -#: ../form_display.php:1071 +#: ../form_display.php:1135 msgid "Please enter a valid email address." msgstr "" -#: ../form_display.php:1077 +#: ../form_display.php:1141 msgid "Your emails do not match." msgstr "" -#: ../form_display.php:1091 +#: ../form_display.php:1155 msgid "Please enter a valid amount." msgstr "" -#: ../form_display.php:1149 +#: ../form_display.php:1168 +msgid "Please enter a valid quantity. Quantity cannot contain decimals." +msgstr "" + +#: ../form_display.php:1217 #, php-format msgid "Please enter a valid date in the format (%s)." msgstr "" -#: ../form_display.php:1149 +#: ../form_display.php:1217 msgid "Please enter a valid date." msgstr "" -#: ../form_display.php:1179 +#: ../form_display.php:1247 msgid "Please enter a valid time." msgstr "" -#: ../form_display.php:1194 +#: ../form_display.php:1262 msgid "Please enter a valid Website URL (i.e. http://www.gravityforms.com)." msgstr "" -#: ../form_display.php:1207 -#: ../form_display.php:1242 +#: ../form_display.php:1275 ../form_display.php:1310 msgid "The CAPTCHA wasn't entered correctly. Go back and try it again." msgstr "" -#: ../form_display.php:1263 +#: ../form_display.php:1331 msgid "The reCAPTCHA wasn't entered correctly. Go back and try it again." msgstr "" -#: ../form_display.php:1276 +#: ../form_display.php:1344 msgid "The uploaded file type is not allowed." msgstr "" -#: ../form_display.php:1280 +#: ../form_display.php:1348 #, php-format msgid "The uploaded file type is not allowed. Must be one of the following: %s" msgstr "" -#: ../form_display.php:1295 +#: ../form_display.php:1364 msgid "Please enter a valid quantity" msgstr "" -#: ../form_display.php:1721 +#: ../form_display.php:1881 msgid "No results matched" msgstr "" -#: ../form_display.php:1738 -#: ../form_display.php:2209 +#: ../form_display.php:1897 ../form_display.php:2372 ../gravityforms.php:1259 msgid "of" msgstr "" -#: ../form_display.php:1738 +#: ../form_display.php:1897 msgid "max characters" msgstr "" -#: ../form_display.php:1781 +#: ../form_display.php:1940 msgid "Mismatch" msgstr "" -#: ../form_display.php:1961 -#: ../js.php:380 +#: ../form_display.php:2118 ../js.php:387 msgid "Next" msgstr "" -#: ../form_display.php:1961 +#: ../form_display.php:2118 msgid "Next Page" msgstr "" -#: ../form_display.php:2051 +#: ../form_display.php:2208 msgid "click to duplicate this field" msgstr "" -#: ../form_display.php:2051 -#: ../form_list.php:232 +#: ../form_display.php:2208 ../form_list.php:384 msgid "Duplicate" msgstr "" -#: ../form_display.php:2054 +#: ../form_display.php:2211 msgid "click to delete this field" msgstr "" -#: ../form_display.php:2057 +#: ../form_display.php:2214 msgid "Field ID" msgstr "" -#: ../form_display.php:2057 +#: ../form_display.php:2214 msgid "click to edit this field" msgstr "" -#: ../form_display.php:2123 -msgid "This page is unsecured. Do not enter a real credit card number. Use this field only for testing purposes. " +#: ../form_display.php:2286 +msgid "" +"This page is unsecured. Do not enter a real credit card number. Use this " +"field only for testing purposes. " msgstr "" -#: ../form_display.php:2209 +#: ../form_display.php:2372 msgid "Step" msgstr "" -#: ../form_display.php:2236 +#: ../form_display.php:2399 msgid "Sorry. This form is no longer accepting new submissions." msgstr "" -#: ../form_display.php:2252 +#: ../form_display.php:2415 msgid "Sorry. This form is no longer available." msgstr "" -#: ../form_list.php:72 -#: ../form_list.php:130 -#: ../form_list.php:214 -msgid "Inactive" +#: ../form_list.php:21 +msgid "Form deleted." msgstr "" -#: ../form_list.php:76 -#: ../form_list.php:129 -#: ../form_list.php:214 -msgid "Active" +#: ../form_list.php:27 +msgid "Form duplicated." +msgstr "" + +#: ../form_list.php:105 +msgid "Create a New Form" +msgstr "" + +#: ../form_list.php:119 +msgid "Creating Form..." +msgstr "" + +#: ../form_list.php:143 +msgid "Saved! Redirecting..." +msgstr "" + +#: ../form_list.php:192 ../tooltips.php:30 +msgid "Form Description" +msgstr "" + +#: ../form_list.php:197 +msgid "Create Form" msgstr "" -#: ../form_list.php:90 +#: ../form_list.php:240 msgid "Ajax error while update form" msgstr "" -#: ../form_list.php:104 -#: ../form_list.php:235 -msgid "WARNING: You are about to delete this form and ALL entries associated with it. " +#: ../form_list.php:254 ../form_list.php:394 +msgid "" +"WARNING: You are about to delete this form and ALL entries associated with " +"it. " msgstr "" -#: ../form_list.php:104 -#: ../form_list.php:108 -#: ../form_list.php:235 +#: ../form_list.php:254 ../form_list.php:258 ../form_settings.php:1376 +#: ../notification.php:1035 ../includes/addon/class-gf-feed-addon.php:405 msgid "\\'Cancel\\' to stop, \\'OK\\' to delete." msgstr "" -#: ../form_list.php:106 +#: ../form_list.php:256 msgid "Are you sure you would like to reset the Views for the selected forms? " msgstr "" -#: ../form_list.php:106 +#: ../form_list.php:256 msgid "\\'Cancel\\' to stop, \\'OK\\' to reset." msgstr "" -#: ../form_list.php:108 -msgid "WARNING: You are about to delete ALL entries associated with the selected forms. " +#: ../form_list.php:258 +msgid "" +"WARNING: You are about to delete ALL entries associated with the selected " +"forms. " msgstr "" -#: ../form_list.php:119 -#: ../gravityforms.php:728 -msgid "Edit Forms" +#: ../form_list.php:269 ../gravityforms.php:827 ../gravityforms.php:830 +#: ../gravityforms.php:1128 +msgid "Forms" msgstr "" -#: ../form_list.php:120 +#: ../form_list.php:270 ../form_settings.php:858 ../notification.php:422 +#: ../includes/addon/class-gf-feed-addon.php:218 +#: ../includes/addon/class-gf-feed-addon.php:284 msgid "Add New" msgstr "" -#: ../form_list.php:143 -#: ../form_list.php:286 +#: ../form_list.php:298 ../form_list.php:442 +msgid "Mark as Active" +msgstr "" + +#: ../form_list.php:299 ../form_list.php:443 +msgid "Mark as Inactive" +msgstr "" + +#: ../form_list.php:300 ../form_list.php:444 msgid "Reset Views" msgstr "" -#: ../form_list.php:144 -#: ../form_list.php:287 +#: ../form_list.php:301 ../form_list.php:445 msgid "Delete Entries" msgstr "" -#: ../form_list.php:170 -#: ../form_list.php:188 +#: ../form_list.php:327 ../form_list.php:345 msgid "Id" msgstr "" -#: ../form_list.php:172 -#: ../form_list.php:190 +#: ../form_list.php:329 ../form_list.php:347 msgid "Views" msgstr "" -#: ../form_list.php:174 -#: ../form_list.php:192 +#: ../form_list.php:331 ../form_list.php:349 msgid "Conversion" msgstr "" -#: ../form_list.php:227 -msgid "View entries generated by this form" -msgstr "" - -#: ../form_list.php:229 -msgid "Edit notifications sent by this form" +#: ../form_list.php:385 +msgid "Duplicate this form" msgstr "" -#: ../form_list.php:232 -msgid "Duplicate this form" +#: ../form_list.php:394 +msgid "\\\"Cancel\\\" to stop, \\\"OK\\\" to delete." msgstr "" -#: ../form_list.php:269 +#: ../form_list.php:425 #, php-format msgid "You don't have any forms. Let's go %screate one%s!" msgstr "" -#: ../gravityforms.php:724 -msgid "Update Available" +#: ../form_list.php:463 ../form_list.php:490 +msgid "There was an issue creating your form." msgstr "" -#: ../gravityforms.php:725 -#: ../gravityforms.php:989 -msgid "Forms" +#: ../form_list.php:473 +msgid "Please enter a form title." msgstr "" -#: ../gravityforms.php:739 -#: ../gravityforms.php:929 -msgid "Settings" +#: ../form_list.php:494 +msgid "Please enter an unique form title." msgstr "" -#: ../gravityforms.php:741 -msgid "Import/Export" +#: ../form_settings.php:92 ../form_settings.php:774 ../form_settings.php:1170 +#: ../gravityforms.php:2054 +msgid "Form Settings" msgstr "" -#: ../gravityforms.php:744 -msgid "Updates" +#: ../form_settings.php:264 +msgid "" +"The form title you have entered has already been used. Please enter an " +"unique form title." msgstr "" -#: ../gravityforms.php:745 -#: ../help.php:39 -msgid "Add-Ons" +#: ../form_settings.php:304 +msgid "Form title" msgstr "" -#: ../gravityforms.php:854 -msgid "Add Gravity Form" +#: ../form_settings.php:318 +msgid "Form description" msgstr "" -#: ../gravityforms.php:865 -msgid "Please select a form" +#: ../form_settings.php:329 +msgid "Top aligned" msgstr "" -#: ../gravityforms.php:885 -msgid "Insert A Form" +#: ../form_settings.php:330 +msgid "Left aligned" msgstr "" -#: ../gravityforms.php:887 -msgid "Select a form below to add it to your post or page." +#: ../form_settings.php:331 +msgid "Right aligned" msgstr "" -#: ../gravityforms.php:892 -msgid "Select a Form" +#: ../form_settings.php:344 +msgid "Label placement" msgstr "" -#: ../gravityforms.php:902 -msgid "Can't find your form? Make sure it is active." +#: ../form_settings.php:359 +msgid "Below inputs" msgstr "" -#: ../gravityforms.php:905 -msgid "Display form title" +#: ../form_settings.php:360 +msgid "Above inputs" msgstr "" -#: ../gravityforms.php:906 -msgid "Display form description" +#: ../form_settings.php:371 +msgid "Description placement" msgstr "" -#: ../gravityforms.php:907 -msgid "Enable AJAX" +#: ../form_settings.php:419 +msgid "Input type" msgstr "" -#: ../gravityforms.php:944 -msgid "There is a new version of Gravity Forms available." +#: ../form_settings.php:425 ../form_settings.php:996 ../form_settings.php:1433 +msgid "Text" msgstr "" -#: ../gravityforms.php:944 -#, php-format -msgid "View version %s Details" +#: ../form_settings.php:443 +msgid "Button text" msgstr "" -#: ../gravityforms.php:945 -msgid "
            Register your copy of Gravity Forms to receive access to automatic upgrades and support. Need a license key? Purchase one now." +#: ../form_settings.php:457 +msgid "Button image path" msgstr "" -#: ../gravityforms.php:974 -msgid "Oops!! Something went wrong.
            Please try again or contact us." +#: ../form_settings.php:475 +msgid "Button conditional logic" msgstr "" -#: ../gravityforms.php:1016 -#: ../gravityforms.php:1019 -msgid "View All Entries" +#: ../form_settings.php:505 +msgid "total entries" msgstr "" -#: ../gravityforms.php:1018 -#, php-format -msgid "Last Entry: %s" +#: ../form_settings.php:506 +msgid "per day" msgstr "" -#: ../gravityforms.php:1029 -msgid "View All Forms" +#: ../form_settings.php:507 +msgid "per week" msgstr "" -#: ../gravityforms.php:1036 -#, php-format -msgid "You don't have any forms. Let's go %s create one %s!" +#: ../form_settings.php:508 +msgid "per month" msgstr "" -#: ../gravityforms.php:1066 -#, php-format -msgid "There is an update available for Gravity Forms. %sView Details%s %s" +#: ../form_settings.php:509 +msgid "per year" msgstr "" -#: ../gravityforms.php:1069 -msgid "Dismiss" +#: ../form_settings.php:519 +msgid "Limit number of entries" msgstr "" -#: ../gravityforms.php:1168 -msgid "Add-On browser is currently unavailable. Please try again later." +#: ../form_settings.php:523 +msgid "Enable entry limit" msgstr "" -#: ../gravityforms.php:1300 -msgid "There was an error while resending the notifications." +#: ../form_settings.php:533 +msgid "Number of Entries" msgstr "" -#: ../gravityforms.php:1312 -msgid "The Send To email address provided is not valid." +#: ../form_settings.php:552 +msgid "Entry Limit Reached Message" msgstr "" -#: ../gravityforms.php:1535 -msgid "Form Editor" +#: ../form_settings.php:619 ../form_settings.php:623 +msgid "Schedule form" msgstr "" -#: ../gravityforms.php:1562 -msgid "Switch Form" +#: ../form_settings.php:632 +msgid "Schedule Start Date/Time" msgstr "" -#: ../help.php:13 -msgid "Gravity Forms Help" +#: ../form_settings.php:657 +msgid "Schedule Form End Date/Time" msgstr "" -#: ../help.php:17 -msgid "IMPORTANT NOTICE: We do not provide support via e-mail. Please post any support queries in our support forums." +#: ../form_settings.php:682 +msgid "Form Expired Message" msgstr "" -#: ../help.php:19 -msgid "Please review the plugin documentation and frequently asked questions (FAQ) first. If you still can't find the answer you need visit our support forums where we will be happy to answer your questions and assist you with any problems. Please note: If you have not purchased a license from us, you won't have access to these help resources." +#: ../form_settings.php:698 +msgid "Anti-spam honeypot" msgstr "" -#: ../help.php:24 -msgid "Gravity Forms Documentation" +#: ../form_settings.php:702 +msgid "Enable anti-spam honeypot" msgstr "" -#: ../help.php:25 -msgid "Note: Only licensed Gravity Forms customers are granted access to the documentation section." +#: ../form_settings.php:714 +msgid "Animated transitions" msgstr "" -#: ../help.php:33 -msgid "Documentation (please select a topic)" +#: ../form_settings.php:718 +msgid "Enable animations" msgstr "" -#: ../help.php:34 -msgid "Getting Started" +#: ../form_settings.php:734 ../form_settings.php:738 ../tooltips.php:89 +msgid "Require user to be logged in" msgstr "" -#: ../help.php:36 -msgid "Using Gravity Forms" +#: ../form_settings.php:747 ../tooltips.php:90 +msgid "Require Login Message" msgstr "" -#: ../help.php:37 -msgid "Design and Layout" +#: ../form_settings.php:763 +msgid "Form Basics" msgstr "" -#: ../help.php:38 -msgid "Developer Docs" +#: ../form_settings.php:764 +msgid "Form Layout" msgstr "" -#: ../help.php:40 -msgid "How To" +#: ../form_settings.php:765 +msgid "Form Button" msgstr "" -#: ../help.php:44 -#: ../help.php:70 -#: ../help.php:120 -#: ../help.php:145 -msgid "GO" +#: ../form_settings.php:766 +msgid "Restrictions" msgstr "" -#: ../help.php:53 -msgid "Gravity Forms FAQ" +#: ../form_settings.php:767 +msgid "Form Options" msgstr "" -#: ../help.php:54 -msgid "Please Note: Only licensed Gravity Forms customers are granted access to the FAQ section." +#: ../form_settings.php:823 +msgid "Update Form Settings" msgstr "" -#: ../help.php:62 -msgid "FAQ (please select a topic)" +#: ../form_settings.php:851 ../form_settings.php:857 ../form_settings.php:896 +#: ../form_settings.php:1171 +msgid "Confirmations" msgstr "" -#: ../help.php:63 -msgid "Installation Questions" +#: ../form_settings.php:942 +msgid "Save Confirmation" msgstr "" -#: ../help.php:64 -msgid "Formatting/Styling Questions" +#: ../form_settings.php:985 +msgid "Confirmation Name" msgstr "" -#: ../help.php:65 -msgid "Notification Questions" +#: ../form_settings.php:992 +msgid "Confirmation Type" msgstr "" -#: ../help.php:66 -msgid "General Questions" +#: ../form_settings.php:1002 ../form_settings.php:1034 +#: ../form_settings.php:1436 ../js.php:78 +msgid "Page" msgstr "" -#: ../help.php:80 -msgid "Gravity Forms Support Forums" +#: ../form_settings.php:1008 ../form_settings.php:1439 +msgid "Redirect" msgstr "" -#: ../help.php:81 -msgid "Please Note: Only licensed Gravity Forms customers are granted access to the support forums." +#: ../form_settings.php:1018 ../notification.php:755 +msgid "Message" msgstr "" -#: ../help.php:89 -msgid "Forums (please select a topic)" +#: ../form_settings.php:1023 +msgid "Disable Auto-formatting" msgstr "" -#: ../help.php:90 -msgid "General" +#: ../form_settings.php:1036 +msgid "Select a page" msgstr "" -#: ../help.php:91 -msgid "News & Announcements" +#: ../form_settings.php:1045 +msgid "Redirect URL" msgstr "" -#: ../help.php:92 -msgid "Pre-Sale Questions" +#: ../form_settings.php:1056 +msgid "Redirect Query String" msgstr "" -#: ../help.php:94 -msgid "Feature Requests" +#: ../form_settings.php:1058 +msgid "Pass Field Data Via Query String" msgstr "" -#: ../help.php:95 -msgid "Testimonials" +#: ../form_settings.php:1061 +msgid "Sample: phone={Phone:1}&email={Email:2}" msgstr "" -#: ../help.php:97 -msgid "Plugin Support" +#: ../form_settings.php:1070 ../notification.php:798 ../tooltips.php:86 +#: ../tooltips.php:100 +msgid "Conditional Logic" msgstr "" -#: ../help.php:98 -#: ../help.php:140 -msgid "Gravity Forms" +#: ../form_settings.php:1210 +msgid "You must specify a Confirmation Name." msgstr "" -#: ../help.php:102 -msgid "Gravity Forms MailChimp Add-On" +#: ../form_settings.php:1217 +msgid "You must select a Confirmation Page." msgstr "" -#: ../help.php:103 -msgid "Gravity Forms Campaign Monitor Add-On" +#: ../form_settings.php:1223 +msgid "You must specify a Redirect URL." msgstr "" -#: ../help.php:108 -msgid "Gravity Forms FreshBooks Add-On" +#: ../form_settings.php:1241 +#, php-format +msgid "Confirmation saved successfully. %sBack to confirmations.%s" msgstr "" -#: ../help.php:109 -msgid "Gravity Forms PayPal Add-On" +#: ../form_settings.php:1261 +msgid "Confirmation deleted." msgstr "" -#: ../help.php:110 -msgid "Gravity Forms User Registration Add-On" +#: ../form_settings.php:1375 ../notification.php:1034 +msgid "Edit this item" msgstr "" -#: ../help.php:130 -msgid "Gravity Forms Downloads" +#: ../form_settings.php:1376 ../notification.php:1035 +msgid "Delete this item" msgstr "" -#: ../help.php:131 -msgid "Please Note: Only licensed Gravity Forms customers are granted access to the downloads section." +#: ../form_settings.php:1376 +msgid "WARNING: You are about to delete this confirmation." msgstr "" -#: ../help.php:139 -msgid "Downloads (please select a product)" +#: ../form_settings.php:1416 +msgid "This page does not exist." msgstr "" -#: ../help.php:141 -msgid "Gravity Forms Add-Ons" +#: ../forms_model.php:398 +msgid "User Notification" msgstr "" -#: ../help.php:156 -msgid "Gravity Forms Tutorials & Resources" +#: ../forms_model.php:575 ../forms_model.php:916 +msgid "You don't have adequate permission to delete entries." msgstr "" -#: ../help.php:157 -msgid "Please note: The Gravity Forms support team does not provide support for third party scripts, widgets, etc." +#: ../forms_model.php:629 +msgid "You don't have adequate permission to delete forms." msgstr "" -#: ../js.php:6 -msgid "Delete this custom choice list? 'OK' to delete, 'Cancel' to abort." +#: ../forms_model.php:657 +msgid "You don't have adequate permission to create forms." msgstr "" -#: ../js.php:20 -msgid "Item has been deleted." +#: ../forms_model.php:965 +msgid "You don't have adequate permission to delete notes." msgstr "" -#: ../js.php:27 -msgid "Please enter name." +#: ../forms_model.php:996 +msgid "You don't have adequate permission to edit entries." msgstr "" -#: ../js.php:31 -msgid "This custom choice name is already in use. Please enter another name." +#: ../gravityforms.php:825 +msgid "Update Available" msgstr "" -#: ../js.php:50 -msgid "Item has been saved." +#: ../gravityforms.php:841 ../gravityforms.php:1067 ../gravityforms.php:2054 +#: ../settings.php:411 +msgid "Settings" msgstr "" -#: ../js.php:61 -#: ../js.php:221 -msgid "To use conditional logic, please create a drop down, checkbox or radio button field." +#: ../gravityforms.php:843 +msgid "Import/Export" msgstr "" -#: ../js.php:113 -msgid "Completed" +#: ../gravityforms.php:846 +msgid "Updates" msgstr "" -#: ../js.php:131 -msgid "Close" +#: ../gravityforms.php:847 ../help.php:39 +msgid "Add-Ons" msgstr "" -#: ../js.php:147 -msgid "Select a category" +#: ../gravityforms.php:976 ../gravityforms.php:991 +msgid "Add Gravity Form" msgstr "" -#: ../js.php:160 -msgid "Parameter Name:" +#: ../gravityforms.php:991 +msgid "Add Form" msgstr "" -#: ../js.php:205 -msgid "Deleted Field" +#: ../gravityforms.php:1003 +msgid "Please select a form" msgstr "" -#: ../js.php:242 -msgid "Column 1" +#: ../gravityforms.php:1023 +msgid "Insert A Form" msgstr "" -#: ../js.php:242 -msgid "Column 2" +#: ../gravityforms.php:1025 +msgid "Select a form below to add it to your post or page." msgstr "" -#: ../js.php:242 -msgid "Column 3" +#: ../gravityforms.php:1030 ../widget.php:74 +msgid "Select a Form" msgstr "" -#: ../js.php:258 -msgid "The form title you have entered is already taken. Please enter an unique form title" +#: ../gravityforms.php:1040 +msgid "Can't find your form? Make sure it is active." msgstr "" -#: ../js.php:264 -msgid "Please enter a Title for this form. When adding the form to a page or post, you will have the option to hide the title." +#: ../gravityforms.php:1043 ../widget.php:88 +msgid "Display form title" msgstr "" -#: ../js.php:275 -msgid "Your form currently has one ore more pages without any fields in it. Blank pages are a result of Page Breaks that are positioned as the first or last field in the form or right after to each other. Please adjust your Page Breaks and try again." +#: ../gravityforms.php:1044 ../widget.php:89 +msgid "Display form description" msgstr "" -#: ../js.php:283 -msgid "" -"Your form currently has a product field with a blank label. \\n" -"Please enter a label for all product fields." +#: ../gravityforms.php:1045 ../widget.php:95 +msgid "Enable AJAX" msgstr "" -#: ../js.php:292 -msgid "" -"Your form currently has an option field without a product field.\\n" -"You must add a product field to your form." +#: ../gravityforms.php:1081 ../update.php:30 +msgid "There is a new version of Gravity Forms available." msgstr "" -#: ../js.php:329 -msgid "Ajax error while saving form" +#: ../gravityforms.php:1081 ../includes/addon/class-gf-auto-upgrade.php:51 +#: ../includes/addon/class-gf-auto-upgrade.php:135 +#, php-format +msgid "View version %s Details" msgstr "" -#: ../js.php:338 -msgid "Warning! Deleting this field will also delete all entry data associated with it. \\'Cancel\\' to stop. \\'OK\\' to delete" +#: ../gravityforms.php:1083 +msgid "Please try again or contact us." msgstr "" -#: ../js.php:420 -#: ../js.php:433 -#: ../js.php:445 -#: ../js.php:662 -msgid "Untitled" +#: ../gravityforms.php:1155 ../gravityforms.php:1158 +msgid "View All Entries" msgstr "" -#: ../js.php:423 -#: ../js.php:437 -#: ../js.php:438 -#: ../js.php:449 -#: ../js.php:450 -msgid "First Choice" +#: ../gravityforms.php:1157 +#, php-format +msgid "Last Entry: %s" msgstr "" -#: ../js.php:423 -#: ../js.php:437 -#: ../js.php:438 -#: ../js.php:449 -#: ../js.php:450 -msgid "Second Choice" +#: ../gravityforms.php:1168 +msgid "View All Forms" msgstr "" -#: ../js.php:423 -#: ../js.php:437 -#: ../js.php:438 -#: ../js.php:449 -#: ../js.php:450 -msgid "Third Choice" +#: ../gravityforms.php:1175 +#, php-format +msgid "You don't have any forms. Let's go %s create one %s!" msgstr "" -#: ../js.php:458 -msgid "State / Province" +#: ../gravityforms.php:1205 +#, php-format +msgid "There is an update available for Gravity Forms. %sView Details%s %s" msgstr "" -#: ../js.php:468 -msgid "Card Type" +#: ../gravityforms.php:1208 +msgid "Dismiss" msgstr "" -#: ../js.php:469 -msgid "Cardholder\\'s Name" +#: ../gravityforms.php:1256 +msgid "Next >" msgstr "" -#: ../js.php:523 -msgid "Hidden Field" +#: ../gravityforms.php:1257 +msgid "< Prev" msgstr "" -#: ../js.php:527 -msgid "Post Title" +#: ../gravityforms.php:1260 ../js.php:130 +msgid "Close" msgstr "" -#: ../js.php:531 -msgid "Post Body" +#: ../gravityforms.php:1261 +msgid "" +"This feature requires inline frames. You have iframes disabled or your " +"browser does not support them." msgstr "" -#: ../js.php:535 -msgid "Post Excerpt" +#: ../gravityforms.php:1534 +msgid "Add-On browser is currently unavailable. Please try again later." msgstr "" -#: ../js.php:540 -msgid "Post Tags" +#: ../gravityforms.php:1670 +msgid "There was an error while resending the notifications." msgstr "" -#: ../js.php:547 -msgid "Post Custom Field" +#: ../gravityforms.php:1676 +msgid "" +"No notifications have been selected. Please select a notification to be sent." msgstr "" -#: ../js.php:550 -msgid "Post Image" +#: ../gravityforms.php:1679 +msgid "The Send To email address provided is not valid." msgstr "" -#: ../js.php:558 -msgid "Captcha" +#: ../gravityforms.php:1947 +msgid "Switch Form" msgstr "" -#: ../js.php:566 -msgid "Product Name" +#: ../gravityforms.php:2041 +msgid "Edit this form" msgstr "" -#: ../js.php:608 -msgid "First Option" +#: ../gravityforms.php:2055 +msgid "Edit settings for this form" msgstr "" -#: ../js.php:608 -msgid "Second Option" +#: ../gravityforms.php:2071 +msgid "View entries generated by this form" msgstr "" -#: ../js.php:608 -msgid "Third Option" +#: ../help.php:13 +msgid "Gravity Forms Help" msgstr "" -#: ../js.php:619 -msgid "Donation" +#: ../help.php:17 +msgid "" +"IMPORTANT NOTICE: We do not provide support via e-mail. " +"Please post any support queries in our support forums." msgstr "" -#: ../js.php:693 -msgid "Only one reCAPTCHA field can be added to the form." +#: ../help.php:19 +msgid "" +"Please review the plugin documentation and frequently asked questions (FAQ) first. " +"If you still can't find the answer you need visit our support forums where we will be happy to answer your " +"questions and assist you with any problems. Please note: If " +"you have not purchased a license from us, you won't have access to these help " +"resources." msgstr "" -#: ../js.php:704 -msgid "Only one Shipping field can be added to the form" +#: ../help.php:24 +msgid "Gravity Forms Documentation" msgstr "" -#: ../js.php:711 -msgid "Only one Post Content field can be added to the form" +#: ../help.php:25 +msgid "" +"Note: Only licensed Gravity Forms customers are granted " +"access to the documentation section." msgstr "" -#: ../js.php:717 -msgid "Only one Post Title field can be added to the form" +#: ../help.php:33 +msgid "Documentation (please select a topic)" msgstr "" -#: ../js.php:723 -msgid "Only one Post Excerpt field can be added to the form" +#: ../help.php:34 +msgid "Getting Started" msgstr "" -#: ../js.php:729 -msgid "Only one credit card field can be added to the form" +#: ../help.php:36 +msgid "Using Gravity Forms" msgstr "" -#: ../js.php:752 -msgid "Ajax error while adding field" +#: ../help.php:37 +msgid "Design and Layout" msgstr "" -#: ../js.php:768 -msgid "Ajax error while duplicating field" +#: ../help.php:38 +msgid "Developer Docs" msgstr "" -#: ../js.php:793 -msgid "Ajax error while changing input type" +#: ../help.php:40 +msgid "How To" msgstr "" -#: ../js.php:812 -msgid "this field if" +#: ../help.php:44 ../help.php:70 ../help.php:120 ../help.php:145 +msgid "GO" msgstr "" -#: ../js.php:814 -msgid "this page" +#: ../help.php:53 +msgid "Gravity Forms FAQ" msgstr "" -#: ../js.php:816 -msgid "this form button" +#: ../help.php:54 +msgid "" +"Please Note: Only licensed Gravity Forms customers are " +"granted access to the FAQ section." msgstr "" -#: ../js.php:818 -msgid "Show" +#: ../help.php:62 +msgid "FAQ (please select a topic)" msgstr "" -#: ../js.php:818 -msgid "Hide" +#: ../help.php:63 +msgid "Installation Questions" msgstr "" -#: ../js.php:820 -msgid "Any" +#: ../help.php:64 +msgid "Formatting/Styling Questions" msgstr "" -#: ../js.php:821 -msgid "of the following match:" +#: ../help.php:65 +msgid "Notification Questions" msgstr "" -#: ../js.php:833 -#: ../notification.php:180 -#: ../notification.php:449 -msgid "is" +#: ../help.php:66 +msgid "General Questions" msgstr "" -#: ../js.php:833 -#: ../notification.php:181 -#: ../notification.php:450 -msgid "is not" +#: ../help.php:80 +msgid "Gravity Forms Support Forums" msgstr "" -#: ../js.php:833 -#: ../notification.php:182 -#: ../notification.php:451 -msgid "greater than" +#: ../help.php:81 +msgid "" +"Please Note: Only licensed Gravity Forms customers are " +"granted access to the support forums." msgstr "" -#: ../js.php:833 -#: ../notification.php:183 -#: ../notification.php:452 -msgid "less than" +#: ../help.php:89 +msgid "Forums (please select a topic)" msgstr "" -#: ../js.php:833 -#: ../notification.php:184 -#: ../notification.php:453 -msgid "contains" +#: ../help.php:90 +msgid "General" msgstr "" -#: ../js.php:833 -#: ../notification.php:185 -#: ../notification.php:454 -msgid "starts with" +#: ../help.php:91 +msgid "News & Announcements" msgstr "" -#: ../js.php:833 -#: ../notification.php:186 -#: ../notification.php:455 -msgid "ends with" +#: ../help.php:92 +msgid "Pre-Sale Questions" msgstr "" -#: ../js.php:871 -msgid "add another choice" +#: ../help.php:94 +msgid "Feature Requests" msgstr "" -#: ../js.php:874 -msgid "remove this choice" +#: ../help.php:95 +msgid "Testimonials" msgstr "" -#: ../js.php:905 -msgid "Select a field" +#: ../help.php:97 +msgid "Plugin Support" msgstr "" -#: ../js.php:905 -msgid "User IP Address" +#: ../help.php:98 ../help.php:140 +msgid "Gravity Forms" msgstr "" -#: ../notification.php:177 -#: ../notification.php:446 -msgid "Send to" +#: ../help.php:102 +msgid "Gravity Forms MailChimp Add-On" msgstr "" -#: ../notification.php:178 -#: ../notification.php:447 -msgid "if" +#: ../help.php:103 +msgid "Gravity Forms Campaign Monitor Add-On" msgstr "" -#: ../notification.php:325 -#: ../notification.php:893 -msgid "Enter value" +#: ../help.php:108 +msgid "Gravity Forms FreshBooks Add-On" msgstr "" -#: ../notification.php:381 -msgid "Notification to Administrator" +#: ../help.php:109 +msgid "Gravity Forms PayPal Add-On" msgstr "" -#: ../notification.php:386 -msgid "Enable email notification to administrators" +#: ../help.php:110 +msgid "Gravity Forms User Registration Add-On" msgstr "" -#: ../notification.php:389 -msgid "Enter a message below to receive a notification email when users submit this form." +#: ../help.php:130 +msgid "Gravity Forms Downloads" msgstr "" -#: ../notification.php:398 -msgid "Send To Email" +#: ../help.php:131 +msgid "" +"Please Note: Only licensed Gravity Forms customers are " +"granted access to the downloads section." msgstr "" -#: ../notification.php:409 -msgid "Routing" +#: ../help.php:139 +msgid "Downloads (please select a product)" msgstr "" -#: ../notification.php:417 -msgid "Please enter a valid email address" +#: ../help.php:141 +msgid "Gravity Forms Add-Ons" msgstr "" -#: ../notification.php:428 -msgid "To use notification routing, your form must have a field supported by conditional logic." +#: ../help.php:156 +msgid "Gravity Forms Tutorials & Resources" msgstr "" -#: ../notification.php:467 -msgid "Please enter a valid email address for all highlighted routing rules above." +#: ../help.php:157 +msgid "" +"Please note: The Gravity Forms support team does not " +"provide support for third party scripts, widgets, etc." msgstr "" -#: ../notification.php:479 -#: ../notification.php:663 -msgid "From Name" +#: ../js.php:6 +msgid "Delete this custom choice list? 'OK' to delete, 'Cancel' to abort." msgstr "" -#: ../notification.php:486 -#: ../notification.php:511 -#: ../notification.php:537 -msgid "OR" +#: ../js.php:20 +msgid "Item has been deleted." msgstr "" -#: ../notification.php:488 -msgid "Select a name field" +#: ../js.php:27 +msgid "Please enter name." msgstr "" -#: ../notification.php:504 -#: ../notification.php:670 -msgid "From Email" +#: ../js.php:31 +msgid "This custom choice name is already in use. Please enter another name." msgstr "" -#: ../notification.php:513 -#: ../notification.php:539 -msgid "Select an email field" +#: ../js.php:50 +msgid "Item has been saved." msgstr "" -#: ../notification.php:530 -msgid "Reply To" +#: ../js.php:61 ../js.php:223 +msgid "" +"To use conditional logic, please create a drop down, checkbox or radio " +"button field." msgstr "" -#: ../notification.php:555 -#: ../notification.php:684 -msgid "BCC" +#: ../js.php:113 +msgid "Completed" msgstr "" -#: ../notification.php:567 -#: ../notification.php:697 -msgid "Subject" +#: ../js.php:146 +msgid "Select a category" msgstr "" -#: ../notification.php:575 -msgid "Please enter a subject for the notification email" +#: ../js.php:159 +msgid "Parameter Name:" msgstr "" -#: ../notification.php:586 -#: ../notification.php:716 -msgid "Message" +#: ../js.php:188 +msgid "" +"This field is not associated with a product. Please add a Product Field to " +"the form." msgstr "" -#: ../notification.php:598 -msgid "Please enter a message for the notification email" +#: ../js.php:206 +msgid "Deleted Field" msgstr "" -#: ../notification.php:619 -msgid "Notification to User" +#: ../js.php:244 +msgid "Column 1" msgstr "" -#: ../notification.php:630 -#, php-format -msgid "Your form does not have any %semail%s field." +#: ../js.php:244 +msgid "Column 2" msgstr "" -#: ../notification.php:632 -#, php-format -msgid "Sending notifications to users require that the form has at least one email field. %sEdit your form%s" +#: ../js.php:244 +msgid "Column 3" msgstr "" -#: ../notification.php:639 -msgid "Enable email notification to users" +#: ../js.php:260 +msgid "" +"The form title you have entered is already taken. Please enter an unique " +"form title" msgstr "" -#: ../notification.php:643 -msgid "Enter a message below to send users an automatic response when they submit this form." +#: ../js.php:266 +msgid "" +"Please enter a Title for this form. When adding the form to a page or post, " +"you will have the option to hide the title." msgstr "" -#: ../notification.php:647 -msgid "Send To Field" +#: ../js.php:277 +msgid "" +"Your form currently has one ore more pages without any fields in it. Blank " +"pages are a result of Page Breaks that are positioned as the first or last " +"field in the form or right after to each other. Please adjust your Page " +"Breaks and try again." msgstr "" -#: ../notification.php:677 -msgid "Reply To (optional)" +#: ../js.php:285 +msgid "" +"Your form currently has a product field with a blank label. \\nPlease enter " +"a label for all product fields." msgstr "" -#: ../notification.php:705 -msgid "Please enter a subject for the user notification email" +#: ../js.php:294 +msgid "" +"Your form currently has an option field without a product field.\\nYou must " +"add a product field to your form." msgstr "" -#: ../notification.php:729 -msgid "Please enter a message for the user notification email" +#: ../js.php:337 +msgid "Ajax error while saving form" msgstr "" -#: ../notification.php:755 -msgid "Save Settings" +#: ../js.php:346 +msgid "" +"Warning! Deleting this field will also delete all entry data associated with " +"it. \\'Cancel\\' to stop. \\'OK\\' to delete" msgstr "" -#: ../notification.php:768 -msgid "Notification Updated." +#: ../js.php:393 +msgid "HTML Block" msgstr "" -#: ../notification.php:775 -msgid "Notification could not be updated. Please enter all required information below." +#: ../js.php:427 ../js.php:440 ../js.php:452 ../js.php:669 +msgid "Untitled" msgstr "" -#: ../preview.php:21 -msgid "You don't have adequate permission to preview forms." +#: ../js.php:430 ../js.php:444 ../js.php:445 ../js.php:456 ../js.php:457 +msgid "First Choice" msgstr "" -#: ../preview.php:30 -#: ../preview.php:50 -msgid "Form Preview" +#: ../js.php:430 ../js.php:444 ../js.php:445 ../js.php:456 ../js.php:457 +msgid "Second Choice" msgstr "" -#: ../preview.php:50 -#: ../print-entry.php:57 -msgid "close window" +#: ../js.php:430 ../js.php:444 ../js.php:445 ../js.php:456 ../js.php:457 +msgid "Third Choice" msgstr "" -#: ../preview.php:52 -msgid "Note: This is a simple form preview. This form may display differently when added to your page based on inheritance from individual theme styles." +#: ../js.php:465 +msgid "State / Province" msgstr "" -#: ../print-entry.php:21 -msgid "You don't have adequate permission to view entries." +#: ../js.php:475 +msgid "Card Type" msgstr "" -#: ../print-entry.php:31 -msgid "Form Id and Lead Id are required parameters." +#: ../js.php:476 +msgid "Cardholder\\'s Name" msgstr "" -#: ../print-entry.php:57 -msgid "Print Preview" +#: ../js.php:530 +msgid "Hidden Field" msgstr "" -#: ../select_columns.php:21 -msgid "Oops! We could not locate your form. Please try again." +#: ../js.php:534 +msgid "Post Title" msgstr "" -#: ../select_columns.php:97 -msgid "Drag & drop to order and select which columns are displayed in the entries table." +#: ../js.php:538 +msgid "Post Body" msgstr "" -#: ../select_columns.php:100 -msgid "Active Columns" +#: ../js.php:542 +msgid "Post Excerpt" msgstr "" -#: ../select_columns.php:115 -msgid "Inactive Columns" +#: ../js.php:547 +msgid "Post Tags" msgstr "" -#: ../settings.php:14 -msgid "Gravity Forms Settings" +#: ../js.php:554 +msgid "Post Custom Field" msgstr "" -#: ../settings.php:67 -msgid "You don't have adequate permission to edit settings." +#: ../js.php:557 +msgid "Post Image" msgstr "" -#: ../settings.php:88 -msgid "Settings Updated" +#: ../js.php:565 +msgid "Captcha" msgstr "" -#: ../settings.php:95 -msgid "You don't have adequate permission to uninstall Gravity Forms." +#: ../js.php:573 +msgid "Product Name" msgstr "" -#: ../settings.php:120 -#, php-format -msgid "Gravity Forms have been successfully uninstalled. It can be re-activated from the %splugins page%s." +#: ../js.php:615 +msgid "First Option" msgstr "" -#: ../settings.php:130 -msgid "General Settings" +#: ../js.php:615 +msgid "Second Option" msgstr "" -#: ../settings.php:133 -msgid "Support License Key" +#: ../js.php:615 +msgid "Third Option" msgstr "" -#: ../settings.php:146 -msgid "The license key is used for access to automatic upgrades and support." +#: ../js.php:626 +msgid "Donation" msgstr "" -#: ../settings.php:150 -#: ../tooltips.php:131 -msgid "Output CSS" +#: ../js.php:700 +msgid "Only one reCAPTCHA field can be added to the form." msgstr "" -#: ../settings.php:152 -#: ../settings.php:160 -#: ../settings.php:179 -msgid "Yes" +#: ../js.php:711 +msgid "Only one Shipping field can be added to the form" msgstr "" -#: ../settings.php:153 -#: ../settings.php:161 -#: ../settings.php:180 -msgid "No" +#: ../js.php:718 +msgid "Only one Post Content field can be added to the form" msgstr "" -#: ../settings.php:154 -msgid "Set this to No if you would like to disable the plugin from outputting the form CSS." +#: ../js.php:724 +msgid "Only one Post Title field can be added to the form" msgstr "" -#: ../settings.php:158 -#: ../tooltips.php:132 -msgid "Output HTML5" +#: ../js.php:730 +msgid "Only one Post Excerpt field can be added to the form" msgstr "" -#: ../settings.php:162 -msgid "Set this to No if you would like to disable the plugin from outputting HTML5 form fields." +#: ../js.php:736 +msgid "Only one credit card field can be added to the form" msgstr "" -#: ../settings.php:167 -#: ../tooltips.php:133 -msgid "No-Conflict Mode" +#: ../js.php:743 +msgid "You must add a product field to the form first" msgstr "" -#: ../settings.php:169 -msgid "On" +#: ../js.php:765 +msgid "Ajax error while adding field" msgstr "" -#: ../settings.php:170 -msgid "Off" +#: ../js.php:791 +msgid "Ajax error while duplicating field" msgstr "" -#: ../settings.php:171 -msgid "Set this to On to prevent extraneous scripts and styles from being printed on Gravity Forms admin pages, reducing conflicts with other plugins and themes." +#: ../js.php:815 +msgid "Ajax error while changing input type" msgstr "" -#: ../settings.php:177 -#: ../tooltips.php:137 -msgid "Akismet Integration" +#: ../js.php:840 +msgid "Drag to re-order" msgstr "" -#: ../settings.php:181 -#: ../tooltips.php:137 -msgid "Protect your form entries from spam using Akismet." +#: ../js.php:851 +msgid "add another choice" msgstr "" -#: ../settings.php:187 -#: ../tooltips.php:136 -msgid "Currency" +#: ../js.php:854 +msgid "remove this choice" msgstr "" -#: ../settings.php:212 -msgid "reCAPTCHA Settings" +#: ../js.php:885 +msgid "Select a field" msgstr "" -#: ../settings.php:214 -msgid "Gravity Forms integrates with reCAPTCHA, a free CAPTCHA service that helps to digitize books while protecting your forms from spam bots. " +#: ../js.php:885 +msgid "User IP Address" msgstr "" -#: ../settings.php:214 -msgid "Read more about reCAPTCHA" +#: ../notification.php:83 +#, php-format +msgid "Notification saved successfully. %sBack to notifications.%s" msgstr "" -#: ../settings.php:220 -msgid "reCAPTCHA Public Key" +#: ../notification.php:86 +msgid "" +"Notification could not be updated. Please enter all required information " +"below." msgstr "" -#: ../settings.php:223 -#: ../settings.php:230 -msgid "Required only if you decide to use the reCAPTCHA field." +#: ../notification.php:188 ../notification.php:642 +msgid "Send to" msgstr "" -#: ../settings.php:223 -#: ../settings.php:230 -#, php-format -msgid "%sSign up%s for a free account to get the key." +#: ../notification.php:189 ../notification.php:643 +msgid "if" msgstr "" -#: ../settings.php:227 -msgid "reCAPTCHA Private Key" +#: ../notification.php:336 ../notification.php:928 +msgid "Enter value" msgstr "" -#: ../settings.php:265 -msgid "Installation Status" +#: ../notification.php:400 +msgid "Save Notification" msgstr "" -#: ../settings.php:269 -msgid "PHP Version" +#: ../notification.php:400 +msgid "Update Notification" msgstr "" -#: ../settings.php:283 -msgid "Gravity Forms requires PHP 5 or above." +#: ../notification.php:459 +msgid "Notification deleted." msgstr "" -#: ../settings.php:290 -msgid "MySQL Version" +#: ../notification.php:461 +msgid "There was an issue deleting this notification." msgstr "" -#: ../settings.php:304 -msgid "Gravity Forms requires MySQL 5 or above." +#: ../notification.php:506 +msgid "Form is submitted" msgstr "" -#: ../settings.php:311 -msgid "WordPress Version" +#: ../notification.php:512 +msgid "Event" msgstr "" -#: ../settings.php:325 -msgid "Gravity Forms requires WordPress 3.0 or above." +#: ../notification.php:555 +msgid "Select a Field" msgstr "" -#: ../settings.php:332 -msgid "Gravity Forms Version" +#: ../notification.php:560 +msgid "Configure Routing" msgstr "" -#: ../settings.php:344 -#, php-format -msgid "New version %s available. Automatic upgrade available on the %splugins page%s" +#: ../notification.php:569 +msgid "Send to Email" msgstr "" -#: ../settings.php:357 -#: ../settings.php:360 -msgid "Uninstall Gravity Forms" +#: ../notification.php:577 +msgid "Please enter a valid email address" msgstr "" -#: ../settings.php:358 -msgid "Warning" +#: ../notification.php:587 +msgid "Send to Field" msgstr "" -#: ../settings.php:358 -msgid "This operation deletes ALL Gravity Forms data. If you continue, You will not be able to retrieve or restore your forms or entries." +#: ../notification.php:593 +msgid "Select an email field" msgstr "" -#: ../settings.php:360 -msgid "Warning! ALL Gravity Forms data, including form entries will be deleted. This cannot be undone. \\'OK\\' to delete, \\'Cancel\\' to stop" +#: ../notification.php:606 +msgid "" +"Your form does not have an email field. Add an email field to your form and " +"try again." msgstr "" -#: ../tooltips.php:17 -msgid "Send To Email Address" +#: ../notification.php:624 +msgid "" +"To use notification routing, your form must have a field supported by " +"conditional logic." msgstr "" -#: ../tooltips.php:17 -msgid "Enter the email address you would like the administrator notification email sent to." +#: ../notification.php:663 +msgid "" +"Please enter a valid email address for all highlighted routing rules above." msgstr "" -#: ../tooltips.php:18 -#: ../tooltips.php:44 -msgid "Disable Auto-Formatting" +#: ../notification.php:678 ../tooltips.php:21 +msgid "From Name" msgstr "" -#: ../tooltips.php:18 -msgid "When enabled, auto-formatting will insert paragraph breaks automatically. Disable auto-formatting when using HTML to create email notification content." +#: ../notification.php:691 +msgid "From Email" msgstr "" -#: ../tooltips.php:19 -msgid "Allows notification to be sent to different email addresses depending on values selected in the form." +#: ../notification.php:704 ../tooltips.php:22 +msgid "Reply To" msgstr "" -#: ../tooltips.php:20 -#: ../tooltips.php:26 -msgid "From Email Address" +#: ../notification.php:717 +msgid "BCC" msgstr "" -#: ../tooltips.php:20 -msgid "Enter the email address you would like the administrator notification email sent from, or select the email from available email form fields." +#: ../notification.php:734 ../notification.php:978 +msgid "Subject" msgstr "" -#: ../tooltips.php:21 -msgid "Enter the name you would like the administrator notification email sent from, or select the name from available name fields." +#: ../notification.php:741 +msgid "Please enter a subject for the notification email" msgstr "" -#: ../tooltips.php:22 -msgid "Enter the email address you would like to be used as the reply to address for the administrator notification email." +#: ../notification.php:771 +msgid "Please enter a message for the notification email" msgstr "" -#: ../tooltips.php:23 -#: ../tooltips.php:24 -#: ../tooltips.php:25 -msgid "Blind Carbon Copy Addresses" +#: ../notification.php:781 +msgid "Auto-formatting" msgstr "" -#: ../tooltips.php:23 -msgid "Enter a comma separated list of email addresses you would like to receive a BCC of the administrator notification email." +#: ../notification.php:788 +msgid "Disable auto-formatting" msgstr "" -#: ../tooltips.php:24 -msgid "Select the email form field that the user notification email should be sent to." +#: ../notification.php:803 +msgid "Enable conditional logic" msgstr "" -#: ../tooltips.php:25 -msgid "Enter a comma separated list of email addresses you would like to receive a BCC of the user notification email." +#: ../notification.php:1035 +msgid "WARNING: You are about to delete this notification." msgstr "" -#: ../tooltips.php:26 -msgid "Enter the email address you would like the user notification email sent from." +#: ../notification.php:1067 +#, php-format +msgid "This form doesn't have any notifications. Let's go %screate one%s." msgstr "" -#: ../tooltips.php:27 -msgid "Enter the name you would like the user notification email sent from." +#: ../preview.php:21 +msgid "You don't have adequate permission to preview forms." msgstr "" -#: ../tooltips.php:28 -msgid "Reply To Address" +#: ../preview.php:29 ../preview.php:62 +msgid "Form Preview" msgstr "" -#: ../tooltips.php:28 -msgid "Enter the email address you would like to be used as the reply to address for the user notification email." +#: ../preview.php:62 ../print-entry.php:65 +msgid "close window" msgstr "" -#: ../tooltips.php:29 -msgid "Limit Form Activity" +#: ../preview.php:64 +msgid "" +"Note: This is a simple form preview. This form may display differently when " +"added to your page based on inheritance from individual theme styles." msgstr "" -#: ../tooltips.php:29 -msgid "Limit the number of entries a form can generate and/or schedule a time period the form is active." +#: ../print-entry.php:21 +msgid "You don't have adequate permission to view entries." msgstr "" -#: ../tooltips.php:30 -msgid "Limit Number of Entries" +#: ../print-entry.php:31 +msgid "Form Id and Lead Id are required parameters." msgstr "" -#: ../tooltips.php:30 -msgid "Enter a number in the input box below to limit the number of entries allowed for this form. The form will become inactive when that number is reached." +#: ../print-entry.php:65 +msgid "Print Preview" msgstr "" -#: ../tooltips.php:31 -msgid "Schedule Form" +#: ../select_columns.php:24 +msgid "Oops! We could not locate your form. Please try again." msgstr "" -#: ../tooltips.php:31 -msgid "Schedule a time period the form is active." +#: ../select_columns.php:100 +msgid "" +"Drag & drop to order and select which columns are displayed in the entries " +"table." msgstr "" -#: ../tooltips.php:32 -msgid "Enable Anti-spam honeypot" +#: ../select_columns.php:103 +msgid "Active Columns" msgstr "" -#: ../tooltips.php:32 -msgid "Enables the honeypot spam protection technique, which is an alternative to the reCAPTCHA field." +#: ../select_columns.php:118 +msgid "Inactive Columns" msgstr "" -#: ../tooltips.php:33 -msgid "Enable Animation" +#: ../settings.php:47 ../settings.php:90 +msgid "Uninstall Gravity Forms" msgstr "" -#: ../tooltips.php:33 -msgid "Check this option to enable a sliding animation when displaying/hiding conditional logic fields." +#: ../settings.php:51 +msgid "You don't have adequate permission to uninstall Gravity Forms." msgstr "" -#: ../tooltips.php:34 -msgid "Enter the title of your form." +#: ../settings.php:76 +#, php-format +msgid "" +"Gravity Forms have been successfully uninstalled. It can be re-activated " +"from the %splugins page%s." msgstr "" -#: ../tooltips.php:35 -msgid "Form Description" +#: ../settings.php:86 +msgid "Warning" msgstr "" -#: ../tooltips.php:35 -msgid "Enter a description for your form. This may be used for user instructions." +#: ../settings.php:87 +msgid "" +"This operation deletes ALL Gravity Forms data. If you continue, You will not " +"be able to retrieve or restore your forms or entries." msgstr "" -#: ../tooltips.php:36 -msgid "Form Label Placement" +#: ../settings.php:90 +msgid "" +"Warning! ALL Gravity Forms data, including form entries will be deleted. " +"This cannot be undone. \\'OK\\' to delete, \\'Cancel\\' to stop" msgstr "" -#: ../tooltips.php:36 -msgid "Select the label placement. Labels can be top aligned above a field, left aligned to the left of a field, or right aligned to the left of a field." +#: ../settings.php:117 +msgid "You don't have adequate permission to edit settings." msgstr "" -#: ../tooltips.php:37 -msgid "Select the description placement. Descriptions can be placed above the field inputs or below the field inputs." +#: ../settings.php:138 +msgid "Settings Updated" msgstr "" -#: ../tooltips.php:38 -msgid "Form Button Text" +#: ../settings.php:145 ../settings.php:149 +msgid "General Settings" msgstr "" -#: ../tooltips.php:38 -msgid "Enter the text you would like to appear on the form submit button." +#: ../settings.php:152 +msgid "Support License Key" msgstr "" -#: ../tooltips.php:39 -msgid "Form Button Image" +#: ../settings.php:165 +msgid "The license key is used for access to automatic upgrades and support." msgstr "" -#: ../tooltips.php:39 -msgid "Enter the path to an image you would like to use as the form submit button." +#: ../settings.php:169 ../tooltips.php:126 +msgid "Output CSS" msgstr "" -#: ../tooltips.php:40 -msgid "Form CSS Class Name" +#: ../settings.php:171 ../settings.php:179 ../settings.php:198 +msgid "Yes" msgstr "" -#: ../tooltips.php:40 -msgid "Enter the CSS class name you would like to use in order to override the default styles for this form." +#: ../settings.php:172 ../settings.php:180 ../settings.php:199 +msgid "No" msgstr "" -#: ../tooltips.php:41 -msgid "Enter the URL of a custom image to replace the default 'add item' icon." +#: ../settings.php:173 +msgid "" +"Set this to No if you would like to disable the plugin from outputting the " +"form CSS." msgstr "" -#: ../tooltips.php:42 -msgid "Enter the URL of a custom image to replace the default 'delete item' icon." +#: ../settings.php:177 ../tooltips.php:127 +msgid "Output HTML5" msgstr "" -#: ../tooltips.php:43 -msgid "Confirmation Message Text" +#: ../settings.php:181 +msgid "" +"Set this to No if you would like to disable the plugin from outputting HTML5 " +"form fields." msgstr "" -#: ../tooltips.php:43 -msgid "Enter the text you would like the user to see on the confirmation page of this form." +#: ../settings.php:186 ../tooltips.php:128 +msgid "No-Conflict Mode" msgstr "" -#: ../tooltips.php:44 -msgid "When enabled, auto-formatting will insert paragraph breaks automatically. Disable auto-formatting when using HTML to create the confirmation content." +#: ../settings.php:188 +msgid "On" msgstr "" -#: ../tooltips.php:45 -msgid "Redirect Form to Page" +#: ../settings.php:189 +msgid "Off" msgstr "" -#: ../tooltips.php:45 -msgid "Select the page you would like the user to be redirected to after they have submitted the form." +#: ../settings.php:190 +msgid "" +"Set this to On to prevent extraneous scripts and styles from being printed " +"on Gravity Forms admin pages, reducing conflicts with other plugins and " +"themes." msgstr "" -#: ../tooltips.php:46 -msgid "Redirect Form to URL" +#: ../settings.php:196 ../tooltips.php:132 +msgid "Akismet Integration" msgstr "" -#: ../tooltips.php:46 -msgid "Enter the URL of the webpage you would like the user to be redirected to after they have submitted the form." +#: ../settings.php:200 ../tooltips.php:132 +msgid "Protect your form entries from spam using Akismet." msgstr "" -#: ../tooltips.php:47 -msgid "Pass Data Via Query String" +#: ../settings.php:206 ../tooltips.php:131 +msgid "Currency" msgstr "" -#: ../tooltips.php:47 -msgid "To pass field data to the confirmation page, build a Query String using the 'Insert Merge Tag' drop down. ..more info on querystrings »" +#: ../settings.php:231 +msgid "reCAPTCHA Settings" msgstr "" -#: ../tooltips.php:48 -msgid "Enter the label of the form field. This is the field title the user will see when filling out the form." +#: ../settings.php:233 +msgid "" +"Gravity Forms integrates with reCAPTCHA, a free CAPTCHA service that helps " +"to digitize books while protecting your forms from spam bots. " msgstr "" -#: ../tooltips.php:49 -msgid "Enter the label for this HTML block. It will help you identify your HTML blocks in the form editor, but it will not be displayed on the form." +#: ../settings.php:233 +msgid "Read more about reCAPTCHA" msgstr "" -#: ../tooltips.php:50 -msgid "Disable Default Margins" +#: ../settings.php:239 +msgid "reCAPTCHA Public Key" msgstr "" -#: ../tooltips.php:50 -msgid "When enabled, margins are added to properly align the HTML content with other form fields." +#: ../settings.php:242 ../settings.php:249 +msgid "Required only if you decide to use the reCAPTCHA field." msgstr "" -#: ../tooltips.php:51 -msgid "Recaptcha Theme" +#: ../settings.php:242 ../settings.php:249 +#, php-format +msgid "%sSign up%s for a free account to get the key." msgstr "" -#: ../tooltips.php:51 -msgid "Select the visual theme for the reCAPTCHA field the available options to better match your site design." +#: ../settings.php:246 +msgid "reCAPTCHA Private Key" msgstr "" -#: ../tooltips.php:52 -msgid "CAPTCHA Type" +#: ../settings.php:259 ../includes/addon/class-gf-addon.php:769 +msgid "Save Settings" msgstr "" -#: ../tooltips.php:52 -msgid "Select the type of CAPTCHA you would like to use." +#: ../settings.php:283 +msgid "Installation Status" msgstr "" -#: ../tooltips.php:53 -msgid "Select the custom field name from available existing custom fields, or enter a new custom field name." +#: ../settings.php:287 +msgid "PHP Version" msgstr "" -#: ../tooltips.php:54 -msgid "Field type" +#: ../settings.php:301 +msgid "Gravity Forms requires PHP 5 or above." msgstr "" -#: ../tooltips.php:54 -msgid "Select the type of field from the available form fields." +#: ../settings.php:308 +msgid "MySQL Version" msgstr "" -#: ../tooltips.php:55 -msgid "Enter the maximum number of characters that this field is allowed to have." +#: ../settings.php:322 +msgid "Gravity Forms requires MySQL 5 or above." msgstr "" -#: ../tooltips.php:56 -msgid "Enter the maximum number of rows that users are allowed to add." +#: ../settings.php:329 +msgid "WordPress Version" msgstr "" -#: ../tooltips.php:57 -msgid "Select the type of inputs you would like to use for the date field. Date Picker will let users select a date from a calendar. Date Field will let users free type the date." +#: ../settings.php:343 +#, php-format +msgid "" +"Gravity Forms requires WordPress v%s or greater. You must upgrade WordPress " +"in order to use this version of Gravity Forms." msgstr "" -#: ../tooltips.php:58 -msgid "Select the type of address you would like to use." +#: ../settings.php:350 +msgid "Gravity Forms Version" msgstr "" -#: ../tooltips.php:59 -msgid "Default State" +#: ../settings.php:362 +#, php-format +msgid "" +"New version %s available. Automatic upgrade available on the %splugins page%s" msgstr "" -#: ../tooltips.php:59 -msgid "Select the state you would like to be selected by default when the form gets displayed." +#: ../settings.php:428 +msgid "Uninstall" msgstr "" -#: ../tooltips.php:60 -msgid "Default Province" +#: ../tooltips.php:17 +msgid "Send To Email Address" msgstr "" -#: ../tooltips.php:60 -msgid "Select the province you would like to be selected by default when the form gets displayed." +#: ../tooltips.php:17 +msgid "Enter the email address you would like the notification email sent to." msgstr "" -#: ../tooltips.php:61 -msgid "Select the country you would like to be selected by default when the form gets displayed." +#: ../tooltips.php:18 ../tooltips.php:39 +msgid "Disable Auto-Formatting" msgstr "" -#: ../tooltips.php:62 -msgid "Hide Country" +#: ../tooltips.php:18 +msgid "" +"When enabled, auto-formatting will insert paragraph breaks automatically. " +"Disable auto-formatting when using HTML to create email notification content." msgstr "" -#: ../tooltips.php:62 -msgid "For addresses that only apply to one country, you can choose to not display the country drop down. Entries will still be recorded with the selected country." +#: ../tooltips.php:19 +msgid "Routing" msgstr "" -#: ../tooltips.php:63 -msgid "Hide Address Line 2" +#: ../tooltips.php:19 +msgid "" +"Allows notification to be sent to different email addresses depending on " +"values selected in the form." msgstr "" -#: ../tooltips.php:63 -msgid "Check this box to prevent the extra address input (Address Line 2) from being displayed in the form." +#: ../tooltips.php:20 +msgid "From Email Address" msgstr "" -#: ../tooltips.php:64 -msgid "Hide State Field" +#: ../tooltips.php:20 +msgid "" +"Enter the email address you would like the notification email sent from, or " +"select the email from available email form fields." msgstr "" -#: ../tooltips.php:64 -msgid "Check this box to prevent the State field from being displayed in the form." +#: ../tooltips.php:21 +msgid "" +"Enter the name you would like the notification email sent from, or select " +"the name from available name fields." msgstr "" -#: ../tooltips.php:65 -msgid "Hide Province Field" +#: ../tooltips.php:22 +msgid "" +"Enter the email address you would like to be used as the reply to address " +"for the notification email." msgstr "" -#: ../tooltips.php:65 -msgid "Check this box to prevent Province field from being displayed in the form." +#: ../tooltips.php:23 +msgid "Blind Carbon Copy Addresses" msgstr "" -#: ../tooltips.php:66 -msgid "Hide State/Province/Region" +#: ../tooltips.php:23 +msgid "" +"Enter a comma separated list of email addresses you would like to receive a " +"BCC of the notification email." msgstr "" -#: ../tooltips.php:66 -msgid "Check this box to prevent the State/Province/Region from being displayed in the form." +#: ../tooltips.php:24 +msgid "Limit Form Activity" msgstr "" -#: ../tooltips.php:67 -msgid "Field Name Format" +#: ../tooltips.php:24 +msgid "" +"Limit the number of entries a form can generate and/or schedule a time " +"period the form is active." msgstr "" -#: ../tooltips.php:67 -msgid "Select the format you would like to use for the Name field. There are 3 options, Normal which includes First and Last Name, Extended which adds Prefix and Suffix, or Simple which is a single input field." +#: ../tooltips.php:25 +msgid "Limit Number of Entries" msgstr "" -#: ../tooltips.php:68 -msgid "Select the format of numbers that are allowed in this field. You have the option to use a comma or a dot as the decimal separator." +#: ../tooltips.php:25 +msgid "" +"Enter a number in the input box below to limit the number of entries allowed " +"for this form. The form will become inactive when that number is reached." msgstr "" -#: ../tooltips.php:69 -msgid "Check this box to prevent this field from being displayed in a non-secure page (i.e. not https://). It will redirect the page to the same URL, but starting with https:// instead. This option requires a properly configured SSL certificate." +#: ../tooltips.php:26 +msgid "Schedule Form" msgstr "" -#: ../tooltips.php:70 -msgid "Select the style you would like to use for the credit card icons." +#: ../tooltips.php:26 +msgid "Schedule a time period the form is active." msgstr "" -#: ../tooltips.php:71 +#: ../tooltips.php:27 +msgid "Enable Anti-spam honeypot" +msgstr "" + +#: ../tooltips.php:27 +msgid "" +"Enables the honeypot spam protection technique, which is an alternative to " +"the reCAPTCHA field." +msgstr "" + +#: ../tooltips.php:28 +msgid "Enable Animation" +msgstr "" + +#: ../tooltips.php:28 +msgid "" +"Check this option to enable a sliding animation when displaying/hiding " +"conditional logic fields." +msgstr "" + +#: ../tooltips.php:29 +msgid "Enter the title of your form." +msgstr "" + +#: ../tooltips.php:30 +msgid "" +"Enter a description for your form. This may be used for user instructions." +msgstr "" + +#: ../tooltips.php:31 +msgid "Form Label Placement" +msgstr "" + +#: ../tooltips.php:31 +msgid "" +"Select the label placement. Labels can be top aligned above a field, left " +"aligned to the left of a field, or right aligned to the left of a field." +msgstr "" + +#: ../tooltips.php:32 +msgid "Description Placement" +msgstr "" + +#: ../tooltips.php:32 +msgid "" +"Select the description placement. Descriptions can be placed above the " +"field inputs or below the field inputs." +msgstr "" + +#: ../tooltips.php:33 +msgid "Form Button Text" +msgstr "" + +#: ../tooltips.php:33 +msgid "Enter the text you would like to appear on the form submit button." +msgstr "" + +#: ../tooltips.php:34 +msgid "Form Button Image" +msgstr "" + +#: ../tooltips.php:34 +msgid "" +"Enter the path to an image you would like to use as the form submit button." +msgstr "" + +#: ../tooltips.php:35 +msgid "Form CSS Class Name" +msgstr "" + +#: ../tooltips.php:35 +msgid "" +"Enter the CSS class name you would like to use in order to override the " +"default styles for this form." +msgstr "" + +#: ../tooltips.php:36 +msgid "Enter the URL of a custom image to replace the default 'add item' icon." +msgstr "" + +#: ../tooltips.php:37 +msgid "" +"Enter the URL of a custom image to replace the default 'delete item' icon." +msgstr "" + +#: ../tooltips.php:38 +msgid "Confirmation Message Text" +msgstr "" + +#: ../tooltips.php:38 +msgid "" +"Enter the text you would like the user to see on the confirmation page of " +"this form." +msgstr "" + +#: ../tooltips.php:39 +msgid "" +"When enabled, auto-formatting will insert paragraph breaks automatically. " +"Disable auto-formatting when using HTML to create the confirmation content." +msgstr "" + +#: ../tooltips.php:40 +msgid "Redirect Form to Page" +msgstr "" + +#: ../tooltips.php:40 +msgid "" +"Select the page you would like the user to be redirected to after they have " +"submitted the form." +msgstr "" + +#: ../tooltips.php:41 +msgid "Redirect Form to URL" +msgstr "" + +#: ../tooltips.php:41 +msgid "" +"Enter the URL of the webpage you would like the user to be redirected to " +"after they have submitted the form." +msgstr "" + +#: ../tooltips.php:42 +msgid "Pass Data Via Query String" +msgstr "" + +#: ../tooltips.php:42 +msgid "" +"To pass field data to the confirmation page, build a Query String using the " +"'Insert Merge Tag' drop down. ..more info on querystrings »" +msgstr "" + +#: ../tooltips.php:43 +msgid "" +"Enter the label of the form field. This is the field title the user will " +"see when filling out the form." +msgstr "" + +#: ../tooltips.php:44 +msgid "" +"Enter the label for this HTML block. It will help you identify your HTML " +"blocks in the form editor, but it will not be displayed on the form." +msgstr "" + +#: ../tooltips.php:45 +msgid "Disable Default Margins" +msgstr "" + +#: ../tooltips.php:45 +msgid "" +"When enabled, margins are added to properly align the HTML content with " +"other form fields." +msgstr "" + +#: ../tooltips.php:46 +msgid "Recaptcha Theme" +msgstr "" + +#: ../tooltips.php:46 +msgid "" +"Select the visual theme for the reCAPTCHA field the available options to " +"better match your site design." +msgstr "" + +#: ../tooltips.php:47 +msgid "CAPTCHA Type" +msgstr "" + +#: ../tooltips.php:47 +msgid "Select the type of CAPTCHA you would like to use." +msgstr "" + +#: ../tooltips.php:48 +msgid "" +"Select the custom field name from available existing custom fields, or enter " +"a new custom field name." +msgstr "" + +#: ../tooltips.php:49 +msgid "Field type" +msgstr "" + +#: ../tooltips.php:49 +msgid "Select the type of field from the available form fields." +msgstr "" + +#: ../tooltips.php:50 +msgid "" +"Enter the maximum number of characters that this field is allowed to have." +msgstr "" + +#: ../tooltips.php:51 +msgid "Enter the maximum number of rows that users are allowed to add." +msgstr "" + +#: ../tooltips.php:52 +msgid "" +"Select the type of inputs you would like to use for the date field. Date " +"Picker will let users select a date from a calendar. Date Field will let " +"users free type the date." +msgstr "" + +#: ../tooltips.php:53 +msgid "Select the type of address you would like to use." +msgstr "" + +#: ../tooltips.php:54 +msgid "Default State" +msgstr "" + +#: ../tooltips.php:54 +msgid "" +"Select the state you would like to be selected by default when the form gets " +"displayed." +msgstr "" + +#: ../tooltips.php:55 +msgid "Default Province" +msgstr "" + +#: ../tooltips.php:55 +msgid "" +"Select the province you would like to be selected by default when the form " +"gets displayed." +msgstr "" + +#: ../tooltips.php:56 +msgid "" +"Select the country you would like to be selected by default when the form " +"gets displayed." +msgstr "" + +#: ../tooltips.php:57 +msgid "Hide Country" +msgstr "" + +#: ../tooltips.php:57 +msgid "" +"For addresses that only apply to one country, you can choose to not display " +"the country drop down. Entries will still be recorded with the selected " +"country." +msgstr "" + +#: ../tooltips.php:58 +msgid "Hide Address Line 2" +msgstr "" + +#: ../tooltips.php:58 +msgid "" +"Check this box to prevent the extra address input (Address Line 2) from " +"being displayed in the form." +msgstr "" + +#: ../tooltips.php:59 +msgid "Hide State Field" +msgstr "" + +#: ../tooltips.php:59 +msgid "" +"Check this box to prevent the State field from being displayed in the form." +msgstr "" + +#: ../tooltips.php:60 +msgid "Hide Province Field" +msgstr "" + +#: ../tooltips.php:60 +msgid "" +"Check this box to prevent Province field from being displayed in the form." +msgstr "" + +#: ../tooltips.php:61 +msgid "Hide State/Province/Region" +msgstr "" + +#: ../tooltips.php:61 +msgid "" +"Check this box to prevent the State/Province/Region from being displayed in " +"the form." +msgstr "" + +#: ../tooltips.php:62 +msgid "Field Name Format" +msgstr "" + +#: ../tooltips.php:62 +msgid "" +"Select the format you would like to use for the Name field. There are 3 " +"options, Normal which includes First and Last Name, Extended which adds " +"Prefix and Suffix, or Simple which is a single input field." +msgstr "" + +#: ../tooltips.php:63 +msgid "" +"Select the format of numbers that are allowed in this field. You have the " +"option to use a comma or a dot as the decimal separator." +msgstr "" + +#: ../tooltips.php:64 +msgid "" +"Check this box to prevent this field from being displayed in a non-secure " +"page (i.e. not https://). It will redirect the page to the same URL, but " +"starting with https:// instead. This option requires a properly configured " +"SSL certificate." +msgstr "" + +#: ../tooltips.php:65 +msgid "Select the style you would like to use for the credit card icons." +msgstr "" + +#: ../tooltips.php:66 msgid "Field Date Format" msgstr "" -#: ../tooltips.php:71 -msgid "Select the format you would like to use for the date input. Available options are MM/DD/YYYY and DD/MM/YYYY." +#: ../tooltips.php:66 +msgid "" +"Select the format you would like to use for the date input. Available " +"options are MM/DD/YYYY and DD/MM/YYYY." msgstr "" -#: ../tooltips.php:72 -msgid "Select the format you would like to use for the time field. Available options are 12 hour (i.e. 8:30 pm) and 24 hour (i.e. 20:30)." +#: ../tooltips.php:67 +msgid "" +"Select the format you would like to use for the time field. Available " +"options are 12 hour (i.e. 8:30 pm) and 24 hour (i.e. 20:30)." msgstr "" -#: ../tooltips.php:73 +#: ../tooltips.php:68 msgid "Allowed File Extensions" msgstr "" -#: ../tooltips.php:73 -msgid "Enter that allowed file extensions for file uploads. This will limit what type of files a user may upload." +#: ../tooltips.php:68 +msgid "" +"Enter that allowed file extensions for file uploads. This will limit what " +"type of files a user may upload." msgstr "" -#: ../tooltips.php:74 +#: ../tooltips.php:69 msgid "Phone Number Format" msgstr "" -#: ../tooltips.php:74 -msgid "Select the format you would like to use for the phone input. Available options are domestic US/CANADA style phone number and international long format phone number." +#: ../tooltips.php:69 +msgid "" +"Select the format you would like to use for the phone input. Available " +"options are domestic US/CANADA style phone number and international long " +"format phone number." msgstr "" -#: ../tooltips.php:75 +#: ../tooltips.php:70 msgid "Field Description" msgstr "" -#: ../tooltips.php:75 -msgid "Enter the description for the form field. This will be displayed to the user and provide some direction on how the field should be filled out or selected." +#: ../tooltips.php:70 +msgid "" +"Enter the description for the form field. This will be displayed to the " +"user and provide some direction on how the field should be filled out or " +"selected." msgstr "" -#: ../tooltips.php:76 +#: ../tooltips.php:71 msgid "Required Field" msgstr "" -#: ../tooltips.php:76 -msgid "Select this option to make the form field required. A required field will prevent the form from being submitted if it is not filled out or selected." +#: ../tooltips.php:71 +msgid "" +"Select this option to make the form field required. A required field will " +"prevent the form from being submitted if it is not filled out or selected." msgstr "" -#: ../tooltips.php:77 -msgid "Select this option to limit user input to unique values only. This will require that a value entered in a field does not currently exist in the entry database for that field." +#: ../tooltips.php:72 +msgid "" +"Select this option to limit user input to unique values only. This will " +"require that a value entered in a field does not currently exist in the " +"entry database for that field." msgstr "" -#: ../tooltips.php:78 +#: ../tooltips.php:73 msgid "Number Range" msgstr "" +#: ../tooltips.php:73 +msgid "" +"Enter the minimum and maximum values for this form field. This will require " +"that the value entered by the user must fall within this range." +msgstr "" + +#: ../tooltips.php:74 +msgid "" +"Enabling caculations will allow the value of this field to be dynamically " +"calculated based on a mathematical formula." +msgstr "" + +#: ../tooltips.php:75 +msgid "" +"Specify a mathematical formula. The result of this formula will be " +"dynamically populated as the value for this field." +msgstr "" + +#: ../tooltips.php:76 +msgid "Specify how many decimal places the number should be rounded to." +msgstr "" + +#: ../tooltips.php:77 +msgid "" +"Enter the admin label of the form field. Entering a value in this field " +"will override the Field Label when displayed in the Gravity Forms " +"administration tool." +msgstr "" + #: ../tooltips.php:78 -msgid "Enter the minimum and maximum values for this form field. This will require that the value entered by the user must fall within this range." +msgid "" +"Select a form field size from the available options. This will set the width " +"of the field." msgstr "" #: ../tooltips.php:79 -msgid "Enabling caculations will allow the value of this field to be dynamically calculated based on a mathematical formula." +msgid "If you would like to pre-populate the value of a field, enter it here." msgstr "" #: ../tooltips.php:80 -msgid "Specify a mathematical formula. The result of this formula will be dynamically populated as the value for this field." +msgid "" +"If you would like to override the default error validation for a field, " +"enter it here. This message will be displayed if there is an error with " +"this field when the user submits the form." msgstr "" #: ../tooltips.php:81 -msgid "Specify how many decimal places the number should be rounded to." +msgid "reCaptcha Language" +msgstr "" + +#: ../tooltips.php:81 +msgid "" +"Select the language you would like to use for the reCAPTCHA display from the " +"available options." +msgstr "" + +#: ../tooltips.php:82 +msgid "" +"Enter the CSS class name you would like to use in order to override the " +"default styles for this field." +msgstr "" + +#: ../tooltips.php:83 +msgid "" +"Select the visibility for this field. Field visibility set to Everyone will " +"be visible by the user submitting the form. Form field visibility set to " +"Admin Only will only be visible within the Gravity Forms administration tool." +"

            Setting a field to Admin Only is useful for creating fields that " +"can be used to set a status or priority level on submitted entries." +msgstr "" + +#: ../tooltips.php:84 +msgid "Field Choices" +msgstr "" + +#: ../tooltips.php:84 +msgid "" +"Add Choices to this field. You can mark each choice as checked by default by " +"using the radio/checkbox fields on the left." +msgstr "" + +#: ../tooltips.php:85 +msgid "Enable Choice Values" +msgstr "" + +#: ../tooltips.php:85 +msgid "" +"Check this option to specify a value for each choice. Choice values are not " +"displayed to the user viewing the form, but are accessible to administrators " +"when viewing the entry." +msgstr "" + +#: ../tooltips.php:86 +msgid "" +"Create rules to dynamically display or hide this field based on values from " +"another field" +msgstr "" + +#: ../tooltips.php:87 +msgid "Enable Enhanced UI" +msgstr "" + +#: ../tooltips.php:87 +msgid "" +"By selecting this option, the Chosen jQuery script will be applied to this field, " +"enabling search capabilities to Drop Down fields and a more user-friendly " +"interface for Multi Select fields." +msgstr "" + +#: ../tooltips.php:88 +msgid "\"Other\" Choice" +msgstr "" + +#: ../tooltips.php:88 +msgid "" +"Check this option to add a text input as the final choice of your radio " +"button field. This allows the user to specify a value that is not a " +"predefined choice." +msgstr "" + +#: ../tooltips.php:89 +msgid "Check this option to require a user to be logged in to view this form" +msgstr "" + +#: ../tooltips.php:90 +msgid "" +"Enter a message to be displayed to users who are not logged in (shortcodes " +"and HTML are supported)" +msgstr "" + +#: ../tooltips.php:91 +msgid "Page Conditional Logic" +msgstr "" + +#: ../tooltips.php:91 +msgid "" +"Create rules to dynamically display or hide this page based on values from " +"another field" +msgstr "" + +#: ../tooltips.php:92 +msgid "" +"Select which type of visual progress indicator you would like to display. " +"Progress Bar, Steps or None" +msgstr "" + +#: ../tooltips.php:93 +msgid "Progress Bar Style" +msgstr "" + +#: ../tooltips.php:93 +msgid "" +"Select which progress bar style you would like to use. Select custom to " +"choose your own text and background color" +msgstr "" + +#: ../tooltips.php:94 +msgid "" +"Name each of the pages on your form. Page names are displayed with the " +"selected progress indicator" +msgstr "" + +#: ../tooltips.php:95 +msgid "Next Button Text" +msgstr "" + +#: ../tooltips.php:95 +msgid "Enter the text you would like to appear on the page next button" +msgstr "" + +#: ../tooltips.php:96 +msgid "Next Button Image" +msgstr "" + +#: ../tooltips.php:96 +msgid "" +"Enter the path to an image you would like to use as the page next button" +msgstr "" + +#: ../tooltips.php:97 +msgid "Previous Button Text" +msgstr "" + +#: ../tooltips.php:97 +msgid "Enter the text you would like to appear on the page previous button" +msgstr "" + +#: ../tooltips.php:98 +msgid "Previous Button Image" +msgstr "" + +#: ../tooltips.php:98 +msgid "" +"Enter the path to an image you would like to use as the page previous button" +msgstr "" + +#: ../tooltips.php:99 +msgid "Next Button Conditional Logic" +msgstr "" + +#: ../tooltips.php:99 +msgid "" +"Create rules to dynamically display or hide the page's Next Button based on " +"values from another field" +msgstr "" + +#: ../tooltips.php:100 +msgid "" +"Create rules to dynamically display or hide the submit button based on " +"values from another field" +msgstr "" + +#: ../tooltips.php:101 +msgid "" +"Select which categories are displayed. You can choose to display all of them " +"or select individual ones." +msgstr "" + +#: ../tooltips.php:102 +msgid "" +"Select the post status that will be used for the post that is created by the " +"form entry." +msgstr "" + +#: ../tooltips.php:103 +msgid "Post Author" +msgstr "" + +#: ../tooltips.php:103 +msgid "" +"Select the author that will be used for the post that is created by the form " +"entry." +msgstr "" + +#: ../tooltips.php:104 +msgid "" +"Select the post format that will be used for the post that is created by the " +"form entry." +msgstr "" + +#: ../tooltips.php:105 +msgid "Post Content Template" +msgstr "" + +#: ../tooltips.php:105 +msgid "" +"Check this option to format and insert merge tags into the Post Content." +msgstr "" + +#: ../tooltips.php:106 +msgid "Post Title Template" +msgstr "" + +#: ../tooltips.php:106 +msgid "Check this option to format and insert merge tags into the Post Title." +msgstr "" + +#: ../tooltips.php:107 +msgid "" +"Select the category that will be used for the post that is created by the " +"form entry." +msgstr "" + +#: ../tooltips.php:108 +msgid "Use Current User as Author" msgstr "" -#: ../tooltips.php:82 -msgid "Enter the admin label of the form field. Entering a value in this field will override the Field Label when displayed in the Gravity Forms administration tool." +#: ../tooltips.php:108 +msgid "" +"Selecting this option will set the post author to the WordPress user that " +"submitted the form." msgstr "" -#: ../tooltips.php:83 -msgid "Select a form field size from the available options. This will set the width of the field." +#: ../tooltips.php:109 +msgid "Image Meta" msgstr "" -#: ../tooltips.php:84 -msgid "If you would like to pre-populate the value of a field, enter it here." +#: ../tooltips.php:109 +msgid "" +"Select one or more image metadata field to be displayed along with the image " +"upload field. They enable users to enter additional information about the " +"uploaded image." msgstr "" -#: ../tooltips.php:85 -msgid "If you would like to override the default error validation for a field, enter it here. This message will be displayed if there is an error with this field when the user submits the form." +#: ../tooltips.php:110 +msgid "Check this option to set this image as the post's Featured Image." msgstr "" -#: ../tooltips.php:86 -msgid "reCaptcha Language" +#: ../tooltips.php:111 +msgid "Incoming Field Data" msgstr "" -#: ../tooltips.php:86 -msgid "Select the language you would like to use for the reCAPTCHA display from the available options." +#: ../tooltips.php:111 +msgid "" +"Check this option to enable data to be passed to the form and pre-populate " +"this field dynamically. Data can be passed via Query Strings, Shortcode and/" +"or Hooks" msgstr "" -#: ../tooltips.php:87 -msgid "Enter the CSS class name you would like to use in order to override the default styles for this field." +#: ../tooltips.php:112 +msgid "Enter the content (Text or HTML) to be displayed on the form." msgstr "" -#: ../tooltips.php:88 -msgid "Select the visibility for this field. Field visibility set to Everyone will be visible by the user submitting the form. Form field visibility set to Admin Only will only be visible within the Gravity Forms administration tool.

            Setting a field to Admin Only is useful for creating fields that can be used to set a status or priority level on submitted entries." +#: ../tooltips.php:113 +msgid "Base Price" msgstr "" -#: ../tooltips.php:89 -msgid "Field Choices" +#: ../tooltips.php:113 +msgid "Enter the base price for this product." msgstr "" -#: ../tooltips.php:89 -msgid "Add Choices to this field. You can mark each choice as checked by default by using the radio/checkbox fields on the left." +#: ../tooltips.php:114 +msgid "Disable Quantity" msgstr "" -#: ../tooltips.php:90 -msgid "Enable Choice Values" +#: ../tooltips.php:114 +msgid "" +"Disables the quantity field. A quantity of 1 will be assumed or you can add " +"a Quantity field to your form from the Pricing Fields." msgstr "" -#: ../tooltips.php:90 -msgid "Check this option to specify a value for each choice. Choice values are not displayed to the user viewing the form, but are accessible to administrators when viewing the entry." +#: ../tooltips.php:115 +msgid "Select which Product this field is tied to." msgstr "" -#: ../tooltips.php:91 -#: ../tooltips.php:105 -msgid "Conditional Logic" +#: ../tooltips.php:116 +msgid "" +"Input masks provide a visual guide allowing users to more easily enter data " +"in a specific format such as dates and phone numbers." msgstr "" -#: ../tooltips.php:91 -msgid "Create rules to dynamically display or hide this field based on values from another field" +#: ../tooltips.php:117 +msgid "Standard Fields provide basic form functionality." msgstr "" -#: ../tooltips.php:92 -msgid "Enable Enhanced UI" +#: ../tooltips.php:118 +msgid "" +"Advanced Fields are for specific uses. They enable advanced formatting of " +"regularly used fields such as Name, Email, Address, etc." msgstr "" -#: ../tooltips.php:92 -msgid "By selecting this option, the Chosen jQuery script will be applied to this field, enabling search capabilities to Drop Down fields and a more user-friendly interface for Multi Select fields." +#: ../tooltips.php:119 +msgid "" +"Post Fields allow you to add fields to your form that create Post Drafts in " +"WordPress from the submitted data." msgstr "" -#: ../tooltips.php:93 -msgid "\"Other\" Choice" +#: ../tooltips.php:120 +msgid "" +"Pricing fields allow you to add fields to your form that calculate pricing " +"for selling goods and services." msgstr "" -#: ../tooltips.php:93 -msgid "Check this option to add a text input as the final choice of your radio button field. This allows the user to specify a value that is not a predefined choice." +#: ../tooltips.php:121 +msgid "Export Selected Form" msgstr "" -#: ../tooltips.php:94 -msgid "Check this option to require a user to be logged in to view this form" +#: ../tooltips.php:121 +msgid "" +"Select the form you would like to export entry data from. You may only " +"export data from one form at a time." msgstr "" -#: ../tooltips.php:95 -msgid "Enter a message to be displayed to users who are not logged in (shortcodes and HTML are supported)" +#: ../tooltips.php:122 +msgid "Export Selected Forms" msgstr "" -#: ../tooltips.php:96 -msgid "Page Conditional Logic" +#: ../tooltips.php:122 +msgid "Select the forms you would like to export." msgstr "" -#: ../tooltips.php:96 -msgid "Create rules to dynamically display or hide this page based on values from another field" +#: ../tooltips.php:123 +msgid "Export Selected Fields" msgstr "" -#: ../tooltips.php:97 -msgid "Select which type of visual progress indicator you would like to display. Progress Bar, Steps or None" +#: ../tooltips.php:123 +msgid "" +"Select the fields from the select form you would like to export data from." msgstr "" -#: ../tooltips.php:98 -msgid "Progress Bar Style" +#: ../tooltips.php:124 +msgid "Export Date Range" msgstr "" -#: ../tooltips.php:98 -msgid "Select which progress bar style you would like to use. Select custom to choose your own text and background color" +#: ../tooltips.php:124 +msgid "" +"Select a date range. Setting a range will only export entries submitted " +"during that date range. If no range is set, all entries will be exported." msgstr "" -#: ../tooltips.php:99 -msgid "Name each of the pages on your form. Page names are displayed with the selected progress indicator" +#: ../tooltips.php:125 +msgid "Settings License Key" msgstr "" -#: ../tooltips.php:100 -msgid "Next Button Text" +#: ../tooltips.php:125 +msgid "" +"Your Gravity Forms support license key is used to verify your support " +"package, enable automatic updates and receive support." msgstr "" -#: ../tooltips.php:100 -msgid "Enter the text you would like to appear on the page next button" +#: ../tooltips.php:126 +msgid "" +"Select yes or no to enable or disable CSS output. Setting this to no will " +"disable the standard Gravity Forms CSS from being included in your theme." msgstr "" -#: ../tooltips.php:101 -msgid "Next Button Image" +#: ../tooltips.php:127 +msgid "" +"Select yes or no to enable or disable HTML5 output. Setting this to no will " +"disable the standard Gravity Forms HTML5 form field output." msgstr "" -#: ../tooltips.php:101 -msgid "Enter the path to an image you would like to use as the page next button" +#: ../tooltips.php:128 +msgid "" +"Select On or Off to enable or disable no-conflict mode. Setting this to On " +"will prevent extraneous scripts and styles from being printed on Gravity " +"Forms admin pages, reducing conflicts with other plugins and themes." msgstr "" -#: ../tooltips.php:102 -msgid "Previous Button Text" +#: ../tooltips.php:129 +msgid "reCaptcha Public Key" msgstr "" -#: ../tooltips.php:102 -msgid "Enter the text you would like to appear on the page previous button" +#: ../tooltips.php:129 +msgid "" +"Enter your reCAPTCHA Public Key, if you do not have a key you can register " +"for one at the provided link. reCAPTCHA is a free service." msgstr "" -#: ../tooltips.php:103 -msgid "Previous Button Image" +#: ../tooltips.php:130 +msgid "reCaptcha Private Key" msgstr "" -#: ../tooltips.php:103 -msgid "Enter the path to an image you would like to use as the page previous button" +#: ../tooltips.php:130 +msgid "" +"Enter your reCAPTCHA Private Key, if you do not have a key you can register " +"for one at the provided link. reCAPTCHA is a free service." msgstr "" -#: ../tooltips.php:104 -msgid "Next Button Conditional Logic" +#: ../tooltips.php:131 +msgid "" +"Please select the currency for your location. Currency is used for pricing " +"fields and price calculations." msgstr "" -#: ../tooltips.php:104 -msgid "Create rules to dynamically display or hide the page's Next Button based on values from another field" +#: ../tooltips.php:133 +msgid "Entries Conversion" msgstr "" -#: ../tooltips.php:105 -msgid "Create rules to dynamically display or hide the submit button based on values from another field" +#: ../tooltips.php:133 +msgid "" +"Conversion is the percentage of form views that generated an entry. If a " +"form was viewed twice, and one entry was generated, the conversion will be " +"50%." msgstr "" -#: ../tooltips.php:106 -msgid "Select which categories are displayed. You can choose to display all of them or select individual ones." +#: ../tooltips.php:134 +msgid "Tab Index Start Value" msgstr "" -#: ../tooltips.php:107 -msgid "Select the post status that will be used for the post that is created by the form entry." +#: ../tooltips.php:134 ../widget.php:99 +msgid "" +"If you have other forms on the page (i.e. Comments Form), specify a higher " +"tabindex start value so that your Gravity Form does not end up with the same " +"tabindices as your other forms. To disable the tabindex, enter 0 (zero)." msgstr "" -#: ../tooltips.php:108 -msgid "Post Author" +#: ../tooltips.php:135 +msgid "Override Notifications" msgstr "" -#: ../tooltips.php:108 -msgid "Select the author that will be used for the post that is created by the form entry." +#: ../tooltips.php:135 +msgid "" +"Enter a comma separated list of email addresses you would like to receive " +"the selected notification emails." msgstr "" -#: ../tooltips.php:109 -msgid "Select the post format that will be used for the post that is created by the form entry." +#: ../tooltips.php:136 +msgid "Progress Bar Confirmation Display" msgstr "" -#: ../tooltips.php:110 -msgid "Post Content Template" +#: ../tooltips.php:136 +msgid "" +"Check this box if you would like the progress bar to display with the " +"confirmation text." msgstr "" -#: ../tooltips.php:110 -msgid "Check this option to format and insert merge tags into the Post Content." +#: ../tooltips.php:137 +msgid "Progress Bar Completion Text" msgstr "" -#: ../tooltips.php:111 -msgid "Post Title Template" +#: ../tooltips.php:137 +msgid "Enter text to display at the top of the progress bar." msgstr "" -#: ../tooltips.php:111 -msgid "Check this option to format and insert merge tags into the Post Title." +#: ../update.php:5 +msgid "You don't have permissions to view this page" msgstr "" -#: ../tooltips.php:112 -msgid "Select the category that will be used for the post that is created by the form entry." +#: ../update.php:19 +msgid "Gravity Forms Updates" msgstr "" -#: ../tooltips.php:113 -msgid "Use Current User as Author" +#: ../update.php:34 +#, php-format +msgid "" +"

            You can update to the latest version automatically or download the update " +"and install it manually. %sUpdate Automatically%s %sDownload Update%s" msgstr "" -#: ../tooltips.php:113 -msgid "Selecting this option will set the post author to the WordPress user that submitted the form." +#: ../update.php:42 +msgid "" +"Register your copy of Gravity " +"Forms to receive access to automatic updates and support. Need a license " +"key? Purchase one now." msgstr "" -#: ../tooltips.php:114 -msgid "Image Meta" +#: ../update.php:55 +msgid "Your version of Gravity Forms is up to date." msgstr "" -#: ../tooltips.php:114 -msgid "Select one or more image metadata field to be displayed along with the image upload field. They enable users to enter additional information about the uploaded image." +#: ../widget.php:17 +msgid "Gravity Forms Widget" msgstr "" -#: ../tooltips.php:115 -msgid "Check this option to set this image as the post's Featured Image." +#: ../widget.php:18 +msgid "Form" msgstr "" -#: ../tooltips.php:116 -msgid "Incoming Field Data" +#: ../widget.php:67 +msgid "Contact Us" msgstr "" -#: ../tooltips.php:116 -msgid "Check this option to enable data to be passed to the form and pre-populate this field dynamically. Data can be passed via Query Strings, Shortcode and/or Hooks" +#: ../widget.php:92 +msgid "advanced options" msgstr "" -#: ../tooltips.php:117 -msgid "Enter the content (Text or HTML) to be displayed on the form." +#: ../widget.php:96 +msgid "Disable script output" msgstr "" -#: ../tooltips.php:118 -msgid "Base Price" +#: ../widget.php:97 +msgid "Tab Index Start" msgstr "" -#: ../tooltips.php:118 -msgid "Enter the base price for this product." +#: ../includes/addon/class-gf-addon.php:759 +#, php-format +msgid "Field type '%s' has not been implemented" msgstr "" -#: ../tooltips.php:119 -msgid "Disable Quantity" +#: ../includes/addon/class-gf-addon.php:1256 +msgid "Validation Error" msgstr "" -#: ../tooltips.php:119 -msgid "Disables the quantity field. A quantity of 1 will be assumed or you can add a Quantity field to your form from the Pricing Fields." +#: ../includes/addon/class-gf-addon.php:1565 +msgid "Uninstall Add-On" msgstr "" -#: ../tooltips.php:120 -msgid "Select which Product this field is tied to." +#: ../includes/addon/class-gf-addon.php:1566 +msgid "Warning! This operation deletes ALL settings." msgstr "" -#: ../tooltips.php:121 -msgid "Input masks provide a visual guide allowing users to more easily enter data in a specific format such as dates and phone numbers." +#: ../includes/addon/class-gf-addon.php:1568 +msgid "Uninstall Add-On" msgstr "" -#: ../tooltips.php:122 -msgid "Standard Fields provide basic form functionality." +#: ../includes/addon/class-gf-addon.php:1568 +msgid "" +"Warning! ALL settings will be deleted. This cannot be undone. \\'OK\\' to " +"delete, \\'Cancel\\' to stop" msgstr "" -#: ../tooltips.php:123 -msgid "Advanced Fields are for specific uses. They enable advanced formatting of regularly used fields such as Name, Email, Address, etc." +#: ../includes/addon/class-gf-addon.php:1603 +msgid "You don't have adequate permission to uninstall this addon: " msgstr "" -#: ../tooltips.php:124 -msgid "Post Fields allow you to add fields to your form that create Post Drafts in WordPress from the submitted data." +#: ../includes/addon/class-gf-addon.php:1682 +#: ../includes/addon/class-gf-auto-upgrade.php:44 +msgid "Gravity Forms " msgstr "" -#: ../tooltips.php:125 -msgid "Pricing fields allow you to add fields to your form that calculate pricing for selling goods and services." +#: ../includes/addon/class-gf-auto-upgrade.php:52 +#, php-format +msgid "" +"%sRegister%s your copy of Gravity Forms to receive access to automatic " +"upgrades and support. Need a license key? %sPurchase one now%s." msgstr "" -#: ../tooltips.php:126 -msgid "Export Selected Form" +#: ../includes/addon/class-gf-auto-upgrade.php:156 +#, php-format +msgid "Oops!! Something went wrong.%sPlease try again or %scontact us%s." msgstr "" -#: ../tooltips.php:126 -msgid "Select the form you would like to export entry data from. You may only export data from one form at a time." +#: ../includes/addon/class-gf-feed-addon.php:223 +#: ../includes/addon/class-gf-feed-addon.php:284 +msgid "Feeds" msgstr "" -#: ../tooltips.php:127 -msgid "Export Selected Forms" +#: ../includes/addon/class-gf-feed-addon.php:300 +msgid "Feed updated successfully." msgstr "" -#: ../tooltips.php:127 -msgid "Select the forms you would like to export." +#: ../includes/addon/class-gf-feed-addon.php:302 +msgid "There was an error updating this feed." msgstr "" -#: ../tooltips.php:128 -msgid "Export Selected Fields" +#: ../includes/addon/class-gf-feed-addon.php:404 +msgid "Edit this feed" msgstr "" -#: ../tooltips.php:128 -msgid "Select the fields from the select form you would like to export data from." +#: ../includes/addon/class-gf-feed-addon.php:405 +msgid "Delete this feed" msgstr "" -#: ../tooltips.php:129 -msgid "Export Date Range" +#: ../includes/addon/class-gf-feed-addon.php:405 +msgid "WARNING: You are about to delete this item." msgstr "" -#: ../tooltips.php:129 -msgid "Select a date range. Setting a range will only export entries submitted during that date range. If no range is set, all entries will be exported." +#: ../includes/addon/class-gf-feed-addon.php:460 +msgid "Enable Opt-In Condition" msgstr "" -#: ../tooltips.php:130 -msgid "Settings License Key" +#: ../includes/addon/class-gf-feed-addon.php:477 +msgid "Export to MailChimp if" msgstr "" -#: ../tooltips.php:130 -msgid "Your Gravity Forms support license key is used to verify your support package, enable automatic updates and receive support." +#: ../includes/addon/class-gf-feed-addon.php:565 +#: ../includes/addon/class-gf-feed-addon.php:569 +msgid "Full" msgstr "" -#: ../tooltips.php:131 -msgid "Select yes or no to enable or disable CSS output. Setting this to no will disable the standard Gravity Forms CSS from being included in your theme." +#: ../includes/addon/class-gf-feed-addon.php:644 +msgid "Checkbox" msgstr "" -#: ../tooltips.php:132 -msgid "Select yes or no to enable or disable HTML5 output. Setting this to no will disable the standard Gravity Forms HTML5 form field output." +#: ../includes/addon/class-gf-feed-addon.php:657 +msgid "feed" msgstr "" -#: ../tooltips.php:133 -msgid "Select On or Off to enable or disable no-conflict mode. Setting this to On will prevent extraneous scripts and styles from being printed on Gravity Forms admin pages, reducing conflicts with other plugins and themes." +#: ../includes/addon/class-gf-feed-addon.php:658 +msgid "feeds" msgstr "" -#: ../tooltips.php:134 -msgid "reCaptcha Public Key" +#: ../includes/addon/class-gf-feed-addon.php:672 +msgid "No feeds." msgstr "" -#: ../tooltips.php:134 -msgid "Enter your reCAPTCHA Public Key, if you do not have a key you can register for one at the provided link. reCAPTCHA is a free service." +#: ../includes/addon/class-gf-results.php:76 +msgid "No filters" msgstr "" -#: ../tooltips.php:135 -msgid "reCaptcha Private Key" +#: ../includes/addon/class-gf-results.php:77 +msgid "Add a field filter" msgstr "" -#: ../tooltips.php:135 -msgid "Enter your reCAPTCHA Private Key, if you do not have a key you can register for one at the provided link. reCAPTCHA is a free service." +#: ../includes/addon/class-gf-results.php:78 +msgid "Remove a field filter" msgstr "" -#: ../tooltips.php:136 -msgid "Please select the currency for your location. Currency is used for pricing fields and price calculations." +#: ../includes/addon/class-gf-results.php:79 +msgid "Error retrieving results. Please contact support." msgstr "" -#: ../tooltips.php:138 -msgid "Entries Conversion" +#: ../includes/addon/class-gf-results.php:109 +#: ../includes/addon/class-gf-results.php:131 +msgid "View results generated by this form" msgstr "" -#: ../tooltips.php:138 -msgid "Conversion is the percentage of form views that generated an entry. If a form was viewed twice, and one entry was generated, the conversion will be 50%." +#: ../includes/addon/class-gf-results.php:267 +msgid "Results Filters" msgstr "" -#: ../tooltips.php:139 -msgid "Tab Index Start Value" +#: ../includes/addon/class-gf-results.php:284 +#: ../includes/addon/class-gf-results.php:345 +msgid "Filters" msgstr "" -#: ../tooltips.php:139 -#: ../widget.php:95 -msgid "If you have other forms on the page (i.e. Comments Form), specify a higher tabindex start value so that your Gravity Form does not end up with the same tabindices as your other forms. To disable the tabindex, enter 0 (zero)." +#: ../includes/addon/class-gf-results.php:292 +#: ../includes/addon/class-gf-results.php:344 +msgid "Date Range" msgstr "" -#: ../tooltips.php:140 -msgid "Override Notifications" +#: ../includes/addon/class-gf-results.php:333 +msgid "This form does not have any fields that can be used for results" msgstr "" -#: ../tooltips.php:140 -msgid "Enter a comma separated list of email addresses you would like to receive the selected notification emails." +#: ../includes/addon/class-gf-results.php:342 +#: ../includes/addon/class-gf-results.php:639 +msgid "Total Score" msgstr "" -#: ../tooltips.php:141 -msgid "Progress Bar Confirmation Display" +#: ../includes/addon/class-gf-results.php:342 +msgid "" +"Scores are weighted calculations. Items ranked higher are given a greater " +"score than items that are ranked lower. The total score for each item is the " +"sum of the weighted scores." msgstr "" -#: ../tooltips.php:141 -msgid "Check this box if you would like the progress bar to display with the confirmation text." +#: ../includes/addon/class-gf-results.php:343 +#: ../includes/addon/class-gf-results.php:642 +msgid "Aggregate Rank" msgstr "" -#: ../tooltips.php:142 -msgid "Progress Bar Completion Text" +#: ../includes/addon/class-gf-results.php:343 +msgid "" +"The aggregate rank is the overall rank for all entries based on the weighted " +"scores for each item." msgstr "" -#: ../tooltips.php:142 -msgid "Enter text to display at the top of the progress bar." +#: ../includes/addon/class-gf-results.php:344 +msgid "" +"Date Range is optional, if no date range is specified it will be ignored." msgstr "" -#: ../update.php:5 -msgid "You don't have permissions to view this page" +#: ../includes/addon/class-gf-results.php:345 +msgid "" +"Narrow the results by adding filters. Note that some field types support " +"more options than others." msgstr "" -#: ../update.php:19 -msgid "Gravity Forms Updates" +#: ../includes/addon/class-gf-results.php:362 +msgid "No results." msgstr "" -#: ../update.php:32 -#, php-format -msgid "

            You can update to the latest version automatically or download the update and install it manually. %sUpdate Automatically%s %sDownload Update%s" +#: ../includes/addon/class-gf-results.php:416 +msgid "" +"There was an error while processing the entries. Please contact support." msgstr "" -#: ../update.php:40 -msgid "Register your copy of Gravity Forms to receive access to automatic updates and support. Need a license key? Purchase one now." +#: ../includes/addon/class-gf-results.php:428 +#, php-format +msgid "Entries processed: %1$d of %2$d" msgstr "" -#: ../update.php:53 -msgid "Your version of Gravity Forms is up to date." +#: ../includes/addon/class-gf-results.php:446 +msgid "No results" msgstr "" -#: ../widget.php:15 -msgid "Gravity Forms Widget" +#: ../includes/addon/class-gf-results.php:500 +#: ../includes/addon/class-gf-results.php:514 +msgid "No entries for this field" msgstr "" -#: ../widget.php:63 -msgid "Contact Us" +#: ../includes/addon/class-gf-results.php:521 +msgid "Choice" msgstr "" -#: ../widget.php:88 -msgid "advanced options" +#: ../includes/addon/class-gf-results.php:521 +#: ../includes/addon/class-gf-results.php:550 +msgid "Frequency" msgstr "" -#: ../widget.php:92 -msgid "Disable script output" +#: ../includes/addon/class-gf-results.php:636 +msgid "Item" msgstr "" -#: ../widget.php:93 -msgid "Tab Index Start" +#: ../includes/addon/class-gf-results.php:670 +msgid "Latest entries:" msgstr "" - diff --git a/notification.php b/notification.php old mode 100755 new mode 100644 index 9bced40..963107b --- a/notification.php +++ b/notification.php @@ -95,7 +95,6 @@ public static function notification_edit_page($form_id, $notification_id) {