Calculated Fields Form - Version 1.0.235

Version Description

  • Modifies the operations: ROUND, CEIL and FLOOR for accepting a second parameter (optional) and rounding the number in multiples of second parameter.
  • Modifies the appearance of the forms builder settings in the free version of the plugin.
  • The fields' tags to insert into the results shortcodes (paid versions of the plugin) accept a new set of attributes for taking more control about how and whe to include the fields (if_value_is_greater_than, if_value_is_greater_than_or_equal_to, if_value_is_less_than, if_value_is_less_than_or_equal_to, if_value_is, if_value_is_not, if_value_like and if_value_unlike)
Download this release

Release Info

Developer codepeople
Plugin Icon 128x128 Calculated Fields Form
Version 1.0.235
Comparing to
See all releases

Code changes from version 1.0.231 to 1.0.235

README.txt CHANGED
@@ -115,6 +115,7 @@ The plugin has two additional (commercial) versions: **Premium** and **Developer
115
  * Includes the ip2location add-on to identify the users data from the ip2location databases. Requires PHP 5.3 and over.
116
  * Includes the "Google Places" add-on that allows integrate the input fields with the Google Places API to autocomplete the addresses entered by the users.
117
  * Includes the "Signature" add-on to convert some form fields in "Signature" fields, allowing the users to sign with the mouse or directly in the touchscreens.
 
118
  * Includes the "WebMerge" add-on to integrate the forms with the WebMerge Service, and generate PDF and Office documents at runtime with the information collected by the forms.
119
  * Includes the "MailChimp" add-on to add new members to the MailChimp Service using the data collected by the form.
120
  * Includes the "Emma" add-on to add new members to the Emma Service using the data collected by the form.
@@ -373,6 +374,12 @@ The "Signature" add-on converts the selected fields in "Signature" fields, allow
373
 
