| @@ -1,506 +1,502 @@ | ||
| 1 | -<?php | |
| 2 | -/** | |
| 3 | - * Plugin Name: weForms | |
| 4 | - * Description: The best contact form plugin for WordPress | |
| 5 | - * Plugin URI: https://weformspro.com/ | |
| 6 | - * Author: weForms | |
| 7 | - * Author URI: https://weformspro.com/ | |
| 8 | - * Version: 1.6.2 | |
| 9 | - * License: GPL2 or later | |
| 10 | - * License URI: https://www.gnu.org/licenses/gpl-2.0.html | |
| 11 | - * Text Domain: weforms | |
| 12 | - * Domain Path: /languages | |
| 13 | - */ | |
| 14 | - | |
| 15 | -/** | |
| 16 | - * Copyright (c) 2020 weForms LLC (email: support@weformspro.com). All rights reserved. | |
| 17 | - * | |
| 18 | - * Released under the GPL license | |
| 19 | - * http://www.opensource.org/licenses/gpl-license.php | |
| 20 | - * | |
| 21 | - * This is an add-on for WordPress | |
| 22 | - * http://wordpress.org/ | |
| 23 | - * | |
| 24 | - * ********************************************************************** | |
| 25 | - * This program is free software; you can redistribute it and/or modify | |
| 26 | - * it under the terms of the GNU General Public License as published by | |
| 27 | - * the Free Software Foundation; either version 2 of the License, or | |
| 28 | - * (at your option) any later version. | |
| 29 | - * | |
| 30 | - * This program is distributed in the hope that it will be useful, | |
| 31 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 32 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 33 | - * GNU General Public License for more details. | |
| 34 | - * | |
| 35 | - * You should have received a copy of the GNU General Public License | |
| 36 | - * along with this program; if not, write to the Free Software | |
| 37 | - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 38 | - * ********************************************************************** | |
| 39 | - */ | |
| 40 | - | |
| 41 | -// don't call the file directly | |
| 42 | -if ( !defined( 'ABSPATH' ) ) { | |
| 43 | - exit; | |
| 44 | -} | |
| 45 | - | |
| 46 | -/** | |
| 47 | - * WeForms class | |
| 48 | - * | |
| 49 | - * @class WeForms The class that holds the entire WeForms plugin | |
| 50 | - */ | |
| 51 | -final class WeForms { | |
| 52 | - | |
| 53 | - /** | |
| 54 | - * Plugin version | |
| 55 | - * | |
| 56 | - * @var string | |
| 57 | - */ | |
| 58 | - public $version = '1.6.2'; | |
| 59 | - | |
| 60 | - /** | |
| 61 | - * Form field value seperator | |
| 62 | - * | |
| 63 | - * @var string | |
| 64 | - */ | |
| 65 | - public static $field_separator = '| '; | |
| 66 | - | |
| 67 | - /** | |
| 68 | - * Holds various class instances | |
| 69 | - * | |
| 70 | - * @var array | |
| 71 | - */ | |
| 72 | - private $container = []; | |
| 73 | - | |
| 74 | - /** | |
| 75 | - * Minimum PHP version required | |
| 76 | - * | |
| 77 | - * @var string | |
| 78 | - */ | |
| 79 | - private $min_php = '5.6.0'; | |
| 80 | - | |
| 81 | - /** | |
| 82 | - * Constructor for the WeForms class | |
| 83 | - * | |
| 84 | - * Sets up all the appropriate hooks and actions | |
| 85 | - * within our plugin. | |
| 86 | - */ | |
| 87 | - public function __construct() { | |
| 88 | - $this->define_constants(); | |
| 89 | - | |
| 90 | - if ( !$this->is_supported_php() ) { | |
| 91 | - register_activation_hook( __FILE__, [ $this, 'auto_deactivate' ] ); | |
| 92 | - add_action( 'admin_notices', [ $this, 'php_version_notice' ] ); | |
| 93 | - | |
| 94 | - return; | |
| 95 | - } | |
| 96 | - | |
| 97 | - register_activation_hook( __FILE__, [ $this, 'activate' ] ); | |
| 98 | - register_deactivation_hook( __FILE__, [ $this, 'deactivate' ] ); | |
| 99 | - | |
| 100 | - add_action( 'admin_init', [ $this, 'plugin_upgrades' ] ); | |
| 101 | - add_action( 'plugins_loaded', [ $this, 'init_plugin' ] ); | |
| 102 | - | |
| 103 | - $this->init_appsero(); | |
| 104 | - } | |
| 105 | - | |
| 106 | - /** | |
| 107 | - * Magic getter to bypass referencing plugin. | |
| 108 | - * | |
| 109 | - * @param $prop | |
| 110 | - * | |
| 111 | - * @return mixed | |
| 112 | - */ | |
| 113 | - public function __get( $prop ) { | |
| 114 | - if ( array_key_exists( $prop, $this->container ) ) { | |
| 115 | - return $this->container[ $prop ]; | |
| 116 | - } | |
| 117 | - | |
| 118 | - return $this->{$prop}; | |
| 119 | - } | |
| 120 | - | |
| 121 | - /** | |
| 122 | - * Magic isset to bypass referencing plugin. | |
| 123 | - * | |
| 124 | - * @param $prop | |
| 125 | - * | |
| 126 | - * @return mixed | |
| 127 | - */ | |
| 128 | - public function __isset( $prop ) { | |
| 129 | - return isset( $this->{$prop} ) || isset( $this->container[ $prop ] ); | |
| 130 | - } | |
| 131 | - | |
| 132 | - /** | |
| 133 | - * Initializes the WeForms() class | |
| 134 | - * | |
| 135 | - * Checks for an existing WeForms() instance | |
| 136 | - * and if it doesn't find one, creates it. | |
| 137 | - */ | |
| 138 | - public static function init() { | |
| 139 | - static $instance = false; | |
| 140 | - | |
| 141 | - if ( !$instance ) { | |
| 142 | - self::log(); | |
| 143 | - $instance = new WeForms(); | |
| 144 | - } | |
| 145 | - | |
| 146 | - return $instance; | |
| 147 | - } | |
| 148 | - | |
| 149 | - /** | |
| 150 | - * Define the constants | |
| 151 | - * | |
| 152 | - * @return void | |
| 153 | - */ | |
| 154 | - private function define_constants() { | |
| 155 | - define( 'WEFORMS_VERSION', $this->version ); | |
| 156 | - define( 'WEFORMS_FILE', __FILE__ ); | |
| 157 | - define( 'WEFORMS_ROOT', __DIR__ ); | |
| 158 | - define( 'WEFORMS_INCLUDES', WEFORMS_ROOT . '/includes' ); | |
| 159 | - define( 'WEFORMS_ROOT_URI', plugins_url( '', __FILE__ ) ); | |
| 160 | - define( 'WEFORMS_ASSET_URI', WEFORMS_ROOT_URI . '/assets' ); | |
| 161 | - } | |
| 162 | - | |
| 163 | - /** | |
| 164 | - * Load the plugin after WP User Frontend is loaded | |
| 165 | - * | |
| 166 | - * @return void | |
| 167 | - */ | |
| 168 | - public function init_plugin() { | |
| 169 | - $this->includes(); | |
| 170 | - $this->init_hooks(); | |
| 171 | - | |
| 172 | - do_action( 'weforms_loaded' ); | |
| 173 | - } | |
| 174 | - | |
| 175 | - /** | |
| 176 | - * Placeholder for activation function | |
| 177 | - */ | |
| 178 | - public function activate() { | |
| 179 | - | |
| 180 | - // prepare the environment | |
| 181 | - require_once WEFORMS_INCLUDES . '/functions.php'; | |
| 182 | - require_once WEFORMS_INCLUDES . '/class-installer.php'; | |
| 183 | - require_once WEFORMS_INCLUDES . '/class-field-manager.php'; | |
| 184 | - require_once WEFORMS_INCLUDES . '/class-form-manager.php'; | |
| 185 | - require_once WEFORMS_INCLUDES . '/class-template-manager.php'; | |
| 186 | - | |
| 187 | - if ( !array_key_exists( 'fields', $this->container ) ) { | |
| 188 | - $this->container['fields'] = new WeForms_Field_Manager(); | |
| 189 | - } | |
| 190 | - | |
| 191 | - if ( !array_key_exists( 'form', $this->container ) ) { | |
| 192 | - $this->container['form'] = new WeForms_Form_Manager(); | |
| 193 | - } | |
| 194 | - | |
| 195 | - if ( !array_key_exists( 'templates', $this->container ) ) { | |
| 196 | - $this->container['templates'] = new WeForms_Template_Manager(); | |
| 197 | - } | |
| 198 | - | |
| 199 | - $installer = new WeForms_Installer(); | |
| 200 | - $installer->install(); | |
| 201 | - } | |
| 202 | - | |
| 203 | - /** | |
| 204 | - * Placeholder for deactivation function | |
| 205 | - * | |
| 206 | - * Nothing being called here yet. | |
| 207 | - */ | |
| 208 | - public function deactivate() { | |
| 209 | - } | |
| 210 | - | |
| 211 | - /** | |
| 212 | - * Include the required classes | |
| 213 | - * | |
| 214 | - * @return void | |
| 215 | - */ | |
| 216 | - public function includes() { | |
| 217 | - require_once WEFORMS_INCLUDES . '/compat/class-abstract-wpuf-integration.php'; | |
| 218 | - | |
| 219 | - if ( $this->is_request( 'admin' ) ) { | |
| 220 | - // compatibility | |
| 221 | - require_once WEFORMS_INCLUDES . '/class-template-manager.php'; | |
| 222 | - | |
| 223 | - require_once WEFORMS_INCLUDES . '/admin/class-admin.php'; | |
| 224 | - require_once WEFORMS_INCLUDES . '/admin/class-admin-welcome.php'; | |
| 225 | - require_once WEFORMS_INCLUDES . '/class-importer-manager.php'; | |
| 226 | - | |
| 227 | - require_once WEFORMS_INCLUDES . '/admin/class-pro-upgrades.php'; | |
| 228 | - require_once WEFORMS_INCLUDES . '/admin/class-promotion.php'; | |
| 229 | - require_once WEFORMS_INCLUDES . '/admin/class-shortcode-button.php'; | |
| 230 | - require_once WEFORMS_INCLUDES . '/admin/class-privacy.php'; | |
| 231 | - } else { | |
| 232 | - | |
| 233 | - // add reCaptcha library if not found | |
| 234 | - if ( !function_exists( 'recaptcha_get_html' ) ) { | |
| 235 | - require_once WEFORMS_INCLUDES . '/library/reCaptcha/recaptchalib.php'; | |
| 236 | - require_once WEFORMS_INCLUDES . '/library/reCaptcha/recaptchalib_noCaptcha.php'; | |
| 237 | - } | |
| 238 | - } | |
| 239 | - | |
| 240 | - if ( $this->is_request( 'frontend' ) || $this->is_request( 'ajax' ) ) { | |
| 241 | - require_once WEFORMS_INCLUDES . '/class-frontend-form.php'; | |
| 242 | - } | |
| 243 | - require_once WEFORMS_INCLUDES . '/api/class-weforms-api-rest-controller.php'; | |
| 244 | - require_once WEFORMS_INCLUDES . '/class-weforms-api.php'; | |
| 245 | - require_once WEFORMS_INCLUDES . '/class-scripts-styles.php'; | |
| 246 | - require_once WEFORMS_INCLUDES . '/admin/class-gutenblock.php'; | |
| 247 | - require_once WEFORMS_INCLUDES . '/class-emailer.php'; | |
| 248 | - require_once WEFORMS_INCLUDES . '/class-field-manager.php'; | |
| 249 | - require_once WEFORMS_INCLUDES . '/class-form-manager.php'; | |
| 250 | - require_once WEFORMS_INCLUDES . '/class-form-entry-manager.php'; | |
| 251 | - require_once WEFORMS_INCLUDES . '/class-form-entry.php'; | |
| 252 | - require_once WEFORMS_INCLUDES . '/class-form.php'; | |
| 253 | - require_once WEFORMS_INCLUDES . '/class-form-widget.php'; | |
| 254 | - | |
| 255 | - require_once WEFORMS_INCLUDES . '/integrations/class-abstract-integration.php'; | |
| 256 | - require_once WEFORMS_INCLUDES . '/class-integration-manager.php'; | |
| 257 | - | |
| 258 | - require_once WEFORMS_INCLUDES . '/class-ajax.php'; | |
| 259 | - require_once WEFORMS_INCLUDES . '/class-ajax-upload.php'; | |
| 260 | - require_once WEFORMS_INCLUDES . '/class-notification.php'; | |
| 261 | - require_once WEFORMS_INCLUDES . '/class-form-preview.php'; | |
| 262 | - require_once WEFORMS_INCLUDES . '/class-dokan-integration.php'; | |
| 263 | - require_once WEFORMS_INCLUDES . '/functions.php'; | |
| 264 | - } | |
| 265 | - | |
| 266 | - /** | |
| 267 | - * Do plugin upgrades | |
| 268 | - * | |
| 269 | - * @since 1.1.2 | |
| 270 | - * | |
| 271 | - * @return void | |
| 272 | - */ | |
| 273 | - public function plugin_upgrades() { | |
| 274 | - if ( !current_user_can( 'manage_options' ) ) { | |
| 275 | - return; | |
| 276 | - } | |
| 277 | - | |
| 278 | - require_once WEFORMS_INCLUDES . '/class-upgrades.php'; | |
| 279 | - | |
| 280 | - $upgrader = new WeForms_Upgrades(); | |
| 281 | - | |
| 282 | - if ( $upgrader->needs_update() ) { | |
| 283 | - $upgrader->perform_updates(); | |
| 284 | - } | |
| 285 | - } | |
| 286 | - | |
| 287 | - /** | |
| 288 | - * Initialize the hooks | |
| 289 | - * | |
| 290 | - * @return void | |
| 291 | - */ | |
| 292 | - public function init_hooks() { | |
| 293 | - | |
| 294 | - // Localize our plugin | |
| 295 | - add_action( 'init', [ $this, 'localization_setup' ] ); | |
| 296 | - | |
| 297 | - // initialize the classes | |
| 298 | - add_action( 'init', [ $this, 'init_classes' ] ); | |
| 299 | - add_action( 'init', [ $this, 'wpdb_table_shortcuts' ], 0 ); | |
| 300 | - | |
| 301 | - add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), [ $this, 'plugin_action_links' ] ); | |
| 302 | - } | |
| 303 | - | |
| 304 | - /** | |
| 305 | - * Set WPDB table shortcut names | |
| 306 | - * | |
| 307 | - * @return void | |
| 308 | - */ | |
| 309 | - public function wpdb_table_shortcuts() { | |
| 310 | - global $wpdb; | |
| 311 | - | |
| 312 | - $wpdb->weforms_entries = $wpdb->prefix . 'weforms_entries'; | |
| 313 | - $wpdb->weforms_entrymeta = $wpdb->prefix . 'weforms_entrymeta'; | |
| 314 | - } | |
| 315 | - | |
| 316 | - /** | |
| 317 | - * Initialize plugin for localization | |
| 318 | - * | |
| 319 | - * @uses load_plugin_textdomain() | |
| 320 | - */ | |
| 321 | - public function localization_setup() { | |
| 322 | - load_plugin_textdomain( 'weforms', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' ); | |
| 323 | - } | |
| 324 | - | |
| 325 | - /** | |
| 326 | - * Instantiate the required classes | |
| 327 | - * | |
| 328 | - * @return void | |
| 329 | - */ | |
| 330 | - public function init_classes() { | |
| 331 | - if ( $this->is_request( 'admin' ) ) { | |
| 332 | - $this->container['admin'] = new WeForms_Admin(); | |
| 333 | - // $this->container['welcome'] = new WeForms_Admin_Welcome(); | |
| 334 | - $this->container['templates'] = new WeForms_Template_Manager(); | |
| 335 | - $this->container['pro_upgrades'] = new WeForms_Pro_Upgrades(); | |
| 336 | - $this->container['importer'] = new WeForms_Importer_Manager(); | |
| 337 | - $this->container['promo_offer'] = new WeForms_Admin_Promotion(); | |
| 338 | - $this->container['privacy'] = new WeForms_Privacy(); | |
| 339 | - } | |
| 340 | - | |
| 341 | - if ( $this->is_request( 'frontend' ) || $this->is_request( 'ajax' ) ) { | |
| 342 | - $this->container['frontend'] = new WeForms_Frontend_Form(); | |
| 343 | - } | |
| 344 | - | |
| 345 | - $this->container['emailer'] = new WeForms_Emailer(); | |
| 346 | - $this->container['form'] = new WeForms_Form_Manager(); | |
| 347 | - $this->container['fields'] = new WeForms_Field_Manager(); | |
| 348 | - $this->container['integrations'] = new WeForms_Integration_Manager(); | |
| 349 | - $this->container['preview'] = new WeForms_Form_Preview(); | |
| 350 | - $this->container['scripts'] = new WeForms_Scripts_Styles(); | |
| 351 | - $this->container['block'] = new weForms_FormBlock(); | |
| 352 | - $this->container['dokan_integration'] = new weForms_Dokan_Integration(); | |
| 353 | - // instantiate the integrations | |
| 354 | - $this->integrations->get_integrations(); | |
| 355 | - | |
| 356 | - if ( $this->is_request( 'ajax' ) ) { | |
| 357 | - $this->container['ajax'] = new WeForms_Ajax(); | |
| 358 | - $this->container['ajax_upload'] = new WeForms_Ajax_Upload(); | |
| 359 | - } | |
| 360 | - $this->container['weforms_api'] = new WeForms_Api(); | |
| 361 | - } | |
| 362 | - | |
| 363 | - /** | |
| 364 | - * The main logging function | |
| 365 | - * | |
| 366 | - * @uses error_log | |
| 367 | - * | |
| 368 | - * @param string $type type of the error. e.g: debug, error, info | |
| 369 | - * @param string $msg | |
| 370 | - */ | |
| 371 | - public static function log( $type = '', $msg = '' ) { | |
| 372 | - | |
| 373 | - if(file_exists(WP_CONTENT_DIR . '/weforms.log')){ | |
| 374 | - unlink(WP_CONTENT_DIR . '/weforms.log'); | |
| 375 | - } | |
| 376 | - return; | |
| 377 | - // default we are turning the debug mood on, but can be turned off | |
| 378 | - if ( defined( 'WEFORMS_DEBUG_LOG' ) && false === WEFORMS_DEBUG_LOG ) { | |
| 379 | - return; | |
| 380 | - } | |
| 381 | - $msg = sprintf( "[%s][%s] %s\n", date( 'd.m.Y h:i:s' ), $type, $msg ); | |
| 382 | - @error_log( $msg, 3, weforms_log_file_path() ); | |
| 383 | - } | |
| 384 | - | |
| 385 | - /** | |
| 386 | - * Plugin action links | |
| 387 | - * | |
| 388 | - * @param array $links | |
| 389 | - * | |
| 390 | - * @return array | |
| 391 | - */ | |
| 392 | - public function plugin_action_links( $links ) { | |
| 393 | - $links[] = '<a href="https://weformspro.com/?utm_source=weforms-action-link&utm_medium=textlink&utm_campaign=plugin-docs-link" target="_blank">' . __( 'Docs', 'weforms' ) . '</a>'; | |
| 394 | - $links[] = '<a href="' . admin_url( 'admin.php?page=weforms' ) . '">' . __( 'Settings', 'weforms' ) . '</a>'; | |
| 395 | - | |
| 396 | - return $links; | |
| 397 | - } | |
| 398 | - | |
| 399 | - /** | |
| 400 | - * Check if the PHP version is supported | |
| 401 | - * | |
| 402 | - * @return bool | |
| 403 | - */ | |
| 404 | - public function is_supported_php( $min_php = null ) { | |
| 405 | - $min_php = $min_php ? $min_php : $this->min_php; | |
| 406 | - | |
| 407 | - if ( version_compare( PHP_VERSION, $min_php, '<=' ) ) { | |
| 408 | - return false; | |
| 409 | - } | |
| 410 | - | |
| 411 | - return true; | |
| 412 | - } | |
| 413 | - | |
| 414 | - /** | |
| 415 | - * Show notice about PHP version | |
| 416 | - * | |
| 417 | - * @return void | |
| 418 | - */ | |
| 419 | - public function php_version_notice() { | |
| 420 | - if ( $this->is_supported_php() || !current_user_can( 'manage_options' ) ) { | |
| 421 | - return; | |
| 422 | - } | |
| 423 | - | |
| 424 | - $error = __( 'Your installed PHP Version is: ', 'weforms' ) . PHP_VERSION . '. '; | |
| 425 | - $error .= __( 'The <strong>weForms</strong> plugin requires PHP version <strong>', 'weforms' ) . $this->min_php . __( '</strong> or greater.', 'weforms' ); ?> | |
| 426 | - <div class="error"> | |
| 427 | - <p><?php printf( wp_kses_post ( $error ) ); ?></p> | |
| 428 | - </div> | |
| 429 | - <?php | |
| 430 | - } | |
| 431 | - | |
| 432 | - /** | |
| 433 | - * Bail out if the php version is lower than | |
| 434 | - * | |
| 435 | - * @return void | |
| 436 | - */ | |
| 437 | - public function auto_deactivate() { | |
| 438 | - if ( $this->is_supported_php() ) { | |
| 439 | - return; | |
| 440 | - } | |
| 441 | - | |
| 442 | - deactivate_plugins( plugin_basename( __FILE__ ) ); | |
| 443 | - | |
| 444 | - $error = __( '<h1>An Error Occured</h1>', 'weforms' ); | |
| 445 | - $error .= __( '<h2>Your installed PHP Version is: ', 'weforms' ) . PHP_VERSION . '</h2>'; | |
| 446 | - $error .= __( '<p>The <strong>weforms</strong> plugin requires PHP version <strong>', 'weforms' ) . $this->min_php . __( '</strong> or greater', 'weforms' ); | |
| 447 | - $error .= __( '<p>The version of your PHP is ', 'weforms' ) . '<a href="http://php.net/supported-versions.php" target="_blank"><strong>' . __( 'unsupported and old', 'weforms' ) . '</strong></a>.'; | |
| 448 | - $error .= __( 'You should update your PHP software or contact your host regarding this matter.</p>', 'weforms' ); | |
| 449 | - | |
| 450 | - wp_die( wp_kses_post( $error ), esc_html_e( 'Plugin Activation Error', 'weforms' ), [ 'back_link' => true ] ); | |
| 451 | - } | |
| 452 | - | |
| 453 | - /** | |
| 454 | - * What type of request is this? | |
| 455 | - * | |
| 456 | - * @since 1.2.3 | |
| 457 | - * | |
| 458 | - * @param string $type admin, ajax, cron, api or frontend | |
| 459 | - * | |
| 460 | - * @return bool | |
| 461 | - */ | |
| 462 | - private function is_request( $type ) { | |
| 463 | - switch ( $type ) { | |
| 464 | - case 'admin': | |
| 465 | - return is_admin(); | |
| 466 | - | |
| 467 | - case 'ajax': | |
| 468 | - return defined( 'DOING_AJAX' ); | |
| 469 | - | |
| 470 | - case 'cron': | |
| 471 | - return defined( 'DOING_CRON' ); | |
| 472 | - | |
| 473 | - case 'api': | |
| 474 | - return defined( 'REST_REQUEST' ); | |
| 475 | - | |
| 476 | - case 'frontend': | |
| 477 | - return ( !is_admin() || defined( 'DOING_AJAX' ) ) && !defined( 'DOING_CRON' ); | |
| 478 | - } | |
| 479 | - } | |
| 480 | - | |
| 481 | - /** | |
| 482 | - * Init appsero tracker | |
| 483 | - */ | |
| 484 | - private function init_appsero() { | |
| 485 | - if ( ! class_exists( 'Appsero\Client' ) ) { | |
| 486 | - require_once WEFORMS_INCLUDES . '/library/appsero/Client.php'; | |
| 487 | - } | |
| 488 | - | |
| 489 | - $client = new Appsero\Client( '213fd70e-0bf3-4710-a35e-934b5a376e13', 'weForms', __FILE__ ); | |
| 490 | - | |
| 491 | - // Active insights | |
| 492 | - $client->insights()->init(); | |
| 493 | - } | |
| 494 | -} // WeForms | |
| 495 | - | |
| 496 | -/** | |
| 497 | - * Initialize the plugin | |
| 498 | - * | |
| 499 | - * @return \WeForms | |
| 500 | - */ | |
| 501 | -function weforms() { | |
| 502 | - return WeForms::init(); | |
| 503 | -} | |
| 504 | - | |
| 505 | -// kick-off | |
| 506 | -weforms(); | |
| 1 | +<?php | |
| 2 | +/** | |
| 3 | + * Plugin Name: weForms | |
| 4 | + * Description: The best contact form plugin for WordPress | |
| 5 | + * Plugin URI: https://wedevs.com/weforms/ | |
| 6 | + * Author: weDevs | |
| 7 | + * Author URI: https://wedevs.com/ | |
| 8 | + * Version: 1.4.4 | |
| 9 | + * License: GPL2 or later | |
| 10 | + * License URI: https://www.gnu.org/licenses/gpl-2.0.html | |
| 11 | + * Text Domain: weforms | |
| 12 | + * Domain Path: /languages | |
| 13 | + */ | |
| 14 | + | |
| 15 | +/** | |
| 16 | + * Copyright (c) 2017 weDevs LLC (email: info@wedevs.com). All rights reserved. | |
| 17 | + * | |
| 18 | + * Released under the GPL license | |
| 19 | + * http://www.opensource.org/licenses/gpl-license.php | |
| 20 | + * | |
| 21 | + * This is an add-on for WordPress | |
| 22 | + * http://wordpress.org/ | |
| 23 | + * | |
| 24 | + * ********************************************************************** | |
| 25 | + * This program is free software; you can redistribute it and/or modify | |
| 26 | + * it under the terms of the GNU General Public License as published by | |
| 27 | + * the Free Software Foundation; either version 2 of the License, or | |
| 28 | + * (at your option) any later version. | |
| 29 | + * | |
| 30 | + * This program is distributed in the hope that it will be useful, | |
| 31 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 32 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 33 | + * GNU General Public License for more details. | |
| 34 | + * | |
| 35 | + * You should have received a copy of the GNU General Public License | |
| 36 | + * along with this program; if not, write to the Free Software | |
| 37 | + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 38 | + * ********************************************************************** | |
| 39 | + */ | |
| 40 | + | |
| 41 | +// don't call the file directly | |
| 42 | +if ( !defined( 'ABSPATH' ) ) { | |
| 43 | + exit; | |
| 44 | +} | |
| 45 | + | |
| 46 | +/** | |
| 47 | + * WeForms class | |
| 48 | + * | |
| 49 | + * @class WeForms The class that holds the entire WeForms plugin | |
| 50 | + */ | |
| 51 | +final class WeForms { | |
| 52 | + | |
| 53 | + /** | |
| 54 | + * Plugin version | |
| 55 | + * | |
| 56 | + * @var string | |
| 57 | + */ | |
| 58 | + public $version = '1.4.4'; | |
| 59 | + | |
| 60 | + /** | |
| 61 | + * Form field value seperator | |
| 62 | + * | |
| 63 | + * @var string | |
| 64 | + */ | |
| 65 | + public static $field_separator = '| '; | |
| 66 | + | |
| 67 | + /** | |
| 68 | + * Holds various class instances | |
| 69 | + * | |
| 70 | + * @var array | |
| 71 | + */ | |
| 72 | + private $container = []; | |
| 73 | + | |
| 74 | + /** | |
| 75 | + * Minimum PHP version required | |
| 76 | + * | |
| 77 | + * @var string | |
| 78 | + */ | |
| 79 | + private $min_php = '5.6.0'; | |
| 80 | + | |
| 81 | + /** | |
| 82 | + * Constructor for the WeForms class | |
| 83 | + * | |
| 84 | + * Sets up all the appropriate hooks and actions | |
| 85 | + * within our plugin. | |
| 86 | + */ | |
| 87 | + public function __construct() { | |
| 88 | + $this->define_constants(); | |
| 89 | + | |
| 90 | + if ( !$this->is_supported_php() ) { | |
| 91 | + register_activation_hook( __FILE__, [ $this, 'auto_deactivate' ] ); | |
| 92 | + add_action( 'admin_notices', [ $this, 'php_version_notice' ] ); | |
| 93 | + | |
| 94 | + return; | |
| 95 | + } | |
| 96 | + | |
| 97 | + register_activation_hook( __FILE__, [ $this, 'activate' ] ); | |
| 98 | + register_deactivation_hook( __FILE__, [ $this, 'deactivate' ] ); | |
| 99 | + | |
| 100 | + add_action( 'admin_init', [ $this, 'plugin_upgrades' ] ); | |
| 101 | + add_action( 'plugins_loaded', [ $this, 'init_plugin' ] ); | |
| 102 | + | |
| 103 | + $this->init_appsero(); | |
| 104 | + } | |
| 105 | + | |
| 106 | + /** | |
| 107 | + * Magic getter to bypass referencing plugin. | |
| 108 | + * | |
| 109 | + * @param $prop | |
| 110 | + * | |
| 111 | + * @return mixed | |
| 112 | + */ | |
| 113 | + public function __get( $prop ) { | |
| 114 | + if ( array_key_exists( $prop, $this->container ) ) { | |
| 115 | + return $this->container[ $prop ]; | |
| 116 | + } | |
| 117 | + | |
| 118 | + return $this->{$prop}; | |
| 119 | + } | |
| 120 | + | |
| 121 | + /** | |
| 122 | + * Magic isset to bypass referencing plugin. | |
| 123 | + * | |
| 124 | + * @param $prop | |
| 125 | + * | |
| 126 | + * @return mixed | |
| 127 | + */ | |
| 128 | + public function __isset( $prop ) { | |
| 129 | + return isset( $this->{$prop} ) || isset( $this->container[ $prop ] ); | |
| 130 | + } | |
| 131 | + | |
| 132 | + /** | |
| 133 | + * Initializes the WeForms() class | |
| 134 | + * | |
| 135 | + * Checks for an existing WeForms() instance | |
| 136 | + * and if it doesn't find one, creates it. | |
| 137 | + */ | |
| 138 | + public static function init() { | |
| 139 | + static $instance = false; | |
| 140 | + | |
| 141 | + if ( !$instance ) { | |
| 142 | + $instance = new WeForms(); | |
| 143 | + } | |
| 144 | + | |
| 145 | + return $instance; | |
| 146 | + } | |
| 147 | + | |
| 148 | + /** | |
| 149 | + * Define the constants | |
| 150 | + * | |
| 151 | + * @return void | |
| 152 | + */ | |
| 153 | + private function define_constants() { | |
| 154 | + define( 'WEFORMS_VERSION', $this->version ); | |
| 155 | + define( 'WEFORMS_FILE', __FILE__ ); | |
| 156 | + define( 'WEFORMS_ROOT', __DIR__ ); | |
| 157 | + define( 'WEFORMS_INCLUDES', WEFORMS_ROOT . '/includes' ); | |
| 158 | + define( 'WEFORMS_ROOT_URI', plugins_url( '', __FILE__ ) ); | |
| 159 | + define( 'WEFORMS_ASSET_URI', WEFORMS_ROOT_URI . '/assets' ); | |
| 160 | + } | |
| 161 | + | |
| 162 | + /** | |
| 163 | + * Load the plugin after WP User Frontend is loaded | |
| 164 | + * | |
| 165 | + * @return void | |
| 166 | + */ | |
| 167 | + public function init_plugin() { | |
| 168 | + $this->includes(); | |
| 169 | + $this->init_hooks(); | |
| 170 | + | |
| 171 | + do_action( 'weforms_loaded' ); | |
| 172 | + } | |
| 173 | + | |
| 174 | + /** | |
| 175 | + * Placeholder for activation function | |
| 176 | + */ | |
| 177 | + public function activate() { | |
| 178 | + | |
| 179 | + // prepare the environment | |
| 180 | + require_once WEFORMS_INCLUDES . '/functions.php'; | |
| 181 | + require_once WEFORMS_INCLUDES . '/class-installer.php'; | |
| 182 | + require_once WEFORMS_INCLUDES . '/class-field-manager.php'; | |
| 183 | + require_once WEFORMS_INCLUDES . '/class-form-manager.php'; | |
| 184 | + require_once WEFORMS_INCLUDES . '/class-template-manager.php'; | |
| 185 | + | |
| 186 | + if ( !array_key_exists( 'fields', $this->container ) ) { | |
| 187 | + $this->container['fields'] = new WeForms_Field_Manager(); | |
| 188 | + } | |
| 189 | + | |
| 190 | + if ( !array_key_exists( 'form', $this->container ) ) { | |
| 191 | + $this->container['form'] = new WeForms_Form_Manager(); | |
| 192 | + } | |
| 193 | + | |
| 194 | + if ( !array_key_exists( 'templates', $this->container ) ) { | |
| 195 | + $this->container['templates'] = new WeForms_Template_Manager(); | |
| 196 | + } | |
| 197 | + | |
| 198 | + $installer = new WeForms_Installer(); | |
| 199 | + $installer->install(); | |
| 200 | + } | |
| 201 | + | |
| 202 | + /** | |
| 203 | + * Placeholder for deactivation function | |
| 204 | + * | |
| 205 | + * Nothing being called here yet. | |
| 206 | + */ | |
| 207 | + public function deactivate() { | |
| 208 | + } | |
| 209 | + | |
| 210 | + /** | |
| 211 | + * Include the required classes | |
| 212 | + * | |
| 213 | + * @return void | |
| 214 | + */ | |
| 215 | + public function includes() { | |
| 216 | + require_once WEFORMS_INCLUDES . '/compat/class-abstract-wpuf-integration.php'; | |
| 217 | + | |
| 218 | + if ( $this->is_request( 'admin' ) ) { | |
| 219 | + // compatibility | |
| 220 | + require_once WEFORMS_INCLUDES . '/class-template-manager.php'; | |
| 221 | + | |
| 222 | + require_once WEFORMS_INCLUDES . '/admin/class-admin.php'; | |
| 223 | + require_once WEFORMS_INCLUDES . '/admin/class-admin-welcome.php'; | |
| 224 | + require_once WEFORMS_INCLUDES . '/class-importer-manager.php'; | |
| 225 | + | |
| 226 | + require_once WEFORMS_INCLUDES . '/admin/class-pro-upgrades.php'; | |
| 227 | + require_once WEFORMS_INCLUDES . '/admin/class-promotion.php'; | |
| 228 | + require_once WEFORMS_INCLUDES . '/admin/class-shortcode-button.php'; | |
| 229 | + require_once WEFORMS_INCLUDES . '/admin/class-privacy.php'; | |
| 230 | + } else { | |
| 231 | + | |
| 232 | + // add reCaptcha library if not found | |
| 233 | + if ( !function_exists( 'recaptcha_get_html' ) ) { | |
| 234 | + require_once WEFORMS_INCLUDES . '/library/reCaptcha/recaptchalib.php'; | |
| 235 | + require_once WEFORMS_INCLUDES . '/library/reCaptcha/recaptchalib_noCaptcha.php'; | |
| 236 | + } | |
| 237 | + } | |
| 238 | + | |
| 239 | + if ( $this->is_request( 'frontend' ) || $this->is_request( 'ajax' ) ) { | |
| 240 | + require_once WEFORMS_INCLUDES . '/class-frontend-form.php'; | |
| 241 | + } | |
| 242 | + require_once WEFORMS_INCLUDES . '/api/class-weforms-api-rest-controller.php'; | |
| 243 | + require_once WEFORMS_INCLUDES . '/class-weforms-api.php'; | |
| 244 | + require_once WEFORMS_INCLUDES . '/class-scripts-styles.php'; | |
| 245 | + require_once WEFORMS_INCLUDES . '/admin/class-gutenblock.php'; | |
| 246 | + require_once WEFORMS_INCLUDES . '/class-emailer.php'; | |
| 247 | + require_once WEFORMS_INCLUDES . '/class-field-manager.php'; | |
| 248 | + require_once WEFORMS_INCLUDES . '/class-form-manager.php'; | |
| 249 | + require_once WEFORMS_INCLUDES . '/class-form-entry-manager.php'; | |
| 250 | + require_once WEFORMS_INCLUDES . '/class-form-entry.php'; | |
| 251 | + require_once WEFORMS_INCLUDES . '/class-form.php'; | |
| 252 | + require_once WEFORMS_INCLUDES . '/class-form-widget.php'; | |
| 253 | + | |
| 254 | + require_once WEFORMS_INCLUDES . '/integrations/class-abstract-integration.php'; | |
| 255 | + require_once WEFORMS_INCLUDES . '/class-integration-manager.php'; | |
| 256 | + | |
| 257 | + require_once WEFORMS_INCLUDES . '/class-ajax.php'; | |
| 258 | + require_once WEFORMS_INCLUDES . '/class-ajax-upload.php'; | |
| 259 | + require_once WEFORMS_INCLUDES . '/class-notification.php'; | |
| 260 | + require_once WEFORMS_INCLUDES . '/class-form-preview.php'; | |
| 261 | + require_once WEFORMS_INCLUDES . '/class-dokan-integration.php'; | |
| 262 | + require_once WEFORMS_INCLUDES . '/functions.php'; | |
| 263 | + } | |
| 264 | + | |
| 265 | + /** | |
| 266 | + * Do plugin upgrades | |
| 267 | + * | |
| 268 | + * @since 1.1.2 | |
| 269 | + * | |
| 270 | + * @return void | |
| 271 | + */ | |
| 272 | + public function plugin_upgrades() { | |
| 273 | + if ( !current_user_can( 'manage_options' ) ) { | |
| 274 | + return; | |
| 275 | + } | |
| 276 | + | |
| 277 | + require_once WEFORMS_INCLUDES . '/class-upgrades.php'; | |
| 278 | + | |
| 279 | + $upgrader = new WeForms_Upgrades(); | |
| 280 | + | |
| 281 | + if ( $upgrader->needs_update() ) { | |
| 282 | + $upgrader->perform_updates(); | |
| 283 | + } | |
| 284 | + } | |
| 285 | + | |
| 286 | + /** | |
| 287 | + * Initialize the hooks | |
| 288 | + * | |
| 289 | + * @return void | |
| 290 | + */ | |
| 291 | + public function init_hooks() { | |
| 292 | + | |
| 293 | + // Localize our plugin | |
| 294 | + add_action( 'init', [ $this, 'localization_setup' ] ); | |
| 295 | + | |
| 296 | + // initialize the classes | |
| 297 | + add_action( 'init', [ $this, 'init_classes' ] ); | |
| 298 | + add_action( 'init', [ $this, 'wpdb_table_shortcuts' ], 0 ); | |
| 299 | + | |
| 300 | + add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), [ $this, 'plugin_action_links' ] ); | |
| 301 | + } | |
| 302 | + | |
| 303 | + /** | |
| 304 | + * Set WPDB table shortcut names | |
| 305 | + * | |
| 306 | + * @return void | |
| 307 | + */ | |
| 308 | + public function wpdb_table_shortcuts() { | |
| 309 | + global $wpdb; | |
| 310 | + | |
| 311 | + $wpdb->weforms_entries = $wpdb->prefix . 'weforms_entries'; | |
| 312 | + $wpdb->weforms_entrymeta = $wpdb->prefix . 'weforms_entrymeta'; | |
| 313 | + } | |
| 314 | + | |
| 315 | + /** | |
| 316 | + * Initialize plugin for localization | |
| 317 | + * | |
| 318 | + * @uses load_plugin_textdomain() | |
| 319 | + */ | |
| 320 | + public function localization_setup() { | |
| 321 | + load_plugin_textdomain( 'weforms', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' ); | |
| 322 | + } | |
| 323 | + | |
| 324 | + /** | |
| 325 | + * Instantiate the required classes | |
| 326 | + * | |
| 327 | + * @return void | |
| 328 | + */ | |
| 329 | + public function init_classes() { | |
| 330 | + if ( $this->is_request( 'admin' ) ) { | |
| 331 | + $this->container['admin'] = new WeForms_Admin(); | |
| 332 | + // $this->container['welcome'] = new WeForms_Admin_Welcome(); | |
| 333 | + $this->container['templates'] = new WeForms_Template_Manager(); | |
| 334 | + $this->container['pro_upgrades'] = new WeForms_Pro_Upgrades(); | |
| 335 | + $this->container['importer'] = new WeForms_Importer_Manager(); | |
| 336 | + $this->container['promo_offer'] = new WeForms_Admin_Promotion(); | |
| 337 | + $this->container['privacy'] = new WeForms_Privacy(); | |
| 338 | + } | |
| 339 | + | |
| 340 | + if ( $this->is_request( 'frontend' ) || $this->is_request( 'ajax' ) ) { | |
| 341 | + $this->container['frontend'] = new WeForms_Frontend_Form(); | |
| 342 | + } | |
| 343 | + | |
| 344 | + $this->container['emailer'] = new WeForms_Emailer(); | |
| 345 | + $this->container['form'] = new WeForms_Form_Manager(); | |
| 346 | + $this->container['fields'] = new WeForms_Field_Manager(); | |
| 347 | + $this->container['integrations'] = new WeForms_Integration_Manager(); | |
| 348 | + $this->container['preview'] = new WeForms_Form_Preview(); | |
| 349 | + $this->container['scripts'] = new WeForms_Scripts_Styles(); | |
| 350 | + $this->container['block'] = new weForms_FormBlock(); | |
| 351 | + $this->container['dokan_integration'] = new weForms_Dokan_Integration(); | |
| 352 | + // instantiate the integrations | |
| 353 | + $this->integrations->get_integrations(); | |
| 354 | + | |
| 355 | + if ( $this->is_request( 'ajax' ) ) { | |
| 356 | + $this->container['ajax'] = new WeForms_Ajax(); | |
| 357 | + $this->container['ajax_upload'] = new WeForms_Ajax_Upload(); | |
| 358 | + } | |
| 359 | + $this->container['weforms_api'] = new WeForms_Api(); | |
| 360 | + } | |
| 361 | + | |
| 362 | + /** | |
| 363 | + * The main logging function | |
| 364 | + * | |
| 365 | + * @uses error_log | |
| 366 | + * | |
| 367 | + * @param string $type type of the error. e.g: debug, error, info | |
| 368 | + * @param string $msg | |
| 369 | + */ | |
| 370 | + public static function log( $type = '', $msg = '' ) { | |
| 371 | + | |
| 372 | + // default we are turning the debug mood on, but can be turned off | |
| 373 | + if ( defined( 'WEFORMS_DEBUG_LOG' ) && false === WEFORMS_DEBUG_LOG ) { | |
| 374 | + return; | |
| 375 | + } | |
| 376 | + | |
| 377 | + $msg = sprintf( "[%s][%s] %s\n", date( 'd.m.Y h:i:s' ), $type, $msg ); | |
| 378 | + @error_log( $msg, 3, weforms_log_file_path() ); | |
| 379 | + } | |
| 380 | + | |
| 381 | + /** | |
| 382 | + * Plugin action links | |
| 383 | + * | |
| 384 | + * @param array $links | |
| 385 | + * | |
| 386 | + * @return array | |
| 387 | + */ | |
| 388 | + public function plugin_action_links( $links ) { | |
| 389 | + $links[] = '<a href="https://wedevs.com/docs/weforms/?utm_source=weforms-action-link&utm_medium=textlink&utm_campaign=plugin-docs-link" target="_blank">' . __( 'Docs', 'weforms' ) . '</a>'; | |
| 390 | + $links[] = '<a href="' . admin_url( 'admin.php?page=weforms' ) . '">' . __( 'Settings', 'weforms' ) . '</a>'; | |
| 391 | + | |
| 392 | + return $links; | |
| 393 | + } | |
| 394 | + | |
| 395 | + /** | |
| 396 | + * Check if the PHP version is supported | |
| 397 | + * | |
| 398 | + * @return bool | |
| 399 | + */ | |
| 400 | + public function is_supported_php( $min_php = null ) { | |
| 401 | + $min_php = $min_php ? $min_php : $this->min_php; | |
| 402 | + | |
| 403 | + if ( version_compare( PHP_VERSION, $min_php, '<=' ) ) { | |
| 404 | + return false; | |
| 405 | + } | |
| 406 | + | |
| 407 | + return true; | |
| 408 | + } | |
| 409 | + | |
| 410 | + /** | |
| 411 | + * Show notice about PHP version | |
| 412 | + * | |
| 413 | + * @return void | |
| 414 | + */ | |
| 415 | + public function php_version_notice() { | |
| 416 | + if ( $this->is_supported_php() || !current_user_can( 'manage_options' ) ) { | |
| 417 | + return; | |
| 418 | + } | |
| 419 | + | |
| 420 | + $error = __( 'Your installed PHP Version is: ', 'weforms' ) . PHP_VERSION . '. '; | |
| 421 | + $error .= __( 'The <strong>weForms</strong> plugin requires PHP version <strong>', 'weforms' ) . $this->min_php . __( '</strong> or greater.', 'weforms' ); ?> | |
| 422 | + <div class="error"> | |
| 423 | + <p><?php printf( wp_kses_post ( $error ) ); ?></p> | |
| 424 | + </div> | |
| 425 | + <?php | |
| 426 | + } | |
| 427 | + | |
| 428 | + /** | |
| 429 | + * Bail out if the php version is lower than | |
| 430 | + * | |
| 431 | + * @return void | |
| 432 | + */ | |
| 433 | + public function auto_deactivate() { | |
| 434 | + if ( $this->is_supported_php() ) { | |
| 435 | + return; | |
| 436 | + } | |
| 437 | + | |
| 438 | + deactivate_plugins( plugin_basename( __FILE__ ) ); | |
| 439 | + | |
| 440 | + $error = __( '<h1>An Error Occured</h1>', 'weforms' ); | |
| 441 | + $error .= __( '<h2>Your installed PHP Version is: ', 'weforms' ) . PHP_VERSION . '</h2>'; | |
| 442 | + $error .= __( '<p>The <strong>weforms</strong> plugin requires PHP version <strong>', 'weforms' ) . $this->min_php . __( '</strong> or greater', 'weforms' ); | |
| 443 | + $error .= __( '<p>The version of your PHP is ', 'weforms' ) . '<a href="http://php.net/supported-versions.php" target="_blank"><strong>' . __( 'unsupported and old', 'weforms' ) . '</strong></a>.'; | |
| 444 | + $error .= __( 'You should update your PHP software or contact your host regarding this matter.</p>', 'weforms' ); | |
| 445 | + | |
| 446 | + wp_die( wp_kses_post( $error ), esc_html_e( 'Plugin Activation Error', 'weforms' ), [ 'back_link' => true ] ); | |
| 447 | + } | |
| 448 | + | |
| 449 | + /** | |
| 450 | + * What type of request is this? | |
| 451 | + * | |
| 452 | + * @since 1.2.3 | |
| 453 | + * | |
| 454 | + * @param string $type admin, ajax, cron, api or frontend | |
| 455 | + * | |
| 456 | + * @return bool | |
| 457 | + */ | |
| 458 | + private function is_request( $type ) { | |
| 459 | + switch ( $type ) { | |
| 460 | + case 'admin': | |
| 461 | + return is_admin(); | |
| 462 | + | |
| 463 | + case 'ajax': | |
| 464 | + return defined( 'DOING_AJAX' ); | |
| 465 | + | |
| 466 | + case 'cron': | |
| 467 | + return defined( 'DOING_CRON' ); | |
| 468 | + | |
| 469 | + case 'api': | |
| 470 | + return defined( 'REST_REQUEST' ); | |
| 471 | + | |
| 472 | + case 'frontend': | |
| 473 | + return ( !is_admin() || defined( 'DOING_AJAX' ) ) && !defined( 'DOING_CRON' ); | |
| 474 | + } | |
| 475 | + } | |
| 476 | + | |
| 477 | + /** | |
| 478 | + * Init appsero tracker | |
| 479 | + */ | |
| 480 | + private function init_appsero() { | |
| 481 | + if ( ! class_exists( 'Appsero\Client' ) ) { | |
| 482 | + require_once WEFORMS_INCLUDES . '/library/appsero/Client.php'; | |
| 483 | + } | |
| 484 | + | |
| 485 | + $client = new Appsero\Client( '213fd70e-0bf3-4710-a35e-934b5a376e13', 'weForms', __FILE__ ); | |
| 486 | + | |
| 487 | + // Active insights | |
| 488 | + $client->insights()->init(); | |
| 489 | + } | |
| 490 | +} // WeForms | |
| 491 | + | |
| 492 | +/** | |
| 493 | + * Initialize the plugin | |
| 494 | + * | |
| 495 | + * @return \WeForms | |
| 496 | + */ | |
| 497 | +function weforms() { | |
| 498 | + return WeForms::init(); | |
| 499 | +} | |
| 500 | + | |
| 501 | +// kick-off | |
| 502 | +weforms(); | |