diff --git a/change_log.txt b/change_log.txt
index 3ac7438..b64332b 100644
--- a/change_log.txt
+++ b/change_log.txt
@@ -1,3 +1,266 @@
+-------------------------------------------------------------------------------------------------------------------
+Version 1.8.7.2
+ - Fixed issue with chosen script throwing javascript errors on certain situations
+
+-------------------------------------------------------------------------------------------------------------------
+Version 1.8.7.1
+ - Added Bulgarian translation file
+ - Updated the multi-file upload field to support Plupload 2.x in WordPress 3.9
+
+-------------------------------------------------------------------------------------------------------------------
+Version 1.8.7
+
+ - Added Text Domain and Domain Path to plugin header so the description may be translated
+
+ - Updated product calculation to improve performance
+ - Updated width of form title column so form actions do not wrap.
+ - Updated two notice statements to alleviate confusion
+ - Updated German translation file with user-provided update
+ - Updated a few strings so they can be translated
+ - Updated POT file
+ - Updated GFFormsModel::save_lead() method to support saving leads on non-admin views
+ - Updated GFFormDisplay::has_conditional_logic from private to public
+
+ - Fixed an issue with the validation of the number field when set to currency format and the Gravity Forms currency setting is set to a decimal comma formatted currency
+ - Fixed incorrect domain for translations in a few instances
+ - Fixed security vulnerabilities
+ - Fixed issue with nested conditional logic on checkboxes.
+ - Fixed issue where conditional logic setting was showing up for Hidden products
+ - Fixed issue where GF Results was being initialized on all admin pages
+ - Fixed issue with the {pricing_fields} merge tag markup.
+
+ - API: Updated the Web API authentication to accept both url-encoded and unencoded signatures to handle different client behavior
+ - API: Updated some mysql_*() calls to support WordPress 3.9 under PHP 5.5 or higher
+
+ - AF: Added support for top level "app" menus
+ - AF: Added support for top level "app settings"
+ - AF: Added support for app tab UIs
+ - AF: Fixed an issue with the form settings menu where the menu item for the add-on was appearing in the menu even when the current user did not have adequate permissions
+ - AF: Fixed filter for app settings menu
+
+-------------------------------------------------------------------------------------------------------------------
+Version 1.8.6
+
+ - Added logging to help troubleshooting form submissions.
+ - Added hook to allow multi-file upload settings/behavior to be changed.
+ - Added "French Polynesia" to countries list.
+ - Added 'gravityforms_delete_forms' and 'gravityforms_delete_entries' permission checks to form list.
+ - Added new filter "gform_email_background_color_label" to change the background color for the field label in the html email.
+ add_filter("gform_email_background_color_label", "set_email_label_color", 10, 3);
+ function set_email_label_color($color, $field, $lead){
+ return "#CC99FF";
+ }
+ - Added new filter "gform_email_background_color_data" to change the background color for the field data in the html email.
+ add_filter("gform_email_background_color_data", "set_email_data_color", 10, 3);
+ function set_email_data_color($color, $field, $lead){
+ return "#CCCCFF";
+ }
+ - Added gform_form_notification_page filter.
+ - Added 'gravityforms_delete_entries' permission checks to entry list and entry detail pages.
+ - Added $input_id as fifth parameter to the "gform_save_field_value" function; better allows overriding values for a specific input ID.
+ - Added support for state code via gform_us_states and gform_address_types hook.
+ - Added gform_form_export_page hook.
+ - Added gform_payment_details hook under gform_entry_info in preparation for a new Payment Details box on the entry page.
+ - Added support for country codes in country drop down.
+ - Added support for note type.
+ - Added support for changing note avatar.
+ - Added gform_delete_entries to get fired when entries are being deleted in bulk.
+
+ - Fixed security vulnerability which allowed malicious form submissions to bypass validation of certain fields
+ - Fixed PHP warning on entry list when the created_by field contains the ID of a user that no longer exists
+ - Fixed issue with conditional logic when configured to start with "0".
+ - Fixed minor PHP warning for recently imported multi-step forms.
+ - Fixed issue where editing credit card fields with HTML5 ouptut enabled generated a browser validation error.
+ - Fixed security vulnerability which allowed malicious form submissions to bypass validation of certain fields.
+ - Fixed issue with entry detail pagination not working correctly on certain types of searches.
+ - Fixed issue with with the multi-file upload field generating a JavaScript error on multi-page, ajax-enabled forms with conditional logic.
+ - Fixed issue with multi file upload throwing AJAX errors when uploading a file with a single quote on certain webservers.
+ - Added GFs instance of the gfMergeTagsObj to the global scope to allow 3rd party devs to more easily work with merge tags.
+ - Fixed issue in the Italian translation file where a string was breaking javascript on the entry detail page.
+ - Fixed issue with entry export not decoding the value of multi file upload fields.
+
+ - Fixed issue with the {pricing_fields} merge tag markup.
+ - Fixed escaping issue on input mask.
+ - Fixed issue with the new form modal on IE8.
+ - Fixed issue with datepicker css being rendered to the page even when no datepicker field is in the form.
+ - Fixed issue with country not being selected properly when code was provided via hook.
+ - Fixed styling issue with entry actions on entry detail page.
+ - Fixed issue where styles/scripts were being output before doctype when including a form in a confirmation.
+ - Fixed issue with number field validation when set to decimal comma.
+ - Fixed issue with select columns page not loading in SSL when appropriate.
+ - Fixed security vulnerability when validating product state.
+ - Fixed an issue with the entry list where trashed entries appear in the list of active entries when sorting by a field value.
+ - Fixed an issue with conditional logic when product drop down is used as a target.
+
+ - Removed permissions check from low level GFFormsModel::delete_lead() - moved to page level.
+ - Removed the value and size attributes from the input tag for the "file" type since they are not supported and cause html validation errors.
+ - Removed permission checks from GFFormsModel::delete_form() and GFFormsModel::delete_leads_by_form() - moved to page level.
+
+ - AF: Set trial amount to user entered value when trial option set to "Enter amount" for the Payment Add-On.
+ - AF: Added GFAPI::current_user_can_any() so developers can check permissions before calling any of the other API functions.
+ - AF: Added some logging for the Payment Add-On.
+ - AF: Added discounts to the order data for the Payment Add-On.
+ - AF: Added product options as a separate array to the line items array for the Payment Add-On.
+ - AF: Added is_shipping indicator to line items to distinguish between shipping field and regular product field for the Payment Add-On
+ - AF: Added name property to settings_setup_fee and settings_trial for the Payment Add-On.
+
+ - AF: Added integration with the Logging Add-On - all add-ons now appear automatically on the settings page.
+ - AF: Fixed issue with validation failure icon not being displayed for all field types.
+ - AF: Fixed issue with checkbox validation.
+
+ - API: Fixed an issue with GFAPI::add_entry() where the status was being ignored.
+ - API: Fixed an issue with GFAPI:get_entries() where the status was being ignored when sorting by a field value.
+ - API: Fixed issue with Web API GET entries ignoring is_numeric.
+
+-------------------------------------------------------------------------------------------------------------------
+Version 1.8.5
+
+ - Added $field and $value parameters to 'gform_duplicate_message' filter.
+ - Added new hook: "gform_after_update_form_meta", fires any time form meta is updated.
+
+ - Updated shortcode_atts() call in GFForms::parse_shortcode() method to pass 'gravityforms' as the third parameter so 3rd party developers can add/filter shortcode attributes.
+
+ - Fixed Notice when adding a post category field to the form.
+ - Fixed issue with email notification format when using the {pricing_fields} merge tag.
+ - Fixed issue with conditional logic when the current number locale is set to decimal comma.
+ - Fixed issue with export where it was returning results inconsistent with entry list for checkbox items that have been re-ordered.
+ - Fixed issue where custom field types which posted values as arrays were set to null when filtering for HTML.
+ - Fixed issue with number format and conditional logic when number was configured with the comma as the decimal separator.
+
+ - AF: Added is_object_locked().
+ - AF: Added payment_callback table to track callbacks and prevent duplicate execution of them.
+ - AF: Added Donation as a dependency value for transaction type for the Payment Add-On.
+ - AF: Added function to set the onchange event for enabling a trial for the Payment Add-On.
+ - AF: Added support for a transaction id to be added to the transaction table for subscription recurring payments.
+ - AF: Added support for a subscription to be retrieved by a transaction id.
+ - AF: Added new styles for add-on results.
+
+ - AF: Updated payment amount to have a default value of form_total for the Payment Add-On.
+ - AF: Updated the logic for showing/hiding trial fields for the Payment Add-On.
+ - AF: Updated radio button setting markup so that it is consistent with WordPress'.
+ - AF: Updated settings label code; moved it to its own function.
+ - AF: Updated is_json() method to accept "[" as a valid first character of a JSON string.
+ - AF: Updated build_choices() method to 'public' from 'protected'.
+
+ - AF: Fixed notices in the Payment Add-On.
+
+ - API: Fixed an issue with get_entries() where incorrect entries were being returned when searching across all forms using an entry meta key that is not currently active for any of the forms.
+
+-------------------------------------------------------------------------------------------------------------------
+Version 1.8.4.1
+ - Fixed issue with tooltips not working on Add On pages. Included font-awesome.css to Add On pages to fix the issue.
+ - Fixed issue where old inputs were not removed when adding new choices via bulk add functionality for Post Custom Fields with a "checkbox" field type
+ - Fixed an issue with entry export which may result in an empty export file for forms with a large number of entries
+ - AF: Added logging statements
+ - AF: Fixed issue with field map validation on fields that are hidden by dependency
+ - API: Added some logging statements
+ - API: Updated GFWebAPI::handle_page_request() to check the $HTTP_RAW_POST_DATA global variable before attempting to read the contents of the request body.
+
+-------------------------------------------------------------------------------------------------------------------
+Version 1.8.4
+
+ - Added "gform_footer_init_scripts_filter" hook to support filtering the footer init scripts string
+ - Added support for custom wp-includes directory
+
+ - Updated setup to run only in admin for single site installations and always on multisite
+ - Updated Google Font includes to be protocol-less
+ - Updated conditional logic to handle the "Other" choice for radio buttons
+ - Updated INACTIVE trim values setup script to ACTIVE. All leading and trailing spaces are now stripped from all previous entry values, field labels, choice texts, choice values, input labels and conditional logic rule values for fields, notifications and confirmations.
+ - Updated the form editor, form importer, notification editor and confirmation editor to trim leading and trailing spaces from all labels, choices values and conditional logic values on save/import
+ - Updated GFFormDisplay::print_form_scripts() to print all scripts at once rather than printing individually
+ - Updated GFFormsModel::update_lead_property() to return the result of the $wpdb->update() call
+ - Updated Credit Card field's Security Code input to use "type='text'" and "pattern='[0-9]*' when in HTML5 mode (rather than "type='number'")
+ - Updated location of gform_form_actions hook so that actions can be filtered when in the trash page
+ - Updated the entry search criteria to support times in the start_date and end_date
+ - Updated GFFormsModel::get_form to optionally allow returning a trashed form
+
+ - Fixed issue with number field not properly formatting numbers on the entry edit page and on the individual field merge tag
+ - Fixed issue with export start and end dates
+ - Fixed issue with entry list trash view where entry row remains in the list after deleting when a fileupload field in the entry is empty
+ - Fixed issue with deleting entries on multisite installs where files uploaded using the fileupload field aren't deleted if the site ms_files_rewriting option is not set. This issue affects all new multisite installations of WordPress created after the release of WordPres 3.5.
+ - Fixed issue with number field configured with the 9.999,99 format displaying browser validation errors when HTML5 is enabled.
+ - Fixed issue with list field export where "Array" was being displayed under certain conditions.
+ - Fixed warning thrown in rewrite_rules function when using array_merge with a parameter that wasn't an array
+ - Fixed issue with dates used when exporting entries
+ - Fixed number field validation when currency format is specified.
+ - Fixed issue with how spaces in post image file names were being replaced.
+ - Fixed notices when Post Image field with enabled Title, Description, and/or Caption were submitted without values
+ - Fixed styling issue with checkboxes on entry notes
+ - Fixed number field input type
+ - Fixed JS error on form editor when user refreshes the page with the scrollbar lower than the top of the page
+ - Fixed left margin of conditional logic instructions when label position is set to left-aligned.
+
+ - API: Added support for PUT entries/{entry ID}/properties so entry properties (is_read, is_starred etc) can be updated individually
+ - API: Added GFAPI::update_form_property() and GFAPI::update_forms_property() so form properties from the main forms table (is_trash, is_active etc) can be updated individually
+ - API: Added support for PUT forms/{form ID}/properties
+ - API: Added GFAPI::update_entry_property() to update a single property of an entry
+ - API: Updated the QR Code to include the site title
+ - API: Updated GFAPI::add_entry() to return an error if the entry object is not an array
+ - API: Fixed authentication for multisite installations
+ - API: Fixed loading of scripts on the API settings page when using SSL
+ - API: Fixed GFAPI::update_entry() to update the entry status
+
+ - AF: Added support for "dynamic_field_map" field setting
+ - AF: Added icon support to form editor top toolbar
+ - AF: Added support for displaying an icon next to the form settings page title
+ - AF: Added support for displaying an icon next to the plugin settings page title
+ - AF: Added support for configuring a form settings page title (using first section as default)
+ - AF: Added support for configuring the "No items" message as well as forcing any message to be displayed in the feed list
+ - AF: Added support for "requires credit card" setting in the Payment Add-On to be used by payment gateways that require a credit card field on the form
+ - AF: Added replace_field() method to replace a field by name in a given $settings array
+ - AF: Added get_field() method to retrieve a field by name in a given $settings array
+ - AF: Updated get_feed() method to return false if no feed is found instead of a non-empty array
+ - AF: Updated get_payment_choices() from private to public
+ - AF: Updated the feed add-on feed_condition field to trim values before saving
+ - AF: Updated payment add-on to better handle different payment actions
+ - AF: Updated payment add-on get_webhook_url() to use simpler callback parameter
+ - AF: Updated default icon for the Results menu
+ - AF: Updated Payment Add-On default settings so that it is easier to add feed settings under the "Other" section
+ - AF: Updated field_map settings field type so that it is available from GFAddon instead of GFFeedAddOn
+ - AF: Fixed issue with subscription cancellation
+ - AF: Fixed results calculation loop to allow add-ons to add custom data to the field_data element. Fixes an issue with the Quiz Add-On correct/incorrect numbers for > 150 entries.
+
+-------------------------------------------------------------------------------------------------------------------
+Version 1.8.3
+ - Added new filter "gform_post_category_choices" to alter post category choices sort order. Both globally and form id + field id specific.
+ add_filter("gform_post_category_choices", "set_sort", 10, 3);
+ function set_sort($choices, $field, $form_id){
+ //usort calls a custom sort function you create
+ usort($choices, "sort_numerically");
+ return $choices;
+ }
+ function sort_numerically($a, $b){
+ return floatval($a["text"]) > floatval($b["text"]);
+ }
+ OR
+ add_filter("gform_post_category_choices_390_1", "set_sort", 10, 3);
+ function set_sort($choices, $field, $form_id){
+ //usort calls a custom sort function you create
+ usort($choices, "sort_numerically");
+ return $choices;
+ }
+ function sort_numerically($a, $b){
+ return floatval($a["text"]) > floatval($b["text"]);
+ }
+ - Added INACTIVE setup script to trim leading and trailing spaces from all entry values, field labels, choice texts, choice values and input labels. Uncomment line 503 to test.
+ - Updated GFFormDetail::add_field() to json_encode the field markup before sending it back to the form editor
+ - Updated GFCommon::calculate() to replace multiple spaces and new lines with a single space
+ - Updated the fileupload field to use the https protocol in links to file downloads when the entry detail and entry edit pages are using SSL
+ - Fixed issue with "No duplicates" option displaying on multi-select fields
+ - Fixed an issue with conditional logic failing and some fields not retaining values after validation and changing page with field choices having leading or trailing spaces.
+ - Fixed missing delete icon on the entry edit page.
+ - Fixed a PHP warning on form submission with unsaved imported forms with post fields.
+ - Fixed inconsistent permission allowing users to import forms without edit form permission.
+ - Fixed issue where empty fileupload fields were being displayed in the entry detail, entry print page and {all_fields] merge tag.
+ - Fixed intermittent fatal error calling get_plugins().
+ - Fixed missing gform_pre_enqueue_scripts hook causing conflict with Picatcha.
+ - Fixed the gform_filters_get_users filter.
+ - Fixed missing ';' on gformInitCurrencyFormatFields() init script.
+
+ - API: Updated GFWebAPI::end() to public static so it can be used by add-ons.
+ - API: Added gform_webapi_$METHOD_$COLLECTION and gform_webapi_$METHOD_$COLLECTION1_$COLLECTION2 actions.
+ - API: Removed gform_webapi_$METHOD_$COLLECTION and gform_webapi_$METHOD_$COLLECTION_$COLLECTION2 filters.
+
-------------------------------------------------------------------------------------------------------------------
Version 1.8.1
@@ -96,7 +359,7 @@ Version 1.8
- Updated the hierarchy indicator in the Post Category field from spaces to continuous lines
- Updated the results page to display as a view of the gf_entries page so the gravityforms_view_entries capability is required instead of gravityforms_edit_forms (in addition to the gravityforms_{add-on}_results capability)
- Updated the results page filter box from sticky (always visible) and fixed height to static and fluid height
- - Updated form submission process to trim leading and trailing spaces before validation and before saving. Added the gform_trim_input_value filter to so it's possible to override this behaviour by field and by form.
+ - Updated form submission process to trim leading and trailing spaces before validation and before saving. Added the gform_trim_input_value filter so it's possible to override this behaviour by field and by form.
- Updated calculation formula so that it is now trimmed in the form editor
- Updated single product field. Removed Admin Label setting
- Updated conditional logic for fields with choices to display dropdown values for "is" and "is not" operators and a textbox values for other operators
@@ -409,7 +672,7 @@ Version 1.8.beta1
- Updated the hierarchy indicator in the Post Category field from spaces to continuous lines
- Updated the results page to display as a view of the gf_entries page so the gravityforms_view_entries capability is required instead of gravityforms_edit_forms (in addition to the gravityforms_{add-on}_results capability)
- Updated the results page filter box from sticky (always visible) and fixed height to static and fluid height
- - Updated form submission process to trim leading and trailing spaces before validation and before saving. Added the gform_trim_input_value filter to so it's possible to override this behaviour by field and by form.
+ - Updated form submission process to trim leading and trailing spaces before validation and before saving. Added the gform_trim_input_value filter so it's possible to override this behaviour by field and by form.
- Updated calculation formula so that it is now trimmed in the form editor
- Updated single product field. Removed Admin Label setting
- Updated conditional logic for fields with choices to display dropdown values for "is" and "is not" operators and a textbox values for other operators
diff --git a/common.php b/common.php
index c83321c..c31f86a 100644
--- a/common.php
+++ b/common.php
@@ -1,5863 +1,5983 @@
-" . $field_label . "";
- }
- }
- return $str;
- }
-
- public static function is_numeric($value, $number_format=""){
-
- switch($number_format){
- case "decimal_dot" :
- return preg_match("/^(-?[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]+)?)$/", $value);
- break;
-
- case "decimal_comma" :
- return preg_match("/^(-?[0-9]{1,3}(?:\.?[0-9]{3})*(?:,[0-9]+)?)$/", $value);
- break;
-
- default :
- return preg_match("/^(-?[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]{2})?)$/", $value) || preg_match("/^(-?[0-9]{1,3}(?:\.?[0-9]{3})*(?:,[0-9]{2})?)$/", $value);
-
- }
- }
-
- public static function trim_all($text){
- $text = trim($text);
- do{
- $prev_text = $text;
- $text = str_replace(" ", " ", $text);
- }
- while($text != $prev_text);
-
- return $text;
- }
-
- public static function format_number($number, $number_format){
- if(!is_numeric($number))
- return $number;
-
- //replacing commas with dots and dots with commas
- if($number_format == "currency"){
- if(false === class_exists('RGCurrency')){
- require_once( GFCommon::get_base_path() . '/currency.php' );
- }
- $currency = new RGCurrency( GFCommon::get_currency() );
- $number = $currency->to_money( $number );
- } elseif ($number_format == "decimal_comma"){
- $number = str_replace(",", "|", $number);
- $number = str_replace(".", ",", $number);
- $number = str_replace("|", ".", $number);
- }
-
- return $number;
- }
-
- public static function recursive_add_index_file($dir) {
- if(!is_dir($dir))
- return;
-
- if(!($dp = opendir($dir)))
- return;
-
- //ignores all errors
- set_error_handler(create_function("", "return 0;"), E_ALL);
-
- //creates an empty index.html file
- if($f = fopen($dir . "/index.html", 'w'))
- fclose($f);
-
- //restores error handler
- restore_error_handler();
-
- while((false !== $file = readdir($dp))){
- if(is_dir("$dir/$file") && $file != '.' && $file !='..')
- self::recursive_add_index_file("$dir/$file");
- }
-
- closedir($dp);
- }
-
- public static function clean_number($number, $number_format=""){
- if(rgblank($number))
- return $number;
-
- $decimal_char = "";
- if($number_format == "decimal_dot")
- $decimal_char = ".";
- else if($number_format == "decimal_comma")
- $decimal_char = ",";
-
- $float_number = "";
- $clean_number = "";
- $is_negative = false;
-
- //Removing all non-numeric characters
- $array = str_split($number);
- foreach($array as $char){
- if (($char >= '0' && $char <= '9') || $char=="," || $char==".")
- $clean_number .= $char;
- else if($char == '-')
- $is_negative = true;
- }
-
- //Removing thousand separators but keeping decimal point
- $array = str_split($clean_number);
- for($i=0, $count = sizeof($array); $i<$count; $i++)
- {
- $char = $array[$i];
- if ($char >= '0' && $char <= '9')
- $float_number .= $char;
- else if(empty($decimal_char) && ($char == "." || $char == ",") && strlen($clean_number) - $i <= 3)
- $float_number .= ".";
- else if($decimal_char == $char)
- $float_number .= ".";
- }
-
- if($is_negative)
- $float_number = "-" . $float_number;
-
- return $float_number;
-
- }
-
- public static function json_encode($value){
- return json_encode($value);
- }
-
- public static function json_decode($str, $is_assoc=true){
- return json_decode($str, $is_assoc);
- }
-
- //Returns the url of the plugin's root folder
- public static function get_base_url(){
- return plugins_url( '', __FILE__ );
- }
-
- //Returns the physical path of the plugin's root folder
- public static function get_base_path(){
- return dirname( __FILE__ );
- }
-
- public static function get_email_fields($form){
- $fields = array();
- foreach($form["fields"] as $field){
- if(RGForms::get("type", $field) == "email" || RGForms::get("inputType", $field) == "email")
- $fields[] = $field;
- }
-
- return $fields;
- }
-
- public static function truncate_middle($text, $max_length){
- if(strlen($text) <= $max_length)
- return $text;
-
- $middle = intval($max_length / 2);
- return self::safe_substr($text, 0, $middle) . "..." . self::safe_substr($text, strlen($text) - $middle, $middle);
- }
-
- public static function is_invalid_or_empty_email($email){
- return empty($email) || !self::is_valid_email($email);
- }
-
- public static function is_valid_url($url){
- return preg_match('!^(http|https)://([\w-]+\.?)+[\w-]+(:\d+)?(/[\w- ./?~%&=+\']*)?$!', $url);
- }
-
- public static function is_valid_email($email){
- return preg_match('/^(([a-zA-Z0-9_.\-+!#$&\'*+=?^`{|}~])+\@((([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+|localhost) *,? *)+$/', $email);
- }
-
- public static function get_label($field, $input_id = 0, $input_only = false){
- return RGFormsModel::get_label($field, $input_id, $input_only);
- }
-
- public static function get_input($field, $id){
- return RGFormsModel::get_input($field, $id);
- }
-
- public static function insert_variables($fields, $element_id, $hide_all_fields=false, $callback="", $onchange="", $max_label_size=40, $exclude = null, $args="", $class_name=""){
-
- if($fields == null)
- $fields = array();
-
- if($exclude == null)
- $exclude = array();
-
- $exclude = apply_filters("gform_merge_tag_list_exclude", $exclude, $element_id, $fields);
- $merge_tags = self::get_merge_tags($fields, $element_id, $hide_all_fields, $exclude, $args);
-
- $onchange = empty($onchange) ? "InsertVariable('{$element_id}', '{$callback}');" : $onchange;
- $class = trim($class_name . " gform_merge_tags");
-
- ?>
-
-
-
-
- $group_tags) {
-
- $group_label = rgar($group_tags, 'label');
- $tags = rgar($group_tags, 'tags');
-
- if(empty($group_tags['tags']))
- continue;
-
- if($group_label) { ?>
-
-
-
-
-
-
-
-
-
-
-
- '{all_fields}', 'label' => __('All Submitted Fields', 'gravityforms'));
-
- // group fields by required, optional, and pricing
- foreach($fields as $field) {
-
- if(rgget("displayOnly", $field))
- continue;
-
- $input_type = RGFormsModel::get_input_type($field);
-
- // skip field types that should be excluded
- if(is_array($exclude_field_types) && in_array($input_type, $exclude_field_types))
- continue;
-
- if(rgar($field, 'isRequired')) {
-
- switch($input_type) {
-
- case "name" :
-
- if(rgar($field,"nameFormat") == "extended") {
-
- $prefix = GFCommon::get_input($field, $field["id"] + 0.2);
- $suffix = GFCommon::get_input($field, $field["id"] + 0.8);
- $optional_field = $field;
- $optional_field["inputs"] = array($prefix, $suffix);
-
- //Add optional name fields to the optional list
- $optional_fields[] = $optional_field;
-
- //Remove optional name field from required list
- unset($field["inputs"][0]);
- unset($field["inputs"][3]);
-
- }
-
- $required_fields[] = $field;
-
- break;
-
- default:
- $required_fields[] = $field;
- }
- }
- else {
- $optional_fields[] = $field;
- }
-
- if(self::is_pricing_field($field["type"])){
- $pricing_fields[] = $field;
- }
-
- }
-
- if(!empty($required_fields)){
- foreach($required_fields as $field){
- $required_group = array_merge($required_group, self::get_field_merge_tags($field, $option));
- }
- }
-
- if(!empty($optional_fields)){
- foreach($optional_fields as $field){
- $optional_group = array_merge($optional_group, self::get_field_merge_tags($field, $option));
- }
- }
-
- if(!empty($pricing_fields)){
-
- if(!$hide_all_fields)
- $pricing_group[] = array('tag' => '{pricing_fields}', 'label' => __("All Pricing Fields", "gravityforms"));
-
- foreach($pricing_fields as $field){
- $pricing_group = array_merge($pricing_group, self::get_field_merge_tags($field, $option));
- }
-
- }
-
- $other_group[] = array('tag' => '{ip}', 'label' => __("Client IP Address", "gravityforms"));
- $other_group[] = array('tag' => '{date_mdy}', 'label' => __("Date", "gravityforms") . ' (mm/dd/yyyy)');
- $other_group[] = array('tag' => '{date_dmy}', 'label' => __("Date", "gravityforms") . ' (dd/mm/yyyy)');
- $other_group[] = array('tag' => '{embed_post:ID}', 'label' => __("Embed Post/Page Id", "gravityforms"));
- $other_group[] = array('tag' => '{embed_post:post_title}', 'label' => __("Embed Post/Page Title", "gravityforms"));
- $other_group[] = array('tag' => '{embed_url}', 'label' => __("Embed URL", "gravityforms"));
- $other_group[] = array('tag' => '{entry_id}', 'label' => __("Entry Id", "gravityforms"));
- $other_group[] = array('tag' => '{entry_url}', 'label' => __("Entry URL", "gravityforms"));
- $other_group[] = array('tag' => '{form_id}', 'label' => __("Form Id", "gravityforms"));
- $other_group[] = array('tag' => '{form_title}', 'label' => __("Form Title", "gravityforms"));
- $other_group[] = array('tag' => '{user_agent}', 'label' => __("HTTP User Agent", "gravityforms"));
- $other_group[] = array('tag' => '{referer}', 'label' => __("HTTP Referer URL", "gravityforms"));
-
- if(self::has_post_field($fields)) {
- $other_group[] = array('tag' => '{post_id}', 'label' => __("Post Id", "gravityforms"));
- $other_group[] = array('tag' => '{post_edit_url}', 'label' => __("Post Edit URL", "gravityforms"));
- }
-
- $other_group[] = array('tag' => '{user:display_name}', 'label' => __("User Display Name", "gravityforms"));
- $other_group[] = array('tag' => '{user:user_email}', 'label' => __("User Email", "gravityforms"));
- $other_group[] = array('tag' => '{user:user_login}', 'label' => __("User Login", "gravityforms"));
-
- $custom_group = apply_filters('gform_custom_merge_tags', array(), rgars($fields, '0/formId'), $fields, $element_id);
-
- $merge_tags = array(
- 'ungrouped' => array(
- 'label' => false,
- 'tags' => $ungrouped
- ),
- 'required' => array(
- 'label' => __("Required form fields", "gravityforms"),
- 'tags' => $required_group
- ),
- 'optional' => array(
- 'label' => __("Optional form fields", "gravityforms"),
- 'tags' => $optional_group
- ),
- 'pricing' => array(
- 'label' => __("Pricing form fields", "gravityforms"),
- 'tags' => $pricing_group
- ),
- 'other' => array(
- 'label' => __("Other", "gravityforms"),
- 'tags' => $other_group
- ),
- 'custom' => array(
- 'label' => __("Custom", "gravityforms"),
- 'tags' => $custom_group
- )
- );
-
- return $merge_tags;
- }
-
- public static function get_field_merge_tags($field, $option="") {
-
- $merge_tags = array();
- $tag_args = RGFormsModel::get_input_type($field) == "list" ? ":{$option}" : ""; //args currently only supported by list field
-
- if(isset($field["inputs"]) && is_array($field["inputs"])) {
-
- if(RGFormsModel::get_input_type($field) == "checkbox") {
- $value = "{" . esc_html(GFCommon::get_label($field, $field["id"])) . ":" . $field["id"] . "{$tag_args}}";
- $merge_tags[] = array( 'tag' => $value, 'label' => esc_html(GFCommon::get_label($field, $field["id"])) );
- }
-
- foreach($field["inputs"] as $input) {
- $value = "{" . esc_html(GFCommon::get_label($field, $input["id"])) . ":" . $input["id"] . "{$tag_args}}";
- $merge_tags[] = array( 'tag' => $value, 'label' => esc_html(GFCommon::get_label($field, $input["id"])) );
- }
-
- }
- else {
- $value = "{" . esc_html(GFCommon::get_label($field)) . ":" . $field["id"] . "{$tag_args}}";
- $merge_tags[] = array( 'tag' => $value, 'label' => esc_html(GFCommon::get_label($field)) );
- }
-
- return $merge_tags;
- }
-
- public static function insert_field_variable($field, $max_label_size=40, $args=""){
-
- $tag_args = RGFormsModel::get_input_type($field) == "list" ? ":{$args}" : ""; //args currently only supported by list field
-
- if(is_array($field["inputs"]))
- {
- if(RGFormsModel::get_input_type($field) == "checkbox"){
- ?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ">
-
-
-
-
-
-
-
-
-
- ">
-
-
-
- '>
-
-
-
-
-
-
-
-
-
- post_title;
- case "caption" :
- $media = get_post($media_id);
- return $media->post_excerpt;
- case "description" :
- $media = get_post($media_id);
- return $media->post_content;
-
- default :
-
- $img = wp_get_attachment_image($media_id, $arg1, false, array("class" => "size-{$arg1} align{$arg2} wp-image-{$media_id}"));
- return $img;
- }
- }
-
- public static function replace_variables_post_image($text, $post_images, $lead){
-
- preg_match_all('/{[^{]*?:(\d+)(:([^:]*?))?(:([^:]*?))?(:url)?}/mi', $text, $matches, PREG_SET_ORDER);
- if(is_array($matches))
- {
- foreach($matches as $match){
- $input_id = $match[1];
-
- //ignore fields that are not post images
- if(!isset($post_images[$input_id]))
- continue;
-
- //Reading alignment and "url" parameters.
- //Format could be {image:5:medium:left:url} or {image:5:medium:url}
- $size_meta = empty($match[3]) ? "full" : $match[3];
- $align = empty($match[5]) ? "none" : $match[5];
- if($align == "url"){
- $align = "none";
- $is_url = true;
- }
- else{
- $is_url = rgar($match,6) == ":url";
- }
-
- $media_id = $post_images[$input_id];
- $value = is_wp_error($media_id) ? "" : self::get_post_image_variable($media_id, $size_meta, $align, $is_url);
-
- $text = str_replace($match[0], $value , $text);
- }
- }
-
- return $text;
- }
-
- public static function implode_non_blank($separator, $array){
-
- if(!is_array($array))
- return "";
-
- $ary = array();
- foreach($array as $item){
- if(!rgblank($item))
- $ary[] = $item;
- }
- return implode($separator, $ary);
- }
-
- private static function format_variable_value($value, $url_encode, $esc_html, $format){
- if($esc_html)
- $value = esc_html($value);
-
- if($format == "html")
- $value = nl2br($value);
-
- if($url_encode)
- $value = urlencode($value);
-
- return $value;
- }
-
- public static function replace_variables($text, $form, $lead, $url_encode = false, $esc_html=true, $nl2br = true, $format="html"){
- $text = $nl2br ? nl2br($text) : $text;
-
- //Replacing field variables: {FIELD_LABEL:FIELD_ID} {My Field:2}
- preg_match_all('/{[^{]*?:(\d+(\.\d+)?)(:(.*?))?}/mi', $text, $matches, PREG_SET_ORDER);
- if(is_array($matches))
- {
- foreach($matches as $match){
- $input_id = $match[1];
-
- $field = RGFormsModel::get_field($form,$input_id);
-
- $value = RGFormsModel::get_lead_field_value($lead, $field);
- $raw_value = $value;
-
- if(is_array($value))
- $value = rgar($value, $input_id);
-
- $value = self::format_variable_value($value, $url_encode, $esc_html, $format);
-
- switch(RGFormsModel::get_input_type($field)){
-
- case "fileupload" :
- if(rgar($field, "multipleFiles")){
- $files = empty($value) ? array() : json_decode($value, true);
- foreach($files as &$file){
- $file = str_replace(" ", "%20", $file);
- }
- $value = join("\r\n", $files);
- if($format == "html"){
- $value = nl2br($value);
- }
- } else {
- $value = str_replace(" ", "%20", $value);
- }
-
- break;
-
- case "post_image" :
- list($url, $title, $caption, $description) = explode("|:|", $value);
- $value = str_replace(" ", "%20", $url);
- break;
-
- case "checkbox" :
- case "select" :
- case "radio" :
-
- $use_value = rgar($match,4) == "value";
- $use_price = in_array(rgar($match,4), array("price", "currency"));
- $format_currency = rgar($match,4) == "currency";
-
- if(is_array($raw_value) && (string)intval($input_id) != $input_id){
- $items = array($input_id => $value); //float input Ids. (i.e. 4.1 ). Used when targeting specific checkbox items
- }
- else if(is_array($raw_value)){
- $items = $raw_value;
- }
- else{
- $items = array($input_id => $raw_value);
- }
-
- $ary = array();
-
- foreach($items as $input_id => $item){
- if($use_value){
- list($val, $price) = rgexplode("|", $item, 2);
- }
- else if($use_price){
- list($name, $val) = rgexplode("|", $item, 2);
- if($format_currency)
- $val = GFCommon::to_money($val, rgar($lead, "currency"));
- }
- else if($field["type"] == "post_category"){
- $use_id = strtolower(rgar($match,4)) == "id";
- $item_value = self::format_post_category($item, $use_id);
-
- $val = RGFormsModel::is_field_hidden($form, $field, array(), $lead) ? "" : $item_value;
- }
- else{
- $val = RGFormsModel::is_field_hidden($form, $field, array(), $lead) ? "" : RGFormsModel::get_choice_text($field, $raw_value, $input_id);
- }
-
- $ary[] = self::format_variable_value($val, $url_encode, $esc_html, $format);
- }
-
- $value = self::implode_non_blank(", ", $ary);
-
- break;
-
- case "multiselect" :
- if($field["type"] == "post_category"){
- $use_id = strtolower(rgar($match,4)) == "id";
- $items = explode(",", $value);
-
- if(is_array($items)){
- $cats = array();
- foreach($items as $item){
- $cat = self::format_post_category($item, $use_id);
- $cats[] = self::format_variable_value($cat, $url_encode, $esc_html, $format);
- }
- $value = self::implode_non_blank(", ", $cats);
- }
- }
-
- break;
-
- case "date" :
- $value = self::date_display($value, rgar($field,"dateFormat"));
- break;
-
- case "total" :
- $format_numeric = rgar($match,4) == "price";
-
- $value = $format_numeric ? GFCommon::to_number($value) : GFCommon::to_money($value);
-
- $value = self::format_variable_value($value, $url_encode, $esc_html, $format);
- break;
-
- case "post_category" :
- $use_id = strtolower(rgar($match,4)) == "id";
- $value = self::format_post_category($value, $use_id);
- $value = self::format_variable_value($value, $url_encode, $esc_html, $format);
- break;
-
- case "list" :
- $output_format = in_array(rgar($match,4), array("text", "html", "url")) ? rgar($match,4) : $format;
- $value = self::get_lead_field_display($field, $raw_value, $lead["currency"], true, $output_format);
- break;
- }
-
- if(rgar($match,4) == "label"){
- $value = empty($value) ? "" : rgar($field, "label");
- }
- else if(rgar($match,4) == "qty" && $field["type"] == "product"){
- //getting quantity associated with product field
- $products = self::get_product_fields($form, $lead, false, false);
- $value = 0;
- foreach($products["products"] as $product_id => $product)
- {
- if($product_id == $field["id"])
- $value = $product["quantity"];
- }
- }
-
- //Encoding left curly bracket so that merge tags entered in the front end are displayed as is and not "executed"
- $value = self::encode_merge_tag($value);
-
- //filter can change merge code variable
- $value = apply_filters("gform_merge_tag_filter", $value, $input_id, rgar($match,4), $field, $raw_value);
- if($value === false)
- $value = "";
-
- $text = str_replace($match[0], $value , $text);
- }
- }
-
- //replacing global variables
- //form title
- $text = str_replace("{form_title}", $url_encode ? urlencode($form["title"]) : $form["title"], $text);
-
- $matches = array();
- preg_match_all("/{all_fields(:(.*?))?}/", $text, $matches, PREG_SET_ORDER);
- foreach($matches as $match){
- $options = explode(",", rgar($match,2));
- $use_value = in_array("value", $options);
- $display_empty = in_array("empty", $options);
- $use_admin_label = in_array("admin", $options);
-
- //all submitted fields using text
- if (strpos($text, $match[0]) !== false){
- $text = str_replace($match[0], self::get_submitted_fields($form, $lead, $display_empty, !$use_value, $format, $use_admin_label, "all_fields", rgar($match,2)), $text);
- }
- }
-
- //all submitted fields including empty fields
- if (strpos($text, "{all_fields_display_empty}") !== false){
- $text = str_replace("{all_fields_display_empty}", self::get_submitted_fields($form, $lead, true, true, $format, false, "all_fields_display_empty"), $text);
- }
-
- //pricing fields
- if (strpos($text, "{pricing_fields}") !== false){
- $text = str_replace("{pricing_fields}", self::get_submitted_pricing_fields($form, $lead, $format), $text);
- }
-
- //form id
- $text = str_replace("{form_id}", $url_encode ? urlencode($form["id"]) : $form["id"], $text);
-
- //entry id
- $text = str_replace("{entry_id}", $url_encode ? urlencode(rgar($lead, "id")) : rgar($lead, "id"), $text);
-
- //entry url
- $entry_url = get_bloginfo("wpurl") . "/wp-admin/admin.php?page=gf_entries&view=entry&id=" . $form["id"] . "&lid=" . rgar($lead,"id");
- $text = str_replace("{entry_url}", $url_encode ? urlencode($entry_url) : $entry_url, $text);
-
- //post id
- $text = str_replace("{post_id}", $url_encode ? urlencode($lead["post_id"]) : $lead["post_id"], $text);
-
- //admin email
- $wp_email = get_bloginfo("admin_email");
- $text = str_replace("{admin_email}", $url_encode ? urlencode($wp_email) : $wp_email, $text);
-
- //post edit url
- $post_url = get_bloginfo("wpurl") . "/wp-admin/post.php?action=edit&post=" . $lead["post_id"];
- $text = str_replace("{post_edit_url}", $url_encode ? urlencode($post_url) : $post_url, $text);
-
- $text = self::replace_variables_prepopulate($text, $url_encode);
-
- // hook allows for custom merge tags
- $text = apply_filters('gform_replace_merge_tags', $text, $form, $lead, $url_encode, $esc_html, $nl2br, $format);
-
- // TODO: Deprecate the 'gform_replace_merge_tags' and replace it with a call to the 'gform_merge_tag_filter'
- //$text = apply_filters('gform_merge_tag_filter', $text, false, false, false );
-
- $text = self::decode_merge_tag($text);
- return $text;
- }
-
- public static function encode_merge_tag($text){
- return str_replace("{", "{", $text);
- }
-
- public static function decode_merge_tag($text){
- return str_replace("{", "{", $text);
- }
-
- public static function format_post_category($value, $use_id){
-
- list($item_value, $item_id) = rgexplode(":", $value, 2);
-
- if($use_id && !empty($item_id))
- $item_value = $item_id;
-
- return $item_value;
- }
-
- public static function get_embed_post(){
- global $embed_post, $post, $wp_query;
-
- if($embed_post){
- return $embed_post;
- }
-
- if(!rgempty("gform_embed_post")){
- $post_id = absint(rgpost("gform_embed_post"));
- $embed_post = get_post($post_id);
- }
- else if($wp_query->is_in_loop){
- $embed_post = $post;
- }
- else{
- $embed_post = array();
- }
- }
-
- public static function replace_variables_prepopulate($text, $url_encode=false){
-
- //embed url
- $text = str_replace("{embed_url}", $url_encode ? urlencode(RGFormsModel::get_current_page_url()) : RGFormsModel::get_current_page_url(), $text);
-
- $local_timestamp = self::get_local_timestamp(time());
-
- //date (mm/dd/yyyy)
- $local_date_mdy = date_i18n("m/d/Y", $local_timestamp, true);
- $text = str_replace("{date_mdy}", $url_encode ? urlencode($local_date_mdy) : $local_date_mdy, $text);
-
- //date (dd/mm/yyyy)
- $local_date_dmy = date_i18n("d/m/Y", $local_timestamp, true);
- $text = str_replace("{date_dmy}", $url_encode ? urlencode($local_date_dmy) : $local_date_dmy, $text);
-
- // ip
- $ip = GFFormsModel::get_ip();
- $text = str_replace( '{ip}', $url_encode ? urlencode( $ip ) : $ip, $text );
-
- global $post;
- $post_array = self::object_to_array($post);
- preg_match_all("/\{embed_post:(.*?)\}/", $text, $matches, PREG_SET_ORDER);
- foreach($matches as $match){
- $full_tag = $match[0];
- $property = $match[1];
- $text = str_replace($full_tag, $url_encode ? urlencode($post_array[$property]) : $post_array[$property], $text);
- }
-
- //embed post custom fields
- preg_match_all("/\{custom_field:(.*?)\}/", $text, $matches, PREG_SET_ORDER);
- foreach($matches as $match){
-
- $full_tag = $match[0];
- $custom_field_name = $match[1];
- $custom_field_value = !empty($post_array["ID"]) ? get_post_meta($post_array["ID"], $custom_field_name, true) : "";
- $text = str_replace($full_tag, $url_encode ? urlencode($custom_field_value) : $custom_field_value, $text);
- }
-
- //user agent
- $text = str_replace("{user_agent}", $url_encode ? urlencode(RGForms::get("HTTP_USER_AGENT", $_SERVER)) : RGForms::get("HTTP_USER_AGENT", $_SERVER), $text);
-
- //referrer
- $text = str_replace("{referer}", $url_encode ? urlencode(RGForms::get("HTTP_REFERER", $_SERVER)) : RGForms::get("HTTP_REFERER", $_SERVER), $text);
-
- //logged in user info
- global $userdata, $wp_version, $current_user;
- $user_array = self::object_to_array($userdata);
-
- preg_match_all("/\{user:(.*?)\}/", $text, $matches, PREG_SET_ORDER);
- foreach($matches as $match){
- $full_tag = $match[0];
- $property = $match[1];
-
- $value = version_compare($wp_version, '3.3', '>=') ? $current_user->get($property) : $user_array[$property];
- $value = $url_encode ? urlencode($value) : $value;
-
- $text = str_replace($full_tag, $value, $text);
- }
-
- return $text;
- }
-
- public static function object_to_array($object){
- $array=array();
- if(!empty($object)){
- foreach($object as $member=>$data)
- $array[$member]=$data;
- }
- return $array;
- }
-
- public static function is_empty_array($val){
- if(!is_array($val))
- $val = array($val);
-
- $ary = array_values($val);
- foreach($ary as $item){
- if(!rgblank($item))
- return false;
- }
- return true;
- }
-
- public static function get_submitted_fields($form, $lead, $display_empty=false, $use_text=false, $format="html", $use_admin_label=false, $merge_tag="", $options=""){
-
- $field_data = "";
- if($format == "html"){
- $field_data = '
-
- ';
- }
-
- $options_array = explode(",", $options);
- $no_admin = in_array("noadmin", $options_array);
- $no_hidden = in_array("nohidden", $options_array);
- $has_product_fields = false;
- foreach($form["fields"] as $field){
- $field_value = "";
-
- $field_label = $use_admin_label && !rgempty("adminLabel", $field) ? rgar($field, "adminLabel") : esc_html(GFCommon::get_label($field));
-
- switch($field["type"]){
- case "captcha" :
- break;
-
- case "section" :
- if((!GFCommon::is_section_empty($field, $form, $lead) || $display_empty) && !rgar($field, "adminOnly")){
-
- switch($format){
- case "text" :
- $field_value = "--------------------------------\n{$field_label}\n\n";
- break;
-
- default:
- $field_value = sprintf('
- %s
-
- ', $field_label);
- break;
- }
- }
-
- $field_value = apply_filters("gform_merge_tag_filter", $field_value, $merge_tag, $options, $field, $field_label);
-
- $field_data .= $field_value;
-
- break;
- case "password" :
- //ignore password fields
- break;
-
- default :
-
- //ignore product fields as they will be grouped together at the end of the grid
- if(self::is_product_field($field["type"])){
- $has_product_fields = true;
- continue;
- }
- else if(RGFormsModel::is_field_hidden($form, $field, array(), $lead)){
- //ignore fields hidden by conditional logic
- continue;
- }
-
- $raw_field_value = RGFormsModel::get_lead_field_value($lead, $field);
- $field_value = GFCommon::get_lead_field_display($field, $raw_field_value, rgar($lead,"currency"), $use_text, $format, "email");
-
- $display_field = true;
- //depending on parameters, don't display adminOnly or hidden fields
- if($no_admin && rgar($field, "adminOnly"))
- $display_field = false;
- else if($no_hidden && RGFormsModel::get_input_type($field) == "hidden")
- $display_field = false;
-
- //if field is not supposed to be displayed, pass false to filter. otherwise, pass field's value
- if(!$display_field)
- $field_value = false;
-
- $field_value = apply_filters("gform_merge_tag_filter", $field_value, $merge_tag, $options, $field, $raw_field_value);
-
- if($field_value === false)
- continue;
-
- if( !empty($field_value) || strlen($field_value) > 0 || $display_empty){
- switch($format){
- case "text" :
- $field_data .= "{$field_label}: {$field_value}\n\n";
- break;
-
- default:
-
- $field_data .= sprintf('
-
- %s
-
-
-
-
-
- %s
-
-
- ', $field_label, empty($field_value) && strlen($field_value) == 0 ? " " : $field_value);
- break;
- }
- }
- }
- }
-
- if($has_product_fields)
- $field_data .= self::get_submitted_pricing_fields($form, $lead, $format, $use_text, $use_admin_label);
-
- if($format == "html"){
- $field_data .='
-
-
-
';
- }
-
- return $field_data;
- }
-
- public static function get_submitted_pricing_fields($form, $lead, $format, $use_text=true, $use_admin_label=false){
- $form_id = $form["id"];
- $order_label = apply_filters("gform_order_label_{$form["id"]}", apply_filters("gform_order_label", __("Order", "gravityforms"), $form["id"]), $form["id"]);
- $products = GFCommon::get_product_fields($form, $lead, $use_text, $use_admin_label);
- $total = 0;
- $field_data = "";
-
- switch($format){
- case "text" :
- if(!empty($products["products"])){
- $field_data = "--------------------------------\n" . $order_label . "\n\n";
- foreach($products["products"] as $product){
- $product_name = $product["quantity"] . " " . $product["name"];
- $price = self::to_number($product["price"]);
- if(!empty($product["options"])){
- $product_name .= " (";
- $options = array();
- foreach($product["options"] as $option){
- $price += self::to_number($option["price"]);
- $options[] = $option["option_name"];
- }
- $product_name .= implode(", ", $options) . ")";
- }
- $subtotal = floatval($product["quantity"]) * $price;
- $total += $subtotal;
-
- $field_data .= "{$product_name}: " . self::to_money($subtotal, $lead["currency"]) . "\n\n";
- }
- $total += floatval($products["shipping"]["price"]);
-
- if(!empty($products["shipping"]["name"]))
- $field_data .= $products["shipping"]["name"] . ": " . self::to_money($products["shipping"]["price"], $lead["currency"]) . "\n\n";
-
- $field_data .= __("Total", "gravityforms") . ": " . self::to_money($total, $lead["currency"]) . "\n\n";
- }
- break;
-
-
- default :
- if(!empty($products["products"])){
- $field_data ='
-
- ' . $order_label . '
-
-
-
-
-
-
-
- ' . apply_filters("gform_product_{$form_id}", apply_filters("gform_product", __("Product", "gravityforms"), $form_id), $form_id) . '
- ' . apply_filters("gform_product_qty_{$form_id}", apply_filters("gform_product_qty", __("Qty", "gravityforms"), $form_id), $form_id) . '
- ' . apply_filters("gform_product_unitprice_{$form_id}", apply_filters("gform_product_unitprice", __("Unit Price", "gravityforms"), $form_id), $form_id) . '
- ' . apply_filters("gform_product_price_{$form_id}", apply_filters("gform_product_price", __("Price", "gravityforms"), $form_id), $form_id) . '
-
- ';
-
-
- foreach($products["products"] as $product){
-
- $field_data .= '
-
- ' . $product["name"] .'
- ';
-
- $price = self::to_number($product["price"]);
- if(is_array(rgar($product,"options"))){
- foreach($product["options"] as $option){
- $price += self::to_number($option["price"]);
- $field_data .= '' . $option["option_label"] .' ';
- }
- }
- $subtotal = floatval($product["quantity"]) * $price;
- $total += $subtotal;
-
- $field_data .='
-
- ' . $product["quantity"] .'
- ' . self::to_money($price, $lead["currency"]) .'
- ' . self::to_money($subtotal, $lead["currency"]) .'
- ';
- }
- $total += floatval($products["shipping"]["price"]);
- $field_data .= '
- ';
-
- if(!empty($products["shipping"]["name"])){
- $field_data .= '
-
-
- ' . $products["shipping"]["name"] . '
- '. self::to_money($products["shipping"]["price"], $lead["currency"]) . '
-
- ';
- }
-
- $field_data .= '
- ';
-
- if(empty($products["shipping"]["name"])){
- $field_data .= '
- ';
- }
-
- $field_data .= '
- ' . __("Total:", "gravityforms") . '
- '. self::to_money($total, $lead["currency"]) . '
-
-
-
-
- ';
- }
- break;
- }
-
- return $field_data;
- }
-
- public static function send_user_notification($form, $lead, $override_options = false){
- _deprecated_function("send_user_notification", "1.7", "send_notification");
-
- $notification = self::prepare_user_notification($form, $lead, $override_options);
- self::send_email($notification["from"], $notification["to"], $notification["bcc"], $notification["reply_to"], $notification["subject"], $notification["message"], $notification["from_name"], $notification["message_format"], $notification["attachments"]);
- }
-
- public static function send_admin_notification($form, $lead, $override_options = false){
- _deprecated_function("send_admin_notification", "1.7", "send_notification");
-
- $notification = self::prepare_admin_notification($form, $lead, $override_options);
- self::send_email($notification["from"], $notification["to"], $notification["bcc"], $notification["replyTo"], $notification["subject"], $notification["message"], $notification["from_name"], $notification["message_format"], $notification["attachments"]);
- }
-
- private static function prepare_user_notification($form, $lead, $override_options = false){
- $form_id = $form["id"];
-
- if(!isset($form["autoResponder"]))
- return;
-
- //handling autoresponder email
- $to_field = isset($form["autoResponder"]["toField"]) ? rgget($form["autoResponder"]["toField"], $lead) : "";
- $to = apply_filters("gform_autoresponder_email_{$form_id}", apply_filters("gform_autoresponder_email", $to_field, $form), $form);
- $subject = GFCommon::replace_variables(rgget("subject", $form["autoResponder"]), $form, $lead, false, false);
-
- $message_format = apply_filters("gform_notification_format_{$form["id"]}", apply_filters("gform_notification_format", "html", "user", $form, $lead), "user", $form, $lead);
- $message = GFCommon::replace_variables(rgget("message", $form["autoResponder"]), $form, $lead, false, false, !rgget("disableAutoformat", $form["autoResponder"]), $message_format);
- $message = do_shortcode($message);
-
- //Running trough variable replacement
- $to = GFCommon::replace_variables($to, $form, $lead, false, false);
- $from = GFCommon::replace_variables(rgget("from", $form["autoResponder"]), $form, $lead, false, false);
- $bcc = GFCommon::replace_variables(rgget("bcc", $form["autoResponder"]), $form, $lead, false, false);
- $reply_to = GFCommon::replace_variables(rgget("replyTo", $form["autoResponder"]), $form, $lead, false, false);
- $from_name = GFCommon::replace_variables(rgget("fromName", $form["autoResponder"]), $form, $lead, false, false);
-
- // override default values if override options provided
- if($override_options && is_array($override_options)){
- foreach($override_options as $override_key => $override_value){
- ${$override_key} = $override_value;
- }
- }
-
- $attachments = apply_filters("gform_user_notification_attachments_{$form_id}", apply_filters("gform_user_notification_attachments", array(), $lead, $form), $lead, $form);
-
- //Disabling autoformat to prevent double autoformatting of messages
- $disableAutoformat = "1";
-
- return compact("to", "from", "bcc", "reply_to", "subject", "message", "from_name", "message_format", "attachments", "disableAutoformat");
- }
-
- private static function prepare_admin_notification($form, $lead, $override_options = false){
- $form_id = $form["id"];
-
- //handling admin notification email
- $subject = GFCommon::replace_variables(rgget("subject", $form["notification"]), $form, $lead, false, false);
-
- $message_format = apply_filters("gform_notification_format_{$form["id"]}", apply_filters("gform_notification_format", "html", "admin", $form, $lead), "admin", $form, $lead);
- $message = GFCommon::replace_variables(rgget("message", $form["notification"]), $form, $lead, false, false, !rgget("disableAutoformat", $form["notification"]), $message_format);
- $message = do_shortcode($message);
-
- $version_info = self::get_version_info();
- $is_expired = !rgempty("expiration_time", $version_info) && $version_info["expiration_time"] < time();
- if( !rgar($version_info, "is_valid_key") && $is_expired){
- $message .= " Your Gravity Forms License Key has expired. In order to continue receiving support and software updates you must renew your license key. You can do so by following the renewal instructions on the Gravity Forms Settings page in your WordPress Dashboard or by clicking here .";
- }
-
- $from = rgempty("fromField", $form["notification"]) ? rgget("from", $form["notification"]) : rgget($form["notification"]["fromField"], $lead);
-
- if(rgempty("fromNameField", $form["notification"])){
- $from_name = rgget("fromName", $form["notification"]);
- }
- else{
- $field = RGFormsModel::get_field($form, rgget("fromNameField", $form["notification"]));
- $value = RGFormsModel::get_lead_field_value($lead, $field);
- $from_name = GFCommon::get_lead_field_display($field, $value);
- }
-
- $replyTo = rgempty("replyToField", $form["notification"]) ? rgget("replyTo", $form["notification"]): rgget($form["notification"]["replyToField"], $lead);
-
- if(rgempty("routing", $form["notification"])){
- $email_to = rgempty("toField", $form["notification"]) ? rgget("to", $form["notification"]) : rgget("toField", $form["notification"]);
- }
- else{
- $email_to = array();
- foreach($form["notification"]["routing"] as $routing){
-
- $source_field = RGFormsModel::get_field($form, $routing["fieldId"]);
- $field_value = RGFormsModel::get_lead_field_value($lead, $source_field);
- $is_value_match = RGFormsModel::is_value_match($field_value, $routing["value"], $routing["operator"], $source_field) && !RGFormsModel::is_field_hidden($form, $source_field, array(), $lead);
-
- if ($is_value_match)
- $email_to[] = $routing["email"];
- }
-
- $email_to = join(",", $email_to);
- }
-
- //Running through variable replacement
- $email_to = GFCommon::replace_variables($email_to, $form, $lead, false, false);
- $from = GFCommon::replace_variables($from, $form, $lead, false, false);
- $bcc = GFCommon::replace_variables(rgget("bcc", $form["notification"]), $form, $lead, false, false);
- $reply_to = GFCommon::replace_variables($replyTo, $form, $lead, false, false);
- $from_name = GFCommon::replace_variables($from_name, $form, $lead, false, false);
-
- //Filters the admin notification email to address. Allows users to change email address before notification is sent
- $to = apply_filters("gform_notification_email_{$form_id}" , apply_filters("gform_notification_email", $email_to, $lead), $lead);
-
- // override default values if override options provided
- if($override_options && is_array($override_options)){
- foreach($override_options as $override_key => $override_value){
- ${$override_key} = $override_value;
- }
- }
-
- $attachments = apply_filters("gform_admin_notification_attachments_{$form_id}", apply_filters("gform_admin_notification_attachments", array(), $lead, $form), $lead, $form);
-
- //Disabling autoformat to prevent double autoformatting of messages
- $disableAutoformat = "1";
-
- return compact("to", "from", "bcc", "replyTo", "subject", "message", "from_name", "message_format", "attachments", "disableAutoformat");
-
- }
-
- public static function send_notification($notification, $form, $lead){
-
- $notification = apply_filters("gform_notification_{$form["id"]}", apply_filters("gform_notification", $notification, $form, $lead), $form, $lead);
-
- $to_field = "";
- if(rgar($notification, "toType") == "field"){
- $to_field = rgar($notification, "toField");
- if(rgempty("toField", $notification)){
- $to_field = rgar($notification, "to");
- }
- }
-
- $email_to = rgar($notification, "to");
- //do routing logic if "to" field doesn't have a value (to support legacy notifications what will run routing prior to this method
- if(empty($email_to) && rgar($notification, "toType") == "routing"){
- $email_to = array();
- foreach($notification["routing"] as $routing){
-
- $source_field = RGFormsModel::get_field($form, $routing["fieldId"]);
- $field_value = RGFormsModel::get_lead_field_value($lead, $source_field);
- $is_value_match = RGFormsModel::is_value_match($field_value, $routing["value"], $routing["operator"], $source_field) && !RGFormsModel::is_field_hidden($form, $source_field, array(), $lead);
-
- if ($is_value_match)
- $email_to[] = $routing["email"];
- }
-
- $email_to = join(",", $email_to);
- }
- else if (!empty($to_field)) {
- $source_field = RGFormsModel::get_field($form, $to_field);
- $email_to = RGFormsModel::get_lead_field_value($lead, $source_field);
- }
-
- //Running through variable replacement
- $to = GFCommon::replace_variables($email_to, $form, $lead, false, false);
- $subject = GFCommon::replace_variables(rgar($notification, "subject"), $form, $lead, false, false);
- $from = GFCommon::replace_variables(rgar($notification, "from"), $form, $lead, false, false);
- $from_name = GFCommon::replace_variables(rgar($notification, "fromName"), $form, $lead, false, false);
- $bcc = GFCommon::replace_variables(rgar($notification, "bcc"), $form, $lead, false, false);
- $replyTo = GFCommon::replace_variables(rgar($notification, "replyTo"), $form, $lead, false, false);
-
- $message_format = rgempty("message_format", $notification) ? "html" : rgar($notification, "message_format");
- $message = GFCommon::replace_variables(rgar($notification, "message"), $form, $lead, false, false, !rgar($notification, "disableAutoformat"), $message_format);
- $message = do_shortcode($message);
-
- // allow attachments to be passed as a single path (string) or an array of paths, if string provided, add to array
- $attachments = rgar( $notification, "attachments" );
- if( !empty( $attachments ) ) {
- $attachments = is_array( $attachments ) ? $attachments : array( $attachments );
- } else {
- $attachments = array();
- }
-
- self::send_email($from, $to, $bcc, $replyTo, $subject, $message, $from_name, $message_format, $attachments);
-
- return compact("to", "from", "bcc", "replyTo", "subject", "message", "from_name", "message_format", "attachments");
-
- }
-
- public static function send_notifications($notification_ids, $form, $lead, $do_conditional_logic = true, $event = "form_submission"){
- if(!is_array($notification_ids)){
- return;
- }
-
- foreach($notification_ids as $notification_id){
- if(!isset($form["notifications"][$notification_id])){
- continue;
- }
- if(isset($form["notifications"][$notification_id]["isActive"]) && ! $form["notifications"][$notification_id]["isActive"]){
- continue;
- }
-
- $notification = $form["notifications"][$notification_id];
-
- //check conditional logic when appropriate
- if($do_conditional_logic && !GFCommon::evaluate_conditional_logic( rgar($notification,"conditionalLogic"), $form, $lead) ){
- continue;
- }
-
- if(rgar($notification,"type") == "user"){
-
- //Getting user notification from legacy structure (for backwards compatibility)
- $legacy_notification = GFCommon::prepare_user_notification($form, $lead);
- $notification = self::merge_legacy_notification($notification, $legacy_notification);
- }
- else if(rgar($notification,"type") == "admin"){
-
- //Getting admin notification from legacy structure (for backwards compatibility)
- $legacy_notification = GFCommon::prepare_admin_notification($form, $lead);
- $notification = self::merge_legacy_notification($notification, $legacy_notification);
- }
-
-
- //sending notification
- self::send_notification($notification, $form, $lead);
- }
- }
-
- public static function send_form_submission_notifications($form, $lead){
- $notifications = self::get_notifications_to_send("form_submission", $form, $lead);
- $notifications_to_send = array();
-
- //running through filters that disable form submission notifications
- foreach($notifications as $notification){
-
- if(rgar($notification,"type") == "user" && apply_filters("gform_disable_user_notification_{$form["id"]}", apply_filters("gform_disable_user_notification", false, $form, $lead), $form, $lead)){
- //skip user notification if it has been disabled by a hook
- continue;
- }
- else if(rgar($notification,"type") == "admin" && apply_filters("gform_disable_admin_notification_{$form["id"]}", apply_filters("gform_disable_admin_notification", false, $form, $lead), $form, $lead)){
- //skip admin notification if it has been disabled by a hook
- continue;
- }
-
- if(apply_filters("gform_disable_notification_{$form["id"]}", apply_filters("gform_disable_notification", false, $notification, $form, $lead), $notification, $form, $lead)){
- //skip notifications if it has been disabled by a hook
- continue;
- }
-
- $notifications_to_send[] = $notification["id"];
- }
-
- self::send_notifications($notifications_to_send, $form, $lead, true, "form_submission");
- }
-
- private static function merge_legacy_notification($notification, $notification_data){
-
- $keys = array("to", "from", "bcc", "replyTo", "subject", "message", "from_name", "message_format", "attachments", "disableAutoformat");
- foreach($keys as $key)
- $notification[$key] = rgar($notification_data,$key);
-
- return $notification;
- }
-
- public static function get_notifications_to_send($action, $form, $lead){
- $notifications = self::get_notifications($action, $form);
- $notifications_to_send = array();
- foreach($notifications as $notification){
- if(GFCommon::evaluate_conditional_logic(rgar($notification,"conditionalLogic"), $form, $lead)){
- $notifications_to_send[] = $notification;
- }
- }
-
- return $notifications_to_send;
- }
-
- public static function get_notifications($action, $form){
- if(rgempty("notifications", $form))
- return array();
-
- $notifications = array();
- foreach($form["notifications"] as $notification){
- if(rgar($notification, "event") == $action)
- $notifications[] = $notification;
- }
-
- return $notifications;
- }
-
- public static function has_admin_notification($form){
-
- return (!empty($form["notification"]["to"]) || !empty($form["notification"]["routing"])) && (!empty($form["notification"]["subject"]) || !empty($form["notification"]["message"]));
-
- }
-
- public static function has_user_notification($form){
-
- return !empty($form["autoResponder"]["toField"]) && (!empty($form["autoResponder"]["subject"]) || !empty($form["autoResponder"]["message"]));
-
- }
-
- private static function send_email($from, $to, $bcc, $reply_to, $subject, $message, $from_name="", $message_format="html", $attachments=""){
-
- $to = str_replace(" ", "", $to);
- $bcc = str_replace(" ", "", $bcc);
-
- //invalid to email address or no content. can't send email
- if(!GFCommon::is_valid_email($to) || (empty($subject) && empty($message))){
- GFCommon::log_debug("Cannot send email because either the TO address is invalid or there is no SUBJECT or MESSAGE.");
- GFCommon::log_debug(print_r(compact("to", "subject", "message"), true));
- return;
- }
-
- if(!GFCommon::is_valid_email($from))
- $from = get_bloginfo("admin_email");
-
- //invalid from address. can't send email
- if(!GFCommon::is_valid_email($from)){
- GFCommon::log_debug("Cannot send email because the FROM address is invalid.");
- GFCommon::log_debug(print_r(compact("to", "from", "subject"), true));
- return;
- }
-
- $content_type = $message_format == "html" ? "text/html" : "text/plain";
-
- $name = empty($from_name) ? $from : $from_name;
-
- $headers = array();
- $headers["From"] = "From: \"{$name}\" <{$from}>";
-
- if(GFCommon::is_valid_email($reply_to))
- $headers["Reply-To"] = "Reply-To: {$reply_to}";
-
- if(GFCommon::is_valid_email($bcc))
- $headers["Bcc"] = "Bcc: $bcc";
-
- $headers["Content-type"] = "Content-type: {$content_type}; charset=" . get_option('blog_charset');
-
- $abort_email = false;
- extract(apply_filters("gform_pre_send_email", compact("to", "subject", "message", "headers", "attachments", "abort_email"), $message_format));
-
- $is_success = false;
- if(!$abort_email){
- GFCommon::log_debug("Sending email via wp_mail()");
- GFCommon::log_debug(print_r(compact("to", "subject", "message", "headers", "attachments", "abort_email"), true));
- $is_success = wp_mail($to, $subject, $message, $headers, $attachments);
- GFCommon::log_debug("Result from wp_mail(): {$is_success}");
- }
-
- self::add_emails_sent();
-
- do_action("gform_after_email", $is_success, $to, $subject, $message, $headers, $attachments, $message_format);
- }
-
- public static function add_emails_sent(){
-
- $count = self::get_emails_sent();
-
- update_option("gform_email_count", ++$count);
-
- }
-
- public static function get_emails_sent(){
- $count = get_option("gform_email_count");
-
- if(!$count)
- $count = 0;
-
- return $count;
- }
-
- public static function get_api_calls(){
- $count = get_option("gform_api_count");
-
- if(!$count)
- $count = 0;
-
- return $count;
- }
-
- public static function add_api_call(){
-
- $count = self::get_api_calls();
-
- update_option("gform_api_count", ++$count);
-
- }
-
- public static function has_post_field($fields){
- foreach($fields as $field){
- if(in_array($field["type"], array("post_title", "post_content", "post_excerpt", "post_category", "post_image", "post_tags", "post_custom_field")))
- return true;
- }
- return false;
- }
-
- public static function has_list_field($form){
- return self::has_field_by_type($form, 'list');
- }
-
- public static function has_credit_card_field($form){
- return self::has_field_by_type($form, 'creditcard');
- }
-
- private static function has_field_by_type($form, $type) {
- if(is_array($form["fields"])){
- foreach($form["fields"] as $field){
-
- if(RGFormsModel::get_input_type($field) == $type)
- return true;
- }
- }
- return false;
- }
-
- public static function current_user_can_any($caps){
-
- if(!is_array($caps)){
- $has_cap = current_user_can($caps) || current_user_can("gform_full_access");
- return $has_cap;
- }
-
- foreach($caps as $cap){
- if(current_user_can($cap)){
- return true;
- }
- }
-
- $has_full_access = current_user_can("gform_full_access");
- return $has_full_access;
- }
-
- public static function current_user_can_which($caps){
-
- foreach($caps as $cap){
- if(current_user_can($cap))
- return $cap;
- }
-
- return "";
- }
-
- public static function is_pricing_field($field_type){
- return self::is_product_field($field_type) || $field_type == "donation";
- }
-
- public static function is_product_field($field_type){
- return in_array($field_type, array("option", "quantity", "product", "total", "shipping", "calculation"));
- }
-
- public static function all_caps(){
- return array( 'gravityforms_edit_forms',
- 'gravityforms_delete_forms',
- 'gravityforms_create_form',
- 'gravityforms_view_entries',
- 'gravityforms_edit_entries',
- 'gravityforms_delete_entries',
- 'gravityforms_view_settings',
- 'gravityforms_edit_settings',
- 'gravityforms_export_entries',
- 'gravityforms_uninstall',
- 'gravityforms_view_entry_notes',
- 'gravityforms_edit_entry_notes',
- 'gravityforms_view_updates',
- 'gravityforms_view_addons',
- 'gravityforms_preview_forms'
- );
- }
-
- public static function delete_directory($dir) {
- if(!file_exists($dir))
- return;
-
- if ($handle = opendir($dir)){
- $array = array();
- while (false !== ($file = readdir($handle))) {
- if ($file != "." && $file != "..") {
- if(is_dir($dir.$file)){
- if(!@rmdir($dir.$file)) // Empty directory? Remove it
- self::delete_directory($dir.$file.'/'); // Not empty? Delete the files inside it
- }
- else{
- @unlink($dir.$file);
- }
- }
- }
- closedir($handle);
- @rmdir($dir);
- }
- }
-
- public static function get_remote_message(){
- return stripslashes(get_option("rg_gforms_message"));
- }
-
- public static function get_key(){
- return get_option("rg_gforms_key");
- }
-
- public static function has_update($use_cache=true){
- $version_info = GFCommon::get_version_info($use_cache);
- $version = rgar($version_info, "version");
- return empty($version) ? false : version_compare(GFCommon::$version, $version, '<');
- }
-
- public static function get_key_info($key){
-
- $options = array('method' => 'POST', 'timeout' => 3);
- $options['headers'] = array(
- 'Content-Type' => 'application/x-www-form-urlencoded; charset=' . get_option('blog_charset'),
- 'User-Agent' => 'WordPress/' . get_bloginfo("version"),
- 'Referer' => get_bloginfo("url")
- );
- $request_url = GRAVITY_MANAGER_URL . "/api.php?op=get_key&key={$key}";
- $raw_response = wp_remote_request($request_url, $options);
- if ( is_wp_error( $raw_response ) || $raw_response['response']['code'] != 200)
- return array();
-
- $key_info = unserialize(trim($raw_response["body"]));
- return $key_info ? $key_info : array();
- }
-
- public static function get_version_info($cache=true){
-
- $raw_response = get_transient("gform_update_info");
- if(!$cache)
- $raw_response = null;
-
- if(!$raw_response){
- //Getting version number
- $options = array('method' => 'POST', 'timeout' => 20);
- $options['headers'] = array(
- 'Content-Type' => 'application/x-www-form-urlencoded; charset=' . get_option('blog_charset'),
- 'User-Agent' => 'WordPress/' . get_bloginfo("version"),
- 'Referer' => get_bloginfo("url")
- );
- $options['body'] = self::get_remote_post_params();
- $options['timeout'] = 15;
-
- $nocache = $cache ? "" : "?nocache=1"; //disabling server side caching
- $request_url = GRAVITY_MANAGER_URL . "/version.php{$nocache}";
-
- $raw_response = wp_remote_request($request_url, $options);
-
- //caching responses.
- set_transient("gform_update_info", $raw_response, 86400); //caching for 24 hours
- }
-
- if ( is_wp_error( $raw_response ) || $raw_response['response']['code'] != 200 )
- return array("is_valid_key" => "1", "version" => "", "url" => "", "is_error" => "1");
-
- $version_info = json_decode($raw_response['body'], true);
-
- if( empty($version_info) )
- return array("is_valid_key" => "1", "version" => "", "url" => "", "is_error" => "1");
-
- return $version_info;
- }
-
- public static function get_remote_request_params(){
- global $wpdb;
-
- return sprintf("of=GravityForms&key=%s&v=%s&wp=%s&php=%s&mysql=%s&version=2", urlencode(self::get_key()), urlencode(self::$version), urlencode(get_bloginfo("version")), urlencode(phpversion()), urlencode($wpdb->db_version()));
- }
-
- public static function get_remote_post_params(){
- global $wpdb;
- $plugin_list = get_plugins();
- $site_url = get_bloginfo("url");
- $plugins = array();
-
- $active_plugins = get_option( 'active_plugins' );
-
- foreach ($plugin_list as $key => $plugin) {
- $is_active = in_array($key, $active_plugins);
-
- //filter for only gravityforms ones, may get some others if using our naming convention
- if (strpos(strtolower($plugin["Title"]), "gravity forms") !== false){
- $name = substr($key, 0, strpos($key,"/"));
- $plugins[] = array("name" => $name, "version" => $plugin["Version"], "is_active" => $is_active);
- }
- }
- $plugins = json_encode($plugins);
-
- //get theme info
- $theme = wp_get_theme();
- $theme_name = $theme->get("Name");
- $theme_uri = $theme->get("ThemeURI");
- $theme_version = $theme->get("Version");
- $theme_author = $theme->get("Author");
- $theme_author_uri = $theme->get("AuthorURI");
-
- $form_counts = GFFormsModel::get_form_count();
- $active_count = $form_counts["active"];
- $inactive_count = $form_counts["inactive"];
- $fc = abs($active_count) + abs($inactive_count);
- $entry_count = GFFormsModel::get_lead_count_all_forms("active");
- $im = is_multisite();
-
- $post = array("of" => "gravityforms", "key" => self::get_key(), "v" => self::$version, "wp" => get_bloginfo("version"), "php" => phpversion(), "mysql" => $wpdb->db_version(), "version" => "2", "plugins" => $plugins, "tn" => $theme_name, "tu" => $theme_uri, "tv" => $theme_version, "ta" => $theme_author, "tau" => $theme_author_uri, "im" => $im, "fc" => $fc, "ec" => $entry_count, "emc" => self::get_emails_sent(), "api" => self::get_api_calls());
- return $post;
- }
-
- public static function ensure_wp_version(){
- if(!GF_SUPPORTED_WP_VERSION){
- echo "" . sprintf(__("Gravity Forms require WordPress %s or greater. You must upgrade WordPress in order to use Gravity Forms", "gravityforms"), GF_MIN_WP_VERSION) . "
";
- return false;
- }
- return true;
- }
-
- public static function check_update($option, $cache=true){
-
- if(!is_object($option))
- return $option;
-
- $version_info = self::get_version_info($cache);
-
- if (!$version_info)
- return $option;
-
- $plugin_path = "gravityforms/gravityforms.php";
- if(empty($option->response[$plugin_path]))
- $option->response[$plugin_path] = new stdClass();
-
- $version = rgar($version_info, "version");
- //Empty response means that the key is invalid. Do not queue for upgrade
- if(!$version_info["is_valid_key"] || version_compare(GFCommon::$version, $version, '>=')){
- unset($option->response[$plugin_path]);
- }
- else{
- $url = rgar($version_info, "url");
- $option->response[$plugin_path]->url = "http://www.gravityforms.com";
- $option->response[$plugin_path]->slug = "gravityforms";
- $option->response[$plugin_path]->package = str_replace("{KEY}", GFCommon::get_key(), $url);
- $option->response[$plugin_path]->new_version = $version;
- $option->response[$plugin_path]->id = "0";
- }
-
- return $option;
-
- }
-
- public static function cache_remote_message(){
- //Getting version number
- $key = GFCommon::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")
- );
-
- $request_url = GRAVITY_MANAGER_URL . "/message.php?" . GFCommon::get_remote_request_params();
- $raw_response = wp_remote_request($request_url, $options);
-
- if ( is_wp_error( $raw_response ) || 200 != $raw_response['response']['code'] )
- $message = "";
- else
- $message = $raw_response['body'];
-
- //validating that message is a valid Gravity Form message. If message is invalid, don't display anything
- if(substr($message, 0, 10) != "")
- $message = "";
-
- update_option("rg_gforms_message", $message);
- }
-
- public static function get_local_timestamp($timestamp = null){
- if($timestamp == null)
- $timestamp = time();
-
- return $timestamp + (get_option( 'gmt_offset' ) * 3600 );
- }
-
- public static function get_gmt_timestamp($local_timestamp){
- return $local_timestamp - (get_option( 'gmt_offset' ) * 3600 );
- }
-
- public static function format_date($gmt_datetime, $is_human = true, $date_format="", $include_time=true){
- if(empty($gmt_datetime))
- return "";
-
- //adjusting date to local configured Time Zone
- $lead_gmt_time = mysql2date("G", $gmt_datetime);
- $lead_local_time = self::get_local_timestamp($lead_gmt_time);
-
- if(empty($date_format))
- $date_format = get_option('date_format');
-
- if($is_human){
- $time_diff = time() - $lead_gmt_time;
-
- if ($time_diff > 0 && $time_diff < 24*60*60)
- $date_display = sprintf(__('%s ago', 'gravityforms'), human_time_diff($lead_gmt_time));
- else
- $date_display = $include_time ? sprintf(__('%1$s at %2$s', 'gravityforms'), date_i18n($date_format, $lead_local_time, true), date_i18n(get_option('time_format'), $lead_local_time, true)) : date_i18n($date_format, $lead_local_time, true);
- }
- else{
- $date_display = $include_time ? sprintf(__('%1$s at %2$s', 'gravityforms'), date_i18n($date_format, $lead_local_time, true), date_i18n(get_option('time_format'), $lead_local_time, true)) : date_i18n($date_format, $lead_local_time, true);
- }
-
- return $date_display;
- }
-
- public static function get_selection_value($value){
- $ary = explode("|", $value);
- $val = $ary[0];
- return $val;
- }
-
- public static function selection_display($value, $field, $currency="", $use_text=false){
- if (is_array($value)){
- return "";
- }
-
- $ary = explode("|", $value);
- $val = $ary[0];
- $price = count($ary) > 1 ? $ary[1] : "";
-
- if($use_text)
- $val = RGFormsModel::get_choice_text($field, $val);
-
- if(!empty($price))
- return "$val (" . self::to_money($price, $currency) . ")";
- else
- return $val;
- }
-
- public static function date_display($value, $format = "mdy"){
- $date = self::parse_date($value, $format);
- if(empty($date))
- return $value;
-
- list($position, $separator) = rgexplode("_", $format, 2);
- switch($separator){
- case "dash" :
- $separator = "-";
- break;
- case "dot" :
- $separator = ".";
- break;
- default :
- $separator = "/";
- break;
- }
-
- switch($position){
- case "ymd" :
- return $date["year"] . $separator . $date["month"] . $separator . $date["day"];
- break;
-
- case "dmy" :
- return $date["day"] . $separator . $date["month"] . $separator . $date["year"];
- break;
-
- default :
- return $date["month"] . $separator . $date["day"] . $separator . $date["year"];
- break;
-
- }
- }
-
- public static function parse_date($date, $format="mdy"){
- $date_info = array();
-
- $position = substr($format, 0, 3);
-
- if(is_array($date)){
-
- switch($position){
- case "mdy" :
- $date_info["month"] = rgar($date, 0);
- $date_info["day"] = rgar($date, 1);
- $date_info["year"] = rgar($date, 2);
- break;
-
- case "dmy" :
- $date_info["day"] = rgar($date, 0);
- $date_info["month"] = rgar($date, 1);
- $date_info["year"] = rgar($date, 2);
- break;
-
- case "ymd" :
- $date_info["year"] = rgar($date, 0);
- $date_info["month"] = rgar($date, 1);
- $date_info["day"] = rgar($date, 2);
- break;
- }
- return $date_info;
- }
-
- $date = preg_replace("|[/\.]|", "-", $date);
- if(preg_match('/^(\d{1,4})-(\d{1,2})-(\d{1,4})$/', $date, $matches)){
-
- if(strlen($matches[1]) == 4){
- //format yyyy-mm-dd
- $date_info["year"] = $matches[1];
- $date_info["month"] = $matches[2];
- $date_info["day"] = $matches[3];
- }
- else if ($position == "mdy"){
- //format mm-dd-yyyy
- $date_info["month"] = $matches[1];
- $date_info["day"] = $matches[2];
- $date_info["year"] = $matches[3];
- }
- else{
- //format dd-mm-yyyy
- $date_info["day"] = $matches[1];
- $date_info["month"] = $matches[2];
- $date_info["year"] = $matches[3];
- }
- }
-
- return $date_info;
- }
-
-
- public static function truncate_url($url){
- $truncated_url = basename($url);
- if(empty($truncated_url))
- $truncated_url = dirname($url);
-
- $ary = explode("?", $truncated_url);
-
- return $ary[0];
- }
-
- public static function get_tabindex(){
- return GFCommon::$tab_index > 0 ? "tabindex='" . GFCommon::$tab_index++ . "'" : "";
- }
-
- public static function get_checkbox_choices($field, $value, $disabled_text){
- $choices = "";
-
- if(is_array($field["choices"])){
- $choice_number = 1;
- $count = 1;
- foreach($field["choices"] as $choice){
- if($choice_number % 10 == 0) //hack to skip numbers ending in 0. so that 5.1 doesn't conflict with 5.10
- $choice_number++;
-
- $input_id = $field["id"] . '.' . $choice_number;
- $id = $field["id"] . '_' . $choice_number++;
-
- if(empty($_POST) && rgar($choice,"isSelected")){
- $checked = "checked='checked'";
- }
- else if(is_array($value) && RGFormsModel::choice_value_match($field, $choice, rgget($input_id, $value))){
- $checked = "checked='checked'";
- }
- else if(!is_array($value) && RGFormsModel::choice_value_match($field, $choice, $value)){
- $checked = "checked='checked'";
- }
- else{
- $checked = "";
- }
-
- $logic_event = self::get_logic_event($field, "click");
-
- $tabindex = self::get_tabindex();
- $choice_value = $choice["value"];
- if(rgget("enablePrice", $field))
- $choice_value .= "|" . GFCommon::to_number(rgar($choice,"price"));
-
- $choices.= sprintf("%s ", $input_id, esc_attr($choice_value), $checked, $id, $disabled_text, $id, $choice["text"]);
-
- if(IS_ADMIN && RG_CURRENT_VIEW != "entry" && $count >=5)
- break;
-
- $count++;
- }
-
- $total = sizeof($field["choices"]);
- if($count < $total)
- $choices .= "" . sprintf(__("%d of %d items shown. Edit field to view all", "gravityforms"), $count, $total) . " ";
- }
-
- return apply_filters("gform_field_choices_" . rgget("formId", $field), apply_filters("gform_field_choices", $choices, $field), $field);
-
- }
-
- public static function get_radio_choices($field, $value="", $disabled_text){
- $choices = "";
-
- if(is_array($field["choices"])){
- $choice_id = 0;
-
- // add "other" choice to choices if enabled
- if(rgar($field, 'enableOtherChoice')) {
- $other_default_value = GFCommon::get_other_choice_value();
- $field["choices"][] = array('text' => $other_default_value, 'value' => 'gf_other_choice', 'isSelected' => false, 'isOtherChoice' => true);
- }
-
- $logic_event = self::get_logic_event($field, "click");
- $count = 1;
-
- foreach($field["choices"] as $choice){
- $id = $field["id"] . '_' . $choice_id++;
-
- $field_value = !empty($choice["value"]) || rgar($field, "enableChoiceValue") ? $choice["value"] : $choice["text"];
-
- if(rgget("enablePrice", $field))
- $field_value .= "|" . GFCommon::to_number(rgar($choice,"price"));
-
- if(rgblank($value) && RG_CURRENT_VIEW != "entry"){
- $checked = rgar($choice,"isSelected") ? "checked='checked'" : "";
- }
- else {
- $checked = RGFormsModel::choice_value_match($field, $choice, $value) ? "checked='checked'" : "";
- }
-
- $tabindex = self::get_tabindex();
- $label = sprintf("%s ", $id, $choice["text"]);
- $input_focus = '';
-
- // handle "other" choice
- if(rgar($choice, 'isOtherChoice')) {
-
- $onfocus = !IS_ADMIN ? 'jQuery(this).prev("input").attr("checked", true); if(jQuery(this).val() == "' . $other_default_value . '") { jQuery(this).val(""); }' : '';
- $onblur = !IS_ADMIN ? 'if(jQuery(this).val().replace(" ", "") == "") { jQuery(this).val("' . $other_default_value . '"); }' : '';
-
- $input_focus = !IS_ADMIN ? "onfocus=\"jQuery(this).next('input').focus();\"" : "";
- $value_exists = RGFormsModel::choices_value_match($field, $field["choices"], $value);
-
- if($value == 'gf_other_choice' && rgpost("input_{$field["id"]}_other")){
- $other_value = rgpost("input_{$field["id"]}_other");
- } else if(!$value_exists && !empty($value)){
- $other_value = $value;
- $value = 'gf_other_choice';
- $checked = "checked='checked'";
- } else {
- $other_value = $other_default_value;
- }
- $label = " ";
- }
-
- $choices .= sprintf(" %s ", $field["id"], esc_attr($field_value), $checked, $id, $disabled_text, $input_focus, $label);
-
- if(IS_ADMIN && RG_CURRENT_VIEW != "entry" && $count >=5)
- break;
-
- $count++;
- }
-
- $total = sizeof($field["choices"]);
- if($count < $total)
- $choices .= "" . sprintf(__("%d of %d items shown. Edit field to view all", "gravityforms"), $count, $total) . " ";
- }
-
- return apply_filters("gform_field_choices_" . rgget("formId", $field), apply_filters("gform_field_choices", $choices, $field), $field);
- }
-
- public static function get_field_type_title($type){
- switch($type){
- case "text" :
- return __("Single Line Text", "gravityforms");
- case "textarea" :
- return __("Paragraph Text", "gravityforms");
- case "select" :
- return __("Drop Down", "gravityforms");
- case "multiselect" :
- return __("Multi Select", "gravityforms");
- case "number" :
- return __("Number", "gravityforms");
- case "checkbox" :
- return __("Checkboxes", "gravityforms");
- case "radio" :
- return __("Radio Buttons", "gravityforms");
- case "hidden" :
- return __("Hidden", "gravityforms");
- case "html" :
- return __("HTML", "gravityforms");
- case "section" :
- return __("Section Break", "gravityforms");
- case "page" :
- return __("Page Break", "gravityforms");
- case "name" :
- return __("Name", "gravityforms");
- case "date" :
- return __("Date", "gravityforms");
- case "time" :
- return __("Time", "gravityforms");
- case "phone" :
- return __("Phone", "gravityforms");
- case "address" :
- return __("Address", "gravityforms");
- case "website" :
- return __("Website", "gravityforms");
- case "email" :
- return __("Email", "gravityforms");
- case "password" :
- return __("Password", "gravityforms");
- case "fileupload" :
- return __("File Upload", "gravityforms");
- case "captcha" :
- return __("CAPTCHA", "gravityforms");
- case "list" :
- return __("List", "gravityforms");
- case "creditcard" :
- return __("Credit Card", "gravityforms");
- case "post_title" :
- return __("Title", "gravityforms");
- case "post_content" :
- return __("Body", "gravityforms");
- case "post_excerpt" :
- return __("Excerpt", "gravityforms");
- case "post_tags" :
- return __("Tags", "gravityforms");
- case "post_category" :
- return __("Category", "gravityforms");
- case "post_image" :
- return __("Image", "gravityforms");
- case "post_custom_field" :
- return __("Custom Field", "gravityforms");
- case "product" :
- return __("Product", "gravityforms");
- case "quantity" :
- return __("Quantity", "gravityforms");
- case "option" :
- return __("Option", "gravityforms");
- case "shipping" :
- return __("Shipping", "gravityforms");
- case "total" :
- return __("Total", "gravityforms");
-
- default :
- return apply_filters("gform_field_type_title", $type, $type);
- }
- }
-
- public static function get_select_choices($field, $value=""){
- $choices = "";
-
- if(RG_CURRENT_VIEW == "entry" && empty($value))
- $choices .= " ";
-
- if(is_array(rgar($field, "choices"))){
- foreach($field["choices"] as $choice){
-
- //needed for users upgrading from 1.0
- $field_value = !empty($choice["value"]) || rgget("enableChoiceValue", $field) || $field['type'] == 'post_category' ? $choice["value"] : $choice["text"];
- if(rgget("enablePrice", $field))
- $field_value .= "|" . GFCommon::to_number(rgar($choice,"price"));
-
- if(rgblank($value) && RG_CURRENT_VIEW != "entry"){
- $selected = rgar($choice,"isSelected") ? "selected='selected'" : "";
- }
- else{
- if(is_array($value)){
- $is_match = false;
- foreach($value as $item){
- if(RGFormsModel::choice_value_match($field, $choice, $item)){
- $is_match = true;
- break;
- }
- }
- $selected = $is_match ? "selected='selected'" : "";
- }
- else{
- $selected = RGFormsModel::choice_value_match($field, $choice, $value) ? "selected='selected'" : "";
- }
- }
-
- $choices.= sprintf("%s ", esc_attr($field_value), $selected, esc_html($choice["text"]));
- }
- }
- return $choices;
- }
-
- public static function is_section_empty($section_field, $form, $lead){
- $cache_key = "GFCommon::is_section_empty_" . $form["id"] . "_" . $section_field["id"];
-
- $value = GFCache::get($cache_key);
-
- if($value !== false)
- return $value == true;
-
- $fields = self::get_section_fields($form, $section_field["id"]);
- if(!is_array($fields)){
- GFCache::set($cache_key, 1);
- return true;
- }
-
- foreach($fields as $field){
- $val = RGFormsModel::get_lead_field_value($lead, $field);
- $val = GFCommon::get_lead_field_display($field, $val, rgar($lead, 'currency'));
-
- if(!self::is_product_field($field["type"]) && !rgblank($val)){
- GFCache::set($cache_key, 0);
- return false;
- }
- }
-
- GFCache::set($cache_key, 1);
-
- return true;
- }
-
- public static function get_section_fields($form, $section_field_id){
- $fields = array();
- $in_section = false;
- foreach($form["fields"] as $field){
- if(in_array($field["type"], array("section", "page")) && $in_section)
- return $fields;
-
- if($field["id"] == $section_field_id)
- $in_section = true;
-
- if($in_section)
- $fields[] = $field;
- }
-
- return $fields;
- }
-
-
- public static function get_countries(){
- return apply_filters("gform_countries", array(
- __('Afghanistan', 'gravityforms'),__('Albania', 'gravityforms'),__('Algeria', 'gravityforms'), __('American Samoa', 'gravityforms'), __('Andorra', 'gravityforms'),__('Angola', 'gravityforms'),__('Antigua and Barbuda', 'gravityforms'),__('Argentina', 'gravityforms'),__('Armenia', 'gravityforms'),__('Australia', 'gravityforms'),__('Austria', 'gravityforms'),__('Azerbaijan', 'gravityforms'),__('Bahamas', 'gravityforms'),__('Bahrain', 'gravityforms'),__('Bangladesh', 'gravityforms'),__('Barbados', 'gravityforms'),__('Belarus', 'gravityforms'),__('Belgium', 'gravityforms'),__('Belize', 'gravityforms'),__('Benin', 'gravityforms'),__('Bermuda', 'gravityforms'),__('Bhutan', 'gravityforms'),__('Bolivia', 'gravityforms'),__('Bosnia and Herzegovina', 'gravityforms'),__('Botswana', 'gravityforms'),__('Brazil', 'gravityforms'),__('Brunei', 'gravityforms'),__('Bulgaria', 'gravityforms'),__('Burkina Faso', 'gravityforms'),__('Burundi', 'gravityforms'),__('Cambodia', 'gravityforms'),__('Cameroon', 'gravityforms'),__('Canada', 'gravityforms'),__('Cape Verde', 'gravityforms'),__('Cayman Islands', 'gravityforms'),__('Central African Republic', 'gravityforms'),__('Chad', 'gravityforms'),__('Chile', 'gravityforms'),__('China', 'gravityforms'),__('Colombia', 'gravityforms'),__('Comoros', 'gravityforms'),__('Congo, Democratic Republic of the', 'gravityforms'),__('Congo, Republic of the', 'gravityforms'),__('Costa Rica', 'gravityforms'),__('Côte d\'Ivoire', 'gravityforms'),__('Croatia', 'gravityforms'),__('Cuba', 'gravityforms'),__('Cyprus', 'gravityforms'),__('Czech Republic', 'gravityforms'),__('Denmark', 'gravityforms'),__('Djibouti', 'gravityforms'),__('Dominica', 'gravityforms'),__('Dominican Republic', 'gravityforms'),__('East Timor', 'gravityforms'),__('Ecuador', 'gravityforms'),__('Egypt', 'gravityforms'),__('El Salvador', 'gravityforms'),__('Equatorial Guinea', 'gravityforms'),__('Eritrea', 'gravityforms'),__('Estonia', 'gravityforms'),__('Ethiopia', 'gravityforms'),__('Fiji', 'gravityforms'),__('Finland', 'gravityforms'),__('France', 'gravityforms'),__('Gabon', 'gravityforms'),
- __('Gambia', 'gravityforms'),__('Georgia', 'gravityforms'),__('Germany', 'gravityforms'),__('Ghana', 'gravityforms'),__('Greece', 'gravityforms'),__('Greenland', 'gravityforms'),__('Grenada', 'gravityforms'),__('Guam', 'gravityforms'),__('Guatemala', 'gravityforms'),__('Guinea', 'gravityforms'),__('Guinea-Bissau', 'gravityforms'),__('Guyana', 'gravityforms'),__('Haiti', 'gravityforms'),__('Honduras', 'gravityforms'),__('Hong Kong', 'gravityforms'),__('Hungary', 'gravityforms'),__('Iceland', 'gravityforms'),__('India', 'gravityforms'),__('Indonesia', 'gravityforms'),__('Iran', 'gravityforms'),__('Iraq', 'gravityforms'),__('Ireland', 'gravityforms'),__('Israel', 'gravityforms'),__('Italy', 'gravityforms'),__('Jamaica', 'gravityforms'),__('Japan', 'gravityforms'),__('Jordan', 'gravityforms'),__('Kazakhstan', 'gravityforms'),__('Kenya', 'gravityforms'),__('Kiribati', 'gravityforms'),__('North Korea', 'gravityforms'),__('South Korea', 'gravityforms'),__('Kosovo', 'gravityforms'),__('Kuwait', 'gravityforms'),__('Kyrgyzstan', 'gravityforms'),__('Laos', 'gravityforms'),__('Latvia', 'gravityforms'),__('Lebanon', 'gravityforms'),__('Lesotho', 'gravityforms'),__('Liberia', 'gravityforms'),__('Libya', 'gravityforms'),__('Liechtenstein', 'gravityforms'),__('Lithuania', 'gravityforms'),__('Luxembourg', 'gravityforms'),__('Macedonia', 'gravityforms'),__('Madagascar', 'gravityforms'),__('Malawi', 'gravityforms'),__('Malaysia', 'gravityforms'),__('Maldives', 'gravityforms'),__('Mali', 'gravityforms'),__('Malta', 'gravityforms'),__('Marshall Islands', 'gravityforms'),__('Mauritania', 'gravityforms'),__('Mauritius', 'gravityforms'),__('Mexico', 'gravityforms'),__('Micronesia', 'gravityforms'),__('Moldova', 'gravityforms'),__('Monaco', 'gravityforms'),__('Mongolia', 'gravityforms'),__('Montenegro', 'gravityforms'),__('Morocco', 'gravityforms'),__('Mozambique', 'gravityforms'),__('Myanmar', 'gravityforms'),__('Namibia', 'gravityforms'),__('Nauru', 'gravityforms'),__('Nepal', 'gravityforms'),__('Netherlands', 'gravityforms'),__('New Zealand', 'gravityforms'),
- __('Nicaragua', 'gravityforms'),__('Niger', 'gravityforms'),__('Nigeria', 'gravityforms'),__('Norway', 'gravityforms'), __('Northern Mariana Islands', 'gravityforms'), __('Oman', 'gravityforms'),__('Pakistan', 'gravityforms'),__('Palau', 'gravityforms'),__('Palestine', 'gravityforms'),__('Panama', 'gravityforms'),__('Papua New Guinea', 'gravityforms'),__('Paraguay', 'gravityforms'),__('Peru', 'gravityforms'),__('Philippines', 'gravityforms'),__('Poland', 'gravityforms'),__('Portugal', 'gravityforms'),__('Puerto Rico', 'gravityforms'),__('Qatar', 'gravityforms'),__('Romania', 'gravityforms'),__('Russia', 'gravityforms'),__('Rwanda', 'gravityforms'),__('Saint Kitts and Nevis', 'gravityforms'),__('Saint Lucia', 'gravityforms'),__('Saint Vincent and the Grenadines', 'gravityforms'),__('Samoa', 'gravityforms'),__('San Marino', 'gravityforms'),__('Sao Tome and Principe', 'gravityforms'),__('Saudi Arabia', 'gravityforms'),__('Senegal', 'gravityforms'),__('Serbia and Montenegro', 'gravityforms'),__('Seychelles', 'gravityforms'),__('Sierra Leone', 'gravityforms'),__('Singapore', 'gravityforms'),__('Slovakia', 'gravityforms'),__('Slovenia', 'gravityforms'),__('Solomon Islands', 'gravityforms'),__('Somalia', 'gravityforms'),__('South Africa', 'gravityforms'),__('Spain', 'gravityforms'),__('Sri Lanka', 'gravityforms'),__('Sudan', 'gravityforms'),__('Sudan, South', 'gravityforms'),__('Suriname', 'gravityforms'),__('Swaziland', 'gravityforms'),__('Sweden', 'gravityforms'),__('Switzerland', 'gravityforms'),__('Syria', 'gravityforms'),__('Taiwan', 'gravityforms'),__('Tajikistan', 'gravityforms'),__('Tanzania', 'gravityforms'),__('Thailand', 'gravityforms'),__('Togo', 'gravityforms'),__('Tonga', 'gravityforms'),__('Trinidad and Tobago', 'gravityforms'),__('Tunisia', 'gravityforms'),__('Turkey', 'gravityforms'),__('Turkmenistan', 'gravityforms'),__('Tuvalu', 'gravityforms'),__('Uganda', 'gravityforms'),__('Ukraine', 'gravityforms'),__('United Arab Emirates', 'gravityforms'),__('United Kingdom', 'gravityforms'),
- __('United States', 'gravityforms'),__('Uruguay', 'gravityforms'),__('Uzbekistan', 'gravityforms'),__('Vanuatu', 'gravityforms'),__('Vatican City', 'gravityforms'),__('Venezuela', 'gravityforms'),__('Vietnam', 'gravityforms'), __('Virgin Islands, British', 'gravityforms'), __('Virgin Islands, U.S.', 'gravityforms'),__('Yemen', 'gravityforms'),__('Zambia', 'gravityforms'),__('Zimbabwe', 'gravityforms')));
-
-
- }
-
- public static function get_country_code($country_name) {
- $codes = array(
- __('AFGHANISTAN', 'gravityforms') => "AF" ,
- __('ALBANIA', 'gravityforms') => "AL" ,
- __('ALGERIA', 'gravityforms') => "DZ" ,
- __('AMERICAN SAMOA', 'gravityforms') => "AS" ,
- __('ANDORRA', 'gravityforms') => "AD" ,
- __('ANGOLA', 'gravityforms') => "AO" ,
- __('ANTIGUA AND BARBUDA', 'gravityforms') => "AG" ,
- __('ARGENTINA', 'gravityforms') => "AR" ,
- __('ARMENIA', 'gravityforms') => "AM" ,
- __('AUSTRALIA', 'gravityforms') => "AU" ,
- __('AUSTRIA', 'gravityforms') => "AT" ,
- __('AZERBAIJAN', 'gravityforms') => "AZ" ,
- __('BAHAMAS', 'gravityforms') => "BS" ,
- __('BAHRAIN', 'gravityforms') => "BH" ,
- __('BANGLADESH', 'gravityforms') => "BD" ,
- __('BARBADOS', 'gravityforms') => "BB" ,
- __('BELARUS', 'gravityforms') => "BY" ,
- __('BELGIUM', 'gravityforms') => "BE" ,
- __('BELIZE', 'gravityforms') => "BZ" ,
- __('BENIN', 'gravityforms') => "BJ" ,
- __('BERMUDA', 'gravityforms') => "BM" ,
- __('BHUTAN', 'gravityforms') => "BT" ,
- __('BOLIVIA', 'gravityforms') => "BO" ,
- __('BOSNIA AND HERZEGOVINA', 'gravityforms') => "BA" ,
- __('BOTSWANA', 'gravityforms') => "BW" ,
- __('BRAZIL', 'gravityforms') => "BR" ,
- __('BRUNEI', 'gravityforms') => "BN" ,
- __('BULGARIA', 'gravityforms') => "BG" ,
- __('BURKINA FASO', 'gravityforms') => "BF" ,
- __('BURUNDI', 'gravityforms') => "BI" ,
- __('CAMBODIA', 'gravityforms') => "KH" ,
- __('CAMEROON', 'gravityforms') => "CM" ,
- __('CANADA', 'gravityforms') => "CA" ,
- __('CAPE VERDE', 'gravityforms') => "CV" ,
- __('CAYMAN ISLANDS', 'gravityforms') => "KY" ,
- __('CENTRAL AFRICAN REPUBLIC', 'gravityforms') => "CF" ,
- __('CHAD', 'gravityforms') => "TD" ,
- __('CHILE', 'gravityforms') => "CL" ,
- __('CHINA', 'gravityforms') => "CN" ,
- __('COLOMBIA', 'gravityforms') => "CO" ,
- __('COMOROS', 'gravityforms') => "KM" ,
- __('CONGO, DEMOCRATIC REPUBLIC OF THE', 'gravityforms') => "CD" ,
- __('CONGO, REPUBLIC OF THE', 'gravityforms') => "CG" ,
- __('COSTA RICA', 'gravityforms') => "CR" ,
- __('C&OCIRC;TE D\'IVOIRE', 'gravityforms') => "CI" ,
- __('CROATIA', 'gravityforms') => "HR" ,
- __('CUBA', 'gravityforms') => "CU" ,
- __('CYPRUS', 'gravityforms') => "CY" ,
- __('CZECH REPUBLIC', 'gravityforms') => "CZ" ,
- __('DENMARK', 'gravityforms') => "DK" ,
- __('DJIBOUTI', 'gravityforms') => "DJ" ,
- __('DOMINICA', 'gravityforms') => "DM" ,
- __('DOMINICAN REPUBLIC', 'gravityforms') => "DO" ,
- __('EAST TIMOR', 'gravityforms') => "TL" ,
- __('ECUADOR', 'gravityforms') => "EC" ,
- __('EGYPT', 'gravityforms') => "EG" ,
- __('EL SALVADOR', 'gravityforms') => "SV" ,
- __('EQUATORIAL GUINEA', 'gravityforms') => "GQ" ,
- __('ERITREA', 'gravityforms') => "ER" ,
- __('ESTONIA', 'gravityforms') => "EE" ,
- __('ETHIOPIA', 'gravityforms') => "ET" ,
- __('FIJI', 'gravityforms') => "FJ" ,
- __('FINLAND', 'gravityforms') => "FI" ,
- __('FRANCE', 'gravityforms') => "FR" ,
- __('GABON', 'gravityforms') => "GA" ,
- __('GAMBIA', 'gravityforms') => "GM" ,
- __('GEORGIA', 'gravityforms') => "GE" ,
- __('GERMANY', 'gravityforms') => "DE" ,
- __('GHANA', 'gravityforms') => "GH" ,
- __('GREECE', 'gravityforms') => "GR" ,
- __('GREENLAND', 'gravityforms') => "GL" ,
- __('GRENADA', 'gravityforms') => "GD" ,
- __('GUAM', 'gravityforms') => "GU" ,
- __('GUATEMALA', 'gravityforms') => "GT" ,
- __('GUINEA', 'gravityforms') => "GN" ,
- __('GUINEA-BISSAU', 'gravityforms') => "GW" ,
- __('GUYANA', 'gravityforms') => "GY" ,
- __('HAITI', 'gravityforms') => "HT" ,
- __('HONDURAS', 'gravityforms') => "HN" ,
- __('HONG KONG', 'gravityforms') => "HK" ,
- __('HUNGARY', 'gravityforms') => "HU" ,
- __('ICELAND', 'gravityforms') => "IS" ,
- __('INDIA', 'gravityforms') => "IN" ,
- __('INDONESIA', 'gravityforms') => "ID" ,
- __('IRAN', 'gravityforms') => "IR" ,
- __('IRAQ', 'gravityforms') => "IQ" ,
- __('IRELAND', 'gravityforms') => "IE" ,
- __('ISRAEL', 'gravityforms') => "IL" ,
- __('ITALY', 'gravityforms') => "IT" ,
- __('JAMAICA', 'gravityforms') => "JM" ,
- __('JAPAN', 'gravityforms') => "JP" ,
- __('JORDAN', 'gravityforms') => "JO" ,
- __('KAZAKHSTAN', 'gravityforms') => "KZ" ,
- __('KENYA', 'gravityforms') => "KE" ,
- __('KIRIBATI', 'gravityforms') => "KI" ,
- __('NORTH KOREA', 'gravityforms') => "KP" ,
- __('SOUTH KOREA', 'gravityforms') => "KR" ,
- __('KOSOVO', 'gravityforms') => "KV" ,
- __('KUWAIT', 'gravityforms') => "KW" ,
- __('KYRGYZSTAN', 'gravityforms') => "KG" ,
- __('LAOS', 'gravityforms') => "LA" ,
- __('LATVIA', 'gravityforms') => "LV" ,
- __('LEBANON', 'gravityforms') => "LB" ,
- __('LESOTHO', 'gravityforms') => "LS" ,
- __('LIBERIA', 'gravityforms') => "LR" ,
- __('LIBYA', 'gravityforms') => "LY" ,
- __('LIECHTENSTEIN', 'gravityforms') => "LI" ,
- __('LITHUANIA', 'gravityforms') => "LT" ,
- __('LUXEMBOURG', 'gravityforms') => "LU" ,
- __('MACEDONIA', 'gravityforms') => "MK" ,
- __('MADAGASCAR', 'gravityforms') => "MG" ,
- __('MALAWI', 'gravityforms') => "MW" ,
- __('MALAYSIA', 'gravityforms') => "MY" ,
- __('MALDIVES', 'gravityforms') => "MV" ,
- __('MALI', 'gravityforms') => "ML" ,
- __('MALTA', 'gravityforms') => "MT" ,
- __('MARSHALL ISLANDS', 'gravityforms') => "MH" ,
- __('MAURITANIA', 'gravityforms') => "MR" ,
- __('MAURITIUS', 'gravityforms') => "MU" ,
- __('MEXICO', 'gravityforms') => "MX" ,
- __('MICRONESIA', 'gravityforms') => "FM" ,
- __('MOLDOVA', 'gravityforms') => "MD" ,
- __('MONACO', 'gravityforms') => "MC" ,
- __('MONGOLIA', 'gravityforms') => "MN" ,
- __('MONTENEGRO', 'gravityforms') => "ME" ,
- __('MOROCCO', 'gravityforms') => "MA" ,
- __('MOZAMBIQUE', 'gravityforms') => "MZ" ,
- __('MYANMAR', 'gravityforms') => "MM" ,
- __('NAMIBIA', 'gravityforms') => "NA" ,
- __('NAURU', 'gravityforms') => "NR" ,
- __('NEPAL', 'gravityforms') => "NP" ,
- __('NETHERLANDS', 'gravityforms') => "NL" ,
- __('NEW ZEALAND', 'gravityforms') => "NZ" ,
- __('NICARAGUA', 'gravityforms') => "NI" ,
- __('NIGER', 'gravityforms') => "NE" ,
- __('NIGERIA', 'gravityforms') => "NG" ,
- __('NORTHERN MARIANA ISLANDS', 'gravityforms') => "MP" ,
- __('NORWAY', 'gravityforms') => "NO" ,
- __('OMAN', 'gravityforms') => "OM" ,
- __('PAKISTAN', 'gravityforms') => "PK" ,
- __('PALAU', 'gravityforms') => "PW" ,
- __('PALESTINE', 'gravityforms') => "PS" ,
- __('PANAMA', 'gravityforms') => "PA" ,
- __('PAPUA NEW GUINEA', 'gravityforms') => "PG" ,
- __('PARAGUAY', 'gravityforms') => "PY" ,
- __('PERU', 'gravityforms') => "PE" ,
- __('PHILIPPINES', 'gravityforms') => "PH" ,
- __('POLAND', 'gravityforms') => "PL" ,
- __('PORTUGAL', 'gravityforms') => "PT" ,
- __('PUERTO RICO', 'gravityforms') => "PR" ,
- __('QATAR', 'gravityforms') => "QA" ,
- __('ROMANIA', 'gravityforms') => "RO" ,
- __('RUSSIA', 'gravityforms') => "RU" ,
- __('RWANDA', 'gravityforms') => "RW" ,
- __('SAINT KITTS AND NEVIS', 'gravityforms') => "KN" ,
- __('SAINT LUCIA', 'gravityforms') => "LC" ,
- __('SAINT VINCENT AND THE GRENADINES', 'gravityforms') => "VC" ,
- __('SAMOA', 'gravityforms') => "WS" ,
- __('SAN MARINO', 'gravityforms') => "SM" ,
- __('SAO TOME AND PRINCIPE', 'gravityforms') => "ST" ,
- __('SAUDI ARABIA', 'gravityforms') => "SA" ,
- __('SENEGAL', 'gravityforms') => "SN" ,
- __('SERBIA AND MONTENEGRO', 'gravityforms') => "RS" ,
- __('SEYCHELLES', 'gravityforms') => "SC" ,
- __('SIERRA LEONE', 'gravityforms') => "SL" ,
- __('SINGAPORE', 'gravityforms') => "SG" ,
- __('SLOVAKIA', 'gravityforms') => "SK" ,
- __('SLOVENIA', 'gravityforms') => "SI" ,
- __('SOLOMON ISLANDS', 'gravityforms') => "SB" ,
- __('SOMALIA', 'gravityforms') => "SO" ,
- __('SOUTH AFRICA', 'gravityforms') => "ZA" ,
- __('SPAIN', 'gravityforms') => "ES" ,
- __('SRI LANKA', 'gravityforms') => "LK" ,
- __('SUDAN', 'gravityforms') => "SD" ,
- __('SUDAN, SOUTH', 'gravityforms') => "SS" ,
- __('SURINAME', 'gravityforms') => "SR" ,
- __('SWAZILAND', 'gravityforms') => "SZ" ,
- __('SWEDEN', 'gravityforms') => "SE" ,
- __('SWITZERLAND', 'gravityforms') => "CH" ,
- __('SYRIA', 'gravityforms') => "SY" ,
- __('TAIWAN', 'gravityforms') => "TW" ,
- __('TAJIKISTAN', 'gravityforms') => "TJ" ,
- __('TANZANIA', 'gravityforms') => "TZ" ,
- __('THAILAND', 'gravityforms') => "TH" ,
- __('TOGO', 'gravityforms') => "TG" ,
- __('TONGA', 'gravityforms') => "TO" ,
- __('TRINIDAD AND TOBAGO', 'gravityforms') => "TT" ,
- __('TUNISIA', 'gravityforms') => "TN" ,
- __('TURKEY', 'gravityforms') => "TR" ,
- __('TURKMENISTAN', 'gravityforms') => "TM" ,
- __('TUVALU', 'gravityforms') => "TV" ,
- __('UGANDA', 'gravityforms') => "UG" ,
- __('UKRAINE', 'gravityforms') => "UA" ,
- __('UNITED ARAB EMIRATES', 'gravityforms') => "AE" ,
- __('UNITED KINGDOM', 'gravityforms') => "GB" ,
- __('UNITED STATES', 'gravityforms') => "US" ,
- __('URUGUAY', 'gravityforms') => "UY" ,
- __('UZBEKISTAN', 'gravityforms') => "UZ" ,
- __('VANUATU', 'gravityforms') => "VU" ,
- __('VATICAN CITY', 'gravityforms') => "" ,
- __('VENEZUELA', 'gravityforms') => "VE" ,
- __('VIRGIN ISLANDS, BRITISH', 'gravityforms') => "VG" ,
- __('VIRGIN ISLANDS, U.S.', 'gravityforms') => "VI" ,
- __('VIETNAM', 'gravityforms') => "VN" ,
- __('YEMEN', 'gravityforms') => "YE" ,
- __('ZAMBIA', 'gravityforms') => "ZM" ,
- __('ZIMBABWE', 'gravityforms') => "ZW" );
-
- return rgar($codes, strtoupper($country_name));
- }
-
- public static function get_us_states(){
- return array(__("Alabama","gravityforms"),__("Alaska","gravityforms"),__("Arizona","gravityforms"),__("Arkansas","gravityforms"),__("California","gravityforms"),__("Colorado","gravityforms"),__("Connecticut","gravityforms"),__("Delaware","gravityforms"),__("District of Columbia", "gravityforms"), __("Florida","gravityforms"),__("Georgia","gravityforms"),__("Hawaii","gravityforms"),__("Idaho","gravityforms"),__("Illinois","gravityforms"),__("Indiana","gravityforms"),__("Iowa","gravityforms"),__("Kansas","gravityforms"),__("Kentucky","gravityforms"),__("Louisiana","gravityforms"),__("Maine","gravityforms"),__("Maryland","gravityforms"),__("Massachusetts","gravityforms"),__("Michigan","gravityforms"),__("Minnesota","gravityforms"),__("Mississippi","gravityforms"),__("Missouri","gravityforms"),__("Montana","gravityforms"),__("Nebraska","gravityforms"),__("Nevada","gravityforms"),__("New Hampshire","gravityforms"),__("New Jersey","gravityforms"),__("New Mexico","gravityforms"),__("New York","gravityforms"),__("North Carolina","gravityforms"),__("North Dakota","gravityforms"),__("Ohio","gravityforms"),__("Oklahoma","gravityforms"),__("Oregon","gravityforms"),__("Pennsylvania","gravityforms"),__("Rhode Island","gravityforms"),__("South Carolina","gravityforms"),__("South Dakota","gravityforms"),__("Tennessee","gravityforms"),__("Texas","gravityforms"),__("Utah","gravityforms"),__("Vermont","gravityforms"),__("Virginia","gravityforms"),__("Washington","gravityforms"),__("West Virginia","gravityforms"),__("Wisconsin","gravityforms"),__("Wyoming","gravityforms"), __("Armed Forces Americas","gravityforms"), __("Armed Forces Europe","gravityforms"),__("Armed Forces Pacific","gravityforms"));
- }
-
- public static function get_us_state_code($state_name){
- $states = array(
- strtoupper(__("Alabama","gravityforms")) => "AL",
- strtoupper(__("Alaska","gravityforms")) => "AK",
- strtoupper(__("Arizona","gravityforms")) => "AZ",
- strtoupper(__("Arkansas","gravityforms")) => "AR",
- strtoupper(__("California","gravityforms")) => "CA",
- strtoupper(__("Colorado","gravityforms")) => "CO",
- strtoupper(__("Connecticut","gravityforms")) => "CT",
- strtoupper(__("Delaware","gravityforms")) => "DE",
- strtoupper(__("District of Columbia", "gravityforms")) => "DC",
- strtoupper(__("Florida","gravityforms")) => "FL",
- strtoupper(__("Georgia","gravityforms")) => "GA",
- strtoupper(__("Hawaii","gravityforms")) => "HI",
- strtoupper(__("Idaho","gravityforms")) => "ID",
- strtoupper(__("Illinois","gravityforms")) => "IL",
- strtoupper(__("Indiana","gravityforms")) => "IN",
- strtoupper(__("Iowa","gravityforms")) => "IA",
- strtoupper(__("Kansas","gravityforms")) => "KS",
- strtoupper(__("Kentucky","gravityforms")) => "KY",
- strtoupper(__("Louisiana","gravityforms")) => "LA",
- strtoupper(__("Maine","gravityforms")) => "ME",
- strtoupper(__("Maryland","gravityforms")) => "MD",
- strtoupper(__("Massachusetts","gravityforms")) => "MA",
- strtoupper(__("Michigan","gravityforms")) => "MI",
- strtoupper(__("Minnesota","gravityforms")) => "MN",
- strtoupper(__("Mississippi","gravityforms")) => "MS",
- strtoupper(__("Missouri","gravityforms")) => "MO",
- strtoupper(__("Montana","gravityforms")) => "MT",
- strtoupper(__("Nebraska","gravityforms")) => "NE",
- strtoupper(__("Nevada","gravityforms")) => "NV",
- strtoupper(__("New Hampshire","gravityforms")) => "NH",
- strtoupper(__("New Jersey","gravityforms")) => "NJ",
- strtoupper(__("New Mexico","gravityforms")) => "NM",
- strtoupper(__("New York","gravityforms")) => "NY",
- strtoupper(__("North Carolina","gravityforms")) => "NC",
- strtoupper(__("North Dakota","gravityforms")) => "ND",
- strtoupper(__("Ohio","gravityforms")) => "OH",
- strtoupper(__("Oklahoma","gravityforms")) => "OK",
- strtoupper(__("Oregon","gravityforms")) => "OR",
- strtoupper(__("Pennsylvania","gravityforms")) => "PA",
- strtoupper(__("Rhode Island","gravityforms")) => "RI",
- strtoupper(__("South Carolina","gravityforms")) => "SC",
- strtoupper(__("South Dakota","gravityforms")) => "SD",
- strtoupper(__("Tennessee","gravityforms")) => "TN",
- strtoupper(__("Texas","gravityforms")) => "TX",
- strtoupper(__("Utah","gravityforms")) => "UT",
- strtoupper(__("Vermont","gravityforms")) => "VT",
- strtoupper(__("Virginia","gravityforms")) => "VA",
- strtoupper(__("Washington","gravityforms")) => "WA",
- strtoupper(__("West Virginia","gravityforms")) => "WV",
- strtoupper(__("Wisconsin","gravityforms")) => "WI",
- strtoupper(__("Wyoming","gravityforms")) => "WY",
- strtoupper(__("Armed Forces Americas","gravityforms")) => "AA",
- strtoupper(__("Armed Forces Europe","gravityforms")) => "AE",
- strtoupper(__("Armed Forces Pacific","gravityforms")) => "AP"
- );
-
- $code = isset($states[strtoupper($state_name)]) ? $states[strtoupper($state_name)] : strtoupper($state_name);
-
- return $code;
- }
-
-
- public static function get_canadian_provinces(){
- return array(__("Alberta","gravityforms"),__("British Columbia","gravityforms"),__("Manitoba","gravityforms"),__("New Brunswick","gravityforms"),__("Newfoundland & Labrador","gravityforms"),__("Northwest Territories","gravityforms"),__("Nova Scotia","gravityforms"),__("Nunavut","gravityforms"),__("Ontario","gravityforms"),__("Prince Edward Island","gravityforms"),__("Quebec","gravityforms"),__("Saskatchewan","gravityforms"),__("Yukon","gravityforms"));
-
- }
-
- public static function get_state_dropdown($states, $selected_state=""){
- $str = "";
- foreach($states as $state){
- $selected = $state == $selected_state ? "selected='selected'" : "";
- $str .= "" . $state . " ";
- }
- return $str;
- }
-
- public static function get_us_state_dropdown($selected_state = ""){
- $states = array_merge(array(''), self::get_us_states());
- foreach($states as $state){
- $selected = $state == $selected_state ? "selected='selected'" : "";
- $str .= "" . $state . " ";
- }
- return $str;
- }
-
- public static function get_canadian_provinces_dropdown($selected_province = ""){
- $states = array_merge(array(''), self::get_canadian_provinces());
- foreach($states as $state){
- $selected = $state == $selected_province ? "selected='selected'" : "";
- $str .= "" . $state . " ";
- }
- return $str;
- }
-
- public static function get_country_dropdown($selected_country = ""){
- $str = "";
- $countries = array_merge(array(''), self::get_countries());
- foreach($countries as $country){
- $selected = $country == $selected_country ? "selected='selected'" : "";
- $str .= "" . $country . " ";
- }
- return $str;
- }
-
- public static function is_post_field($field){
- return in_array($field["type"], array("post_title", "post_tags", "post_category", "post_custom_field", "post_content", "post_excerpt", "post_image"));
- }
-
- public static function get_range_message($field){
- $min = $field["rangeMin"];
- $max = $field["rangeMax"];
- $message = "";
-
- if(is_numeric($min) && is_numeric($max))
- $message = sprintf(__("Please enter a value between %s and %s.", "gravityforms"), "$min ", "$max ") ;
- else if(is_numeric($min))
- $message = sprintf(__("Please enter a value greater than or equal to %s.", "gravityforms"), "$min ");
- else if(is_numeric($max))
- $message = sprintf(__("Please enter a value less than or equal to %s.", "gravityforms"), "$max ");
- else if($field["failed_validation"])
- $message = __("Please enter a valid number", "gravityforms");
-
- return $message;
- }
-
- public static function get_fields_by_type($form, $types){
- $fields = array();
- if(!is_array(rgar($form,"fields")))
- return $fields;
-
- foreach($form["fields"] as $field){
- if(in_array(rgar($field,"type"), $types))
- $fields[] = $field;
- }
- return $fields;
- }
-
- public static function has_pages($form){
- return sizeof(self::get_fields_by_type($form, array("page"))) > 0;
- }
-
- public static function get_product_fields_by_type($form, $types, $product_id){
- global $_product_fields;
- $key = json_encode($types) . "_" . $product_id . "_" . $form["id"];
- if(!isset($_product_fields[$key])){
- $fields = array();
- for($i=0, $count=sizeof($form["fields"]); $i<$count; $i++){
- $field = $form["fields"][$i];
- if(in_array($field["type"], $types) && $field["productField"] == $product_id){
- $fields[] = $field;
- }
- }
- $_product_fields[$key] = $fields;
- }
- return $_product_fields[$key];
- }
-
- private static function get_month_dropdown($name="", $id="", $selected_value="", $tabindex="", $disabled_text=""){
- return self::get_number_dropdown($name, $id, $selected_value, $tabindex, $disabled_text, __("Month", "gravityforms"), 1, 12);
- }
-
- private static function get_day_dropdown($name="", $id="", $selected_value="", $tabindex="", $disabled_text=""){
- return self::get_number_dropdown($name, $id, $selected_value, $tabindex, $disabled_text, __("Day", "gravityforms"), 1, 31);
- }
-
- private static function get_year_dropdown($name="", $id="", $selected_value="", $tabindex="", $disabled_text=""){
- $year_min = apply_filters("gform_date_min_year", "1920");
- $year_max = apply_filters("gform_date_max_year", date("Y") + 1);
- return self::get_number_dropdown($name, $id, $selected_value, $tabindex, $disabled_text, __("Year", "gravityforms"), $year_max, $year_min);
- }
-
- private static function get_number_dropdown($name, $id, $selected_value, $tabindex, $disabled_text, $placeholder, $start_number, $end_number){
- $str = "";
- if($placeholder !== false)
- $str .= "{$placeholder} ";
-
- $increment = $start_number < $end_number ? 1 : -1;
-
- for($i=$start_number; $i!= ($end_number + $increment); $i += $increment){
- $selected = intval($i) == intval($selected_value) ? "selected='selected'" : "";
- $str .= "{$i} ";
- }
- $str .= " ";
- return $str;
- }
-
- private static function get_logic_event($field, $event){
- if(empty($field["conditionalLogicFields"]) || IS_ADMIN)
- return "";
-
- switch($event){
- case "keyup" :
- return "onchange='gf_apply_rules(" . $field["formId"] . "," . GFCommon::json_encode($field["conditionalLogicFields"]) . ");' onkeyup='clearTimeout(__gf_timeout_handle); __gf_timeout_handle = setTimeout(\"gf_apply_rules(" . $field["formId"] . "," . GFCommon::json_encode($field["conditionalLogicFields"]) . ")\", 300);'";
- break;
-
- case "click" :
- return "onclick='gf_apply_rules(" . $field["formId"] . "," . GFCommon::json_encode($field["conditionalLogicFields"]) . ");'";
- break;
-
- case "change" :
- return "onchange='gf_apply_rules(" . $field["formId"] . "," . GFCommon::json_encode($field["conditionalLogicFields"]) . ");'";
- break;
- }
- }
-
- public static function has_field_calculation($field) {
-
- if($field['type'] == 'number') {
- return rgar($field, 'enableCalculation') && rgar($field, 'calculationFormula');
- }
-
- return RGFormsModel::get_input_type($field) == 'calculation';
- }
-
- public static function get_field_input($field, $value="", $lead_id=0, $form_id=0){
-
- $id = $field["id"];
- $field_id = IS_ADMIN || $form_id == 0 ? "input_$id" : "input_" . $form_id . "_$id";
- $form_id = IS_ADMIN && empty($form_id) ? rgget("id") : $form_id;
-
- $size = rgar($field, "size");
- $disabled_text = (IS_ADMIN && RG_CURRENT_VIEW != "entry") ? "disabled='disabled'" : "";
- $class_suffix = RG_CURRENT_VIEW == "entry" ? "_admin" : "";
- $class = $size . $class_suffix;
-
- $currency = "";
- if(RG_CURRENT_VIEW == "entry"){
- $lead = RGFormsModel::get_lead($lead_id);
- $post_id = $lead["post_id"];
- $post_link = "";
- if(is_numeric($post_id) && self::is_post_field($field)){
- $post_link = "You can edit this post from the post page.";
- }
- $currency = $lead["currency"];
- }
-
- $field_input = apply_filters("gform_field_input", "", $field, $value, $lead_id, $form_id);
- if($field_input)
- return $field_input;
-
- //product fields are not editable
- if(RG_CURRENT_VIEW == "entry" && self::is_product_field($field["type"]))
- return "" . __("Product fields are not editable", "gravityforms") . "
";
-
- else if(RG_CURRENT_VIEW == "entry" && $field["type"] == "donation")
- return "" . __("Donations are not editable", "gravityforms") . "
";
-
- // add categories as choices for Post Category field
- if($field['type'] == 'post_category')
- $field = self::add_categories_as_choices($field, $value);
-
- $max_length = "";
- $html5_attributes = "";
-
- switch(RGFormsModel::get_input_type($field)){
-
- case "total" :
- if(RG_CURRENT_VIEW == "entry")
- return "
";
- else
- return "" . self::to_money("0") . "
";
- break;
-
- case "calculation" :
- case "singleproduct" :
-
- $product_name = !is_array($value) || empty($value[$field["id"] . ".1"]) ? esc_attr($field["label"]) : esc_attr($value[$field["id"] . ".1"]);
- $price = !is_array($value) || empty($value[$field["id"] . ".2"]) ? rgget("basePrice", $field) : esc_attr($value[$field["id"] . ".2"]);
- $quantity = is_array($value) ? esc_attr($value[$field["id"] . ".3"]) : "";
-
- if(empty($price))
- $price = 0;
-
- $form = RGFormsModel::get_form_meta($form_id);
- $has_quantity = sizeof(GFCommon::get_product_fields_by_type($form, array("quantity"), $field["id"])) > 0;
- if($has_quantity)
- $field["disableQuantity"] = true;
-
- $quantity_field = "";
-
- $qty_input_type = GFFormsModel::is_html5_enabled() ? "number" : "text";
-
- if(IS_ADMIN){
- $style = rgget("disableQuantity", $field) ? "style='display:none;'" : "";
- $quantity_field = " " . apply_filters("gform_product_quantity_{$form_id}",apply_filters("gform_product_quantity",__("Quantity:", "gravityforms"), $form_id), $form_id) . " ";
- }
- else if(!rgget("disableQuantity", $field)){
- $tabindex = self::get_tabindex();
- $quantity_field .= " " . apply_filters("gform_product_quantity_{$form_id}",apply_filters("gform_product_quantity",__("Quantity:", "gravityforms"), $form_id), $form_id) . " ";
- }
- else{
- if(!is_numeric($quantity))
- $quantity = 1;
-
- if(!$has_quantity){
- $quantity_field .= " ";
- }
- }
-
- return "" . apply_filters("gform_product_price_{$form_id}", apply_filters("gform_product_price",__("Price", "gravityforms"), $form_id), $form_id) . ": " . esc_html(GFCommon::to_money($price, $currency)) ." {$quantity_field}
";
-
- break;
-
- case "hiddenproduct" :
-
- $form = RGFormsModel::get_form_meta($form_id);
- $has_quantity_field = sizeof(GFCommon::get_product_fields_by_type($form, array("quantity"), $field["id"])) > 0;
-
- $product_name = !is_array($value) || empty($value[$field["id"] . ".1"]) ? esc_attr($field["label"]) : esc_attr($value[$field["id"] . ".1"]);
- $quantity = is_array($value) ? esc_attr($value[$field["id"] . ".3"]) : "1";
- $price = !is_array($value) || empty($value[$field["id"] . ".2"]) ? rgget("basePrice", $field) : esc_attr($value[$field["id"] . ".2"]);
- if(empty($price))
- $price = 0;
-
- $quantity_field = $has_quantity_field ? "" : " ";
- $product_name_field = " ";
-
- $field_type = IS_ADMIN ? "text" : "hidden";
-
- return $quantity_field . $product_name_field . sprintf(" ", $id, esc_attr($price), $disabled_text);
-
- break;
-
- case "singleshipping" :
-
- $price = !empty($value) ? $value : rgget("basePrice", $field);
- if(empty($price))
- $price = 0;
-
- return "" . GFCommon::to_money($price, $currency) ."
";
-
- break;
-
- case "website":
- $is_html5 = RGFormsModel::is_html5_enabled();
- $value = empty($value) && !$is_html5 ? "http://" : $value;
- $html_input_type = $is_html5 ? "url" : "text";
- $html5_attributes = $is_html5 ? "placeholder='http://'" : "";
- case "text":
- if(empty($html_input_type))
- $html_input_type = "text";
-
- if(rgget("enablePasswordInput", $field) && RG_CURRENT_VIEW != "entry")
- $html_input_type = "password";
-
- if(is_numeric(rgget("maxLength", $field)))
- $max_length = "maxlength='{$field["maxLength"]}'";
-
- if(!empty($post_link))
- return $post_link;
-
- $logic_event = self::get_logic_event($field, "keyup");
-
- $tabindex = self::get_tabindex();
- return sprintf("
", $id, $field_id, $html_input_type, esc_attr($value), esc_attr($class), $disabled_text);
- break;
-
- case "email":
-
- if(!empty($post_link))
- return $post_link;
-
- $html_input_type = RGFormsModel::is_html5_enabled() ? "email" : "text";
-
- if(IS_ADMIN && RG_CURRENT_VIEW != "entry"){
- $single_style = rgget("emailConfirmEnabled", $field) ? "style='display:none;'" : "";
- $confirm_style = rgget("emailConfirmEnabled", $field) ? "" : "style='display:none;'";
- return "";
- }
- else{
- $logic_event = self::get_logic_event($field, "keyup");
-
- if(rgget("emailConfirmEnabled", $field) && RG_CURRENT_VIEW != "entry"){
- $first_tabindex = self::get_tabindex();
- $last_tabindex = self::get_tabindex();
- return "";
- }
- else{
- $tabindex = self::get_tabindex();
- return sprintf("
", $id, $field_id, $html_input_type, esc_attr($value), esc_attr($class), $disabled_text);
- }
- }
-
- break;
- case "honeypot":
- $autocomplete = RGFormsModel::is_html5_enabled() ? "autocomplete='off'" : "";
- return "
";
- break;
-
- case "hidden" :
- if(!empty($post_link))
- return $post_link;
-
- $field_type = IS_ADMIN ? "text" : "hidden";
- $class_attribute = IS_ADMIN ? "" : "class='gform_hidden'";
-
- return sprintf(" ", $id, $field_id, esc_attr($value), $disabled_text);
- break;
-
- case "html" :
- $content = IS_ADMIN ? "" . __("This is a content placeholder. HTML content is not displayed in the form admin. Preview this form to view the content.", "gravityforms") . "
" : $field["content"];
- $content = GFCommon::replace_variables_prepopulate($content); //adding support for merge tags
- $content = do_shortcode($content); //adding support for shortcodes
- return $content;
- break;
-
- case "adminonly_hidden" :
- if(!is_array($field["inputs"])){
- if(is_array($value))
- $value = json_encode($value);
- return sprintf(" ", $id, $field_id, esc_attr($value));
- }
-
-
- $fields = "";
- foreach($field["inputs"] as $input){
- $fields .= sprintf(" ", $input["id"], esc_attr(rgar($value, strval($input["id"]))));
- }
- return $fields;
- break;
-
- case "number" :
- if(!empty($post_link))
- return $post_link;
-
- $instruction = "";
- $read_only = "";
-
- if(!IS_ADMIN){
-
- if(GFCommon::has_field_calculation($field)) {
-
- // calculation-enabled fields should be read only
- $read_only = 'readonly="readonly"';
-
- } else {
-
- $message = self::get_range_message($field);
- $validation_class = $field["failed_validation"] ? "validation_message" : "";
-
- if(!$field["failed_validation"] && !empty($message) && empty($field["errorMessage"]))
- $instruction = "" . $message . "
";
-
- }
-
- }
- $is_html5 = RGFormsModel::is_html5_enabled();
- $html_input_type = $is_html5 && !GFCommon::has_field_calculation($field) && !$field["numberFormat"] == "currency" ? "number" : "text"; // chrome does not allow number fields to have commas, calculations and currency values display numbers with commas
- $step_attr = $is_html5 ? "step='any'" : "";
-
- $logic_event = self::get_logic_event($field, "keyup");
-
- $tabindex = self::get_tabindex();
- return sprintf(" %s
", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text, $instruction);
-
- case "donation" :
- $tabindex = self::get_tabindex();
- return sprintf("
", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
-
- case "price" :
- $logic_event = self::get_logic_event($field, "keyup");
-
- $tabindex = self::get_tabindex();
- return sprintf("
", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
-
- case "phone" :
- if(!empty($post_link))
- return $post_link;
-
- $instruction = $field["phoneFormat"] == "standard" ? __("Phone format:", "gravityforms") . " (###)###-####" : "";
- $instruction_div = rgget("failed_validation", $field) && !empty($instruction) ? "$instruction
" : "";
- $html_input_type = RGFormsModel::is_html5_enabled() ? "tel" : "text";
- $logic_event = self::get_logic_event($field, "keyup");
-
- $tabindex = self::get_tabindex();
- return sprintf(" {$instruction_div}
", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
-
- case "textarea":
- $max_chars = "";
- $logic_event = self::get_logic_event($field, "keyup");
-
- $tabindex = self::get_tabindex();
- return sprintf("
{$max_chars}", $id, $field_id, esc_attr($class), $disabled_text, esc_html($value));
-
- case "post_title":
- case "post_tags":
- case "post_custom_field":
- $tabindex = self::get_tabindex();
- $logic_event = self::get_logic_event($field, "keyup");
-
- return !empty($post_link) ? $post_link : sprintf("
", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
- break;
-
- case "post_content":
- case "post_excerpt":
- $max_chars = "";
- $logic_event = self::get_logic_event($field, "keyup");
-
- $tabindex = self::get_tabindex();
- return !empty($post_link) ? $post_link : sprintf("
{$max_chars}", $id, $field_id, esc_attr($class), $disabled_text, esc_html($value));
- break;
-
- case "post_category" :
- if(!empty($post_link))
- return $post_link;
-
- if(rgget("displayAllCategories", $field) && !IS_ADMIN){
- $default_category = rgget("categoryInitialItemEnabled", $field) ? "-1" : get_option('default_category');
- $selected = empty($value) ? $default_category : $value;
- $args = array('echo' => 0, 'selected' => $selected, "class" => esc_attr($class) . " gfield_select", 'hide_empty' => 0, 'name' => "input_$id", 'orderby' => 'name', 'hierarchical' => true );
- if(self::$tab_index > 0)
- $args["tab_index"] = self::$tab_index++;
-
- if(rgget("categoryInitialItemEnabled", $field)){
- $args["show_option_none"] = empty($field["categoryInitialItem"]) ? " " : $field["categoryInitialItem"];
- }
-
- $args = apply_filters("gform_post_category_args_{$field["id"]}", apply_filters("gform_post_category_args", $args, $field), $field);
-
- return "" . wp_dropdown_categories($args) . "
";
- }
- else{
- $tabindex = self::get_tabindex();
- if(is_array(rgar($field, "choices")))
- usort($field["choices"], create_function('$a,$b', 'return strcmp($a["text"], $b["text"]);'));
-
- $choices = self::get_select_choices($field, $value);
-
- //Adding first option
- if(rgget("categoryInitialItemEnabled", $field)){
- $selected = empty($value) ? "selected='selected'" : "";
- $choices = "{$field["categoryInitialItem"]} " . $choices;
- }
-
- return sprintf("%s
", $id, $field_id, esc_attr($class), $disabled_text, $choices);
- }
- break;
-
- case "post_image" :
- if(!empty($post_link))
- return $post_link;
-
- $title = esc_attr(rgget($field["id"] . ".1", $value));
- $caption = esc_attr(rgget($field["id"] . ".4", $value));
- $description = esc_attr(rgget($field["id"] . ".7", $value));
-
- //hidding meta fields for admin
- $hidden_style = "style='display:none;'";
- $title_style = !rgget("displayTitle", $field) && IS_ADMIN ? $hidden_style : "";
- $caption_style = !rgget("displayCaption", $field) && IS_ADMIN ? $hidden_style : "";
- $description_style = !rgget("displayDescription", $field) && IS_ADMIN ? $hidden_style : "";
- $file_label_style = IS_ADMIN && !(rgget("displayTitle", $field) || rgget("displayCaption", $field) || rgget("displayDescription", $field)) ? $hidden_style : "";
-
- $hidden_class = $preview = "";
- $file_info = RGFormsModel::get_temp_filename($form_id, "input_{$id}");
- if($file_info){
- $hidden_class = " gform_hidden";
- $file_label_style = $hidden_style;
- $preview = "" . esc_html($file_info["uploaded_filename"]) . " | " . __("delete", "gravityforms") . " ";
- }
-
- //in admin, render all meta fields to allow for immediate feedback, but hide the ones not selected
- $file_label = (IS_ADMIN || rgget("displayTitle", $field) || rgget("displayCaption", $field) || rgget("displayDescription", $field)) ? "" . apply_filters("gform_postimage_file_{$form_id}",apply_filters("gform_postimage_file",__("File", "gravityforms"), $form_id), $form_id) . " " : "";
-
- $tabindex = self::get_tabindex();
- $upload = sprintf("{$preview} $file_label ", $id, $field_id, esc_attr($value), esc_attr($class . $hidden_class), $disabled_text);
-
- $tabindex = self::get_tabindex();
- $title_field = rgget("displayTitle", $field) || IS_ADMIN ? sprintf("" . apply_filters("gform_postimage_title_{$form_id}",apply_filters("gform_postimage_title",__("Title", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $title, $disabled_text, $field_id) : "";
-
- $tabindex = self::get_tabindex();
- $caption_field = rgget("displayCaption", $field) || IS_ADMIN ? sprintf("" . apply_filters("gform_postimage_caption_{$form_id}",apply_filters("gform_postimage_caption",__("Caption", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $caption, $disabled_text, $field_id) : "";
-
- $tabindex = self::get_tabindex();
- $description_field = rgget("displayDescription", $field) || IS_ADMIN? sprintf("" . apply_filters("gform_postimage_description_{$form_id}",apply_filters("gform_postimage_description",__("Description", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $description, $disabled_text, $field_id) : "";
-
- return "" . $upload . $title_field . $caption_field . $description_field . "
";
-
- break;
-
- case "multiselect" :
- if(!empty($post_link))
- return $post_link;
-
- $placeholder = rgar($field, "enableEnhancedUI") ? "data-placeholder='" . esc_attr(apply_filters("gform_multiselect_placeholder_{$form_id}", apply_filters("gform_multiselect_placeholder", __("Click to select...", "gravityforms"), $form_id), $form_id)) . "'" : "";
- $logic_event = self::get_logic_event($field, "keyup");
- $css_class = trim(esc_attr($class) . " gfield_select");
- $size = rgar($field, "multiSelectSize");
- if(empty($size))
- $size = 7;
-
- $tabindex = self::get_tabindex();
- return sprintf("%s
", $id, $field_id, $css_class, $disabled_text, self::get_select_choices($field, $value));
-
- break;
-
- case "select" :
- if(!empty($post_link))
- return $post_link;
-
- $logic_event = self::get_logic_event($field, "change");
- $css_class = trim(esc_attr($class) . " gfield_select");
- $tabindex = self::get_tabindex();
- return sprintf("%s
", $id, $field_id, $css_class, $disabled_text, self::get_select_choices($field, $value));
-
- case "checkbox" :
- if(!empty($post_link))
- return $post_link;
-
- return sprintf("", $field_id, self::get_checkbox_choices($field, $value, $disabled_text));
-
- case "radio" :
- if(!empty($post_link))
- return $post_link;
-
- return sprintf("", $field_id, self::get_radio_choices($field, $value, $disabled_text));
-
- case "password" :
-
- $first_tabindex = self::get_tabindex();
- $last_tabindex = self::get_tabindex();
-
- $strength_style = !rgar($field,"passwordStrengthEnabled") ? "style='display:none;'" : "";
- $strength = rgar($field,"passwordStrengthEnabled") || IS_ADMIN ? "" . __("Strength indicator", "gravityforms") . "
" : "";
-
- $action = !IS_ADMIN ? "gformShowPasswordStrength(\"$field_id\");" : "";
- $onchange= rgar($field,"passwordStrengthEnabled") ? "onchange='{$action}'" : "";
- $onkeyup = rgar($field,"passwordStrengthEnabled") ? "onkeyup='{$action}'" : "";
-
- $pass = RGForms::post("input_" . $id ."_2");
- return sprintf("{$strength}", $id, $field_id, esc_attr($value), $disabled_text, $field_id, $id, $field_id, esc_attr($pass), $disabled_text, $field_id);
-
- case "name" :
- $prefix = "";
- $first = "";
- $last = "";
- $suffix = "";
- if(is_array($value)){
- $prefix = esc_attr(RGForms::get($field["id"] . ".2", $value));
- $first = esc_attr(RGForms::get($field["id"] . ".3", $value));
- $last = esc_attr(RGForms::get($field["id"] . ".6", $value));
- $suffix = esc_attr(RGForms::get($field["id"] . ".8", $value));
- }
- switch(rgget("nameFormat", $field)){
-
- case "extended" :
- $prefix_tabindex = self::get_tabindex();
- $first_tabindex = self::get_tabindex();
- $last_tabindex = self::get_tabindex();
- $suffix_tabindex = self::get_tabindex();
- return sprintf("" . apply_filters("gform_name_prefix_{$form_id}",apply_filters("gform_name_prefix",__("Prefix", "gravityforms"), $form_id), $form_id) . " " . apply_filters("gform_name_first_{$form_id}",apply_filters("gform_name_first",__("First", "gravityforms"), $form_id), $form_id) . " " . apply_filters("gform_name_last_{$form_id}", apply_filters("gform_name_last", __("Last", "gravityforms"), $form_id), $form_id) . " " . apply_filters("gform_name_suffix_{$form_id}", apply_filters("gform_name_suffix", __("Suffix", "gravityforms"), $form_id), $form_id) . "
", $id, $field_id, $prefix, $disabled_text, $field_id, $id, $field_id, $first, $disabled_text, $field_id, $id, $field_id, $last, $disabled_text, $field_id, $id, $field_id, $suffix, $disabled_text, $field_id);
-
- case "simple" :
- $tabindex = self::get_tabindex();
- return sprintf("
", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
-
- default :
- $first_tabindex = self::get_tabindex();
- $last_tabindex = self::get_tabindex();
- return sprintf("", $id, $field_id, $first, $disabled_text, $field_id, $id, $field_id, $last, $disabled_text, $field_id);
- }
-
- case "address" :
- $street_value ="";
- $street2_value ="";
- $city_value ="";
- $state_value ="";
- $zip_value ="";
- $country_value ="";
-
- if(is_array($value)){
- $street_value = esc_attr(rgget($field["id"] . ".1",$value));
- $street2_value = esc_attr(rgget($field["id"] . ".2",$value));
- $city_value = esc_attr(rgget($field["id"] . ".3",$value));
- $state_value = esc_attr(rgget($field["id"] . ".4",$value));
- $zip_value = esc_attr(rgget($field["id"] . ".5",$value));
- $country_value = esc_attr(rgget($field["id"] . ".6",$value));
- }
-
- $address_types = self::get_address_types($form_id);
- $addr_type = empty($field["addressType"]) ? "international" : $field["addressType"];
- $address_type = $address_types[$addr_type];
-
- $state_label = empty($address_type["state_label"]) ? __("State", "gravityforms") : $address_type["state_label"];
- $zip_label = empty($address_type["zip_label"]) ? __("Zip Code", "gravityforms") : $address_type["zip_label"];
- $hide_country = !empty($address_type["country"]) || rgget("hideCountry", $field);
-
- if(empty($country_value))
- $country_value = rgget("defaultCountry", $field);
-
- if(empty($state_value))
- $state_value = rgget("defaultState", $field);
-
- $country_list = self::get_country_dropdown($country_value);
-
- //changing css classes based on field format to ensure proper display
- $address_display_format = apply_filters("gform_address_display_format", "default");
- $city_location = $address_display_format == "zip_before_city" ? "right" : "left";
- $zip_location = $address_display_format != "zip_before_city" && rgar($field,"hideState") ? "right" : "left";
- $state_location = $address_display_format == "zip_before_city" ? "left" : "right";
- $country_location = rgar($field,"hideState") ? "left" : "right";
-
- //address field
- $tabindex = self::get_tabindex();
- $street_address = sprintf("" . apply_filters("gform_address_street_{$form_id}", apply_filters("gform_address_street",__("Street Address", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $street_value, $disabled_text, $field_id);
-
- //address line 2 field
- $street_address2 = "";
- $style = (IS_ADMIN && rgget("hideAddress2", $field)) ? "style='display:none;'" : "";
- if(IS_ADMIN || !rgget("hideAddress2", $field)){
- $tabindex = self::get_tabindex();
- $street_address2 = sprintf("" . apply_filters("gform_address_street2_{$form_id}",apply_filters("gform_address_street2",__("Address Line 2", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $street2_value, $disabled_text, $field_id);
- }
-
- if($address_display_format == "zip_before_city"){
- //zip field
- $tabindex = self::get_tabindex();
- $zip = sprintf("" . apply_filters("gform_address_zip_{$form_id}", apply_filters("gform_address_zip", $zip_label, $form_id), $form_id) . " ", $id, $field_id, $zip_value, $disabled_text, $field_id);
-
- //city field
- $tabindex = self::get_tabindex();
- $city = sprintf("" . apply_filters("gform_address_city_{$form_id}", apply_filters("gform_address_city",__("City", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $city_value, $disabled_text, $field_id);
-
- //state field
- $style = (IS_ADMIN && rgget("hideState", $field)) ? "style='display:none;'" : "";
- if(IS_ADMIN || !rgget("hideState", $field)){
- $state_field = self::get_state_field($field, $id, $field_id, $state_value, $disabled_text, $form_id);
- $state = sprintf("$state_field" . apply_filters("gform_address_state_{$form_id}", apply_filters("gform_address_state", $state_label, $form_id), $form_id) . " ", $field_id);
- }
- else{
- $state = sprintf(" ", $id, $field_id, $state_value);
- }
- }
- else{
-
- //city field
- $tabindex = self::get_tabindex();
- $city = sprintf("" . apply_filters("gform_address_city_{$form_id}", apply_filters("gform_address_city",__("City", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $city_value, $disabled_text, $field_id);
-
- //state field
- $style = (IS_ADMIN && rgget("hideState", $field)) ? "style='display:none;'" : "";
- if(IS_ADMIN || !rgget("hideState", $field)){
- $state_field = self::get_state_field($field, $id, $field_id, $state_value, $disabled_text, $form_id);
- $state = sprintf("$state_field" . apply_filters("gform_address_state_{$form_id}", apply_filters("gform_address_state", $state_label, $form_id), $form_id) . " ", $field_id);
- }
- else{
- $state = sprintf(" ", $id, $field_id, $state_value);
- }
-
- //zip field
- $tabindex = self::get_tabindex();
- $zip = sprintf("" . apply_filters("gform_address_zip_{$form_id}", apply_filters("gform_address_zip", $zip_label, $form_id), $form_id) . " ", $id, $field_id, $zip_value, $disabled_text, $field_id);
-
- }
-
- if(IS_ADMIN || !$hide_country){
- $style = $hide_country ? "style='display:none;'" : "";
- $tabindex = self::get_tabindex();
- $country = sprintf("%s " . apply_filters("gform_address_country_{$form_id}", apply_filters("gform_address_country",__("Country", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $disabled_text, $country_list, $field_id);
- }
- else{
- $country = sprintf(" ", $id, $field_id, $country_value);
- }
-
- $inputs = $address_display_format == "zip_before_city" ? $street_address . $street_address2 . $zip . $city . $state . $country : $street_address . $street_address2 . $city . $state . $zip . $country;
-
- return "";
-
- case "date" :
- if(!empty($post_link))
- return $post_link;
-
- $format = empty($field["dateFormat"]) ? "mdy" : esc_attr($field["dateFormat"]);
- $field_position = substr($format, 0, 3);
- if(IS_ADMIN && RG_CURRENT_VIEW != "entry"){
- $datepicker_display = in_array(rgget("dateType", $field), array("datefield", "datedropdown")) ? "none" : "inline";
- $datefield_display = rgget("dateType", $field) == "datefield" ? "inline" : "none";
- $dropdown_display = rgget("dateType", $field) == "datedropdown" ? "inline" : "none";
- $icon_display = rgget("calendarIconType", $field) == "calendar" ? "inline" : "none";
-
- $month_field = "" . __("MM", "gravityforms") . "
";
- $day_field = "" . __("DD", "gravityforms") . "
";
- $year_field = "" . __("YYYY", "gravityforms") . "
";
-
- $month_dropdown = "" . self::get_month_dropdown("","","","","disabled='disabled'") . "
";
- $day_dropdown = "" . self::get_day_dropdown("","","","","disabled='disabled'") . "
";
- $year_dropdown = "" . self::get_year_dropdown("","","","","disabled='disabled'") . "
";
-
- $field_string ="";
-
- switch($field_position){
- case "dmy" :
- $field_string .= $day_field . $month_field . $year_field . $day_dropdown . $month_dropdown . $year_dropdown;
- break;
-
- case "ymd" :
- $field_string .= $year_field . $month_field . $day_field . $year_dropdown . $month_dropdown . $day_dropdown;
- break;
-
- default :
- $field_string .= $month_field . $day_field . $year_field . $month_dropdown . $day_dropdown . $year_dropdown;
- break;
- }
-
- return $field_string;
- }
- else{
- $date_info = self::parse_date($value, $format);
- $date_type = rgget("dateType", $field);
- if(in_array($date_type, array("datefield", "datedropdown")))
- {
- switch($field_position){
-
- case "dmy" :
- $tabindex = self::get_tabindex();
- $field_str = $date_type == "datedropdown"
- ? "" . self::get_day_dropdown("input_{$id}[]", "{$field_id}_2", rgar($date_info,"day"), $tabindex, $disabled_text) . "
"
- : sprintf("
" . __("DD", "gravityforms") . "
", $field_id, $id, $field_id, rgget("day", $date_info), $disabled_text, $field_id);
-
- $tabindex = self::get_tabindex();
- $field_str .= $date_type == "datedropdown"
- ? "
" . self::get_month_dropdown("input_{$id}[]", "{$field_id}_1", rgar($date_info,"month"), $tabindex, $disabled_text) . "
"
- : sprintf("
" . __("MM", "gravityforms") . "
", $field_id, $id, $field_id, rgget("month", $date_info), $disabled_text, $field_id);
-
- $tabindex = self::get_tabindex();
- $field_str .= $date_type == "datedropdown"
- ? "
" . self::get_year_dropdown("input_{$id}[]", "{$field_id}_3", rgar($date_info,"year"), $tabindex, $disabled_text) . "
"
- : sprintf("
" . __("YYYY", "gravityforms") . "
", $field_id, $id, $field_id, rgget("year", $date_info), $disabled_text, $field_id);
-
- break;
-
- case "ymd" :
- $tabindex = self::get_tabindex();
- $field_str = $date_type == "datedropdown"
- ? "" . self::get_year_dropdown("input_{$id}[]", "{$field_id}_3", rgar($date_info,"year"), $tabindex, $disabled_text) . "
"
- : sprintf("
" . __("YYYY", "gravityforms") . "
", $field_id, $id, $field_id, rgget("year", $date_info), $disabled_text, $field_id);
-
- $field_str .= $date_type == "datedropdown"
- ? "
" . self::get_month_dropdown("input_{$id}[]", "{$field_id}_1", rgar($date_info,"month"), $tabindex, $disabled_text) . "
"
- : sprintf("
" . __("MM", "gravityforms") . "
", $field_id, $id, $field_id, rgar($date_info,"month"), $disabled_text, $field_id);
-
- $tabindex = self::get_tabindex();
- $field_str .= $date_type == "datedropdown"
- ? "
" . self::get_day_dropdown("input_{$id}[]", "{$field_id}_2", rgar($date_info,"day"), $tabindex, $disabled_text) . "
"
- : sprintf("
" . __("DD", "gravityforms") . "
", $field_id, $id, $field_id, rgar($date_info,"day"), $disabled_text, $field_id);
-
- break;
-
- default :
- $tabindex = self::get_tabindex();
-
- $field_str = $date_type == "datedropdown"
- ? "" . self::get_month_dropdown("input_{$id}[]", "{$field_id}_1", rgar($date_info,"month"), $tabindex, $disabled_text) . "
"
- : sprintf("
" . __("MM", "gravityforms") . "
", $field_id, $id, $field_id, rgar($date_info,"month"), $disabled_text, $field_id);
-
- $tabindex = self::get_tabindex();
- $field_str .= $date_type == "datedropdown"
- ? "
" . self::get_day_dropdown("input_{$id}[]", "{$field_id}_2", rgar($date_info,"day"), $tabindex, $disabled_text) . "
"
- : sprintf("
" . __("DD", "gravityforms") . "
", $field_id, $id, $field_id, rgar($date_info,"day"), $disabled_text, $field_id);
-
- $tabindex = self::get_tabindex();
- $field_str .= $date_type == "datedropdown"
- ? "
" . self::get_year_dropdown("input_{$id}[]", "{$field_id}_3", rgar($date_info,"year"), $tabindex, $disabled_text) . "
"
- : sprintf("
" . __("YYYY", "gravityforms") . "
", $field_id, $id, $field_id, rgget("year", $date_info), $disabled_text, $field_id);
-
- break;
- }
-
- return $field_str;
- }
- else
- {
- $value = GFCommon::date_display($value, $format);
- $icon_class = $field["calendarIconType"] == "none" ? "datepicker_no_icon" : "datepicker_with_icon";
- $icon_url = empty($field["calendarIconUrl"]) ? GFCommon::get_base_url() . "/images/calendar.png" : $field["calendarIconUrl"];
- $tabindex = self::get_tabindex();
- return sprintf("
", $id, $field_id, esc_attr($value), esc_attr($class), $format, $icon_class, $disabled_text);
- }
- }
-
- case "time" :
- if(!empty($post_link))
- return $post_link;
-
- $hour = $minute = $am_selected = $pm_selected = "";
-
- if(!is_array($value) && !empty($value)){
- preg_match('/^(\d*):(\d*) ?(.*)$/', $value, $matches);
- $hour = esc_attr($matches[1]);
- $minute = esc_attr($matches[2]);
- $am_selected = rgar($matches,3) == "am" ? "selected='selected'" : "";
- $pm_selected = rgar($matches,3) == "pm" ? "selected='selected'" : "";
- }
- else if(is_array($value)){
- $hour = esc_attr($value[0]);
- $minute = esc_attr($value[1]);
- $am_selected = rgar($value,2) == "am" ? "selected='selected'" : "";
- $pm_selected = rgar($value,2) == "pm" ? "selected='selected'" : "";
- }
- $hour_tabindex = self::get_tabindex();
- $minute_tabindex = self::get_tabindex();
- $ampm_tabindex = self::get_tabindex();
-
- $ampm_field_style = is_admin() && rgar($field, "timeFormat") == "24" ? "style='display:none;'" : "";
- $ampm_field = is_admin() || rgar($field, "timeFormat") != "24" ? "" . __("AM", "gravityforms") . " " . __("PM", "gravityforms") . "
" : "";
-
- return sprintf("", $field_id, $id, $field_id, $hour, $disabled_text, $field_id, $id, $field_id, $minute, $disabled_text, $field_id);
-
- case "fileupload" :
- $tabindex = self::get_tabindex();
- $multiple_files = rgar($field, "multipleFiles");
- $file_list_id = "gform_preview_" . $form_id . "_". $id;
- $max_upload_size = ! IS_ADMIN && isset($field["maxFileSize"]) && $field["maxFileSize"] > 0 ? $field["maxFileSize"] * 1048576: wp_max_upload_size();
- if($multiple_files){
- $upload_action_url = trailingslashit(site_url()) . "?gf_page=upload";
- $max_files = isset($field["maxFiles"]) && $field["maxFiles"] > 0 ? $field["maxFiles"]: 0;
- $browse_button_id = 'gform_browse_button_' . $form_id . "_" . $id;
- $container_id = 'gform_multifile_upload_' . $form_id . "_" . $id;
- $drag_drop_id = 'gform_drag_drop_area_' . $form_id . "_" . $id;
-
- $messages_id = "gform_multifile_messages_{$form_id}_{$id}";
- $allowed_extensions = isset($field["allowedExtensions"]) && !empty($field["allowedExtensions"]) ? join(",", GFCommon::clean_extensions(explode(",", strtolower($field["allowedExtensions"])))) : array();
- if(empty($allowed_extensions))
- $allowed_extensions="*";
- $disallowed_extensions = GFCommon::get_disallowed_file_extensions();
- $plupload_init = defined('DOING_AJAX') && DOING_AJAX && "rg_change_input_type" === rgpost('action') ? array() : array(
- 'runtimes' => 'html5,flash,html4',
- 'browse_button' => $browse_button_id,
- 'container' => $container_id,
- 'drop_element' => $drag_drop_id,
- 'filelist' => $file_list_id,
- 'unique_names' => true,
- 'file_data_name' => 'file',
- 'multiple_queues' => true,
- /*'chunk_size' => '10mb',*/ // chunking doesn't currently have very good cross-browser support
- 'max_file_size' => $max_upload_size . 'b',
- 'url' => $upload_action_url,
- 'flash_swf_url' => includes_url('js/plupload/plupload.flash.swf'),
- 'silverlight_xap_url' => includes_url('js/plupload/plupload.silverlight.xap'),
- 'filters' => array( array('title' => __( 'Allowed Files', 'gravityforms' ), 'extensions' => $allowed_extensions) ),
- 'multipart' => true,
- 'urlstream_upload' => false,
- 'multipart_params' => array(
- "form_id" => $form_id,
- "field_id" => $id
- ),
- 'gf_vars' => array(
- 'max_files' => $max_files,
- 'message_id' => $messages_id,
- 'disallowed_extensions' => $disallowed_extensions
- )
- );
-
- // Multi-file uploading doesn't currently work in iOS Safari,
- // single-file allows the built-in camera to be used as source for images
- if ( wp_is_mobile() )
- $plupload_init['multi_selection'] = false;
-
- $plupload_init_json = htmlspecialchars(json_encode($plupload_init), ENT_QUOTES, 'UTF-8');
- $upload = sprintf("",$container_id, $plupload_init_json, $drag_drop_id, __("Drop files here or" ,"gravityforms"), $browse_button_id, __("Select files", "gravityforms") ) ;
- if(!IS_ADMIN)
- $upload .= "";
-
- if(IS_ADMIN && RG_CURRENT_VIEW === "entry")
- $upload .= sprintf(' ', $id, esc_attr($value));
-
- } else {
- $upload = sprintf(" ", $max_upload_size);
- $upload .= sprintf(" ", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
- }
-
- if(IS_ADMIN && RG_CURRENT_VIEW === "entry" && !empty($value)){ // edit entry
- $file_urls = $multiple_files ? json_decode($value) : array($value);
- $upload_display = $multiple_files ? "" : "style='display:none'";
- $preview = "$upload
";
- $preview .= sprintf("
", $file_list_id);
- $preview .= sprintf("", $id);
-
- foreach($file_urls as $file_index => $file_url){
- $file_url = esc_attr($file_url);
- $preview .= sprintf("
", $file_index, $file_url, $file_url, $file_url, GFCommon::truncate_url($file_url), $file_url, GFCommon::get_base_url() . "/images/download.png", $lead_id, $id, GFCommon::get_base_url() . "/images/icon-delete.png");
- }
-
- $preview .="
";
-
- return $preview;
- } else {
- $input_name = "input_{$id}";
- $uploaded_files = isset(GFFormsModel::$uploaded_files[$form_id][$input_name]) ? GFFormsModel::$uploaded_files[$form_id][$input_name] : array();
- $file_infos = $multiple_files ? $uploaded_files : RGFormsModel::get_temp_filename($form_id, $input_name);
-
- if(!empty($file_infos)){
- $preview = sprintf("", $file_list_id);
- $file_infos = $multiple_files ? $uploaded_files : array($file_infos);
- foreach($file_infos as $file_info){
- $preview .= "
";
- }
- $preview .= "
";
- if(!$multiple_files)
- $upload = str_replace(" class='", " class='gform_hidden ", $upload);
- return "" . $upload . " {$preview}
";
- }
- else{
-
- $preview = $multiple_files ? sprintf("
", $file_list_id) : "";
-
- return "$upload
" . $preview;
- }
- }
-
- case "captcha" :
-
- switch(rgget("captchaType", $field)){
- case "simple_captcha" :
- $size = rgempty("simpleCaptchaSize", $field) ? "medium" : $field["simpleCaptchaSize"];
- $captcha = self::get_captcha($field);
-
- $tabindex = self::get_tabindex();
-
- $dimensions = IS_ADMIN ? "" : "width='" . rgar($captcha,"width") . "' height='" . rgar($captcha,"height") . "'";
- return "";
- break;
-
- case "math" :
- $size = empty($field["simpleCaptchaSize"]) ? "medium" : $field["simpleCaptchaSize"];
- $captcha_1 = self::get_math_captcha($field, 1);
- $captcha_2 = self::get_math_captcha($field, 2);
- $captcha_3 = self::get_math_captcha($field, 3);
-
- $tabindex = self::get_tabindex();
-
- $dimensions = IS_ADMIN ? "" : "width='{$captcha_1["width"]}' height='{$captcha_1["height"]}'";
- return "";
- break;
-
- default:
-
- if(!function_exists("recaptcha_get_html")){
- require_once(GFCommon::get_base_path() . '/recaptchalib.php');
- }
-
- $theme = empty($field["captchaTheme"]) ? "red" : esc_attr($field["captchaTheme"]);
- $publickey = get_option("rg_gforms_captcha_public_key");
- $privatekey = get_option("rg_gforms_captcha_private_key");
- if(IS_ADMIN){
- if(empty($publickey) || empty($privatekey)){
- return "" . __("To use the reCaptcha field you must first do the following:", "gravityforms") . "
2 - " . sprintf(__("Enter your reCAPTCHA keys in the %ssettings page%s", "gravityforms"), "
", " ") . "
";
- }
- else{
- return "";
- }
- }
- else{
- $language = empty($field["captchaLanguage"]) ? "en" : esc_attr($field["captchaLanguage"]);
-
- if(empty(self::$tab_index))
- self::$tab_index = 1;
-
- $options = "";
-
- $is_ssl = !empty($_SERVER['HTTPS']);
- return $options . "" . recaptcha_get_html($publickey, null, $is_ssl, $language) . "
";
- }
- }
- break;
-
- case "creditcard" :
-
- $card_number = "";
- $card_name = "";
- $expiration_date = "";
- $expiration_month = "";
- $expiration_year = "";
- $security_code = "";
- $autocomplete = RGFormsModel::is_html5_enabled() ? "autocomplete='off'" : "";
-
- if(is_array($value)){
- $card_number = esc_attr(rgget($field["id"] . ".1",$value));
- $card_name = esc_attr(rgget($field["id"] . ".5",$value));
- $expiration_date = rgget($field["id"] . ".2",$value);
- if(!is_array($expiration_date) && !empty($expiration_date))
- $expiration_date = explode("/", $expiration_date);
-
- if(is_array($expiration_date) && count($expiration_date) == 2){
- $expiration_month = $expiration_date[0];
- $expiration_year = $expiration_date[1];
- }
-
- $security_code = esc_attr(rgget($field["id"] . ".3",$value));
- }
-
- $action = !IS_ADMIN ? "gformMatchCard(\"{$field_id}_1\");" : "";
-
- $onchange= "onchange='{$action}'";
- $onkeyup = "onkeyup='{$action}'";
-
- $card_icons = '';
- $cards = GFCommon::get_card_types();
- $card_style = rgar($field, 'creditCardStyle') ? rgar($field, 'creditCardStyle') : 'style1';
-
- foreach($cards as $card) {
-
- $style = "";
- if(self::is_card_supported($field, $card["slug"])){
- $print_card = true;
- }
- else if (IS_ADMIN){
- $print_card = true;
- $style = "style='display:none;'";
- }
- else{
- $print_card = false;
- }
-
- if($print_card){
- $card_icons .= "{$card['name']}
";
- }
- }
-
- $payment_methods = apply_filters("gform_payment_methods", array(), $field, $form_id);
- $payment_options = "";
- if(is_array($payment_methods)){
- foreach($payment_methods as $payment_method){
- $checked = rgpost("gform_payment_method") == $payment_method["key"] ? "checked='checked'" : "";
- $payment_options .=" {$payment_method["label"]}
";
- }
- }
- $checked = rgpost("gform_payment_method") == "creditcard" || rgempty("gform_payment_method") ? "checked='checked'" : "";
- $card_radio_button = empty($payment_options) ? "" : " ";
- $card_icons = "{$payment_options}{$card_radio_button}{$card_icons}
";
-
-
-
- //card number fields
- $tabindex = self::get_tabindex();
- $html5_output = GFFormsModel::is_html5_enabled() ? "pattern='[0-9]*' title='" . __("Only digits are allowed", "gravityforms") . "'" : "";
- $card_field = sprintf("{$card_icons}" . apply_filters("gform_card_number_{$form_id}", apply_filters("gform_card_number",__("Card Number", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $card_number, $disabled_text, $field_id);
-
- //expiration date field
- $expiration_field = "";
-
- $tabindex = self::get_tabindex();
- $card_name_field = sprintf("" . apply_filters("gform_card_name_{$form_id}", apply_filters("gform_card_name",__("Cardholder Name", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $card_name, $disabled_text, $field_id);
-
- return "" . $card_field . $expiration_field . $security_field . $card_name_field . "
";
-
- break;
-
- case "list" :
-
- if(!empty($value))
- $value = maybe_unserialize($value);
-
- if(!is_array($value))
- $value = array(array());
-
- $has_columns = is_array(rgar($field, "choices"));
- $columns = $has_columns ? rgar($field, "choices") : array(array());
-
- $list = "";
-
- return $list;
- break;
- }
- }
-
- public static function is_ssl(){
- global $wordpress_https;
- $is_ssl = false;
-
- $has_https_plugin = class_exists('WordPressHTTPS') && isset($wordpress_https);
- $has_is_ssl_method = $has_https_plugin && method_exists('WordPressHTTPS', 'is_ssl');
- $has_isSsl_method = $has_https_plugin && method_exists('WordPressHTTPS', 'isSsl');
-
- //Use the WordPress HTTPs plugin if installed
- if ($has_https_plugin && $has_is_ssl_method){
- $is_ssl = $wordpress_https->is_ssl();
- }
- else if ($has_https_plugin && $has_isSsl_method){
- $is_ssl = $wordpress_https->isSsl();
- }
- else{
- $is_ssl = is_ssl();
- }
-
-
- if(!$is_ssl && isset($_SERVER["HTTP_CF_VISITOR"]) && strpos($_SERVER["HTTP_CF_VISITOR"], "https")){
- $is_ssl=true;
- }
-
- return apply_filters("gform_is_ssl", $is_ssl);
- }
-
- public static function is_card_supported($field, $card_slug){
- $supported_cards = rgar($field, 'creditCards');
- $default_cards = array('amex', 'discover', 'mastercard', 'visa');
-
- if(!empty($supported_cards) && in_array($card_slug, $supported_cards)) {
- return true;
- }
- else if(empty($supported_cards) && in_array($card_slug, $default_cards)) {
- return true;
- }
-
- return false;
-
- }
-
- public static function is_preview(){
- $url_info = parse_url(RGFormsModel::get_current_page_url());
- $file_name = basename($url_info["path"]);
- return $file_name == "preview.php" || rgget("gf_page", $_GET) == "preview";
- }
-
- private static function get_expiration_months($selected_month){
- $str = "" . __("Month", "gravityforms") . " ";
- for($i=1; $i<13; $i++){
- $selected = intval($selected_month) == $i ? "selected='selected'" : "";
- $month = str_pad($i, 2, "0", STR_PAD_LEFT);
- $str .= "{$month} ";
- }
- return $str;
- }
-
- private static function get_expiration_years($selected_year){
- $str = "" . __("Year", "gravityforms") . " ";
- $year = intval(date("Y"));
- for($i=$year; $i < ($year + 20); $i++){
- $selected = intval($selected_year) == $i ? "selected='selected'" : "";
- $str .= "{$i} ";
- }
- return $str;
- }
-
- private static function get_list_input($field, $has_columns, $column, $value, $form_id){
-
- $tabindex = GFCommon::get_tabindex();
-
- $column_index = 1;
- if($has_columns && is_array(rgar($field, "choices"))){
- foreach($field["choices"] as $choice){
- if($choice["text"] == $column["text"])
- break;
-
- $column_index++;
- }
- }
- $input_info = array("type" => "text");
-
- $input_info = apply_filters("gform_column_input_{$form_id}_{$field["id"]}_{$column_index}", apply_filters("gform_column_input", $input_info, $field, rgar($column, "text"), $value, $form_id), $field, rgar($column, "text"), $value, $form_id);
-
- switch($input_info["type"]){
-
- case "select" :
- $input = "";
- if(!is_array($input_info["choices"]))
- $input_info["choices"] = explode(",", $input_info["choices"]);
-
- foreach($input_info["choices"] as $choice){
- if(is_array($choice)){
- $choice_value = $choice["value"];
- $choice_text = $choice["text"];
- $choice_selected = $choice["isSelected"];
- }
- else{
- $choice_value = $choice;
- $choice_text = $choice;
- $choice_selected = false;
- }
- $is_selected = empty($value) ? $choice_selected : $choice_value == $value;
- $selected = $is_selected ? "selected='selected'" : "";
- $input .= "" . esc_html($choice_text) . " ";
- }
- $input .= " ";
-
- break;
-
- default :
- $input = " ";
- break;
- }
-
- return apply_filters("gform_column_input_content_{$form_id}_{$field["id"]}_{$column_index}",
- apply_filters("gform_column_input_content", $input, $input_info, $field, rgar($column, "text"), $value, $form_id),
- $input_info, $field, rgar($column, "text"), $value, $form_id);
-
- }
-
- public static function clean_extensions($extensions){
- $count = sizeof($extensions);
- for($i=0; $i<$count; $i++){
- $extensions[$i] = str_replace(".", "",str_replace(" ", "", $extensions[$i]));
- }
- return $extensions;
- }
-
- public static function get_disallowed_file_extensions(){
- return array("php", "asp", "exe", "com", "htaccess");
- }
-
- public static function to_money($number, $currency_code=""){
- if(!class_exists("RGCurrency"))
- require_once("currency.php");
-
- if(empty($currency_code))
- $currency_code = self::get_currency();
-
- $currency = new RGCurrency($currency_code);
- return $currency->to_money($number);
- }
-
- public static function to_number($text, $currency_code=""){
- if(!class_exists("RGCurrency"))
- require_once("currency.php");
-
- if(empty($currency_code))
- $currency_code = self::get_currency();
-
- $currency = new RGCurrency($currency_code);
-
- return $currency->to_number($text);
- }
-
- public static function get_currency(){
- $currency = get_option("rg_gforms_currency");
- $currency = empty($currency) ? "USD" : $currency;
-
- return apply_filters("gform_currency", $currency);
- }
-
-
- public static function get_simple_captcha(){
- $captcha = new ReallySimpleCaptcha();
- $captcha->tmp_dir = RGFormsModel::get_upload_path("captcha") . "/";
- return $captcha;
- }
-
- public static function get_captcha($field){
- if(!class_exists("ReallySimpleCaptcha"))
- return array();
-
- $captcha = self::get_simple_captcha();
-
- //If captcha folder does not exist and can't be created, return an empty captcha
- if(!wp_mkdir_p($captcha->tmp_dir))
- return array();
-
- $captcha->char_length = 5;
- switch(rgar($field,"simpleCaptchaSize")){
- case "small" :
- $captcha->img_size = array( 100, 28 );
- $captcha->font_size = 18;
- $captcha->base = array( 8, 20 );
- $captcha->font_char_width = 17;
-
- break;
-
- case "large" :
- $captcha->img_size = array( 200, 56 );
- $captcha->font_size = 32;
- $captcha->base = array( 18, 42 );
- $captcha->font_char_width = 35;
- break;
-
- default :
- $captcha->img_size = array( 150, 42 );
- $captcha->font_size = 26;
- $captcha->base = array( 15, 32 );
- $captcha->font_char_width = 25;
- break;
- }
-
- if(!empty($field["simpleCaptchaFontColor"])){
- $captcha->fg = self::hex2rgb($field["simpleCaptchaFontColor"]);
- }
- if(!empty($field["simpleCaptchaBackgroundColor"])){
- $captcha->bg = self::hex2rgb($field["simpleCaptchaBackgroundColor"]);
- }
-
- $word = $captcha->generate_random_word();
- $prefix = mt_rand();
- $filename = $captcha->generate_image($prefix, $word);
- $url = RGFormsModel::get_upload_url("captcha") . "/" . $filename;
- $path = $captcha->tmp_dir . $filename;
-
- if(self::is_ssl() && strpos($url, "http:") !== false ){
- $url = str_replace("http:", "https:", $url);
- }
-
- return array("path"=>$path, "url"=> $url, "height" => $captcha->img_size[1], "width" => $captcha->img_size[0], "prefix" => $prefix);
- }
-
- public static function get_math_captcha($field, $pos){
- if(!class_exists("ReallySimpleCaptcha"))
- return array();
-
- $captcha = self::get_simple_captcha();
-
- //If captcha folder does not exist and can't be created, return an empty captcha
- if(!wp_mkdir_p($captcha->tmp_dir))
- return array();
-
- $captcha->char_length = 1;
- if($pos == 1 || $pos == 3)
- $captcha->chars = '0123456789';
- else
- $captcha->chars = '+';
-
- switch(rgar($field,"simpleCaptchaSize")){
- case "small" :
- $captcha->img_size = array( 23, 28 );
- $captcha->font_size = 18;
- $captcha->base = array( 6, 20 );
- $captcha->font_char_width = 17;
-
- break;
-
- case "large" :
- $captcha->img_size = array( 36, 56 );
- $captcha->font_size = 32;
- $captcha->base = array( 10, 42 );
- $captcha->font_char_width = 35;
- break;
-
- default :
- $captcha->img_size = array( 30, 42 );
- $captcha->font_size = 26;
- $captcha->base = array( 9, 32 );
- $captcha->font_char_width = 25;
- break;
- }
-
- if(!empty($field["simpleCaptchaFontColor"])){
- $captcha->fg = self::hex2rgb($field["simpleCaptchaFontColor"]);
- }
- if(!empty($field["simpleCaptchaBackgroundColor"])){
- $captcha->bg = self::hex2rgb($field["simpleCaptchaBackgroundColor"]);
- }
-
- $word = $captcha->generate_random_word();
- $prefix = mt_rand();
- $filename = $captcha->generate_image($prefix, $word);
- $url = RGFormsModel::get_upload_url("captcha") . "/" . $filename;
- $path = $captcha->tmp_dir . $filename;
-
- return array("path"=>$path, "url"=> $url, "height" => $captcha->img_size[1], "width" => $captcha->img_size[0], "prefix" => $prefix);
- }
-
- private static function hex2rgb($color){
- if ($color[0] == '#')
- $color = substr($color, 1);
-
- if (strlen($color) == 6)
- list($r, $g, $b) = array($color[0].$color[1],
- $color[2].$color[3],
- $color[4].$color[5]);
- elseif (strlen($color) == 3)
- list($r, $g, $b) = array($color[0].$color[0], $color[1].$color[1], $color[2].$color[2]);
- else
- return false;
-
- $r = hexdec($r); $g = hexdec($g); $b = hexdec($b);
-
- return array($r, $g, $b);
- }
-
- public static function get_address_types($form_id){
-
- $addressTypes = array(
- "international" => array("label" => __("International", "gravityforms"),"zip_label" => apply_filters("gform_address_zip_{$form_id}",apply_filters("gform_address_zip", __("ZIP / Postal Code", "gravityforms"), $form_id), $form_id),"state_label" => apply_filters("gform_address_state_{$form_id}",apply_filters("gform_address_state",__("State / Province / Region", "gravityforms"), $form_id), $form_id)),
- "us" => array("label" => __("United States", "gravityforms"),"zip_label" => apply_filters("gform_address_zip_{$form_id}",apply_filters("gform_address_zip", __("ZIP Code", "gravityforms"), $form_id), $form_id), "state_label" => apply_filters("gform_address_state_{$form_id}",apply_filters("gform_address_state",__("State", "gravityforms"), $form_id), $form_id), "country" => "United States", "states" => array_merge(array(''), GFCommon::get_us_states())),
- "canadian" => array("label" => __("Canadian", "gravityforms"), "zip_label" => apply_filters("gform_address_zip_{$form_id}",apply_filters("gform_address_zip", __("Postal Code", "gravityforms"), $form_id), $form_id), "state_label" => apply_filters("gform_address_state_{$form_id}",apply_filters("gform_address_state",__("Province", "gravityforms"), $form_id), $form_id),"country" => "Canada", "states" => array_merge(array(''), GFCommon::get_canadian_provinces()))
- );
-
- return apply_filters("gform_address_types_{$form_id}", apply_filters("gform_address_types", $addressTypes, $form_id), $form_id);
- }
-
- private static function get_state_field($field, $id, $field_id, $state_value, $disabled_text, $form_id){
- $state_dropdown_class = $state_text_class = $state_style = $text_style = $state_field_id = "";
-
- if(empty($state_value)){
- $state_value = rgget("defaultState", $field);
-
- //for backwards compatibility (canadian address type used to store the default state into the defaultProvince property)
- if (rgget("addressType", $field) == "canadian" && !rgempty("defaultProvince", $field))
- $state_value = $field["defaultProvince"];
- }
-
- $address_type = rgempty("addressType", $field) ? "international" : $field["addressType"];
- $address_types = self::get_address_types($form_id);
- $has_state_drop_down = isset($address_types[$address_type]["states"]) && is_array($address_types[$address_type]["states"]);
-
- if(IS_ADMIN && RG_CURRENT_VIEW != "entry"){
- $state_dropdown_class = "class='state_dropdown'";
- $state_text_class = "class='state_text'";
- $state_style = !$has_state_drop_down ? "style='display:none;'" : "";
- $text_style = $has_state_drop_down ? "style='display:none;'" : "";
- $state_field_id = "";
- }
- else{
- //id only displayed on front end
- $state_field_id = "id='" . $field_id . "_4'";
- }
-
- $tabindex = self::get_tabindex();
- $states = empty($address_types[$address_type]["states"]) ? array() : $address_types[$address_type]["states"];
- $state_dropdown = sprintf("%s ", $id, $state_field_id, $disabled_text, GFCommon::get_state_dropdown($states, $state_value));
-
- $tabindex = self::get_tabindex();
- $state_text = sprintf(" ", $id, $state_field_id, $state_value, $disabled_text);
-
- if(IS_ADMIN && RG_CURRENT_VIEW != "entry")
- return $state_dropdown . $state_text;
- else if($has_state_drop_down)
- return $state_dropdown;
- else
- return $state_text;
- }
-
- public static function get_lead_field_display($field, $value, $currency="", $use_text=false, $format="html", $media="screen"){
-
- if($field['type'] == 'post_category')
- $value = self::prepare_post_category_value($value, $field);
-
- switch(RGFormsModel::get_input_type($field)){
- case "name" :
- if(is_array($value)){
- $prefix = trim(rgget($field["id"] . ".2", $value));
- $first = trim(rgget($field["id"] . ".3", $value));
- $last = trim(rgget($field["id"] . ".6", $value));
- $suffix = trim(rgget($field["id"] . ".8", $value));
-
- $name = $prefix;
- $name .= !empty($name) && !empty($first) ? " $first" : $first;
- $name .= !empty($name) && !empty($last) ? " $last" : $last;
- $name .= !empty($name) && !empty($suffix) ? " $suffix" : $suffix;
-
- return $name;
- }
- else{
- return $value;
- }
-
- break;
- case "creditcard" :
- if(is_array($value)){
- $card_number = trim(rgget($field["id"] . ".1", $value));
- $card_type = trim(rgget($field["id"] . ".4", $value));
- $separator = $format == "html" ? " " : "\n";
- return empty($card_number) ? "" : $card_type . $separator . $card_number;
- }
- else{
- return "";
- }
- break;
-
- case "address" :
- if(is_array($value)){
- $street_value = trim(rgget($field["id"] . ".1", $value));
- $street2_value = trim(rgget($field["id"] . ".2", $value));
- $city_value = trim(rgget($field["id"] . ".3", $value));
- $state_value = trim(rgget($field["id"] . ".4", $value));
- $zip_value = trim(rgget($field["id"] . ".5", $value));
- $country_value = trim(rgget($field["id"] . ".6", $value));
-
- $line_break = $format == "html" ? " " : "\n";
-
- $address_display_format = apply_filters("gform_address_display_format", "default");
- if($address_display_format == "zip_before_city"){
- /*
- Sample:
- 3333 Some Street
- suite 16
- 2344 City, State
- Country
- */
-
- $addr_ary = array();
- $addr_ary[] = $street_value;
-
- if(!empty($street2_value))
- $addr_ary[] = $street2_value;
-
- $zip_line = trim($zip_value . " " . $city_value);
- $zip_line .= !empty($zip_line) && !empty($state_value) ? ", {$state_value}" : $state_value;
- $zip_line = trim($zip_line);
- if(!empty($zip_line))
- $addr_ary[] = $zip_line;
-
- if(!empty($country_value))
- $addr_ary[] = $country_value;
-
- $address = implode(" ", $addr_ary);
-
- }
- else{
- $address = $street_value;
- $address .= !empty($address) && !empty($street2_value) ? $line_break . $street2_value : $street2_value;
- $address .= !empty($address) && (!empty($city_value) || !empty($state_value)) ? $line_break. $city_value : $city_value;
- $address .= !empty($address) && !empty($city_value) && !empty($state_value) ? ", $state_value" : $state_value;
- $address .= !empty($address) && !empty($zip_value) ? " $zip_value" : $zip_value;
- $address .= !empty($address) && !empty($country_value) ? $line_break . $country_value : $country_value;
- }
-
- //adding map link
- if(!empty($address) && $format == "html"){
- $address_qs = str_replace($line_break, " ", $address); //replacing and \n with spaces
- $address_qs = urlencode($address_qs);
- $address .= "Map It ";
- }
-
- return $address;
- }
- else{
- return "";
- }
- break;
-
- case "email" :
- return GFCommon::is_valid_email($value) && $format == "html" ? "$value " : $value;
- break;
-
- case "website" :
- return GFCommon::is_valid_url($value) && $format == "html" ? "$value " : $value;
- break;
-
- case "checkbox" :
- if(is_array($value)){
-
- $items = '';
-
- foreach($value as $key => $item){
- if(!empty($item)){
- switch($format){
- case "text" :
- $items .= GFCommon::selection_display($item, $field, $currency, $use_text) . ", ";
- break;
-
- default:
- $items .= "" . GFCommon::selection_display($item, $field, $currency, $use_text) . " ";
- break;
- }
- }
- }
- if(empty($items)){
- return "";
- }
- else if($format == "text"){
- return substr($items, 0, strlen($items)-2); //removing last comma
- }
- else{
- return "";
- }
- }
- else{
- return $value;
- }
- break;
-
- case "post_image" :
- $ary = explode("|:|", $value);
- $url = count($ary) > 0 ? $ary[0] : "";
- $title = count($ary) > 1 ? $ary[1] : "";
- $caption = count($ary) > 2 ? $ary[2] : "";
- $description = count($ary) > 3 ? $ary[3] : "";
-
- if(!empty($url)){
- $url = str_replace(" ", "%20", $url);
-
- switch($format){
- case "text" :
- $value = $url;
- $value .= !empty($title) ? "\n\n" . $field["label"] . " (" . __("Title", "gravityforms") . "): " . $title : "";
- $value .= !empty($caption) ? "\n\n" . $field["label"] . " (" . __("Caption", "gravityforms") . "): " . $caption : "";
- $value .= !empty($description) ? "\n\n" . $field["label"] . " (" . __("Description", "gravityforms") . "): " . $description : "";
- break;
-
- default :
- $value = " ";
- $value .= !empty($title) ? "Title: $title
" : "";
- $value .= !empty($caption) ? "Caption: $caption
" : "";
- $value .= !empty($description) ? "Description: $description
": "";
-
- break;
- }
- }
- return $value;
-
- case "fileupload" :
- $output = $format == "text" ? "" : "";
- if(!empty($value)){
- $output_arr = array();
- $file_paths = rgar($field,"multipleFiles") ? json_decode($value) : array($value);
- foreach($file_paths as $file_path){
- $info = pathinfo($file_path);
- $file_path = esc_attr(str_replace(" ", "%20", $file_path));
- $output_arr[] = $format == "text" ? $file_path . PHP_EOL: "" . $info["basename"] . " ";
- }
- $output = join(PHP_EOL, $output_arr);
- }
- $output .= $format == "text" ? "" : " ";
- return $output;
- break;
-
- case "date" :
- return GFCommon::date_display($value, rgar($field, "dateFormat"));
- break;
-
- case "radio" :
- case "select" :
- return GFCommon::selection_display($value, $field, $currency, $use_text);
- break;
-
- case "multiselect" :
- if(empty($value) || $format == "text")
- return $value;
-
- $value = explode(",", $value);
-
- $items = '';
- foreach($value as $item){
- $items .= "" . GFCommon::selection_display($item, $field, $currency, $use_text) . " ";
- }
-
- return "";
-
- break;
-
- case "calculation" :
- case "singleproduct" :
- if(is_array($value) && !empty($value)){
- $product_name = trim($value[$field["id"] . ".1"]);
- $price = trim($value[$field["id"] . ".2"]);
- $quantity = trim($value[$field["id"] . ".3"]);
-
- $product = $product_name . ", " . __("Qty: ", "gravityforms") . $quantity . ", " . __("Price: ", "gravityforms") . $price;
- return $product;
- }
- else{
- return "";
- }
- break;
-
- case "number" :
- return GFCommon::format_number($value, rgar($field, "numberFormat"));
- break;
-
- case "singleshipping" :
- case "donation" :
- case "total" :
- case "price" :
- return GFCommon::to_money($value, $currency);
-
- case "list" :
- if(empty($value))
- return "";
- $value = unserialize($value);
-
- $has_columns = is_array($value[0]);
-
- if(!$has_columns){
- $items = '';
- foreach($value as $key => $item){
- if(!empty($item)){
- switch($format){
- case "text" :
- $items .= $item . ", ";
- break;
- case "url" :
- $items .= $item . ",";
- break;
- default :
- if($media == "email"){
- $items .= "{$item} ";
- }
- else{
- $items .= "{$item} ";
- }
- break;
- }
- }
- }
-
- if(empty($items)){
- return "";
- }
- else if($format == "text"){
- return substr($items, 0, strlen($items)-2); //removing last comma
- }
- else if($format == "url"){
- return substr($items, 0, strlen($items)-1); //removing last comma
- }
- else if($media == "email"){
- return "";
- }
- else{
- return "";
- }
- }
- else if(is_array($value)){
- $columns = array_keys($value[0]);
-
- $list = "";
-
- switch($format){
- case "text" :
- $is_first_row = true;
- foreach($value as $item){
- if(!$is_first_row)
- $list .= "\n\n" . $field["label"] . ": ";
- $list .= implode(",", array_values($item));
-
- $is_first_row = false;
- }
- break;
-
- case "url" :
- foreach($value as $item){
- $list .= implode("|", array_values($item)) . ",";
- }
- if(!empty($list))
- $list = substr($list, 0, strlen($list)-1);
- break;
-
- default :
- if($media == "email"){
- $list = "";
-
- //reading columns from entry data
- foreach($columns as $column){
- $list .= "" . esc_html($column) . " ";
- }
- $list .= " ";
-
- $list .= "";
- foreach($value as $item){
- $list .= "";
- foreach($columns as $column){
- $val = rgar($item, $column);
- $list .= "{$val} ";
- }
-
- $list .=" ";
- }
-
- $list .="
";
- }
- else{
- $list = "";
-
- //reading columns from entry data
- foreach($columns as $column){
- $list .= "" . esc_html($column) . " ";
- }
- $list .= " ";
-
- $list .= "";
- foreach($value as $item){
- $list .= "";
- foreach($columns as $column){
- $val = rgar($item, $column);
- $list .= "{$val} ";
- }
-
- $list .=" ";
- }
-
- $list .="
";
- }
- break;
- }
-
- return $list;
- }
- return "";
- break;
-
- default :
- if (!is_array($value))
- {
- return nl2br($value);
- }
- break;
- }
- }
-
- public static function get_product_fields($form, $lead, $use_choice_text=false, $use_admin_label=false){
- $products = array();
-
- $product_info = null;
- // retrieve static copy of product info (only for "real" entries)
- if(!rgempty("id", $lead)){
- $product_info = gform_get_meta(rgar($lead,'id'), "gform_product_info_{$use_choice_text}_{$use_admin_label}");
- }
-
- // if no static copy, generate from form/lead info
- if(!$product_info) {
-
- foreach($form["fields"] as $field){
- $id = $field["id"];
- $lead_value = RGFormsModel::get_lead_field_value($lead, $field);
-
- $quantity_field = self::get_product_fields_by_type($form, array("quantity"), $id);
- $quantity = sizeof($quantity_field) > 0 && !RGFormsModel::is_field_hidden($form, $quantity_field[0], array(), $lead) ? RGFormsModel::get_lead_field_value($lead, $quantity_field[0]) : 1;
-
- switch($field["type"]){
-
- case "product" :
-
- //ignore products that have been hidden by conditional logic
- $is_hidden = RGFormsModel::is_field_hidden($form, $field, array(), $lead);
- if($is_hidden)
- continue;
-
- //if single product, get values from the multiple inputs
- if(is_array($lead_value)){
- $product_quantity = sizeof($quantity_field) == 0 && !rgar($field,"disableQuantity") ? rgget($id . ".3", $lead_value) : $quantity;
- if(empty($product_quantity))
- continue;
-
- if(!rgget($id, $products))
- $products[$id] = array();
-
- $products[$id]["name"] = $use_admin_label && !rgempty("adminLabel", $field) ? $field["adminLabel"] : $lead_value[$id . ".1"];
- $products[$id]["price"] = rgar($lead_value, $id . ".2");
- $products[$id]["quantity"] = $product_quantity;
- }
- else if(!empty($lead_value)){
-
- if(empty($quantity))
- continue;
-
- if(!rgar($products,$id))
- $products[$id] = array();
-
- if($field["inputType"] == "price"){
- $name = $field["label"];
- $price = $lead_value;
- }
- else{
- list($name, $price) = explode("|", $lead_value);
- }
-
- $products[$id]["name"] = !$use_choice_text ? $name : RGFormsModel::get_choice_text($field, $name);
- $products[$id]["price"] = $price;
- $products[$id]["quantity"] = $quantity;
- $products[$id]["options"] = array();
- }
-
- if(isset($products[$id])){
- $options = self::get_product_fields_by_type($form, array("option"), $id);
- foreach($options as $option){
- $option_value = RGFormsModel::get_lead_field_value($lead, $option);
- $option_label = empty($option["adminLabel"]) ? $option["label"] : $option["adminLabel"];
- if(is_array($option_value)){
- foreach($option_value as $value){
- $option_info = self::get_option_info($value, $option, $use_choice_text);
- if(!empty($option_info))
- $products[$id]["options"][] = array("field_label" => rgar($option, "label"), "option_name"=> rgar($option_info, "name"), "option_label" => $option_label . ": " . rgar($option_info, "name"), "price" => rgar($option_info,"price"));
- }
- }
- else if(!empty($option_value)){
- $option_info = self::get_option_info($option_value, $option, $use_choice_text);
- $products[$id]["options"][] = array("field_label" => rgar($option, "label"), "option_name"=> rgar($option_info, "name"), "option_label" => $option_label . ": " . rgar($option_info, "name"), "price" => rgar($option_info,"price"));
- }
-
- }
- }
- break;
- }
- }
-
- $shipping_field = self::get_fields_by_type($form, array("shipping"));
- $shipping_price = $shipping_name = "";
- $shipping_field_id = "";
- if(!empty($shipping_field) && !RGFormsModel::is_field_hidden($form, $shipping_field[0], array(), $lead)){
- $shipping_price = RGFormsModel::get_lead_field_value($lead, $shipping_field[0]);
- $shipping_name = $shipping_field[0]["label"];
- $shipping_field_id = $shipping_field[0]["id"];
- if($shipping_field[0]["inputType"] != "singleshipping"){
- list($shipping_method, $shipping_price) = explode("|", $shipping_price);
- $shipping_name = $shipping_field[0]["label"] . " ($shipping_method)";
- }
- }
- $shipping_price = self::to_number($shipping_price);
-
- $product_info = array("products" => $products, "shipping" => array("id"=> $shipping_field_id, "name" => $shipping_name, "price" => $shipping_price));
-
- $product_info = apply_filters("gform_product_info_{$form["id"]}", apply_filters("gform_product_info", $product_info, $form, $lead), $form, $lead);
-
- // save static copy of product info (only for "real" entries)
- if(!rgempty("id", $lead) && !empty($product_info["products"])){
- gform_update_meta($lead['id'], "gform_product_info_{$use_choice_text}_{$use_admin_label}", $product_info);
- }
- }
-
- return $product_info;
- }
-
- public static function get_order_total($form, $lead) {
-
- $products = self::get_product_fields($form, $lead, false);
- return self::get_total($products);
- }
-
- public static function get_total($products) {
-
- $total = 0;
- foreach($products["products"] as $product){
-
- $price = self::to_number($product["price"]);
- if(is_array(rgar($product,"options"))){
- foreach($product["options"] as $option){
- $price += self::to_number($option["price"]);
- }
- }
- $subtotal = floatval($product["quantity"]) * $price;
- $total += $subtotal;
-
- }
-
- $total += floatval($products["shipping"]["price"]);
-
- return $total;
- }
-
- public static function get_option_info($value, $option, $use_choice_text){
- if(empty($value))
- return array();
-
- list($name, $price) = explode("|", $value);
- if($use_choice_text)
- $name = RGFormsModel::get_choice_text($option, $name);
-
- return array("name" => $name, "price" => $price);
- }
-
- public static function gform_do_shortcode($content){
-
- $is_ajax = false;
- $forms = GFFormDisplay::get_embedded_forms($content, $is_ajax);
-
- foreach($forms as $form){
- GFFormDisplay::print_form_scripts($form, $is_ajax);
- }
-
- return do_shortcode($content);
- }
-
- public static function has_akismet(){
- return function_exists('akismet_http_post');
- }
-
- public static function akismet_enabled($form_id) {
-
- if(!self::has_akismet())
- return false;
-
- // if no option is set, leave akismet enabled; otherwise, use option value true/false
- $enabled_by_setting = get_option('rg_gforms_enable_akismet') === false ? true : get_option('rg_gforms_enable_akismet') == true;
- $enabled_by_filter = apply_filters("gform_akismet_enabled_$form_id", apply_filters("gform_akismet_enabled", $enabled_by_setting));
-
- return $enabled_by_filter;
-
- }
-
- public static function is_akismet_spam($form, $lead){
-
- global $akismet_api_host, $akismet_api_port;
-
- $fields = self::get_akismet_fields($form, $lead);
-
- //Submitting info do Akismet
- $response = akismet_http_post($fields, $akismet_api_host, '/1.1/comment-check', $akismet_api_port );
- $is_spam = trim(rgar($response, 1)) == "true";
-
- return $is_spam;
- }
-
- public static function mark_akismet_spam($form, $lead, $is_spam){
-
- global $akismet_api_host, $akismet_api_port;
-
- $fields = self::get_akismet_fields($form, $lead);
- $as = $is_spam ? "spam" : "ham";
-
- //Submitting info do Akismet
- akismet_http_post($fields, $akismet_api_host, '/1.1/submit-'.$as, $akismet_api_port );
- }
-
- private static function get_akismet_fields($form, $lead){
- //Gathering Akismet information
- $akismet_info = array();
- $akismet_info['comment_type'] = 'gravity_form';
- $akismet_info['comment_author'] = self::get_akismet_field("name", $form, $lead);
- $akismet_info['comment_author_email'] = self::get_akismet_field("email", $form, $lead);
- $akismet_info['comment_author_url'] = self::get_akismet_field("website", $form, $lead);
- $akismet_info['comment_content'] = self::get_akismet_field("textarea", $form, $lead);
- $akismet_info['contact_form_subject'] = $form["title"];
- $akismet_info['comment_author_IP'] = $lead["ip"];
- $akismet_info['permalink'] = $lead["source_url"];
- $akismet_info['user_ip'] = preg_replace( '/[^0-9., ]/', '', $lead["ip"] );
- $akismet_info['user_agent'] = $lead["user_agent"];
- $akismet_info['referrer'] = is_admin() ? "" : $_SERVER['HTTP_REFERER'];
- $akismet_info['blog'] = get_option('home');
-
- $akismet_info = apply_filters("gform_akismet_fields_{$form["id"]}", apply_filters("gform_akismet_fields", $akismet_info, $form, $lead), $form, $lead);
-
- return http_build_query($akismet_info);
- }
-
- private static function get_akismet_field($field_type, $form, $lead){
- $fields = GFCommon::get_fields_by_type($form, array($field_type));
- if(empty($fields))
- return "";
-
- $value = RGFormsModel::get_lead_field_value($lead, $fields[0]);
- switch($field_type){
- case "name" :
- $value = GFCommon::get_lead_field_display($fields[0], $value);
- break;
- }
-
- return $value;
- }
-
- public static function get_other_choice_value(){
- $value = apply_filters('gform_other_choice_value', __("Other", "gravityforms"));
- return $value;
- }
-
- public static function get_browser_class() {
- global $is_lynx, $is_gecko, $is_IE, $is_opera, $is_NS4, $is_safari, $is_chrome, $is_iphone, $post;
-
- $classes = array();
-
- //adding browser related class
- if($is_lynx) $classes[] = 'gf_browser_lynx';
- else if($is_gecko) $classes[] = 'gf_browser_gecko';
- else if($is_opera) $classes[] = 'gf_browser_opera';
- else if($is_NS4) $classes[] = 'gf_browser_ns4';
- else if($is_safari) $classes[] = 'gf_browser_safari';
- else if($is_chrome) $classes[] = 'gf_browser_chrome';
- else if($is_IE) $classes[] = 'gf_browser_ie';
- else $classes[] = 'gf_browser_unknown';
-
-
- //adding IE version
- if($is_IE){
- if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6') !== false)
- $classes[] = 'gf_browser_ie6';
- else if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 7') !== false)
- $classes[] = 'gf_browser_ie7';
- if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 8') !== false)
- $classes[] = 'gf_browser_ie8';
- if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 9') !== false)
- $classes[] = 'gf_browser_ie9';
- }
-
- if($is_iphone) $classes[] = 'gf_browser_iphone';
-
- return implode(" " , $classes);
- }
-
- public static function create_post($form, &$lead) {
- $disable_post = apply_filters("gform_disable_post_creation_{$form["id"]}", apply_filters("gform_disable_post_creation", false, $form, $lead), $form, $lead);
- $post_id = 0;
- if(!$disable_post){
- //creates post if the form has any post fields
- $post_id = RGFormsModel::create_post($form, $lead);
- }
-
- return $post_id;
- }
-
- public static function evaluate_conditional_logic($logic, $form, $lead) {
-
- if(!$logic || !is_array(rgar($logic,"rules")))
- return true;
-
- $entry_meta_keys = array_keys(GFFormsModel::get_entry_meta($form["id"]));
- $match_count = 0;
- if(is_array($logic["rules"])){
- foreach($logic["rules"] as $rule) {
-
- if (in_array($rule["fieldId"], $entry_meta_keys)){
- $is_value_match = GFFormsModel::is_value_match(rgar($lead,$rule["fieldId"]), $rule["value"], $rule["operator"]);;
- } else {
- $source_field = GFFormsModel::get_field($form, $rule["fieldId"]);
- $field_value = empty($lead) ? GFFormsModel::get_field_value($source_field, array()) : GFFormsModel::get_lead_field_value($lead, $source_field);
- $is_value_match = GFFormsModel::is_value_match($field_value, $rule["value"], $rule["operator"], $source_field);
- }
-
- if($is_value_match)
- $match_count++;
-
- }
- }
-
- $do_action = ($logic["logicType"] == "all" && $match_count == sizeof($logic["rules"]) ) || ($logic["logicType"] == "any" && $match_count > 0);
- return $do_action;
- }
-
- public static function get_card_types(){
- $cards = array (
-
- array ( 'name' => 'American Express',
- 'slug' => 'amex',
- 'lengths' => '15',
- 'prefixes' => '34,37',
- 'checksum' => true
- ),
- array ( 'name' => 'Discover',
- 'slug' => 'discover',
- 'lengths' => '16',
- 'prefixes' => '6011,622,64,65',
- 'checksum' => true
- ),
- array ( 'name' => 'MasterCard',
- 'slug' => 'mastercard',
- 'lengths' => '16',
- 'prefixes' => '51,52,53,54,55',
- 'checksum' => true
- ),
- array ( 'name' => 'Visa',
- 'slug' => 'visa',
- 'lengths' => '13,16',
- 'prefixes' => '4,417500,4917,4913,4508,4844',
- 'checksum' => true
- ),
- array ( 'name' => 'JCB',
- 'slug' => 'jcb',
- 'lengths' => '16',
- 'prefixes' => '35',
- 'checksum' => true
- ),
- array ( 'name' => 'Maestro',
- 'slug' => 'maestro',
- 'lengths' => '12,13,14,15,16,18,19',
- 'prefixes' => '5018,5020,5038,6304,6759,6761',
- 'checksum' => true
- )
-
- );
-
- $cards = apply_filters("gform_creditcard_types", $cards);
-
- return $cards;
- }
-
- public static function get_card_type($number){
-
- //removing spaces from number
- $number = str_replace (' ', '', $number);
-
- if(empty($number))
- return false;
-
- $cards = self::get_card_types();
-
- $matched_card = false;
- foreach($cards as $card){
- if(self::matches_card_type($number, $card)){
- $matched_card = $card;
- break;
- }
- }
-
- if($matched_card && $matched_card["checksum"] && !self::is_valid_card_checksum($number))
- $matched_card = false;
-
- return $matched_card ? $matched_card : false;
-
- }
-
- private static function matches_card_type($number, $card){
-
- //checking prefix
- $prefixes = explode(',',$card['prefixes']);
- $matches_prefix = false;
- foreach($prefixes as $prefix){
- if(preg_match("|^{$prefix}|", $number)){
- $matches_prefix = true;
- break;
- }
- }
-
- //checking length
- $lengths = explode(',',$card['lengths']);
- $matches_length = false;
- foreach($lengths as $length){
- if(strlen($number) == absint($length)){
- $matches_length = true;
- break;
- }
- }
-
- return $matches_prefix && $matches_length;
-
- }
-
- private static function is_valid_card_checksum($number){
- $checksum = 0;
- $num = 0;
- $multiplier = 1;
-
- // Process each character starting at the right
- for ($i = strlen($number) - 1; $i >= 0; $i--) {
-
- //Multiply current digit by multiplier (1 or 2)
- $num = $number{$i} * $multiplier;
-
- // If the result is in greater than 9, add 1 to the checksum total
- if ($num >= 10) {
- $checksum++;
- $num -= 10;
- }
-
- //Update checksum
- $checksum += $num;
-
- //Update multiplier
- $multiplier = $multiplier == 1 ? 2 : 1;
- }
-
- return $checksum % 10 == 0;
-
- }
-
- public static function is_wp_version($min_version){
- return !version_compare(get_bloginfo("version"), "{$min_version}.dev1", '<');
- }
-
- public static function add_categories_as_choices($field, $value) {
-
- $choices = $inputs = array();
- $is_post = isset($_POST["gform_submit"]);
- $has_placeholder = rgar($field, 'categoryInitialItemEnabled') && RGFormsModel::get_input_type($field) == 'select';
-
- if($has_placeholder)
- $choices[] = array('text' => rgar($field, 'categoryInitialItem'), 'value' => '', 'isSelected' => true);
-
- $display_all = rgar($field, "displayAllCategories");
-
- $args = array('hide_empty' => false, 'orderby' => 'name');
-
- if(!$display_all){
- foreach($field["choices"] as $field_choice_to_include){
- $args["include"][] = $field_choice_to_include["value"];
- }
- }
-
- $args = apply_filters("gform_post_category_args_{$field["id"]}", apply_filters("gform_post_category_args", $args, $field), $field);
- $terms = get_terms('category', $args);
-
- $terms_copy = unserialize(serialize($terms)); // deep copy the terms to avoid repeating GFCategoryWalker on previously cached terms.
- $walker = new GFCategoryWalker();
- $categories = $walker->walk($terms_copy, 0, array(0)); // 3rd parameter prevents notices triggered by $walker::display_element() function which checks $args[0]
-
- foreach($categories as $category) {
- if($display_all) {
- $selected = $value == $category->term_id ||
- (
- empty($value) &&
- get_option('default_category') == $category->term_id &&
- RGFormsModel::get_input_type($field) == 'select' && // only preselect default category on select fields
- !$is_post &&
- !$has_placeholder
- );
- $choices[] = array('text' => $category->name, 'value' => $category->term_id, 'isSelected' => $selected);
- } else {
- foreach($field["choices"] as $field_choice){
- if($field_choice["value"] == $category->term_id){
- $choices[] = array('text' => $category->name, 'value' => $category->term_id);
- break;
- }
- }
- }
- }
-
- if(empty($choices))
- $choices[] = array('text' => 'You must select at least one category.', 'value' => '');
-
- $choice_number = 1;
- foreach($choices as $choice) {
-
- if($choice_number % 10 == 0) //hack to skip numbers ending in 0. so that 5.1 doesn't conflict with 5.10
- $choice_number++;
-
- $input_id = $field["id"] . '.' . $choice_number;
- $inputs[] = array('id' => $input_id, 'label' => $choice['text'], 'name' => '');
- $choice_number++;
- }
-
- $field['choices'] = $choices;
-
- if(RGFormsModel::get_input_type($field) == 'checkbox')
- $field['inputs'] = $inputs;
-
- return $field;
- }
-
- public static function prepare_post_category_value($value, $field, $mode = 'entry_detail') {
-
- if(!is_array($value))
- $value = explode(',', $value);
-
- $cat_names = array();
- $cat_ids = array();
- foreach($value as $cat_string) {
- $ary = explode(":", $cat_string);
- $cat_name = count($ary) > 0 ? $ary[0] : "";
- $cat_id = count($ary) > 1 ? $ary[1] : $ary[0];
-
- if(!empty($cat_name))
- $cat_names[] = $cat_name;
-
- if(!empty($cat_id))
- $cat_ids[] = $cat_id;
- }
-
- sort($cat_names);
-
- switch($mode) {
- case 'entry_list':
- $value = self::implode_non_blank(', ', $cat_names);
- break;
- case 'entry_detail':
- $value = RGFormsModel::get_input_type($field) == 'checkbox' ? $cat_names : self::implode_non_blank(', ', $cat_names);
- break;
- case 'conditional_logic':
- $value = array_values($cat_ids);
- break;
- }
-
- return $value;
- }
-
- public static function calculate($field, $form, $lead) {
-
- $formula = apply_filters('gform_calculation_formula', rgar($field, 'calculationFormula'), $field, $form, $lead);
-
- preg_match_all('/{[^{]*?:(\d+(\.\d+)?)(:(.*?))?}/mi', $formula, $matches, PREG_SET_ORDER);
-
- if(is_array($matches)) {
- foreach($matches as $match) {
-
- list($text, $input_id) = $match;
-
- $value = self::get_calculation_value($match[1], $form, $lead);
- $formula = str_replace($match[0], $value, $formula);
-
- }
- }
- $result = preg_match("/^[0-9 -\/*\(\)]+$/", $formula) ? eval("return {$formula};") : false;
- return $result;
- }
-
- public static function round_number($number, $rounding ){
- if(is_numeric($rounding) && $rounding >= 0){
- $number = round($number, $rounding);
- }
- return $number;
- }
-
- public static function get_calculation_value($field_id, $form, $lead) {
-
- $filters = array('price', 'value', '');
- $value = false;
-
- foreach($filters as $filter) {
- if (is_numeric($value)){
- //value found, exit loop
- break;
- }
- $value = GFCommon::to_number(GFCommon::replace_variables("{:{$field_id}:$filter}", $form, $lead));
- }
-
- if(!$value || !is_numeric($value))
- $value = 0;
-
- return $value;
- }
-
- public static function conditional_shortcode($attributes, $content = null) {
-
- extract(shortcode_atts(array(
- 'merge_tag' => '',
- 'condition' => '',
- 'value' => ''
- ), $attributes));
-
- return RGFormsModel::matches_operation($merge_tag, $value, $condition) ? do_shortcode($content) : '';
-
- }
-
- public static function is_valid_for_calcuation($field) {
-
- $supported_input_types = array('text', 'select', 'number', 'checkbox', 'radio', 'hidden', 'singleproduct', 'price', 'hiddenproduct', 'calculation', 'singleshipping');
- $unsupported_field_types = array('category');
- $input_type = RGFormsModel::get_input_type($field);
-
- return in_array($input_type, $supported_input_types) && !in_array($input_type, $unsupported_field_types);
- }
-
- public static function log_error($message){
- if(class_exists("GFLogging"))
- {
- GFLogging::include_logger();
- GFLogging::log_message("gravityforms", $message, KLogger::ERROR);
- }
- }
-
- public static function log_debug($message){
- if(class_exists("GFLogging"))
- {
- GFLogging::include_logger();
- GFLogging::log_message("gravityforms", $message, KLogger::DEBUG);
- }
- }
-
- public static function echo_if($condition, $text) {
-
- switch($text) {
- case 'checked':
- $text = 'checked="checked"';
- break;
- case 'selected':
- $text = 'selected="selected"';
- }
-
- echo $condition ? $text : '';
- }
-
- public static function gf_global($echo = true) {
-
- require_once(GFCommon::get_base_path() . '/currency.php');
-
- $gf_global = array();
- $gf_global["gf_currency_config"] = RGCurrency::get_currency(GFCommon::get_currency());
- $gf_global["base_url"] = GFCommon::get_base_url();
- $gf_global["number_formats"] = array();
- $gf_global["spinnerUrl"] = GFCommon::get_base_url() . '/images/spinner.gif';
-
- $gf_global_json = 'var gf_global = ' . json_encode($gf_global) . ';';
-
- if(!$echo)
- return $gf_global_json;
-
- echo $gf_global_json;
- }
-
- public static function gf_vars($echo = true) {
- if(!class_exists("RGCurrency"))
- require_once("currency.php");
-
- $gf_vars = array();
- $gf_vars["active"] = __("Active", "gravityforms");
- $gf_vars["inactive"] = __("Inactive", "gravityforms");
- $gf_vars["save"] = __("Save", "gravityforms");
- $gf_vars["update"] = __("Update", "gravityforms");
- $gf_vars["previousLabel" ] = __("Previous", "gravityforms");
- $gf_vars["selectFormat" ] = __("Select a format", "gravityforms");
- $gf_vars["editToViewAll" ] = __("5 of %d items shown. Edit field to view all", "gravityforms");
- $gf_vars["enterValue" ] = __("Enter a value", "gravityforms");
- $gf_vars["formTitle" ] = __("Untitled Form", "gravityforms");
- $gf_vars["formDescription" ] = __("We would love to hear from you! Please fill out this form and we will get in touch with you shortly.", "gravityforms");
- $gf_vars["formConfirmationMessage" ] = __("Thanks for contacting us! We will get in touch with you shortly.", "gravityforms");
- $gf_vars["buttonText" ] = __("Submit", "gravityforms");
- $gf_vars["loading" ] = __("Loading...", "gravityforms");
- $gf_vars["thisFieldIf"] = __('this field if', 'gravityforms');
- $gf_vars["thisPage"] = __("this page", "gravityforms");
- $gf_vars["thisFormButton"] = __('this form button', 'gravityforms');
- $gf_vars["show"] = __('Show', 'gravityforms');
- $gf_vars["hide"] = __('Hide', 'gravityforms');
- $gf_vars["all"] = __('All', 'gravityforms');
- $gf_vars["any"] = __('Any', 'gravityforms');
- $gf_vars["ofTheFollowingMatch"] = __('of the following match:', 'gravityforms');
- $gf_vars["is"] = __('is', 'gravityforms');
- $gf_vars["isNot"] = __('is not', 'gravityforms');
- $gf_vars["greaterThan"] = __('greater than', 'gravityforms');
- $gf_vars["lessThan"] = __('less than', 'gravityforms');
- $gf_vars["contains"] = __('contains', 'gravityforms');
- $gf_vars["startsWith"] = __('starts with', 'gravityforms');
- $gf_vars["endsWith"] = __('ends with', 'gravityforms');
-
- $gf_vars["thisConfirmation"] = __('Use this confirmation if', 'gravityforms');
- $gf_vars["thisNotification"] = __('Send this notification if', 'gravityforms');
- $gf_vars["confirmationSave"] = __('Save', 'gravityforms');
- $gf_vars["confirmationSaving"] = __('Saving...', 'gravityforms');
- $gf_vars["confirmationAreYouSure"] = __('Are you sure you wish to cancel these changes?', 'gravityforms');
- $gf_vars["confirmationIssueSaving"] = __('There was an issue saving this confirmation.', 'gravityforms');
- $gf_vars["confirmationConfirmDelete"] = __('Are you sure you wish to delete this confirmation?', 'gravityforms');
- $gf_vars["confirmationIssueDeleting"] = __('There was an issue deleting this confirmation.', 'gravityforms');
- $gf_vars["confirmationConfirmDiscard"] = __('There are unsaved changes to the current confirmation. Would you like to discard these changes?', 'gravityforms');
- $gf_vars["confirmationDefaultName"] = __('Untitled Confirmation', 'gravityforms');
- $gf_vars["confirmationDefaultMessage"] = __('Thanks for contacting us! We will get in touch with you shortly.', 'gravityforms');
- $gf_vars["confirmationInvalidPageSelection"] = __('Please select a page.', "gravityforms");
- $gf_vars["confirmationInvalidRedirect"] = __('Please enter a URL.', "gravityforms");
- $gf_vars["confirmationInvalidName"] = __('Please enter a confirmation name.', "gravityforms");
-
- $gf_vars["conditionalLogicDependency"] = __('This form contains conditional logic dependent upon this field. Are you sure you want to delete this field? \'OK\' to delete, \'Cancel\' to abort.', 'gravityforms');
- $gf_vars["conditionalLogicDependencyChoice"] = __('This form contains conditional logic dependent upon this choice. Are you sure you want to delete this choice? \'OK\' to delete, \'Cancel\' to abort.', 'gravityforms');
- $gf_vars["conditionalLogicDependencyChoiceEdit"] = __('This form contains conditional logic dependent upon this choice. Are you sure you want to modify this choice? \'OK\' to delete, \'Cancel\' to abort.', 'gravityforms');
-
- $gf_vars["mergeTagsTooltip"] = __('Merge Tags Merge tags allow you to dynamically populate submitted field values in your form content wherever this merge tag icon is present.', 'gravityforms');
-
- $gf_vars["baseUrl"] = GFCommon::get_base_url();
- $gf_vars["gf_currency_config"] = RGCurrency::get_currency(GFCommon::get_currency());
- $gf_vars["otherChoiceValue"] = GFCommon::get_other_choice_value();
- $gf_vars["isFormTrash"] = false;
- $gf_vars["currentlyAddingField"] = false;
-
- $gf_vars["addFieldFilter"] = __("Add a condition", "gravityforms");
- $gf_vars["removeFieldFilter"] = __("Remove a condition", "gravityforms");
- $gf_vars["filterAndAny"] = __("Include results if {0} match:", "gravityforms");
-
- if(is_admin() && rgget('id')) {
- $form = RGFormsModel::get_form_meta(rgget('id'));
- $gf_vars["mergeTags"] = GFCommon::get_merge_tags($form['fields'], '', false);
- }
-
- $gf_vars_json = 'var gf_vars = ' . json_encode($gf_vars) . ';';
-
- if(!$echo){
- return $gf_vars_json;
- }
- else {
- echo $gf_vars_json;
- }
- }
-
- public static function is_bp_active() {
- return defined('BP_VERSION') ? true : false;
- }
-
- public static function add_message($message, $is_error = false) {
- if($is_error) {
- self::$errors[] = $message;
- } else {
- self::$messages[] = $message;
- }
- }
-
- public static function add_error_message($message) {
- self::add_message($message, true);
- }
-
- public static function display_admin_message($errors = false, $messages = false) {
-
- if(!$errors)
- $errors = self::$errors;
-
- if(!$messages)
- $messages = self::$messages;
-
- $errors = apply_filters('gform_admin_error_messages', $errors);
- $messages = apply_filters('gform_admin_messages', $messages);
-
- if(!empty($errors)) { ?>
-
-
-
- ' . self::gf_vars(false) . '';
- }
- }
-
- public static function maybe_add_leading_zero($value){
- $first_char = GFCommon::safe_substr($value, 0, 1, 'utf-8');
- if(in_array($first_char, array(".", ",")))
- $value = "0" . $value;
- return $value;
- }
-
- // used by the gfFieldFilterUI() jQuery plugin
- public static function get_field_filter_settings($form) {
-
- $all_fields = $form["fields"];
-
- // set up filters
- $fields = $all_fields;
- $exclude_types = array("rank", "page", "html");
-
- $operators_by_field_type = array(
- "default" => array("is", "isnot", ">", "<"),
- "checkbox" => array("is"),
- "multiselect" => array("contains"),
- "number" => array("is", "isnot", ">", "<"),
- "likert" => array("is", "isnot"),
- "list" => array("contains")
- );
-
- 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(
- array(
- "key"=> "0",
- "text" => __("Any form field", "gravityforms"),
- "operators" => array("contains", "is")
- )
- );
-
- foreach ($fields as $field) {
-
- $field_type = GFFormsModel::get_input_type($field);
-
- $operators = isset($operators_by_field_type[$field_type]) ? $operators_by_field_type[$field_type] : $operators_by_field_type["default"];
- if (!isset($field["choices"]) && !in_array("contains", $operators))
- $operators[] = "contains";
-
- $field_filter = array();
- $key = $field["id"];
- if ($field_type == "likert" && rgar($field, "gsurveyLikertEnableMultipleRows")) {
- // multi-row likert fields
- $field_filter["key"] = $key;
- $field_filter["group"] = true;
- $field_filter["text"] = GFFormsModel::get_label($field);
- $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;
- } elseif ($field_type == "name" && rgar($field, "nameFormat") == "" || $field_type == "address") {
- // standard two input name field
- $field_filter["key"] = $key;
- $field_filter["group"] = true;
- $field_filter["text"] = GFFormsModel::get_label($field);
- $sub_filters = array();
- $inputs = rgar($field, "inputs");
- foreach ($inputs as $input) {
- $sub_filter = array();
- $sub_filter["key"] = rgar($input, "id");
- $sub_filter["text"] = rgar($input, "label");
- $sub_filter["preventMultiple"] = false;
- $sub_filter["operators"] = $operators;
- $sub_filters[] = $sub_filter;
- }
- $field_filter["filters"] = $sub_filters;
- } else {
- $field_filter["key"] = $key;
- $field_filter["preventMultiple"] = false;
- $field_filter["text"] = GFFormsModel::get_label($field);
-
- $field_filter["operators"] = $operators;
-
- if (isset($field["choices"]))
- $field_filter["values"] = $field["choices"];
-
-
- }
- $field_filters[] = $field_filter;
-
- }
- $form_id = $form["id"];
- $entry_meta_filters = self::get_entry_meta_filter_settings($form_id);
- $field_filters = array_merge($field_filters, $entry_meta_filters);
- $field_filters = array_values($field_filters); // reset the numeric keys in case some filters have been unset
- $info_filters = self::get_entry_info_filter_settings();
- $field_filters = array_merge($field_filters, $info_filters);
- $field_filters = array_values($field_filters);
- return $field_filters;
- }
-
- public static function get_entry_info_filter_settings() {
- $settings = array();
- $info_columns = self::get_entry_info_filter_columns();
- foreach($info_columns as $key => $info_column){
- $info_column["key"] = $key;
- $info_column["preventMultiple"] = false;
- $settings[] = $info_column;
- }
-
- return $settings;
- }
-
- public static function get_entry_info_filter_columns($get_users = true){
- $account_choices = array();
- if($get_users){
- $args = apply_filters("gform_filters_get_users", array("number" => 200));
- $accounts = get_users();
- $account_choices = array();
- foreach ($accounts as $account) {
- $account_choices[] = array("text" => $account->user_login, "value" => $account->ID);
- }
- }
- return array(
- "entry_id" => array(
- "text" => __("Entry ID", "gravityforms"),
- "operators" => array( "is", "isnot", ">", "<")
- ),
- "date_created" => array(
- "text" => __("Entry Date", "gravityforms"),
- "operators" => array( "is", ">", "<"),
- "placeholder" => __("yyyy-mm-dd", "gravityforms")
- ),
- "is_starred" => array(
- "text" => __("Starred", "gravityforms"),
- "operators" => array( "is", "isnot"),
- "values" => array(
- array(
- "text" => "Yes",
- "value" => "1"
- ),
- array(
- "text" => "No",
- "value" => "0"
- )
- )
- ),
- "ip" => array(
- "text" => __("IP Address", "gravityforms"),
- "operators" => array( "is", "isnot", ">", "<", "contains")
- ),
- "source_url" => array(
- "text" => __("Source URL", "gravityforms"),
- "operators" => array( "is", "isnot", ">", "<", "contains")
- ),
- "payment_status" => array(
- "text" => __("Payment Status", "gravityforms"),
- "operators" => array( "is", "isnot"),
- "values" => array(
- array(
- "text" => "Approved",
- "value" => "Approved"
- ),
- array(
- "text" => "Failed",
- "value" => "Failed"
- ),
- array(
- "text" => "Active",
- "value" => "Active"
- ),
- array(
- "text" => "Cancelled",
- "value" => "Cancelled"
- )
- )
- ),
- "payment_date" => array(
- "text" => __("Payment Date", "gravityforms"),
- "operators" => array( "is", "isnot", ">", "<")
- ),
- "payment_amount" => array(
- "text" => __("Payment Amount", "gravityforms"),
- "operators" => array( "is", "isnot", ">", "<", "contains")
- ),
- "transaction_id" => array(
- "text" => __("Transaction ID", "gravityforms"),
- "operators" => array( "is", "isnot", ">", "<", "contains")
- ),
- "created_by" => array(
- "text" => __("User", "gravityforms"),
- "operators" => array( "is", "isnot"),
- "values" => $account_choices
- )
- );
- }
-
- public static function get_entry_meta_filter_settings($form_id) {
- $filters = 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["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 static function get_field_filters_from_post(){
- $field_filters = array();
- $filter_fields = rgpost("f");
- if (is_array($filter_fields)) {
- $filter_operators = rgpost("o");
- $filter_values = rgpost("v");
- for ($i = 0; $i < count($filter_fields); $i++) {
- $field_filter = array();
- $key = $filter_fields[$i];
- if("entry_id" == $key){
- $key = "id";
- }
- $operator = $filter_operators[$i];
- $val = $filter_values[$i];
- $strpos_row_key = strpos($key, "|");
- if ($strpos_row_key !== false) { //multi-row likert
- $key_array = explode("|", $key);
- $key = $key_array[0];
- $val = $key_array[1] . ":" . $val;
- }
- $field_filter["key"] = $key;
- $field_filter["operator"] = $operator;
- $field_filter["value"] = $val;
- $field_filters[] = $field_filter;
- }
- }
- $field_filters["mode"] = rgpost("mode");
- return $field_filters;
- }
-
- public static function has_multifile_fileupload_field($form){
- $fileupload_fields = GFCommon::get_fields_by_type($form, array("fileupload", "post_custom_field"));
- if(is_array($fileupload_fields)){
- foreach($fileupload_fields as $field){
- if(rgar($field, "multipleFiles"))
- return true;
- }
- }
- return false;
- }
-
- public static function localize_gform_gravityforms_multifile(){
- wp_localize_script( 'gform_gravityforms', 'gform_gravityforms', array(
- 'strings' => array(
- 'invalid_file_extension' => __("This type of file is not allowed. Must be one of the following: ", "gravityforms" ),
- 'delete_file' => __("Delete this file", "gravityforms"),
- 'in_progress' => __("in progress", "gravityforms"),
- 'file_exceeds_limit' => __("File exceeds size limit", "gravityforms"),
- 'illegal_extension' => __("This type of file is not allowed." , "gravityforms"),
- "max_reached" => __("Maximum number of files reached", "gravityforms"),
- "unknown_error" => __("There was an problem while saving the file on the server", "gravityforms"),
- "currently_uploading" => __("Please wait for the uploading to complete", "gravityforms"),
- "cancel" => __("Cancel", "gravityforms"),
- "cancel_upload" => __("Cancel this upload", "gravityforms"),
- "cancelled" => __("Cancelled", "gravityforms")
- ),
- 'vars' => array(
- 'images_url' => GFCommon::get_base_url() . "/images"
- )
- ) );
- }
-
- public static function safe_strlen($string){
-
- if(function_exists("mb_strlen"))
- return mb_strlen($string);
- else
- return strlen($string);
-
- }
-
- public static function safe_substr($string, $start, $length = null){
- if(function_exists("mb_substr"))
- return mb_substr($string, $start, $length);
- else
- return substr($string, $start, $length);
- }
-
- /**
- * Reliablty compare floats.
- * @param [float] $float1
- * @param [float] $float2
- * @param [string] $operator Supports: '<', '<=', '>', '>=', '==', '=', '!='
- * @return [bool]
- */
- public static function compare_floats( $float1, $float2, $operator ) {
-
- $epsilon = 0.00001;
- $is_equal = abs( floatval( $float1 ) - floatval( $float2 ) ) < $epsilon;
- $is_greater = floatval( $float1 ) > floatval( $float2 );
- $is_less = floatval( $float1 ) < floatval( $float2 );
-
- switch( $operator ) {
- case '<':
- return $is_less;
- case '<=':
- return $is_less || $is_equal;
- case '>' :
- return $is_greater;
- case '>=':
- return $is_greater || $is_equal;
- case '==':
- case '=':
- return $is_equal;
- case '!=':
- return ! $is_equal;
- }
-
- }
-
-}
-
-class GFCategoryWalker extends Walker {
- /**
- * @see Walker::$tree_type
- * @since 2.1.0
- * @var string
- */
- var $tree_type = 'category';
-
- /**
- * @see Walker::$db_fields
- * @since 2.1.0
- * @todo Decouple this
- * @var array
- */
- var $db_fields = array ('parent' => 'parent', 'id' => 'term_id');
-
- /**
- * @see Walker::start_el()
- * @since 2.1.0
- *
- * @param string $output Passed by reference. Used to append additional content.
- * @param object $category Category data object.
- * @param int $depth Depth of category. Used for padding.
- * @param array $args Uses 'selected' and 'show_count' keys, if they exist.
- */
- function start_el( &$output, $object, $depth = 0, $args = array(), $current_object_id = 0) {
- //$pad = str_repeat(' ', $depth * 3);
- $pad = str_repeat('─', $depth);
- if(!empty($pad))
- $pad .= " ";
- $object->name = "{$pad}{$object->name}";
- $output[] = $object;
- }
-}
-
-/**
- *
- * Notes:
- * 1. The WordPress Transients API does not support boolean
- * values so boolean values should be converted to integers
- * or arrays before setting the values as persistent.
- *
- * 2. The transients API only deletes the transient from the database
- * when the transient is accessed after it has expired. WordPress doesn't
- * do any garbage collection of transients.
- *
- */
-class GFCache {
- private static $_transient_prefix = "GFCache_";
- private static $_cache = array();
-
- public static function get($key, &$found = null) {
- global $blog_id;
- if (is_multisite())
- $key = $blog_id . ':' . $key;
-
- if (isset(self::$_cache[$key])) {
- $found = true;
- $data = rgar(self::$_cache[$key], "data");
-
- return $data;
- }
-
- $data = self::get_transient($key);
-
- if (false === ($data)) {
- $found = false;
-
- return false;
- } else {
- self::$_cache[$key] = array("data" => $data, "is_persistent" => true);
- $found = true;
-
- return $data;
- }
-
- }
-
- public static function set($key, $data, $is_persistent = false, $expiration = 0) {
- global $blog_id;
- $success = true;
-
- if (is_multisite())
- $key = $blog_id . ':' . $key;
-
- if ($is_persistent)
- $success = self::set_transient($key, $data, $expiration);
-
- self::$_cache[$key] = array("data" => $data, "is_persistent" => $is_persistent);
-
- return $success;
- }
-
- public static function delete($key) {
- global $blog_id;
- $success = true;
-
- if (is_multisite())
- $key = $blog_id . ':' . $key;
-
- if (isset(self::$_cache[$key])) {
- if (self::$_cache[$key]["is_persistent"])
- $success = self::delete_transient($key);
-
- unset(self::$_cache[$key]);
- } else {
- $success = self::delete_transient($key);
-
- }
-
- return $success;
- }
-
- public static function flush($flush_persistent = false) {
- global $wpdb;
-
- self::$_cache = array();
-
- if(false === $flush_persistent)
- return true;
-
- if (is_multisite()) {
- $sql = "
- DELETE FROM $wpdb->sitemeta
- WHERE meta_key LIKE '_site_transient_timeout_GFCache_%' OR
- meta_key LIKE '_site_transient_GFCache_%'
- ";
- } else {
- $sql = "
- DELETE FROM $wpdb->options
- WHERE option_name LIKE '_transient_timeout_GFCache_%' OR
- option_name LIKE '_transient_GFCache_%'
- ";
-
- }
- $rows_deleted = $wpdb->query($sql);
-
- $success = $rows_deleted !== false ? true : false;
-
- return $success;
- }
-
- private static function delete_transient($key) {
- $key = self::$_transient_prefix . wp_hash($key);
- if (is_multisite())
- $success = delete_site_transient($key);
- else
- $success = delete_transient($key);
-
- return $success;
- }
-
- private static function set_transient($key, $data, $expiration) {
- $key = self::$_transient_prefix . wp_hash($key);
- if (is_multisite())
- $success = set_site_transient($key, $data, $expiration);
- else
- $success = set_transient($key, $data, $expiration);
-
- return $success;
- }
-
- private static function get_transient($key) {
- $key = self::$_transient_prefix . wp_hash($key);
- if (is_multisite())
- $data = get_site_transient($key);
- else
- $data = get_transient($key);
-
- return $data;
- }
-
+" . $field_label . "";
+ }
+ }
+ return $str;
+ }
+
+ public static function is_numeric($value, $number_format=""){
+
+ if($number_format == "currency"){
+
+ $number_format = self::is_currency_decimal_dot() ? "decimal_dot" : "decimal_comma";
+ }
+
+ switch($number_format){
+ case "decimal_dot" :
+ return preg_match("/^(-?[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]+)?)$/", $value);
+ break;
+
+ case "decimal_comma" :
+ return preg_match("/^(-?[0-9]{1,3}(?:\.?[0-9]{3})*(?:,[0-9]+)?)$/", $value);
+ break;
+
+ default :
+ return preg_match("/^(-?[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]{2})?)$/", $value) || preg_match("/^(-?[0-9]{1,3}(?:\.?[0-9]{3})*(?:,[0-9]{2})?)$/", $value);
+
+ }
+ }
+
+ public static function is_currency_decimal_dot($currency = null){
+
+ if($currency == null){
+ $code = GFCommon::get_currency();
+ if(empty($code))
+ $code = "USD";
+
+ $currency = RGCurrency::get_currency($code);
+ }
+
+ return rgar($currency, "decimal_separator") == ".";
+ }
+
+ public static function trim_all($text){
+ $text = trim($text);
+ do{
+ $prev_text = $text;
+ $text = str_replace(" ", " ", $text);
+ }
+ while($text != $prev_text);
+
+ return $text;
+ }
+
+ public static function format_number($number, $number_format){
+ if(!is_numeric($number))
+ return $number;
+
+ //replacing commas with dots and dots with commas
+ if($number_format == "currency"){
+ if(false === class_exists('RGCurrency')){
+ require_once( GFCommon::get_base_path() . '/currency.php' );
+ }
+ $currency = new RGCurrency( GFCommon::get_currency() );
+ $number = $currency->to_money( $number );
+ } elseif ($number_format == "decimal_comma"){
+ $number = str_replace(",", "|", $number);
+ $number = str_replace(".", ",", $number);
+ $number = str_replace("|", ".", $number);
+ }
+
+ return $number;
+ }
+
+ public static function recursive_add_index_file($dir) {
+ if(!is_dir($dir))
+ return;
+
+ if(!($dp = opendir($dir)))
+ return;
+
+ //ignores all errors
+ set_error_handler(create_function("", "return 0;"), E_ALL);
+
+ //creates an empty index.html file
+ if($f = fopen($dir . "/index.html", 'w'))
+ fclose($f);
+
+ //restores error handler
+ restore_error_handler();
+
+ while((false !== $file = readdir($dp))){
+ if(is_dir("$dir/$file") && $file != '.' && $file !='..')
+ self::recursive_add_index_file("$dir/$file");
+ }
+
+ closedir($dp);
+ }
+
+ public static function clean_number($number, $number_format=""){
+ if(rgblank($number))
+ return $number;
+
+ $decimal_char = "";
+ if($number_format == "decimal_dot")
+ $decimal_char = ".";
+ else if($number_format == "decimal_comma")
+ $decimal_char = ",";
+
+ $float_number = "";
+ $clean_number = "";
+ $is_negative = false;
+
+ //Removing all non-numeric characters
+ $array = str_split($number);
+ foreach($array as $char){
+ if (($char >= '0' && $char <= '9') || $char=="," || $char==".")
+ $clean_number .= $char;
+ else if($char == '-')
+ $is_negative = true;
+ }
+
+ //Removing thousand separators but keeping decimal point
+ $array = str_split($clean_number);
+ for($i=0, $count = sizeof($array); $i<$count; $i++)
+ {
+ $char = $array[$i];
+ if ($char >= '0' && $char <= '9')
+ $float_number .= $char;
+ else if(empty($decimal_char) && ($char == "." || $char == ",") && strlen($clean_number) - $i <= 3)
+ $float_number .= ".";
+ else if($decimal_char == $char)
+ $float_number .= ".";
+ }
+
+ if($is_negative)
+ $float_number = "-" . $float_number;
+
+ return $float_number;
+
+ }
+
+ public static function json_encode($value){
+ return json_encode($value);
+ }
+
+ public static function json_decode($str, $is_assoc=true){
+ return json_decode($str, $is_assoc);
+ }
+
+ //Returns the url of the plugin's root folder
+ public static function get_base_url(){
+ return plugins_url( '', __FILE__ );
+ }
+
+ //Returns the physical path of the plugin's root folder
+ public static function get_base_path(){
+ return dirname( __FILE__ );
+ }
+
+ public static function get_email_fields($form){
+ $fields = array();
+ foreach($form["fields"] as $field){
+ if(RGForms::get("type", $field) == "email" || RGForms::get("inputType", $field) == "email")
+ $fields[] = $field;
+ }
+
+ return $fields;
+ }
+
+ public static function truncate_middle($text, $max_length){
+ if(strlen($text) <= $max_length)
+ return $text;
+
+ $middle = intval($max_length / 2);
+ return self::safe_substr($text, 0, $middle) . "..." . self::safe_substr($text, strlen($text) - $middle, $middle);
+ }
+
+ public static function is_invalid_or_empty_email($email){
+ return empty($email) || !self::is_valid_email($email);
+ }
+
+ public static function is_valid_url($url){
+ return preg_match('!^(http|https)://([\w-]+\.?)+[\w-]+(:\d+)?(/[\w- ./?~%&=+\']*)?$!', $url);
+ }
+
+ public static function is_valid_email($email){
+ return preg_match('/^(([a-zA-Z0-9_.\-+!#$&\'*+=?^`{|}~])+\@((([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+|localhost) *,? *)+$/', $email);
+ }
+
+ public static function get_label($field, $input_id = 0, $input_only = false){
+ return RGFormsModel::get_label($field, $input_id, $input_only);
+ }
+
+ public static function get_input($field, $id){
+ return RGFormsModel::get_input($field, $id);
+ }
+
+ public static function insert_variables($fields, $element_id, $hide_all_fields=false, $callback="", $onchange="", $max_label_size=40, $exclude = null, $args="", $class_name=""){
+
+ if($fields == null)
+ $fields = array();
+
+ if($exclude == null)
+ $exclude = array();
+
+ $exclude = apply_filters("gform_merge_tag_list_exclude", $exclude, $element_id, $fields);
+ $merge_tags = self::get_merge_tags($fields, $element_id, $hide_all_fields, $exclude, $args);
+
+ $onchange = empty($onchange) ? "InsertVariable('{$element_id}', '{$callback}');" : $onchange;
+ $class = trim($class_name . " gform_merge_tags");
+
+ ?>
+
+
+
+
+ $group_tags) {
+
+ $group_label = rgar($group_tags, 'label');
+ $tags = rgar($group_tags, 'tags');
+
+ if(empty($group_tags['tags']))
+ continue;
+
+ if($group_label) { ?>
+
+
+
+
+
+
+
+
+
+
+
+ '{all_fields}', 'label' => __('All Submitted Fields', 'gravityforms'));
+
+ // group fields by required, optional, and pricing
+ foreach($fields as $field) {
+
+ if(rgget("displayOnly", $field))
+ continue;
+
+ $input_type = RGFormsModel::get_input_type($field);
+
+ // skip field types that should be excluded
+ if(is_array($exclude_field_types) && in_array($input_type, $exclude_field_types))
+ continue;
+
+ if(rgar($field, 'isRequired')) {
+
+ switch($input_type) {
+
+ case "name" :
+
+ if(rgar($field,"nameFormat") == "extended") {
+
+ $prefix = GFCommon::get_input($field, $field["id"] + 0.2);
+ $suffix = GFCommon::get_input($field, $field["id"] + 0.8);
+ $optional_field = $field;
+ $optional_field["inputs"] = array($prefix, $suffix);
+
+ //Add optional name fields to the optional list
+ $optional_fields[] = $optional_field;
+
+ //Remove optional name field from required list
+ unset($field["inputs"][0]);
+ unset($field["inputs"][3]);
+
+ }
+
+ $required_fields[] = $field;
+
+ break;
+
+ default:
+ $required_fields[] = $field;
+ }
+ }
+ else {
+ $optional_fields[] = $field;
+ }
+
+ if(self::is_pricing_field($field["type"])){
+ $pricing_fields[] = $field;
+ }
+
+ }
+
+ if(!empty($required_fields)){
+ foreach($required_fields as $field){
+ $required_group = array_merge($required_group, self::get_field_merge_tags($field, $option));
+ }
+ }
+
+ if(!empty($optional_fields)){
+ foreach($optional_fields as $field){
+ $optional_group = array_merge($optional_group, self::get_field_merge_tags($field, $option));
+ }
+ }
+
+ if(!empty($pricing_fields)){
+
+ if(!$hide_all_fields)
+ $pricing_group[] = array('tag' => '{pricing_fields}', 'label' => __("All Pricing Fields", "gravityforms"));
+
+ foreach($pricing_fields as $field){
+ $pricing_group = array_merge($pricing_group, self::get_field_merge_tags($field, $option));
+ }
+
+ }
+
+ $other_group[] = array('tag' => '{ip}', 'label' => __("Client IP Address", "gravityforms"));
+ $other_group[] = array('tag' => '{date_mdy}', 'label' => __("Date", "gravityforms") . ' (mm/dd/yyyy)');
+ $other_group[] = array('tag' => '{date_dmy}', 'label' => __("Date", "gravityforms") . ' (dd/mm/yyyy)');
+ $other_group[] = array('tag' => '{embed_post:ID}', 'label' => __("Embed Post/Page Id", "gravityforms"));
+ $other_group[] = array('tag' => '{embed_post:post_title}', 'label' => __("Embed Post/Page Title", "gravityforms"));
+ $other_group[] = array('tag' => '{embed_url}', 'label' => __("Embed URL", "gravityforms"));
+ $other_group[] = array('tag' => '{entry_id}', 'label' => __("Entry Id", "gravityforms"));
+ $other_group[] = array('tag' => '{entry_url}', 'label' => __("Entry URL", "gravityforms"));
+ $other_group[] = array('tag' => '{form_id}', 'label' => __("Form Id", "gravityforms"));
+ $other_group[] = array('tag' => '{form_title}', 'label' => __("Form Title", "gravityforms"));
+ $other_group[] = array('tag' => '{user_agent}', 'label' => __("HTTP User Agent", "gravityforms"));
+ $other_group[] = array('tag' => '{referer}', 'label' => __("HTTP Referer URL", "gravityforms"));
+
+ if(self::has_post_field($fields)) {
+ $other_group[] = array('tag' => '{post_id}', 'label' => __("Post Id", "gravityforms"));
+ $other_group[] = array('tag' => '{post_edit_url}', 'label' => __("Post Edit URL", "gravityforms"));
+ }
+
+ $other_group[] = array('tag' => '{user:display_name}', 'label' => __("User Display Name", "gravityforms"));
+ $other_group[] = array('tag' => '{user:user_email}', 'label' => __("User Email", "gravityforms"));
+ $other_group[] = array('tag' => '{user:user_login}', 'label' => __("User Login", "gravityforms"));
+
+ $custom_group = apply_filters('gform_custom_merge_tags', array(), rgars($fields, '0/formId'), $fields, $element_id);
+
+ $merge_tags = array(
+ 'ungrouped' => array(
+ 'label' => false,
+ 'tags' => $ungrouped
+ ),
+ 'required' => array(
+ 'label' => __("Required form fields", "gravityforms"),
+ 'tags' => $required_group
+ ),
+ 'optional' => array(
+ 'label' => __("Optional form fields", "gravityforms"),
+ 'tags' => $optional_group
+ ),
+ 'pricing' => array(
+ 'label' => __("Pricing form fields", "gravityforms"),
+ 'tags' => $pricing_group
+ ),
+ 'other' => array(
+ 'label' => __("Other", "gravityforms"),
+ 'tags' => $other_group
+ ),
+ 'custom' => array(
+ 'label' => __("Custom", "gravityforms"),
+ 'tags' => $custom_group
+ )
+ );
+
+ return $merge_tags;
+ }
+
+ public static function get_field_merge_tags($field, $option="") {
+
+ $merge_tags = array();
+ $tag_args = RGFormsModel::get_input_type($field) == "list" ? ":{$option}" : ""; //args currently only supported by list field
+
+ if(isset($field["inputs"]) && is_array($field["inputs"])) {
+
+ if(RGFormsModel::get_input_type($field) == "checkbox") {
+ $value = "{" . esc_html(GFCommon::get_label($field, $field["id"])) . ":" . $field["id"] . "{$tag_args}}";
+ $merge_tags[] = array( 'tag' => $value, 'label' => esc_html(GFCommon::get_label($field, $field["id"])) );
+ }
+
+ foreach($field["inputs"] as $input) {
+ $value = "{" . esc_html(GFCommon::get_label($field, $input["id"])) . ":" . $input["id"] . "{$tag_args}}";
+ $merge_tags[] = array( 'tag' => $value, 'label' => esc_html(GFCommon::get_label($field, $input["id"])) );
+ }
+
+ }
+ else {
+ $value = "{" . esc_html(GFCommon::get_label($field)) . ":" . $field["id"] . "{$tag_args}}";
+ $merge_tags[] = array( 'tag' => $value, 'label' => esc_html(GFCommon::get_label($field)) );
+ }
+
+ return $merge_tags;
+ }
+
+ public static function insert_field_variable($field, $max_label_size=40, $args=""){
+
+ $tag_args = RGFormsModel::get_input_type($field) == "list" ? ":{$args}" : ""; //args currently only supported by list field
+
+ if(is_array($field["inputs"]))
+ {
+ if(RGFormsModel::get_input_type($field) == "checkbox"){
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ">
+
+
+
+
+
+
+
+
+
+ ">
+
+
+
+ '>
+
+
+
+
+
+
+
+
+
+ post_title;
+ case "caption" :
+ $media = get_post($media_id);
+ return $media->post_excerpt;
+ case "description" :
+ $media = get_post($media_id);
+ return $media->post_content;
+
+ default :
+
+ $img = wp_get_attachment_image($media_id, $arg1, false, array("class" => "size-{$arg1} align{$arg2} wp-image-{$media_id}"));
+ return $img;
+ }
+ }
+
+ public static function replace_variables_post_image($text, $post_images, $lead){
+
+ preg_match_all('/{[^{]*?:(\d+)(:([^:]*?))?(:([^:]*?))?(:url)?}/mi', $text, $matches, PREG_SET_ORDER);
+ if(is_array($matches))
+ {
+ foreach($matches as $match){
+ $input_id = $match[1];
+
+ //ignore fields that are not post images
+ if(!isset($post_images[$input_id]))
+ continue;
+
+ //Reading alignment and "url" parameters.
+ //Format could be {image:5:medium:left:url} or {image:5:medium:url}
+ $size_meta = empty($match[3]) ? "full" : $match[3];
+ $align = empty($match[5]) ? "none" : $match[5];
+ if($align == "url"){
+ $align = "none";
+ $is_url = true;
+ }
+ else{
+ $is_url = rgar($match,6) == ":url";
+ }
+
+ $media_id = $post_images[$input_id];
+ $value = is_wp_error($media_id) ? "" : self::get_post_image_variable($media_id, $size_meta, $align, $is_url);
+
+ $text = str_replace($match[0], $value , $text);
+ }
+ }
+
+ return $text;
+ }
+
+ public static function implode_non_blank($separator, $array){
+
+ if(!is_array($array))
+ return "";
+
+ $ary = array();
+ foreach($array as $item){
+ if(!rgblank($item))
+ $ary[] = $item;
+ }
+ return implode($separator, $ary);
+ }
+
+ private static function format_variable_value($value, $url_encode, $esc_html, $format){
+ if($esc_html)
+ $value = esc_html($value);
+
+ if($format == "html")
+ $value = nl2br($value);
+
+ if($url_encode)
+ $value = urlencode($value);
+
+ return $value;
+ }
+
+ public static function replace_variables($text, $form, $lead, $url_encode = false, $esc_html=true, $nl2br = true, $format="html"){
+ $text = $nl2br ? nl2br($text) : $text;
+
+ //Replacing field variables: {FIELD_LABEL:FIELD_ID} {My Field:2}
+ preg_match_all('/{[^{]*?:(\d+(\.\d+)?)(:(.*?))?}/mi', $text, $matches, PREG_SET_ORDER);
+ if(is_array($matches))
+ {
+ foreach($matches as $match){
+ $input_id = $match[1];
+
+ $field = RGFormsModel::get_field($form,$input_id);
+
+ $value = RGFormsModel::get_lead_field_value($lead, $field);
+ $raw_value = $value;
+
+ if(is_array($value))
+ $value = rgar($value, $input_id);
+
+ $value = self::format_variable_value($value, $url_encode, $esc_html, $format);
+
+ switch(RGFormsModel::get_input_type($field)){
+
+ case "number" :
+
+ $value = GFCommon::format_number($value, rgar($field, "numberFormat"));
+
+ break;
+
+ case "fileupload" :
+ if(rgar($field, "multipleFiles")){
+ $files = empty($value) ? array() : json_decode($value, true);
+ foreach($files as &$file){
+ $file = str_replace(" ", "%20", $file);
+ }
+ $value = join("\r\n", $files);
+ if($format == "html"){
+ $value = nl2br($value);
+ }
+ } else {
+ $value = str_replace(" ", "%20", $value);
+ }
+
+ break;
+
+ case "post_image" :
+ list( $url, $title, $caption, $description ) = array_pad( explode( '|:|', $value ), 4, false );
+ $value = str_replace( ' ', '%20', $url );
+ break;
+
+ case "checkbox" :
+ case "select" :
+ case "radio" :
+
+ $use_value = rgar($match,4) == "value";
+ $use_price = in_array(rgar($match,4), array("price", "currency"));
+ $format_currency = rgar($match,4) == "currency";
+
+ if(is_array($raw_value) && (string)intval($input_id) != $input_id){
+ $items = array($input_id => $value); //float input Ids. (i.e. 4.1 ). Used when targeting specific checkbox items
+ }
+ else if(is_array($raw_value)){
+ $items = $raw_value;
+ }
+ else{
+ $items = array($input_id => $raw_value);
+ }
+
+ $ary = array();
+
+ foreach($items as $input_id => $item){
+ if($use_value){
+ list($val, $price) = rgexplode("|", $item, 2);
+ }
+ else if($use_price){
+ list($name, $val) = rgexplode("|", $item, 2);
+ if($format_currency)
+ $val = GFCommon::to_money($val, rgar($lead, "currency"));
+ }
+ else if($field["type"] == "post_category"){
+ $use_id = strtolower(rgar($match,4)) == "id";
+ $item_value = self::format_post_category($item, $use_id);
+
+ $val = RGFormsModel::is_field_hidden($form, $field, array(), $lead) ? "" : $item_value;
+ }
+ else{
+ $val = RGFormsModel::is_field_hidden($form, $field, array(), $lead) ? "" : RGFormsModel::get_choice_text($field, $raw_value, $input_id);
+ }
+
+ $ary[] = self::format_variable_value($val, $url_encode, $esc_html, $format);
+ }
+
+ $value = self::implode_non_blank(", ", $ary);
+
+ break;
+
+ case "multiselect" :
+ if($field["type"] == "post_category"){
+ $use_id = strtolower(rgar($match,4)) == "id";
+ $items = explode(",", $value);
+
+ if(is_array($items)){
+ $cats = array();
+ foreach($items as $item){
+ $cat = self::format_post_category($item, $use_id);
+ $cats[] = self::format_variable_value($cat, $url_encode, $esc_html, $format);
+ }
+ $value = self::implode_non_blank(", ", $cats);
+ }
+ }
+
+ break;
+
+ case "date" :
+ $value = self::date_display($value, rgar($field,"dateFormat"));
+ break;
+
+ case "total" :
+ $format_numeric = rgar($match,4) == "price";
+
+ $value = $format_numeric ? GFCommon::to_number($value) : GFCommon::to_money($value);
+
+ $value = self::format_variable_value($value, $url_encode, $esc_html, $format);
+ break;
+
+ case "post_category" :
+ $use_id = strtolower(rgar($match,4)) == "id";
+ $value = self::format_post_category($value, $use_id);
+ $value = self::format_variable_value($value, $url_encode, $esc_html, $format);
+ break;
+
+ case "list" :
+ $output_format = in_array(rgar($match,4), array("text", "html", "url")) ? rgar($match,4) : $format;
+ $value = self::get_lead_field_display($field, $raw_value, $lead["currency"], true, $output_format);
+ break;
+ }
+
+ if(rgar($match,4) == "label"){
+ $value = empty($value) ? "" : rgar($field, "label");
+ }
+ else if(rgar($match,4) == "qty" && $field["type"] == "product"){
+ //getting quantity associated with product field
+ $products = self::get_product_fields($form, $lead, false, false);
+ $value = 0;
+ foreach($products["products"] as $product_id => $product)
+ {
+ if($product_id == $field["id"])
+ $value = $product["quantity"];
+ }
+ }
+
+ //Encoding left curly bracket so that merge tags entered in the front end are displayed as is and not "executed"
+ $value = self::encode_merge_tag($value);
+
+ //filter can change merge code variable
+ $value = apply_filters("gform_merge_tag_filter", $value, $input_id, rgar($match,4), $field, $raw_value);
+ if($value === false)
+ $value = "";
+
+ $text = str_replace($match[0], $value , $text);
+ }
+ }
+
+ //replacing global variables
+ //form title
+ $text = str_replace("{form_title}", $url_encode ? urlencode($form["title"]) : $form["title"], $text);
+
+ $matches = array();
+ preg_match_all("/{all_fields(:(.*?))?}/", $text, $matches, PREG_SET_ORDER);
+ foreach($matches as $match){
+ $options = explode(",", rgar($match,2));
+ $use_value = in_array("value", $options);
+ $display_empty = in_array("empty", $options);
+ $use_admin_label = in_array("admin", $options);
+
+ //all submitted fields using text
+ if (strpos($text, $match[0]) !== false){
+ $text = str_replace($match[0], self::get_submitted_fields($form, $lead, $display_empty, !$use_value, $format, $use_admin_label, "all_fields", rgar($match,2)), $text);
+ }
+ }
+
+ //all submitted fields including empty fields
+ if (strpos($text, "{all_fields_display_empty}") !== false){
+ $text = str_replace("{all_fields_display_empty}", self::get_submitted_fields($form, $lead, true, true, $format, false, "all_fields_display_empty"), $text);
+ }
+
+ //pricing fields
+ if (strpos($text, "{pricing_fields}") !== false){
+ $text = str_replace("{pricing_fields}", '
+
+ ' .
+ self::get_submitted_pricing_fields($form, $lead, $format) .
+ '
+
+
',
+ $text);
+ }
+
+ //form id
+ $text = str_replace("{form_id}", $url_encode ? urlencode($form["id"]) : $form["id"], $text);
+
+ //entry id
+ $text = str_replace("{entry_id}", $url_encode ? urlencode(rgar($lead, "id")) : rgar($lead, "id"), $text);
+
+ //entry url
+ $entry_url = get_bloginfo("wpurl") . "/wp-admin/admin.php?page=gf_entries&view=entry&id=" . $form["id"] . "&lid=" . rgar($lead,"id");
+ $text = str_replace("{entry_url}", $url_encode ? urlencode($entry_url) : $entry_url, $text);
+
+ //post id
+ $text = str_replace("{post_id}", $url_encode ? urlencode($lead["post_id"]) : $lead["post_id"], $text);
+
+ //admin email
+ $wp_email = get_bloginfo("admin_email");
+ $text = str_replace("{admin_email}", $url_encode ? urlencode($wp_email) : $wp_email, $text);
+
+ //post edit url
+ $post_url = get_bloginfo("wpurl") . "/wp-admin/post.php?action=edit&post=" . $lead["post_id"];
+ $text = str_replace("{post_edit_url}", $url_encode ? urlencode($post_url) : $post_url, $text);
+
+ $text = self::replace_variables_prepopulate($text, $url_encode);
+
+ // hook allows for custom merge tags
+ $text = apply_filters('gform_replace_merge_tags', $text, $form, $lead, $url_encode, $esc_html, $nl2br, $format);
+
+ // TODO: Deprecate the 'gform_replace_merge_tags' and replace it with a call to the 'gform_merge_tag_filter'
+ //$text = apply_filters('gform_merge_tag_filter', $text, false, false, false );
+
+ $text = self::decode_merge_tag($text);
+ return $text;
+ }
+
+ public static function encode_merge_tag($text){
+ return str_replace("{", "{", $text);
+ }
+
+ public static function decode_merge_tag($text){
+ return str_replace("{", "{", $text);
+ }
+
+ public static function format_post_category($value, $use_id){
+
+ list($item_value, $item_id) = rgexplode(":", $value, 2);
+
+ if($use_id && !empty($item_id))
+ $item_value = $item_id;
+
+ return $item_value;
+ }
+
+ public static function get_embed_post(){
+ global $embed_post, $post, $wp_query;
+
+ if($embed_post){
+ return $embed_post;
+ }
+
+ if(!rgempty("gform_embed_post")){
+ $post_id = absint(rgpost("gform_embed_post"));
+ $embed_post = get_post($post_id);
+ }
+ else if($wp_query->is_in_loop){
+ $embed_post = $post;
+ }
+ else{
+ $embed_post = array();
+ }
+ }
+
+ public static function replace_variables_prepopulate($text, $url_encode=false){
+
+ //embed url
+ $text = str_replace("{embed_url}", $url_encode ? urlencode(RGFormsModel::get_current_page_url()) : RGFormsModel::get_current_page_url(), $text);
+
+ $local_timestamp = self::get_local_timestamp(time());
+
+ //date (mm/dd/yyyy)
+ $local_date_mdy = date_i18n("m/d/Y", $local_timestamp, true);
+ $text = str_replace("{date_mdy}", $url_encode ? urlencode($local_date_mdy) : $local_date_mdy, $text);
+
+ //date (dd/mm/yyyy)
+ $local_date_dmy = date_i18n("d/m/Y", $local_timestamp, true);
+ $text = str_replace("{date_dmy}", $url_encode ? urlencode($local_date_dmy) : $local_date_dmy, $text);
+
+ // ip
+ $ip = GFFormsModel::get_ip();
+ $text = str_replace( '{ip}', $url_encode ? urlencode( $ip ) : $ip, $text );
+
+ global $post;
+ $post_array = self::object_to_array($post);
+ preg_match_all("/\{embed_post:(.*?)\}/", $text, $matches, PREG_SET_ORDER);
+ foreach($matches as $match){
+ $full_tag = $match[0];
+ $property = $match[1];
+ $text = str_replace($full_tag, $url_encode ? urlencode($post_array[$property]) : $post_array[$property], $text);
+ }
+
+ //embed post custom fields
+ preg_match_all("/\{custom_field:(.*?)\}/", $text, $matches, PREG_SET_ORDER);
+ foreach($matches as $match){
+
+ $full_tag = $match[0];
+ $custom_field_name = $match[1];
+ $custom_field_value = !empty($post_array["ID"]) ? get_post_meta($post_array["ID"], $custom_field_name, true) : "";
+ $text = str_replace($full_tag, $url_encode ? urlencode($custom_field_value) : $custom_field_value, $text);
+ }
+
+ //user agent
+ $text = str_replace("{user_agent}", $url_encode ? urlencode(RGForms::get("HTTP_USER_AGENT", $_SERVER)) : RGForms::get("HTTP_USER_AGENT", $_SERVER), $text);
+
+ //referrer
+ $text = str_replace("{referer}", $url_encode ? urlencode(RGForms::get("HTTP_REFERER", $_SERVER)) : RGForms::get("HTTP_REFERER", $_SERVER), $text);
+
+ //logged in user info
+ global $userdata, $wp_version, $current_user;
+ $user_array = self::object_to_array($userdata);
+
+ preg_match_all("/\{user:(.*?)\}/", $text, $matches, PREG_SET_ORDER);
+ foreach($matches as $match){
+ $full_tag = $match[0];
+ $property = $match[1];
+
+ $value = version_compare($wp_version, '3.3', '>=') ? $current_user->get($property) : $user_array[$property];
+ $value = $url_encode ? urlencode($value) : $value;
+
+ $text = str_replace($full_tag, $value, $text);
+ }
+
+ return $text;
+ }
+
+ public static function object_to_array($object){
+ $array=array();
+ if(!empty($object)){
+ foreach($object as $member=>$data)
+ $array[$member]=$data;
+ }
+ return $array;
+ }
+
+ public static function is_empty_array($val){
+ if(!is_array($val))
+ $val = array($val);
+
+ $ary = array_values($val);
+ foreach($ary as $item){
+ if(!rgblank($item))
+ return false;
+ }
+ return true;
+ }
+
+ public static function get_submitted_fields($form, $lead, $display_empty=false, $use_text=false, $format="html", $use_admin_label=false, $merge_tag="", $options=""){
+
+ $field_data = "";
+ if($format == "html"){
+ $field_data = '
+
+ ';
+ }
+
+ $options_array = explode(",", $options);
+ $no_admin = in_array("noadmin", $options_array);
+ $no_hidden = in_array("nohidden", $options_array);
+ $has_product_fields = false;
+ foreach($form["fields"] as $field){
+ $field_value = "";
+
+ $field_label = $use_admin_label && !rgempty("adminLabel", $field) ? rgar($field, "adminLabel") : esc_html(GFCommon::get_label($field));
+
+ switch($field["type"]){
+ case "captcha" :
+ break;
+
+ case "section" :
+ if((!GFCommon::is_section_empty($field, $form, $lead) || $display_empty) && !rgar($field, "adminOnly")){
+
+ switch($format){
+ case "text" :
+ $field_value = "--------------------------------\n{$field_label}\n\n";
+ break;
+
+ default:
+ $field_value = sprintf('
+ %s
+
+ ', $field_label);
+ break;
+ }
+ }
+
+ $field_value = apply_filters("gform_merge_tag_filter", $field_value, $merge_tag, $options, $field, $field_label);
+
+ $field_data .= $field_value;
+
+ break;
+ case "password" :
+ //ignore password fields
+ break;
+
+ default :
+
+ //ignore product fields as they will be grouped together at the end of the grid
+ if(self::is_product_field($field["type"])){
+ $has_product_fields = true;
+ continue;
+ }
+ else if(RGFormsModel::is_field_hidden($form, $field, array(), $lead)){
+ //ignore fields hidden by conditional logic
+ continue;
+ }
+
+ $raw_field_value = RGFormsModel::get_lead_field_value($lead, $field);
+ $field_value = GFCommon::get_lead_field_display($field, $raw_field_value, rgar($lead,"currency"), $use_text, $format, "email");
+
+ $display_field = true;
+ //depending on parameters, don't display adminOnly or hidden fields
+ if($no_admin && rgar($field, "adminOnly"))
+ $display_field = false;
+ else if($no_hidden && RGFormsModel::get_input_type($field) == "hidden")
+ $display_field = false;
+
+ //if field is not supposed to be displayed, pass false to filter. otherwise, pass field's value
+ if(!$display_field)
+ $field_value = false;
+
+ $field_value = apply_filters("gform_merge_tag_filter", $field_value, $merge_tag, $options, $field, $raw_field_value);
+
+ if($field_value === false)
+ continue;
+
+ if( !empty($field_value) || strlen($field_value) > 0 || $display_empty){
+ switch($format){
+ case "text" :
+ $field_data .= "{$field_label}: {$field_value}\n\n";
+ break;
+
+ default:
+
+ $field_data .= sprintf('
+
+ %1$s
+
+
+
+
+
+ %2$s
+
+
+ ', $field_label, empty($field_value) && strlen($field_value) == 0 ? " " : $field_value, apply_filters("gform_email_background_color_label", '#EAF2FA', $field, $lead), apply_filters("gform_email_background_color_data", '#FFFFFF', $field, $lead) );
+ break;
+ }
+ }
+ }
+ }
+
+ if($has_product_fields)
+ $field_data .= self::get_submitted_pricing_fields($form, $lead, $format, $use_text, $use_admin_label);
+
+ if($format == "html"){
+ $field_data .='
+
+
+
';
+ }
+
+ return $field_data;
+ }
+
+ public static function get_submitted_pricing_fields($form, $lead, $format, $use_text=true, $use_admin_label=false){
+ $form_id = $form["id"];
+ $order_label = apply_filters("gform_order_label_{$form["id"]}", apply_filters("gform_order_label", __("Order", "gravityforms"), $form["id"]), $form["id"]);
+ $products = GFCommon::get_product_fields($form, $lead, $use_text, $use_admin_label);
+ $total = 0;
+ $field_data = "";
+
+ switch($format){
+ case "text" :
+ if(!empty($products["products"])){
+ $field_data = "--------------------------------\n" . $order_label . "\n\n";
+ foreach($products["products"] as $product){
+ $product_name = $product["quantity"] . " " . $product["name"];
+ $price = self::to_number($product["price"]);
+ if(!empty($product["options"])){
+ $product_name .= " (";
+ $options = array();
+ foreach($product["options"] as $option){
+ $price += self::to_number($option["price"]);
+ $options[] = $option["option_name"];
+ }
+ $product_name .= implode(", ", $options) . ")";
+ }
+ $subtotal = floatval($product["quantity"]) * $price;
+ $total += $subtotal;
+
+ $field_data .= "{$product_name}: " . self::to_money($subtotal, $lead["currency"]) . "\n\n";
+ }
+ $total += floatval($products["shipping"]["price"]);
+
+ if(!empty($products["shipping"]["name"]))
+ $field_data .= $products["shipping"]["name"] . ": " . self::to_money($products["shipping"]["price"], $lead["currency"]) . "\n\n";
+
+ $field_data .= __("Total", "gravityforms") . ": " . self::to_money($total, $lead["currency"]) . "\n\n";
+ }
+ break;
+
+
+ default :
+ if(!empty($products["products"])){
+ $field_data ='
+
+ ' . $order_label . '
+
+
+
+
+
+
+
+ ' . apply_filters("gform_product_{$form_id}", apply_filters("gform_product", __("Product", "gravityforms"), $form_id), $form_id) . '
+ ' . apply_filters("gform_product_qty_{$form_id}", apply_filters("gform_product_qty", __("Qty", "gravityforms"), $form_id), $form_id) . '
+ ' . apply_filters("gform_product_unitprice_{$form_id}", apply_filters("gform_product_unitprice", __("Unit Price", "gravityforms"), $form_id), $form_id) . '
+ ' . apply_filters("gform_product_price_{$form_id}", apply_filters("gform_product_price", __("Price", "gravityforms"), $form_id), $form_id) . '
+
+ ';
+
+
+ foreach($products["products"] as $product){
+
+ $field_data .= '
+
+ ' . $product["name"] .'
+ ';
+
+ $price = self::to_number($product["price"]);
+ if(is_array(rgar($product,"options"))){
+ foreach($product["options"] as $option){
+ $price += self::to_number($option["price"]);
+ $field_data .= '' . $option["option_label"] .' ';
+ }
+ }
+ $subtotal = floatval($product["quantity"]) * $price;
+ $total += $subtotal;
+
+ $field_data .='
+
+ ' . $product["quantity"] .'
+ ' . self::to_money($price, $lead["currency"]) .'
+ ' . self::to_money($subtotal, $lead["currency"]) .'
+ ';
+ }
+ $total += floatval($products["shipping"]["price"]);
+ $field_data .= '
+ ';
+
+ if(!empty($products["shipping"]["name"])){
+ $field_data .= '
+
+
+ ' . $products["shipping"]["name"] . '
+ '. self::to_money($products["shipping"]["price"], $lead["currency"]) . '
+
+ ';
+ }
+
+ $field_data .= '
+ ';
+
+ if(empty($products["shipping"]["name"])){
+ $field_data .= '
+ ';
+ }
+
+ $field_data .= '
+ ' . __("Total:", "gravityforms") . '
+ '. self::to_money($total, $lead["currency"]) . '
+
+
+
+
+ ';
+ }
+ break;
+ }
+
+ return $field_data;
+ }
+
+ public static function send_user_notification($form, $lead, $override_options = false){
+ _deprecated_function("send_user_notification", "1.7", "send_notification");
+
+ $notification = self::prepare_user_notification($form, $lead, $override_options);
+ self::send_email($notification["from"], $notification["to"], $notification["bcc"], $notification["reply_to"], $notification["subject"], $notification["message"], $notification["from_name"], $notification["message_format"], $notification["attachments"]);
+ }
+
+ public static function send_admin_notification($form, $lead, $override_options = false){
+ _deprecated_function("send_admin_notification", "1.7", "send_notification");
+
+ $notification = self::prepare_admin_notification($form, $lead, $override_options);
+ self::send_email($notification["from"], $notification["to"], $notification["bcc"], $notification["replyTo"], $notification["subject"], $notification["message"], $notification["from_name"], $notification["message_format"], $notification["attachments"]);
+ }
+
+ private static function prepare_user_notification($form, $lead, $override_options = false){
+ $form_id = $form["id"];
+
+ if(!isset($form["autoResponder"]))
+ return;
+
+ //handling autoresponder email
+ $to_field = isset($form["autoResponder"]["toField"]) ? rgget($form["autoResponder"]["toField"], $lead) : "";
+ $to = apply_filters("gform_autoresponder_email_{$form_id}", apply_filters("gform_autoresponder_email", $to_field, $form), $form);
+ $subject = GFCommon::replace_variables(rgget("subject", $form["autoResponder"]), $form, $lead, false, false);
+
+ $message_format = apply_filters("gform_notification_format_{$form["id"]}", apply_filters("gform_notification_format", "html", "user", $form, $lead), "user", $form, $lead);
+ $message = GFCommon::replace_variables(rgget("message", $form["autoResponder"]), $form, $lead, false, false, !rgget("disableAutoformat", $form["autoResponder"]), $message_format);
+ $message = do_shortcode($message);
+
+ //Running trough variable replacement
+ $to = GFCommon::replace_variables($to, $form, $lead, false, false);
+ $from = GFCommon::replace_variables(rgget("from", $form["autoResponder"]), $form, $lead, false, false);
+ $bcc = GFCommon::replace_variables(rgget("bcc", $form["autoResponder"]), $form, $lead, false, false);
+ $reply_to = GFCommon::replace_variables(rgget("replyTo", $form["autoResponder"]), $form, $lead, false, false);
+ $from_name = GFCommon::replace_variables(rgget("fromName", $form["autoResponder"]), $form, $lead, false, false);
+
+ // override default values if override options provided
+ if($override_options && is_array($override_options)){
+ foreach($override_options as $override_key => $override_value){
+ ${$override_key} = $override_value;
+ }
+ }
+
+ $attachments = apply_filters("gform_user_notification_attachments_{$form_id}", apply_filters("gform_user_notification_attachments", array(), $lead, $form), $lead, $form);
+
+ //Disabling autoformat to prevent double autoformatting of messages
+ $disableAutoformat = "1";
+
+ return compact("to", "from", "bcc", "reply_to", "subject", "message", "from_name", "message_format", "attachments", "disableAutoformat");
+ }
+
+ private static function prepare_admin_notification($form, $lead, $override_options = false){
+ $form_id = $form["id"];
+
+ //handling admin notification email
+ $subject = GFCommon::replace_variables(rgget("subject", $form["notification"]), $form, $lead, false, false);
+
+ $message_format = apply_filters("gform_notification_format_{$form["id"]}", apply_filters("gform_notification_format", "html", "admin", $form, $lead), "admin", $form, $lead);
+ $message = GFCommon::replace_variables(rgget("message", $form["notification"]), $form, $lead, false, false, !rgget("disableAutoformat", $form["notification"]), $message_format);
+ $message = do_shortcode($message);
+
+ $version_info = self::get_version_info();
+ $is_expired = !rgempty("expiration_time", $version_info) && $version_info["expiration_time"] < time();
+ if( !rgar($version_info, "is_valid_key") && $is_expired){
+ $message .= " Your Gravity Forms License Key has expired. In order to continue receiving support and software updates you must renew your license key. You can do so by following the renewal instructions on the Gravity Forms Settings page in your WordPress Dashboard or by clicking here .";
+ }
+
+ $from = rgempty("fromField", $form["notification"]) ? rgget("from", $form["notification"]) : rgget($form["notification"]["fromField"], $lead);
+
+ if(rgempty("fromNameField", $form["notification"])){
+ $from_name = rgget("fromName", $form["notification"]);
+ }
+ else{
+ $field = RGFormsModel::get_field($form, rgget("fromNameField", $form["notification"]));
+ $value = RGFormsModel::get_lead_field_value($lead, $field);
+ $from_name = GFCommon::get_lead_field_display($field, $value);
+ }
+
+ $replyTo = rgempty("replyToField", $form["notification"]) ? rgget("replyTo", $form["notification"]): rgget($form["notification"]["replyToField"], $lead);
+
+ if(rgempty("routing", $form["notification"])){
+ $email_to = rgempty("toField", $form["notification"]) ? rgget("to", $form["notification"]) : rgget("toField", $form["notification"]);
+ }
+ else{
+ $email_to = array();
+ foreach($form["notification"]["routing"] as $routing){
+
+ $source_field = RGFormsModel::get_field($form, $routing["fieldId"]);
+ $field_value = RGFormsModel::get_lead_field_value($lead, $source_field);
+ $is_value_match = RGFormsModel::is_value_match($field_value, $routing["value"], $routing["operator"], $source_field) && !RGFormsModel::is_field_hidden($form, $source_field, array(), $lead);
+
+ if ($is_value_match)
+ $email_to[] = $routing["email"];
+ }
+
+ $email_to = join(",", $email_to);
+ }
+
+ //Running through variable replacement
+ $email_to = GFCommon::replace_variables($email_to, $form, $lead, false, false);
+ $from = GFCommon::replace_variables($from, $form, $lead, false, false);
+ $bcc = GFCommon::replace_variables(rgget("bcc", $form["notification"]), $form, $lead, false, false);
+ $reply_to = GFCommon::replace_variables($replyTo, $form, $lead, false, false);
+ $from_name = GFCommon::replace_variables($from_name, $form, $lead, false, false);
+
+ //Filters the admin notification email to address. Allows users to change email address before notification is sent
+ $to = apply_filters("gform_notification_email_{$form_id}" , apply_filters("gform_notification_email", $email_to, $lead), $lead);
+
+ // override default values if override options provided
+ if($override_options && is_array($override_options)){
+ foreach($override_options as $override_key => $override_value){
+ ${$override_key} = $override_value;
+ }
+ }
+
+ $attachments = apply_filters("gform_admin_notification_attachments_{$form_id}", apply_filters("gform_admin_notification_attachments", array(), $lead, $form), $lead, $form);
+
+ //Disabling autoformat to prevent double autoformatting of messages
+ $disableAutoformat = "1";
+
+ return compact("to", "from", "bcc", "replyTo", "subject", "message", "from_name", "message_format", "attachments", "disableAutoformat");
+
+ }
+
+ public static function send_notification($notification, $form, $lead){
+
+ $notification = apply_filters("gform_notification_{$form["id"]}", apply_filters("gform_notification", $notification, $form, $lead), $form, $lead);
+
+ $to_field = "";
+ if(rgar($notification, "toType") == "field"){
+ $to_field = rgar($notification, "toField");
+ if(rgempty("toField", $notification)){
+ $to_field = rgar($notification, "to");
+ }
+ }
+
+ $email_to = rgar($notification, "to");
+ //do routing logic if "to" field doesn't have a value (to support legacy notifications what will run routing prior to this method
+ if(empty($email_to) && rgar($notification, "toType") == "routing"){
+ $email_to = array();
+ foreach($notification["routing"] as $routing){
+
+ $source_field = RGFormsModel::get_field($form, $routing["fieldId"]);
+ $field_value = RGFormsModel::get_lead_field_value($lead, $source_field);
+ $is_value_match = RGFormsModel::is_value_match($field_value, $routing["value"], $routing["operator"], $source_field) && !RGFormsModel::is_field_hidden($form, $source_field, array(), $lead);
+
+ if ($is_value_match)
+ $email_to[] = $routing["email"];
+ }
+
+ $email_to = join(",", $email_to);
+ }
+ else if (!empty($to_field)) {
+ $source_field = RGFormsModel::get_field($form, $to_field);
+ $email_to = RGFormsModel::get_lead_field_value($lead, $source_field);
+ }
+
+ //Running through variable replacement
+ $to = GFCommon::replace_variables($email_to, $form, $lead, false, false);
+ $subject = GFCommon::replace_variables(rgar($notification, "subject"), $form, $lead, false, false);
+ $from = GFCommon::replace_variables(rgar($notification, "from"), $form, $lead, false, false);
+ $from_name = GFCommon::replace_variables(rgar($notification, "fromName"), $form, $lead, false, false);
+ $bcc = GFCommon::replace_variables(rgar($notification, "bcc"), $form, $lead, false, false);
+ $replyTo = GFCommon::replace_variables(rgar($notification, "replyTo"), $form, $lead, false, false);
+
+ $message_format = rgempty("message_format", $notification) ? "html" : rgar($notification, "message_format");
+ $message = GFCommon::replace_variables(rgar($notification, "message"), $form, $lead, false, false, !rgar($notification, "disableAutoformat"), $message_format);
+ $message = do_shortcode($message);
+
+ // allow attachments to be passed as a single path (string) or an array of paths, if string provided, add to array
+ $attachments = rgar( $notification, "attachments" );
+ if( !empty( $attachments ) ) {
+ $attachments = is_array( $attachments ) ? $attachments : array( $attachments );
+ } else {
+ $attachments = array();
+ }
+
+ self::send_email($from, $to, $bcc, $replyTo, $subject, $message, $from_name, $message_format, $attachments);
+
+ return compact("to", "from", "bcc", "replyTo", "subject", "message", "from_name", "message_format", "attachments");
+
+ }
+
+ public static function send_notifications($notification_ids, $form, $lead, $do_conditional_logic = true, $event = "form_submission"){
+ if(!is_array($notification_ids)){
+ GFCommon::log_debug("No notifications to be sent.");
+ return;
+ }
+
+ GFCommon::log_debug( 'Processing notifications: ' . print_r( $notification_ids, true ) . "\n(only active/applicable notifications are sent)" );
+
+ foreach($notification_ids as $notification_id){
+ if(!isset($form["notifications"][$notification_id])){
+ continue;
+ }
+ if(isset($form["notifications"][$notification_id]["isActive"]) && ! $form["notifications"][$notification_id]["isActive"]){
+ continue;
+ }
+
+ $notification = $form["notifications"][$notification_id];
+
+ //check conditional logic when appropriate
+ if($do_conditional_logic && !GFCommon::evaluate_conditional_logic( rgar($notification,"conditionalLogic"), $form, $lead) ){
+ continue;
+ }
+
+ if(rgar($notification,"type") == "user"){
+
+ //Getting user notification from legacy structure (for backwards compatibility)
+ $legacy_notification = GFCommon::prepare_user_notification($form, $lead);
+ $notification = self::merge_legacy_notification($notification, $legacy_notification);
+ }
+ else if(rgar($notification,"type") == "admin"){
+
+ //Getting admin notification from legacy structure (for backwards compatibility)
+ $legacy_notification = GFCommon::prepare_admin_notification($form, $lead);
+ $notification = self::merge_legacy_notification($notification, $legacy_notification);
+ }
+
+
+ //sending notification
+ self::send_notification($notification, $form, $lead);
+ }
+
+ }
+
+ public static function send_form_submission_notifications($form, $lead){
+ $notifications = self::get_notifications_to_send("form_submission", $form, $lead);
+ $notifications_to_send = array();
+
+
+
+ //running through filters that disable form submission notifications
+ foreach($notifications as $notification){
+
+ if(rgar($notification,"type") == "user" && apply_filters("gform_disable_user_notification_{$form["id"]}", apply_filters("gform_disable_user_notification", false, $form, $lead), $form, $lead)){
+ //skip user notification if it has been disabled by a hook
+ continue;
+ }
+ else if(rgar($notification,"type") == "admin" && apply_filters("gform_disable_admin_notification_{$form["id"]}", apply_filters("gform_disable_admin_notification", false, $form, $lead), $form, $lead)){
+ //skip admin notification if it has been disabled by a hook
+ continue;
+ }
+
+ if(apply_filters("gform_disable_notification_{$form["id"]}", apply_filters("gform_disable_notification", false, $notification, $form, $lead), $notification, $form, $lead)){
+ //skip notifications if it has been disabled by a hook
+ continue;
+ }
+
+ $notifications_to_send[] = $notification["id"];
+ }
+
+
+ self::send_notifications($notifications_to_send, $form, $lead, true, "form_submission");
+ }
+
+ private static function merge_legacy_notification($notification, $notification_data){
+
+ $keys = array("to", "from", "bcc", "replyTo", "subject", "message", "from_name", "message_format", "attachments", "disableAutoformat");
+ foreach($keys as $key)
+ $notification[$key] = rgar($notification_data,$key);
+
+ return $notification;
+ }
+
+ public static function get_notifications_to_send($action, $form, $lead){
+ $notifications = self::get_notifications($action, $form);
+ $notifications_to_send = array();
+ foreach($notifications as $notification){
+ if(GFCommon::evaluate_conditional_logic(rgar($notification,"conditionalLogic"), $form, $lead)){
+ $notifications_to_send[] = $notification;
+ }
+ }
+
+ return $notifications_to_send;
+ }
+
+ public static function get_notifications($action, $form){
+ if(rgempty("notifications", $form))
+ return array();
+
+ $notifications = array();
+ foreach($form["notifications"] as $notification){
+ if(rgar($notification, "event") == $action)
+ $notifications[] = $notification;
+ }
+
+ return $notifications;
+ }
+
+ public static function has_admin_notification($form){
+
+ return (!empty($form["notification"]["to"]) || !empty($form["notification"]["routing"])) && (!empty($form["notification"]["subject"]) || !empty($form["notification"]["message"]));
+
+ }
+
+ public static function has_user_notification($form){
+
+ return !empty($form["autoResponder"]["toField"]) && (!empty($form["autoResponder"]["subject"]) || !empty($form["autoResponder"]["message"]));
+
+ }
+
+ private static function send_email($from, $to, $bcc, $reply_to, $subject, $message, $from_name="", $message_format="html", $attachments=""){
+
+ $to = str_replace(" ", "", $to);
+ $bcc = str_replace(" ", "", $bcc);
+
+ //invalid to email address or no content. can't send email
+ if(!GFCommon::is_valid_email($to) || (empty($subject) && empty($message))){
+ GFCommon::log_debug("Cannot send email because either the TO address is invalid or there is no SUBJECT or MESSAGE.");
+ GFCommon::log_debug(print_r(compact("to", "subject", "message"), true));
+ return;
+ }
+
+ if(!GFCommon::is_valid_email($from))
+ $from = get_bloginfo("admin_email");
+
+ //invalid from address. can't send email
+ if(!GFCommon::is_valid_email($from)){
+ GFCommon::log_debug("Cannot send email because the FROM address is invalid.");
+ GFCommon::log_debug(print_r(compact("to", "from", "subject"), true));
+ return;
+ }
+
+ $content_type = $message_format == "html" ? "text/html" : "text/plain";
+
+ $name = empty($from_name) ? $from : $from_name;
+
+ $headers = array();
+ $headers["From"] = "From: \"{$name}\" <{$from}>";
+
+ if(GFCommon::is_valid_email($reply_to))
+ $headers["Reply-To"] = "Reply-To: {$reply_to}";
+
+ if(GFCommon::is_valid_email($bcc))
+ $headers["Bcc"] = "Bcc: $bcc";
+
+ $headers["Content-type"] = "Content-type: {$content_type}; charset=" . get_option('blog_charset');
+
+ $abort_email = false;
+ extract(apply_filters("gform_pre_send_email", compact("to", "subject", "message", "headers", "attachments", "abort_email"), $message_format));
+
+ $is_success = false;
+ if(!$abort_email){
+ GFCommon::log_debug("Sending email via wp_mail()");
+ GFCommon::log_debug(print_r(compact("to", "subject", "message", "headers", "attachments", "abort_email"), true));
+ $is_success = wp_mail($to, $subject, $message, $headers, $attachments);
+ GFCommon::log_debug( "Result from wp_mail(): {$is_success}" );
+ if( $is_success ) {
+ GFCommon::log_debug( 'Mail was passed from WordPress to the mail server.' );
+ } else {
+ GFCommon::log_debug( 'The mail message was passed off to WordPress for processing, but WordPress was unable to send the message.' );
+ }
+
+ }
+
+ self::add_emails_sent();
+
+ do_action("gform_after_email", $is_success, $to, $subject, $message, $headers, $attachments, $message_format);
+ }
+
+ public static function add_emails_sent(){
+
+ $count = self::get_emails_sent();
+
+ update_option("gform_email_count", ++$count);
+
+ }
+
+ public static function get_emails_sent(){
+ $count = get_option("gform_email_count");
+
+ if(!$count)
+ $count = 0;
+
+ return $count;
+ }
+
+ public static function get_api_calls(){
+ $count = get_option("gform_api_count");
+
+ if(!$count)
+ $count = 0;
+
+ return $count;
+ }
+
+ public static function add_api_call(){
+
+ $count = self::get_api_calls();
+
+ update_option("gform_api_count", ++$count);
+
+ }
+
+ public static function has_post_field($fields){
+ foreach($fields as $field){
+ if(in_array($field["type"], array("post_title", "post_content", "post_excerpt", "post_category", "post_image", "post_tags", "post_custom_field")))
+ return true;
+ }
+ return false;
+ }
+
+ public static function has_list_field($form){
+ return self::has_field_by_type($form, 'list');
+ }
+
+ public static function has_credit_card_field($form){
+ return self::has_field_by_type($form, 'creditcard');
+ }
+
+ private static function has_field_by_type($form, $type) {
+ if(is_array($form["fields"])){
+ foreach($form["fields"] as $field){
+
+ if(RGFormsModel::get_input_type($field) == $type)
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static function current_user_can_any($caps){
+
+ if(!is_array($caps)){
+ $has_cap = current_user_can($caps) || current_user_can("gform_full_access");
+ return $has_cap;
+ }
+
+ foreach($caps as $cap){
+ if(current_user_can($cap)){
+ return true;
+ }
+ }
+
+ $has_full_access = current_user_can("gform_full_access");
+ return $has_full_access;
+ }
+
+ public static function current_user_can_which($caps){
+
+ foreach($caps as $cap){
+ if(current_user_can($cap))
+ return $cap;
+ }
+
+ return "";
+ }
+
+ public static function is_pricing_field($field_type){
+ return self::is_product_field($field_type) || $field_type == "donation";
+ }
+
+ public static function is_product_field($field_type){
+ return in_array($field_type, array("option", "quantity", "product", "total", "shipping", "calculation"));
+ }
+
+ public static function all_caps(){
+ return array( 'gravityforms_edit_forms',
+ 'gravityforms_delete_forms',
+ 'gravityforms_create_form',
+ 'gravityforms_view_entries',
+ 'gravityforms_edit_entries',
+ 'gravityforms_delete_entries',
+ 'gravityforms_view_settings',
+ 'gravityforms_edit_settings',
+ 'gravityforms_export_entries',
+ 'gravityforms_uninstall',
+ 'gravityforms_view_entry_notes',
+ 'gravityforms_edit_entry_notes',
+ 'gravityforms_view_updates',
+ 'gravityforms_view_addons',
+ 'gravityforms_preview_forms'
+ );
+ }
+
+ public static function delete_directory($dir) {
+ if(!file_exists($dir))
+ return;
+
+ if ($handle = opendir($dir)){
+ $array = array();
+ while (false !== ($file = readdir($handle))) {
+ if ($file != "." && $file != "..") {
+ if(is_dir($dir.$file)){
+ if(!@rmdir($dir.$file)) // Empty directory? Remove it
+ self::delete_directory($dir.$file.'/'); // Not empty? Delete the files inside it
+ }
+ else{
+ @unlink($dir.$file);
+ }
+ }
+ }
+ closedir($handle);
+ @rmdir($dir);
+ }
+ }
+
+ public static function get_remote_message(){
+ return stripslashes(get_option("rg_gforms_message"));
+ }
+
+ public static function get_key(){
+ return get_option("rg_gforms_key");
+ }
+
+ public static function has_update($use_cache=true){
+ $version_info = GFCommon::get_version_info($use_cache);
+ $version = rgar($version_info, "version");
+ return empty($version) ? false : version_compare(GFCommon::$version, $version, '<');
+ }
+
+ public static function get_key_info($key){
+
+ $options = array('method' => 'POST', 'timeout' => 3);
+ $options['headers'] = array(
+ 'Content-Type' => 'application/x-www-form-urlencoded; charset=' . get_option('blog_charset'),
+ 'User-Agent' => 'WordPress/' . get_bloginfo("version"),
+ 'Referer' => get_bloginfo("url")
+ );
+ $request_url = GRAVITY_MANAGER_URL . "/api.php?op=get_key&key={$key}";
+ $raw_response = wp_remote_request($request_url, $options);
+ if ( is_wp_error( $raw_response ) || $raw_response['response']['code'] != 200)
+ return array();
+
+ $key_info = unserialize(trim($raw_response["body"]));
+ return $key_info ? $key_info : array();
+ }
+
+ public static function get_version_info($cache=true){
+
+ $raw_response = get_transient("gform_update_info");
+ if(!$cache)
+ $raw_response = null;
+
+ if(!$raw_response){
+ //Getting version number
+ $options = array('method' => 'POST', 'timeout' => 20);
+ $options['headers'] = array(
+ 'Content-Type' => 'application/x-www-form-urlencoded; charset=' . get_option('blog_charset'),
+ 'User-Agent' => 'WordPress/' . get_bloginfo("version"),
+ 'Referer' => get_bloginfo("url")
+ );
+ $options['body'] = self::get_remote_post_params();
+ $options['timeout'] = 15;
+
+ $nocache = $cache ? "" : "?nocache=1"; //disabling server side caching
+ $request_url = GRAVITY_MANAGER_URL . "/version.php{$nocache}";
+
+ $raw_response = wp_remote_request($request_url, $options);
+
+ //caching responses.
+ set_transient("gform_update_info", $raw_response, 86400); //caching for 24 hours
+ }
+
+ if ( is_wp_error( $raw_response ) || $raw_response['response']['code'] != 200 )
+ return array("is_valid_key" => "1", "version" => "", "url" => "", "is_error" => "1");
+
+ $version_info = json_decode($raw_response['body'], true);
+
+ if( empty($version_info) )
+ return array("is_valid_key" => "1", "version" => "", "url" => "", "is_error" => "1");
+
+ return $version_info;
+ }
+
+ public static function get_remote_request_params(){
+ global $wpdb;
+
+ return sprintf("of=GravityForms&key=%s&v=%s&wp=%s&php=%s&mysql=%s&version=2", urlencode(self::get_key()), urlencode(self::$version), urlencode(get_bloginfo("version")), urlencode(phpversion()), urlencode($wpdb->db_version()));
+ }
+
+ public static function get_remote_post_params(){
+ global $wpdb;
+
+ if(!function_exists('get_plugins')){
+ require_once(ABSPATH . 'wp-admin/includes/plugin.php');
+ }
+ $plugin_list = get_plugins();
+ $site_url = get_bloginfo("url");
+ $plugins = array();
+
+ $active_plugins = get_option( 'active_plugins' );
+
+ foreach ($plugin_list as $key => $plugin) {
+ $is_active = in_array($key, $active_plugins);
+
+ //filter for only gravityforms ones, may get some others if using our naming convention
+ if (strpos(strtolower($plugin["Title"]), "gravity forms") !== false){
+ $name = substr($key, 0, strpos($key,"/"));
+ $plugins[] = array("name" => $name, "version" => $plugin["Version"], "is_active" => $is_active);
+ }
+ }
+ $plugins = json_encode($plugins);
+
+ //get theme info
+ $theme = wp_get_theme();
+ $theme_name = $theme->get("Name");
+ $theme_uri = $theme->get("ThemeURI");
+ $theme_version = $theme->get("Version");
+ $theme_author = $theme->get("Author");
+ $theme_author_uri = $theme->get("AuthorURI");
+
+ $form_counts = GFFormsModel::get_form_count();
+ $active_count = $form_counts["active"];
+ $inactive_count = $form_counts["inactive"];
+ $fc = abs($active_count) + abs($inactive_count);
+ $entry_count = GFFormsModel::get_lead_count_all_forms("active");
+ $im = is_multisite();
+
+ $post = array("of" => "gravityforms", "key" => self::get_key(), "v" => self::$version, "wp" => get_bloginfo("version"), "php" => phpversion(), "mysql" => $wpdb->db_version(), "version" => "2", "plugins" => $plugins, "tn" => $theme_name, "tu" => $theme_uri, "tv" => $theme_version, "ta" => $theme_author, "tau" => $theme_author_uri, "im" => $im, "fc" => $fc, "ec" => $entry_count, "emc" => self::get_emails_sent(), "api" => self::get_api_calls());
+ return $post;
+ }
+
+ public static function ensure_wp_version(){
+ if(!GF_SUPPORTED_WP_VERSION){
+ echo "" . sprintf(__("Gravity Forms require WordPress %s or greater. You must upgrade WordPress in order to use Gravity Forms", "gravityforms"), GF_MIN_WP_VERSION) . "
";
+ return false;
+ }
+ return true;
+ }
+
+ public static function check_update($option, $cache=true){
+
+ if(!is_object($option))
+ return $option;
+
+ $version_info = self::get_version_info($cache);
+
+ if (!$version_info)
+ return $option;
+
+ $plugin_path = "gravityforms/gravityforms.php";
+ if(empty($option->response[$plugin_path]))
+ $option->response[$plugin_path] = new stdClass();
+
+ $version = rgar($version_info, "version");
+ //Empty response means that the key is invalid. Do not queue for upgrade
+ if(!$version_info["is_valid_key"] || version_compare(GFCommon::$version, $version, '>=')){
+ unset($option->response[$plugin_path]);
+ }
+ else{
+ $url = rgar($version_info, "url");
+ $option->response[$plugin_path]->url = "http://www.gravityforms.com";
+ $option->response[$plugin_path]->slug = "gravityforms";
+ $option->response[$plugin_path]->package = str_replace("{KEY}", GFCommon::get_key(), $url);
+ $option->response[$plugin_path]->new_version = $version;
+ $option->response[$plugin_path]->id = "0";
+ }
+
+ return $option;
+
+ }
+
+ public static function cache_remote_message(){
+ //Getting version number
+ $key = GFCommon::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")
+ );
+
+ $request_url = GRAVITY_MANAGER_URL . "/message.php?" . GFCommon::get_remote_request_params();
+ $raw_response = wp_remote_request($request_url, $options);
+
+ if ( is_wp_error( $raw_response ) || 200 != $raw_response['response']['code'] )
+ $message = "";
+ else
+ $message = $raw_response['body'];
+
+ //validating that message is a valid Gravity Form message. If message is invalid, don't display anything
+ if(substr($message, 0, 10) != "")
+ $message = "";
+
+ update_option("rg_gforms_message", $message);
+ }
+
+ public static function get_local_timestamp($timestamp = null){
+ if($timestamp == null)
+ $timestamp = time();
+
+ return $timestamp + (get_option( 'gmt_offset' ) * 3600 );
+ }
+
+ public static function get_gmt_timestamp($local_timestamp){
+ return $local_timestamp - (get_option( 'gmt_offset' ) * 3600 );
+ }
+
+ public static function format_date($gmt_datetime, $is_human = true, $date_format="", $include_time=true){
+ if(empty($gmt_datetime))
+ return "";
+
+ //adjusting date to local configured Time Zone
+ $lead_gmt_time = mysql2date("G", $gmt_datetime);
+ $lead_local_time = self::get_local_timestamp($lead_gmt_time);
+
+ if(empty($date_format))
+ $date_format = get_option('date_format');
+
+ if($is_human){
+ $time_diff = time() - $lead_gmt_time;
+
+ if ($time_diff > 0 && $time_diff < 24*60*60)
+ $date_display = sprintf(__('%s ago', 'gravityforms'), human_time_diff($lead_gmt_time));
+ else
+ $date_display = $include_time ? sprintf(__('%1$s at %2$s', 'gravityforms'), date_i18n($date_format, $lead_local_time, true), date_i18n(get_option('time_format'), $lead_local_time, true)) : date_i18n($date_format, $lead_local_time, true);
+ }
+ else{
+ $date_display = $include_time ? sprintf(__('%1$s at %2$s', 'gravityforms'), date_i18n($date_format, $lead_local_time, true), date_i18n(get_option('time_format'), $lead_local_time, true)) : date_i18n($date_format, $lead_local_time, true);
+ }
+
+ return $date_display;
+ }
+
+ public static function get_selection_value($value){
+ $ary = explode("|", $value);
+ $val = $ary[0];
+ return $val;
+ }
+
+ public static function selection_display($value, $field, $currency="", $use_text=false){
+ if (is_array($value)){
+ return "";
+ }
+
+ $ary = explode("|", $value);
+ $val = $ary[0];
+ $price = count($ary) > 1 ? $ary[1] : "";
+
+ if($use_text)
+ $val = RGFormsModel::get_choice_text($field, $val);
+
+ if(!empty($price))
+ return "$val (" . self::to_money($price, $currency) . ")";
+ else
+ return $val;
+ }
+
+ public static function date_display($value, $format = "mdy"){
+ $date = self::parse_date($value, $format);
+ if(empty($date))
+ return $value;
+
+ list($position, $separator) = rgexplode("_", $format, 2);
+ switch($separator){
+ case "dash" :
+ $separator = "-";
+ break;
+ case "dot" :
+ $separator = ".";
+ break;
+ default :
+ $separator = "/";
+ break;
+ }
+
+ switch($position){
+ case "ymd" :
+ return $date["year"] . $separator . $date["month"] . $separator . $date["day"];
+ break;
+
+ case "dmy" :
+ return $date["day"] . $separator . $date["month"] . $separator . $date["year"];
+ break;
+
+ default :
+ return $date["month"] . $separator . $date["day"] . $separator . $date["year"];
+ break;
+
+ }
+ }
+
+ public static function parse_date($date, $format="mdy"){
+ $date_info = array();
+
+ $position = substr($format, 0, 3);
+
+ if(is_array($date)){
+
+ switch($position){
+ case "mdy" :
+ $date_info["month"] = rgar($date, 0);
+ $date_info["day"] = rgar($date, 1);
+ $date_info["year"] = rgar($date, 2);
+ break;
+
+ case "dmy" :
+ $date_info["day"] = rgar($date, 0);
+ $date_info["month"] = rgar($date, 1);
+ $date_info["year"] = rgar($date, 2);
+ break;
+
+ case "ymd" :
+ $date_info["year"] = rgar($date, 0);
+ $date_info["month"] = rgar($date, 1);
+ $date_info["day"] = rgar($date, 2);
+ break;
+ }
+ return $date_info;
+ }
+
+ $date = preg_replace("|[/\.]|", "-", $date);
+ if(preg_match('/^(\d{1,4})-(\d{1,2})-(\d{1,4})$/', $date, $matches)){
+
+ if(strlen($matches[1]) == 4){
+ //format yyyy-mm-dd
+ $date_info["year"] = $matches[1];
+ $date_info["month"] = $matches[2];
+ $date_info["day"] = $matches[3];
+ }
+ else if ($position == "mdy"){
+ //format mm-dd-yyyy
+ $date_info["month"] = $matches[1];
+ $date_info["day"] = $matches[2];
+ $date_info["year"] = $matches[3];
+ }
+ else{
+ //format dd-mm-yyyy
+ $date_info["day"] = $matches[1];
+ $date_info["month"] = $matches[2];
+ $date_info["year"] = $matches[3];
+ }
+ }
+
+ return $date_info;
+ }
+
+
+ public static function truncate_url($url){
+ $truncated_url = basename($url);
+ if(empty($truncated_url))
+ $truncated_url = dirname($url);
+
+ $ary = explode("?", $truncated_url);
+
+ return $ary[0];
+ }
+
+ public static function get_tabindex(){
+ return GFCommon::$tab_index > 0 ? "tabindex='" . GFCommon::$tab_index++ . "'" : "";
+ }
+
+ public static function get_checkbox_choices($field, $value, $disabled_text){
+ $choices = "";
+
+ if(is_array($field["choices"])){
+ $choice_number = 1;
+ $count = 1;
+ foreach($field["choices"] as $choice){
+ if($choice_number % 10 == 0) //hack to skip numbers ending in 0. so that 5.1 doesn't conflict with 5.10
+ $choice_number++;
+
+ $input_id = $field["id"] . '.' . $choice_number;
+ $id = $field["id"] . '_' . $choice_number++;
+
+ if(empty($_POST) && rgar($choice,"isSelected")){
+ $checked = "checked='checked'";
+ }
+ else if(is_array($value) && RGFormsModel::choice_value_match($field, $choice, rgget($input_id, $value))){
+ $checked = "checked='checked'";
+ }
+ else if(!is_array($value) && RGFormsModel::choice_value_match($field, $choice, $value)){
+ $checked = "checked='checked'";
+ }
+ else{
+ $checked = "";
+ }
+
+ $logic_event = self::get_logic_event($field, "click");
+
+ $tabindex = self::get_tabindex();
+ $choice_value = $choice["value"];
+ if(rgget("enablePrice", $field))
+ $choice_value .= "|" . GFCommon::to_number(rgar($choice,"price"));
+
+ $choices.= sprintf("%s ", $input_id, esc_attr($choice_value), $checked, $id, $disabled_text, $id, $id, $choice["text"]);
+
+ if(IS_ADMIN && RG_CURRENT_VIEW != "entry" && $count >=5)
+ break;
+
+ $count++;
+ }
+
+ $total = sizeof($field["choices"]);
+ if($count < $total)
+ $choices .= "" . sprintf(__("%d of %d items shown. Edit field to view all", "gravityforms"), $count, $total) . " ";
+ }
+
+ return apply_filters("gform_field_choices_" . rgget("formId", $field), apply_filters("gform_field_choices", $choices, $field), $field);
+
+ }
+
+ public static function get_radio_choices($field, $value="", $disabled_text){
+ $choices = "";
+
+ if(is_array($field["choices"])){
+ $choice_id = 0;
+
+ // add "other" choice to choices if enabled
+ if(rgar($field, 'enableOtherChoice')) {
+ $other_default_value = GFCommon::get_other_choice_value();
+ $field["choices"][] = array('text' => $other_default_value, 'value' => 'gf_other_choice', 'isSelected' => false, 'isOtherChoice' => true);
+ }
+
+ $logic_event = self::get_logic_event($field, "click");
+ $count = 1;
+
+ foreach($field["choices"] as $choice){
+ $id = $field["id"] . '_' . $choice_id++;
+
+ $field_value = !empty($choice["value"]) || rgar($field, "enableChoiceValue") ? $choice["value"] : $choice["text"];
+
+ if(rgget("enablePrice", $field))
+ $field_value .= "|" . GFCommon::to_number(rgar($choice,"price"));
+
+ if(rgblank($value) && RG_CURRENT_VIEW != "entry"){
+ $checked = rgar($choice,"isSelected") ? "checked='checked'" : "";
+ }
+ else {
+ $checked = RGFormsModel::choice_value_match($field, $choice, $value) ? "checked='checked'" : "";
+ }
+
+ $tabindex = self::get_tabindex();
+ $label = sprintf("%s ", $id, $id, $choice["text"]);
+ $input_focus = '';
+
+ // handle "other" choice
+ if(rgar($choice, 'isOtherChoice')) {
+
+ $onfocus = !IS_ADMIN ? 'jQuery(this).prev("input").attr("checked", true); if(jQuery(this).val() == "' . $other_default_value . '") { jQuery(this).val(""); }' : '';
+ $onblur = !IS_ADMIN ? 'if(jQuery(this).val().replace(" ", "") == "") { jQuery(this).val("' . $other_default_value . '"); }' : '';
+ $onkeyup = self::get_logic_event($field, "keyup");
+
+ $input_focus = !IS_ADMIN ? "onfocus=\"jQuery(this).next('input').focus();\"" : "";
+ $value_exists = RGFormsModel::choices_value_match($field, $field["choices"], $value);
+
+ if($value == 'gf_other_choice' && rgpost("input_{$field["id"]}_other")){
+ $other_value = rgpost("input_{$field["id"]}_other");
+ } else if(!$value_exists && !empty($value)){
+ $other_value = $value;
+ $value = 'gf_other_choice';
+ $checked = "checked='checked'";
+ } else {
+ $other_value = $other_default_value;
+ }
+ $label = " ";
+ }
+
+ $choices .= sprintf(" %s ", $field["id"], esc_attr($field_value), $checked, $id, $disabled_text, $input_focus, $label);
+
+ if(IS_ADMIN && RG_CURRENT_VIEW != "entry" && $count >=5)
+ break;
+
+ $count++;
+ }
+
+ $total = sizeof($field["choices"]);
+ if($count < $total)
+ $choices .= "" . sprintf(__("%d of %d items shown. Edit field to view all", "gravityforms"), $count, $total) . " ";
+ }
+
+ return apply_filters("gform_field_choices_" . rgget("formId", $field), apply_filters("gform_field_choices", $choices, $field), $field);
+ }
+
+ public static function get_field_type_title($type){
+ switch($type){
+ case "text" :
+ return __("Single Line Text", "gravityforms");
+ case "textarea" :
+ return __("Paragraph Text", "gravityforms");
+ case "select" :
+ return __("Drop Down", "gravityforms");
+ case "multiselect" :
+ return __("Multi Select", "gravityforms");
+ case "number" :
+ return __("Number", "gravityforms");
+ case "checkbox" :
+ return __("Checkboxes", "gravityforms");
+ case "radio" :
+ return __("Radio Buttons", "gravityforms");
+ case "hidden" :
+ return __("Hidden", "gravityforms");
+ case "html" :
+ return __("HTML", "gravityforms");
+ case "section" :
+ return __("Section Break", "gravityforms");
+ case "page" :
+ return __("Page Break", "gravityforms");
+ case "name" :
+ return __("Name", "gravityforms");
+ case "date" :
+ return __("Date", "gravityforms");
+ case "time" :
+ return __("Time", "gravityforms");
+ case "phone" :
+ return __("Phone", "gravityforms");
+ case "address" :
+ return __("Address", "gravityforms");
+ case "website" :
+ return __("Website", "gravityforms");
+ case "email" :
+ return __("Email", "gravityforms");
+ case "password" :
+ return __("Password", "gravityforms");
+ case "fileupload" :
+ return __("File Upload", "gravityforms");
+ case "captcha" :
+ return __("CAPTCHA", "gravityforms");
+ case "list" :
+ return __("List", "gravityforms");
+ case "creditcard" :
+ return __("Credit Card", "gravityforms");
+ case "post_title" :
+ return __("Title", "gravityforms");
+ case "post_content" :
+ return __("Body", "gravityforms");
+ case "post_excerpt" :
+ return __("Excerpt", "gravityforms");
+ case "post_tags" :
+ return __("Tags", "gravityforms");
+ case "post_category" :
+ return __("Category", "gravityforms");
+ case "post_image" :
+ return __("Image", "gravityforms");
+ case "post_custom_field" :
+ return __("Custom Field", "gravityforms");
+ case "product" :
+ return __("Product", "gravityforms");
+ case "quantity" :
+ return __("Quantity", "gravityforms");
+ case "option" :
+ return __("Option", "gravityforms");
+ case "shipping" :
+ return __("Shipping", "gravityforms");
+ case "total" :
+ return __("Total", "gravityforms");
+
+ default :
+ return apply_filters("gform_field_type_title", $type, $type);
+ }
+ }
+
+ public static function get_select_choices($field, $value=""){
+ $choices = "";
+
+ if(RG_CURRENT_VIEW == "entry" && empty($value))
+ $choices .= " ";
+
+ if(is_array(rgar($field, "choices"))){
+ foreach($field["choices"] as $choice){
+
+ //needed for users upgrading from 1.0
+ $field_value = !empty($choice["value"]) || rgget("enableChoiceValue", $field) || $field['type'] == 'post_category' ? $choice["value"] : $choice["text"];
+ if(rgget("enablePrice", $field))
+ $field_value .= "|" . GFCommon::to_number(rgar($choice,"price"));
+
+ if(rgblank($value) && RG_CURRENT_VIEW != "entry"){
+ $selected = rgar($choice,"isSelected") ? "selected='selected'" : "";
+ }
+ else{
+ if(is_array($value)){
+ $is_match = false;
+ foreach($value as $item){
+ if(RGFormsModel::choice_value_match($field, $choice, $item)){
+ $is_match = true;
+ break;
+ }
+ }
+ $selected = $is_match ? "selected='selected'" : "";
+ }
+ else{
+ $selected = RGFormsModel::choice_value_match($field, $choice, $value) ? "selected='selected'" : "";
+ }
+ }
+
+ $choices.= sprintf("%s ", esc_attr($field_value), $selected, esc_html($choice["text"]));
+ }
+ }
+ return $choices;
+ }
+
+ public static function is_section_empty($section_field, $form, $lead){
+ $cache_key = "GFCommon::is_section_empty_" . $form["id"] . "_" . $section_field["id"];
+
+ $value = GFCache::get($cache_key);
+
+ if($value !== false)
+ return $value == true;
+
+ $fields = self::get_section_fields($form, $section_field["id"]);
+ if(!is_array($fields)){
+ GFCache::set($cache_key, 1);
+ return true;
+ }
+
+ foreach($fields as $field){
+ $val = RGFormsModel::get_lead_field_value($lead, $field);
+ $val = GFCommon::get_lead_field_display($field, $val, rgar($lead, 'currency'));
+
+ if(!self::is_product_field($field["type"]) && !rgblank($val)){
+ GFCache::set($cache_key, 0);
+ return false;
+ }
+ }
+
+ GFCache::set($cache_key, 1);
+
+ return true;
+ }
+
+ public static function get_section_fields($form, $section_field_id){
+ $fields = array();
+ $in_section = false;
+ foreach($form["fields"] as $field){
+ if(in_array($field["type"], array("section", "page")) && $in_section)
+ return $fields;
+
+ if($field["id"] == $section_field_id)
+ $in_section = true;
+
+ if($in_section)
+ $fields[] = $field;
+ }
+
+ return $fields;
+ }
+
+
+ public static function get_countries(){
+ return apply_filters("gform_countries", array(
+ __('Afghanistan', 'gravityforms'),__('Albania', 'gravityforms'),__('Algeria', 'gravityforms'), __('American Samoa', 'gravityforms'), __('Andorra', 'gravityforms'),__('Angola', 'gravityforms'),__('Antigua and Barbuda', 'gravityforms'),__('Argentina', 'gravityforms'),__('Armenia', 'gravityforms'),__('Australia', 'gravityforms'),__('Austria', 'gravityforms'),__('Azerbaijan', 'gravityforms'),__('Bahamas', 'gravityforms'),__('Bahrain', 'gravityforms'),__('Bangladesh', 'gravityforms'),__('Barbados', 'gravityforms'),__('Belarus', 'gravityforms'),__('Belgium', 'gravityforms'),__('Belize', 'gravityforms'),__('Benin', 'gravityforms'),__('Bermuda', 'gravityforms'),__('Bhutan', 'gravityforms'),__('Bolivia', 'gravityforms'),__('Bosnia and Herzegovina', 'gravityforms'),__('Botswana', 'gravityforms'),__('Brazil', 'gravityforms'),__('Brunei', 'gravityforms'),__('Bulgaria', 'gravityforms'),__('Burkina Faso', 'gravityforms'),__('Burundi', 'gravityforms'),__('Cambodia', 'gravityforms'),__('Cameroon', 'gravityforms'),__('Canada', 'gravityforms'),__('Cape Verde', 'gravityforms'),__('Cayman Islands', 'gravityforms'),__('Central African Republic', 'gravityforms'),__('Chad', 'gravityforms'),__('Chile', 'gravityforms'),__('China', 'gravityforms'),__('Colombia', 'gravityforms'),__('Comoros', 'gravityforms'),__('Congo, Democratic Republic of the', 'gravityforms'),__('Congo, Republic of the', 'gravityforms'),__('Costa Rica', 'gravityforms'),__('Côte d\'Ivoire', 'gravityforms'),__('Croatia', 'gravityforms'),__('Cuba', 'gravityforms'),__('Cyprus', 'gravityforms'),__('Czech Republic', 'gravityforms'),__('Denmark', 'gravityforms'),__('Djibouti', 'gravityforms'),__('Dominica', 'gravityforms'),__('Dominican Republic', 'gravityforms'),__('East Timor', 'gravityforms'),__('Ecuador', 'gravityforms'),__('Egypt', 'gravityforms'),__('El Salvador', 'gravityforms'),__('Equatorial Guinea', 'gravityforms'),__('Eritrea', 'gravityforms'),__('Estonia', 'gravityforms'),__('Ethiopia', 'gravityforms'),__('Fiji', 'gravityforms'),__('Finland', 'gravityforms'),__('France', 'gravityforms'), __('French Polynesia', 'gravityforms'), __('Gabon', 'gravityforms'),
+ __('Gambia', 'gravityforms'),__('Georgia', 'gravityforms'),__('Germany', 'gravityforms'),__('Ghana', 'gravityforms'),__('Greece', 'gravityforms'),__('Greenland', 'gravityforms'),__('Grenada', 'gravityforms'),__('Guam', 'gravityforms'),__('Guatemala', 'gravityforms'),__('Guinea', 'gravityforms'),__('Guinea-Bissau', 'gravityforms'),__('Guyana', 'gravityforms'),__('Haiti', 'gravityforms'),__('Honduras', 'gravityforms'),__('Hong Kong', 'gravityforms'),__('Hungary', 'gravityforms'),__('Iceland', 'gravityforms'),__('India', 'gravityforms'),__('Indonesia', 'gravityforms'),__('Iran', 'gravityforms'),__('Iraq', 'gravityforms'),__('Ireland', 'gravityforms'),__('Israel', 'gravityforms'),__('Italy', 'gravityforms'),__('Jamaica', 'gravityforms'),__('Japan', 'gravityforms'),__('Jordan', 'gravityforms'),__('Kazakhstan', 'gravityforms'),__('Kenya', 'gravityforms'),__('Kiribati', 'gravityforms'),__('North Korea', 'gravityforms'),__('South Korea', 'gravityforms'),__('Kosovo', 'gravityforms'),__('Kuwait', 'gravityforms'),__('Kyrgyzstan', 'gravityforms'),__('Laos', 'gravityforms'),__('Latvia', 'gravityforms'),__('Lebanon', 'gravityforms'),__('Lesotho', 'gravityforms'),__('Liberia', 'gravityforms'),__('Libya', 'gravityforms'),__('Liechtenstein', 'gravityforms'),__('Lithuania', 'gravityforms'),__('Luxembourg', 'gravityforms'),__('Macedonia', 'gravityforms'),__('Madagascar', 'gravityforms'),__('Malawi', 'gravityforms'),__('Malaysia', 'gravityforms'),__('Maldives', 'gravityforms'),__('Mali', 'gravityforms'),__('Malta', 'gravityforms'),__('Marshall Islands', 'gravityforms'),__('Mauritania', 'gravityforms'),__('Mauritius', 'gravityforms'),__('Mexico', 'gravityforms'),__('Micronesia', 'gravityforms'),__('Moldova', 'gravityforms'),__('Monaco', 'gravityforms'),__('Mongolia', 'gravityforms'),__('Montenegro', 'gravityforms'),__('Morocco', 'gravityforms'),__('Mozambique', 'gravityforms'),__('Myanmar', 'gravityforms'),__('Namibia', 'gravityforms'),__('Nauru', 'gravityforms'),__('Nepal', 'gravityforms'),__('Netherlands', 'gravityforms'),__('New Zealand', 'gravityforms'),
+ __('Nicaragua', 'gravityforms'),__('Niger', 'gravityforms'),__('Nigeria', 'gravityforms'),__('Norway', 'gravityforms'), __('Northern Mariana Islands', 'gravityforms'), __('Oman', 'gravityforms'),__('Pakistan', 'gravityforms'),__('Palau', 'gravityforms'),__('Palestine', 'gravityforms'),__('Panama', 'gravityforms'),__('Papua New Guinea', 'gravityforms'),__('Paraguay', 'gravityforms'),__('Peru', 'gravityforms'),__('Philippines', 'gravityforms'),__('Poland', 'gravityforms'),__('Portugal', 'gravityforms'),__('Puerto Rico', 'gravityforms'),__('Qatar', 'gravityforms'),__('Romania', 'gravityforms'),__('Russia', 'gravityforms'),__('Rwanda', 'gravityforms'),__('Saint Kitts and Nevis', 'gravityforms'),__('Saint Lucia', 'gravityforms'),__('Saint Vincent and the Grenadines', 'gravityforms'),__('Samoa', 'gravityforms'),__('San Marino', 'gravityforms'),__('Sao Tome and Principe', 'gravityforms'),__('Saudi Arabia', 'gravityforms'),__('Senegal', 'gravityforms'),__('Serbia and Montenegro', 'gravityforms'),__('Seychelles', 'gravityforms'),__('Sierra Leone', 'gravityforms'),__('Singapore', 'gravityforms'),__('Slovakia', 'gravityforms'),__('Slovenia', 'gravityforms'),__('Solomon Islands', 'gravityforms'),__('Somalia', 'gravityforms'),__('South Africa', 'gravityforms'),__('Spain', 'gravityforms'),__('Sri Lanka', 'gravityforms'),__('Sudan', 'gravityforms'),__('Sudan, South', 'gravityforms'),__('Suriname', 'gravityforms'),__('Swaziland', 'gravityforms'),__('Sweden', 'gravityforms'),__('Switzerland', 'gravityforms'),__('Syria', 'gravityforms'),__('Taiwan', 'gravityforms'),__('Tajikistan', 'gravityforms'),__('Tanzania', 'gravityforms'),__('Thailand', 'gravityforms'),__('Togo', 'gravityforms'),__('Tonga', 'gravityforms'),__('Trinidad and Tobago', 'gravityforms'),__('Tunisia', 'gravityforms'),__('Turkey', 'gravityforms'),__('Turkmenistan', 'gravityforms'),__('Tuvalu', 'gravityforms'),__('Uganda', 'gravityforms'),__('Ukraine', 'gravityforms'),__('United Arab Emirates', 'gravityforms'),__('United Kingdom', 'gravityforms'),
+ __('United States', 'gravityforms'),__('Uruguay', 'gravityforms'),__('Uzbekistan', 'gravityforms'),__('Vanuatu', 'gravityforms'),__('Vatican City', 'gravityforms'),__('Venezuela', 'gravityforms'),__('Vietnam', 'gravityforms'), __('Virgin Islands, British', 'gravityforms'), __('Virgin Islands, U.S.', 'gravityforms'),__('Yemen', 'gravityforms'),__('Zambia', 'gravityforms'),__('Zimbabwe', 'gravityforms')));
+
+
+ }
+
+ public static function get_country_code($country_name) {
+ $codes = array(
+ __('AFGHANISTAN', 'gravityforms') => "AF" ,
+ __('ALBANIA', 'gravityforms') => "AL" ,
+ __('ALGERIA', 'gravityforms') => "DZ" ,
+ __('AMERICAN SAMOA', 'gravityforms') => "AS" ,
+ __('ANDORRA', 'gravityforms') => "AD" ,
+ __('ANGOLA', 'gravityforms') => "AO" ,
+ __('ANTIGUA AND BARBUDA', 'gravityforms') => "AG" ,
+ __('ARGENTINA', 'gravityforms') => "AR" ,
+ __('ARMENIA', 'gravityforms') => "AM" ,
+ __('AUSTRALIA', 'gravityforms') => "AU" ,
+ __('AUSTRIA', 'gravityforms') => "AT" ,
+ __('AZERBAIJAN', 'gravityforms') => "AZ" ,
+ __('BAHAMAS', 'gravityforms') => "BS" ,
+ __('BAHRAIN', 'gravityforms') => "BH" ,
+ __('BANGLADESH', 'gravityforms') => "BD" ,
+ __('BARBADOS', 'gravityforms') => "BB" ,
+ __('BELARUS', 'gravityforms') => "BY" ,
+ __('BELGIUM', 'gravityforms') => "BE" ,
+ __('BELIZE', 'gravityforms') => "BZ" ,
+ __('BENIN', 'gravityforms') => "BJ" ,
+ __('BERMUDA', 'gravityforms') => "BM" ,
+ __('BHUTAN', 'gravityforms') => "BT" ,
+ __('BOLIVIA', 'gravityforms') => "BO" ,
+ __('BOSNIA AND HERZEGOVINA', 'gravityforms') => "BA" ,
+ __('BOTSWANA', 'gravityforms') => "BW" ,
+ __('BRAZIL', 'gravityforms') => "BR" ,
+ __('BRUNEI', 'gravityforms') => "BN" ,
+ __('BULGARIA', 'gravityforms') => "BG" ,
+ __('BURKINA FASO', 'gravityforms') => "BF" ,
+ __('BURUNDI', 'gravityforms') => "BI" ,
+ __('CAMBODIA', 'gravityforms') => "KH" ,
+ __('CAMEROON', 'gravityforms') => "CM" ,
+ __('CANADA', 'gravityforms') => "CA" ,
+ __('CAPE VERDE', 'gravityforms') => "CV" ,
+ __('CAYMAN ISLANDS', 'gravityforms') => "KY" ,
+ __('CENTRAL AFRICAN REPUBLIC', 'gravityforms') => "CF" ,
+ __('CHAD', 'gravityforms') => "TD" ,
+ __('CHILE', 'gravityforms') => "CL" ,
+ __('CHINA', 'gravityforms') => "CN" ,
+ __('COLOMBIA', 'gravityforms') => "CO" ,
+ __('COMOROS', 'gravityforms') => "KM" ,
+ __('CONGO, DEMOCRATIC REPUBLIC OF THE', 'gravityforms') => "CD" ,
+ __('CONGO, REPUBLIC OF THE', 'gravityforms') => "CG" ,
+ __('COSTA RICA', 'gravityforms') => "CR" ,
+ __('C&OCIRC;TE D\'IVOIRE', 'gravityforms') => "CI" ,
+ __('CROATIA', 'gravityforms') => "HR" ,
+ __('CUBA', 'gravityforms') => "CU" ,
+ __('CYPRUS', 'gravityforms') => "CY" ,
+ __('CZECH REPUBLIC', 'gravityforms') => "CZ" ,
+ __('DENMARK', 'gravityforms') => "DK" ,
+ __('DJIBOUTI', 'gravityforms') => "DJ" ,
+ __('DOMINICA', 'gravityforms') => "DM" ,
+ __('DOMINICAN REPUBLIC', 'gravityforms') => "DO" ,
+ __('EAST TIMOR', 'gravityforms') => "TL" ,
+ __('ECUADOR', 'gravityforms') => "EC" ,
+ __('EGYPT', 'gravityforms') => "EG" ,
+ __('EL SALVADOR', 'gravityforms') => "SV" ,
+ __('EQUATORIAL GUINEA', 'gravityforms') => "GQ" ,
+ __('ERITREA', 'gravityforms') => "ER" ,
+ __('ESTONIA', 'gravityforms') => "EE" ,
+ __('ETHIOPIA', 'gravityforms') => "ET" ,
+ __('FIJI', 'gravityforms') => "FJ" ,
+ __('FINLAND', 'gravityforms') => "FI" ,
+ __('FRANCE', 'gravityforms') => "FR" ,
+ __('GABON', 'gravityforms') => "GA" ,
+ __('GAMBIA', 'gravityforms') => "GM" ,
+ __('GEORGIA', 'gravityforms') => "GE" ,
+ __('GERMANY', 'gravityforms') => "DE" ,
+ __('GHANA', 'gravityforms') => "GH" ,
+ __('GREECE', 'gravityforms') => "GR" ,
+ __('GREENLAND', 'gravityforms') => "GL" ,
+ __('GRENADA', 'gravityforms') => "GD" ,
+ __('GUAM', 'gravityforms') => "GU" ,
+ __('GUATEMALA', 'gravityforms') => "GT" ,
+ __('GUINEA', 'gravityforms') => "GN" ,
+ __('GUINEA-BISSAU', 'gravityforms') => "GW" ,
+ __('GUYANA', 'gravityforms') => "GY" ,
+ __('HAITI', 'gravityforms') => "HT" ,
+ __('HONDURAS', 'gravityforms') => "HN" ,
+ __('HONG KONG', 'gravityforms') => "HK" ,
+ __('HUNGARY', 'gravityforms') => "HU" ,
+ __('ICELAND', 'gravityforms') => "IS" ,
+ __('INDIA', 'gravityforms') => "IN" ,
+ __('INDONESIA', 'gravityforms') => "ID" ,
+ __('IRAN', 'gravityforms') => "IR" ,
+ __('IRAQ', 'gravityforms') => "IQ" ,
+ __('IRELAND', 'gravityforms') => "IE" ,
+ __('ISRAEL', 'gravityforms') => "IL" ,
+ __('ITALY', 'gravityforms') => "IT" ,
+ __('JAMAICA', 'gravityforms') => "JM" ,
+ __('JAPAN', 'gravityforms') => "JP" ,
+ __('JORDAN', 'gravityforms') => "JO" ,
+ __('KAZAKHSTAN', 'gravityforms') => "KZ" ,
+ __('KENYA', 'gravityforms') => "KE" ,
+ __('KIRIBATI', 'gravityforms') => "KI" ,
+ __('NORTH KOREA', 'gravityforms') => "KP" ,
+ __('SOUTH KOREA', 'gravityforms') => "KR" ,
+ __('KOSOVO', 'gravityforms') => "KV" ,
+ __('KUWAIT', 'gravityforms') => "KW" ,
+ __('KYRGYZSTAN', 'gravityforms') => "KG" ,
+ __('LAOS', 'gravityforms') => "LA" ,
+ __('LATVIA', 'gravityforms') => "LV" ,
+ __('LEBANON', 'gravityforms') => "LB" ,
+ __('LESOTHO', 'gravityforms') => "LS" ,
+ __('LIBERIA', 'gravityforms') => "LR" ,
+ __('LIBYA', 'gravityforms') => "LY" ,
+ __('LIECHTENSTEIN', 'gravityforms') => "LI" ,
+ __('LITHUANIA', 'gravityforms') => "LT" ,
+ __('LUXEMBOURG', 'gravityforms') => "LU" ,
+ __('MACEDONIA', 'gravityforms') => "MK" ,
+ __('MADAGASCAR', 'gravityforms') => "MG" ,
+ __('MALAWI', 'gravityforms') => "MW" ,
+ __('MALAYSIA', 'gravityforms') => "MY" ,
+ __('MALDIVES', 'gravityforms') => "MV" ,
+ __('MALI', 'gravityforms') => "ML" ,
+ __('MALTA', 'gravityforms') => "MT" ,
+ __('MARSHALL ISLANDS', 'gravityforms') => "MH" ,
+ __('MAURITANIA', 'gravityforms') => "MR" ,
+ __('MAURITIUS', 'gravityforms') => "MU" ,
+ __('MEXICO', 'gravityforms') => "MX" ,
+ __('MICRONESIA', 'gravityforms') => "FM" ,
+ __('MOLDOVA', 'gravityforms') => "MD" ,
+ __('MONACO', 'gravityforms') => "MC" ,
+ __('MONGOLIA', 'gravityforms') => "MN" ,
+ __('MONTENEGRO', 'gravityforms') => "ME" ,
+ __('MOROCCO', 'gravityforms') => "MA" ,
+ __('MOZAMBIQUE', 'gravityforms') => "MZ" ,
+ __('MYANMAR', 'gravityforms') => "MM" ,
+ __('NAMIBIA', 'gravityforms') => "NA" ,
+ __('NAURU', 'gravityforms') => "NR" ,
+ __('NEPAL', 'gravityforms') => "NP" ,
+ __('NETHERLANDS', 'gravityforms') => "NL" ,
+ __('NEW ZEALAND', 'gravityforms') => "NZ" ,
+ __('NICARAGUA', 'gravityforms') => "NI" ,
+ __('NIGER', 'gravityforms') => "NE" ,
+ __('NIGERIA', 'gravityforms') => "NG" ,
+ __('NORTHERN MARIANA ISLANDS', 'gravityforms') => "MP" ,
+ __('NORWAY', 'gravityforms') => "NO" ,
+ __('OMAN', 'gravityforms') => "OM" ,
+ __('PAKISTAN', 'gravityforms') => "PK" ,
+ __('PALAU', 'gravityforms') => "PW" ,
+ __('PALESTINE', 'gravityforms') => "PS" ,
+ __('PANAMA', 'gravityforms') => "PA" ,
+ __('PAPUA NEW GUINEA', 'gravityforms') => "PG" ,
+ __('PARAGUAY', 'gravityforms') => "PY" ,
+ __('PERU', 'gravityforms') => "PE" ,
+ __('PHILIPPINES', 'gravityforms') => "PH" ,
+ __('POLAND', 'gravityforms') => "PL" ,
+ __('PORTUGAL', 'gravityforms') => "PT" ,
+ __('PUERTO RICO', 'gravityforms') => "PR" ,
+ __('QATAR', 'gravityforms') => "QA" ,
+ __('ROMANIA', 'gravityforms') => "RO" ,
+ __('RUSSIA', 'gravityforms') => "RU" ,
+ __('RWANDA', 'gravityforms') => "RW" ,
+ __('SAINT KITTS AND NEVIS', 'gravityforms') => "KN" ,
+ __('SAINT LUCIA', 'gravityforms') => "LC" ,
+ __('SAINT VINCENT AND THE GRENADINES', 'gravityforms') => "VC" ,
+ __('SAMOA', 'gravityforms') => "WS" ,
+ __('SAN MARINO', 'gravityforms') => "SM" ,
+ __('SAO TOME AND PRINCIPE', 'gravityforms') => "ST" ,
+ __('SAUDI ARABIA', 'gravityforms') => "SA" ,
+ __('SENEGAL', 'gravityforms') => "SN" ,
+ __('SERBIA AND MONTENEGRO', 'gravityforms') => "RS" ,
+ __('SEYCHELLES', 'gravityforms') => "SC" ,
+ __('SIERRA LEONE', 'gravityforms') => "SL" ,
+ __('SINGAPORE', 'gravityforms') => "SG" ,
+ __('SLOVAKIA', 'gravityforms') => "SK" ,
+ __('SLOVENIA', 'gravityforms') => "SI" ,
+ __('SOLOMON ISLANDS', 'gravityforms') => "SB" ,
+ __('SOMALIA', 'gravityforms') => "SO" ,
+ __('SOUTH AFRICA', 'gravityforms') => "ZA" ,
+ __('SPAIN', 'gravityforms') => "ES" ,
+ __('SRI LANKA', 'gravityforms') => "LK" ,
+ __('SUDAN', 'gravityforms') => "SD" ,
+ __('SUDAN, SOUTH', 'gravityforms') => "SS" ,
+ __('SURINAME', 'gravityforms') => "SR" ,
+ __('SWAZILAND', 'gravityforms') => "SZ" ,
+ __('SWEDEN', 'gravityforms') => "SE" ,
+ __('SWITZERLAND', 'gravityforms') => "CH" ,
+ __('SYRIA', 'gravityforms') => "SY" ,
+ __('TAIWAN', 'gravityforms') => "TW" ,
+ __('TAJIKISTAN', 'gravityforms') => "TJ" ,
+ __('TANZANIA', 'gravityforms') => "TZ" ,
+ __('THAILAND', 'gravityforms') => "TH" ,
+ __('TOGO', 'gravityforms') => "TG" ,
+ __('TONGA', 'gravityforms') => "TO" ,
+ __('TRINIDAD AND TOBAGO', 'gravityforms') => "TT" ,
+ __('TUNISIA', 'gravityforms') => "TN" ,
+ __('TURKEY', 'gravityforms') => "TR" ,
+ __('TURKMENISTAN', 'gravityforms') => "TM" ,
+ __('TUVALU', 'gravityforms') => "TV" ,
+ __('UGANDA', 'gravityforms') => "UG" ,
+ __('UKRAINE', 'gravityforms') => "UA" ,
+ __('UNITED ARAB EMIRATES', 'gravityforms') => "AE" ,
+ __('UNITED KINGDOM', 'gravityforms') => "GB" ,
+ __('UNITED STATES', 'gravityforms') => "US" ,
+ __('URUGUAY', 'gravityforms') => "UY" ,
+ __('UZBEKISTAN', 'gravityforms') => "UZ" ,
+ __('VANUATU', 'gravityforms') => "VU" ,
+ __('VATICAN CITY', 'gravityforms') => "" ,
+ __('VENEZUELA', 'gravityforms') => "VE" ,
+ __('VIRGIN ISLANDS, BRITISH', 'gravityforms') => "VG" ,
+ __('VIRGIN ISLANDS, U.S.', 'gravityforms') => "VI" ,
+ __('VIETNAM', 'gravityforms') => "VN" ,
+ __('YEMEN', 'gravityforms') => "YE" ,
+ __('ZAMBIA', 'gravityforms') => "ZM" ,
+ __('ZIMBABWE', 'gravityforms') => "ZW" );
+
+ return rgar($codes, strtoupper($country_name));
+ }
+
+ public static function get_us_states(){
+ return apply_filters("gform_us_states", array(
+ __("Alabama","gravityforms"),__("Alaska","gravityforms"),__("Arizona","gravityforms"),__("Arkansas","gravityforms"),
+ __("California","gravityforms"),__("Colorado","gravityforms"),__("Connecticut","gravityforms"),__("Delaware","gravityforms"),
+ __("District of Columbia", "gravityforms"), __("Florida","gravityforms"),__("Georgia","gravityforms"),
+ __("Hawaii","gravityforms"),__("Idaho","gravityforms"),__("Illinois","gravityforms"),__("Indiana","gravityforms"),
+ __("Iowa","gravityforms"),__("Kansas","gravityforms"),__("Kentucky","gravityforms"),__("Louisiana","gravityforms"),
+ __("Maine","gravityforms"),__("Maryland","gravityforms"),__("Massachusetts","gravityforms"),__("Michigan","gravityforms"),
+ __("Minnesota","gravityforms"),__("Mississippi","gravityforms"),__("Missouri","gravityforms"),__("Montana","gravityforms"),
+ __("Nebraska","gravityforms"),__("Nevada","gravityforms"),__("New Hampshire","gravityforms"),__("New Jersey","gravityforms"),
+ __("New Mexico","gravityforms"),__("New York","gravityforms"),__("North Carolina","gravityforms"),
+ __("North Dakota","gravityforms"),__("Ohio","gravityforms"),__("Oklahoma","gravityforms"),__("Oregon","gravityforms"),
+ __("Pennsylvania","gravityforms"),__("Rhode Island","gravityforms"),__("South Carolina","gravityforms"),
+ __("South Dakota","gravityforms"),__("Tennessee","gravityforms"),__("Texas","gravityforms"),__("Utah","gravityforms"),
+ __("Vermont","gravityforms"),__("Virginia","gravityforms"),__("Washington","gravityforms"),__("West Virginia","gravityforms"),
+ __("Wisconsin","gravityforms"),__("Wyoming","gravityforms"), __("Armed Forces Americas","gravityforms"),
+ __("Armed Forces Europe","gravityforms"),__("Armed Forces Pacific","gravityforms"))
+ );
+ }
+
+ public static function get_us_state_code($state_name){
+ $states = array(
+ strtoupper(__("Alabama","gravityforms")) => "AL",
+ strtoupper(__("Alaska","gravityforms")) => "AK",
+ strtoupper(__("Arizona","gravityforms")) => "AZ",
+ strtoupper(__("Arkansas","gravityforms")) => "AR",
+ strtoupper(__("California","gravityforms")) => "CA",
+ strtoupper(__("Colorado","gravityforms")) => "CO",
+ strtoupper(__("Connecticut","gravityforms")) => "CT",
+ strtoupper(__("Delaware","gravityforms")) => "DE",
+ strtoupper(__("District of Columbia", "gravityforms")) => "DC",
+ strtoupper(__("Florida","gravityforms")) => "FL",
+ strtoupper(__("Georgia","gravityforms")) => "GA",
+ strtoupper(__("Hawaii","gravityforms")) => "HI",
+ strtoupper(__("Idaho","gravityforms")) => "ID",
+ strtoupper(__("Illinois","gravityforms")) => "IL",
+ strtoupper(__("Indiana","gravityforms")) => "IN",
+ strtoupper(__("Iowa","gravityforms")) => "IA",
+ strtoupper(__("Kansas","gravityforms")) => "KS",
+ strtoupper(__("Kentucky","gravityforms")) => "KY",
+ strtoupper(__("Louisiana","gravityforms")) => "LA",
+ strtoupper(__("Maine","gravityforms")) => "ME",
+ strtoupper(__("Maryland","gravityforms")) => "MD",
+ strtoupper(__("Massachusetts","gravityforms")) => "MA",
+ strtoupper(__("Michigan","gravityforms")) => "MI",
+ strtoupper(__("Minnesota","gravityforms")) => "MN",
+ strtoupper(__("Mississippi","gravityforms")) => "MS",
+ strtoupper(__("Missouri","gravityforms")) => "MO",
+ strtoupper(__("Montana","gravityforms")) => "MT",
+ strtoupper(__("Nebraska","gravityforms")) => "NE",
+ strtoupper(__("Nevada","gravityforms")) => "NV",
+ strtoupper(__("New Hampshire","gravityforms")) => "NH",
+ strtoupper(__("New Jersey","gravityforms")) => "NJ",
+ strtoupper(__("New Mexico","gravityforms")) => "NM",
+ strtoupper(__("New York","gravityforms")) => "NY",
+ strtoupper(__("North Carolina","gravityforms")) => "NC",
+ strtoupper(__("North Dakota","gravityforms")) => "ND",
+ strtoupper(__("Ohio","gravityforms")) => "OH",
+ strtoupper(__("Oklahoma","gravityforms")) => "OK",
+ strtoupper(__("Oregon","gravityforms")) => "OR",
+ strtoupper(__("Pennsylvania","gravityforms")) => "PA",
+ strtoupper(__("Rhode Island","gravityforms")) => "RI",
+ strtoupper(__("South Carolina","gravityforms")) => "SC",
+ strtoupper(__("South Dakota","gravityforms")) => "SD",
+ strtoupper(__("Tennessee","gravityforms")) => "TN",
+ strtoupper(__("Texas","gravityforms")) => "TX",
+ strtoupper(__("Utah","gravityforms")) => "UT",
+ strtoupper(__("Vermont","gravityforms")) => "VT",
+ strtoupper(__("Virginia","gravityforms")) => "VA",
+ strtoupper(__("Washington","gravityforms")) => "WA",
+ strtoupper(__("West Virginia","gravityforms")) => "WV",
+ strtoupper(__("Wisconsin","gravityforms")) => "WI",
+ strtoupper(__("Wyoming","gravityforms")) => "WY",
+ strtoupper(__("Armed Forces Americas","gravityforms")) => "AA",
+ strtoupper(__("Armed Forces Europe","gravityforms")) => "AE",
+ strtoupper(__("Armed Forces Pacific","gravityforms")) => "AP"
+ );
+
+ $code = isset($states[strtoupper($state_name)]) ? $states[strtoupper($state_name)] : strtoupper($state_name);
+
+ return $code;
+ }
+
+
+ public static function get_canadian_provinces(){
+ return array(__("Alberta","gravityforms"),__("British Columbia","gravityforms"),__("Manitoba","gravityforms"),__("New Brunswick","gravityforms"),__("Newfoundland & Labrador","gravityforms"),__("Northwest Territories","gravityforms"),__("Nova Scotia","gravityforms"),__("Nunavut","gravityforms"),__("Ontario","gravityforms"),__("Prince Edward Island","gravityforms"),__("Quebec","gravityforms"),__("Saskatchewan","gravityforms"),__("Yukon","gravityforms"));
+
+ }
+
+ public static function get_state_dropdown($states, $selected_state=""){
+ $str = "";
+ foreach($states as $code => $state){
+ if(is_numeric($code))
+ $code = $state;
+
+ $selected = $code == $selected_state ? "selected='selected'" : "";
+ $str .= "" . $state . " ";
+ }
+ return $str;
+ }
+
+ public static function get_us_state_dropdown($selected_state = ""){
+ $states = array_merge(array(''), self::get_us_states());
+ foreach($states as $code => $state){
+ if(is_numeric($code))
+ $code = $state;
+
+ $selected = $code == $selected_state ? "selected='selected'" : "";
+ $str .= "" . $state . " ";
+ }
+ return $str;
+ }
+
+ public static function get_canadian_provinces_dropdown($selected_province = ""){
+ $states = array_merge(array(''), self::get_canadian_provinces());
+ foreach($states as $state){
+ $selected = $state == $selected_province ? "selected='selected'" : "";
+ $str .= "" . $state . " ";
+ }
+ return $str;
+ }
+
+ public static function get_country_dropdown($selected_country = ""){
+ $str = "";
+ $countries = array_merge(array(''), self::get_countries());
+ foreach($countries as $code => $country){
+ if(is_numeric($code))
+ $code = $country;
+
+ $selected = $code == $selected_country ? "selected='selected'" : "";
+ $str .= "" . $country . " ";
+ }
+ return $str;
+ }
+
+ public static function is_post_field($field){
+ return in_array($field["type"], array("post_title", "post_tags", "post_category", "post_custom_field", "post_content", "post_excerpt", "post_image"));
+ }
+
+ public static function get_range_message($field){
+ $min = $field["rangeMin"];
+ $max = $field["rangeMax"];
+ $message = "";
+
+ if(is_numeric($min) && is_numeric($max))
+ $message = sprintf(__("Please enter a value between %s and %s.", "gravityforms"), "$min ", "$max ") ;
+ else if(is_numeric($min))
+ $message = sprintf(__("Please enter a value greater than or equal to %s.", "gravityforms"), "$min ");
+ else if(is_numeric($max))
+ $message = sprintf(__("Please enter a value less than or equal to %s.", "gravityforms"), "$max ");
+ else if($field["failed_validation"])
+ $message = __("Please enter a valid number", "gravityforms");
+
+ return $message;
+ }
+
+ public static function get_fields_by_type($form, $types){
+ $fields = array();
+ if(!is_array(rgar($form,"fields")))
+ return $fields;
+
+ foreach($form["fields"] as $field){
+ if(in_array(rgar($field,"type"), $types))
+ $fields[] = $field;
+ }
+ return $fields;
+ }
+
+ public static function has_pages($form){
+ return sizeof(self::get_fields_by_type($form, array("page"))) > 0;
+ }
+
+ public static function get_product_fields_by_type($form, $types, $product_id){
+ global $_product_fields;
+ $key = json_encode($types) . "_" . $product_id . "_" . $form["id"];
+ if(!isset($_product_fields[$key])){
+ $fields = array();
+ for($i=0, $count=sizeof($form["fields"]); $i<$count; $i++){
+ $field = $form["fields"][$i];
+ if(in_array($field["type"], $types) && $field["productField"] == $product_id){
+ $fields[] = $field;
+ }
+ }
+ $_product_fields[$key] = $fields;
+ }
+ return $_product_fields[$key];
+ }
+
+ private static function get_month_dropdown($name="", $id="", $selected_value="", $tabindex="", $disabled_text=""){
+ return self::get_number_dropdown($name, $id, $selected_value, $tabindex, $disabled_text, __("Month", "gravityforms"), 1, 12);
+ }
+
+ private static function get_day_dropdown($name="", $id="", $selected_value="", $tabindex="", $disabled_text=""){
+ return self::get_number_dropdown($name, $id, $selected_value, $tabindex, $disabled_text, __("Day", "gravityforms"), 1, 31);
+ }
+
+ private static function get_year_dropdown($name="", $id="", $selected_value="", $tabindex="", $disabled_text=""){
+ $year_min = apply_filters("gform_date_min_year", "1920");
+ $year_max = apply_filters("gform_date_max_year", date("Y") + 1);
+ return self::get_number_dropdown($name, $id, $selected_value, $tabindex, $disabled_text, __("Year", "gravityforms"), $year_max, $year_min);
+ }
+
+ private static function get_number_dropdown($name, $id, $selected_value, $tabindex, $disabled_text, $placeholder, $start_number, $end_number){
+ $str = "";
+ if($placeholder !== false)
+ $str .= "{$placeholder} ";
+
+ $increment = $start_number < $end_number ? 1 : -1;
+
+ for($i=$start_number; $i!= ($end_number + $increment); $i += $increment){
+ $selected = intval($i) == intval($selected_value) ? "selected='selected'" : "";
+ $str .= "{$i} ";
+ }
+ $str .= " ";
+ return $str;
+ }
+
+ private static function get_logic_event($field, $event){
+ if(empty($field["conditionalLogicFields"]) || IS_ADMIN)
+ return "";
+
+ switch($event){
+ case "keyup" :
+ return "onchange='gf_apply_rules(" . $field["formId"] . "," . GFCommon::json_encode($field["conditionalLogicFields"]) . ");' onkeyup='clearTimeout(__gf_timeout_handle); __gf_timeout_handle = setTimeout(\"gf_apply_rules(" . $field["formId"] . "," . GFCommon::json_encode($field["conditionalLogicFields"]) . ")\", 300);'";
+ break;
+
+ case "click" :
+ return "onclick='gf_apply_rules(" . $field["formId"] . "," . GFCommon::json_encode($field["conditionalLogicFields"]) . ");'";
+ break;
+
+ case "change" :
+ return "onchange='gf_apply_rules(" . $field["formId"] . "," . GFCommon::json_encode($field["conditionalLogicFields"]) . ");'";
+ break;
+ }
+ }
+
+ public static function has_field_calculation($field) {
+
+ if($field['type'] == 'number') {
+ return rgar($field, 'enableCalculation') && rgar($field, 'calculationFormula');
+ }
+
+ return RGFormsModel::get_input_type($field) == 'calculation';
+ }
+
+ public static function get_field_input($field, $value="", $lead_id=0, $form_id=0){
+
+ $id = $field["id"];
+ $field_id = IS_ADMIN || $form_id == 0 ? "input_$id" : "input_" . $form_id . "_$id";
+ $form_id = IS_ADMIN && empty($form_id) ? rgget("id") : $form_id;
+
+ $size = rgar($field, "size");
+ $disabled_text = (IS_ADMIN && RG_CURRENT_VIEW != "entry") ? "disabled='disabled'" : "";
+ $class_suffix = RG_CURRENT_VIEW == "entry" ? "_admin" : "";
+ $class = $size . $class_suffix;
+
+ $currency = "";
+ if(RG_CURRENT_VIEW == "entry"){
+ $lead = RGFormsModel::get_lead($lead_id);
+ $post_id = $lead["post_id"];
+ $post_link = "";
+ if(is_numeric($post_id) && self::is_post_field($field)){
+ $post_link = "You can edit this post from the post page.";
+ }
+ $currency = $lead["currency"];
+ }
+
+ $field_input = apply_filters("gform_field_input", "", $field, $value, $lead_id, $form_id);
+ if($field_input)
+ return $field_input;
+
+ //product fields are not editable
+ if(RG_CURRENT_VIEW == "entry" && self::is_product_field($field["type"]))
+ return "" . __("Product fields are not editable", "gravityforms") . "
";
+
+ else if(RG_CURRENT_VIEW == "entry" && $field["type"] == "donation")
+ return "" . __("Donations are not editable", "gravityforms") . "
";
+
+ // add categories as choices for Post Category field
+ if($field['type'] == 'post_category'){
+ $field = self::add_categories_as_choices($field, $value);
+ }
+
+ $max_length = "";
+ $html5_attributes = "";
+
+ switch(RGFormsModel::get_input_type($field)){
+
+ case "total" :
+ if(RG_CURRENT_VIEW == "entry")
+ return "
";
+ else
+ return "" . self::to_money("0") . "
";
+ break;
+
+ case "calculation" :
+ case "singleproduct" :
+
+ $product_name = !is_array($value) || empty($value[$field["id"] . ".1"]) ? esc_attr($field["label"]) : esc_attr($value[$field["id"] . ".1"]);
+ $price = !is_array($value) || empty($value[$field["id"] . ".2"]) ? rgget("basePrice", $field) : esc_attr($value[$field["id"] . ".2"]);
+ $quantity = is_array($value) ? esc_attr($value[$field["id"] . ".3"]) : "";
+
+ if(empty($price))
+ $price = 0;
+
+ $form = RGFormsModel::get_form_meta($form_id);
+ $has_quantity = sizeof(GFCommon::get_product_fields_by_type($form, array("quantity"), $field["id"])) > 0;
+ if($has_quantity)
+ $field["disableQuantity"] = true;
+
+ $quantity_field = "";
+
+ $qty_input_type = GFFormsModel::is_html5_enabled() ? "number" : "text";
+
+ if(IS_ADMIN){
+ $style = rgget("disableQuantity", $field) ? "style='display:none;'" : "";
+ $quantity_field = " " . apply_filters("gform_product_quantity_{$form_id}",apply_filters("gform_product_quantity",__("Quantity:", "gravityforms"), $form_id), $form_id) . " ";
+ }
+ else if(!rgget("disableQuantity", $field)){
+ $tabindex = self::get_tabindex();
+ $quantity_field .= " " . apply_filters("gform_product_quantity_{$form_id}",apply_filters("gform_product_quantity",__("Quantity:", "gravityforms"), $form_id), $form_id) . " ";
+ }
+ else{
+ if(!is_numeric($quantity))
+ $quantity = 1;
+
+ if(!$has_quantity){
+ $quantity_field .= " ";
+ }
+ }
+
+ return "" . apply_filters("gform_product_price_{$form_id}", apply_filters("gform_product_price",__("Price", "gravityforms"), $form_id), $form_id) . ": " . esc_html(GFCommon::to_money($price, $currency)) ." {$quantity_field}
";
+
+ break;
+
+ case "hiddenproduct" :
+
+ $form = RGFormsModel::get_form_meta($form_id);
+ $has_quantity_field = sizeof(GFCommon::get_product_fields_by_type($form, array("quantity"), $field["id"])) > 0;
+
+ $product_name = !is_array($value) || empty($value[$field["id"] . ".1"]) ? esc_attr($field["label"]) : esc_attr($value[$field["id"] . ".1"]);
+ $quantity = is_array($value) ? esc_attr($value[$field["id"] . ".3"]) : "1";
+ $price = !is_array($value) || empty($value[$field["id"] . ".2"]) ? rgget("basePrice", $field) : esc_attr($value[$field["id"] . ".2"]);
+ if(empty($price))
+ $price = 0;
+
+ $quantity_field = $has_quantity_field ? "" : " ";
+ $product_name_field = " ";
+
+ $field_type = IS_ADMIN ? "text" : "hidden";
+
+ return $quantity_field . $product_name_field . sprintf(" ", $id, esc_attr($price), $disabled_text);
+
+ break;
+
+ case "singleshipping" :
+
+ $price = !empty($value) ? $value : rgget("basePrice", $field);
+ if(empty($price))
+ $price = 0;
+
+ return "" . GFCommon::to_money($price, $currency) ."
";
+
+ break;
+
+ case "website":
+ $is_html5 = RGFormsModel::is_html5_enabled();
+ $value = empty($value) && !$is_html5 ? "http://" : $value;
+ $html_input_type = $is_html5 ? "url" : "text";
+ $html5_attributes = $is_html5 ? "placeholder='http://'" : "";
+ case "text":
+ if(empty($html_input_type))
+ $html_input_type = "text";
+
+ if(rgget("enablePasswordInput", $field) && RG_CURRENT_VIEW != "entry")
+ $html_input_type = "password";
+
+ if(is_numeric(rgget("maxLength", $field)))
+ $max_length = "maxlength='{$field["maxLength"]}'";
+
+ if(!empty($post_link))
+ return $post_link;
+
+ $logic_event = self::get_logic_event($field, "keyup");
+
+ $tabindex = self::get_tabindex();
+ return sprintf("
", $id, $field_id, $html_input_type, esc_attr($value), esc_attr($class), $disabled_text);
+ break;
+
+ case "email":
+
+ if(!empty($post_link))
+ return $post_link;
+
+ $html_input_type = RGFormsModel::is_html5_enabled() ? "email" : "text";
+
+ if(IS_ADMIN && RG_CURRENT_VIEW != "entry"){
+ $single_style = rgget("emailConfirmEnabled", $field) ? "style='display:none;'" : "";
+ $confirm_style = rgget("emailConfirmEnabled", $field) ? "" : "style='display:none;'";
+ return "";
+ }
+ else{
+ $logic_event = self::get_logic_event($field, "keyup");
+
+ if(rgget("emailConfirmEnabled", $field) && RG_CURRENT_VIEW != "entry"){
+ $first_tabindex = self::get_tabindex();
+ $last_tabindex = self::get_tabindex();
+ return "";
+ }
+ else{
+ $tabindex = self::get_tabindex();
+ return sprintf("
", $id, $field_id, $html_input_type, esc_attr($value), esc_attr($class), $disabled_text);
+ }
+ }
+
+ break;
+ case "honeypot":
+ $autocomplete = RGFormsModel::is_html5_enabled() ? "autocomplete='off'" : "";
+ return "
";
+ break;
+
+ case "hidden" :
+ if(!empty($post_link))
+ return $post_link;
+
+ $field_type = IS_ADMIN ? "text" : "hidden";
+ $class_attribute = IS_ADMIN ? "" : "class='gform_hidden'";
+
+ return sprintf(" ", $id, $field_id, esc_attr($value), $disabled_text);
+ break;
+
+ case "html" :
+ $content = IS_ADMIN ? "" . __("This is a content placeholder. HTML content is not displayed in the form admin. Preview this form to view the content.", "gravityforms") . "
" : $field["content"];
+ $content = GFCommon::replace_variables_prepopulate($content); //adding support for merge tags
+ $content = do_shortcode($content); //adding support for shortcodes
+ return $content;
+ break;
+
+ case "adminonly_hidden" :
+ if(!is_array($field["inputs"])){
+ if(is_array($value))
+ $value = json_encode($value);
+ return sprintf(" ", $id, $field_id, esc_attr($value));
+ }
+
+
+ $fields = "";
+ foreach($field["inputs"] as $input){
+ $fields .= sprintf(" ", $input["id"], esc_attr(rgar($value, strval($input["id"]))));
+ }
+ return $fields;
+ break;
+
+ case "number" :
+ if(!empty($post_link))
+ return $post_link;
+
+ $instruction = "";
+ $read_only = "";
+
+ if(!IS_ADMIN){
+
+ if(GFCommon::has_field_calculation($field)) {
+
+ // calculation-enabled fields should be read only
+ $read_only = 'readonly="readonly"';
+
+ } else {
+
+ $message = self::get_range_message($field);
+ $validation_class = $field["failed_validation"] ? "validation_message" : "";
+
+ if(!$field["failed_validation"] && !empty($message) && empty($field["errorMessage"]))
+ $instruction = "" . $message . "
";
+
+ }
+
+ }
+ else if( RG_CURRENT_VIEW == "entry" ){
+ $value = GFCommon::format_number($value, rgar($field, "numberFormat"));
+ }
+
+ $is_html5 = RGFormsModel::is_html5_enabled();
+ $html_input_type = $is_html5 && !GFCommon::has_field_calculation($field) && ($field["numberFormat"] != "currency" && $field["numberFormat"] != "decimal_comma" ) ? "number" : "text"; // chrome does not allow number fields to have commas, calculations and currency values display numbers with commas
+ $step_attr = $is_html5 ? "step='any'" : "";
+
+ $logic_event = self::get_logic_event($field, "keyup");
+
+ $value = GFCommon::format_number($value, $field["numberFormat"]);
+
+ $tabindex = self::get_tabindex();
+ return sprintf(" %s
", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text, $instruction);
+
+ case "donation" :
+ $tabindex = self::get_tabindex();
+ return sprintf("
", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
+
+ case "price" :
+ $logic_event = self::get_logic_event($field, "keyup");
+
+ $tabindex = self::get_tabindex();
+ return sprintf("
", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
+
+ case "phone" :
+ if(!empty($post_link))
+ return $post_link;
+
+ $instruction = $field["phoneFormat"] == "standard" ? __("Phone format:", "gravityforms") . " (###)###-####" : "";
+ $instruction_div = rgget("failed_validation", $field) && !empty($instruction) ? "$instruction
" : "";
+ $html_input_type = RGFormsModel::is_html5_enabled() ? "tel" : "text";
+ $logic_event = self::get_logic_event($field, "keyup");
+
+ $tabindex = self::get_tabindex();
+ return sprintf(" {$instruction_div}
", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
+
+ case "textarea":
+ $max_chars = "";
+ $logic_event = self::get_logic_event($field, "keyup");
+
+ $tabindex = self::get_tabindex();
+ return sprintf("
{$max_chars}", $id, $field_id, esc_attr($class), $disabled_text, esc_html($value));
+
+ case "post_title":
+ case "post_tags":
+ case "post_custom_field":
+ $tabindex = self::get_tabindex();
+ $logic_event = self::get_logic_event($field, "keyup");
+
+ return !empty($post_link) ? $post_link : sprintf("
", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
+ break;
+
+ case "post_content":
+ case "post_excerpt":
+ $max_chars = "";
+ $logic_event = self::get_logic_event($field, "keyup");
+
+ $tabindex = self::get_tabindex();
+ return !empty($post_link) ? $post_link : sprintf("
{$max_chars}", $id, $field_id, esc_attr($class), $disabled_text, esc_html($value));
+ break;
+
+ case "post_category" :
+ if(!empty($post_link))
+ return $post_link;
+
+ if(rgget("displayAllCategories", $field) && !IS_ADMIN){
+ $default_category = rgget("categoryInitialItemEnabled", $field) ? "-1" : get_option('default_category');
+ $selected = empty($value) ? $default_category : $value;
+ $args = array('echo' => 0, 'selected' => $selected, "class" => esc_attr($class) . " gfield_select", 'hide_empty' => 0, 'name' => "input_$id", 'orderby' => 'name', 'hierarchical' => true );
+ if(self::$tab_index > 0)
+ $args["tab_index"] = self::$tab_index++;
+
+ if(rgget("categoryInitialItemEnabled", $field)){
+ $args["show_option_none"] = empty($field["categoryInitialItem"]) ? " " : $field["categoryInitialItem"];
+ }
+
+ $args = apply_filters("gform_post_category_args_{$field["id"]}", apply_filters("gform_post_category_args", $args, $field), $field);
+
+ return "" . wp_dropdown_categories($args) . "
";
+ }
+ else{
+ $tabindex = self::get_tabindex();
+ if(is_array(rgar($field, "choices")))
+ usort($field["choices"], create_function('$a,$b', 'return strcmp($a["text"], $b["text"]);'));
+
+ $choices = self::get_select_choices($field, $value);
+
+ //Adding first option
+ if(rgget("categoryInitialItemEnabled", $field)){
+ $selected = empty($value) ? "selected='selected'" : "";
+ $choices = "{$field["categoryInitialItem"]} " . $choices;
+ }
+
+ return sprintf("%s
", $id, $field_id, esc_attr($class), $disabled_text, $choices);
+ }
+ break;
+
+ case "post_image" :
+ if(!empty($post_link))
+ return $post_link;
+
+ $title = esc_attr(rgget($field["id"] . ".1", $value));
+ $caption = esc_attr(rgget($field["id"] . ".4", $value));
+ $description = esc_attr(rgget($field["id"] . ".7", $value));
+
+ //hidding meta fields for admin
+ $hidden_style = "style='display:none;'";
+ $title_style = !rgget("displayTitle", $field) && IS_ADMIN ? $hidden_style : "";
+ $caption_style = !rgget("displayCaption", $field) && IS_ADMIN ? $hidden_style : "";
+ $description_style = !rgget("displayDescription", $field) && IS_ADMIN ? $hidden_style : "";
+ $file_label_style = IS_ADMIN && !(rgget("displayTitle", $field) || rgget("displayCaption", $field) || rgget("displayDescription", $field)) ? $hidden_style : "";
+
+ $hidden_class = $preview = "";
+ $file_info = RGFormsModel::get_temp_filename($form_id, "input_{$id}");
+ if($file_info){
+ $hidden_class = " gform_hidden";
+ $file_label_style = $hidden_style;
+ $preview = "" . esc_html($file_info["uploaded_filename"]) . " | " . __("delete", "gravityforms") . " ";
+ }
+
+ //in admin, render all meta fields to allow for immediate feedback, but hide the ones not selected
+ $file_label = (IS_ADMIN || rgget("displayTitle", $field) || rgget("displayCaption", $field) || rgget("displayDescription", $field)) ? "" . apply_filters("gform_postimage_file_{$form_id}",apply_filters("gform_postimage_file",__("File", "gravityforms"), $form_id), $form_id) . " " : "";
+
+ $tabindex = self::get_tabindex();
+ $upload = sprintf("{$preview} $file_label ", $id, $field_id, esc_attr($value), esc_attr($class . $hidden_class), $disabled_text);
+
+ $tabindex = self::get_tabindex();
+ $title_field = rgget("displayTitle", $field) || IS_ADMIN ? sprintf("" . apply_filters("gform_postimage_title_{$form_id}",apply_filters("gform_postimage_title",__("Title", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $title, $disabled_text, $field_id) : "";
+
+ $tabindex = self::get_tabindex();
+ $caption_field = rgget("displayCaption", $field) || IS_ADMIN ? sprintf("" . apply_filters("gform_postimage_caption_{$form_id}",apply_filters("gform_postimage_caption",__("Caption", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $caption, $disabled_text, $field_id) : "";
+
+ $tabindex = self::get_tabindex();
+ $description_field = rgget("displayDescription", $field) || IS_ADMIN? sprintf("" . apply_filters("gform_postimage_description_{$form_id}",apply_filters("gform_postimage_description",__("Description", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $description, $disabled_text, $field_id) : "";
+
+ return "" . $upload . $title_field . $caption_field . $description_field . "
";
+
+ break;
+
+ case "multiselect" :
+ if(!empty($post_link))
+ return $post_link;
+
+ $placeholder = rgar($field, "enableEnhancedUI") ? "data-placeholder='" . esc_attr(apply_filters("gform_multiselect_placeholder_{$form_id}", apply_filters("gform_multiselect_placeholder", __("Click to select...", "gravityforms"), $form_id), $form_id)) . "'" : "";
+ $logic_event = self::get_logic_event($field, "keyup");
+ $css_class = trim(esc_attr($class) . " gfield_select");
+ $size = rgar($field, "multiSelectSize");
+ if(empty($size))
+ $size = 7;
+
+ $tabindex = self::get_tabindex();
+ return sprintf("%s
", $id, $field_id, $css_class, $disabled_text, self::get_select_choices($field, $value));
+
+ break;
+
+ case "select" :
+ if(!empty($post_link))
+ return $post_link;
+
+ $logic_event = self::get_logic_event($field, "change");
+ $css_class = trim(esc_attr($class) . " gfield_select");
+ $tabindex = self::get_tabindex();
+ return sprintf("%s
", $id, $field_id, $css_class, $disabled_text, self::get_select_choices($field, $value));
+
+ case "checkbox" :
+ if(!empty($post_link))
+ return $post_link;
+
+ return sprintf("", $field_id, self::get_checkbox_choices($field, $value, $disabled_text));
+
+ case "radio" :
+ if(!empty($post_link))
+ return $post_link;
+
+ return sprintf("", $field_id, self::get_radio_choices($field, $value, $disabled_text));
+
+ case "password" :
+
+ $first_tabindex = self::get_tabindex();
+ $last_tabindex = self::get_tabindex();
+
+ $strength_style = !rgar($field,"passwordStrengthEnabled") ? "style='display:none;'" : "";
+ $strength = rgar($field,"passwordStrengthEnabled") || IS_ADMIN ? "" . __("Strength indicator", "gravityforms") . "
" : "";
+
+ $action = !IS_ADMIN ? "gformShowPasswordStrength(\"$field_id\");" : "";
+ $onchange= rgar($field,"passwordStrengthEnabled") ? "onchange='{$action}'" : "";
+ $onkeyup = rgar($field,"passwordStrengthEnabled") ? "onkeyup='{$action}'" : "";
+
+ $pass = RGForms::post("input_" . $id ."_2");
+ return sprintf("{$strength}", $id, $field_id, esc_attr($value), $disabled_text, $field_id, $id, $field_id, esc_attr($pass), $disabled_text, $field_id);
+
+ case "name" :
+ $prefix = "";
+ $first = "";
+ $last = "";
+ $suffix = "";
+ if(is_array($value)){
+ $prefix = esc_attr(RGForms::get($field["id"] . ".2", $value));
+ $first = esc_attr(RGForms::get($field["id"] . ".3", $value));
+ $last = esc_attr(RGForms::get($field["id"] . ".6", $value));
+ $suffix = esc_attr(RGForms::get($field["id"] . ".8", $value));
+ }
+ switch(rgget("nameFormat", $field)){
+
+ case "extended" :
+ $prefix_tabindex = self::get_tabindex();
+ $first_tabindex = self::get_tabindex();
+ $last_tabindex = self::get_tabindex();
+ $suffix_tabindex = self::get_tabindex();
+ return sprintf("" . apply_filters("gform_name_prefix_{$form_id}",apply_filters("gform_name_prefix",__("Prefix", "gravityforms"), $form_id), $form_id) . " " . apply_filters("gform_name_first_{$form_id}",apply_filters("gform_name_first",__("First", "gravityforms"), $form_id), $form_id) . " " . apply_filters("gform_name_last_{$form_id}", apply_filters("gform_name_last", __("Last", "gravityforms"), $form_id), $form_id) . " " . apply_filters("gform_name_suffix_{$form_id}", apply_filters("gform_name_suffix", __("Suffix", "gravityforms"), $form_id), $form_id) . "
", $id, $field_id, $prefix, $disabled_text, $field_id, $id, $field_id, $first, $disabled_text, $field_id, $id, $field_id, $last, $disabled_text, $field_id, $id, $field_id, $suffix, $disabled_text, $field_id);
+
+ case "simple" :
+ $tabindex = self::get_tabindex();
+ return sprintf("
", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
+
+ default :
+ $first_tabindex = self::get_tabindex();
+ $last_tabindex = self::get_tabindex();
+ return sprintf("", $id, $field_id, $first, $disabled_text, $field_id, $id, $field_id, $last, $disabled_text, $field_id);
+ }
+
+ case "address" :
+ $street_value ="";
+ $street2_value ="";
+ $city_value ="";
+ $state_value ="";
+ $zip_value ="";
+ $country_value ="";
+
+ if(is_array($value)){
+ $street_value = esc_attr(rgget($field["id"] . ".1",$value));
+ $street2_value = esc_attr(rgget($field["id"] . ".2",$value));
+ $city_value = esc_attr(rgget($field["id"] . ".3",$value));
+ $state_value = esc_attr(rgget($field["id"] . ".4",$value));
+ $zip_value = esc_attr(rgget($field["id"] . ".5",$value));
+ $country_value = esc_attr(rgget($field["id"] . ".6",$value));
+ }
+
+ $address_types = self::get_address_types($form_id);
+ $addr_type = empty($field["addressType"]) ? "international" : $field["addressType"];
+ $address_type = $address_types[$addr_type];
+
+ $state_label = empty($address_type["state_label"]) ? __("State", "gravityforms") : $address_type["state_label"];
+ $zip_label = empty($address_type["zip_label"]) ? __("Zip Code", "gravityforms") : $address_type["zip_label"];
+ $hide_country = !empty($address_type["country"]) || rgget("hideCountry", $field);
+
+ if(empty($country_value))
+ $country_value = rgget("defaultCountry", $field);
+
+ if(empty($state_value))
+ $state_value = rgget("defaultState", $field);
+
+ $country_list = self::get_country_dropdown($country_value);
+
+ //changing css classes based on field format to ensure proper display
+ $address_display_format = apply_filters("gform_address_display_format", "default");
+ $city_location = $address_display_format == "zip_before_city" ? "right" : "left";
+ $zip_location = $address_display_format != "zip_before_city" && rgar($field,"hideState") ? "right" : "left";
+ $state_location = $address_display_format == "zip_before_city" ? "left" : "right";
+ $country_location = rgar($field,"hideState") ? "left" : "right";
+
+ //address field
+ $tabindex = self::get_tabindex();
+ $street_address = sprintf("" . apply_filters("gform_address_street_{$form_id}", apply_filters("gform_address_street",__("Street Address", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $street_value, $disabled_text, $field_id);
+
+ //address line 2 field
+ $street_address2 = "";
+ $style = (IS_ADMIN && rgget("hideAddress2", $field)) ? "style='display:none;'" : "";
+ if(IS_ADMIN || !rgget("hideAddress2", $field)){
+ $tabindex = self::get_tabindex();
+ $street_address2 = sprintf("" . apply_filters("gform_address_street2_{$form_id}",apply_filters("gform_address_street2",__("Address Line 2", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $street2_value, $disabled_text, $field_id);
+ }
+
+ if($address_display_format == "zip_before_city"){
+ //zip field
+ $tabindex = self::get_tabindex();
+ $zip = sprintf("" . apply_filters("gform_address_zip_{$form_id}", apply_filters("gform_address_zip", $zip_label, $form_id), $form_id) . " ", $id, $field_id, $zip_value, $disabled_text, $field_id);
+
+ //city field
+ $tabindex = self::get_tabindex();
+ $city = sprintf("" . apply_filters("gform_address_city_{$form_id}", apply_filters("gform_address_city",__("City", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $city_value, $disabled_text, $field_id);
+
+ //state field
+ $style = (IS_ADMIN && rgget("hideState", $field)) ? "style='display:none;'" : "";
+ if(IS_ADMIN || !rgget("hideState", $field)){
+ $state_field = self::get_state_field($field, $id, $field_id, $state_value, $disabled_text, $form_id);
+ $state = sprintf("$state_field" . apply_filters("gform_address_state_{$form_id}", apply_filters("gform_address_state", $state_label, $form_id), $form_id) . " ", $field_id);
+ }
+ else{
+ $state = sprintf(" ", $id, $field_id, $state_value);
+ }
+ }
+ else{
+
+ //city field
+ $tabindex = self::get_tabindex();
+ $city = sprintf("" . apply_filters("gform_address_city_{$form_id}", apply_filters("gform_address_city",__("City", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $city_value, $disabled_text, $field_id);
+
+ //state field
+ $style = (IS_ADMIN && rgget("hideState", $field)) ? "style='display:none;'" : "";
+ if(IS_ADMIN || !rgget("hideState", $field)){
+ $state_field = self::get_state_field($field, $id, $field_id, $state_value, $disabled_text, $form_id);
+ $state = sprintf("$state_field" . apply_filters("gform_address_state_{$form_id}", apply_filters("gform_address_state", $state_label, $form_id), $form_id) . " ", $field_id);
+ }
+ else{
+ $state = sprintf(" ", $id, $field_id, $state_value);
+ }
+
+ //zip field
+ $tabindex = self::get_tabindex();
+ $zip = sprintf("" . apply_filters("gform_address_zip_{$form_id}", apply_filters("gform_address_zip", $zip_label, $form_id), $form_id) . " ", $id, $field_id, $zip_value, $disabled_text, $field_id);
+
+ }
+
+ if(IS_ADMIN || !$hide_country){
+ $style = $hide_country ? "style='display:none;'" : "";
+ $tabindex = self::get_tabindex();
+ $country = sprintf("%s " . apply_filters("gform_address_country_{$form_id}", apply_filters("gform_address_country",__("Country", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $disabled_text, $country_list, $field_id);
+ }
+ else{
+ $country = sprintf(" ", $id, $field_id, $country_value);
+ }
+
+ $inputs = $address_display_format == "zip_before_city" ? $street_address . $street_address2 . $zip . $city . $state . $country : $street_address . $street_address2 . $city . $state . $zip . $country;
+
+ return "";
+
+ case "date" :
+ if(!empty($post_link))
+ return $post_link;
+
+ $format = empty($field["dateFormat"]) ? "mdy" : esc_attr($field["dateFormat"]);
+ $field_position = substr($format, 0, 3);
+ if(IS_ADMIN && RG_CURRENT_VIEW != "entry"){
+ $datepicker_display = in_array(rgget("dateType", $field), array("datefield", "datedropdown")) ? "none" : "inline";
+ $datefield_display = rgget("dateType", $field) == "datefield" ? "inline" : "none";
+ $dropdown_display = rgget("dateType", $field) == "datedropdown" ? "inline" : "none";
+ $icon_display = rgget("calendarIconType", $field) == "calendar" ? "inline" : "none";
+
+ $month_field = "" . __("MM", "gravityforms") . "
";
+ $day_field = "" . __("DD", "gravityforms") . "
";
+ $year_field = "" . __("YYYY", "gravityforms") . "
";
+
+ $month_dropdown = "" . self::get_month_dropdown("","","","","disabled='disabled'") . "
";
+ $day_dropdown = "" . self::get_day_dropdown("","","","","disabled='disabled'") . "
";
+ $year_dropdown = "" . self::get_year_dropdown("","","","","disabled='disabled'") . "
";
+
+ $field_string ="";
+
+ switch($field_position){
+ case "dmy" :
+ $field_string .= $day_field . $month_field . $year_field . $day_dropdown . $month_dropdown . $year_dropdown;
+ break;
+
+ case "ymd" :
+ $field_string .= $year_field . $month_field . $day_field . $year_dropdown . $month_dropdown . $day_dropdown;
+ break;
+
+ default :
+ $field_string .= $month_field . $day_field . $year_field . $month_dropdown . $day_dropdown . $year_dropdown;
+ break;
+ }
+
+ return $field_string;
+ }
+ else{
+ $date_info = self::parse_date($value, $format);
+ $date_type = rgget("dateType", $field);
+ if(in_array($date_type, array("datefield", "datedropdown")))
+ {
+ switch($field_position){
+
+ case "dmy" :
+ $tabindex = self::get_tabindex();
+ $field_str = $date_type == "datedropdown"
+ ? "" . self::get_day_dropdown("input_{$id}[]", "{$field_id}_2", rgar($date_info,"day"), $tabindex, $disabled_text) . "
"
+ : sprintf("
" . __("DD", "gravityforms") . "
", $field_id, $id, $field_id, esc_attr(rgget("day", $date_info)), $disabled_text, $field_id);
+
+ $tabindex = self::get_tabindex();
+ $field_str .= $date_type == "datedropdown"
+ ? "
" . self::get_month_dropdown("input_{$id}[]", "{$field_id}_1", rgar($date_info,"month"), $tabindex, $disabled_text) . "
"
+ : sprintf("
" . __("MM", "gravityforms") . "
", $field_id, $id, $field_id, esc_attr(rgget("month", $date_info)), $disabled_text, $field_id);
+
+ $tabindex = self::get_tabindex();
+ $field_str .= $date_type == "datedropdown"
+ ? "
" . self::get_year_dropdown("input_{$id}[]", "{$field_id}_3", rgar($date_info,"year"), $tabindex, $disabled_text) . "
"
+ : sprintf("
" . __("YYYY", "gravityforms") . "
", $field_id, $id, $field_id, esc_attr(rgget("year", $date_info)), $disabled_text, $field_id);
+
+ break;
+
+ case "ymd" :
+ $tabindex = self::get_tabindex();
+ $field_str = $date_type == "datedropdown"
+ ? "" . self::get_year_dropdown("input_{$id}[]", "{$field_id}_3", rgar($date_info,"year"), $tabindex, $disabled_text) . "
"
+ : sprintf("
" . __("YYYY", "gravityforms") . "
", $field_id, $id, $field_id, esc_attr(rgget("year", $date_info)), $disabled_text, $field_id);
+
+ $field_str .= $date_type == "datedropdown"
+ ? "
" . self::get_month_dropdown("input_{$id}[]", "{$field_id}_1", rgar($date_info,"month"), $tabindex, $disabled_text) . "
"
+ : sprintf("
" . __("MM", "gravityforms") . "
", $field_id, $id, $field_id, esc_attr(rgar($date_info,"month")), $disabled_text, $field_id);
+
+ $tabindex = self::get_tabindex();
+ $field_str .= $date_type == "datedropdown"
+ ? "
" . self::get_day_dropdown("input_{$id}[]", "{$field_id}_2", rgar($date_info,"day"), $tabindex, $disabled_text) . "
"
+ : sprintf("
" . __("DD", "gravityforms") . "
", $field_id, $id, $field_id, esc_attr(rgar($date_info,"day")), $disabled_text, $field_id);
+
+ break;
+
+ default :
+ $tabindex = self::get_tabindex();
+
+ $field_str = $date_type == "datedropdown"
+ ? "" . self::get_month_dropdown("input_{$id}[]", "{$field_id}_1", rgar($date_info,"month"), $tabindex, $disabled_text) . "
"
+ : sprintf("
" . __("MM", "gravityforms") . "
", $field_id, $id, $field_id, esc_attr(rgar($date_info,"month")), $disabled_text, $field_id);
+
+ $tabindex = self::get_tabindex();
+ $field_str .= $date_type == "datedropdown"
+ ? "
" . self::get_day_dropdown("input_{$id}[]", "{$field_id}_2", rgar($date_info,"day"), $tabindex, $disabled_text) . "
"
+ : sprintf("
" . __("DD", "gravityforms") . "
", $field_id, $id, $field_id, esc_attr(rgar($date_info,"day")), $disabled_text, $field_id);
+
+ $tabindex = self::get_tabindex();
+ $field_str .= $date_type == "datedropdown"
+ ? "
" . self::get_year_dropdown("input_{$id}[]", "{$field_id}_3", rgar($date_info,"year"), $tabindex, $disabled_text) . "
"
+ : sprintf("
" . __("YYYY", "gravityforms") . "
", $field_id, $id, $field_id, esc_attr(rgget("year", $date_info)), $disabled_text, $field_id);
+
+ break;
+ }
+
+ return $field_str;
+ }
+ else
+ {
+ $value = GFCommon::date_display($value, $format);
+ $icon_class = $field["calendarIconType"] == "none" ? "datepicker_no_icon" : "datepicker_with_icon";
+ $icon_url = empty($field["calendarIconUrl"]) ? GFCommon::get_base_url() . "/images/calendar.png" : $field["calendarIconUrl"];
+ $tabindex = self::get_tabindex();
+ return sprintf("
", $id, $field_id, esc_attr($value), esc_attr($class), $format, $icon_class, $disabled_text);
+ }
+ }
+
+ case "time" :
+ if(!empty($post_link))
+ return $post_link;
+
+ $hour = $minute = $am_selected = $pm_selected = "";
+
+ if(!is_array($value) && !empty($value)){
+ preg_match('/^(\d*):(\d*) ?(.*)$/', $value, $matches);
+ $hour = esc_attr($matches[1]);
+ $minute = esc_attr($matches[2]);
+ $am_selected = rgar($matches,3) == "am" ? "selected='selected'" : "";
+ $pm_selected = rgar($matches,3) == "pm" ? "selected='selected'" : "";
+ }
+ else if(is_array($value)){
+ $hour = esc_attr($value[0]);
+ $minute = esc_attr($value[1]);
+ $am_selected = rgar($value,2) == "am" ? "selected='selected'" : "";
+ $pm_selected = rgar($value,2) == "pm" ? "selected='selected'" : "";
+ }
+ $hour_tabindex = self::get_tabindex();
+ $minute_tabindex = self::get_tabindex();
+ $ampm_tabindex = self::get_tabindex();
+
+ $ampm_field_style = is_admin() && rgar($field, "timeFormat") == "24" ? "style='display:none;'" : "";
+ $ampm_field = is_admin() || rgar($field, "timeFormat") != "24" ? "" . __("AM", "gravityforms") . " " . __("PM", "gravityforms") . "
" : "";
+
+ return sprintf("", $field_id, $id, $field_id, $hour, $disabled_text, $field_id, $id, $field_id, $minute, $disabled_text, $field_id);
+
+ case "fileupload" :
+ $tabindex = self::get_tabindex();
+ $multiple_files = rgar($field, "multipleFiles");
+ $file_list_id = "gform_preview_" . $form_id . "_". $id;
+ $max_upload_size = ! IS_ADMIN && isset($field["maxFileSize"]) && $field["maxFileSize"] > 0 ? $field["maxFileSize"] * 1048576: wp_max_upload_size();
+ if($multiple_files){
+ $upload_action_url = trailingslashit(site_url()) . "?gf_page=upload";
+ $max_files = isset($field["maxFiles"]) && $field["maxFiles"] > 0 ? $field["maxFiles"]: 0;
+ $browse_button_id = 'gform_browse_button_' . $form_id . "_" . $id;
+ $container_id = 'gform_multifile_upload_' . $form_id . "_" . $id;
+ $drag_drop_id = 'gform_drag_drop_area_' . $form_id . "_" . $id;
+
+ $messages_id = "gform_multifile_messages_{$form_id}_{$id}";
+ $allowed_extensions = isset($field["allowedExtensions"]) && !empty($field["allowedExtensions"]) ? join(",", GFCommon::clean_extensions(explode(",", strtolower($field["allowedExtensions"])))) : array();
+ if(empty($allowed_extensions))
+ $allowed_extensions="*";
+ $disallowed_extensions = GFCommon::get_disallowed_file_extensions();
+
+ if( defined('DOING_AJAX') && DOING_AJAX && "rg_change_input_type" === rgpost('action')){
+ $plupload_init = array();
+ } else {
+ $plupload_init = array(
+ 'runtimes' => 'html5,flash,html4',
+ 'browse_button' => $browse_button_id,
+ 'container' => $container_id,
+ 'drop_element' => $drag_drop_id,
+ 'filelist' => $file_list_id,
+ 'unique_names' => true,
+ 'file_data_name' => 'file',
+ /*'chunk_size' => '10mb',*/ // chunking doesn't currently have very good cross-browser support
+ 'url' => $upload_action_url,
+ 'flash_swf_url' => includes_url('js/plupload/plupload.flash.swf'),
+ 'silverlight_xap_url' => includes_url('js/plupload/plupload.silverlight.xap'),
+ 'filters' => array(
+ 'mime_types' => array(array('title' => __( 'Allowed Files', 'gravityforms' ), 'extensions' => $allowed_extensions)),
+ 'max_file_size' => $max_upload_size . 'b'
+ ),
+ 'multipart' => true,
+ 'urlstream_upload' => false,
+ 'multipart_params' => array(
+ "form_id" => $form_id,
+ "field_id" => $id
+ ),
+ 'gf_vars' => array(
+ 'max_files' => $max_files,
+ 'message_id' => $messages_id,
+ 'disallowed_extensions' => $disallowed_extensions
+ )
+ );
+
+ // plupload 2 was introduced in WordPress 3.9. Plupload 1 accepts a slightly different init array.
+ if (version_compare(get_bloginfo('version'), "3.9-RC1", "<")) {
+ $plupload_init['max_file_size'] = $max_upload_size . 'b';
+ $plupload_init['filters'] = array(array('title' => __('Allowed Files', 'gravityforms'), 'extensions' => $allowed_extensions));
+ }
+ }
+
+
+ $plupload_init = apply_filters("gform_plupload_settings_{$form_id}", apply_filters('gform_plupload_settings', $plupload_init, $form_id, $field), $form_id, $field);
+
+ // Multi-file uploading doesn't currently work in iOS Safari,
+ // single-file allows the built-in camera to be used as source for images
+ if ( wp_is_mobile() )
+ $plupload_init['multi_selection'] = false;
+
+ $plupload_init_json = htmlspecialchars(json_encode($plupload_init), ENT_QUOTES, 'UTF-8');
+ $upload = sprintf("",$container_id, $plupload_init_json, $drag_drop_id, __("Drop files here or" ,"gravityforms"), $browse_button_id, __("Select files", "gravityforms") ) ;
+ if(!IS_ADMIN)
+ $upload .= "";
+
+ if(IS_ADMIN && RG_CURRENT_VIEW === "entry")
+ $upload .= sprintf(' ', $id, esc_attr($value));
+
+ } else {
+ $upload = sprintf(" ", $max_upload_size);
+ $upload .= sprintf(" ", $id, $field_id, esc_attr($class), $disabled_text);
+ }
+
+ if(IS_ADMIN && RG_CURRENT_VIEW === "entry" && !empty($value)){ // edit entry
+ $file_urls = $multiple_files ? json_decode($value) : array($value);
+ $upload_display = $multiple_files ? "" : "style='display:none'";
+ $preview = "$upload
";
+ $preview .= sprintf("
", $file_list_id);
+ $preview .= sprintf("", $id);
+
+ foreach($file_urls as $file_index => $file_url){
+ if(self::is_ssl() && strpos($file_url, "http:") !== false ){
+ $file_url = str_replace("http:", "https:", $file_url);
+ }
+ $file_url = esc_attr($file_url);
+ $preview .= sprintf("
", $file_index, $file_url, $file_url, $file_url, GFCommon::truncate_url($file_url), $file_url, GFCommon::get_base_url() . "/images/download.png", $lead_id, $id, GFCommon::get_base_url() . "/images/delete.png");
+ }
+
+ $preview .="
";
+
+ return $preview;
+ } else {
+ $input_name = "input_{$id}";
+ $uploaded_files = isset(GFFormsModel::$uploaded_files[$form_id][$input_name]) ? GFFormsModel::$uploaded_files[$form_id][$input_name] : array();
+ $file_infos = $multiple_files ? $uploaded_files : RGFormsModel::get_temp_filename($form_id, $input_name);
+
+ if(!empty($file_infos)){
+ $preview = sprintf("", $file_list_id);
+ $file_infos = $multiple_files ? $uploaded_files : array($file_infos);
+ foreach($file_infos as $file_info){
+ $preview .= "
";
+ }
+ $preview .= "
";
+ if(!$multiple_files)
+ $upload = str_replace(" class='", " class='gform_hidden ", $upload);
+ return "" . $upload . " {$preview}
";
+ }
+ else{
+
+ $preview = $multiple_files ? sprintf("
", $file_list_id) : "";
+
+ return "$upload
" . $preview;
+ }
+ }
+
+ case "captcha" :
+
+ switch(rgget("captchaType", $field)){
+ case "simple_captcha" :
+ $size = rgempty("simpleCaptchaSize", $field) ? "medium" : $field["simpleCaptchaSize"];
+ $captcha = self::get_captcha($field);
+
+ $tabindex = self::get_tabindex();
+
+ $dimensions = IS_ADMIN ? "" : "width='" . rgar($captcha,"width") . "' height='" . rgar($captcha,"height") . "'";
+ return "";
+ break;
+
+ case "math" :
+ $size = empty($field["simpleCaptchaSize"]) ? "medium" : $field["simpleCaptchaSize"];
+ $captcha_1 = self::get_math_captcha($field, 1);
+ $captcha_2 = self::get_math_captcha($field, 2);
+ $captcha_3 = self::get_math_captcha($field, 3);
+
+ $tabindex = self::get_tabindex();
+
+ $dimensions = IS_ADMIN ? "" : "width='{$captcha_1["width"]}' height='{$captcha_1["height"]}'";
+ return "";
+ break;
+
+ default:
+
+ if(!function_exists("recaptcha_get_html")){
+ require_once(GFCommon::get_base_path() . '/recaptchalib.php');
+ }
+
+ $theme = empty($field["captchaTheme"]) ? "red" : esc_attr($field["captchaTheme"]);
+ $publickey = get_option("rg_gforms_captcha_public_key");
+ $privatekey = get_option("rg_gforms_captcha_private_key");
+ if(IS_ADMIN){
+ if(empty($publickey) || empty($privatekey)){
+ return "" . __("To use the reCaptcha field you must first do the following:", "gravityforms") . "
2 - " . sprintf(__("Enter your reCAPTCHA keys in the %ssettings page%s", "gravityforms"), "
", " ") . "
";
+ }
+ else{
+ return "";
+ }
+ }
+ else{
+ $language = empty($field["captchaLanguage"]) ? "en" : esc_attr($field["captchaLanguage"]);
+
+ if(empty(self::$tab_index))
+ self::$tab_index = 1;
+
+ $options = "";
+
+ $is_ssl = !empty($_SERVER['HTTPS']);
+ return $options . "" . recaptcha_get_html($publickey, null, $is_ssl, $language) . "
";
+ }
+ }
+ break;
+
+ case "creditcard" :
+
+ $card_number = "";
+ $card_name = "";
+ $expiration_date = "";
+ $expiration_month = "";
+ $expiration_year = "";
+ $security_code = "";
+ $autocomplete = RGFormsModel::is_html5_enabled() ? "autocomplete='off'" : "";
+
+ if(is_array($value)){
+ $card_number = esc_attr(rgget($field["id"] . ".1",$value));
+ $card_name = esc_attr(rgget($field["id"] . ".5",$value));
+ $expiration_date = rgget($field["id"] . ".2",$value);
+ if(!is_array($expiration_date) && !empty($expiration_date))
+ $expiration_date = explode("/", $expiration_date);
+
+ if(is_array($expiration_date) && count($expiration_date) == 2){
+ $expiration_month = $expiration_date[0];
+ $expiration_year = $expiration_date[1];
+ }
+
+ $security_code = esc_attr(rgget($field["id"] . ".3",$value));
+ }
+
+ $action = !IS_ADMIN ? "gformMatchCard(\"{$field_id}_1\");" : "";
+
+ $onchange= "onchange='{$action}'";
+ $onkeyup = "onkeyup='{$action}'";
+
+ $card_icons = '';
+ $cards = GFCommon::get_card_types();
+ $card_style = rgar($field, 'creditCardStyle') ? rgar($field, 'creditCardStyle') : 'style1';
+
+ foreach($cards as $card) {
+
+ $style = "";
+ if(self::is_card_supported($field, $card["slug"])){
+ $print_card = true;
+ }
+ else if (IS_ADMIN){
+ $print_card = true;
+ $style = "style='display:none;'";
+ }
+ else{
+ $print_card = false;
+ }
+
+ if($print_card){
+ $card_icons .= "{$card['name']}
";
+ }
+ }
+
+ $payment_methods = apply_filters("gform_payment_methods", array(), $field, $form_id);
+ $payment_options = "";
+ if(is_array($payment_methods)){
+ foreach($payment_methods as $payment_method){
+ $checked = rgpost("gform_payment_method") == $payment_method["key"] ? "checked='checked'" : "";
+ $payment_options .=" {$payment_method["label"]}
";
+ }
+ }
+ $checked = rgpost("gform_payment_method") == "creditcard" || rgempty("gform_payment_method") ? "checked='checked'" : "";
+ $card_radio_button = empty($payment_options) ? "" : " ";
+ $card_icons = "{$payment_options}{$card_radio_button}{$card_icons}
";
+
+
+
+ //card number fields
+ $tabindex = self::get_tabindex();
+ $html5_output = ! is_admin() && GFFormsModel::is_html5_enabled() ? "pattern='[0-9]*' title='" . __("Only digits are allowed", "gravityforms") . "'" : "";
+ $card_field = sprintf("{$card_icons}" . apply_filters("gform_card_number_{$form_id}", apply_filters("gform_card_number",__("Card Number", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $card_number, $disabled_text, $field_id);
+
+ //expiration date field
+ $expiration_field = "";
+
+ $tabindex = self::get_tabindex();
+ $card_name_field = sprintf("" . apply_filters("gform_card_name_{$form_id}", apply_filters("gform_card_name",__("Cardholder Name", "gravityforms"), $form_id), $form_id) . " ", $id, $field_id, $card_name, $disabled_text, $field_id);
+
+ return "" . $card_field . $expiration_field . $security_field . $card_name_field . "
";
+
+ break;
+
+ case "list" :
+
+ if(!empty($value))
+ $value = maybe_unserialize($value);
+
+ if(!is_array($value))
+ $value = array(array());
+
+ $has_columns = is_array(rgar($field, "choices"));
+ $columns = $has_columns ? rgar($field, "choices") : array(array());
+
+ $list = "";
+
+ return $list;
+ break;
+ }
+ }
+
+ public static function is_ssl(){
+ global $wordpress_https;
+ $is_ssl = false;
+
+ $has_https_plugin = class_exists('WordPressHTTPS') && isset($wordpress_https);
+ $has_is_ssl_method = $has_https_plugin && method_exists('WordPressHTTPS', 'is_ssl');
+ $has_isSsl_method = $has_https_plugin && method_exists('WordPressHTTPS', 'isSsl');
+
+ //Use the WordPress HTTPs plugin if installed
+ if ($has_https_plugin && $has_is_ssl_method){
+ $is_ssl = $wordpress_https->is_ssl();
+ }
+ else if ($has_https_plugin && $has_isSsl_method){
+ $is_ssl = $wordpress_https->isSsl();
+ }
+ else{
+ $is_ssl = is_ssl();
+ }
+
+
+ if(!$is_ssl && isset($_SERVER["HTTP_CF_VISITOR"]) && strpos($_SERVER["HTTP_CF_VISITOR"], "https")){
+ $is_ssl=true;
+ }
+
+ return apply_filters("gform_is_ssl", $is_ssl);
+ }
+
+ public static function is_card_supported($field, $card_slug){
+ $supported_cards = rgar($field, 'creditCards');
+ $default_cards = array('amex', 'discover', 'mastercard', 'visa');
+
+ if(!empty($supported_cards) && in_array($card_slug, $supported_cards)) {
+ return true;
+ }
+ else if(empty($supported_cards) && in_array($card_slug, $default_cards)) {
+ return true;
+ }
+
+ return false;
+
+ }
+
+ public static function is_preview(){
+ $url_info = parse_url(RGFormsModel::get_current_page_url());
+ $file_name = basename($url_info["path"]);
+ return $file_name == "preview.php" || rgget("gf_page", $_GET) == "preview";
+ }
+
+ private static function get_expiration_months($selected_month){
+ $str = "" . __("Month", "gravityforms") . " ";
+ for($i=1; $i<13; $i++){
+ $selected = intval($selected_month) == $i ? "selected='selected'" : "";
+ $month = str_pad($i, 2, "0", STR_PAD_LEFT);
+ $str .= "{$month} ";
+ }
+ return $str;
+ }
+
+ private static function get_expiration_years($selected_year){
+ $str = "" . __("Year", "gravityforms") . " ";
+ $year = intval(date("Y"));
+ for($i=$year; $i < ($year + 20); $i++){
+ $selected = intval($selected_year) == $i ? "selected='selected'" : "";
+ $str .= "{$i} ";
+ }
+ return $str;
+ }
+
+ private static function get_list_input($field, $has_columns, $column, $value, $form_id){
+
+ $tabindex = GFCommon::get_tabindex();
+
+ $column_index = 1;
+ if($has_columns && is_array(rgar($field, "choices"))){
+ foreach($field["choices"] as $choice){
+ if($choice["text"] == $column["text"])
+ break;
+
+ $column_index++;
+ }
+ }
+ $input_info = array("type" => "text");
+
+ $input_info = apply_filters("gform_column_input_{$form_id}_{$field["id"]}_{$column_index}", apply_filters("gform_column_input", $input_info, $field, rgar($column, "text"), $value, $form_id), $field, rgar($column, "text"), $value, $form_id);
+
+ switch($input_info["type"]){
+
+ case "select" :
+ $input = "";
+ if(!is_array($input_info["choices"]))
+ $input_info["choices"] = explode(",", $input_info["choices"]);
+
+ foreach($input_info["choices"] as $choice){
+ if(is_array($choice)){
+ $choice_value = $choice["value"];
+ $choice_text = $choice["text"];
+ $choice_selected = $choice["isSelected"];
+ }
+ else{
+ $choice_value = $choice;
+ $choice_text = $choice;
+ $choice_selected = false;
+ }
+ $is_selected = empty($value) ? $choice_selected : $choice_value == $value;
+ $selected = $is_selected ? "selected='selected'" : "";
+ $input .= "" . esc_html($choice_text) . " ";
+ }
+ $input .= " ";
+
+ break;
+
+ default :
+ $input = " ";
+ break;
+ }
+
+ return apply_filters("gform_column_input_content_{$form_id}_{$field["id"]}_{$column_index}",
+ apply_filters("gform_column_input_content", $input, $input_info, $field, rgar($column, "text"), $value, $form_id),
+ $input_info, $field, rgar($column, "text"), $value, $form_id);
+
+ }
+
+ public static function clean_extensions($extensions){
+ $count = sizeof($extensions);
+ for($i=0; $i<$count; $i++){
+ $extensions[$i] = str_replace(".", "",str_replace(" ", "", $extensions[$i]));
+ }
+ return $extensions;
+ }
+
+ public static function get_disallowed_file_extensions(){
+ return array("php", "asp", "exe", "com", "htaccess");
+ }
+
+ public static function to_money($number, $currency_code=""){
+ if(!class_exists("RGCurrency"))
+ require_once("currency.php");
+
+ if(empty($currency_code))
+ $currency_code = self::get_currency();
+
+ $currency = new RGCurrency($currency_code);
+ return $currency->to_money($number);
+ }
+
+ public static function to_number($text, $currency_code=""){
+ if(!class_exists("RGCurrency"))
+ require_once("currency.php");
+
+ if(empty($currency_code))
+ $currency_code = self::get_currency();
+
+ $currency = new RGCurrency($currency_code);
+
+ return $currency->to_number($text);
+ }
+
+ public static function get_currency(){
+ $currency = get_option("rg_gforms_currency");
+ $currency = empty($currency) ? "USD" : $currency;
+
+ return apply_filters("gform_currency", $currency);
+ }
+
+
+ public static function get_simple_captcha(){
+ $captcha = new ReallySimpleCaptcha();
+ $captcha->tmp_dir = RGFormsModel::get_upload_path("captcha") . "/";
+ return $captcha;
+ }
+
+ public static function get_captcha($field){
+ if(!class_exists("ReallySimpleCaptcha"))
+ return array();
+
+ $captcha = self::get_simple_captcha();
+
+ //If captcha folder does not exist and can't be created, return an empty captcha
+ if(!wp_mkdir_p($captcha->tmp_dir))
+ return array();
+
+ $captcha->char_length = 5;
+ switch(rgar($field,"simpleCaptchaSize")){
+ case "small" :
+ $captcha->img_size = array( 100, 28 );
+ $captcha->font_size = 18;
+ $captcha->base = array( 8, 20 );
+ $captcha->font_char_width = 17;
+
+ break;
+
+ case "large" :
+ $captcha->img_size = array( 200, 56 );
+ $captcha->font_size = 32;
+ $captcha->base = array( 18, 42 );
+ $captcha->font_char_width = 35;
+ break;
+
+ default :
+ $captcha->img_size = array( 150, 42 );
+ $captcha->font_size = 26;
+ $captcha->base = array( 15, 32 );
+ $captcha->font_char_width = 25;
+ break;
+ }
+
+ if(!empty($field["simpleCaptchaFontColor"])){
+ $captcha->fg = self::hex2rgb($field["simpleCaptchaFontColor"]);
+ }
+ if(!empty($field["simpleCaptchaBackgroundColor"])){
+ $captcha->bg = self::hex2rgb($field["simpleCaptchaBackgroundColor"]);
+ }
+
+ $word = $captcha->generate_random_word();
+ $prefix = mt_rand();
+ $filename = $captcha->generate_image($prefix, $word);
+ $url = RGFormsModel::get_upload_url("captcha") . "/" . $filename;
+ $path = $captcha->tmp_dir . $filename;
+
+ if(self::is_ssl() && strpos($url, "http:") !== false ){
+ $url = str_replace("http:", "https:", $url);
+ }
+
+ return array("path"=>$path, "url"=> $url, "height" => $captcha->img_size[1], "width" => $captcha->img_size[0], "prefix" => $prefix);
+ }
+
+ public static function get_math_captcha($field, $pos){
+ if(!class_exists("ReallySimpleCaptcha"))
+ return array();
+
+ $captcha = self::get_simple_captcha();
+
+ //If captcha folder does not exist and can't be created, return an empty captcha
+ if(!wp_mkdir_p($captcha->tmp_dir))
+ return array();
+
+ $captcha->char_length = 1;
+ if($pos == 1 || $pos == 3)
+ $captcha->chars = '0123456789';
+ else
+ $captcha->chars = '+';
+
+ switch(rgar($field,"simpleCaptchaSize")){
+ case "small" :
+ $captcha->img_size = array( 23, 28 );
+ $captcha->font_size = 18;
+ $captcha->base = array( 6, 20 );
+ $captcha->font_char_width = 17;
+
+ break;
+
+ case "large" :
+ $captcha->img_size = array( 36, 56 );
+ $captcha->font_size = 32;
+ $captcha->base = array( 10, 42 );
+ $captcha->font_char_width = 35;
+ break;
+
+ default :
+ $captcha->img_size = array( 30, 42 );
+ $captcha->font_size = 26;
+ $captcha->base = array( 9, 32 );
+ $captcha->font_char_width = 25;
+ break;
+ }
+
+ if(!empty($field["simpleCaptchaFontColor"])){
+ $captcha->fg = self::hex2rgb($field["simpleCaptchaFontColor"]);
+ }
+ if(!empty($field["simpleCaptchaBackgroundColor"])){
+ $captcha->bg = self::hex2rgb($field["simpleCaptchaBackgroundColor"]);
+ }
+
+ $word = $captcha->generate_random_word();
+ $prefix = mt_rand();
+ $filename = $captcha->generate_image($prefix, $word);
+ $url = RGFormsModel::get_upload_url("captcha") . "/" . $filename;
+ $path = $captcha->tmp_dir . $filename;
+
+ return array("path"=>$path, "url"=> $url, "height" => $captcha->img_size[1], "width" => $captcha->img_size[0], "prefix" => $prefix);
+ }
+
+ private static function hex2rgb($color){
+ if ($color[0] == '#')
+ $color = substr($color, 1);
+
+ if (strlen($color) == 6)
+ list($r, $g, $b) = array($color[0].$color[1],
+ $color[2].$color[3],
+ $color[4].$color[5]);
+ elseif (strlen($color) == 3)
+ list($r, $g, $b) = array($color[0].$color[0], $color[1].$color[1], $color[2].$color[2]);
+ else
+ return false;
+
+ $r = hexdec($r); $g = hexdec($g); $b = hexdec($b);
+
+ return array($r, $g, $b);
+ }
+
+ public static function get_address_types($form_id){
+
+ $addressTypes = array(
+ "international" => array("label" => __("International", "gravityforms"),"zip_label" => apply_filters("gform_address_zip_{$form_id}",apply_filters("gform_address_zip", __("ZIP / Postal Code", "gravityforms"), $form_id), $form_id),"state_label" => apply_filters("gform_address_state_{$form_id}",apply_filters("gform_address_state",__("State / Province / Region", "gravityforms"), $form_id), $form_id)),
+ "us" => array("label" => __("United States", "gravityforms"),"zip_label" => apply_filters("gform_address_zip_{$form_id}",apply_filters("gform_address_zip", __("ZIP Code", "gravityforms"), $form_id), $form_id), "state_label" => apply_filters("gform_address_state_{$form_id}",apply_filters("gform_address_state",__("State", "gravityforms"), $form_id), $form_id), "country" => "United States", "states" => array_merge(array(''), GFCommon::get_us_states())),
+ "canadian" => array("label" => __("Canadian", "gravityforms"), "zip_label" => apply_filters("gform_address_zip_{$form_id}",apply_filters("gform_address_zip", __("Postal Code", "gravityforms"), $form_id), $form_id), "state_label" => apply_filters("gform_address_state_{$form_id}",apply_filters("gform_address_state",__("Province", "gravityforms"), $form_id), $form_id),"country" => "Canada", "states" => array_merge(array(''), GFCommon::get_canadian_provinces()))
+ );
+
+ return apply_filters("gform_address_types_{$form_id}", apply_filters("gform_address_types", $addressTypes, $form_id), $form_id);
+ }
+
+ private static function get_state_field($field, $id, $field_id, $state_value, $disabled_text, $form_id){
+ $state_dropdown_class = $state_text_class = $state_style = $text_style = $state_field_id = "";
+
+ if(empty($state_value)){
+ $state_value = rgget("defaultState", $field);
+
+ //for backwards compatibility (canadian address type used to store the default state into the defaultProvince property)
+ if (rgget("addressType", $field) == "canadian" && !rgempty("defaultProvince", $field))
+ $state_value = $field["defaultProvince"];
+ }
+
+ $address_type = rgempty("addressType", $field) ? "international" : $field["addressType"];
+ $address_types = self::get_address_types($form_id);
+ $has_state_drop_down = isset($address_types[$address_type]["states"]) && is_array($address_types[$address_type]["states"]);
+
+ if(IS_ADMIN && RG_CURRENT_VIEW != "entry"){
+ $state_dropdown_class = "class='state_dropdown'";
+ $state_text_class = "class='state_text'";
+ $state_style = !$has_state_drop_down ? "style='display:none;'" : "";
+ $text_style = $has_state_drop_down ? "style='display:none;'" : "";
+ $state_field_id = "";
+ }
+ else{
+ //id only displayed on front end
+ $state_field_id = "id='" . $field_id . "_4'";
+ }
+
+ $tabindex = self::get_tabindex();
+ $states = empty($address_types[$address_type]["states"]) ? array() : $address_types[$address_type]["states"];
+ $state_dropdown = sprintf("%s ", $id, $state_field_id, $disabled_text, GFCommon::get_state_dropdown($states, $state_value));
+
+ $tabindex = self::get_tabindex();
+ $state_text = sprintf(" ", $id, $state_field_id, $state_value, $disabled_text);
+
+ if(IS_ADMIN && RG_CURRENT_VIEW != "entry")
+ return $state_dropdown . $state_text;
+ else if($has_state_drop_down)
+ return $state_dropdown;
+ else
+ return $state_text;
+ }
+
+ public static function get_lead_field_display($field, $value, $currency="", $use_text=false, $format="html", $media="screen"){
+
+ if($field['type'] == 'post_category')
+ $value = self::prepare_post_category_value($value, $field);
+
+ switch(RGFormsModel::get_input_type($field)){
+ case "name" :
+ if(is_array($value)){
+ $prefix = trim(rgget($field["id"] . ".2", $value));
+ $first = trim(rgget($field["id"] . ".3", $value));
+ $last = trim(rgget($field["id"] . ".6", $value));
+ $suffix = trim(rgget($field["id"] . ".8", $value));
+
+ $name = $prefix;
+ $name .= !empty($name) && !empty($first) ? " $first" : $first;
+ $name .= !empty($name) && !empty($last) ? " $last" : $last;
+ $name .= !empty($name) && !empty($suffix) ? " $suffix" : $suffix;
+
+ return $name;
+ }
+ else{
+ return $value;
+ }
+
+ break;
+ case "creditcard" :
+ if(is_array($value)){
+ $card_number = trim(rgget($field["id"] . ".1", $value));
+ $card_type = trim(rgget($field["id"] . ".4", $value));
+ $separator = $format == "html" ? " " : "\n";
+ return empty($card_number) ? "" : $card_type . $separator . $card_number;
+ }
+ else{
+ return "";
+ }
+ break;
+
+ case "address" :
+ if(is_array($value)){
+ $street_value = trim(rgget($field["id"] . ".1", $value));
+ $street2_value = trim(rgget($field["id"] . ".2", $value));
+ $city_value = trim(rgget($field["id"] . ".3", $value));
+ $state_value = trim(rgget($field["id"] . ".4", $value));
+ $zip_value = trim(rgget($field["id"] . ".5", $value));
+ $country_value = trim(rgget($field["id"] . ".6", $value));
+
+ $line_break = $format == "html" ? " " : "\n";
+
+ $address_display_format = apply_filters("gform_address_display_format", "default");
+ if($address_display_format == "zip_before_city"){
+ /*
+ Sample:
+ 3333 Some Street
+ suite 16
+ 2344 City, State
+ Country
+ */
+
+ $addr_ary = array();
+ $addr_ary[] = $street_value;
+
+ if(!empty($street2_value))
+ $addr_ary[] = $street2_value;
+
+ $zip_line = trim($zip_value . " " . $city_value);
+ $zip_line .= !empty($zip_line) && !empty($state_value) ? ", {$state_value}" : $state_value;
+ $zip_line = trim($zip_line);
+ if(!empty($zip_line))
+ $addr_ary[] = $zip_line;
+
+ if(!empty($country_value))
+ $addr_ary[] = $country_value;
+
+ $address = implode(" ", $addr_ary);
+
+ }
+ else{
+ $address = $street_value;
+ $address .= !empty($address) && !empty($street2_value) ? $line_break . $street2_value : $street2_value;
+ $address .= !empty($address) && (!empty($city_value) || !empty($state_value)) ? $line_break. $city_value : $city_value;
+ $address .= !empty($address) && !empty($city_value) && !empty($state_value) ? ", $state_value" : $state_value;
+ $address .= !empty($address) && !empty($zip_value) ? " $zip_value" : $zip_value;
+ $address .= !empty($address) && !empty($country_value) ? $line_break . $country_value : $country_value;
+ }
+
+ //adding map link
+ if(!empty($address) && $format == "html"){
+ $address_qs = str_replace($line_break, " ", $address); //replacing and \n with spaces
+ $address_qs = urlencode($address_qs);
+ $address .= "Map It ";
+ }
+
+ return $address;
+ }
+ else{
+ return "";
+ }
+ break;
+
+ case "email" :
+ return GFCommon::is_valid_email($value) && $format == "html" ? "$value " : $value;
+ break;
+
+ case "website" :
+ return GFCommon::is_valid_url($value) && $format == "html" ? "$value " : $value;
+ break;
+
+ case "checkbox" :
+ if(is_array($value)){
+
+ $items = '';
+
+ foreach($value as $key => $item){
+ if(!empty($item)){
+ switch($format){
+ case "text" :
+ $items .= GFCommon::selection_display($item, $field, $currency, $use_text) . ", ";
+ break;
+
+ default:
+ $items .= "" . GFCommon::selection_display($item, $field, $currency, $use_text) . " ";
+ break;
+ }
+ }
+ }
+ if(empty($items)){
+ return "";
+ }
+ else if($format == "text"){
+ return substr($items, 0, strlen($items)-2); //removing last comma
+ }
+ else{
+ return "";
+ }
+ }
+ else{
+ return $value;
+ }
+ break;
+
+ case "post_image" :
+ $ary = explode("|:|", $value);
+ $url = count($ary) > 0 ? $ary[0] : "";
+ $title = count($ary) > 1 ? $ary[1] : "";
+ $caption = count($ary) > 2 ? $ary[2] : "";
+ $description = count($ary) > 3 ? $ary[3] : "";
+
+ if(!empty($url)){
+ $url = str_replace(" ", "%20", $url);
+
+ switch($format){
+ case "text" :
+ $value = $url;
+ $value .= !empty($title) ? "\n\n" . $field["label"] . " (" . __("Title", "gravityforms") . "): " . $title : "";
+ $value .= !empty($caption) ? "\n\n" . $field["label"] . " (" . __("Caption", "gravityforms") . "): " . $caption : "";
+ $value .= !empty($description) ? "\n\n" . $field["label"] . " (" . __("Description", "gravityforms") . "): " . $description : "";
+ break;
+
+ default :
+ $value = " ";
+ $value .= !empty($title) ? "Title: $title
" : "";
+ $value .= !empty($caption) ? "Caption: $caption
" : "";
+ $value .= !empty($description) ? "Description: $description
": "";
+
+ break;
+ }
+ }
+ return $value;
+
+ case "fileupload" :
+ $output = "";
+ if(!empty($value)){
+ $output_arr = array();
+ $file_paths = rgar($field,"multipleFiles") ? json_decode($value) : array($value);
+ foreach($file_paths as $file_path){
+ $info = pathinfo($file_path);
+ if(self::is_ssl() && strpos($file_path, "http:") !== false ){
+ $file_path = str_replace("http:", "https:", $file_path);
+ }
+ $file_path = esc_attr(str_replace(" ", "%20", $file_path));
+ $output_arr[] = $format == "text" ? $file_path . PHP_EOL: "" . $info["basename"] . " ";
+ }
+ $output = join(PHP_EOL, $output_arr);
+ }
+ $output = empty($output) || $format == "text" ? $output : sprintf("", $output);
+ return $output;
+ break;
+
+ case "date" :
+ return GFCommon::date_display($value, rgar($field, "dateFormat"));
+ break;
+
+ case "radio" :
+ case "select" :
+ return GFCommon::selection_display($value, $field, $currency, $use_text);
+ break;
+
+ case "multiselect" :
+ if(empty($value) || $format == "text")
+ return $value;
+
+ $value = explode(",", $value);
+
+ $items = '';
+ foreach($value as $item){
+ $items .= "" . GFCommon::selection_display($item, $field, $currency, $use_text) . " ";
+ }
+
+ return "";
+
+ break;
+
+ case "calculation" :
+ case "singleproduct" :
+ if(is_array($value) && !empty($value)){
+ $product_name = trim($value[$field["id"] . ".1"]);
+ $price = trim($value[$field["id"] . ".2"]);
+ $quantity = trim($value[$field["id"] . ".3"]);
+
+ $product = $product_name . ", " . __("Qty: ", "gravityforms") . $quantity . ", " . __("Price: ", "gravityforms") . $price;
+ return $product;
+ }
+ else{
+ return "";
+ }
+ break;
+
+ case "number" :
+ return GFCommon::format_number($value, rgar($field, "numberFormat"));
+ break;
+
+ case "singleshipping" :
+ case "donation" :
+ case "total" :
+ case "price" :
+ return GFCommon::to_money($value, $currency);
+
+ case "list" :
+ if(empty($value))
+ return "";
+ $value = unserialize($value);
+
+ $has_columns = is_array($value[0]);
+
+ if(!$has_columns){
+ $items = '';
+ foreach($value as $key => $item){
+ if(!empty($item)){
+ switch($format){
+ case "text" :
+ $items .= $item . ", ";
+ break;
+ case "url" :
+ $items .= $item . ",";
+ break;
+ default :
+ if($media == "email"){
+ $items .= "{$item} ";
+ }
+ else{
+ $items .= "{$item} ";
+ }
+ break;
+ }
+ }
+ }
+
+ if(empty($items)){
+ return "";
+ }
+ else if($format == "text"){
+ return substr($items, 0, strlen($items)-2); //removing last comma
+ }
+ else if($format == "url"){
+ return substr($items, 0, strlen($items)-1); //removing last comma
+ }
+ else if($media == "email"){
+ return "";
+ }
+ else{
+ return "";
+ }
+ }
+ else if(is_array($value)){
+ $columns = array_keys($value[0]);
+
+ $list = "";
+
+ switch($format){
+ case "text" :
+ $is_first_row = true;
+ foreach($value as $item){
+ if(!$is_first_row)
+ $list .= "\n\n" . $field["label"] . ": ";
+ $list .= implode(",", array_values($item));
+
+ $is_first_row = false;
+ }
+ break;
+
+ case "url" :
+ foreach($value as $item){
+ $list .= implode("|", array_values($item)) . ",";
+ }
+ if(!empty($list))
+ $list = substr($list, 0, strlen($list)-1);
+ break;
+
+ default :
+ if($media == "email"){
+ $list = "";
+
+ //reading columns from entry data
+ foreach($columns as $column){
+ $list .= "" . esc_html($column) . " ";
+ }
+ $list .= " ";
+
+ $list .= "";
+ foreach($value as $item){
+ $list .= "";
+ foreach($columns as $column){
+ $val = rgar($item, $column);
+ $list .= "{$val} ";
+ }
+
+ $list .=" ";
+ }
+
+ $list .="
";
+ }
+ else{
+ $list = "";
+
+ //reading columns from entry data
+ foreach($columns as $column){
+ $list .= "" . esc_html($column) . " ";
+ }
+ $list .= " ";
+
+ $list .= "";
+ foreach($value as $item){
+ $list .= "";
+ foreach($columns as $column){
+ $val = rgar($item, $column);
+ $list .= "{$val} ";
+ }
+
+ $list .=" ";
+ }
+
+ $list .="
";
+ }
+ break;
+ }
+
+ return $list;
+ }
+ return "";
+ break;
+
+ default :
+ if (!is_array($value))
+ {
+ return nl2br($value);
+ }
+ break;
+ }
+ }
+
+ public static function get_product_fields($form, $lead, $use_choice_text=false, $use_admin_label=false){
+ $products = array();
+
+ $product_info = null;
+ // retrieve static copy of product info (only for "real" entries)
+ if(!rgempty("id", $lead)){
+ $product_info = gform_get_meta(rgar($lead,'id'), "gform_product_info_{$use_choice_text}_{$use_admin_label}");
+ }
+
+ // if no static copy, generate from form/lead info
+ if(!$product_info) {
+
+ foreach($form["fields"] as $field){
+ $id = $field["id"];
+ $lead_value = RGFormsModel::get_lead_field_value($lead, $field);
+
+ $quantity_field = self::get_product_fields_by_type($form, array("quantity"), $id);
+ $quantity = sizeof($quantity_field) > 0 && !RGFormsModel::is_field_hidden($form, $quantity_field[0], array(), $lead) ? RGFormsModel::get_lead_field_value($lead, $quantity_field[0]) : 1;
+
+ switch($field["type"]){
+
+ case "product" :
+
+ //ignore products that have been hidden by conditional logic
+ $is_hidden = RGFormsModel::is_field_hidden($form, $field, array(), $lead);
+ if($is_hidden)
+ continue;
+
+ //if single product, get values from the multiple inputs
+ if(is_array($lead_value)){
+ $product_quantity = sizeof($quantity_field) == 0 && !rgar($field,"disableQuantity") ? rgget($id . ".3", $lead_value) : $quantity;
+ if(empty($product_quantity))
+ continue;
+
+ if(!rgget($id, $products))
+ $products[$id] = array();
+
+ $products[$id]["name"] = $use_admin_label && !rgempty("adminLabel", $field) ? $field["adminLabel"] : $lead_value[$id . ".1"];
+ $products[$id]["price"] = rgar($lead_value, $id . ".2");
+ $products[$id]["quantity"] = $product_quantity;
+ }
+ else if(!empty($lead_value)){
+
+ if(empty($quantity))
+ continue;
+
+ if(!rgar($products,$id))
+ $products[$id] = array();
+
+ if($field["inputType"] == "price"){
+ $name = $field["label"];
+ $price = $lead_value;
+ }
+ else{
+ list($name, $price) = explode("|", $lead_value);
+ }
+
+ $products[$id]["name"] = !$use_choice_text ? $name : RGFormsModel::get_choice_text($field, $name);
+ $products[$id]["price"] = $price;
+ $products[$id]["quantity"] = $quantity;
+ $products[$id]["options"] = array();
+ }
+
+ if(isset($products[$id])){
+ $options = self::get_product_fields_by_type($form, array("option"), $id);
+ foreach($options as $option){
+ $option_value = RGFormsModel::get_lead_field_value($lead, $option);
+ $option_label = empty($option["adminLabel"]) ? $option["label"] : $option["adminLabel"];
+ if(is_array($option_value)){
+ foreach($option_value as $value){
+ $option_info = self::get_option_info($value, $option, $use_choice_text);
+ if(!empty($option_info))
+ $products[$id]["options"][] = array("field_label" => rgar($option, "label"), "option_name"=> rgar($option_info, "name"), "option_label" => $option_label . ": " . rgar($option_info, "name"), "price" => rgar($option_info,"price"));
+ }
+ }
+ else if(!empty($option_value)){
+ $option_info = self::get_option_info($option_value, $option, $use_choice_text);
+ $products[$id]["options"][] = array("field_label" => rgar($option, "label"), "option_name"=> rgar($option_info, "name"), "option_label" => $option_label . ": " . rgar($option_info, "name"), "price" => rgar($option_info,"price"));
+ }
+
+ }
+ }
+ break;
+ }
+ }
+
+ $shipping_field = self::get_fields_by_type($form, array("shipping"));
+ $shipping_price = $shipping_name = "";
+ $shipping_field_id = "";
+ if(!empty($shipping_field) && !RGFormsModel::is_field_hidden($form, $shipping_field[0], array(), $lead)){
+ $shipping_price = RGFormsModel::get_lead_field_value($lead, $shipping_field[0]);
+ $shipping_name = $shipping_field[0]["label"];
+ $shipping_field_id = $shipping_field[0]["id"];
+ if($shipping_field[0]["inputType"] != "singleshipping"){
+ list($shipping_method, $shipping_price) = explode("|", $shipping_price);
+ $shipping_name = $shipping_field[0]["label"] . " ($shipping_method)";
+ }
+ }
+ $shipping_price = self::to_number($shipping_price);
+
+ $product_info = array("products" => $products, "shipping" => array("id"=> $shipping_field_id, "name" => $shipping_name, "price" => $shipping_price));
+
+ $product_info = apply_filters("gform_product_info_{$form["id"]}", apply_filters("gform_product_info", $product_info, $form, $lead), $form, $lead);
+
+ // save static copy of product info (only for "real" entries)
+ if(!rgempty("id", $lead) && !empty($product_info["products"])){
+ gform_update_meta($lead['id'], "gform_product_info_{$use_choice_text}_{$use_admin_label}", $product_info);
+ }
+ }
+
+ return $product_info;
+ }
+
+ public static function get_order_total($form, $lead) {
+
+ $products = self::get_product_fields($form, $lead, false);
+ return self::get_total($products);
+ }
+
+ public static function get_total($products) {
+
+ $total = 0;
+ foreach($products["products"] as $product){
+
+ $price = self::to_number($product["price"]);
+ if(is_array(rgar($product,"options"))){
+ foreach($product["options"] as $option){
+ $price += self::to_number($option["price"]);
+ }
+ }
+ $subtotal = floatval($product["quantity"]) * $price;
+ $total += $subtotal;
+
+ }
+
+ $total += floatval($products["shipping"]["price"]);
+
+ return $total;
+ }
+
+ public static function get_option_info($value, $option, $use_choice_text){
+ if(empty($value))
+ return array();
+
+ list($name, $price) = explode("|", $value);
+ if($use_choice_text)
+ $name = RGFormsModel::get_choice_text($option, $name);
+
+ return array("name" => $name, "price" => $price);
+ }
+
+ public static function gform_do_shortcode($content){
+
+ $is_ajax = false;
+ $forms = GFFormDisplay::get_embedded_forms($content, $is_ajax);
+
+ foreach($forms as $form){
+ if( headers_sent() ) {
+ GFFormDisplay::print_form_scripts( $form, $is_ajax );
+ } else {
+ GFFormDisplay::enqueue_form_scripts( $form, $is_ajax );
+ }
+ }
+
+ return do_shortcode($content);
+ }
+
+ public static function has_akismet(){
+ return function_exists('akismet_http_post');
+ }
+
+ public static function akismet_enabled($form_id) {
+
+ if(!self::has_akismet())
+ return false;
+
+ // if no option is set, leave akismet enabled; otherwise, use option value true/false
+ $enabled_by_setting = get_option('rg_gforms_enable_akismet') === false ? true : get_option('rg_gforms_enable_akismet') == true;
+ $enabled_by_filter = apply_filters("gform_akismet_enabled_$form_id", apply_filters("gform_akismet_enabled", $enabled_by_setting));
+
+ return $enabled_by_filter;
+
+ }
+
+ public static function is_akismet_spam($form, $lead){
+
+ global $akismet_api_host, $akismet_api_port;
+
+ $fields = self::get_akismet_fields($form, $lead);
+
+ //Submitting info do Akismet
+ $response = akismet_http_post($fields, $akismet_api_host, '/1.1/comment-check', $akismet_api_port );
+ $is_spam = trim(rgar($response, 1)) == "true";
+
+ return $is_spam;
+ }
+
+ public static function mark_akismet_spam($form, $lead, $is_spam){
+
+ global $akismet_api_host, $akismet_api_port;
+
+ $fields = self::get_akismet_fields($form, $lead);
+ $as = $is_spam ? "spam" : "ham";
+
+ //Submitting info do Akismet
+ akismet_http_post($fields, $akismet_api_host, '/1.1/submit-'.$as, $akismet_api_port );
+ }
+
+ private static function get_akismet_fields($form, $lead){
+ //Gathering Akismet information
+ $akismet_info = array();
+ $akismet_info['comment_type'] = 'gravity_form';
+ $akismet_info['comment_author'] = self::get_akismet_field("name", $form, $lead);
+ $akismet_info['comment_author_email'] = self::get_akismet_field("email", $form, $lead);
+ $akismet_info['comment_author_url'] = self::get_akismet_field("website", $form, $lead);
+ $akismet_info['comment_content'] = self::get_akismet_field("textarea", $form, $lead);
+ $akismet_info['contact_form_subject'] = $form["title"];
+ $akismet_info['comment_author_IP'] = $lead["ip"];
+ $akismet_info['permalink'] = $lead["source_url"];
+ $akismet_info['user_ip'] = preg_replace( '/[^0-9., ]/', '', $lead["ip"] );
+ $akismet_info['user_agent'] = $lead["user_agent"];
+ $akismet_info['referrer'] = is_admin() ? "" : $_SERVER['HTTP_REFERER'];
+ $akismet_info['blog'] = get_option('home');
+
+ $akismet_info = apply_filters("gform_akismet_fields_{$form["id"]}", apply_filters("gform_akismet_fields", $akismet_info, $form, $lead), $form, $lead);
+
+ return http_build_query($akismet_info);
+ }
+
+ private static function get_akismet_field($field_type, $form, $lead){
+ $fields = GFCommon::get_fields_by_type($form, array($field_type));
+ if(empty($fields))
+ return "";
+
+ $value = RGFormsModel::get_lead_field_value($lead, $fields[0]);
+ switch($field_type){
+ case "name" :
+ $value = GFCommon::get_lead_field_display($fields[0], $value);
+ break;
+ }
+
+ return $value;
+ }
+
+ public static function get_other_choice_value(){
+ $value = apply_filters('gform_other_choice_value', __("Other", "gravityforms"));
+ return $value;
+ }
+
+ public static function get_browser_class() {
+ global $is_lynx, $is_gecko, $is_IE, $is_opera, $is_NS4, $is_safari, $is_chrome, $is_iphone, $post;
+
+ $classes = array();
+
+ //adding browser related class
+ if($is_lynx) $classes[] = 'gf_browser_lynx';
+ else if($is_gecko) $classes[] = 'gf_browser_gecko';
+ else if($is_opera) $classes[] = 'gf_browser_opera';
+ else if($is_NS4) $classes[] = 'gf_browser_ns4';
+ else if($is_safari) $classes[] = 'gf_browser_safari';
+ else if($is_chrome) $classes[] = 'gf_browser_chrome';
+ else if($is_IE) $classes[] = 'gf_browser_ie';
+ else $classes[] = 'gf_browser_unknown';
+
+
+ //adding IE version
+ if($is_IE){
+ if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6') !== false)
+ $classes[] = 'gf_browser_ie6';
+ else if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 7') !== false)
+ $classes[] = 'gf_browser_ie7';
+ if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 8') !== false)
+ $classes[] = 'gf_browser_ie8';
+ if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 9') !== false)
+ $classes[] = 'gf_browser_ie9';
+ }
+
+ if($is_iphone) $classes[] = 'gf_browser_iphone';
+
+ return implode(" " , $classes);
+ }
+
+ public static function create_post($form, &$lead) {
+ $disable_post = apply_filters("gform_disable_post_creation_{$form["id"]}", apply_filters("gform_disable_post_creation", false, $form, $lead), $form, $lead);
+ $post_id = 0;
+ if(!$disable_post){
+ //creates post if the form has any post fields
+ $post_id = RGFormsModel::create_post($form, $lead);
+ }
+
+ return $post_id;
+ }
+
+ public static function evaluate_conditional_logic($logic, $form, $lead) {
+
+ if(!$logic || !is_array(rgar($logic,"rules")))
+ return true;
+
+ $entry_meta_keys = array_keys(GFFormsModel::get_entry_meta($form["id"]));
+ $match_count = 0;
+ if(is_array($logic["rules"])){
+ foreach($logic["rules"] as $rule) {
+
+ if (in_array($rule["fieldId"], $entry_meta_keys)){
+ $is_value_match = GFFormsModel::is_value_match(rgar($lead,$rule["fieldId"]), $rule["value"], $rule["operator"]);;
+ } else {
+ $source_field = GFFormsModel::get_field($form, $rule["fieldId"]);
+ $field_value = empty($lead) ? GFFormsModel::get_field_value($source_field, array()) : GFFormsModel::get_lead_field_value($lead, $source_field);
+ $is_value_match = GFFormsModel::is_value_match($field_value, $rule["value"], $rule["operator"], $source_field);
+ }
+
+ if($is_value_match)
+ $match_count++;
+
+ }
+ }
+
+ $do_action = ($logic["logicType"] == "all" && $match_count == sizeof($logic["rules"]) ) || ($logic["logicType"] == "any" && $match_count > 0);
+ return $do_action;
+ }
+
+ public static function get_card_types(){
+ $cards = array (
+
+ array ( 'name' => 'American Express',
+ 'slug' => 'amex',
+ 'lengths' => '15',
+ 'prefixes' => '34,37',
+ 'checksum' => true
+ ),
+ array ( 'name' => 'Discover',
+ 'slug' => 'discover',
+ 'lengths' => '16',
+ 'prefixes' => '6011,622,64,65',
+ 'checksum' => true
+ ),
+ array ( 'name' => 'MasterCard',
+ 'slug' => 'mastercard',
+ 'lengths' => '16',
+ 'prefixes' => '51,52,53,54,55',
+ 'checksum' => true
+ ),
+ array ( 'name' => 'Visa',
+ 'slug' => 'visa',
+ 'lengths' => '13,16',
+ 'prefixes' => '4,417500,4917,4913,4508,4844',
+ 'checksum' => true
+ ),
+ array ( 'name' => 'JCB',
+ 'slug' => 'jcb',
+ 'lengths' => '16',
+ 'prefixes' => '35',
+ 'checksum' => true
+ ),
+ array ( 'name' => 'Maestro',
+ 'slug' => 'maestro',
+ 'lengths' => '12,13,14,15,16,18,19',
+ 'prefixes' => '5018,5020,5038,6304,6759,6761',
+ 'checksum' => true
+ )
+
+ );
+
+ $cards = apply_filters("gform_creditcard_types", $cards);
+
+ return $cards;
+ }
+
+ public static function get_card_type($number){
+
+ //removing spaces from number
+ $number = str_replace (' ', '', $number);
+
+ if(empty($number))
+ return false;
+
+ $cards = self::get_card_types();
+
+ $matched_card = false;
+ foreach($cards as $card){
+ if(self::matches_card_type($number, $card)){
+ $matched_card = $card;
+ break;
+ }
+ }
+
+ if($matched_card && $matched_card["checksum"] && !self::is_valid_card_checksum($number))
+ $matched_card = false;
+
+ return $matched_card ? $matched_card : false;
+
+ }
+
+ private static function matches_card_type($number, $card){
+
+ //checking prefix
+ $prefixes = explode(',',$card['prefixes']);
+ $matches_prefix = false;
+ foreach($prefixes as $prefix){
+ if(preg_match("|^{$prefix}|", $number)){
+ $matches_prefix = true;
+ break;
+ }
+ }
+
+ //checking length
+ $lengths = explode(',',$card['lengths']);
+ $matches_length = false;
+ foreach($lengths as $length){
+ if(strlen($number) == absint($length)){
+ $matches_length = true;
+ break;
+ }
+ }
+
+ return $matches_prefix && $matches_length;
+
+ }
+
+ private static function is_valid_card_checksum($number){
+ $checksum = 0;
+ $num = 0;
+ $multiplier = 1;
+
+ // Process each character starting at the right
+ for ($i = strlen($number) - 1; $i >= 0; $i--) {
+
+ //Multiply current digit by multiplier (1 or 2)
+ $num = $number{$i} * $multiplier;
+
+ // If the result is in greater than 9, add 1 to the checksum total
+ if ($num >= 10) {
+ $checksum++;
+ $num -= 10;
+ }
+
+ //Update checksum
+ $checksum += $num;
+
+ //Update multiplier
+ $multiplier = $multiplier == 1 ? 2 : 1;
+ }
+
+ return $checksum % 10 == 0;
+
+ }
+
+ public static function is_wp_version($min_version){
+ return !version_compare(get_bloginfo("version"), "{$min_version}.dev1", '<');
+ }
+
+ public static function add_categories_as_choices($field, $value) {
+
+ $choices = $inputs = array();
+ $is_post = isset($_POST["gform_submit"]);
+ $has_placeholder = rgar($field, 'categoryInitialItemEnabled') && RGFormsModel::get_input_type($field) == 'select';
+
+ if($has_placeholder)
+ $choices[] = array('text' => rgar($field, 'categoryInitialItem'), 'value' => '', 'isSelected' => true);
+
+ $display_all = rgar($field, "displayAllCategories");
+
+ $args = array('hide_empty' => false, 'orderby' => 'name');
+
+ if(!$display_all){
+ foreach($field["choices"] as $field_choice_to_include){
+ $args["include"][] = $field_choice_to_include["value"];
+ }
+ }
+
+ $args = apply_filters("gform_post_category_args_{$field["id"]}", apply_filters("gform_post_category_args", $args, $field), $field);
+ $terms = get_terms('category', $args);
+
+ $terms_copy = unserialize(serialize($terms)); // deep copy the terms to avoid repeating GFCategoryWalker on previously cached terms.
+ $walker = new GFCategoryWalker();
+ $categories = $walker->walk($terms_copy, 0, array(0)); // 3rd parameter prevents notices triggered by $walker::display_element() function which checks $args[0]
+
+ foreach($categories as $category) {
+ if($display_all) {
+ $selected = $value == $category->term_id ||
+ (
+ empty($value) &&
+ get_option('default_category') == $category->term_id &&
+ RGFormsModel::get_input_type($field) == 'select' && // only preselect default category on select fields
+ !$is_post &&
+ !$has_placeholder
+ );
+ $choices[] = array('text' => $category->name, 'value' => $category->term_id, 'isSelected' => $selected);
+ } else {
+ foreach($field["choices"] as $field_choice){
+ if($field_choice["value"] == $category->term_id){
+ $choices[] = array('text' => $category->name, 'value' => $category->term_id);
+ break;
+ }
+ }
+ }
+ }
+
+ if(empty($choices))
+ $choices[] = array('text' => 'You must select at least one category.', 'value' => '');
+
+ $choice_number = 1;
+ foreach($choices as $choice) {
+
+ if($choice_number % 10 == 0) //hack to skip numbers ending in 0. so that 5.1 doesn't conflict with 5.10
+ $choice_number++;
+
+ $input_id = $field["id"] . '.' . $choice_number;
+ $inputs[] = array('id' => $input_id, 'label' => $choice['text'], 'name' => '');
+ $choice_number++;
+ }
+
+ $field['choices'] = $choices;
+
+ $form_id = IS_ADMIN ? rgget("id") : rgar($field,"formId");
+
+ $field['choices'] = apply_filters("gform_post_category_choices", $field["choices"], $field, $form_id);
+ $field['choices'] = apply_filters("gform_post_category_choices_{$form_id}_{$field["id"]}", $field["choices"], $field, $form_id);
+
+ if(RGFormsModel::get_input_type($field) == 'checkbox')
+ $field['inputs'] = $inputs;
+
+ return $field;
+ }
+
+ public static function prepare_post_category_value($value, $field, $mode = 'entry_detail') {
+
+ if(!is_array($value))
+ $value = explode(',', $value);
+
+ $cat_names = array();
+ $cat_ids = array();
+ foreach($value as $cat_string) {
+ $ary = explode(":", $cat_string);
+ $cat_name = count($ary) > 0 ? $ary[0] : "";
+ $cat_id = count($ary) > 1 ? $ary[1] : $ary[0];
+
+ if(!empty($cat_name))
+ $cat_names[] = $cat_name;
+
+ if(!empty($cat_id))
+ $cat_ids[] = $cat_id;
+ }
+
+ sort($cat_names);
+
+ switch($mode) {
+ case 'entry_list':
+ $value = self::implode_non_blank(', ', $cat_names);
+ break;
+ case 'entry_detail':
+ $value = RGFormsModel::get_input_type($field) == 'checkbox' ? $cat_names : self::implode_non_blank(', ', $cat_names);
+ break;
+ case 'conditional_logic':
+ $value = array_values($cat_ids);
+ break;
+ }
+
+ return $value;
+ }
+
+ public static function calculate($field, $form, $lead) {
+
+ $formula = (string) apply_filters( 'gform_calculation_formula', rgar( $field, 'calculationFormula' ), $field, $form, $lead );
+
+ // replace multiple spaces and new lines with single space
+ // @props: http://stackoverflow.com/questions/3760816/remove-new-lines-from-string
+ $formula = trim( preg_replace( '/\s+/', ' ', $formula ) );
+
+ preg_match_all( '/{[^{]*?:(\d+(\.\d+)?)(:(.*?))?}/mi', $formula, $matches, PREG_SET_ORDER );
+
+ if( is_array( $matches ) ) {
+ foreach( $matches as $match ) {
+
+ list( $text, $input_id ) = $match;
+ $value = self::get_calculation_value( $input_id, $form, $lead);
+ $formula = str_replace( $text, $value, $formula);
+
+ }
+ }
+
+ $result = preg_match( '/^[0-9 -\/*\(\)]+$/', $formula ) ? eval( "return {$formula};" ) : false;
+
+ return $result;
+ }
+
+ public static function round_number($number, $rounding ){
+ if(is_numeric($rounding) && $rounding >= 0){
+ $number = round($number, $rounding);
+ }
+ return $number;
+ }
+
+ public static function get_calculation_value($field_id, $form, $lead) {
+
+ $filters = array('price', 'value', '');
+ $value = false;
+
+ foreach($filters as $filter) {
+ if (is_numeric($value)){
+ //value found, exit loop
+ break;
+ }
+ $value = GFCommon::to_number(GFCommon::replace_variables("{:{$field_id}:$filter}", $form, $lead));
+ }
+
+ if(!$value || !is_numeric($value))
+ $value = 0;
+
+ return $value;
+ }
+
+ public static function conditional_shortcode($attributes, $content = null) {
+
+ extract(shortcode_atts(array(
+ 'merge_tag' => '',
+ 'condition' => '',
+ 'value' => ''
+ ), $attributes));
+
+ return RGFormsModel::matches_operation($merge_tag, $value, $condition) ? do_shortcode($content) : '';
+
+ }
+
+ public static function is_valid_for_calcuation($field) {
+
+ $supported_input_types = array('text', 'select', 'number', 'checkbox', 'radio', 'hidden', 'singleproduct', 'price', 'hiddenproduct', 'calculation', 'singleshipping');
+ $unsupported_field_types = array('category');
+ $input_type = RGFormsModel::get_input_type($field);
+
+ return in_array($input_type, $supported_input_types) && !in_array($input_type, $unsupported_field_types);
+ }
+
+ public static function log_error($message){
+ if(class_exists("GFLogging"))
+ {
+ GFLogging::include_logger();
+ GFLogging::log_message("gravityforms", $message, KLogger::ERROR);
+ }
+ }
+
+ public static function log_debug($message){
+ if(class_exists("GFLogging"))
+ {
+ GFLogging::include_logger();
+ GFLogging::log_message("gravityforms", $message, KLogger::DEBUG);
+ }
+ }
+
+ public static function echo_if($condition, $text) {
+
+ switch($text) {
+ case 'checked':
+ $text = 'checked="checked"';
+ break;
+ case 'selected':
+ $text = 'selected="selected"';
+ }
+
+ echo $condition ? $text : '';
+ }
+
+ public static function gf_global($echo = true) {
+
+ require_once(GFCommon::get_base_path() . '/currency.php');
+
+ $gf_global = array();
+ $gf_global["gf_currency_config"] = RGCurrency::get_currency(GFCommon::get_currency());
+ $gf_global["base_url"] = GFCommon::get_base_url();
+ $gf_global["number_formats"] = array();
+ $gf_global["spinnerUrl"] = GFCommon::get_base_url() . '/images/spinner.gif';
+
+ $gf_global_json = 'var gf_global = ' . json_encode($gf_global) . ';';
+
+ if(!$echo)
+ return $gf_global_json;
+
+ echo $gf_global_json;
+ }
+
+ public static function gf_vars($echo = true) {
+ if(!class_exists("RGCurrency"))
+ require_once("currency.php");
+
+ $gf_vars = array();
+ $gf_vars["active"] = __("Active", "gravityforms");
+ $gf_vars["inactive"] = __("Inactive", "gravityforms");
+ $gf_vars["save"] = __("Save", "gravityforms");
+ $gf_vars["update"] = __("Update", "gravityforms");
+ $gf_vars["previousLabel" ] = __("Previous", "gravityforms");
+ $gf_vars["selectFormat" ] = __("Select a format", "gravityforms");
+ $gf_vars["editToViewAll" ] = __("5 of %d items shown. Edit field to view all", "gravityforms");
+ $gf_vars["enterValue" ] = __("Enter a value", "gravityforms");
+ $gf_vars["formTitle" ] = __("Untitled Form", "gravityforms");
+ $gf_vars["formDescription" ] = __("We would love to hear from you! Please fill out this form and we will get in touch with you shortly.", "gravityforms");
+ $gf_vars["formConfirmationMessage" ] = __("Thanks for contacting us! We will get in touch with you shortly.", "gravityforms");
+ $gf_vars["buttonText" ] = __("Submit", "gravityforms");
+ $gf_vars["loading" ] = __("Loading...", "gravityforms");
+ $gf_vars["thisFieldIf"] = __('this field if', 'gravityforms');
+ $gf_vars["thisPage"] = __("this page", "gravityforms");
+ $gf_vars["thisFormButton"] = __('this form button', 'gravityforms');
+ $gf_vars["show"] = __('Show', 'gravityforms');
+ $gf_vars["hide"] = __('Hide', 'gravityforms');
+ $gf_vars["all"] = __('All', 'gravityforms');
+ $gf_vars["any"] = __('Any', 'gravityforms');
+ $gf_vars["ofTheFollowingMatch"] = __('of the following match:', 'gravityforms');
+ $gf_vars["is"] = __('is', 'gravityforms');
+ $gf_vars["isNot"] = __('is not', 'gravityforms');
+ $gf_vars["greaterThan"] = __('greater than', 'gravityforms');
+ $gf_vars["lessThan"] = __('less than', 'gravityforms');
+ $gf_vars["contains"] = __('contains', 'gravityforms');
+ $gf_vars["startsWith"] = __('starts with', 'gravityforms');
+ $gf_vars["endsWith"] = __('ends with', 'gravityforms');
+
+ $gf_vars["thisConfirmation"] = __('Use this confirmation if', 'gravityforms');
+ $gf_vars["thisNotification"] = __('Send this notification if', 'gravityforms');
+ $gf_vars["confirmationSave"] = __('Save', 'gravityforms');
+ $gf_vars["confirmationSaving"] = __('Saving...', 'gravityforms');
+ $gf_vars["confirmationAreYouSure"] = __('Are you sure you wish to cancel these changes?', 'gravityforms');
+ $gf_vars["confirmationIssueSaving"] = __('There was an issue saving this confirmation.', 'gravityforms');
+ $gf_vars["confirmationConfirmDelete"] = __('Are you sure you wish to delete this confirmation?', 'gravityforms');
+ $gf_vars["confirmationIssueDeleting"] = __('There was an issue deleting this confirmation.', 'gravityforms');
+ $gf_vars["confirmationConfirmDiscard"] = __('There are unsaved changes to the current confirmation. Would you like to discard these changes?', 'gravityforms');
+ $gf_vars["confirmationDefaultName"] = __('Untitled Confirmation', 'gravityforms');
+ $gf_vars["confirmationDefaultMessage"] = __('Thanks for contacting us! We will get in touch with you shortly.', 'gravityforms');
+ $gf_vars["confirmationInvalidPageSelection"] = __('Please select a page.', "gravityforms");
+ $gf_vars["confirmationInvalidRedirect"] = __('Please enter a URL.', "gravityforms");
+ $gf_vars["confirmationInvalidName"] = __('Please enter a confirmation name.', "gravityforms");
+
+ $gf_vars["conditionalLogicDependency"] = __('This form contains conditional logic dependent upon this field. Are you sure you want to delete this field? \'OK\' to delete, \'Cancel\' to abort.', 'gravityforms');
+ $gf_vars["conditionalLogicDependencyChoice"] = __('This form contains conditional logic dependent upon this choice. Are you sure you want to delete this choice? \'OK\' to delete, \'Cancel\' to abort.', 'gravityforms');
+ $gf_vars["conditionalLogicDependencyChoiceEdit"] = __('This form contains conditional logic dependent upon this choice. Are you sure you want to modify this choice? \'OK\' to delete, \'Cancel\' to abort.', 'gravityforms');
+
+ $gf_vars["mergeTagsTooltip"] = __('Merge Tags Merge tags allow you to dynamically populate submitted field values in your form content wherever this merge tag icon is present.', 'gravityforms');
+
+ $gf_vars["baseUrl"] = GFCommon::get_base_url();
+ $gf_vars["gf_currency_config"] = RGCurrency::get_currency(GFCommon::get_currency());
+ $gf_vars["otherChoiceValue"] = GFCommon::get_other_choice_value();
+ $gf_vars["isFormTrash"] = false;
+ $gf_vars["currentlyAddingField"] = false;
+
+ $gf_vars["addFieldFilter"] = __("Add a condition", "gravityforms");
+ $gf_vars["removeFieldFilter"] = __("Remove a condition", "gravityforms");
+ $gf_vars["filterAndAny"] = __("Include results if {0} match:", "gravityforms");
+
+ if(is_admin() && rgget('id')) {
+ $form = RGFormsModel::get_form_meta(rgget('id'));
+ $gf_vars["mergeTags"] = GFCommon::get_merge_tags($form['fields'], '', false);
+ }
+
+ $gf_vars_json = 'var gf_vars = ' . json_encode($gf_vars) . ';';
+
+ if(!$echo){
+ return $gf_vars_json;
+ }
+ else {
+ echo $gf_vars_json;
+ }
+ }
+
+ public static function is_bp_active() {
+ return defined('BP_VERSION') ? true : false;
+ }
+
+ public static function add_message($message, $is_error = false) {
+ if($is_error) {
+ self::$errors[] = $message;
+ } else {
+ self::$messages[] = $message;
+ }
+ }
+
+ public static function add_error_message($message) {
+ self::add_message($message, true);
+ }
+
+ public static function display_admin_message($errors = false, $messages = false) {
+
+ if(!$errors)
+ $errors = self::$errors;
+
+ if(!$messages)
+ $messages = self::$messages;
+
+ $errors = apply_filters('gform_admin_error_messages', $errors);
+ $messages = apply_filters('gform_admin_messages', $messages);
+
+ if(!empty($errors)) { ?>
+
+
+
+ ' . self::gf_vars(false) . '';
+ }
+ }
+
+ public static function maybe_add_leading_zero($value){
+ $first_char = GFCommon::safe_substr($value, 0, 1, 'utf-8');
+ if(in_array($first_char, array(".", ",")))
+ $value = "0" . $value;
+ return $value;
+ }
+
+ // used by the gfFieldFilterUI() jQuery plugin
+ public static function get_field_filter_settings($form) {
+
+ $all_fields = $form["fields"];
+
+ // set up filters
+ $fields = $all_fields;
+ $exclude_types = array("rank", "page", "html");
+
+ $operators_by_field_type = array(
+ "default" => array("is", "isnot", ">", "<"),
+ "checkbox" => array("is"),
+ "multiselect" => array("contains"),
+ "number" => array("is", "isnot", ">", "<"),
+ "likert" => array("is", "isnot"),
+ "list" => array("contains")
+ );
+
+ 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(
+ array(
+ "key"=> "0",
+ "text" => __("Any form field", "gravityforms"),
+ "operators" => array("contains", "is")
+ )
+ );
+
+ foreach ($fields as $field) {
+
+ $field_type = GFFormsModel::get_input_type($field);
+
+ $operators = isset($operators_by_field_type[$field_type]) ? $operators_by_field_type[$field_type] : $operators_by_field_type["default"];
+ if (!isset($field["choices"]) && !in_array("contains", $operators))
+ $operators[] = "contains";
+
+ $field_filter = array();
+ $key = $field["id"];
+ if ($field_type == "likert" && rgar($field, "gsurveyLikertEnableMultipleRows")) {
+ // multi-row likert fields
+ $field_filter["key"] = $key;
+ $field_filter["group"] = true;
+ $field_filter["text"] = GFFormsModel::get_label($field);
+ $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;
+ } elseif ($field_type == "name" && rgar($field, "nameFormat") == "" || $field_type == "address") {
+ // standard two input name field
+ $field_filter["key"] = $key;
+ $field_filter["group"] = true;
+ $field_filter["text"] = GFFormsModel::get_label($field);
+ $sub_filters = array();
+ $inputs = rgar($field, "inputs");
+ foreach ($inputs as $input) {
+ $sub_filter = array();
+ $sub_filter["key"] = rgar($input, "id");
+ $sub_filter["text"] = rgar($input, "label");
+ $sub_filter["preventMultiple"] = false;
+ $sub_filter["operators"] = $operators;
+ $sub_filters[] = $sub_filter;
+ }
+ $field_filter["filters"] = $sub_filters;
+ } else {
+ $field_filter["key"] = $key;
+ $field_filter["preventMultiple"] = false;
+ $field_filter["text"] = GFFormsModel::get_label($field);
+
+ $field_filter["operators"] = $operators;
+
+ if (isset($field["choices"]))
+ $field_filter["values"] = $field["choices"];
+
+
+ }
+ $field_filters[] = $field_filter;
+
+ }
+ $form_id = $form["id"];
+ $entry_meta_filters = self::get_entry_meta_filter_settings($form_id);
+ $field_filters = array_merge($field_filters, $entry_meta_filters);
+ $field_filters = array_values($field_filters); // reset the numeric keys in case some filters have been unset
+ $info_filters = self::get_entry_info_filter_settings();
+ $field_filters = array_merge($field_filters, $info_filters);
+ $field_filters = array_values($field_filters);
+ return $field_filters;
+ }
+
+ public static function get_entry_info_filter_settings() {
+ $settings = array();
+ $info_columns = self::get_entry_info_filter_columns();
+ foreach($info_columns as $key => $info_column){
+ $info_column["key"] = $key;
+ $info_column["preventMultiple"] = false;
+ $settings[] = $info_column;
+ }
+
+ return $settings;
+ }
+
+ public static function get_entry_info_filter_columns($get_users = true){
+ $account_choices = array();
+ if($get_users){
+ $args = apply_filters("gform_filters_get_users", array("number" => 200));
+ $accounts = get_users($args);
+ $account_choices = array();
+ foreach ($accounts as $account) {
+ $account_choices[] = array("text" => $account->user_login, "value" => $account->ID);
+ }
+ }
+ return array(
+ "entry_id" => array(
+ "text" => __("Entry ID", "gravityforms"),
+ "operators" => array( "is", "isnot", ">", "<")
+ ),
+ "date_created" => array(
+ "text" => __("Entry Date", "gravityforms"),
+ "operators" => array( "is", ">", "<"),
+ "placeholder" => __("yyyy-mm-dd", "gravityforms")
+ ),
+ "is_starred" => array(
+ "text" => __("Starred", "gravityforms"),
+ "operators" => array( "is", "isnot"),
+ "values" => array(
+ array(
+ "text" => "Yes",
+ "value" => "1"
+ ),
+ array(
+ "text" => "No",
+ "value" => "0"
+ )
+ )
+ ),
+ "ip" => array(
+ "text" => __("IP Address", "gravityforms"),
+ "operators" => array( "is", "isnot", ">", "<", "contains")
+ ),
+ "source_url" => array(
+ "text" => __("Source URL", "gravityforms"),
+ "operators" => array( "is", "isnot", ">", "<", "contains")
+ ),
+ "payment_status" => array(
+ "text" => __("Payment Status", "gravityforms"),
+ "operators" => array( "is", "isnot"),
+ "values" => array(
+ array(
+ "text" => "Approved",
+ "value" => "Approved"
+ ),
+ array(
+ "text" => "Failed",
+ "value" => "Failed"
+ ),
+ array(
+ "text" => "Active",
+ "value" => "Active"
+ ),
+ array(
+ "text" => "Cancelled",
+ "value" => "Cancelled"
+ )
+ )
+ ),
+ "payment_date" => array(
+ "text" => __("Payment Date", "gravityforms"),
+ "operators" => array( "is", "isnot", ">", "<")
+ ),
+ "payment_amount" => array(
+ "text" => __("Payment Amount", "gravityforms"),
+ "operators" => array( "is", "isnot", ">", "<", "contains")
+ ),
+ "transaction_id" => array(
+ "text" => __("Transaction ID", "gravityforms"),
+ "operators" => array( "is", "isnot", ">", "<", "contains")
+ ),
+ "created_by" => array(
+ "text" => __("User", "gravityforms"),
+ "operators" => array( "is", "isnot"),
+ "values" => $account_choices
+ )
+ );
+ }
+
+ public static function get_entry_meta_filter_settings($form_id) {
+ $filters = 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["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 static function get_field_filters_from_post(){
+ $field_filters = array();
+ $filter_fields = rgpost("f");
+ if (is_array($filter_fields)) {
+ $filter_operators = rgpost("o");
+ $filter_values = rgpost("v");
+ for ($i = 0; $i < count($filter_fields); $i++) {
+ $field_filter = array();
+ $key = $filter_fields[$i];
+ if("entry_id" == $key){
+ $key = "id";
+ }
+ $operator = $filter_operators[$i];
+ $val = $filter_values[$i];
+ $strpos_row_key = strpos($key, "|");
+ if ($strpos_row_key !== false) { //multi-row likert
+ $key_array = explode("|", $key);
+ $key = $key_array[0];
+ $val = $key_array[1] . ":" . $val;
+ }
+ $field_filter["key"] = $key;
+ $field_filter["operator"] = $operator;
+ $field_filter["value"] = $val;
+ $field_filters[] = $field_filter;
+ }
+ }
+ $field_filters["mode"] = rgpost("mode");
+ return $field_filters;
+ }
+
+ public static function has_multifile_fileupload_field($form){
+ $fileupload_fields = GFCommon::get_fields_by_type($form, array("fileupload", "post_custom_field"));
+ if(is_array($fileupload_fields)){
+ foreach($fileupload_fields as $field){
+ if(rgar($field, "multipleFiles"))
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static function localize_gform_gravityforms_multifile(){
+ wp_localize_script( 'gform_gravityforms', 'gform_gravityforms', array(
+ 'strings' => array(
+ 'invalid_file_extension' => __("This type of file is not allowed. Must be one of the following: ", "gravityforms" ),
+ 'delete_file' => __("Delete this file", "gravityforms"),
+ 'in_progress' => __("in progress", "gravityforms"),
+ 'file_exceeds_limit' => __("File exceeds size limit", "gravityforms"),
+ 'illegal_extension' => __("This type of file is not allowed." , "gravityforms"),
+ "max_reached" => __("Maximum number of files reached", "gravityforms"),
+ "unknown_error" => __("There was a problem while saving the file on the server", "gravityforms"),
+ "currently_uploading" => __("Please wait for the uploading to complete", "gravityforms"),
+ "cancel" => __("Cancel", "gravityforms"),
+ "cancel_upload" => __("Cancel this upload", "gravityforms"),
+ "cancelled" => __("Cancelled", "gravityforms")
+ ),
+ 'vars' => array(
+ 'images_url' => GFCommon::get_base_url() . "/images"
+ )
+ ) );
+ }
+
+ public static function safe_strlen($string){
+
+ if(function_exists("mb_strlen"))
+ return mb_strlen($string);
+ else
+ return strlen($string);
+
+ }
+
+ public static function safe_substr($string, $start, $length = null){
+ if(function_exists("mb_substr"))
+ return mb_substr($string, $start, $length);
+ else
+ return substr($string, $start, $length);
+ }
+
+ /**
+ * Reliablty compare floats.
+ * @param [float] $float1
+ * @param [float] $float2
+ * @param [string] $operator Supports: '<', '<=', '>', '>=', '==', '=', '!='
+ * @return [bool]
+ */
+ public static function compare_floats( $float1, $float2, $operator ) {
+
+ $epsilon = 0.00001;
+ $is_equal = abs( floatval( $float1 ) - floatval( $float2 ) ) < $epsilon;
+ $is_greater = floatval( $float1 ) > floatval( $float2 );
+ $is_less = floatval( $float1 ) < floatval( $float2 );
+
+ switch( $operator ) {
+ case '<':
+ return $is_less;
+ case '<=':
+ return $is_less || $is_equal;
+ case '>' :
+ return $is_greater;
+ case '>=':
+ return $is_greater || $is_equal;
+ case '==':
+ case '=':
+ return $is_equal;
+ case '!=':
+ return ! $is_equal;
+ }
+
+ }
+
+}
+
+class GFCategoryWalker extends Walker {
+ /**
+ * @see Walker::$tree_type
+ * @since 2.1.0
+ * @var string
+ */
+ var $tree_type = 'category';
+
+ /**
+ * @see Walker::$db_fields
+ * @since 2.1.0
+ * @todo Decouple this
+ * @var array
+ */
+ var $db_fields = array ('parent' => 'parent', 'id' => 'term_id');
+
+ /**
+ * @see Walker::start_el()
+ * @since 2.1.0
+ *
+ * @param string $output Passed by reference. Used to append additional content.
+ * @param object $category Category data object.
+ * @param int $depth Depth of category. Used for padding.
+ * @param array $args Uses 'selected' and 'show_count' keys, if they exist.
+ */
+ function start_el( &$output, $object, $depth = 0, $args = array(), $current_object_id = 0) {
+ //$pad = str_repeat(' ', $depth * 3);
+ $pad = str_repeat('─', $depth);
+ if(!empty($pad))
+ $pad .= " ";
+ $object->name = "{$pad}{$object->name}";
+ $output[] = $object;
+ }
+}
+
+/**
+ *
+ * Notes:
+ * 1. The WordPress Transients API does not support boolean
+ * values so boolean values should be converted to integers
+ * or arrays before setting the values as persistent.
+ *
+ * 2. The transients API only deletes the transient from the database
+ * when the transient is accessed after it has expired. WordPress doesn't
+ * do any garbage collection of transients.
+ *
+ */
+class GFCache {
+ private static $_transient_prefix = "GFCache_";
+ private static $_cache = array();
+
+ public static function get($key, &$found = null) {
+ global $blog_id;
+ if (is_multisite())
+ $key = $blog_id . ':' . $key;
+
+ if (isset(self::$_cache[$key])) {
+ $found = true;
+ $data = rgar(self::$_cache[$key], "data");
+
+ return $data;
+ }
+
+ $data = self::get_transient($key);
+
+ if (false === ($data)) {
+ $found = false;
+
+ return false;
+ } else {
+ self::$_cache[$key] = array("data" => $data, "is_persistent" => true);
+ $found = true;
+
+ return $data;
+ }
+
+ }
+
+ public static function set($key, $data, $is_persistent = false, $expiration = 0) {
+ global $blog_id;
+ $success = true;
+
+ if (is_multisite())
+ $key = $blog_id . ':' . $key;
+
+ if ($is_persistent)
+ $success = self::set_transient($key, $data, $expiration);
+
+ self::$_cache[$key] = array("data" => $data, "is_persistent" => $is_persistent);
+
+ return $success;
+ }
+
+ public static function delete($key) {
+ global $blog_id;
+ $success = true;
+
+ if (is_multisite())
+ $key = $blog_id . ':' . $key;
+
+ if (isset(self::$_cache[$key])) {
+ if (self::$_cache[$key]["is_persistent"])
+ $success = self::delete_transient($key);
+
+ unset(self::$_cache[$key]);
+ } else {
+ $success = self::delete_transient($key);
+
+ }
+
+ return $success;
+ }
+
+ public static function flush($flush_persistent = false) {
+ global $wpdb;
+
+ self::$_cache = array();
+
+ if(false === $flush_persistent)
+ return true;
+
+ if (is_multisite()) {
+ $sql = "
+ DELETE FROM $wpdb->sitemeta
+ WHERE meta_key LIKE '_site_transient_timeout_GFCache_%' OR
+ meta_key LIKE '_site_transient_GFCache_%'
+ ";
+ } else {
+ $sql = "
+ DELETE FROM $wpdb->options
+ WHERE option_name LIKE '_transient_timeout_GFCache_%' OR
+ option_name LIKE '_transient_GFCache_%'
+ ";
+
+ }
+ $rows_deleted = $wpdb->query($sql);
+
+ $success = $rows_deleted !== false ? true : false;
+
+ return $success;
+ }
+
+ private static function delete_transient($key) {
+ $key = self::$_transient_prefix . wp_hash($key);
+ if (is_multisite())
+ $success = delete_site_transient($key);
+ else
+ $success = delete_transient($key);
+
+ return $success;
+ }
+
+ private static function set_transient($key, $data, $expiration) {
+ $key = self::$_transient_prefix . wp_hash($key);
+ if (is_multisite())
+ $success = set_site_transient($key, $data, $expiration);
+ else
+ $success = set_transient($key, $data, $expiration);
+
+ return $success;
+ }
+
+ private static function get_transient($key) {
+ $key = self::$_transient_prefix . wp_hash($key);
+ if (is_multisite())
+ $data = get_site_transient($key);
+ else
+ $data = get_transient($key);
+
+ return $data;
+ }
+
}
\ No newline at end of file
diff --git a/css/admin.css b/css/admin.css
index 85dac72..a0be5c1 100644
--- a/css/admin.css
+++ b/css/admin.css
@@ -1400,6 +1400,16 @@ div.detail-note-content p {
line-height: 1.8;
}
+div.detail-note-content.gforms_note_success{
+ background-color: #ECFCDE;
+ border: 1px solid #A7C886;
+
+}
+div.detail-note-content.gforms_note_error{
+ background-color: #FFEBE8;
+ border: 1px solid #CC0000;
+
+}
/* edit details form styles ------------------------------------------------------*/
#namediv_admin {
@@ -2584,13 +2594,6 @@ div#gravity-title-icon {
background-position: 0 -350px;
}
-div#publishing-action {
- float: none !important;
- text-align: left !important;
- clear: both;
- margin: 14px 0 5px
-}
-
div#major-publishing-actions {
clear: both;
}
diff --git a/css/datepicker.css b/css/datepicker.css
index a703bd4..ba0cf92 100644
--- a/css/datepicker.css
+++ b/css/datepicker.css
@@ -3,7 +3,7 @@
Gravity Forms Date Picker Styles
http: //www.gravityforms.com
-updated: October 15, 2013 11:05 AM
+updated: January 31, 2014 3:32 PM
Customized styles for the jQuery UI Datepicker 1.9.2
copyright 2012 jQuery Foundation and other contributors
@@ -12,7 +12,7 @@ http://jquery.org/license
some styles courtesty of http://www.hongkiat.com/
Gravity Forms is a Rocketgenius project
-copyright 2013 Rocketgenius Inc.
+copyright 2008 - 2014 Rocketgenius Inc.
http: //www.rocketgenius.com
NOTE: DO NOT EDIT THIS FILE! MAKE ANY MODIFICATIONS IN YOUR
@@ -51,7 +51,7 @@ to no.
background-color: #666; /* set the header background color */
color: #e0e0e0;
font-weight: bold;
- -webkit-box-shadow: inset 0px 1px 1px 0px rgba(250, 250, 250, 2);
+ -webkit-box-shadow: inset 0px 1px 1px 0px rgba(250, 250, 250, .2);
-moz-box-shadow: inset 0px 1px 1px 0px rgba(250, 250, 250, .2);
box-shadow: inset 0px 1px 1px 0px rgba(250, 250, 250, .2);
text-shadow: 1px -1px 0px #000;
diff --git a/css/formsmain.css b/css/formsmain.css
index 1e10524..abd14b5 100644
--- a/css/formsmain.css
+++ b/css/formsmain.css
@@ -4,10 +4,10 @@
Gravity Forms Front End Form Styles
Version 1.8
http: //www.gravityforms.com
-updated: December 12 2013, 12:07 PM
+updated: January 31, 2014 3:35 PM
Gravity Forms is a Rocketgenius project
-copyright 2013 Rocketgenius Inc.
+copyright 2008-2014 Rocketgenius Inc.
http: //www.rocketgenius.com
this may not be redistributed without the
express written permission of the author.
@@ -1325,7 +1325,7 @@ body .gform_wrapper div.gform_body ul.gform_fields li.gfield.gfield_html dl dd {
background-image: -webkit-linear-gradient(center bottom, #EEE 0%, white 50%);
background-image: -moz-linear-gradient(center bottom, #EEE 0%, white 50%);
background-image: -o-linear-gradient(top, #EEE 0%,#FFF 50%);
- background-image: -ms-linear-gradient(top, #EEE 0%,#FFF 50%); filter: progid: DXImageTransform.Microsoft.gradient( startColorstr='#EEE', endColorstr='#FFF',GradientType=0 );
+ background-image: -ms-linear-gradient(top, #EEE 0%,#FFF 50%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#EEE', endColorstr='#FFF',GradientType=0 );
background-image: linear-gradient(top, #EEE 0%,#FFF 50%);
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
@@ -1367,7 +1367,7 @@ body .gform_wrapper div.gform_body ul.gform_fields li.gfield.gfield_html dl dd {
background-image: -moz-linear-gradient(center bottom, #CCC 0%, #EEE 60%);
background-image: -o-linear-gradient(bottom, #CCC 0%, #EEE 60%);
background-image: -ms-linear-gradient(top, #CCC 0%,#EEE 60%);
- filter: progid: DXImageTransform.Microsoft.gradient( startColorstr='#CCC', endColorstr='#EEE',GradientType=0 );
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#CCC', endColorstr='#EEE',GradientType=0 );
background-image: linear-gradient(top, #CCC 0%,#EEE 60%);
border-left: 1px solid #AAA;
position: absolute;
@@ -1426,7 +1426,7 @@ body .gform_wrapper div.gform_body ul.gform_fields li.gfield.gfield_html dl dd {
background-image: -moz-linear-gradient(center bottom, white 85%, #EEE 99%);
background-image: -o-linear-gradient(bottom, white 85%, #EEE 99%);
background-image: -ms-linear-gradient(top, #FFF 85%,#EEE 99%);
- filter: progid: DXImageTransform.Microsoft.gradient( startColorstr='#FFF', endColorstr='#EEE',GradientType=0 );
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FFF', endColorstr='#EEE',GradientType=0 );
background-image: linear-gradient(top, #FFF 85%,#EEE 99%);
border: 1px solid #AAA;
margin: 0;
@@ -1478,7 +1478,7 @@ body .gform_wrapper div.gform_body ul.gform_fields li.gfield.gfield_html dl dd {
background-image: -moz-linear-gradient(center bottom, #E4E4E4 0%, #EEE 70%);
background-image: -o-linear-gradient(bottom, #E4E4E4 0%, #EEE 70%);
background-image: -ms-linear-gradient(top, #E4E4E4 0%,#EEE 70%);
- filter: progid: DXImageTransform.Microsoft.gradient( startColorstr='#E4E4E4', endColorstr='#EEE',GradientType=0 );
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#E4E4E4', endColorstr='#EEE',GradientType=0 );
background-image: linear-gradient(top, #E4E4E4 0%,#EEE 70%);
color: #333;
border: 1px solid #B4B4B4;
@@ -1509,7 +1509,7 @@ body .gform_wrapper div.gform_body ul.gform_fields li.gfield.gfield_html dl dd {
background-repeat: no-repeat;
}
-.gform_wrapper .chzn-container-multi .chzn-choices .search-choice .search-choice-close: hover {
+.gform_wrapper .chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
background-position: right -9px;
}
@@ -1594,7 +1594,7 @@ body .gform_wrapper div.gform_body ul.gform_fields li.gfield.gfield_html dl dd {
background-image: -moz-linear-gradient(center bottom, white 0%, #EEE 50%);
background-image: -o-linear-gradient(bottom, white 0%, #EEE 50%);
background-image: -ms-linear-gradient(top, #FFF 0%,#EEE 50%);
- filter: progid: DXImageTransform.Microsoft.gradient( startColorstr='#FFF', endColorstr='#EEE',GradientType=0 );
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FFF', endColorstr='#EEE',GradientType=0 );
background-image: linear-gradient(top, #FFF 0%,#EEE 50%);
-webkit-border-bottom-left-radius : 0;
-webkit-border-bottom-right-radius: 0;
diff --git a/css/rtl.css b/css/rtl.css
index 274ac94..6b36a27 100644
--- a/css/rtl.css
+++ b/css/rtl.css
@@ -1,13 +1,14 @@
+
/*
----------------------------------------------------------------
rtl.css
Gravity Forms RTL Language Support
http://www.gravityforms.com
-updated: May 7, 2013 10:52 PM
+updated: February 24, 2014 7:49 AM
Gravity Forms is a Rocketgenius project
-copyright 2013 Rocketgenius Inc.
+copyright 2013-2014 Rocketgenius Inc.
http: //www.rocketgenius.com
this may not be redistributed without the
express written permission of the author.
@@ -508,7 +509,6 @@ html[dir="rtl"] body.wp-admin .gform_tabs li.active a {
html[dir="rtl"] body.wp-admin a.tooltip,
html[dir="rtl"] body.wp-admin a.tooltip_left,
html[dir="rtl"] body.wp-admin a.tooltip_bottomleft {
- text-indent: 9000px;
overflow: hidden;
}
diff --git a/currency.php b/currency.php
index 6518f63..979b66b 100644
--- a/currency.php
+++ b/currency.php
@@ -1,4 +1,9 @@
$key,
- "type" => rgempty("type", $_GET) ? "field" : rgget("type"),
+ "type" => $type,
"operator" => rgempty("operator", $_GET) ? "is" : rgget("operator"),
"value" => $val
);
@@ -157,6 +167,8 @@ public static function lead_detail_page(){
case "delete" :
check_admin_referer('gforms_save_entry', 'gforms_save_entry');
+ if(!GFCommon::current_user_can_any("gravityforms_delete_entries"))
+ die(__("You don't have adequate permissions to delete entries.", "gravityforms"));
RGFormsModel::delete_lead($lead["id"]);
?>
" . $confirmation_message . "