374
  [CLICK HERE for additional information ](http://cff.dwbooster.com/documentation#signature-addon "Signature add-on")
375
 
 
 
 
 
 
 
376
  = WebMerge add-on - Only available in the Platinum version of the plugin =
377
 
378
  The "WebMerge" add-on integrates the forms with the WebMerge Service, and generate PDF and Office documents at runtime with the information collected by the forms.
@@ -871,6 +878,25 @@ A: Please, visit the following entry in our technical blog:
871
 
872
  == Changelog ==
873
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
874
  = 1.0.231 =
875
 
876
  * Fixes an issue in the fields validation.
@@ -904,30 +930,8 @@ A: Please, visit the following entry in our technical blog:
904
  * Fixes an issue accepting .rar files with the Uploads add-on(Platinum version).
905
  * Allows to select groups by default in the MailChimp add-on(Platinum version).
906
 
907
- = 1.0.225 =
908
-
909
- * Fixes an issue in the definition of dependencies in the calculated fields.
910
-
911
- = 1.0.224 =
912
-
913
- * Modifies the size of the container fields to improve dragging fields into the containers.
914
- * Fixes an issue with the validation rules in the non-visible fields (fields into hidden containers).
915
- * Includes a new special attribute in the form's shortcode (class), to assign class names to the forms.
916
- * Dissables the submit button when it is pressed to prevent the form be submitted multiple times (Professional, Developer and Platinum versions).
917
- * Fixes an issue with the Widgets (Professional, Developer and Platinum versions).
918
- * Fixes an issue checking if the nonce that protects the public form is active or not (Professional, Developer and Platinum versions).
919
- * Modifies the way that the cp_calculatedfieldsf_insert_in_database.php file is included, to allow include in the $params array the itemnumber, that represents the submission's id (Developer and Platinum versions).
920
-
921
- = 1.0.223 =
922
-
923
- * Modifies the default title in the Acceptance control.
924
-
925
- = 1.0.222 =
926
-
927
- * Includes the Acceptance (GDPR) control for inserting a required checkbox field in the form for asking the users their consent to store and use the information provided.
928
-
929
  == Upgrade Notice ==
930
 
931
- = 1.0.231 =
932
 
933
  Important note: If you are using the Professional version don't update via the WP dashboard but using your personal update link. Contact us if you need further information: http://cff.dwbooster.com/contact-us
115
  * Includes the ip2location add-on to identify the users data from the ip2location databases. Requires PHP 5.3 and over.
116
  * Includes the "Google Places" add-on that allows integrate the input fields with the Google Places API to autocomplete the addresses entered by the users.
117
  * Includes the "Signature" add-on to convert some form fields in "Signature" fields, allowing the users to sign with the mouse or directly in the touchscreens.
118
+ * Includes the "iCal" add-on for sending the users an iCal file as part of the confirmation email after the form submission to be imported into most popular calendars like Outlook and Google Calendar.
119
  * Includes the "WebMerge" add-on to integrate the forms with the WebMerge Service, and generate PDF and Office documents at runtime with the information collected by the forms.
120
  * Includes the "MailChimp" add-on to add new members to the MailChimp Service using the data collected by the form.
121
  * Includes the "Emma" add-on to add new members to the Emma Service using the data collected by the form.
374
 
375
  [CLICK HERE for additional information ](http://cff.dwbooster.com/documentation#signature-addon "Signature add-on")
376
 
377
+ = iCal add-on - Only available in the Platinum version of the plugin =
378
+
379
+ The "iCal" add-on sends the users an iCal file as part of the confirmation email after the form submission to be imported into most popular calendars like Outlook and Google Calendar.
380
+
381
+ [CLICK HERE for additional information ](http://cff.dwbooster.com/documentation#ical-addon "iCal add-on")
382
+
383
  = WebMerge add-on - Only available in the Platinum version of the plugin =
384
 
385
  The "WebMerge" add-on integrates the forms with the WebMerge Service, and generate PDF and Office documents at runtime with the information collected by the forms.
878
 
879
  == Changelog ==
880
 
881
+ = 1.0.235 =
882
+
883
+ * Modifies the operations: ROUND, CEIL and FLOOR for accepting a second parameter (optional) and rounding the number in multiples of second parameter.
884
+ * Modifies the appearance of the forms builder settings in the free version of the plugin.
885
+ * The fields' tags to insert into the results shortcodes (paid versions of the plugin) accept a new set of attributes for taking more control about how and whe to include the fields (if_value_is_greater_than, if_value_is_greater_than_or_equal_to, if_value_is_less_than, if_value_is_less_than_or_equal_to, if_value_is, if_value_is_not, if_value_like and if_value_unlike)
886
+
887
+ = 1.0.234 =
888
+
889
+ * Modifies the code to be compatible with older versions of PHP.
890
+
891
+ = 1.0.233 =
892
+
893
+ * Fixes an issue generating the revisions table.
894
+
895
+ = 1.0.232 =
896
+
897
+ * Includes the revisions module to create different revisions of the forms when they are updated.
898
+ * Modifies the code that generates the forms to prevent that uncaugth javascript errors in the webpage affect the forms.
899
+
900
  = 1.0.231 =
901
 
902
  * Fixes an issue in the fields validation.
930
  * Fixes an issue accepting .rar files with the Uploads add-on(Platinum version).
931
  * Allows to select groups by default in the MailChimp add-on(Platinum version).
932
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
933
  == Upgrade Notice ==
934
 
935
+ = 1.0.235 =
936
 
937
  Important note: If you are using the Professional version don't update via the WP dashboard but using your personal update link. Contact us if you need further information: http://cff.dwbooster.com/contact-us
changelog.txt CHANGED
@@ -1,5 +1,24 @@
1
  == Changelog ==
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  = 1.0.231 =
4
 
5
  * Fixes an issue in the fields validation.
1
  == Changelog ==
2
 
3
+ = 1.0.235 =
4
+
5
+ * Modifies the operations: ROUND, CEIL and FLOOR for accepting a second parameter (optional) and rounding the number in multiples of second parameter.
6
+ * Modifies the appearance of the forms builder settings in the free version of the plugin.
7
+ * The fields' tags to insert into the results shortcodes (paid versions of the plugin) accept a new set of attributes for taking more control about how and whe to include the fields (if_value_is_greater_than, if_value_is_greater_than_or_equal_to, if_value_is_less_than, if_value_is_less_than_or_equal_to, if_value_is, if_value_is_not, if_value_like and if_value_unlike)
8
+
9
+ = 1.0.234 =
10
+
11
+ * Modifies the code to be compatible with older versions of PHP.
12
+
13
+ = 1.0.233 =
14
+
15
+ * Fixes an issue generating the revisions table.
16
+
17
+ = 1.0.232 =
18
+
19
+ * Includes the revisions module to create different revisions of the forms when they are updated.
20
+ * Modifies the code that generates the forms to prevent that uncaugth javascript errors in the webpage affect the forms.
21
+
22
  = 1.0.231 =
23
 
24
  * Fixes an issue in the fields validation.
config/cpcff_config.cfg.php CHANGED
@@ -70,6 +70,7 @@ define('CP_CALCULATEDFIELDSF_DEFAULT_PAYPAL_LANGUAGE','EN');
70
  // Database table names
71
  global $wpdb;
72
  define('CP_CALCULATEDFIELDSF_FORMS_TABLE', 'cp_calculated_fields_form_settings');
 
73
  define('CP_CALCULATEDFIELDSF_DISCOUNT_CODES_TABLE_NAME_NO_PREFIX', "cp_calculated_fields_form_discount_codes");
74
  define('CP_CALCULATEDFIELDSF_DISCOUNT_CODES_TABLE_NAME', @$wpdb->prefix ."cp_calculated_fields_form_discount_codes");
75
  define('CP_CALCULATEDFIELDSF_POSTS_TABLE_NAME_NO_PREFIX', "cp_calculated_fields_form_posts");
70
  // Database table names
71
  global $wpdb;
72
  define('CP_CALCULATEDFIELDSF_FORMS_TABLE', 'cp_calculated_fields_form_settings');
73
+ define('CP_CALCULATEDFIELDSF_FORMS_REVISIONS_TABLE', 'cp_calculated_fields_form_revision');
74
  define('CP_CALCULATEDFIELDSF_DISCOUNT_CODES_TABLE_NAME_NO_PREFIX', "cp_calculated_fields_form_discount_codes");
75
  define('CP_CALCULATEDFIELDSF_DISCOUNT_CODES_TABLE_NAME', @$wpdb->prefix ."cp_calculated_fields_form_discount_codes");
76
  define('CP_CALCULATEDFIELDSF_POSTS_TABLE_NAME_NO_PREFIX', "cp_calculated_fields_form_posts");
cp_calculatedfieldsf_free.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Calculated Fields Form
4
  Plugin URI: https://cff.dwbooster.com
5
  Description: Create forms with field values calculated based in other form field values.
6
- Version: 1.0.231
7
  Text Domain: calculated-fields-form
8
  Author: CodePeople
9
  Author URI: https://cff.dwbooster.com
@@ -20,7 +20,7 @@ require_once 'inc/cpcff_session.inc.php';
20
  if( !defined('DOING_AJAX') ) CP_SESSION::session_start();
21
 
22
  // Defining main constants
23
- define('CP_CALCULATEDFIELDSF_VERSION', '1.0.231' );
24
  define('CP_CALCULATEDFIELDSF_MAIN_FILE_PATH', __FILE__ );
25
  define('CP_CALCULATEDFIELDSF_BASE_PATH', dirname( CP_CALCULATEDFIELDSF_MAIN_FILE_PATH ) );
26
  define('CP_CALCULATEDFIELDSF_BASE_NAME', plugin_basename( CP_CALCULATEDFIELDSF_MAIN_FILE_PATH ) );
3
  Plugin Name: Calculated Fields Form
4
  Plugin URI: https://cff.dwbooster.com
5
  Description: Create forms with field values calculated based in other form field values.
6
+ Version: 1.0.235
7
  Text Domain: calculated-fields-form
8
  Author: CodePeople
9
  Author URI: https://cff.dwbooster.com
20
  if( !defined('DOING_AJAX') ) CP_SESSION::session_start();
21
 
22
  // Defining main constants
23
+ define('CP_CALCULATEDFIELDSF_VERSION', '1.0.235' );
24
  define('CP_CALCULATEDFIELDSF_MAIN_FILE_PATH', __FILE__ );
25
  define('CP_CALCULATEDFIELDSF_BASE_PATH', dirname( CP_CALCULATEDFIELDSF_MAIN_FILE_PATH ) );
26
  define('CP_CALCULATEDFIELDSF_BASE_NAME', plugin_basename( CP_CALCULATEDFIELDSF_MAIN_FILE_PATH ) );
css/style.css CHANGED
@@ -135,6 +135,9 @@ a.helpfbuilder{font-size:80%;text-decoration:underline;color:#00f;cursor:pointer
135
 
136
  .ui-state-highlight { height: 65px; line-height: 65px; }
137
 
 
 
 
138
  @media only screen and (max-width: 640px){
139
  .cff-custom-table,
140
  .cff-custom-table thead,
@@ -167,7 +170,22 @@ a.helpfbuilder{font-size:80%;text-decoration:underline;color:#00f;cursor:pointer
167
  .ctrlsColumn{width:100% !important;position:relative !important;}
168
  .form-builder .button{margin:0; padding:0;width:50%;}
169
  #fbuilder{margin-top:10px;padding:0;}
 
 
 
170
  }
171
  @media only screen and (max-width: 480px){
172
  .cff-custom-table input[type="button"]{margin:0 !important; width:100% !important;display:block !important;}
173
- }
 
 
 
 
 
 
 
 
 
 
 
 
135
 
136
  .ui-state-highlight { height: 65px; line-height: 65px; }
137
 
138
+ .cff-revisions-container{float:right;padding:10px;}
139
+ .cff-form-name-shortcode{font-size:0.8em;}
140
+
141
  @media only screen and (max-width: 640px){
142
  .cff-custom-table,
143
  .cff-custom-table thead,
170
  .ctrlsColumn{width:100% !important;position:relative !important;}
171
  .form-builder .button{margin:0; padding:0;width:50%;}
172
  #fbuilder{margin-top:10px;padding:0;}
173
+ .cff-form-name-shortcode{display:none;}
174
+ .cff-revisions-container{float:none; width:100%;padding:10px 5%;}
175
+ .cff_form_builder .postbox .cff-revisions-container select{width:90% !important;}
176
  }
177
  @media only screen and (max-width: 480px){
178
  .cff-custom-table input[type="button"]{margin:0 !important; width:100% !important;display:block !important;}
179
+ }
180
+
181
+ #metabox_basic_settings0,
182
+ #metabox_basic_settings1,
183
+ #metabox_basic_settings2,
184
+ #metabox_basic_settings3,
185
+ #metabox_basic_settings4{cursor:pointer !important;}
186
+
187
+ #metabox_basic_settings0 * ,
188
+ #metabox_basic_settings1 * ,
189
+ #metabox_basic_settings2 * ,
190
+ #metabox_basic_settings3 * ,
191
+ #metabox_basic_settings4 * {color:#bfbdbd91 !important;pointer-events: none !important;}
inc/cpcff_admin_int.inc.php CHANGED
@@ -18,6 +18,15 @@ if (!defined('CP_CALCULATEDFIELDSF_ID'))
18
  $cpcff_main = CPCFF_MAIN::instance();
19
  $form_obj = $cpcff_main->get_form(intval($_GET["cal"]));
20
 
 
 
 
 
 
 
 
 
 
21
  if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset( $_POST['cp_calculatedfieldsf_post_options'] ) )
22
  echo "<div id='setting-error-settings_updated' class='updated settings-error'> <p><strong>".__( 'Settings saved', 'calculated-fields-form' )."</strong></p></div>";
23
 
@@ -33,7 +42,7 @@ $cpcff_texts_array = CPCFF_AUXILIARY::array_replace_recursive(
33
  ?>
34
  <div class="wrap">
35
  <h1><?php
36
- print __( 'Calculated Fields Form', 'calculated-fields-form' ).' [<b>'.__('Form', 'calculated-fields-form').' '.CP_CALCULATEDFIELDSF_ID.' - '.$form_obj->get_option( 'form_name', '').'</b>]';
37
  ?></h1>
38
 
39
  <input type="button" name="backbtn" value="<?php esc_attr_e( 'Back to items list...', 'calculated-fields-form' ); ?>" onclick="document.location='admin.php?page=cp_calculated_fields_form';">
@@ -50,7 +59,25 @@ $cpcff_texts_array = CPCFF_AUXILIARY::array_replace_recursive(
50
  <hr />
51
  <div><?php _e( '* Different form styles available on the tab Form Settings &gt;&gt; Form Template', 'calculated-fields-form' ); ?></div>
52
  <div id="metabox_basic_settings" class="postbox" >
53
- <h3 class='hndle' style="padding:5px;"><span><?php _e( 'Form Builder', 'calculated-fields-form' ); ?></span></h3>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  <div class="inside">
55
  <div class="form-builder-error-messages"><?php
56
  global $cff_structure_error;
@@ -77,6 +104,20 @@ $cpcff_texts_array = CPCFF_AUXILIARY::array_replace_recursive(
77
  calculatedFieldsFormImport(); return;
78
  }
79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  var f = $calculatedfieldsfQuery("#fbuilder").fbuilder();
81
  window['cff_form'] = f;
82
  f.fBuild.loadData( "form_structure", "templates" );
@@ -92,45 +133,13 @@ $cpcff_texts_array = CPCFF_AUXILIARY::array_replace_recursive(
92
  f.fBuild.addItem(ui.draggable.attr("id"));
93
  }
94
  });
95
- jQuery("#metabox_basic_settings0").append('<div id="c0" style="position:absolute;top:0px;left:0px;background:#aaa;z-index:1;"></div>');
96
- jQuery("#c0").css({ opacity: 0.5 });
97
- jQuery("#c0").click( function(){
98
  if(confirm("<?php _e( 'These features aren\'t available in this version. Do you want to open the plugin\'s page to check other versions?', 'calculated-fields-form' ); ?>"))
99
  document.location = 'https://cff.dwbooster.com/';
100
- } );
101
- jQuery("#metabox_basic_settings1").append('<div id="c1" style="position:absolute;top:0px;left:0px;background:#aaa;z-index:1;"></div>');
102
- jQuery("#c1").css({ opacity: 0.5 });
103
- jQuery("#c1").click( function(){
104
- if(confirm("<?php _e( 'These features aren\'t available in this version. Do you want to open the plugin\'s page to check other versions?', 'calculated-fields-form' ); ?>"))
105
- document.location = 'https://cff.dwbooster.com/';
106
- } );
107
- jQuery("#metabox_basic_settings2").append('<div id="c2" style="position:absolute;top:0px;left:0px;background:#aaa;z-index:1;"></div>');
108
- jQuery("#c2").css({ opacity: 0.5 });
109
- jQuery("#c2").click( function(){
110
- if(confirm("<?php _e( 'These features aren\'t available in this version. Do you want to open the plugin\'s page to check other versions?', 'calculated-fields-form' ); ?>"))
111
- document.location = 'https://cff.dwbooster.com/';
112
- } );
113
- jQuery("#metabox_basic_settings3").append('<div id="c3" style="position:absolute;top:0px;left:0px;background:#aaa;z-index:1;"></div>');
114
- jQuery("#c3").css({ opacity: 0.5 });
115
- jQuery("#c3").click( function(){
116
- if(confirm("<?php _e( 'These features aren\'t available in this version. Do you want to open the plugin\'s page to check other versions?', 'calculated-fields-form' ); ?>"))
117
- document.location = 'https://cff.dwbooster.com/';
118
- } );
119
- jQuery("#metabox_basic_settings4").append('<div id="c4" style="position:absolute;top:0px;left:0px;background:#aaa;z-index:1;"></div>');
120
- jQuery("#c4").css({ opacity: 0.5 });
121
- jQuery("#c4").click( function(){
122
- if(confirm("<?php _e( 'These features aren\'t available in this version. Do you want to open the plugin\'s page to check other versions?', 'calculated-fields-form' ); ?>"))
123
- document.location = 'https://cff.dwbooster.com/';
124
- } );
125
- var rLayer = function(){
126
- jQuery("#c0").css("width",jQuery("#metabox_basic_settings0").width()+"px").css("height",jQuery("#metabox_basic_settings0").height()+"px");
127
- jQuery("#c1").css("width",jQuery("#metabox_basic_settings1").width()+"px").css("height",jQuery("#metabox_basic_settings1").height()+"px");
128
- jQuery("#c2").css("width",jQuery("#metabox_basic_settings2").width()+"px").css("height",jQuery("#metabox_basic_settings2").height()+"px");
129
- jQuery("#c3").css("width",jQuery("#metabox_basic_settings3").width()+"px").css("height",jQuery("#metabox_basic_settings3").height()+"px");
130
- jQuery("#c4").css("width",jQuery("#metabox_basic_settings4").width()+"px").css("height",jQuery("#metabox_basic_settings4").height()+"px");
131
- }
132
- rLayer();
133
- jQuery(window).resize(function() {rLayer();});
134
  };
135
 
136
  function calculatedFieldsFormImport()
@@ -226,7 +235,7 @@ $cpcff_texts_array = CPCFF_AUXILIARY::array_replace_recursive(
226
  </div>
227
 
228
  <p class="submit">
229
- <input type="submit" name="save" id="save" class="button-primary" value="<?php esc_attr_e( 'Save Changes', 'calculated-fields-form' ); ?>" title="Saves the form's structure and settings" />
230
  <input type="button" name="previewbtn" id="previewbtn" class="button-primary" value="<?php esc_attr_e( 'Preview', 'calculated-fields-form' ); ?>" onclick="jQuery.fbuilder.preview( this );" title="Saves the form's structure only, and opens a preview windows" />
231
  </p>
232
 
@@ -347,7 +356,7 @@ $cpcff_texts_array = CPCFF_AUXILIARY::array_replace_recursive(
347
  </div>
348
 
349
  <p class="submit">
350
- <input type="submit" name="save" id="save" class="button-primary" value="<?php esc_attr_e( 'Save Changes', 'calculated-fields-form' ); ?>" title="Saves the form's structure and settings" />
351
  </p>
352
 
353
  [<a href="https://cff.dwbooster.com/customization" target="_blank"><?php _e( 'Request Custom Modifications', 'calculated-fields-form' ); ?></a>] | [<a href="https://wordpress.org/support/plugin/calculated-fields-form#new-post" target="_blank"><?php _e( 'Help', 'calculated-fields-form' ); ?></a>]
18
  $cpcff_main = CPCFF_MAIN::instance();
19
  $form_obj = $cpcff_main->get_form(intval($_GET["cal"]));
20
 
21
+ if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset( $_POST['cpcff_revision_to_apply'] ) )
22
+ {
23
+ $revision_id = @intval($_POST['cpcff_revision_to_apply']);
24
+ if($revision_id)
25
+ {
26
+ $form_obj->apply_revision($revision_id);
27
+ }
28
+ }
29
+
30
  if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset( $_POST['cp_calculatedfieldsf_post_options'] ) )
31
  echo "<div id='setting-error-settings_updated' class='updated settings-error'> <p><strong>".__( 'Settings saved', 'calculated-fields-form' )."</strong></p></div>";
32
 
42
  ?>
43
  <div class="wrap">
44
  <h1><?php
45
+ print __( 'Calculated Fields Form', 'calculated-fields-form' ).' <span class="cff-form-name-shortcode">(<b>'.__('Form', 'calculated-fields-form').' '.CP_CALCULATEDFIELDSF_ID.' - '.$form_obj->get_option( 'form_name', '').'</b>) Shortcode: [CP_CALCULATED_FIELDS id="'.CP_CALCULATEDFIELDSF_ID.'"]</span>';
46
  ?></h1>
47
 
48
  <input type="button" name="backbtn" value="<?php esc_attr_e( 'Back to items list...', 'calculated-fields-form' ); ?>" onclick="document.location='admin.php?page=cp_calculated_fields_form';">
59
  <hr />
60
  <div><?php _e( '* Different form styles available on the tab Form Settings &gt;&gt; Form Template', 'calculated-fields-form' ); ?></div>
61
  <div id="metabox_basic_settings" class="postbox" >
62
+ <div class="hndle">
63
+ <h3 style="padding:5px;display:inline-block;"><span><?php _e( 'Form Builder', 'calculated-fields-form' ); ?></span></h3>
64
+ <div class="cff-revisions-container">
65
+ <?php _e('Revisions','calculated-fields-form'); ?>
66
+ <select name="cff_revision_list">
67
+
68
+ <?php
69
+ print '<option value="0">'.esc_html(__('Select a revision', 'calculated-fields-form')).'</option>';
70
+ $revisions_obj = $form_obj->get_revisions();
71
+ $revisions = $revisions_obj->revisions_list();
72
+ foreach($revisions as $revision_id => $revision_data)
73
+ {
74
+ print '<option value="'.esc_attr($revision_id).'">'.esc_html($revision_data['time']).'</option>';
75
+ }
76
+ ?>
77
+ </select>
78
+ <input type="button" name="cff_apply_revision" value="<?php print esc_attr('Load Revision', 'calculated-fields-form'); ?>" />
79
+ </div>
80
+ </div>
81
  <div class="inside">
82
  <div class="form-builder-error-messages"><?php
83
  global $cff_structure_error;
104
  calculatedFieldsFormImport(); return;
105
  }
106
 
107
+ /* Revisions code */
108
+ $calculatedfieldsfQuery('[name="cff_apply_revision"]').click(
109
+ function(){
110
+ var revision = $calculatedfieldsfQuery('[name="cff_revision_list"]').val();
111
+ if(revision*1)
112
+ {
113
+ result = window.confirm('<?php print esc_js(__('The action will load the revision selected, the data are not stored will be lose. Do you want continue?', 'calculated-fields-form'));?>');
114
+ if(result)
115
+ {
116
+ $calculatedfieldsfQuery('<form method="post" action="" name="cpformconf" class="cff_form_builder"><input type="hidden" name="_cpcff_nonce" value="<?php echo wp_create_nonce( 'session_id_'.CP_SESSION::session_id() ); ?>" /><input name="cp_calculatedfieldsf_id" type="hidden" value="<?php echo CP_CALCULATEDFIELDSF_ID; ?>" /><input type="hidden" name="cpcff_revision_to_apply" value="'+revision+'"></form>').appendTo('body').submit();
117
+ }
118
+ }
119
+ }
120
+ );
121
  var f = $calculatedfieldsfQuery("#fbuilder").fbuilder();
122
  window['cff_form'] = f;
123
  f.fBuild.loadData( "form_structure", "templates" );
133
  f.fBuild.addItem(ui.draggable.attr("id"));
134
  }
135
  });
136
+ jQuery("#metabox_basic_settings0,#metabox_basic_settings1,#metabox_basic_settings2,#metabox_basic_settings3,#metabox_basic_settings4")
137
+ .click( function(){
 
138
  if(confirm("<?php _e( 'These features aren\'t available in this version. Do you want to open the plugin\'s page to check other versions?', 'calculated-fields-form' ); ?>"))
139
  document.location = 'https://cff.dwbooster.com/';
140
+ })
141
+ .find('*')
142
+ .prop('disabled', true);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
  };
144
 
145
  function calculatedFieldsFormImport()
235
  </div>
236
 
237
  <p class="submit">
238
+ <input type="submit" name="save" id="save" class="button-primary" value="<?php esc_attr_e( 'Save Changes', 'calculated-fields-form' ); ?>" title="Saves the form's structure and settings and creates a revision" />
239
  <input type="button" name="previewbtn" id="previewbtn" class="button-primary" value="<?php esc_attr_e( 'Preview', 'calculated-fields-form' ); ?>" onclick="jQuery.fbuilder.preview( this );" title="Saves the form's structure only, and opens a preview windows" />
240
  </p>
241
 
356
  </div>
357
 
358
  <p class="submit">
359
+ <input type="submit" name="save" id="save" class="button-primary" value="<?php esc_attr_e( 'Save Changes', 'calculated-fields-form' ); ?>" title="Saves the form's structure and settings and creates a revision" />
360
  </p>
361
 
362
  [<a href="https://cff.dwbooster.com/customization" target="_blank"><?php _e( 'Request Custom Modifications', 'calculated-fields-form' ); ?></a>] | [<a href="https://wordpress.org/support/plugin/calculated-fields-form#new-post" target="_blank"><?php _e( 'Help', 'calculated-fields-form' ); ?></a>]
inc/cpcff_form.inc.php CHANGED
@@ -5,6 +5,7 @@
5
  * @package CFF.
6
  * @since 1.0.179
7
  */
 
8
 
9
  if(!class_exists('CPCFF_FORM'))
10
  {
@@ -39,6 +40,10 @@ if(!class_exists('CPCFF_FORM'))
39
  */
40
  private $_fields;
41
 
 
 
 
 
42
  /*********************************** PUBLIC METHODS ********************************************/
43
 
44
  /**
@@ -51,6 +56,7 @@ if(!class_exists('CPCFF_FORM'))
51
  $this->_id = $id;
52
  $this->_settings = array();
53
  $this->_fields = array();
 
54
  } // End __construct
55
 
56
  /**
@@ -129,7 +135,7 @@ if(!class_exists('CPCFF_FORM'))
129
  )
130
  )
131
  {
132
- return new Self($wpdb->insert_id);
133
  }
134
  return false;
135
  } // End create_default
@@ -294,15 +300,46 @@ if(!class_exists('CPCFF_FORM'))
294
  'cv_text_enter_valid_captcha' => (isset($params['cv_text_enter_valid_captcha'])) ? $params['cv_text_enter_valid_captcha'] : CP_CALCULATEDFIELDSF_DEFAULT_cv_text_enter_valid_captcha
295
  );
296
 
297
- return $wpdb->update (
298
  $wpdb->prefix.CP_CALCULATEDFIELDSF_FORMS_TABLE,
299
  $data,
300
  array( 'id' => $this->_id ),
301
  array( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ),
302
  array( '%d' )
303
  );
 
 
 
304
  } // End save_settings
305
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
306
  /**
307
  * Updates the form's name
308
  *
@@ -330,6 +367,7 @@ if(!class_exists('CPCFF_FORM'))
330
  public function delete_form()
331
  {
332
  global $wpdb;
 
333
  return $wpdb->delete(
334
  $wpdb->prefix.CP_CALCULATEDFIELDSF_FORMS_TABLE,
335
  array('id' => $this->_id),
@@ -351,8 +389,7 @@ if(!class_exists('CPCFF_FORM'))
351
  global $wpdb;
352
  if(empty($this->_settings))
353
  {
354
- $row = $wpdb->get_row($wpdb->prepare("SELECT * FROM ".$wpdb->prefix.CP_CALCULATEDFIELDSF_FORMS_TABLE." WHERE id=%d", $this->_id), ARRAY_A);
355
-
356
  if(!empty($row)) $this->_settings = $row;
357
  }
358
  return $this->_settings;
5
  * @package CFF.
6
  * @since 1.0.179
7
  */
8
+ require_once dirname(__FILE__).'/cpcff_revisions.inc.php';
9
 
10
  if(!class_exists('CPCFF_FORM'))
11
  {
40
  */
41
  private $_fields;
42
 
43
+ /**
44
+ * Instance of the CPCFF_REVISIONS object to interact with the form's revisions.
45
+ */
46
+ private $_revisions_obj;
47
  /*********************************** PUBLIC METHODS ********************************************/
48
 
49
  /**
56
  $this->_id = $id;
57
  $this->_settings = array();
58
  $this->_fields = array();
59
+ $this->_revisions_obj = new CPCFF_REVISIONS($this);
60
  } // End __construct
61
 
62
  /**
135
  )
136
  )
137
  {
138
+ return new self($wpdb->insert_id);
139
  }
140
  return false;
141
  } // End create_default
300
  'cv_text_enter_valid_captcha' => (isset($params['cv_text_enter_valid_captcha'])) ? $params['cv_text_enter_valid_captcha'] : CP_CALCULATEDFIELDSF_DEFAULT_cv_text_enter_valid_captcha
301
  );
302
 
303
+ $updated_rows = $wpdb->update (
304
  $wpdb->prefix.CP_CALCULATEDFIELDSF_FORMS_TABLE,
305
  $data,
306
  array( 'id' => $this->_id ),
307
  array( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ),
308
  array( '%d' )
309
  );
310
+
311
+ if($updated_rows !== false && !isset($params['preview'])) $this->_revisions_obj->create_revision();
312
+ return $updated_rows;
313
  } // End save_settings
314
 
315
+ /**
316
+ * Gets the correspond rown in the database
317
+ */
318
+ public function get_raw_data()
319
+ {
320
+ global $wpdb;
321
+ $row = $wpdb->get_row($wpdb->prepare("SELECT * FROM ".$wpdb->prefix.CP_CALCULATEDFIELDSF_FORMS_TABLE." WHERE id=%d", $this->_id), ARRAY_A);
322
+ return $row;
323
+ } // End get_raw_data
324
+
325
+ /**
326
+ * Returns an instance of the CPCFF_REVISIONS revisions object
327
+ */
328
+ public function get_revisions()
329
+ {
330
+ return $this->_revisions_obj;
331
+ } // End get_revisions
332
+
333
+ /**
334
+ * Creates or replace the property $this->_settings with the data stored in the revisions
335
+ */
336
+ public function apply_revision($revision_id)
337
+ {
338
+ $this->_get_settings();
339
+ $revision_data = $this->_revisions_obj->data($revision_id);
340
+ $this->_settings = CPCFF_AUXILIARY::array_replace_recursive($this->_settings,$revision_data);
341
+ } // End apply_revision
342
+
343
  /**
344
  * Updates the form's name
345
  *
367
  public function delete_form()
368
  {
369
  global $wpdb;
370
+ $this->_revisions_obj->delete_form();
371
  return $wpdb->delete(
372
  $wpdb->prefix.CP_CALCULATEDFIELDSF_FORMS_TABLE,
373
  array('id' => $this->_id),
389
  global $wpdb;
390
  if(empty($this->_settings))
391
  {
392
+ $row = $this->get_raw_data();
 
393
  if(!empty($row)) $this->_settings = $row;
394
  }
395
  return $this->_settings;
inc/cpcff_install_uninstall.inc.php CHANGED
@@ -261,6 +261,16 @@ if(!class_exists('CPCFF_INSTALLER'))
261
 
262
  // Insert the predefined forms into the forms table
263
  self::_predefined_forms();
 
 
 
 
 
 
 
 
 
 
264
  } // End _db_structure
265
 
266
  /**
261
 
262
  // Insert the predefined forms into the forms table
263
  self::_predefined_forms();
264
+
265
+ // Revisions table
266
+ $sql = "CREATE TABLE IF NOT EXISTS ".$wpdb->prefix.CP_CALCULATEDFIELDSF_FORMS_REVISIONS_TABLE." (
267
+ id mediumint(9) NOT NULL AUTO_INCREMENT,
268
+ formid mediumint(9) NOT NULL,
269
+ time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
270
+ revision longtext NOT NULL,
271
+ UNIQUE KEY id (id)
272
+ ) $charset_collate;";
273
+ $wpdb->query($sql);
274
  } // End _db_structure
275
 
276
  /**
inc/cpcff_main.inc.php CHANGED
@@ -153,6 +153,15 @@ if(!class_exists('CPCFF_MAIN'))
153
  {
154
  if ( $this->_is_admin ) // Initializes the WordPress modules.
155
  {
 
 
 
 
 
 
 
 
 
156
  // Adds the plugin links in the plugins sections
157
  add_filter( 'plugin_action_links_'.CP_CALCULATEDFIELDSF_BASE_NAME, array($this, 'links' ) );
158
 
153
  {
154
  if ( $this->_is_admin ) // Initializes the WordPress modules.
155
  {
156
+ if(
157
+ false === ($CP_CALCULATEDFIELDSF_VERSION = get_option('CP_CALCULATEDFIELDSF_VERSION')) ||
158
+ $CP_CALCULATEDFIELDSF_VERSION != CP_CALCULATEDFIELDSF_VERSION
159
+ )
160
+ {
161
+ if(class_exists('CPCFF_INSTALLER')) CPCFF_INSTALLER::install(is_multisite());
162
+ update_option('CP_CALCULATEDFIELDSF_VERSION', CP_CALCULATEDFIELDSF_VERSION);
163
+ }
164
+
165
  // Adds the plugin links in the plugins sections
166
  add_filter( 'plugin_action_links_'.CP_CALCULATEDFIELDSF_BASE_NAME, array($this, 'links' ) );
167
 
inc/cpcff_revisions.inc.php ADDED
@@ -0,0 +1,157 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Revisions class with database interaction, data, and methods.
4
+ *
5
+ * @package CFF.
6
+ * @since 1.0.232
7
+ */
8
+
9
+ if(!class_exists('CPCFF_REVISIONS'))
10
+ {
11
+ class CPCFF_REVISIONS
12
+ {
13
+ /**
14
+ * CPCFF_FORM instance
15
+ */
16
+ private $_form_obj;
17
+
18
+ /**
19
+ * List of revisions rows corresponding to the form
20
+ */
21
+ private $_revisions;
22
+
23
+ /**
24
+ * Instance of the $wpdb object
25
+ */
26
+ private $_db;
27
+
28
+ /**
29
+ * Name of revisions table
30
+ */
31
+ private $_table;
32
+
33
+ /**
34
+ * The number of revisions per form
35
+ */
36
+ private $_max = 10;
37
+
38
+ /**
39
+ * Constructs a CPCFF_REVISIONS object.
40
+ *
41
+ * @param integer $form_obj instance of CPCFF_FORM
42
+ */
43
+ public function __construct($form_obj)
44
+ {
45
+ global $wpdb;
46
+ $this->_db = $wpdb;
47
+ $this->_table = $wpdb->prefix.CP_CALCULATEDFIELDSF_FORMS_REVISIONS_TABLE;
48
+ $this->_form_obj = $form_obj;
49
+ $this->revisions_list();
50
+ } // End construct
51
+
52
+ /**
53
+ * Returns the list of revisions rows in the database as array
54
+ */
55
+ public function revisions_list()
56
+ {
57
+ if(empty($this->_revisions))
58
+ {
59
+ $results = $this->_db->get_results(
60
+ $this->_db->prepare(
61
+ 'SELECT * FROM '.$this->_table.' WHERE formid=%d ORDER BY time DESC',
62
+ $this->_form_obj->get_id()
63
+ ),
64
+ ARRAY_A
65
+ );
66
+ $this->_revisions = array();
67
+ foreach($results as $revision)
68
+ {
69
+ $this->_revisions[$revision['id']] = $revision;
70
+ }
71
+ }
72
+ return $this->_revisions;
73
+
74
+ } // End revisions_list
75
+
76
+ /**
77
+ * Creates a new entry in the revisions table, if there are more than _max revisions remove the older.
78
+ *
79
+ * @return int returns the revision's id or false if fails.
80
+ */
81
+ public function create_revision()
82
+ {
83
+ $form_data = $this->_form_obj->get_raw_data();
84
+
85
+ $data = array(
86
+ 'formid' => $this->_form_obj->get_id(),
87
+ 'time' => current_time('mysql'),
88
+ 'revision' => serialize($form_data)
89
+ );
90
+
91
+ if(
92
+ $this->_db->insert(
93
+ $this->_table,
94
+ $data,
95
+ array('%d','%s','%s')
96
+ )
97
+ )
98
+ {
99
+ $data['id'] = $this->_db->insert_id;
100
+ $this->_revisions[$data['id']] = $data;
101
+ krsort($this->_revisions);
102
+ if($this->_max < count($this->_revisions))
103
+ {
104
+ array_splice($this->_revisions,$this->_max);
105
+ $this->_delete_older();
106
+ }
107
+ return $data['id'];
108
+ }
109
+ return false;
110
+ } // End create_revision
111
+
112
+ /**
113
+ * returns the form data unserialized or an empty array
114
+ */
115
+ public function data( $revision_id )
116
+ {
117
+ if(
118
+ !empty($this->_revisions) &&
119
+ isset($this->_revisions[$revision_id])
120
+ )
121
+ {
122
+ return unserialize($this->_revisions[$revision_id]['revision']);
123
+ }
124
+ return array();
125
+ } // End data
126
+
127
+ /**
128
+ * Deletes the list of revisions belonging to the form
129
+ */
130
+ public function delete_form()
131
+ {
132
+ $this->_db->delete(
133
+ $this->_table,
134
+ array('formid' => $this->_form_obj->get_id()),
135
+ array('%d')
136
+ );
137
+ $this->_revisions = array();
138
+ } // End delete_form
139
+
140
+
141
+ /*********************************** PRIVATE METHODS ********************************************/
142
+
143
+ /**
144
+ * Deletes the older revisions, leaving only the _max
145
+ */
146
+ private function _delete_older()
147
+ {
148
+ $formid = $this->_form_obj->get_id();
149
+ $this->_db->query(
150
+ $this->_db->prepare(
151
+ 'DELETE FROM '.$this->_table.' WHERE formid=%d AND id IN (SELECT * FROM (SELECT id FROM '.$this->_table.' WHERE formid=%d ORDER BY time DESC LIMIT %d,18446744073709551615) AS tmp)',
152
+ $formid,$formid,$this->_max
153
+ )
154
+ );
155
+ } // End _delete_older
156
+ } // End CPCFF_REVISIONS
157
+ }
js/fbuilder-loader-admin.php CHANGED
@@ -3,7 +3,7 @@ error_reporting(E_ERROR|E_PARSE);
3
  header('Content-Type: application/x-javascript; charset=UTF-8');
4
  ?>
5
  fbuilderjQuery = (typeof fbuilderjQuery != 'undefined' ) ? fbuilderjQuery : jQuery;
6
- fbuilderjQueryGenerator = function(){
7
  if('fbuilderGeneratorFlag' in fbuilderjQuery) return;
8
  (function($) {
9
  // Namespace of fbuilder
@@ -75,5 +75,5 @@ fbuilderjQueryGenerator = function(){
75
  })(fbuilderjQuery);
76
  fbuilderjQuery.fbuilderGeneratorFlag = 1;
77
  };
78
- fbuilderjQuery(fbuilderjQueryGenerator);
79
- fbuilderjQuery(window).on('load',fbuilderjQueryGenerator);
3
  header('Content-Type: application/x-javascript; charset=UTF-8');
4
  ?>
5
  fbuilderjQuery = (typeof fbuilderjQuery != 'undefined' ) ? fbuilderjQuery : jQuery;
6
+ fbuilderjQuery.fbuilderjQueryGenerator = function(){
7
  if('fbuilderGeneratorFlag' in fbuilderjQuery) return;
8
  (function($) {
9
  // Namespace of fbuilder
75
  })(fbuilderjQuery);
76
  fbuilderjQuery.fbuilderGeneratorFlag = 1;
77
  };
78
+ fbuilderjQuery(fbuilderjQuery.fbuilderjQueryGenerator);
79
+ fbuilderjQuery(window).on('load',fbuilderjQuery.fbuilderjQueryGenerator);
js/fbuilder-loader-public.php CHANGED
@@ -5,11 +5,12 @@ ob_start(); // Turn on output buffering
5
  ?>
6
  fbuilderjQuery = (typeof fbuilderjQuery != 'undefined' ) ? fbuilderjQuery : jQuery;
7
  fbuilderjQuery(window).bind( 'pageshow', function( event ){ if( typeof event.originalEvent[ 'persisted' ] != 'undefined' && event.originalEvent[ 'persisted' ] ) location.reload(); } );
8
- fbuilderjQuery(function(){
9
- (function($) {
10
- // Namespace of fbuilder
11
- $.fbuilder = $.fbuilder || {};
12
- $.fbuilder[ 'objName' ] = 'fbuilderjQuery';
 
13
 
14
  <?php
15
  // Load Module files
@@ -95,10 +96,12 @@ fbuilderjQuery(function(){
95
  fcount++;
96
  fnum = "_"+fcount;
97
  }
98
- })(fbuilderjQuery);
99
- });
 
 
 
100
  <?php
101
-
102
  $buffered_contents = ob_get_contents();
103
  ob_end_clean(); // Clean the output buffer and turn off output buffering
104
  if( !empty( $_REQUEST[ 'min' ] ) )
@@ -114,6 +117,4 @@ fbuilderjQuery(function(){
114
  @file_put_contents( $all_js_path, $buffered_contents );
115
  }catch( Exception $err){}
116
  }
117
- print $buffered_contents;
118
-
119
- ?>
5
  ?>
6
  fbuilderjQuery = (typeof fbuilderjQuery != 'undefined' ) ? fbuilderjQuery : jQuery;
7
  fbuilderjQuery(window).bind( 'pageshow', function( event ){ if( typeof event.originalEvent[ 'persisted' ] != 'undefined' && event.originalEvent[ 'persisted' ] ) location.reload(); } );
8
+ fbuilderjQuery.fbuilderjQueryGenerator = function(){
9
+ if('fbuilderGeneratorFlag' in fbuilderjQuery) return;
10
+ (function($) {
11
+ // Namespace of fbuilder
12
+ $.fbuilder = $.fbuilder || {};
13
+ $.fbuilder[ 'objName' ] = 'fbuilderjQuery';
14
 
15
  <?php
16
  // Load Module files
96
  fcount++;
97
  fnum = "_"+fcount;
98
  }
99
+ })(fbuilderjQuery);
100
+ fbuilderjQuery.fbuilderGeneratorFlag = 1;
101
+ };
102
+ fbuilderjQuery(fbuilderjQuery.fbuilderjQueryGenerator);
103
+ fbuilderjQuery(window).on('load',fbuilderjQuery.fbuilderjQueryGenerator);
104
  <?php
 
105
  $buffered_contents = ob_get_contents();
106
  ob_end_clean(); // Clean the output buffer and turn off output buffering
107
  if( !empty( $_REQUEST[ 'min' ] ) )
117
  @file_put_contents( $all_js_path, $buffered_contents );
118
  }catch( Exception $err){}
119
  }
120
+ print $buffered_contents;
 
 
js/modules/01_mathematical_logical/admin/module_admin.js CHANGED
@@ -16,9 +16,9 @@ fbuilderjQuery[ 'fbuilder' ][ 'modules' ][ 'default' ] = {
16
  { "value" : ")", "code" : ")", "tip" : "" },
17
  { "value" : ",", "code" : ",", "tip" : "" },
18
  { "value" : "ABS", "code" : "ABS(", "tip" : "Returns the absolute value of the number passed as parameter. <strong>ABS(number)</strong>" },
19
- { "value" : "CEIL", "code" : "CEIL(", "tip" : "Returns the next higher integer that is greater than or equal to the number passed as parameter. <strong>CEIL(number)</strong>" },
20
- { "value" : "FLOOR", "code" : "FLOOR(", "tip" : "Returns the next lower integer that is less than or equal to the number passed as parameter. <strong>FLOOR(number)</strong>" },
21
- { "value" : "ROUND", "code" : "ROUND(", "tip" : "Returns an integer that follows rounding rules. If the value of the passed parameter is greater than or equal to x.5, the returned value is x+1; otherwise the returned value is x. <strong>ROUND(number)</strong>" },
22
  { "value" : "PREC", "code" : "PREC(", "tip" : "Returns the value of the number passed in the first parameter with so many decimal digits as the number passed in the second parameter. <strong>PREC(number1, number2)</strong>" },
23
  { "value" : "CDATE", "code" : "CDATE(", "tip" : "Returns the number formatted like a Date. <strong>CDATE(number,format)</strong>. The second parameter defines the format of the output date: &quot;mm/dd.yyyy&quot;, &quot;dd/mm/yyyy&quot;" },
24
  { "value" : "LOG", "code" : "LOG(", "tip" : "Returns the natural logarithm (base e) of the number passed as parameter. <strong>LOG(number)</strong>" },
16
  { "value" : ")", "code" : ")", "tip" : "" },
17
  { "value" : ",", "code" : ",", "tip" : "" },
18
  { "value" : "ABS", "code" : "ABS(", "tip" : "Returns the absolute value of the number passed as parameter. <strong>ABS(number)</strong>" },
19
+ { "value" : "CEIL", "code" : "CEIL(", "tip" : "Returns the next higher integer that is greater than or equal to the number passed as parameter. <strong>CEIL(number)</strong><br>The CEIL operation accepts a second parameter for rounding the number to the next multiple of this second parameter. <strong>CEIL(X,Y)</strong>" },
20
+ { "value" : "FLOOR", "code" : "FLOOR(", "tip" : "Returns the next lower integer that is less than or equal to the number passed as parameter. <strong>FLOOR(number)</strong><br>The FLOOR operation accepts a second parameter for rounding the number to the previous multiple of this second parameter. <strong>FLOOR(X,Y)</strong>" },
21
+ { "value" : "ROUND", "code" : "ROUND(", "tip" : "Returns an integer that follows rounding rules. If the value of the passed parameter is greater than or equal to x.5, the returned value is x+1; otherwise the returned value is x. <strong>ROUND(number)</strong><br>The ROUND operation accepts a second parameter for rounding the number to the nearest multiple of this second parameter. <strong>ROUND(X,Y)</strong>" },
22
  { "value" : "PREC", "code" : "PREC(", "tip" : "Returns the value of the number passed in the first parameter with so many decimal digits as the number passed in the second parameter. <strong>PREC(number1, number2)</strong>" },
23
  { "value" : "CDATE", "code" : "CDATE(", "tip" : "Returns the number formatted like a Date. <strong>CDATE(number,format)</strong>. The second parameter defines the format of the output date: &quot;mm/dd.yyyy&quot;, &quot;dd/mm/yyyy&quot;" },
24
  { "value" : "LOG", "code" : "LOG(", "tip" : "Returns the natural logarithm (base e) of the number passed as parameter. <strong>LOG(number)</strong>" },
js/modules/01_mathematical_logical/public/module_public.js CHANGED
@@ -6,6 +6,45 @@ fbuilderjQuery[ 'fbuilder' ][ 'modules' ][ 'default' ] = {
6
  'prefix' : '',
7
  'callback' : function()
8
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  if(window.PREC == undefined)
10
  {
11
  window.PREC = window.prec = function (num, pr)
@@ -28,7 +67,7 @@ fbuilderjQuery[ 'fbuilder' ][ 'modules' ][ 'default' ] = {
28
  if(isFinite(num*1))
29
  {
30
  num = Math.round(num*86400000);
31
-
32
  var date = new Date(num),
33
  d = date.getDate(),
34
  m = date.getMonth()+1,
@@ -37,10 +76,10 @@ fbuilderjQuery[ 'fbuilder' ][ 'modules' ][ 'default' ] = {
37
  i = date.getMinutes(),
38
  s = date.getSeconds(),
39
  a = '';
40
-
41
  m = (m < 10) ? '0'+m : m;
42
  d = (d < 10) ? '0'+d : d;
43
-
44
  if( /a/.test( format ) )
45
  {
46
  a = ( h >= 12 ) ? 'pm' : 'am';
@@ -50,7 +89,7 @@ fbuilderjQuery[ 'fbuilder' ][ 'modules' ][ 'default' ] = {
50
  h = (h < 10) ? '0'+h : h;
51
  i = (i < 10) ? '0'+i : i;
52
  s = (s < 10) ? '0'+s : s;
53
-
54
  return format.replace( /y+/i, y)
55
  .replace( /m+/i, m)
56
  .replace( /d+/i, d)
@@ -62,7 +101,7 @@ fbuilderjQuery[ 'fbuilder' ][ 'modules' ][ 'default' ] = {
62
  return num;
63
  };
64
  } // End if window.CDATE
65
-
66
  if(window.GCD == undefined)
67
  {
68
  window.GCD = window.gcd = function( a, b)
@@ -70,17 +109,17 @@ fbuilderjQuery[ 'fbuilder' ][ 'modules' ][ 'default' ] = {
70
  if ( ! b) return a;
71
  return GCD(b, a % b);
72
  };
73
- } // End if window.GCD
74
-
75
  if(window.LOGAB == undefined)
76
  {
77
  window.LOGAB = window.logab = function( a, b)
78
  {
79
  return LOG(a)/LOG(b);
80
  };
81
- } // End if window.LOGAB
82
-
83
- var math_prop = ["LN10", "PI", "E", "LOG10E", "SQRT2", "LOG2E", "SQRT1_2", "LN2", "cos", "pow", "log", "tan", "sqrt", "ceil", "asin", "abs", "max", "exp", "atan2", "random", "round", "floor", "acos", "atan", "min", "sin"];
84
 
85
  for(var i = 0, h = math_prop.length; i < h; i++)
86
  {
@@ -89,10 +128,10 @@ fbuilderjQuery[ 'fbuilder' ][ 'modules' ][ 'default' ] = {
89
  window[ math_prop[ i ] ] = window[ math_prop[ i ].toUpperCase() ] = Math[ math_prop[ i ] ];
90
  }
91
  }
92
-
93
  fbuilderjQuery[ 'fbuilder' ][ 'extend_window' ]( fbuilderjQuery[ 'fbuilder' ][ 'modules' ][ 'default' ][ 'prefix' ], CF_LOGICAL );
94
  },
95
-
96
  'validator' : function( v )
97
  {
98
  return ( typeof v == 'number' ) ? isFinite( v ) : ( typeof v != 'undefined' );
6
  'prefix' : '',
7
  'callback' : function()
8
  {
9
+ function ROUNDx(operation, num, y)
10
+ {
11
+ if(y && y != 0)
12
+ {
13
+ return operation(num/y)*y;
14
+ }
15
+ else
16
+ {
17
+ return operation(num);
18
+ }
19
+ };
20
+
21
+ if(window.ROUND == undefined)
22
+ {
23
+ window.ROUND = window.round = function(num, y)
24
+ {
25
+ if(y) return ROUNDx(Math.round, num, y);
26
+ return ROUNDx(Math.round, num);
27
+ }
28
+ }
29
+
30
+ if(window.FLOOR == undefined)
31
+ {
32
+ window.FLOOR = window.floor = function(num, y)
33
+ {
34
+ if(y) return ROUNDx(Math.floor, num, y);
35
+ return ROUNDx(Math.floor, num);
36
+ }
37
+ }
38
+
39
+ if(window.CEIL == undefined)
40
+ {
41
+ window.CEIL = window.ceil = function(num, y)
42
+ {
43
+ if(y) return ROUNDx(Math.ceil, num, y);
44
+ return ROUNDx(Math.ceil, num);
45
+ }
46
+ }
47
+
48
  if(window.PREC == undefined)
49
  {
50
  window.PREC = window.prec = function (num, pr)
67
  if(isFinite(num*1))
68
  {
69
  num = Math.round(num*86400000);
70
+
71
  var date = new Date(num),
72
  d = date.getDate(),
73
  m = date.getMonth()+1,
76
  i = date.getMinutes(),
77
  s = date.getSeconds(),
78
  a = '';
79
+
80
  m = (m < 10) ? '0'+m : m;
81
  d = (d < 10) ? '0'+d : d;
82
+
83
  if( /a/.test( format ) )
84
  {
85
  a = ( h >= 12 ) ? 'pm' : 'am';
89
  h = (h < 10) ? '0'+h : h;
90
  i = (i < 10) ? '0'+i : i;
91
  s = (s < 10) ? '0'+s : s;
92
+
93
  return format.replace( /y+/i, y)
94
  .replace( /m+/i, m)
95
  .replace( /d+/i, d)
101
  return num;
102
  };
103
  } // End if window.CDATE
104
+
105
  if(window.GCD == undefined)
106
  {
107
  window.GCD = window.gcd = function( a, b)
109
  if ( ! b) return a;
110
  return GCD(b, a % b);
111
  };
112
+ } // End if window.GCD
113
+
114
  if(window.LOGAB == undefined)
115
  {
116
  window.LOGAB = window.logab = function( a, b)
117
  {
118
  return LOG(a)/LOG(b);
119
  };
120
+ } // End if window.LOGAB
121
+
122
+ var math_prop = ["LN10", "PI", "E", "LOG10E", "SQRT2", "LOG2E", "SQRT1_2", "LN2", "cos", "pow", "log", "tan", "sqrt", "asin", "abs", "max", "exp", "atan2", "random", "acos", "atan", "min", "sin"];
123
 
124
  for(var i = 0, h = math_prop.length; i < h; i++)
125
  {
128
  window[ math_prop[ i ] ] = window[ math_prop[ i ].toUpperCase() ] = Math[ math_prop[ i ] ];
129
  }
130
  }
131
+
132
  fbuilderjQuery[ 'fbuilder' ][ 'extend_window' ]( fbuilderjQuery[ 'fbuilder' ][ 'modules' ][ 'default' ][ 'prefix' ], CF_LOGICAL );
133
  },
134
+
135
  'validator' : function( v )
136
  {
137
  return ( typeof v == 'number' ) ? isFinite( v ) : ( typeof v != 'undefined' );
templates/03/style.css CHANGED
@@ -42,7 +42,7 @@
42
  }
43
  }
44
  @media screen and (max-width: 640px){
45
- .cp_cff_natural #fbuilder .medium,{
46
  .cp_cff_natural #fbuilder .small{
47
  width: calc( 100% - 12px ) !important;
48
  width: -moz-calc( 100% - 12px ) !important;
42
  }
43
  }
44
  @media screen and (max-width: 640px){
45
+ .cp_cff_natural #fbuilder .medium,
46
  .cp_cff_natural #fbuilder .small{
47
  width: calc( 100% - 12px ) !important;
48
  width: -moz-calc( 100% - 12px ) !important;