Completed
Branch BUG/enqueue-coundownjs-only-wh... (14e608)
by
unknown
24:26 queued 10:45
created
modules/single_page_checkout/EED_Single_Page_Checkout.module.php 2 patches
Indentation   +1796 added lines, -1796 removed lines patch added patch discarded remove patch
@@ -15,1800 +15,1800 @@
 block discarded – undo
15 15
 class EED_Single_Page_Checkout extends EED_Module
16 16
 {
17 17
 
18
-    /**
19
-     * $_initialized - has the SPCO controller already been initialized ?
20
-     *
21
-     * @access private
22
-     * @var bool $_initialized
23
-     */
24
-    private static $_initialized = false;
25
-
26
-
27
-    /**
28
-     * $_checkout_verified - is the EE_Checkout verified as correct for this request ?
29
-     *
30
-     * @access private
31
-     * @var bool $_valid_checkout
32
-     */
33
-    private static $_checkout_verified = true;
34
-
35
-    /**
36
-     *    $_reg_steps_array - holds initial array of reg steps
37
-     *
38
-     * @access private
39
-     * @var array $_reg_steps_array
40
-     */
41
-    private static $_reg_steps_array = array();
42
-
43
-    /**
44
-     *    $checkout - EE_Checkout object for handling the properties of the current checkout process
45
-     *
46
-     * @access public
47
-     * @var EE_Checkout $checkout
48
-     */
49
-    public $checkout;
50
-
51
-
52
-    /**
53
-     * @return EED_Module|EED_Single_Page_Checkout
54
-     */
55
-    public static function instance()
56
-    {
57
-        add_filter('EED_Single_Page_Checkout__SPCO_active', '__return_true');
58
-        return parent::get_instance(__CLASS__);
59
-    }
60
-
61
-
62
-    /**
63
-     * @return EE_CART
64
-     */
65
-    public function cart()
66
-    {
67
-        return $this->checkout->cart;
68
-    }
69
-
70
-
71
-    /**
72
-     * @return EE_Transaction
73
-     */
74
-    public function transaction()
75
-    {
76
-        return $this->checkout->transaction;
77
-    }
78
-
79
-
80
-    /**
81
-     *    set_hooks - for hooking into EE Core, other modules, etc
82
-     *
83
-     * @access    public
84
-     * @return    void
85
-     * @throws EE_Error
86
-     */
87
-    public static function set_hooks()
88
-    {
89
-        EED_Single_Page_Checkout::set_definitions();
90
-    }
91
-
92
-
93
-    /**
94
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
95
-     *
96
-     * @access    public
97
-     * @return    void
98
-     * @throws EE_Error
99
-     */
100
-    public static function set_hooks_admin()
101
-    {
102
-        EED_Single_Page_Checkout::set_definitions();
103
-        if (! (defined('DOING_AJAX') && DOING_AJAX)) {
104
-            return;
105
-        }
106
-        // going to start an output buffer in case anything gets accidentally output
107
-        // that might disrupt our JSON response
108
-        ob_start();
109
-        EED_Single_Page_Checkout::load_request_handler();
110
-        EED_Single_Page_Checkout::load_reg_steps();
111
-        // set ajax hooks
112
-        add_action('wp_ajax_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step'));
113
-        add_action('wp_ajax_nopriv_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step'));
114
-        add_action('wp_ajax_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step'));
115
-        add_action('wp_ajax_nopriv_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step'));
116
-        add_action('wp_ajax_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step'));
117
-        add_action('wp_ajax_nopriv_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step'));
118
-    }
119
-
120
-
121
-    /**
122
-     *    process ajax request
123
-     *
124
-     * @param string $ajax_action
125
-     * @throws EE_Error
126
-     */
127
-    public static function process_ajax_request($ajax_action)
128
-    {
129
-        EE_Registry::instance()->REQ->set('action', $ajax_action);
130
-        EED_Single_Page_Checkout::instance()->_initialize();
131
-    }
132
-
133
-
134
-    /**
135
-     *    ajax display registration step
136
-     *
137
-     * @throws EE_Error
138
-     */
139
-    public static function display_reg_step()
140
-    {
141
-        EED_Single_Page_Checkout::process_ajax_request('display_spco_reg_step');
142
-    }
143
-
144
-
145
-    /**
146
-     *    ajax process registration step
147
-     *
148
-     * @throws EE_Error
149
-     */
150
-    public static function process_reg_step()
151
-    {
152
-        EED_Single_Page_Checkout::process_ajax_request('process_reg_step');
153
-    }
154
-
155
-
156
-    /**
157
-     *    ajax process registration step
158
-     *
159
-     * @throws EE_Error
160
-     */
161
-    public static function update_reg_step()
162
-    {
163
-        EED_Single_Page_Checkout::process_ajax_request('update_reg_step');
164
-    }
165
-
166
-
167
-    /**
168
-     *   update_checkout
169
-     *
170
-     * @access public
171
-     * @return void
172
-     * @throws EE_Error
173
-     */
174
-    public static function update_checkout()
175
-    {
176
-        EED_Single_Page_Checkout::process_ajax_request('update_checkout');
177
-    }
178
-
179
-
180
-    /**
181
-     *    load_request_handler
182
-     *
183
-     * @access    public
184
-     * @return    void
185
-     */
186
-    public static function load_request_handler()
187
-    {
188
-        // load core Request_Handler class
189
-        if (EE_Registry::instance()->REQ !== null) {
190
-            EE_Registry::instance()->load_core('Request_Handler');
191
-        }
192
-    }
193
-
194
-
195
-    /**
196
-     *    set_definitions
197
-     *
198
-     * @access    public
199
-     * @return    void
200
-     * @throws EE_Error
201
-     */
202
-    public static function set_definitions()
203
-    {
204
-        if (defined('SPCO_BASE_PATH')) {
205
-            return;
206
-        }
207
-        define(
208
-            'SPCO_BASE_PATH',
209
-            rtrim(str_replace(array('\\', '/'), DS, plugin_dir_path(__FILE__)), DS) . DS
210
-        );
211
-        define('SPCO_CSS_URL', plugin_dir_url(__FILE__) . 'css' . DS);
212
-        define('SPCO_IMG_URL', plugin_dir_url(__FILE__) . 'img' . DS);
213
-        define('SPCO_JS_URL', plugin_dir_url(__FILE__) . 'js' . DS);
214
-        define('SPCO_INC_PATH', SPCO_BASE_PATH . 'inc' . DS);
215
-        define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH . 'reg_steps' . DS);
216
-        define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH . 'templates' . DS);
217
-        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(SPCO_BASE_PATH, true);
218
-        EE_Registry::$i18n_js_strings['registration_expiration_notice'] = EED_Single_Page_Checkout::getRegistrationExpirationNotice(
219
-        );
220
-    }
221
-
222
-
223
-    /**
224
-     * load_reg_steps
225
-     * loads and instantiates each reg step based on the EE_Registry::instance()->CFG->registration->reg_steps array
226
-     *
227
-     * @access    private
228
-     * @throws EE_Error
229
-     */
230
-    public static function load_reg_steps()
231
-    {
232
-        static $reg_steps_loaded = false;
233
-        if ($reg_steps_loaded) {
234
-            return;
235
-        }
236
-        // filter list of reg_steps
237
-        $reg_steps_to_load = (array) apply_filters(
238
-            'AHEE__SPCO__load_reg_steps__reg_steps_to_load',
239
-            EED_Single_Page_Checkout::get_reg_steps()
240
-        );
241
-        // sort by key (order)
242
-        ksort($reg_steps_to_load);
243
-        // loop through folders
244
-        foreach ($reg_steps_to_load as $order => $reg_step) {
245
-            // we need a
246
-            if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) {
247
-                // copy over to the reg_steps_array
248
-                EED_Single_Page_Checkout::$_reg_steps_array[ $order ] = $reg_step;
249
-                // register custom key route for each reg step
250
-                // ie: step=>"slug" - this is the entire reason we load the reg steps array now
251
-                EE_Config::register_route(
252
-                    $reg_step['slug'],
253
-                    'EED_Single_Page_Checkout',
254
-                    'run',
255
-                    'step'
256
-                );
257
-                // add AJAX or other hooks
258
-                if (isset($reg_step['has_hooks']) && $reg_step['has_hooks']) {
259
-                    // setup autoloaders if necessary
260
-                    if (! class_exists($reg_step['class_name'])) {
261
-                        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(
262
-                            $reg_step['file_path'],
263
-                            true
264
-                        );
265
-                    }
266
-                    if (is_callable($reg_step['class_name'], 'set_hooks')) {
267
-                        call_user_func(array($reg_step['class_name'], 'set_hooks'));
268
-                    }
269
-                }
270
-            }
271
-        }
272
-        $reg_steps_loaded = true;
273
-    }
274
-
275
-
276
-    /**
277
-     *    get_reg_steps
278
-     *
279
-     * @access    public
280
-     * @return    array
281
-     */
282
-    public static function get_reg_steps()
283
-    {
284
-        $reg_steps = EE_Registry::instance()->CFG->registration->reg_steps;
285
-        if (empty($reg_steps)) {
286
-            $reg_steps = array(
287
-                10  => array(
288
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'attendee_information',
289
-                    'class_name' => 'EE_SPCO_Reg_Step_Attendee_Information',
290
-                    'slug'       => 'attendee_information',
291
-                    'has_hooks'  => false,
292
-                ),
293
-                30  => array(
294
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'payment_options',
295
-                    'class_name' => 'EE_SPCO_Reg_Step_Payment_Options',
296
-                    'slug'       => 'payment_options',
297
-                    'has_hooks'  => true,
298
-                ),
299
-                999 => array(
300
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'finalize_registration',
301
-                    'class_name' => 'EE_SPCO_Reg_Step_Finalize_Registration',
302
-                    'slug'       => 'finalize_registration',
303
-                    'has_hooks'  => false,
304
-                ),
305
-            );
306
-        }
307
-        return $reg_steps;
308
-    }
309
-
310
-
311
-    /**
312
-     *    registration_checkout_for_admin
313
-     *
314
-     * @access    public
315
-     * @return    string
316
-     * @throws EE_Error
317
-     */
318
-    public static function registration_checkout_for_admin()
319
-    {
320
-        EED_Single_Page_Checkout::load_request_handler();
321
-        EE_Registry::instance()->REQ->set('step', 'attendee_information');
322
-        EE_Registry::instance()->REQ->set('action', 'display_spco_reg_step');
323
-        EE_Registry::instance()->REQ->set('process_form_submission', false);
324
-        EED_Single_Page_Checkout::instance()->_initialize();
325
-        EED_Single_Page_Checkout::instance()->_display_spco_reg_form();
326
-        return EE_Registry::instance()->REQ->get_output();
327
-    }
328
-
329
-
330
-    /**
331
-     * process_registration_from_admin
332
-     *
333
-     * @access public
334
-     * @return \EE_Transaction
335
-     * @throws EE_Error
336
-     */
337
-    public static function process_registration_from_admin()
338
-    {
339
-        EED_Single_Page_Checkout::load_request_handler();
340
-        EE_Registry::instance()->REQ->set('step', 'attendee_information');
341
-        EE_Registry::instance()->REQ->set('action', 'process_reg_step');
342
-        EE_Registry::instance()->REQ->set('process_form_submission', true);
343
-        EED_Single_Page_Checkout::instance()->_initialize();
344
-        if (EED_Single_Page_Checkout::instance()->checkout->current_step->completed()) {
345
-            $final_reg_step = end(EED_Single_Page_Checkout::instance()->checkout->reg_steps);
346
-            if ($final_reg_step instanceof EE_SPCO_Reg_Step_Finalize_Registration) {
347
-                EED_Single_Page_Checkout::instance()->checkout->set_reg_step_initiated($final_reg_step);
348
-                if ($final_reg_step->process_reg_step()) {
349
-                    $final_reg_step->set_completed();
350
-                    EED_Single_Page_Checkout::instance()->checkout->update_txn_reg_steps_array();
351
-                    return EED_Single_Page_Checkout::instance()->checkout->transaction;
352
-                }
353
-            }
354
-        }
355
-        return null;
356
-    }
357
-
358
-
359
-    /**
360
-     *    run
361
-     *
362
-     * @access    public
363
-     * @param WP_Query $WP_Query
364
-     * @return    void
365
-     * @throws EE_Error
366
-     */
367
-    public function run($WP_Query)
368
-    {
369
-        if ($WP_Query instanceof WP_Query
370
-            && $WP_Query->is_main_query()
371
-            && apply_filters('FHEE__EED_Single_Page_Checkout__run', true)
372
-            && $this->_is_reg_checkout()
373
-        ) {
374
-            $this->_initialize();
375
-        }
376
-    }
377
-
378
-
379
-    /**
380
-     * determines whether current url matches reg page url
381
-     *
382
-     * @return bool
383
-     */
384
-    protected function _is_reg_checkout()
385
-    {
386
-        // get current permalink for reg page without any extra query args
387
-        $reg_page_url = \get_permalink(EE_Config::instance()->core->reg_page_id);
388
-        // get request URI for current request, but without the scheme or host
389
-        $current_request_uri = \EEH_URL::filter_input_server_url('REQUEST_URI');
390
-        $current_request_uri = html_entity_decode($current_request_uri);
391
-        // get array of query args from the current request URI
392
-        $query_args = \EEH_URL::get_query_string($current_request_uri);
393
-        // grab page id if it is set
394
-        $page_id = isset($query_args['page_id']) ? absint($query_args['page_id']) : 0;
395
-        // and remove the page id from the query args (we will re-add it later)
396
-        unset($query_args['page_id']);
397
-        // now strip all query args from current request URI
398
-        $current_request_uri = remove_query_arg(array_keys($query_args), $current_request_uri);
399
-        // and re-add the page id if it was set
400
-        if ($page_id) {
401
-            $current_request_uri = add_query_arg('page_id', $page_id, $current_request_uri);
402
-        }
403
-        // remove slashes and ?
404
-        $current_request_uri = trim($current_request_uri, '?/');
405
-        // is current request URI part of the known full reg page URL ?
406
-        return ! empty($current_request_uri) && strpos($reg_page_url, $current_request_uri) !== false;
407
-    }
408
-
409
-
410
-    /**
411
-     * @param WP_Query $wp_query
412
-     * @return    void
413
-     * @throws EE_Error
414
-     */
415
-    public static function init($wp_query)
416
-    {
417
-        EED_Single_Page_Checkout::instance()->run($wp_query);
418
-    }
419
-
420
-
421
-    /**
422
-     *    _initialize - initial module setup
423
-     *
424
-     * @access    private
425
-     * @throws EE_Error
426
-     * @return    void
427
-     */
428
-    private function _initialize()
429
-    {
430
-        // ensure SPCO doesn't run twice
431
-        if (EED_Single_Page_Checkout::$_initialized) {
432
-            return;
433
-        }
434
-        try {
435
-            EED_Single_Page_Checkout::load_reg_steps();
436
-            $this->_verify_session();
437
-            // setup the EE_Checkout object
438
-            $this->checkout = $this->_initialize_checkout();
439
-            // filter checkout
440
-            $this->checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize__checkout', $this->checkout);
441
-            // get the $_GET
442
-            $this->_get_request_vars();
443
-            if ($this->_block_bots()) {
444
-                return;
445
-            }
446
-            // filter continue_reg
447
-            $this->checkout->continue_reg = apply_filters(
448
-                'FHEE__EED_Single_Page_Checkout__init___continue_reg',
449
-                true,
450
-                $this->checkout
451
-            );
452
-            // load the reg steps array
453
-            if (! $this->_load_and_instantiate_reg_steps()) {
454
-                EED_Single_Page_Checkout::$_initialized = true;
455
-                return;
456
-            }
457
-            // set the current step
458
-            $this->checkout->set_current_step($this->checkout->step);
459
-            // and the next step
460
-            $this->checkout->set_next_step();
461
-            // verify that everything has been setup correctly
462
-            if (! ($this->_verify_transaction_and_get_registrations() && $this->_final_verifications())) {
463
-                EED_Single_Page_Checkout::$_initialized = true;
464
-                return;
465
-            }
466
-            // lock the transaction
467
-            $this->checkout->transaction->lock();
468
-            // make sure all of our cached objects are added to their respective model entity mappers
469
-            $this->checkout->refresh_all_entities();
470
-            // set amount owing
471
-            $this->checkout->amount_owing = $this->checkout->transaction->remaining();
472
-            // initialize each reg step, which gives them the chance to potentially alter the process
473
-            $this->_initialize_reg_steps();
474
-            // DEBUG LOG
475
-            // $this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ );
476
-            // get reg form
477
-            if (! $this->_check_form_submission()) {
478
-                EED_Single_Page_Checkout::$_initialized = true;
479
-                return;
480
-            }
481
-            // checkout the action!!!
482
-            $this->_process_form_action();
483
-            // add some style and make it dance
484
-            $this->add_styles_and_scripts();
485
-            // kk... SPCO has successfully run
486
-            EED_Single_Page_Checkout::$_initialized = true;
487
-            // set no cache headers and constants
488
-            EE_System::do_not_cache();
489
-            // add anchor
490
-            add_action('loop_start', array($this, 'set_checkout_anchor'), 1);
491
-            // remove transaction lock
492
-            add_action('shutdown', array($this, 'unlock_transaction'), 1);
493
-        } catch (Exception $e) {
494
-            EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
495
-        }
496
-    }
497
-
498
-
499
-    /**
500
-     *    _verify_session
501
-     * checks that the session is valid and not expired
502
-     *
503
-     * @access    private
504
-     * @throws EE_Error
505
-     */
506
-    private function _verify_session()
507
-    {
508
-        if (! EE_Registry::instance()->SSN instanceof EE_Session) {
509
-            throw new EE_Error(__('The EE_Session class could not be loaded.', 'event_espresso'));
510
-        }
511
-        $clear_session_requested = filter_var(
512
-            EE_Registry::instance()->REQ->get('clear_session', false),
513
-            FILTER_VALIDATE_BOOLEAN
514
-        );
515
-        // is session still valid ?
516
-        if ($clear_session_requested
517
-            || (EE_Registry::instance()->SSN->expired()
518
-                && EE_Registry::instance()->REQ->get('e_reg_url_link', '') === ''
519
-            )
520
-        ) {
521
-            $this->checkout = new EE_Checkout();
522
-            EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
523
-            // EE_Registry::instance()->SSN->reset_cart();
524
-            // EE_Registry::instance()->SSN->reset_checkout();
525
-            // EE_Registry::instance()->SSN->reset_transaction();
526
-            if (! $clear_session_requested) {
527
-                EE_Error::add_attention(
528
-                    EE_Registry::$i18n_js_strings['registration_expiration_notice'],
529
-                    __FILE__,
530
-                    __FUNCTION__,
531
-                    __LINE__
532
-                );
533
-            }
534
-            // EE_Registry::instance()->SSN->reset_expired();
535
-        }
536
-    }
537
-
538
-
539
-    /**
540
-     *    _initialize_checkout
541
-     * loads and instantiates EE_Checkout
542
-     *
543
-     * @access    private
544
-     * @throws EE_Error
545
-     * @return EE_Checkout
546
-     */
547
-    private function _initialize_checkout()
548
-    {
549
-        // look in session for existing checkout
550
-        /** @type EE_Checkout $checkout */
551
-        $checkout = EE_Registry::instance()->SSN->checkout();
552
-        // verify
553
-        if (! $checkout instanceof EE_Checkout) {
554
-            // instantiate EE_Checkout object for handling the properties of the current checkout process
555
-            $checkout = EE_Registry::instance()->load_file(
556
-                SPCO_INC_PATH,
557
-                'EE_Checkout',
558
-                'class',
559
-                array(),
560
-                false
561
-            );
562
-        } else {
563
-            if ($checkout->current_step->is_final_step() && $checkout->exit_spco() === true) {
564
-                $this->unlock_transaction();
565
-                wp_safe_redirect($checkout->redirect_url);
566
-                exit();
567
-            }
568
-        }
569
-        $checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize_checkout__checkout', $checkout);
570
-        // verify again
571
-        if (! $checkout instanceof EE_Checkout) {
572
-            throw new EE_Error(__('The EE_Checkout class could not be loaded.', 'event_espresso'));
573
-        }
574
-        // reset anything that needs a clean slate for each request
575
-        $checkout->reset_for_current_request();
576
-        return $checkout;
577
-    }
578
-
579
-
580
-    /**
581
-     *    _get_request_vars
582
-     *
583
-     * @access    private
584
-     * @return    void
585
-     * @throws EE_Error
586
-     */
587
-    private function _get_request_vars()
588
-    {
589
-        // load classes
590
-        EED_Single_Page_Checkout::load_request_handler();
591
-        // make sure this request is marked as belonging to EE
592
-        EE_Registry::instance()->REQ->set_espresso_page(true);
593
-        // which step is being requested ?
594
-        $this->checkout->step = EE_Registry::instance()->REQ->get('step', $this->_get_first_step());
595
-        // which step is being edited ?
596
-        $this->checkout->edit_step = EE_Registry::instance()->REQ->get('edit_step', '');
597
-        // and what we're doing on the current step
598
-        $this->checkout->action = EE_Registry::instance()->REQ->get('action', 'display_spco_reg_step');
599
-        // timestamp
600
-        $this->checkout->uts = EE_Registry::instance()->REQ->get('uts', 0);
601
-        // returning to edit ?
602
-        $this->checkout->reg_url_link = EE_Registry::instance()->REQ->get('e_reg_url_link', '');
603
-        // add reg url link to registration query params
604
-        if ($this->checkout->reg_url_link && strpos($this->checkout->reg_url_link, '1-') !== 0) {
605
-            $this->checkout->reg_cache_where_params[0]['REG_url_link'] = $this->checkout->reg_url_link;
606
-        }
607
-        // or some other kind of revisit ?
608
-        $this->checkout->revisit = filter_var(
609
-            EE_Registry::instance()->REQ->get('revisit', false),
610
-            FILTER_VALIDATE_BOOLEAN
611
-        );
612
-        // and whether or not to generate a reg form for this request
613
-        $this->checkout->generate_reg_form = filter_var(
614
-            EE_Registry::instance()->REQ->get('generate_reg_form', true),
615
-            FILTER_VALIDATE_BOOLEAN
616
-        );
617
-        // and whether or not to process a reg form submission for this request
618
-        $this->checkout->process_form_submission = filter_var(
619
-            EE_Registry::instance()->REQ->get(
620
-                'process_form_submission',
621
-                $this->checkout->action === 'process_reg_step'
622
-            ),
623
-            FILTER_VALIDATE_BOOLEAN
624
-        );
625
-        $this->checkout->process_form_submission = filter_var(
626
-            $this->checkout->action !== 'display_spco_reg_step'
627
-                ? $this->checkout->process_form_submission
628
-                : false,
629
-            FILTER_VALIDATE_BOOLEAN
630
-        );
631
-        // $this->_display_request_vars();
632
-    }
633
-
634
-
635
-    /**
636
-     *  _display_request_vars
637
-     *
638
-     * @access    protected
639
-     * @return    void
640
-     */
641
-    protected function _display_request_vars()
642
-    {
643
-        if (! WP_DEBUG) {
644
-            return;
645
-        }
646
-        EEH_Debug_Tools::printr($_REQUEST, '$_REQUEST', __FILE__, __LINE__);
647
-        EEH_Debug_Tools::printr($this->checkout->step, '$this->checkout->step', __FILE__, __LINE__);
648
-        EEH_Debug_Tools::printr($this->checkout->edit_step, '$this->checkout->edit_step', __FILE__, __LINE__);
649
-        EEH_Debug_Tools::printr($this->checkout->action, '$this->checkout->action', __FILE__, __LINE__);
650
-        EEH_Debug_Tools::printr($this->checkout->reg_url_link, '$this->checkout->reg_url_link', __FILE__, __LINE__);
651
-        EEH_Debug_Tools::printr($this->checkout->revisit, '$this->checkout->revisit', __FILE__, __LINE__);
652
-        EEH_Debug_Tools::printr(
653
-            $this->checkout->generate_reg_form,
654
-            '$this->checkout->generate_reg_form',
655
-            __FILE__,
656
-            __LINE__
657
-        );
658
-        EEH_Debug_Tools::printr(
659
-            $this->checkout->process_form_submission,
660
-            '$this->checkout->process_form_submission',
661
-            __FILE__,
662
-            __LINE__
663
-        );
664
-    }
665
-
666
-
667
-    /**
668
-     * _block_bots
669
-     * checks that the incoming request has either of the following set:
670
-     *  a uts (unix timestamp) which indicates that the request was redirected from the Ticket Selector
671
-     *  a REG URL Link, which indicates that the request is a return visit to SPCO for a valid TXN
672
-     * so if you're not coming from the Ticket Selector nor returning for a valid IP...
673
-     * then where you coming from man?
674
-     *
675
-     * @return boolean
676
-     */
677
-    private function _block_bots()
678
-    {
679
-        $invalid_checkout_access = EED_Invalid_Checkout_Access::getInvalidCheckoutAccess();
680
-        if ($invalid_checkout_access->checkoutAccessIsInvalid($this->checkout)) {
681
-            return true;
682
-        }
683
-        return false;
684
-    }
685
-
686
-
687
-    /**
688
-     *    _get_first_step
689
-     *  gets slug for first step in $_reg_steps_array
690
-     *
691
-     * @access    private
692
-     * @throws EE_Error
693
-     * @return    string
694
-     */
695
-    private function _get_first_step()
696
-    {
697
-        $first_step = reset(EED_Single_Page_Checkout::$_reg_steps_array);
698
-        return isset($first_step['slug']) ? $first_step['slug'] : 'attendee_information';
699
-    }
700
-
701
-
702
-    /**
703
-     * instantiates each reg step based on the loaded reg_steps array
704
-     *
705
-     * @return    bool
706
-     * @throws EE_Error
707
-     * @throws InvalidArgumentException
708
-     * @throws InvalidDataTypeException
709
-     * @throws InvalidInterfaceException
710
-     */
711
-    private function _load_and_instantiate_reg_steps()
712
-    {
713
-        do_action('AHEE__Single_Page_Checkout___load_and_instantiate_reg_steps__start', $this->checkout);
714
-        // have reg_steps already been instantiated ?
715
-        if (empty($this->checkout->reg_steps)
716
-            || apply_filters('FHEE__Single_Page_Checkout__load_reg_steps__reload_reg_steps', false, $this->checkout)
717
-        ) {
718
-            // if not, then loop through raw reg steps array
719
-            foreach (EED_Single_Page_Checkout::$_reg_steps_array as $order => $reg_step) {
720
-                if (! $this->_load_and_instantiate_reg_step($reg_step, $order)) {
721
-                    return false;
722
-                }
723
-            }
724
-            if (isset($this->checkout->reg_steps['registration_confirmation'])) {
725
-                // skip the registration_confirmation page ?
726
-                if (EE_Registry::instance()->CFG->registration->skip_reg_confirmation) {
727
-                    // just remove it from the reg steps array
728
-                    $this->checkout->remove_reg_step('registration_confirmation', false);
729
-                } elseif (EE_Registry::instance()->CFG->registration->reg_confirmation_last
730
-                ) {
731
-                    // set the order to something big like 100
732
-                    $this->checkout->set_reg_step_order('registration_confirmation', 100);
733
-                }
734
-            }
735
-            // filter the array for good luck
736
-            $this->checkout->reg_steps = apply_filters(
737
-                'FHEE__Single_Page_Checkout__load_reg_steps__reg_steps',
738
-                $this->checkout->reg_steps
739
-            );
740
-            // finally re-sort based on the reg step class order properties
741
-            $this->checkout->sort_reg_steps();
742
-        } else {
743
-            foreach ($this->checkout->reg_steps as $reg_step) {
744
-                // set all current step stati to FALSE
745
-                $reg_step->set_is_current_step(false);
746
-            }
747
-        }
748
-        if (empty($this->checkout->reg_steps)) {
749
-            EE_Error::add_error(
750
-                __('No Reg Steps were loaded..', 'event_espresso'),
751
-                __FILE__,
752
-                __FUNCTION__,
753
-                __LINE__
754
-            );
755
-            return false;
756
-        }
757
-        // make reg step details available to JS
758
-        $this->checkout->set_reg_step_JSON_info();
759
-        return true;
760
-    }
761
-
762
-
763
-    /**
764
-     *     _load_and_instantiate_reg_step
765
-     *
766
-     * @access    private
767
-     * @param array $reg_step
768
-     * @param int   $order
769
-     * @return bool
770
-     */
771
-    private function _load_and_instantiate_reg_step($reg_step = array(), $order = 0)
772
-    {
773
-        // we need a file_path, class_name, and slug to add a reg step
774
-        if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) {
775
-            // if editing a specific step, but this is NOT that step... (and it's not the 'finalize_registration' step)
776
-            if ($this->checkout->reg_url_link
777
-                && $this->checkout->step !== $reg_step['slug']
778
-                && $reg_step['slug'] !== 'finalize_registration'
779
-                // normally at this point we would NOT load the reg step, but this filter can change that
780
-                && apply_filters(
781
-                    'FHEE__Single_Page_Checkout___load_and_instantiate_reg_step__bypass_reg_step',
782
-                    true,
783
-                    $reg_step,
784
-                    $this->checkout
785
-                )
786
-            ) {
787
-                return true;
788
-            }
789
-            // instantiate step class using file path and class name
790
-            $reg_step_obj = EE_Registry::instance()->load_file(
791
-                $reg_step['file_path'],
792
-                $reg_step['class_name'],
793
-                'class',
794
-                $this->checkout,
795
-                false
796
-            );
797
-            // did we gets the goods ?
798
-            if ($reg_step_obj instanceof EE_SPCO_Reg_Step) {
799
-                // set reg step order based on config
800
-                $reg_step_obj->set_order($order);
801
-                // add instantiated reg step object to the master reg steps array
802
-                $this->checkout->add_reg_step($reg_step_obj);
803
-            } else {
804
-                EE_Error::add_error(
805
-                    __('The current step could not be set.', 'event_espresso'),
806
-                    __FILE__,
807
-                    __FUNCTION__,
808
-                    __LINE__
809
-                );
810
-                return false;
811
-            }
812
-        } else {
813
-            if (WP_DEBUG) {
814
-                EE_Error::add_error(
815
-                    sprintf(
816
-                        __(
817
-                            'A registration step could not be loaded. One or more of the following data points is invalid:%4$s%5$sFile Path: %1$s%6$s%5$sClass Name: %2$s%6$s%5$sSlug: %3$s%6$s%7$s',
818
-                            'event_espresso'
819
-                        ),
820
-                        isset($reg_step['file_path']) ? $reg_step['file_path'] : '',
821
-                        isset($reg_step['class_name']) ? $reg_step['class_name'] : '',
822
-                        isset($reg_step['slug']) ? $reg_step['slug'] : '',
823
-                        '<ul>',
824
-                        '<li>',
825
-                        '</li>',
826
-                        '</ul>'
827
-                    ),
828
-                    __FILE__,
829
-                    __FUNCTION__,
830
-                    __LINE__
831
-                );
832
-            }
833
-            return false;
834
-        }
835
-        return true;
836
-    }
837
-
838
-
839
-    /**
840
-     * _verify_transaction_and_get_registrations
841
-     *
842
-     * @access private
843
-     * @return bool
844
-     * @throws InvalidDataTypeException
845
-     * @throws InvalidEntityException
846
-     * @throws EE_Error
847
-     */
848
-    private function _verify_transaction_and_get_registrations()
849
-    {
850
-        // was there already a valid transaction in the checkout from the session ?
851
-        if (! $this->checkout->transaction instanceof EE_Transaction) {
852
-            // get transaction from db or session
853
-            $this->checkout->transaction = $this->checkout->reg_url_link && ! is_admin()
854
-                ? $this->_get_transaction_and_cart_for_previous_visit()
855
-                : $this->_get_cart_for_current_session_and_setup_new_transaction();
856
-            if (! $this->checkout->transaction instanceof EE_Transaction) {
857
-                EE_Error::add_error(
858
-                    __(
859
-                        'Your Registration and Transaction information could not be retrieved from the db.',
860
-                        'event_espresso'
861
-                    ),
862
-                    __FILE__,
863
-                    __FUNCTION__,
864
-                    __LINE__
865
-                );
866
-                $this->checkout->transaction = EE_Transaction::new_instance();
867
-                // add some style and make it dance
868
-                $this->add_styles_and_scripts();
869
-                EED_Single_Page_Checkout::$_initialized = true;
870
-                return false;
871
-            }
872
-            // and the registrations for the transaction
873
-            $this->_get_registrations($this->checkout->transaction);
874
-        }
875
-        return true;
876
-    }
877
-
878
-
879
-    /**
880
-     * _get_transaction_and_cart_for_previous_visit
881
-     *
882
-     * @access private
883
-     * @return mixed EE_Transaction|NULL
884
-     */
885
-    private function _get_transaction_and_cart_for_previous_visit()
886
-    {
887
-        /** @var $TXN_model EEM_Transaction */
888
-        $TXN_model = EE_Registry::instance()->load_model('Transaction');
889
-        // because the reg_url_link is present in the request,
890
-        // this is a return visit to SPCO, so we'll get the transaction data from the db
891
-        $transaction = $TXN_model->get_transaction_from_reg_url_link($this->checkout->reg_url_link);
892
-        // verify transaction
893
-        if ($transaction instanceof EE_Transaction) {
894
-            // and get the cart that was used for that transaction
895
-            $this->checkout->cart = $this->_get_cart_for_transaction($transaction);
896
-            return $transaction;
897
-        }
898
-        EE_Error::add_error(
899
-            __('Your Registration and Transaction information could not be retrieved from the db.', 'event_espresso'),
900
-            __FILE__,
901
-            __FUNCTION__,
902
-            __LINE__
903
-        );
904
-        return null;
905
-    }
906
-
907
-
908
-    /**
909
-     * _get_cart_for_transaction
910
-     *
911
-     * @access private
912
-     * @param EE_Transaction $transaction
913
-     * @return EE_Cart
914
-     */
915
-    private function _get_cart_for_transaction($transaction)
916
-    {
917
-        return $this->checkout->get_cart_for_transaction($transaction);
918
-    }
919
-
920
-
921
-    /**
922
-     * get_cart_for_transaction
923
-     *
924
-     * @access public
925
-     * @param EE_Transaction $transaction
926
-     * @return EE_Cart
927
-     */
928
-    public function get_cart_for_transaction(EE_Transaction $transaction)
929
-    {
930
-        return $this->checkout->get_cart_for_transaction($transaction);
931
-    }
932
-
933
-
934
-    /**
935
-     * _get_transaction_and_cart_for_current_session
936
-     *    generates a new EE_Transaction object and adds it to the $_transaction property.
937
-     *
938
-     * @access private
939
-     * @return EE_Transaction
940
-     * @throws EE_Error
941
-     */
942
-    private function _get_cart_for_current_session_and_setup_new_transaction()
943
-    {
944
-        //  if there's no transaction, then this is the FIRST visit to SPCO
945
-        // so load up the cart ( passing nothing for the TXN because it doesn't exist yet )
946
-        $this->checkout->cart = $this->_get_cart_for_transaction(null);
947
-        // and then create a new transaction
948
-        $transaction = $this->_initialize_transaction();
949
-        // verify transaction
950
-        if ($transaction instanceof EE_Transaction) {
951
-            // save it so that we have an ID for other objects to use
952
-            $transaction->save();
953
-            // and save TXN data to the cart
954
-            $this->checkout->cart->get_grand_total()->save_this_and_descendants_to_txn($transaction->ID());
955
-        } else {
956
-            EE_Error::add_error(
957
-                __('A Valid Transaction could not be initialized.', 'event_espresso'),
958
-                __FILE__,
959
-                __FUNCTION__,
960
-                __LINE__
961
-            );
962
-        }
963
-        return $transaction;
964
-    }
965
-
966
-
967
-    /**
968
-     *    generates a new EE_Transaction object and adds it to the $_transaction property.
969
-     *
970
-     * @access private
971
-     * @return mixed EE_Transaction|NULL
972
-     */
973
-    private function _initialize_transaction()
974
-    {
975
-        try {
976
-            // ensure cart totals have been calculated
977
-            $this->checkout->cart->get_grand_total()->recalculate_total_including_taxes();
978
-            // grab the cart grand total
979
-            $cart_total = $this->checkout->cart->get_cart_grand_total();
980
-            // create new TXN
981
-            $transaction = EE_Transaction::new_instance(
982
-                array(
983
-                    'TXN_reg_steps' => $this->checkout->initialize_txn_reg_steps_array(),
984
-                    'TXN_total'     => $cart_total > 0 ? $cart_total : 0,
985
-                    'TXN_paid'      => 0,
986
-                    'STS_ID'        => EEM_Transaction::failed_status_code,
987
-                )
988
-            );
989
-            // save it so that we have an ID for other objects to use
990
-            $transaction->save();
991
-            // set cron job for following up on TXNs after their session has expired
992
-            EE_Cron_Tasks::schedule_expired_transaction_check(
993
-                EE_Registry::instance()->SSN->expiration() + 1,
994
-                $transaction->ID()
995
-            );
996
-            return $transaction;
997
-        } catch (Exception $e) {
998
-            EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
999
-        }
1000
-        return null;
1001
-    }
1002
-
1003
-
1004
-    /**
1005
-     * _get_registrations
1006
-     *
1007
-     * @access private
1008
-     * @param EE_Transaction $transaction
1009
-     * @return void
1010
-     * @throws InvalidDataTypeException
1011
-     * @throws InvalidEntityException
1012
-     * @throws EE_Error
1013
-     */
1014
-    private function _get_registrations(EE_Transaction $transaction)
1015
-    {
1016
-        // first step: grab the registrants  { : o
1017
-        $registrations = $transaction->registrations($this->checkout->reg_cache_where_params, false);
1018
-        $this->checkout->total_ticket_count = count($registrations);
1019
-        // verify registrations have been set
1020
-        if (empty($registrations)) {
1021
-            // if no cached registrations, then check the db
1022
-            $registrations = $transaction->registrations($this->checkout->reg_cache_where_params, false);
1023
-            // still nothing ? well as long as this isn't a revisit
1024
-            if (empty($registrations) && ! $this->checkout->revisit) {
1025
-                // generate new registrations from scratch
1026
-                $registrations = $this->_initialize_registrations($transaction);
1027
-            }
1028
-        }
1029
-        // sort by their original registration order
1030
-        usort($registrations, array('EED_Single_Page_Checkout', 'sort_registrations_by_REG_count'));
1031
-        // then loop thru the array
1032
-        foreach ($registrations as $registration) {
1033
-            // verify each registration
1034
-            if ($registration instanceof EE_Registration) {
1035
-                // we display all attendee info for the primary registrant
1036
-                if ($this->checkout->reg_url_link === $registration->reg_url_link()
1037
-                    && $registration->is_primary_registrant()
1038
-                ) {
1039
-                    $this->checkout->primary_revisit = true;
1040
-                    break;
1041
-                }
1042
-                if ($this->checkout->revisit && $this->checkout->reg_url_link !== $registration->reg_url_link()) {
1043
-                    // but hide info if it doesn't belong to you
1044
-                    $transaction->clear_cache('Registration', $registration->ID());
1045
-                    $this->checkout->total_ticket_count--;
1046
-                }
1047
-                $this->checkout->set_reg_status_updated($registration->ID(), false);
1048
-            }
1049
-        }
1050
-    }
1051
-
1052
-
1053
-    /**
1054
-     *    adds related EE_Registration objects for each ticket in the cart to the current EE_Transaction object
1055
-     *
1056
-     * @access private
1057
-     * @param EE_Transaction $transaction
1058
-     * @return    array
1059
-     * @throws InvalidDataTypeException
1060
-     * @throws InvalidEntityException
1061
-     * @throws EE_Error
1062
-     */
1063
-    private function _initialize_registrations(EE_Transaction $transaction)
1064
-    {
1065
-        $att_nmbr = 0;
1066
-        $registrations = array();
1067
-        if ($transaction instanceof EE_Transaction) {
1068
-            /** @type EE_Registration_Processor $registration_processor */
1069
-            $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
1070
-            $this->checkout->total_ticket_count = $this->checkout->cart->all_ticket_quantity_count();
1071
-            // now let's add the cart items to the $transaction
1072
-            foreach ($this->checkout->cart->get_tickets() as $line_item) {
1073
-                // do the following for each ticket of this type they selected
1074
-                for ($x = 1; $x <= $line_item->quantity(); $x++) {
1075
-                    $att_nmbr++;
1076
-                    /** @var EventEspresso\core\services\commands\registration\CreateRegistrationCommand $CreateRegistrationCommand */
1077
-                    $CreateRegistrationCommand = EE_Registry::instance()->create(
1078
-                        'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
1079
-                        array(
1080
-                            $transaction,
1081
-                            $line_item,
1082
-                            $att_nmbr,
1083
-                            $this->checkout->total_ticket_count,
1084
-                        )
1085
-                    );
1086
-                    // override capabilities for frontend registrations
1087
-                    if (! is_admin()) {
1088
-                        $CreateRegistrationCommand->setCapCheck(
1089
-                            new PublicCapabilities('', 'create_new_registration')
1090
-                        );
1091
-                    }
1092
-                    $registration = EE_Registry::instance()->BUS->execute($CreateRegistrationCommand);
1093
-                    if (! $registration instanceof EE_Registration) {
1094
-                        throw new InvalidEntityException($registration, 'EE_Registration');
1095
-                    }
1096
-                    $registrations[ $registration->ID() ] = $registration;
1097
-                }
1098
-            }
1099
-            $registration_processor->fix_reg_final_price_rounding_issue($transaction);
1100
-        }
1101
-        return $registrations;
1102
-    }
1103
-
1104
-
1105
-    /**
1106
-     * sorts registrations by REG_count
1107
-     *
1108
-     * @access public
1109
-     * @param EE_Registration $reg_A
1110
-     * @param EE_Registration $reg_B
1111
-     * @return int
1112
-     */
1113
-    public static function sort_registrations_by_REG_count(EE_Registration $reg_A, EE_Registration $reg_B)
1114
-    {
1115
-        // this shouldn't ever happen within the same TXN, but oh well
1116
-        if ($reg_A->count() === $reg_B->count()) {
1117
-            return 0;
1118
-        }
1119
-        return ($reg_A->count() > $reg_B->count()) ? 1 : -1;
1120
-    }
1121
-
1122
-
1123
-    /**
1124
-     *    _final_verifications
1125
-     * just makes sure that everything is set up correctly before proceeding
1126
-     *
1127
-     * @access    private
1128
-     * @return    bool
1129
-     * @throws EE_Error
1130
-     */
1131
-    private function _final_verifications()
1132
-    {
1133
-        // filter checkout
1134
-        $this->checkout = apply_filters(
1135
-            'FHEE__EED_Single_Page_Checkout___final_verifications__checkout',
1136
-            $this->checkout
1137
-        );
1138
-        // verify that current step is still set correctly
1139
-        if (! $this->checkout->current_step instanceof EE_SPCO_Reg_Step) {
1140
-            EE_Error::add_error(
1141
-                __(
1142
-                    'We\'re sorry but the registration process can not proceed because one or more registration steps were not setup correctly. Please refresh the page and try again or contact support.',
1143
-                    'event_espresso'
1144
-                ),
1145
-                __FILE__,
1146
-                __FUNCTION__,
1147
-                __LINE__
1148
-            );
1149
-            return false;
1150
-        }
1151
-        // if returning to SPCO, then verify that primary registrant is set
1152
-        if (! empty($this->checkout->reg_url_link)) {
1153
-            $valid_registrant = $this->checkout->transaction->primary_registration();
1154
-            if (! $valid_registrant instanceof EE_Registration) {
1155
-                EE_Error::add_error(
1156
-                    __(
1157
-                        'We\'re sorry but there appears to be an error with the "reg_url_link" or the primary registrant for this transaction. Please refresh the page and try again or contact support.',
1158
-                        'event_espresso'
1159
-                    ),
1160
-                    __FILE__,
1161
-                    __FUNCTION__,
1162
-                    __LINE__
1163
-                );
1164
-                return false;
1165
-            }
1166
-            $valid_registrant = null;
1167
-            foreach ($this->checkout->transaction->registrations($this->checkout->reg_cache_where_params) as $registration) {
1168
-                if ($registration instanceof EE_Registration
1169
-                    && $registration->reg_url_link() === $this->checkout->reg_url_link
1170
-                ) {
1171
-                    $valid_registrant = $registration;
1172
-                }
1173
-            }
1174
-            if (! $valid_registrant instanceof EE_Registration) {
1175
-                // hmmm... maybe we have the wrong session because the user is opening multiple tabs ?
1176
-                if (EED_Single_Page_Checkout::$_checkout_verified) {
1177
-                    // clear the session, mark the checkout as unverified, and try again
1178
-                    EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
1179
-                    EED_Single_Page_Checkout::$_initialized = false;
1180
-                    EED_Single_Page_Checkout::$_checkout_verified = false;
1181
-                    $this->_initialize();
1182
-                    EE_Error::reset_notices();
1183
-                    return false;
1184
-                }
1185
-                EE_Error::add_error(
1186
-                    __(
1187
-                        'We\'re sorry but there appears to be an error with the "reg_url_link" or the transaction itself. Please refresh the page and try again or contact support.',
1188
-                        'event_espresso'
1189
-                    ),
1190
-                    __FILE__,
1191
-                    __FUNCTION__,
1192
-                    __LINE__
1193
-                );
1194
-                return false;
1195
-            }
1196
-        }
1197
-        // now that things have been kinda sufficiently verified,
1198
-        // let's add the checkout to the session so that it's available to other systems
1199
-        EE_Registry::instance()->SSN->set_checkout($this->checkout);
1200
-        return true;
1201
-    }
1202
-
1203
-
1204
-    /**
1205
-     *    _initialize_reg_steps
1206
-     * first makes sure that EE_Transaction_Processor::set_reg_step_initiated() is called as required
1207
-     * then loops thru all of the active reg steps and calls the initialize_reg_step() method
1208
-     *
1209
-     * @access    private
1210
-     * @param bool $reinitializing
1211
-     * @throws EE_Error
1212
-     */
1213
-    private function _initialize_reg_steps($reinitializing = false)
1214
-    {
1215
-        $this->checkout->set_reg_step_initiated($this->checkout->current_step);
1216
-        // loop thru all steps to call their individual "initialize" methods and set i18n strings for JS
1217
-        foreach ($this->checkout->reg_steps as $reg_step) {
1218
-            if (! $reg_step->initialize_reg_step()) {
1219
-                // if not initialized then maybe this step is being removed...
1220
-                if (! $reinitializing && $reg_step->is_current_step()) {
1221
-                    // if it was the current step, then we need to start over here
1222
-                    $this->_initialize_reg_steps(true);
1223
-                    return;
1224
-                }
1225
-                continue;
1226
-            }
1227
-            // add css and JS for current step
1228
-            $reg_step->enqueue_styles_and_scripts();
1229
-            // i18n
1230
-            $reg_step->translate_js_strings();
1231
-            if ($reg_step->is_current_step()) {
1232
-                // the text that appears on the reg step form submit button
1233
-                $reg_step->set_submit_button_text();
1234
-            }
1235
-        }
1236
-        // dynamically creates hook point like: AHEE__Single_Page_Checkout___initialize_reg_step__attendee_information
1237
-        do_action(
1238
-            "AHEE__Single_Page_Checkout___initialize_reg_step__{$this->checkout->current_step->slug()}",
1239
-            $this->checkout->current_step
1240
-        );
1241
-    }
1242
-
1243
-
1244
-    /**
1245
-     * _check_form_submission
1246
-     *
1247
-     * @access private
1248
-     * @return boolean
1249
-     */
1250
-    private function _check_form_submission()
1251
-    {
1252
-        // does this request require the reg form to be generated ?
1253
-        if ($this->checkout->generate_reg_form) {
1254
-            // ever heard that song by Blue Rodeo ?
1255
-            try {
1256
-                $this->checkout->current_step->reg_form = $this->checkout->current_step->generate_reg_form();
1257
-                // if not displaying a form, then check for form submission
1258
-                if ($this->checkout->process_form_submission
1259
-                    && $this->checkout->current_step->reg_form->was_submitted()
1260
-                ) {
1261
-                    // clear out any old data in case this step is being run again
1262
-                    $this->checkout->current_step->set_valid_data(array());
1263
-                    // capture submitted form data
1264
-                    $this->checkout->current_step->reg_form->receive_form_submission(
1265
-                        apply_filters(
1266
-                            'FHEE__Single_Page_Checkout___check_form_submission__request_params',
1267
-                            EE_Registry::instance()->REQ->params(),
1268
-                            $this->checkout
1269
-                        )
1270
-                    );
1271
-                    // validate submitted form data
1272
-                    if (! $this->checkout->continue_reg || ! $this->checkout->current_step->reg_form->is_valid()) {
1273
-                        // thou shall not pass !!!
1274
-                        $this->checkout->continue_reg = false;
1275
-                        // any form validation errors?
1276
-                        if ($this->checkout->current_step->reg_form->submission_error_message() !== '') {
1277
-                            EE_Error::add_error(
1278
-                                $this->checkout->current_step->reg_form->submission_error_message(),
1279
-                                __FILE__,
1280
-                                __FUNCTION__,
1281
-                                __LINE__
1282
-                            );
1283
-                        }
1284
-                        // well not really... what will happen is
1285
-                        // we'll just get redirected back to redo the current step
1286
-                        $this->go_to_next_step();
1287
-                        return false;
1288
-                    }
1289
-                }
1290
-            } catch (EE_Error $e) {
1291
-                $e->get_error();
1292
-            }
1293
-        }
1294
-        return true;
1295
-    }
1296
-
1297
-
1298
-    /**
1299
-     * _process_action
1300
-     *
1301
-     * @access private
1302
-     * @return void
1303
-     * @throws EE_Error
1304
-     */
1305
-    private function _process_form_action()
1306
-    {
1307
-        // what cha wanna do?
1308
-        switch ($this->checkout->action) {
1309
-            // AJAX next step reg form
1310
-            case 'display_spco_reg_step':
1311
-                $this->checkout->redirect = false;
1312
-                if (EE_Registry::instance()->REQ->ajax) {
1313
-                    $this->checkout->json_response->set_reg_step_html(
1314
-                        $this->checkout->current_step->display_reg_form()
1315
-                    );
1316
-                }
1317
-                break;
1318
-            default:
1319
-                // meh... do one of those other steps first
1320
-                if (! empty($this->checkout->action)
1321
-                    && is_callable(array($this->checkout->current_step, $this->checkout->action))
1322
-                ) {
1323
-                    // dynamically creates hook point like:
1324
-                    //   AHEE__Single_Page_Checkout__before_attendee_information__process_reg_step
1325
-                    do_action(
1326
-                        "AHEE__Single_Page_Checkout__before_{$this->checkout->current_step->slug()}__{$this->checkout->action}",
1327
-                        $this->checkout->current_step
1328
-                    );
1329
-                    // call action on current step
1330
-                    if (call_user_func(array($this->checkout->current_step, $this->checkout->action))) {
1331
-                        // good registrant, you get to proceed
1332
-                        if ($this->checkout->current_step->success_message() !== ''
1333
-                            && apply_filters(
1334
-                                'FHEE__Single_Page_Checkout___process_form_action__display_success',
1335
-                                false
1336
-                            )
1337
-                        ) {
1338
-                            EE_Error::add_success(
1339
-                                $this->checkout->current_step->success_message()
1340
-                                . '<br />' . $this->checkout->next_step->_instructions()
1341
-                            );
1342
-                        }
1343
-                        // pack it up, pack it in...
1344
-                        $this->_setup_redirect();
1345
-                    }
1346
-                    // dynamically creates hook point like:
1347
-                    //  AHEE__Single_Page_Checkout__after_payment_options__process_reg_step
1348
-                    do_action(
1349
-                        "AHEE__Single_Page_Checkout__after_{$this->checkout->current_step->slug()}__{$this->checkout->action}",
1350
-                        $this->checkout->current_step
1351
-                    );
1352
-                } else {
1353
-                    EE_Error::add_error(
1354
-                        sprintf(
1355
-                            __(
1356
-                                'The requested form action "%s" does not exist for the current "%s" registration step.',
1357
-                                'event_espresso'
1358
-                            ),
1359
-                            $this->checkout->action,
1360
-                            $this->checkout->current_step->name()
1361
-                        ),
1362
-                        __FILE__,
1363
-                        __FUNCTION__,
1364
-                        __LINE__
1365
-                    );
1366
-                }
1367
-            // end default
1368
-        }
1369
-        // store our progress so far
1370
-        $this->checkout->stash_transaction_and_checkout();
1371
-        // advance to the next step! If you pass GO, collect $200
1372
-        $this->go_to_next_step();
1373
-    }
1374
-
1375
-
1376
-    /**
1377
-     *        add_styles_and_scripts
1378
-     *
1379
-     * @access        public
1380
-     * @return        void
1381
-     */
1382
-    public function add_styles_and_scripts()
1383
-    {
1384
-        // i18n
1385
-        $this->translate_js_strings();
1386
-        if ($this->checkout->admin_request) {
1387
-            add_action('admin_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10);
1388
-        } else {
1389
-            add_action('wp_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10);
1390
-        }
1391
-    }
1392
-
1393
-
1394
-    /**
1395
-     *        translate_js_strings
1396
-     *
1397
-     * @access        public
1398
-     * @return        void
1399
-     */
1400
-    public function translate_js_strings()
1401
-    {
1402
-        EE_Registry::$i18n_js_strings['revisit'] = $this->checkout->revisit;
1403
-        EE_Registry::$i18n_js_strings['e_reg_url_link'] = $this->checkout->reg_url_link;
1404
-        EE_Registry::$i18n_js_strings['server_error'] = __(
1405
-            'An unknown error occurred on the server while attempting to process your request. Please refresh the page and try again or contact support.',
1406
-            'event_espresso'
1407
-        );
1408
-        EE_Registry::$i18n_js_strings['invalid_json_response'] = __(
1409
-            'An invalid response was returned from the server while attempting to process your request. Please refresh the page and try again or contact support.',
1410
-            'event_espresso'
1411
-        );
1412
-        EE_Registry::$i18n_js_strings['validation_error'] = __(
1413
-            'There appears to be a problem with the form validation configuration! Please check the admin settings or contact support.',
1414
-            'event_espresso'
1415
-        );
1416
-        EE_Registry::$i18n_js_strings['invalid_payment_method'] = __(
1417
-            'There appears to be a problem with the payment method configuration! Please refresh the page and try again or contact support.',
1418
-            'event_espresso'
1419
-        );
1420
-        EE_Registry::$i18n_js_strings['reg_step_error'] = __(
1421
-            'This registration step could not be completed. Please refresh the page and try again.',
1422
-            'event_espresso'
1423
-        );
1424
-        EE_Registry::$i18n_js_strings['invalid_coupon'] = __(
1425
-            'We\'re sorry but that coupon code does not appear to be valid. If this is incorrect, please contact the site administrator.',
1426
-            'event_espresso'
1427
-        );
1428
-        EE_Registry::$i18n_js_strings['process_registration'] = sprintf(
1429
-            __(
1430
-                'Please wait while we process your registration.%sDo not refresh the page or navigate away while this is happening.%sThank you for your patience.',
1431
-                'event_espresso'
1432
-            ),
1433
-            '<br/>',
1434
-            '<br/>'
1435
-        );
1436
-        EE_Registry::$i18n_js_strings['language'] = get_bloginfo('language');
1437
-        EE_Registry::$i18n_js_strings['EESID'] = EE_Registry::instance()->SSN->id();
1438
-        EE_Registry::$i18n_js_strings['currency'] = EE_Registry::instance()->CFG->currency;
1439
-        EE_Registry::$i18n_js_strings['datepicker_yearRange'] = '-150:+20';
1440
-        EE_Registry::$i18n_js_strings['timer_years'] = __('years', 'event_espresso');
1441
-        EE_Registry::$i18n_js_strings['timer_months'] = __('months', 'event_espresso');
1442
-        EE_Registry::$i18n_js_strings['timer_weeks'] = __('weeks', 'event_espresso');
1443
-        EE_Registry::$i18n_js_strings['timer_days'] = __('days', 'event_espresso');
1444
-        EE_Registry::$i18n_js_strings['timer_hours'] = __('hours', 'event_espresso');
1445
-        EE_Registry::$i18n_js_strings['timer_minutes'] = __('minutes', 'event_espresso');
1446
-        EE_Registry::$i18n_js_strings['timer_seconds'] = __('seconds', 'event_espresso');
1447
-        EE_Registry::$i18n_js_strings['timer_year'] = __('year', 'event_espresso');
1448
-        EE_Registry::$i18n_js_strings['timer_month'] = __('month', 'event_espresso');
1449
-        EE_Registry::$i18n_js_strings['timer_week'] = __('week', 'event_espresso');
1450
-        EE_Registry::$i18n_js_strings['timer_day'] = __('day', 'event_espresso');
1451
-        EE_Registry::$i18n_js_strings['timer_hour'] = __('hour', 'event_espresso');
1452
-        EE_Registry::$i18n_js_strings['timer_minute'] = __('minute', 'event_espresso');
1453
-        EE_Registry::$i18n_js_strings['timer_second'] = __('second', 'event_espresso');
1454
-        EE_Registry::$i18n_js_strings['registration_expiration_notice'] = EED_Single_Page_Checkout::getRegistrationExpirationNotice(
1455
-        );
1456
-        EE_Registry::$i18n_js_strings['ajax_submit'] = apply_filters(
1457
-            'FHEE__Single_Page_Checkout__translate_js_strings__ajax_submit',
1458
-            true
1459
-        );
1460
-        EE_Registry::$i18n_js_strings['session_extension'] = absint(
1461
-            apply_filters('FHEE__EE_Session__extend_expiration__seconds_added', 10 * MINUTE_IN_SECONDS)
1462
-        );
1463
-        EE_Registry::$i18n_js_strings['session_expiration'] = gmdate(
1464
-            'M d, Y H:i:s',
1465
-            EE_Registry::instance()->SSN->expiration() + (get_option('gmt_offset') * HOUR_IN_SECONDS)
1466
-        );
1467
-    }
1468
-
1469
-
1470
-    /**
1471
-     *    enqueue_styles_and_scripts
1472
-     *
1473
-     * @access        public
1474
-     * @return        void
1475
-     * @throws EE_Error
1476
-     */
1477
-    public function enqueue_styles_and_scripts()
1478
-    {
1479
-        // load css
1480
-        wp_register_style(
1481
-            'single_page_checkout',
1482
-            SPCO_CSS_URL . 'single_page_checkout.css',
1483
-            array('espresso_default'),
1484
-            EVENT_ESPRESSO_VERSION
1485
-        );
1486
-        wp_enqueue_style('single_page_checkout');
1487
-        // load JS
1488
-        wp_register_script(
1489
-            'jquery_plugin',
1490
-            EE_THIRD_PARTY_URL . 'jquery	.plugin.min.js',
1491
-            array('jquery'),
1492
-            '1.0.1',
1493
-            true
1494
-        );
1495
-        wp_register_script(
1496
-            'jquery_countdown',
1497
-            EE_THIRD_PARTY_URL . 'jquery	.countdown.min.js',
1498
-            array('jquery_plugin'),
1499
-            '2.1.0',
1500
-            true
1501
-        );
1502
-        wp_register_script(
1503
-            'single_page_checkout',
1504
-            SPCO_JS_URL . 'single_page_checkout.js',
1505
-            array('espresso_core', 'underscore', 'ee_form_section_validation'),
1506
-            EVENT_ESPRESSO_VERSION,
1507
-            true
1508
-        );
1509
-        if ($this->checkout->registration_form instanceof EE_Form_Section_Proper) {
1510
-            $this->checkout->registration_form->enqueue_js();
1511
-        }
1512
-        if ($this->checkout->current_step->reg_form instanceof EE_Form_Section_Proper) {
1513
-            $this->checkout->current_step->reg_form->enqueue_js();
1514
-        }
1515
-        wp_enqueue_script('single_page_checkout');
1516
-        if (apply_filters('FHEE__registration_page_wrapper_template__display_time_limit', false)) {
1517
-            wp_enqueue_script('jquery_countdown');
1518
-        }
1519
-        /**
1520
-         * global action hook for enqueueing styles and scripts with
1521
-         * spco calls.
1522
-         */
1523
-        do_action('AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts', $this);
1524
-        /**
1525
-         * dynamic action hook for enqueueing styles and scripts with spco calls.
1526
-         * The hook will end up being something like:
1527
-         *      AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__attendee_information
1528
-         */
1529
-        do_action(
1530
-            'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__' . $this->checkout->current_step->slug(),
1531
-            $this
1532
-        );
1533
-    }
1534
-
1535
-
1536
-    /**
1537
-     *    display the Registration Single Page Checkout Form
1538
-     *
1539
-     * @access    private
1540
-     * @return    void
1541
-     * @throws EE_Error
1542
-     */
1543
-    private function _display_spco_reg_form()
1544
-    {
1545
-        // if registering via the admin, just display the reg form for the current step
1546
-        if ($this->checkout->admin_request) {
1547
-            EE_Registry::instance()->REQ->add_output($this->checkout->current_step->display_reg_form());
1548
-        } else {
1549
-            // add powered by EE msg
1550
-            add_action('AHEE__SPCO__reg_form_footer', array('EED_Single_Page_Checkout', 'display_registration_footer'));
1551
-            $empty_cart = count($this->checkout->transaction
1552
-                                    ->registrations($this->checkout->reg_cache_where_params)) < 1;
1553
-            EE_Registry::$i18n_js_strings['empty_cart'] = $empty_cart;
1554
-            $cookies_not_set_msg = '';
1555
-            if ($empty_cart) {
1556
-                $cookies_not_set_msg = apply_filters(
1557
-                    'FHEE__Single_Page_Checkout__display_spco_reg_form__cookies_not_set_msg',
1558
-                    sprintf(
1559
-                        __(
1560
-                            '%1$s%3$sIt appears your browser is not currently set to accept Cookies%4$s%5$sIn order to register for events, you need to enable cookies.%7$sIf you require assistance, then click the following link to learn how to %8$senable cookies%9$s%6$s%2$s',
1561
-                            'event_espresso'
1562
-                        ),
1563
-                        '<div class="ee-attention hidden" id="ee-cookies-not-set-msg">',
1564
-                        '</div>',
1565
-                        '<h6 class="important-notice">',
1566
-                        '</h6>',
1567
-                        '<p>',
1568
-                        '</p>',
1569
-                        '<br />',
1570
-                        '<a href="http://www.whatarecookies.com/enable.asp" target="_blank">',
1571
-                        '</a>'
1572
-                    )
1573
-                );
1574
-            }
1575
-            $this->checkout->registration_form = new EE_Form_Section_Proper(
1576
-                array(
1577
-                    'name'            => 'single-page-checkout',
1578
-                    'html_id'         => 'ee-single-page-checkout-dv',
1579
-                    'layout_strategy' =>
1580
-                        new EE_Template_Layout(
1581
-                            array(
1582
-                                'layout_template_file' => SPCO_TEMPLATES_PATH . 'registration_page_wrapper.template.php',
1583
-                                'template_args'        => array(
1584
-                                    'empty_cart'              => $empty_cart,
1585
-                                    'revisit'                 => $this->checkout->revisit,
1586
-                                    'reg_steps'               => $this->checkout->reg_steps,
1587
-                                    'next_step'               => $this->checkout->next_step instanceof EE_SPCO_Reg_Step
1588
-                                        ? $this->checkout->next_step->slug()
1589
-                                        : '',
1590
-                                    'empty_msg'               => apply_filters(
1591
-                                        'FHEE__Single_Page_Checkout__display_spco_reg_form__empty_msg',
1592
-                                        sprintf(
1593
-                                            __(
1594
-                                                'You need to %1$sReturn to Events list%2$sselect at least one event%3$s before you can proceed with the registration process.',
1595
-                                                'event_espresso'
1596
-                                            ),
1597
-                                            '<a href="'
1598
-                                            . get_post_type_archive_link('espresso_events')
1599
-                                            . '" title="',
1600
-                                            '">',
1601
-                                            '</a>'
1602
-                                        )
1603
-                                    ),
1604
-                                    'cookies_not_set_msg'     => $cookies_not_set_msg,
1605
-                                    'registration_time_limit' => $this->checkout->get_registration_time_limit(),
1606
-                                    'session_expiration'      => gmdate(
1607
-                                        'M d, Y H:i:s',
1608
-                                        EE_Registry::instance()->SSN->expiration()
1609
-                                        + (get_option('gmt_offset') * HOUR_IN_SECONDS)
1610
-                                    ),
1611
-                                ),
1612
-                            )
1613
-                        ),
1614
-                )
1615
-            );
1616
-            // load template and add to output sent that gets filtered into the_content()
1617
-            EE_Registry::instance()->REQ->add_output($this->checkout->registration_form->get_html());
1618
-        }
1619
-    }
1620
-
1621
-
1622
-    /**
1623
-     *    add_extra_finalize_registration_inputs
1624
-     *
1625
-     * @access    public
1626
-     * @param $next_step
1627
-     * @internal  param string $label
1628
-     * @return void
1629
-     */
1630
-    public function add_extra_finalize_registration_inputs($next_step)
1631
-    {
1632
-        if ($next_step === 'finalize_registration') {
1633
-            echo '<div id="spco-extra-finalize_registration-inputs-dv"></div>';
1634
-        }
1635
-    }
1636
-
1637
-
1638
-    /**
1639
-     *    display_registration_footer
1640
-     *
1641
-     * @access    public
1642
-     * @return    string
1643
-     */
1644
-    public static function display_registration_footer()
1645
-    {
1646
-        if (apply_filters(
1647
-            'FHEE__EE_Front__Controller__show_reg_footer',
1648
-            EE_Registry::instance()->CFG->admin->show_reg_footer
1649
-        )) {
1650
-            add_filter(
1651
-                'FHEE__EEH_Template__powered_by_event_espresso__url',
1652
-                function ($url) {
1653
-                    return apply_filters('FHEE__EE_Front_Controller__registration_footer__url', $url);
1654
-                }
1655
-            );
1656
-            echo apply_filters(
1657
-                'FHEE__EE_Front_Controller__display_registration_footer',
1658
-                \EEH_Template::powered_by_event_espresso(
1659
-                    '',
1660
-                    'espresso-registration-footer-dv',
1661
-                    array('utm_content' => 'registration_checkout')
1662
-                )
1663
-            );
1664
-        }
1665
-        return '';
1666
-    }
1667
-
1668
-
1669
-    /**
1670
-     *    unlock_transaction
1671
-     *
1672
-     * @access    public
1673
-     * @return    void
1674
-     * @throws EE_Error
1675
-     */
1676
-    public function unlock_transaction()
1677
-    {
1678
-        if ($this->checkout->transaction instanceof EE_Transaction) {
1679
-            $this->checkout->transaction->unlock();
1680
-        }
1681
-    }
1682
-
1683
-
1684
-    /**
1685
-     *        _setup_redirect
1686
-     *
1687
-     * @access    private
1688
-     * @return void
1689
-     */
1690
-    private function _setup_redirect()
1691
-    {
1692
-        if ($this->checkout->continue_reg && $this->checkout->next_step instanceof EE_SPCO_Reg_Step) {
1693
-            $this->checkout->redirect = true;
1694
-            if (empty($this->checkout->redirect_url)) {
1695
-                $this->checkout->redirect_url = $this->checkout->next_step->reg_step_url();
1696
-            }
1697
-            $this->checkout->redirect_url = apply_filters(
1698
-                'FHEE__EED_Single_Page_Checkout___setup_redirect__checkout_redirect_url',
1699
-                $this->checkout->redirect_url,
1700
-                $this->checkout
1701
-            );
1702
-        }
1703
-    }
1704
-
1705
-
1706
-    /**
1707
-     *   handle ajax message responses and redirects
1708
-     *
1709
-     * @access public
1710
-     * @return void
1711
-     * @throws EE_Error
1712
-     */
1713
-    public function go_to_next_step()
1714
-    {
1715
-        if (EE_Registry::instance()->REQ->ajax) {
1716
-            // capture contents of output buffer we started earlier in the request, and insert into JSON response
1717
-            $this->checkout->json_response->set_unexpected_errors(ob_get_clean());
1718
-        }
1719
-        $this->unlock_transaction();
1720
-        // just return for these conditions
1721
-        if ($this->checkout->admin_request
1722
-            || $this->checkout->action === 'redirect_form'
1723
-            || $this->checkout->action === 'update_checkout'
1724
-        ) {
1725
-            return;
1726
-        }
1727
-        // AJAX response
1728
-        $this->_handle_json_response();
1729
-        // redirect to next step or the Thank You page
1730
-        $this->_handle_html_redirects();
1731
-        // hmmm... must be something wrong, so let's just display the form again !
1732
-        $this->_display_spco_reg_form();
1733
-    }
1734
-
1735
-
1736
-    /**
1737
-     *   _handle_json_response
1738
-     *
1739
-     * @access protected
1740
-     * @return void
1741
-     */
1742
-    protected function _handle_json_response()
1743
-    {
1744
-        // if this is an ajax request
1745
-        if (EE_Registry::instance()->REQ->ajax) {
1746
-            $this->checkout->json_response->set_registration_time_limit(
1747
-                $this->checkout->get_registration_time_limit()
1748
-            );
1749
-            $this->checkout->json_response->set_payment_amount($this->checkout->amount_owing);
1750
-            // just send the ajax (
1751
-            $json_response = apply_filters(
1752
-                'FHEE__EE_Single_Page_Checkout__JSON_response',
1753
-                $this->checkout->json_response
1754
-            );
1755
-            echo $json_response;
1756
-            exit();
1757
-        }
1758
-    }
1759
-
1760
-
1761
-    /**
1762
-     *   _handle_redirects
1763
-     *
1764
-     * @access protected
1765
-     * @return void
1766
-     */
1767
-    protected function _handle_html_redirects()
1768
-    {
1769
-        // going somewhere ?
1770
-        if ($this->checkout->redirect && ! empty($this->checkout->redirect_url)) {
1771
-            // store notices in a transient
1772
-            EE_Error::get_notices(false, true, true);
1773
-            wp_safe_redirect($this->checkout->redirect_url);
1774
-            exit();
1775
-        }
1776
-    }
1777
-
1778
-
1779
-    /**
1780
-     *   set_checkout_anchor
1781
-     *
1782
-     * @access public
1783
-     * @return void
1784
-     */
1785
-    public function set_checkout_anchor()
1786
-    {
1787
-        echo '<a id="checkout" style="float: left; margin-left: -999em;"></a>';
1788
-    }
1789
-
1790
-    /**
1791
-     *    getRegistrationExpirationNotice
1792
-     *
1793
-     * @since     4.9.59.p
1794
-     * @access    public
1795
-     * @return    string
1796
-     */
1797
-    public static function getRegistrationExpirationNotice()
1798
-    {
1799
-        return sprintf(
1800
-            __(
1801
-                '%1$sWe\'re sorry, but your registration time has expired.%2$s%3$s%4$sIf you still wish to complete your registration, please return to the %5$sEvent List%6$sEvent List%7$s and reselect your tickets if available. Please accept our apologies for any inconvenience this may have caused.%8$s',
1802
-                'event_espresso'
1803
-            ),
1804
-            '<h4 class="important-notice">',
1805
-            '</h4>',
1806
-            '<br />',
1807
-            '<p>',
1808
-            '<a href="' . get_post_type_archive_link('espresso_events') . '" title="',
1809
-            '">',
1810
-            '</a>',
1811
-            '</p>'
1812
-        );
1813
-    }
18
+	/**
19
+	 * $_initialized - has the SPCO controller already been initialized ?
20
+	 *
21
+	 * @access private
22
+	 * @var bool $_initialized
23
+	 */
24
+	private static $_initialized = false;
25
+
26
+
27
+	/**
28
+	 * $_checkout_verified - is the EE_Checkout verified as correct for this request ?
29
+	 *
30
+	 * @access private
31
+	 * @var bool $_valid_checkout
32
+	 */
33
+	private static $_checkout_verified = true;
34
+
35
+	/**
36
+	 *    $_reg_steps_array - holds initial array of reg steps
37
+	 *
38
+	 * @access private
39
+	 * @var array $_reg_steps_array
40
+	 */
41
+	private static $_reg_steps_array = array();
42
+
43
+	/**
44
+	 *    $checkout - EE_Checkout object for handling the properties of the current checkout process
45
+	 *
46
+	 * @access public
47
+	 * @var EE_Checkout $checkout
48
+	 */
49
+	public $checkout;
50
+
51
+
52
+	/**
53
+	 * @return EED_Module|EED_Single_Page_Checkout
54
+	 */
55
+	public static function instance()
56
+	{
57
+		add_filter('EED_Single_Page_Checkout__SPCO_active', '__return_true');
58
+		return parent::get_instance(__CLASS__);
59
+	}
60
+
61
+
62
+	/**
63
+	 * @return EE_CART
64
+	 */
65
+	public function cart()
66
+	{
67
+		return $this->checkout->cart;
68
+	}
69
+
70
+
71
+	/**
72
+	 * @return EE_Transaction
73
+	 */
74
+	public function transaction()
75
+	{
76
+		return $this->checkout->transaction;
77
+	}
78
+
79
+
80
+	/**
81
+	 *    set_hooks - for hooking into EE Core, other modules, etc
82
+	 *
83
+	 * @access    public
84
+	 * @return    void
85
+	 * @throws EE_Error
86
+	 */
87
+	public static function set_hooks()
88
+	{
89
+		EED_Single_Page_Checkout::set_definitions();
90
+	}
91
+
92
+
93
+	/**
94
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
95
+	 *
96
+	 * @access    public
97
+	 * @return    void
98
+	 * @throws EE_Error
99
+	 */
100
+	public static function set_hooks_admin()
101
+	{
102
+		EED_Single_Page_Checkout::set_definitions();
103
+		if (! (defined('DOING_AJAX') && DOING_AJAX)) {
104
+			return;
105
+		}
106
+		// going to start an output buffer in case anything gets accidentally output
107
+		// that might disrupt our JSON response
108
+		ob_start();
109
+		EED_Single_Page_Checkout::load_request_handler();
110
+		EED_Single_Page_Checkout::load_reg_steps();
111
+		// set ajax hooks
112
+		add_action('wp_ajax_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step'));
113
+		add_action('wp_ajax_nopriv_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step'));
114
+		add_action('wp_ajax_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step'));
115
+		add_action('wp_ajax_nopriv_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step'));
116
+		add_action('wp_ajax_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step'));
117
+		add_action('wp_ajax_nopriv_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step'));
118
+	}
119
+
120
+
121
+	/**
122
+	 *    process ajax request
123
+	 *
124
+	 * @param string $ajax_action
125
+	 * @throws EE_Error
126
+	 */
127
+	public static function process_ajax_request($ajax_action)
128
+	{
129
+		EE_Registry::instance()->REQ->set('action', $ajax_action);
130
+		EED_Single_Page_Checkout::instance()->_initialize();
131
+	}
132
+
133
+
134
+	/**
135
+	 *    ajax display registration step
136
+	 *
137
+	 * @throws EE_Error
138
+	 */
139
+	public static function display_reg_step()
140
+	{
141
+		EED_Single_Page_Checkout::process_ajax_request('display_spco_reg_step');
142
+	}
143
+
144
+
145
+	/**
146
+	 *    ajax process registration step
147
+	 *
148
+	 * @throws EE_Error
149
+	 */
150
+	public static function process_reg_step()
151
+	{
152
+		EED_Single_Page_Checkout::process_ajax_request('process_reg_step');
153
+	}
154
+
155
+
156
+	/**
157
+	 *    ajax process registration step
158
+	 *
159
+	 * @throws EE_Error
160
+	 */
161
+	public static function update_reg_step()
162
+	{
163
+		EED_Single_Page_Checkout::process_ajax_request('update_reg_step');
164
+	}
165
+
166
+
167
+	/**
168
+	 *   update_checkout
169
+	 *
170
+	 * @access public
171
+	 * @return void
172
+	 * @throws EE_Error
173
+	 */
174
+	public static function update_checkout()
175
+	{
176
+		EED_Single_Page_Checkout::process_ajax_request('update_checkout');
177
+	}
178
+
179
+
180
+	/**
181
+	 *    load_request_handler
182
+	 *
183
+	 * @access    public
184
+	 * @return    void
185
+	 */
186
+	public static function load_request_handler()
187
+	{
188
+		// load core Request_Handler class
189
+		if (EE_Registry::instance()->REQ !== null) {
190
+			EE_Registry::instance()->load_core('Request_Handler');
191
+		}
192
+	}
193
+
194
+
195
+	/**
196
+	 *    set_definitions
197
+	 *
198
+	 * @access    public
199
+	 * @return    void
200
+	 * @throws EE_Error
201
+	 */
202
+	public static function set_definitions()
203
+	{
204
+		if (defined('SPCO_BASE_PATH')) {
205
+			return;
206
+		}
207
+		define(
208
+			'SPCO_BASE_PATH',
209
+			rtrim(str_replace(array('\\', '/'), DS, plugin_dir_path(__FILE__)), DS) . DS
210
+		);
211
+		define('SPCO_CSS_URL', plugin_dir_url(__FILE__) . 'css' . DS);
212
+		define('SPCO_IMG_URL', plugin_dir_url(__FILE__) . 'img' . DS);
213
+		define('SPCO_JS_URL', plugin_dir_url(__FILE__) . 'js' . DS);
214
+		define('SPCO_INC_PATH', SPCO_BASE_PATH . 'inc' . DS);
215
+		define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH . 'reg_steps' . DS);
216
+		define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH . 'templates' . DS);
217
+		EEH_Autoloader::register_autoloaders_for_each_file_in_folder(SPCO_BASE_PATH, true);
218
+		EE_Registry::$i18n_js_strings['registration_expiration_notice'] = EED_Single_Page_Checkout::getRegistrationExpirationNotice(
219
+		);
220
+	}
221
+
222
+
223
+	/**
224
+	 * load_reg_steps
225
+	 * loads and instantiates each reg step based on the EE_Registry::instance()->CFG->registration->reg_steps array
226
+	 *
227
+	 * @access    private
228
+	 * @throws EE_Error
229
+	 */
230
+	public static function load_reg_steps()
231
+	{
232
+		static $reg_steps_loaded = false;
233
+		if ($reg_steps_loaded) {
234
+			return;
235
+		}
236
+		// filter list of reg_steps
237
+		$reg_steps_to_load = (array) apply_filters(
238
+			'AHEE__SPCO__load_reg_steps__reg_steps_to_load',
239
+			EED_Single_Page_Checkout::get_reg_steps()
240
+		);
241
+		// sort by key (order)
242
+		ksort($reg_steps_to_load);
243
+		// loop through folders
244
+		foreach ($reg_steps_to_load as $order => $reg_step) {
245
+			// we need a
246
+			if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) {
247
+				// copy over to the reg_steps_array
248
+				EED_Single_Page_Checkout::$_reg_steps_array[ $order ] = $reg_step;
249
+				// register custom key route for each reg step
250
+				// ie: step=>"slug" - this is the entire reason we load the reg steps array now
251
+				EE_Config::register_route(
252
+					$reg_step['slug'],
253
+					'EED_Single_Page_Checkout',
254
+					'run',
255
+					'step'
256
+				);
257
+				// add AJAX or other hooks
258
+				if (isset($reg_step['has_hooks']) && $reg_step['has_hooks']) {
259
+					// setup autoloaders if necessary
260
+					if (! class_exists($reg_step['class_name'])) {
261
+						EEH_Autoloader::register_autoloaders_for_each_file_in_folder(
262
+							$reg_step['file_path'],
263
+							true
264
+						);
265
+					}
266
+					if (is_callable($reg_step['class_name'], 'set_hooks')) {
267
+						call_user_func(array($reg_step['class_name'], 'set_hooks'));
268
+					}
269
+				}
270
+			}
271
+		}
272
+		$reg_steps_loaded = true;
273
+	}
274
+
275
+
276
+	/**
277
+	 *    get_reg_steps
278
+	 *
279
+	 * @access    public
280
+	 * @return    array
281
+	 */
282
+	public static function get_reg_steps()
283
+	{
284
+		$reg_steps = EE_Registry::instance()->CFG->registration->reg_steps;
285
+		if (empty($reg_steps)) {
286
+			$reg_steps = array(
287
+				10  => array(
288
+					'file_path'  => SPCO_REG_STEPS_PATH . 'attendee_information',
289
+					'class_name' => 'EE_SPCO_Reg_Step_Attendee_Information',
290
+					'slug'       => 'attendee_information',
291
+					'has_hooks'  => false,
292
+				),
293
+				30  => array(
294
+					'file_path'  => SPCO_REG_STEPS_PATH . 'payment_options',
295
+					'class_name' => 'EE_SPCO_Reg_Step_Payment_Options',
296
+					'slug'       => 'payment_options',
297
+					'has_hooks'  => true,
298
+				),
299
+				999 => array(
300
+					'file_path'  => SPCO_REG_STEPS_PATH . 'finalize_registration',
301
+					'class_name' => 'EE_SPCO_Reg_Step_Finalize_Registration',
302
+					'slug'       => 'finalize_registration',
303
+					'has_hooks'  => false,
304
+				),
305
+			);
306
+		}
307
+		return $reg_steps;
308
+	}
309
+
310
+
311
+	/**
312
+	 *    registration_checkout_for_admin
313
+	 *
314
+	 * @access    public
315
+	 * @return    string
316
+	 * @throws EE_Error
317
+	 */
318
+	public static function registration_checkout_for_admin()
319
+	{
320
+		EED_Single_Page_Checkout::load_request_handler();
321
+		EE_Registry::instance()->REQ->set('step', 'attendee_information');
322
+		EE_Registry::instance()->REQ->set('action', 'display_spco_reg_step');
323
+		EE_Registry::instance()->REQ->set('process_form_submission', false);
324
+		EED_Single_Page_Checkout::instance()->_initialize();
325
+		EED_Single_Page_Checkout::instance()->_display_spco_reg_form();
326
+		return EE_Registry::instance()->REQ->get_output();
327
+	}
328
+
329
+
330
+	/**
331
+	 * process_registration_from_admin
332
+	 *
333
+	 * @access public
334
+	 * @return \EE_Transaction
335
+	 * @throws EE_Error
336
+	 */
337
+	public static function process_registration_from_admin()
338
+	{
339
+		EED_Single_Page_Checkout::load_request_handler();
340
+		EE_Registry::instance()->REQ->set('step', 'attendee_information');
341
+		EE_Registry::instance()->REQ->set('action', 'process_reg_step');
342
+		EE_Registry::instance()->REQ->set('process_form_submission', true);
343
+		EED_Single_Page_Checkout::instance()->_initialize();
344
+		if (EED_Single_Page_Checkout::instance()->checkout->current_step->completed()) {
345
+			$final_reg_step = end(EED_Single_Page_Checkout::instance()->checkout->reg_steps);
346
+			if ($final_reg_step instanceof EE_SPCO_Reg_Step_Finalize_Registration) {
347
+				EED_Single_Page_Checkout::instance()->checkout->set_reg_step_initiated($final_reg_step);
348
+				if ($final_reg_step->process_reg_step()) {
349
+					$final_reg_step->set_completed();
350
+					EED_Single_Page_Checkout::instance()->checkout->update_txn_reg_steps_array();
351
+					return EED_Single_Page_Checkout::instance()->checkout->transaction;
352
+				}
353
+			}
354
+		}
355
+		return null;
356
+	}
357
+
358
+
359
+	/**
360
+	 *    run
361
+	 *
362
+	 * @access    public
363
+	 * @param WP_Query $WP_Query
364
+	 * @return    void
365
+	 * @throws EE_Error
366
+	 */
367
+	public function run($WP_Query)
368
+	{
369
+		if ($WP_Query instanceof WP_Query
370
+			&& $WP_Query->is_main_query()
371
+			&& apply_filters('FHEE__EED_Single_Page_Checkout__run', true)
372
+			&& $this->_is_reg_checkout()
373
+		) {
374
+			$this->_initialize();
375
+		}
376
+	}
377
+
378
+
379
+	/**
380
+	 * determines whether current url matches reg page url
381
+	 *
382
+	 * @return bool
383
+	 */
384
+	protected function _is_reg_checkout()
385
+	{
386
+		// get current permalink for reg page without any extra query args
387
+		$reg_page_url = \get_permalink(EE_Config::instance()->core->reg_page_id);
388
+		// get request URI for current request, but without the scheme or host
389
+		$current_request_uri = \EEH_URL::filter_input_server_url('REQUEST_URI');
390
+		$current_request_uri = html_entity_decode($current_request_uri);
391
+		// get array of query args from the current request URI
392
+		$query_args = \EEH_URL::get_query_string($current_request_uri);
393
+		// grab page id if it is set
394
+		$page_id = isset($query_args['page_id']) ? absint($query_args['page_id']) : 0;
395
+		// and remove the page id from the query args (we will re-add it later)
396
+		unset($query_args['page_id']);
397
+		// now strip all query args from current request URI
398
+		$current_request_uri = remove_query_arg(array_keys($query_args), $current_request_uri);
399
+		// and re-add the page id if it was set
400
+		if ($page_id) {
401
+			$current_request_uri = add_query_arg('page_id', $page_id, $current_request_uri);
402
+		}
403
+		// remove slashes and ?
404
+		$current_request_uri = trim($current_request_uri, '?/');
405
+		// is current request URI part of the known full reg page URL ?
406
+		return ! empty($current_request_uri) && strpos($reg_page_url, $current_request_uri) !== false;
407
+	}
408
+
409
+
410
+	/**
411
+	 * @param WP_Query $wp_query
412
+	 * @return    void
413
+	 * @throws EE_Error
414
+	 */
415
+	public static function init($wp_query)
416
+	{
417
+		EED_Single_Page_Checkout::instance()->run($wp_query);
418
+	}
419
+
420
+
421
+	/**
422
+	 *    _initialize - initial module setup
423
+	 *
424
+	 * @access    private
425
+	 * @throws EE_Error
426
+	 * @return    void
427
+	 */
428
+	private function _initialize()
429
+	{
430
+		// ensure SPCO doesn't run twice
431
+		if (EED_Single_Page_Checkout::$_initialized) {
432
+			return;
433
+		}
434
+		try {
435
+			EED_Single_Page_Checkout::load_reg_steps();
436
+			$this->_verify_session();
437
+			// setup the EE_Checkout object
438
+			$this->checkout = $this->_initialize_checkout();
439
+			// filter checkout
440
+			$this->checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize__checkout', $this->checkout);
441
+			// get the $_GET
442
+			$this->_get_request_vars();
443
+			if ($this->_block_bots()) {
444
+				return;
445
+			}
446
+			// filter continue_reg
447
+			$this->checkout->continue_reg = apply_filters(
448
+				'FHEE__EED_Single_Page_Checkout__init___continue_reg',
449
+				true,
450
+				$this->checkout
451
+			);
452
+			// load the reg steps array
453
+			if (! $this->_load_and_instantiate_reg_steps()) {
454
+				EED_Single_Page_Checkout::$_initialized = true;
455
+				return;
456
+			}
457
+			// set the current step
458
+			$this->checkout->set_current_step($this->checkout->step);
459
+			// and the next step
460
+			$this->checkout->set_next_step();
461
+			// verify that everything has been setup correctly
462
+			if (! ($this->_verify_transaction_and_get_registrations() && $this->_final_verifications())) {
463
+				EED_Single_Page_Checkout::$_initialized = true;
464
+				return;
465
+			}
466
+			// lock the transaction
467
+			$this->checkout->transaction->lock();
468
+			// make sure all of our cached objects are added to their respective model entity mappers
469
+			$this->checkout->refresh_all_entities();
470
+			// set amount owing
471
+			$this->checkout->amount_owing = $this->checkout->transaction->remaining();
472
+			// initialize each reg step, which gives them the chance to potentially alter the process
473
+			$this->_initialize_reg_steps();
474
+			// DEBUG LOG
475
+			// $this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ );
476
+			// get reg form
477
+			if (! $this->_check_form_submission()) {
478
+				EED_Single_Page_Checkout::$_initialized = true;
479
+				return;
480
+			}
481
+			// checkout the action!!!
482
+			$this->_process_form_action();
483
+			// add some style and make it dance
484
+			$this->add_styles_and_scripts();
485
+			// kk... SPCO has successfully run
486
+			EED_Single_Page_Checkout::$_initialized = true;
487
+			// set no cache headers and constants
488
+			EE_System::do_not_cache();
489
+			// add anchor
490
+			add_action('loop_start', array($this, 'set_checkout_anchor'), 1);
491
+			// remove transaction lock
492
+			add_action('shutdown', array($this, 'unlock_transaction'), 1);
493
+		} catch (Exception $e) {
494
+			EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
495
+		}
496
+	}
497
+
498
+
499
+	/**
500
+	 *    _verify_session
501
+	 * checks that the session is valid and not expired
502
+	 *
503
+	 * @access    private
504
+	 * @throws EE_Error
505
+	 */
506
+	private function _verify_session()
507
+	{
508
+		if (! EE_Registry::instance()->SSN instanceof EE_Session) {
509
+			throw new EE_Error(__('The EE_Session class could not be loaded.', 'event_espresso'));
510
+		}
511
+		$clear_session_requested = filter_var(
512
+			EE_Registry::instance()->REQ->get('clear_session', false),
513
+			FILTER_VALIDATE_BOOLEAN
514
+		);
515
+		// is session still valid ?
516
+		if ($clear_session_requested
517
+			|| (EE_Registry::instance()->SSN->expired()
518
+				&& EE_Registry::instance()->REQ->get('e_reg_url_link', '') === ''
519
+			)
520
+		) {
521
+			$this->checkout = new EE_Checkout();
522
+			EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
523
+			// EE_Registry::instance()->SSN->reset_cart();
524
+			// EE_Registry::instance()->SSN->reset_checkout();
525
+			// EE_Registry::instance()->SSN->reset_transaction();
526
+			if (! $clear_session_requested) {
527
+				EE_Error::add_attention(
528
+					EE_Registry::$i18n_js_strings['registration_expiration_notice'],
529
+					__FILE__,
530
+					__FUNCTION__,
531
+					__LINE__
532
+				);
533
+			}
534
+			// EE_Registry::instance()->SSN->reset_expired();
535
+		}
536
+	}
537
+
538
+
539
+	/**
540
+	 *    _initialize_checkout
541
+	 * loads and instantiates EE_Checkout
542
+	 *
543
+	 * @access    private
544
+	 * @throws EE_Error
545
+	 * @return EE_Checkout
546
+	 */
547
+	private function _initialize_checkout()
548
+	{
549
+		// look in session for existing checkout
550
+		/** @type EE_Checkout $checkout */
551
+		$checkout = EE_Registry::instance()->SSN->checkout();
552
+		// verify
553
+		if (! $checkout instanceof EE_Checkout) {
554
+			// instantiate EE_Checkout object for handling the properties of the current checkout process
555
+			$checkout = EE_Registry::instance()->load_file(
556
+				SPCO_INC_PATH,
557
+				'EE_Checkout',
558
+				'class',
559
+				array(),
560
+				false
561
+			);
562
+		} else {
563
+			if ($checkout->current_step->is_final_step() && $checkout->exit_spco() === true) {
564
+				$this->unlock_transaction();
565
+				wp_safe_redirect($checkout->redirect_url);
566
+				exit();
567
+			}
568
+		}
569
+		$checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize_checkout__checkout', $checkout);
570
+		// verify again
571
+		if (! $checkout instanceof EE_Checkout) {
572
+			throw new EE_Error(__('The EE_Checkout class could not be loaded.', 'event_espresso'));
573
+		}
574
+		// reset anything that needs a clean slate for each request
575
+		$checkout->reset_for_current_request();
576
+		return $checkout;
577
+	}
578
+
579
+
580
+	/**
581
+	 *    _get_request_vars
582
+	 *
583
+	 * @access    private
584
+	 * @return    void
585
+	 * @throws EE_Error
586
+	 */
587
+	private function _get_request_vars()
588
+	{
589
+		// load classes
590
+		EED_Single_Page_Checkout::load_request_handler();
591
+		// make sure this request is marked as belonging to EE
592
+		EE_Registry::instance()->REQ->set_espresso_page(true);
593
+		// which step is being requested ?
594
+		$this->checkout->step = EE_Registry::instance()->REQ->get('step', $this->_get_first_step());
595
+		// which step is being edited ?
596
+		$this->checkout->edit_step = EE_Registry::instance()->REQ->get('edit_step', '');
597
+		// and what we're doing on the current step
598
+		$this->checkout->action = EE_Registry::instance()->REQ->get('action', 'display_spco_reg_step');
599
+		// timestamp
600
+		$this->checkout->uts = EE_Registry::instance()->REQ->get('uts', 0);
601
+		// returning to edit ?
602
+		$this->checkout->reg_url_link = EE_Registry::instance()->REQ->get('e_reg_url_link', '');
603
+		// add reg url link to registration query params
604
+		if ($this->checkout->reg_url_link && strpos($this->checkout->reg_url_link, '1-') !== 0) {
605
+			$this->checkout->reg_cache_where_params[0]['REG_url_link'] = $this->checkout->reg_url_link;
606
+		}
607
+		// or some other kind of revisit ?
608
+		$this->checkout->revisit = filter_var(
609
+			EE_Registry::instance()->REQ->get('revisit', false),
610
+			FILTER_VALIDATE_BOOLEAN
611
+		);
612
+		// and whether or not to generate a reg form for this request
613
+		$this->checkout->generate_reg_form = filter_var(
614
+			EE_Registry::instance()->REQ->get('generate_reg_form', true),
615
+			FILTER_VALIDATE_BOOLEAN
616
+		);
617
+		// and whether or not to process a reg form submission for this request
618
+		$this->checkout->process_form_submission = filter_var(
619
+			EE_Registry::instance()->REQ->get(
620
+				'process_form_submission',
621
+				$this->checkout->action === 'process_reg_step'
622
+			),
623
+			FILTER_VALIDATE_BOOLEAN
624
+		);
625
+		$this->checkout->process_form_submission = filter_var(
626
+			$this->checkout->action !== 'display_spco_reg_step'
627
+				? $this->checkout->process_form_submission
628
+				: false,
629
+			FILTER_VALIDATE_BOOLEAN
630
+		);
631
+		// $this->_display_request_vars();
632
+	}
633
+
634
+
635
+	/**
636
+	 *  _display_request_vars
637
+	 *
638
+	 * @access    protected
639
+	 * @return    void
640
+	 */
641
+	protected function _display_request_vars()
642
+	{
643
+		if (! WP_DEBUG) {
644
+			return;
645
+		}
646
+		EEH_Debug_Tools::printr($_REQUEST, '$_REQUEST', __FILE__, __LINE__);
647
+		EEH_Debug_Tools::printr($this->checkout->step, '$this->checkout->step', __FILE__, __LINE__);
648
+		EEH_Debug_Tools::printr($this->checkout->edit_step, '$this->checkout->edit_step', __FILE__, __LINE__);
649
+		EEH_Debug_Tools::printr($this->checkout->action, '$this->checkout->action', __FILE__, __LINE__);
650
+		EEH_Debug_Tools::printr($this->checkout->reg_url_link, '$this->checkout->reg_url_link', __FILE__, __LINE__);
651
+		EEH_Debug_Tools::printr($this->checkout->revisit, '$this->checkout->revisit', __FILE__, __LINE__);
652
+		EEH_Debug_Tools::printr(
653
+			$this->checkout->generate_reg_form,
654
+			'$this->checkout->generate_reg_form',
655
+			__FILE__,
656
+			__LINE__
657
+		);
658
+		EEH_Debug_Tools::printr(
659
+			$this->checkout->process_form_submission,
660
+			'$this->checkout->process_form_submission',
661
+			__FILE__,
662
+			__LINE__
663
+		);
664
+	}
665
+
666
+
667
+	/**
668
+	 * _block_bots
669
+	 * checks that the incoming request has either of the following set:
670
+	 *  a uts (unix timestamp) which indicates that the request was redirected from the Ticket Selector
671
+	 *  a REG URL Link, which indicates that the request is a return visit to SPCO for a valid TXN
672
+	 * so if you're not coming from the Ticket Selector nor returning for a valid IP...
673
+	 * then where you coming from man?
674
+	 *
675
+	 * @return boolean
676
+	 */
677
+	private function _block_bots()
678
+	{
679
+		$invalid_checkout_access = EED_Invalid_Checkout_Access::getInvalidCheckoutAccess();
680
+		if ($invalid_checkout_access->checkoutAccessIsInvalid($this->checkout)) {
681
+			return true;
682
+		}
683
+		return false;
684
+	}
685
+
686
+
687
+	/**
688
+	 *    _get_first_step
689
+	 *  gets slug for first step in $_reg_steps_array
690
+	 *
691
+	 * @access    private
692
+	 * @throws EE_Error
693
+	 * @return    string
694
+	 */
695
+	private function _get_first_step()
696
+	{
697
+		$first_step = reset(EED_Single_Page_Checkout::$_reg_steps_array);
698
+		return isset($first_step['slug']) ? $first_step['slug'] : 'attendee_information';
699
+	}
700
+
701
+
702
+	/**
703
+	 * instantiates each reg step based on the loaded reg_steps array
704
+	 *
705
+	 * @return    bool
706
+	 * @throws EE_Error
707
+	 * @throws InvalidArgumentException
708
+	 * @throws InvalidDataTypeException
709
+	 * @throws InvalidInterfaceException
710
+	 */
711
+	private function _load_and_instantiate_reg_steps()
712
+	{
713
+		do_action('AHEE__Single_Page_Checkout___load_and_instantiate_reg_steps__start', $this->checkout);
714
+		// have reg_steps already been instantiated ?
715
+		if (empty($this->checkout->reg_steps)
716
+			|| apply_filters('FHEE__Single_Page_Checkout__load_reg_steps__reload_reg_steps', false, $this->checkout)
717
+		) {
718
+			// if not, then loop through raw reg steps array
719
+			foreach (EED_Single_Page_Checkout::$_reg_steps_array as $order => $reg_step) {
720
+				if (! $this->_load_and_instantiate_reg_step($reg_step, $order)) {
721
+					return false;
722
+				}
723
+			}
724
+			if (isset($this->checkout->reg_steps['registration_confirmation'])) {
725
+				// skip the registration_confirmation page ?
726
+				if (EE_Registry::instance()->CFG->registration->skip_reg_confirmation) {
727
+					// just remove it from the reg steps array
728
+					$this->checkout->remove_reg_step('registration_confirmation', false);
729
+				} elseif (EE_Registry::instance()->CFG->registration->reg_confirmation_last
730
+				) {
731
+					// set the order to something big like 100
732
+					$this->checkout->set_reg_step_order('registration_confirmation', 100);
733
+				}
734
+			}
735
+			// filter the array for good luck
736
+			$this->checkout->reg_steps = apply_filters(
737
+				'FHEE__Single_Page_Checkout__load_reg_steps__reg_steps',
738
+				$this->checkout->reg_steps
739
+			);
740
+			// finally re-sort based on the reg step class order properties
741
+			$this->checkout->sort_reg_steps();
742
+		} else {
743
+			foreach ($this->checkout->reg_steps as $reg_step) {
744
+				// set all current step stati to FALSE
745
+				$reg_step->set_is_current_step(false);
746
+			}
747
+		}
748
+		if (empty($this->checkout->reg_steps)) {
749
+			EE_Error::add_error(
750
+				__('No Reg Steps were loaded..', 'event_espresso'),
751
+				__FILE__,
752
+				__FUNCTION__,
753
+				__LINE__
754
+			);
755
+			return false;
756
+		}
757
+		// make reg step details available to JS
758
+		$this->checkout->set_reg_step_JSON_info();
759
+		return true;
760
+	}
761
+
762
+
763
+	/**
764
+	 *     _load_and_instantiate_reg_step
765
+	 *
766
+	 * @access    private
767
+	 * @param array $reg_step
768
+	 * @param int   $order
769
+	 * @return bool
770
+	 */
771
+	private function _load_and_instantiate_reg_step($reg_step = array(), $order = 0)
772
+	{
773
+		// we need a file_path, class_name, and slug to add a reg step
774
+		if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) {
775
+			// if editing a specific step, but this is NOT that step... (and it's not the 'finalize_registration' step)
776
+			if ($this->checkout->reg_url_link
777
+				&& $this->checkout->step !== $reg_step['slug']
778
+				&& $reg_step['slug'] !== 'finalize_registration'
779
+				// normally at this point we would NOT load the reg step, but this filter can change that
780
+				&& apply_filters(
781
+					'FHEE__Single_Page_Checkout___load_and_instantiate_reg_step__bypass_reg_step',
782
+					true,
783
+					$reg_step,
784
+					$this->checkout
785
+				)
786
+			) {
787
+				return true;
788
+			}
789
+			// instantiate step class using file path and class name
790
+			$reg_step_obj = EE_Registry::instance()->load_file(
791
+				$reg_step['file_path'],
792
+				$reg_step['class_name'],
793
+				'class',
794
+				$this->checkout,
795
+				false
796
+			);
797
+			// did we gets the goods ?
798
+			if ($reg_step_obj instanceof EE_SPCO_Reg_Step) {
799
+				// set reg step order based on config
800
+				$reg_step_obj->set_order($order);
801
+				// add instantiated reg step object to the master reg steps array
802
+				$this->checkout->add_reg_step($reg_step_obj);
803
+			} else {
804
+				EE_Error::add_error(
805
+					__('The current step could not be set.', 'event_espresso'),
806
+					__FILE__,
807
+					__FUNCTION__,
808
+					__LINE__
809
+				);
810
+				return false;
811
+			}
812
+		} else {
813
+			if (WP_DEBUG) {
814
+				EE_Error::add_error(
815
+					sprintf(
816
+						__(
817
+							'A registration step could not be loaded. One or more of the following data points is invalid:%4$s%5$sFile Path: %1$s%6$s%5$sClass Name: %2$s%6$s%5$sSlug: %3$s%6$s%7$s',
818
+							'event_espresso'
819
+						),
820
+						isset($reg_step['file_path']) ? $reg_step['file_path'] : '',
821
+						isset($reg_step['class_name']) ? $reg_step['class_name'] : '',
822
+						isset($reg_step['slug']) ? $reg_step['slug'] : '',
823
+						'<ul>',
824
+						'<li>',
825
+						'</li>',
826
+						'</ul>'
827
+					),
828
+					__FILE__,
829
+					__FUNCTION__,
830
+					__LINE__
831
+				);
832
+			}
833
+			return false;
834
+		}
835
+		return true;
836
+	}
837
+
838
+
839
+	/**
840
+	 * _verify_transaction_and_get_registrations
841
+	 *
842
+	 * @access private
843
+	 * @return bool
844
+	 * @throws InvalidDataTypeException
845
+	 * @throws InvalidEntityException
846
+	 * @throws EE_Error
847
+	 */
848
+	private function _verify_transaction_and_get_registrations()
849
+	{
850
+		// was there already a valid transaction in the checkout from the session ?
851
+		if (! $this->checkout->transaction instanceof EE_Transaction) {
852
+			// get transaction from db or session
853
+			$this->checkout->transaction = $this->checkout->reg_url_link && ! is_admin()
854
+				? $this->_get_transaction_and_cart_for_previous_visit()
855
+				: $this->_get_cart_for_current_session_and_setup_new_transaction();
856
+			if (! $this->checkout->transaction instanceof EE_Transaction) {
857
+				EE_Error::add_error(
858
+					__(
859
+						'Your Registration and Transaction information could not be retrieved from the db.',
860
+						'event_espresso'
861
+					),
862
+					__FILE__,
863
+					__FUNCTION__,
864
+					__LINE__
865
+				);
866
+				$this->checkout->transaction = EE_Transaction::new_instance();
867
+				// add some style and make it dance
868
+				$this->add_styles_and_scripts();
869
+				EED_Single_Page_Checkout::$_initialized = true;
870
+				return false;
871
+			}
872
+			// and the registrations for the transaction
873
+			$this->_get_registrations($this->checkout->transaction);
874
+		}
875
+		return true;
876
+	}
877
+
878
+
879
+	/**
880
+	 * _get_transaction_and_cart_for_previous_visit
881
+	 *
882
+	 * @access private
883
+	 * @return mixed EE_Transaction|NULL
884
+	 */
885
+	private function _get_transaction_and_cart_for_previous_visit()
886
+	{
887
+		/** @var $TXN_model EEM_Transaction */
888
+		$TXN_model = EE_Registry::instance()->load_model('Transaction');
889
+		// because the reg_url_link is present in the request,
890
+		// this is a return visit to SPCO, so we'll get the transaction data from the db
891
+		$transaction = $TXN_model->get_transaction_from_reg_url_link($this->checkout->reg_url_link);
892
+		// verify transaction
893
+		if ($transaction instanceof EE_Transaction) {
894
+			// and get the cart that was used for that transaction
895
+			$this->checkout->cart = $this->_get_cart_for_transaction($transaction);
896
+			return $transaction;
897
+		}
898
+		EE_Error::add_error(
899
+			__('Your Registration and Transaction information could not be retrieved from the db.', 'event_espresso'),
900
+			__FILE__,
901
+			__FUNCTION__,
902
+			__LINE__
903
+		);
904
+		return null;
905
+	}
906
+
907
+
908
+	/**
909
+	 * _get_cart_for_transaction
910
+	 *
911
+	 * @access private
912
+	 * @param EE_Transaction $transaction
913
+	 * @return EE_Cart
914
+	 */
915
+	private function _get_cart_for_transaction($transaction)
916
+	{
917
+		return $this->checkout->get_cart_for_transaction($transaction);
918
+	}
919
+
920
+
921
+	/**
922
+	 * get_cart_for_transaction
923
+	 *
924
+	 * @access public
925
+	 * @param EE_Transaction $transaction
926
+	 * @return EE_Cart
927
+	 */
928
+	public function get_cart_for_transaction(EE_Transaction $transaction)
929
+	{
930
+		return $this->checkout->get_cart_for_transaction($transaction);
931
+	}
932
+
933
+
934
+	/**
935
+	 * _get_transaction_and_cart_for_current_session
936
+	 *    generates a new EE_Transaction object and adds it to the $_transaction property.
937
+	 *
938
+	 * @access private
939
+	 * @return EE_Transaction
940
+	 * @throws EE_Error
941
+	 */
942
+	private function _get_cart_for_current_session_and_setup_new_transaction()
943
+	{
944
+		//  if there's no transaction, then this is the FIRST visit to SPCO
945
+		// so load up the cart ( passing nothing for the TXN because it doesn't exist yet )
946
+		$this->checkout->cart = $this->_get_cart_for_transaction(null);
947
+		// and then create a new transaction
948
+		$transaction = $this->_initialize_transaction();
949
+		// verify transaction
950
+		if ($transaction instanceof EE_Transaction) {
951
+			// save it so that we have an ID for other objects to use
952
+			$transaction->save();
953
+			// and save TXN data to the cart
954
+			$this->checkout->cart->get_grand_total()->save_this_and_descendants_to_txn($transaction->ID());
955
+		} else {
956
+			EE_Error::add_error(
957
+				__('A Valid Transaction could not be initialized.', 'event_espresso'),
958
+				__FILE__,
959
+				__FUNCTION__,
960
+				__LINE__
961
+			);
962
+		}
963
+		return $transaction;
964
+	}
965
+
966
+
967
+	/**
968
+	 *    generates a new EE_Transaction object and adds it to the $_transaction property.
969
+	 *
970
+	 * @access private
971
+	 * @return mixed EE_Transaction|NULL
972
+	 */
973
+	private function _initialize_transaction()
974
+	{
975
+		try {
976
+			// ensure cart totals have been calculated
977
+			$this->checkout->cart->get_grand_total()->recalculate_total_including_taxes();
978
+			// grab the cart grand total
979
+			$cart_total = $this->checkout->cart->get_cart_grand_total();
980
+			// create new TXN
981
+			$transaction = EE_Transaction::new_instance(
982
+				array(
983
+					'TXN_reg_steps' => $this->checkout->initialize_txn_reg_steps_array(),
984
+					'TXN_total'     => $cart_total > 0 ? $cart_total : 0,
985
+					'TXN_paid'      => 0,
986
+					'STS_ID'        => EEM_Transaction::failed_status_code,
987
+				)
988
+			);
989
+			// save it so that we have an ID for other objects to use
990
+			$transaction->save();
991
+			// set cron job for following up on TXNs after their session has expired
992
+			EE_Cron_Tasks::schedule_expired_transaction_check(
993
+				EE_Registry::instance()->SSN->expiration() + 1,
994
+				$transaction->ID()
995
+			);
996
+			return $transaction;
997
+		} catch (Exception $e) {
998
+			EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
999
+		}
1000
+		return null;
1001
+	}
1002
+
1003
+
1004
+	/**
1005
+	 * _get_registrations
1006
+	 *
1007
+	 * @access private
1008
+	 * @param EE_Transaction $transaction
1009
+	 * @return void
1010
+	 * @throws InvalidDataTypeException
1011
+	 * @throws InvalidEntityException
1012
+	 * @throws EE_Error
1013
+	 */
1014
+	private function _get_registrations(EE_Transaction $transaction)
1015
+	{
1016
+		// first step: grab the registrants  { : o
1017
+		$registrations = $transaction->registrations($this->checkout->reg_cache_where_params, false);
1018
+		$this->checkout->total_ticket_count = count($registrations);
1019
+		// verify registrations have been set
1020
+		if (empty($registrations)) {
1021
+			// if no cached registrations, then check the db
1022
+			$registrations = $transaction->registrations($this->checkout->reg_cache_where_params, false);
1023
+			// still nothing ? well as long as this isn't a revisit
1024
+			if (empty($registrations) && ! $this->checkout->revisit) {
1025
+				// generate new registrations from scratch
1026
+				$registrations = $this->_initialize_registrations($transaction);
1027
+			}
1028
+		}
1029
+		// sort by their original registration order
1030
+		usort($registrations, array('EED_Single_Page_Checkout', 'sort_registrations_by_REG_count'));
1031
+		// then loop thru the array
1032
+		foreach ($registrations as $registration) {
1033
+			// verify each registration
1034
+			if ($registration instanceof EE_Registration) {
1035
+				// we display all attendee info for the primary registrant
1036
+				if ($this->checkout->reg_url_link === $registration->reg_url_link()
1037
+					&& $registration->is_primary_registrant()
1038
+				) {
1039
+					$this->checkout->primary_revisit = true;
1040
+					break;
1041
+				}
1042
+				if ($this->checkout->revisit && $this->checkout->reg_url_link !== $registration->reg_url_link()) {
1043
+					// but hide info if it doesn't belong to you
1044
+					$transaction->clear_cache('Registration', $registration->ID());
1045
+					$this->checkout->total_ticket_count--;
1046
+				}
1047
+				$this->checkout->set_reg_status_updated($registration->ID(), false);
1048
+			}
1049
+		}
1050
+	}
1051
+
1052
+
1053
+	/**
1054
+	 *    adds related EE_Registration objects for each ticket in the cart to the current EE_Transaction object
1055
+	 *
1056
+	 * @access private
1057
+	 * @param EE_Transaction $transaction
1058
+	 * @return    array
1059
+	 * @throws InvalidDataTypeException
1060
+	 * @throws InvalidEntityException
1061
+	 * @throws EE_Error
1062
+	 */
1063
+	private function _initialize_registrations(EE_Transaction $transaction)
1064
+	{
1065
+		$att_nmbr = 0;
1066
+		$registrations = array();
1067
+		if ($transaction instanceof EE_Transaction) {
1068
+			/** @type EE_Registration_Processor $registration_processor */
1069
+			$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
1070
+			$this->checkout->total_ticket_count = $this->checkout->cart->all_ticket_quantity_count();
1071
+			// now let's add the cart items to the $transaction
1072
+			foreach ($this->checkout->cart->get_tickets() as $line_item) {
1073
+				// do the following for each ticket of this type they selected
1074
+				for ($x = 1; $x <= $line_item->quantity(); $x++) {
1075
+					$att_nmbr++;
1076
+					/** @var EventEspresso\core\services\commands\registration\CreateRegistrationCommand $CreateRegistrationCommand */
1077
+					$CreateRegistrationCommand = EE_Registry::instance()->create(
1078
+						'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
1079
+						array(
1080
+							$transaction,
1081
+							$line_item,
1082
+							$att_nmbr,
1083
+							$this->checkout->total_ticket_count,
1084
+						)
1085
+					);
1086
+					// override capabilities for frontend registrations
1087
+					if (! is_admin()) {
1088
+						$CreateRegistrationCommand->setCapCheck(
1089
+							new PublicCapabilities('', 'create_new_registration')
1090
+						);
1091
+					}
1092
+					$registration = EE_Registry::instance()->BUS->execute($CreateRegistrationCommand);
1093
+					if (! $registration instanceof EE_Registration) {
1094
+						throw new InvalidEntityException($registration, 'EE_Registration');
1095
+					}
1096
+					$registrations[ $registration->ID() ] = $registration;
1097
+				}
1098
+			}
1099
+			$registration_processor->fix_reg_final_price_rounding_issue($transaction);
1100
+		}
1101
+		return $registrations;
1102
+	}
1103
+
1104
+
1105
+	/**
1106
+	 * sorts registrations by REG_count
1107
+	 *
1108
+	 * @access public
1109
+	 * @param EE_Registration $reg_A
1110
+	 * @param EE_Registration $reg_B
1111
+	 * @return int
1112
+	 */
1113
+	public static function sort_registrations_by_REG_count(EE_Registration $reg_A, EE_Registration $reg_B)
1114
+	{
1115
+		// this shouldn't ever happen within the same TXN, but oh well
1116
+		if ($reg_A->count() === $reg_B->count()) {
1117
+			return 0;
1118
+		}
1119
+		return ($reg_A->count() > $reg_B->count()) ? 1 : -1;
1120
+	}
1121
+
1122
+
1123
+	/**
1124
+	 *    _final_verifications
1125
+	 * just makes sure that everything is set up correctly before proceeding
1126
+	 *
1127
+	 * @access    private
1128
+	 * @return    bool
1129
+	 * @throws EE_Error
1130
+	 */
1131
+	private function _final_verifications()
1132
+	{
1133
+		// filter checkout
1134
+		$this->checkout = apply_filters(
1135
+			'FHEE__EED_Single_Page_Checkout___final_verifications__checkout',
1136
+			$this->checkout
1137
+		);
1138
+		// verify that current step is still set correctly
1139
+		if (! $this->checkout->current_step instanceof EE_SPCO_Reg_Step) {
1140
+			EE_Error::add_error(
1141
+				__(
1142
+					'We\'re sorry but the registration process can not proceed because one or more registration steps were not setup correctly. Please refresh the page and try again or contact support.',
1143
+					'event_espresso'
1144
+				),
1145
+				__FILE__,
1146
+				__FUNCTION__,
1147
+				__LINE__
1148
+			);
1149
+			return false;
1150
+		}
1151
+		// if returning to SPCO, then verify that primary registrant is set
1152
+		if (! empty($this->checkout->reg_url_link)) {
1153
+			$valid_registrant = $this->checkout->transaction->primary_registration();
1154
+			if (! $valid_registrant instanceof EE_Registration) {
1155
+				EE_Error::add_error(
1156
+					__(
1157
+						'We\'re sorry but there appears to be an error with the "reg_url_link" or the primary registrant for this transaction. Please refresh the page and try again or contact support.',
1158
+						'event_espresso'
1159
+					),
1160
+					__FILE__,
1161
+					__FUNCTION__,
1162
+					__LINE__
1163
+				);
1164
+				return false;
1165
+			}
1166
+			$valid_registrant = null;
1167
+			foreach ($this->checkout->transaction->registrations($this->checkout->reg_cache_where_params) as $registration) {
1168
+				if ($registration instanceof EE_Registration
1169
+					&& $registration->reg_url_link() === $this->checkout->reg_url_link
1170
+				) {
1171
+					$valid_registrant = $registration;
1172
+				}
1173
+			}
1174
+			if (! $valid_registrant instanceof EE_Registration) {
1175
+				// hmmm... maybe we have the wrong session because the user is opening multiple tabs ?
1176
+				if (EED_Single_Page_Checkout::$_checkout_verified) {
1177
+					// clear the session, mark the checkout as unverified, and try again
1178
+					EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
1179
+					EED_Single_Page_Checkout::$_initialized = false;
1180
+					EED_Single_Page_Checkout::$_checkout_verified = false;
1181
+					$this->_initialize();
1182
+					EE_Error::reset_notices();
1183
+					return false;
1184
+				}
1185
+				EE_Error::add_error(
1186
+					__(
1187
+						'We\'re sorry but there appears to be an error with the "reg_url_link" or the transaction itself. Please refresh the page and try again or contact support.',
1188
+						'event_espresso'
1189
+					),
1190
+					__FILE__,
1191
+					__FUNCTION__,
1192
+					__LINE__
1193
+				);
1194
+				return false;
1195
+			}
1196
+		}
1197
+		// now that things have been kinda sufficiently verified,
1198
+		// let's add the checkout to the session so that it's available to other systems
1199
+		EE_Registry::instance()->SSN->set_checkout($this->checkout);
1200
+		return true;
1201
+	}
1202
+
1203
+
1204
+	/**
1205
+	 *    _initialize_reg_steps
1206
+	 * first makes sure that EE_Transaction_Processor::set_reg_step_initiated() is called as required
1207
+	 * then loops thru all of the active reg steps and calls the initialize_reg_step() method
1208
+	 *
1209
+	 * @access    private
1210
+	 * @param bool $reinitializing
1211
+	 * @throws EE_Error
1212
+	 */
1213
+	private function _initialize_reg_steps($reinitializing = false)
1214
+	{
1215
+		$this->checkout->set_reg_step_initiated($this->checkout->current_step);
1216
+		// loop thru all steps to call their individual "initialize" methods and set i18n strings for JS
1217
+		foreach ($this->checkout->reg_steps as $reg_step) {
1218
+			if (! $reg_step->initialize_reg_step()) {
1219
+				// if not initialized then maybe this step is being removed...
1220
+				if (! $reinitializing && $reg_step->is_current_step()) {
1221
+					// if it was the current step, then we need to start over here
1222
+					$this->_initialize_reg_steps(true);
1223
+					return;
1224
+				}
1225
+				continue;
1226
+			}
1227
+			// add css and JS for current step
1228
+			$reg_step->enqueue_styles_and_scripts();
1229
+			// i18n
1230
+			$reg_step->translate_js_strings();
1231
+			if ($reg_step->is_current_step()) {
1232
+				// the text that appears on the reg step form submit button
1233
+				$reg_step->set_submit_button_text();
1234
+			}
1235
+		}
1236
+		// dynamically creates hook point like: AHEE__Single_Page_Checkout___initialize_reg_step__attendee_information
1237
+		do_action(
1238
+			"AHEE__Single_Page_Checkout___initialize_reg_step__{$this->checkout->current_step->slug()}",
1239
+			$this->checkout->current_step
1240
+		);
1241
+	}
1242
+
1243
+
1244
+	/**
1245
+	 * _check_form_submission
1246
+	 *
1247
+	 * @access private
1248
+	 * @return boolean
1249
+	 */
1250
+	private function _check_form_submission()
1251
+	{
1252
+		// does this request require the reg form to be generated ?
1253
+		if ($this->checkout->generate_reg_form) {
1254
+			// ever heard that song by Blue Rodeo ?
1255
+			try {
1256
+				$this->checkout->current_step->reg_form = $this->checkout->current_step->generate_reg_form();
1257
+				// if not displaying a form, then check for form submission
1258
+				if ($this->checkout->process_form_submission
1259
+					&& $this->checkout->current_step->reg_form->was_submitted()
1260
+				) {
1261
+					// clear out any old data in case this step is being run again
1262
+					$this->checkout->current_step->set_valid_data(array());
1263
+					// capture submitted form data
1264
+					$this->checkout->current_step->reg_form->receive_form_submission(
1265
+						apply_filters(
1266
+							'FHEE__Single_Page_Checkout___check_form_submission__request_params',
1267
+							EE_Registry::instance()->REQ->params(),
1268
+							$this->checkout
1269
+						)
1270
+					);
1271
+					// validate submitted form data
1272
+					if (! $this->checkout->continue_reg || ! $this->checkout->current_step->reg_form->is_valid()) {
1273
+						// thou shall not pass !!!
1274
+						$this->checkout->continue_reg = false;
1275
+						// any form validation errors?
1276
+						if ($this->checkout->current_step->reg_form->submission_error_message() !== '') {
1277
+							EE_Error::add_error(
1278
+								$this->checkout->current_step->reg_form->submission_error_message(),
1279
+								__FILE__,
1280
+								__FUNCTION__,
1281
+								__LINE__
1282
+							);
1283
+						}
1284
+						// well not really... what will happen is
1285
+						// we'll just get redirected back to redo the current step
1286
+						$this->go_to_next_step();
1287
+						return false;
1288
+					}
1289
+				}
1290
+			} catch (EE_Error $e) {
1291
+				$e->get_error();
1292
+			}
1293
+		}
1294
+		return true;
1295
+	}
1296
+
1297
+
1298
+	/**
1299
+	 * _process_action
1300
+	 *
1301
+	 * @access private
1302
+	 * @return void
1303
+	 * @throws EE_Error
1304
+	 */
1305
+	private function _process_form_action()
1306
+	{
1307
+		// what cha wanna do?
1308
+		switch ($this->checkout->action) {
1309
+			// AJAX next step reg form
1310
+			case 'display_spco_reg_step':
1311
+				$this->checkout->redirect = false;
1312
+				if (EE_Registry::instance()->REQ->ajax) {
1313
+					$this->checkout->json_response->set_reg_step_html(
1314
+						$this->checkout->current_step->display_reg_form()
1315
+					);
1316
+				}
1317
+				break;
1318
+			default:
1319
+				// meh... do one of those other steps first
1320
+				if (! empty($this->checkout->action)
1321
+					&& is_callable(array($this->checkout->current_step, $this->checkout->action))
1322
+				) {
1323
+					// dynamically creates hook point like:
1324
+					//   AHEE__Single_Page_Checkout__before_attendee_information__process_reg_step
1325
+					do_action(
1326
+						"AHEE__Single_Page_Checkout__before_{$this->checkout->current_step->slug()}__{$this->checkout->action}",
1327
+						$this->checkout->current_step
1328
+					);
1329
+					// call action on current step
1330
+					if (call_user_func(array($this->checkout->current_step, $this->checkout->action))) {
1331
+						// good registrant, you get to proceed
1332
+						if ($this->checkout->current_step->success_message() !== ''
1333
+							&& apply_filters(
1334
+								'FHEE__Single_Page_Checkout___process_form_action__display_success',
1335
+								false
1336
+							)
1337
+						) {
1338
+							EE_Error::add_success(
1339
+								$this->checkout->current_step->success_message()
1340
+								. '<br />' . $this->checkout->next_step->_instructions()
1341
+							);
1342
+						}
1343
+						// pack it up, pack it in...
1344
+						$this->_setup_redirect();
1345
+					}
1346
+					// dynamically creates hook point like:
1347
+					//  AHEE__Single_Page_Checkout__after_payment_options__process_reg_step
1348
+					do_action(
1349
+						"AHEE__Single_Page_Checkout__after_{$this->checkout->current_step->slug()}__{$this->checkout->action}",
1350
+						$this->checkout->current_step
1351
+					);
1352
+				} else {
1353
+					EE_Error::add_error(
1354
+						sprintf(
1355
+							__(
1356
+								'The requested form action "%s" does not exist for the current "%s" registration step.',
1357
+								'event_espresso'
1358
+							),
1359
+							$this->checkout->action,
1360
+							$this->checkout->current_step->name()
1361
+						),
1362
+						__FILE__,
1363
+						__FUNCTION__,
1364
+						__LINE__
1365
+					);
1366
+				}
1367
+			// end default
1368
+		}
1369
+		// store our progress so far
1370
+		$this->checkout->stash_transaction_and_checkout();
1371
+		// advance to the next step! If you pass GO, collect $200
1372
+		$this->go_to_next_step();
1373
+	}
1374
+
1375
+
1376
+	/**
1377
+	 *        add_styles_and_scripts
1378
+	 *
1379
+	 * @access        public
1380
+	 * @return        void
1381
+	 */
1382
+	public function add_styles_and_scripts()
1383
+	{
1384
+		// i18n
1385
+		$this->translate_js_strings();
1386
+		if ($this->checkout->admin_request) {
1387
+			add_action('admin_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10);
1388
+		} else {
1389
+			add_action('wp_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10);
1390
+		}
1391
+	}
1392
+
1393
+
1394
+	/**
1395
+	 *        translate_js_strings
1396
+	 *
1397
+	 * @access        public
1398
+	 * @return        void
1399
+	 */
1400
+	public function translate_js_strings()
1401
+	{
1402
+		EE_Registry::$i18n_js_strings['revisit'] = $this->checkout->revisit;
1403
+		EE_Registry::$i18n_js_strings['e_reg_url_link'] = $this->checkout->reg_url_link;
1404
+		EE_Registry::$i18n_js_strings['server_error'] = __(
1405
+			'An unknown error occurred on the server while attempting to process your request. Please refresh the page and try again or contact support.',
1406
+			'event_espresso'
1407
+		);
1408
+		EE_Registry::$i18n_js_strings['invalid_json_response'] = __(
1409
+			'An invalid response was returned from the server while attempting to process your request. Please refresh the page and try again or contact support.',
1410
+			'event_espresso'
1411
+		);
1412
+		EE_Registry::$i18n_js_strings['validation_error'] = __(
1413
+			'There appears to be a problem with the form validation configuration! Please check the admin settings or contact support.',
1414
+			'event_espresso'
1415
+		);
1416
+		EE_Registry::$i18n_js_strings['invalid_payment_method'] = __(
1417
+			'There appears to be a problem with the payment method configuration! Please refresh the page and try again or contact support.',
1418
+			'event_espresso'
1419
+		);
1420
+		EE_Registry::$i18n_js_strings['reg_step_error'] = __(
1421
+			'This registration step could not be completed. Please refresh the page and try again.',
1422
+			'event_espresso'
1423
+		);
1424
+		EE_Registry::$i18n_js_strings['invalid_coupon'] = __(
1425
+			'We\'re sorry but that coupon code does not appear to be valid. If this is incorrect, please contact the site administrator.',
1426
+			'event_espresso'
1427
+		);
1428
+		EE_Registry::$i18n_js_strings['process_registration'] = sprintf(
1429
+			__(
1430
+				'Please wait while we process your registration.%sDo not refresh the page or navigate away while this is happening.%sThank you for your patience.',
1431
+				'event_espresso'
1432
+			),
1433
+			'<br/>',
1434
+			'<br/>'
1435
+		);
1436
+		EE_Registry::$i18n_js_strings['language'] = get_bloginfo('language');
1437
+		EE_Registry::$i18n_js_strings['EESID'] = EE_Registry::instance()->SSN->id();
1438
+		EE_Registry::$i18n_js_strings['currency'] = EE_Registry::instance()->CFG->currency;
1439
+		EE_Registry::$i18n_js_strings['datepicker_yearRange'] = '-150:+20';
1440
+		EE_Registry::$i18n_js_strings['timer_years'] = __('years', 'event_espresso');
1441
+		EE_Registry::$i18n_js_strings['timer_months'] = __('months', 'event_espresso');
1442
+		EE_Registry::$i18n_js_strings['timer_weeks'] = __('weeks', 'event_espresso');
1443
+		EE_Registry::$i18n_js_strings['timer_days'] = __('days', 'event_espresso');
1444
+		EE_Registry::$i18n_js_strings['timer_hours'] = __('hours', 'event_espresso');
1445
+		EE_Registry::$i18n_js_strings['timer_minutes'] = __('minutes', 'event_espresso');
1446
+		EE_Registry::$i18n_js_strings['timer_seconds'] = __('seconds', 'event_espresso');
1447
+		EE_Registry::$i18n_js_strings['timer_year'] = __('year', 'event_espresso');
1448
+		EE_Registry::$i18n_js_strings['timer_month'] = __('month', 'event_espresso');
1449
+		EE_Registry::$i18n_js_strings['timer_week'] = __('week', 'event_espresso');
1450
+		EE_Registry::$i18n_js_strings['timer_day'] = __('day', 'event_espresso');
1451
+		EE_Registry::$i18n_js_strings['timer_hour'] = __('hour', 'event_espresso');
1452
+		EE_Registry::$i18n_js_strings['timer_minute'] = __('minute', 'event_espresso');
1453
+		EE_Registry::$i18n_js_strings['timer_second'] = __('second', 'event_espresso');
1454
+		EE_Registry::$i18n_js_strings['registration_expiration_notice'] = EED_Single_Page_Checkout::getRegistrationExpirationNotice(
1455
+		);
1456
+		EE_Registry::$i18n_js_strings['ajax_submit'] = apply_filters(
1457
+			'FHEE__Single_Page_Checkout__translate_js_strings__ajax_submit',
1458
+			true
1459
+		);
1460
+		EE_Registry::$i18n_js_strings['session_extension'] = absint(
1461
+			apply_filters('FHEE__EE_Session__extend_expiration__seconds_added', 10 * MINUTE_IN_SECONDS)
1462
+		);
1463
+		EE_Registry::$i18n_js_strings['session_expiration'] = gmdate(
1464
+			'M d, Y H:i:s',
1465
+			EE_Registry::instance()->SSN->expiration() + (get_option('gmt_offset') * HOUR_IN_SECONDS)
1466
+		);
1467
+	}
1468
+
1469
+
1470
+	/**
1471
+	 *    enqueue_styles_and_scripts
1472
+	 *
1473
+	 * @access        public
1474
+	 * @return        void
1475
+	 * @throws EE_Error
1476
+	 */
1477
+	public function enqueue_styles_and_scripts()
1478
+	{
1479
+		// load css
1480
+		wp_register_style(
1481
+			'single_page_checkout',
1482
+			SPCO_CSS_URL . 'single_page_checkout.css',
1483
+			array('espresso_default'),
1484
+			EVENT_ESPRESSO_VERSION
1485
+		);
1486
+		wp_enqueue_style('single_page_checkout');
1487
+		// load JS
1488
+		wp_register_script(
1489
+			'jquery_plugin',
1490
+			EE_THIRD_PARTY_URL . 'jquery	.plugin.min.js',
1491
+			array('jquery'),
1492
+			'1.0.1',
1493
+			true
1494
+		);
1495
+		wp_register_script(
1496
+			'jquery_countdown',
1497
+			EE_THIRD_PARTY_URL . 'jquery	.countdown.min.js',
1498
+			array('jquery_plugin'),
1499
+			'2.1.0',
1500
+			true
1501
+		);
1502
+		wp_register_script(
1503
+			'single_page_checkout',
1504
+			SPCO_JS_URL . 'single_page_checkout.js',
1505
+			array('espresso_core', 'underscore', 'ee_form_section_validation'),
1506
+			EVENT_ESPRESSO_VERSION,
1507
+			true
1508
+		);
1509
+		if ($this->checkout->registration_form instanceof EE_Form_Section_Proper) {
1510
+			$this->checkout->registration_form->enqueue_js();
1511
+		}
1512
+		if ($this->checkout->current_step->reg_form instanceof EE_Form_Section_Proper) {
1513
+			$this->checkout->current_step->reg_form->enqueue_js();
1514
+		}
1515
+		wp_enqueue_script('single_page_checkout');
1516
+		if (apply_filters('FHEE__registration_page_wrapper_template__display_time_limit', false)) {
1517
+			wp_enqueue_script('jquery_countdown');
1518
+		}
1519
+		/**
1520
+		 * global action hook for enqueueing styles and scripts with
1521
+		 * spco calls.
1522
+		 */
1523
+		do_action('AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts', $this);
1524
+		/**
1525
+		 * dynamic action hook for enqueueing styles and scripts with spco calls.
1526
+		 * The hook will end up being something like:
1527
+		 *      AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__attendee_information
1528
+		 */
1529
+		do_action(
1530
+			'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__' . $this->checkout->current_step->slug(),
1531
+			$this
1532
+		);
1533
+	}
1534
+
1535
+
1536
+	/**
1537
+	 *    display the Registration Single Page Checkout Form
1538
+	 *
1539
+	 * @access    private
1540
+	 * @return    void
1541
+	 * @throws EE_Error
1542
+	 */
1543
+	private function _display_spco_reg_form()
1544
+	{
1545
+		// if registering via the admin, just display the reg form for the current step
1546
+		if ($this->checkout->admin_request) {
1547
+			EE_Registry::instance()->REQ->add_output($this->checkout->current_step->display_reg_form());
1548
+		} else {
1549
+			// add powered by EE msg
1550
+			add_action('AHEE__SPCO__reg_form_footer', array('EED_Single_Page_Checkout', 'display_registration_footer'));
1551
+			$empty_cart = count($this->checkout->transaction
1552
+									->registrations($this->checkout->reg_cache_where_params)) < 1;
1553
+			EE_Registry::$i18n_js_strings['empty_cart'] = $empty_cart;
1554
+			$cookies_not_set_msg = '';
1555
+			if ($empty_cart) {
1556
+				$cookies_not_set_msg = apply_filters(
1557
+					'FHEE__Single_Page_Checkout__display_spco_reg_form__cookies_not_set_msg',
1558
+					sprintf(
1559
+						__(
1560
+							'%1$s%3$sIt appears your browser is not currently set to accept Cookies%4$s%5$sIn order to register for events, you need to enable cookies.%7$sIf you require assistance, then click the following link to learn how to %8$senable cookies%9$s%6$s%2$s',
1561
+							'event_espresso'
1562
+						),
1563
+						'<div class="ee-attention hidden" id="ee-cookies-not-set-msg">',
1564
+						'</div>',
1565
+						'<h6 class="important-notice">',
1566
+						'</h6>',
1567
+						'<p>',
1568
+						'</p>',
1569
+						'<br />',
1570
+						'<a href="http://www.whatarecookies.com/enable.asp" target="_blank">',
1571
+						'</a>'
1572
+					)
1573
+				);
1574
+			}
1575
+			$this->checkout->registration_form = new EE_Form_Section_Proper(
1576
+				array(
1577
+					'name'            => 'single-page-checkout',
1578
+					'html_id'         => 'ee-single-page-checkout-dv',
1579
+					'layout_strategy' =>
1580
+						new EE_Template_Layout(
1581
+							array(
1582
+								'layout_template_file' => SPCO_TEMPLATES_PATH . 'registration_page_wrapper.template.php',
1583
+								'template_args'        => array(
1584
+									'empty_cart'              => $empty_cart,
1585
+									'revisit'                 => $this->checkout->revisit,
1586
+									'reg_steps'               => $this->checkout->reg_steps,
1587
+									'next_step'               => $this->checkout->next_step instanceof EE_SPCO_Reg_Step
1588
+										? $this->checkout->next_step->slug()
1589
+										: '',
1590
+									'empty_msg'               => apply_filters(
1591
+										'FHEE__Single_Page_Checkout__display_spco_reg_form__empty_msg',
1592
+										sprintf(
1593
+											__(
1594
+												'You need to %1$sReturn to Events list%2$sselect at least one event%3$s before you can proceed with the registration process.',
1595
+												'event_espresso'
1596
+											),
1597
+											'<a href="'
1598
+											. get_post_type_archive_link('espresso_events')
1599
+											. '" title="',
1600
+											'">',
1601
+											'</a>'
1602
+										)
1603
+									),
1604
+									'cookies_not_set_msg'     => $cookies_not_set_msg,
1605
+									'registration_time_limit' => $this->checkout->get_registration_time_limit(),
1606
+									'session_expiration'      => gmdate(
1607
+										'M d, Y H:i:s',
1608
+										EE_Registry::instance()->SSN->expiration()
1609
+										+ (get_option('gmt_offset') * HOUR_IN_SECONDS)
1610
+									),
1611
+								),
1612
+							)
1613
+						),
1614
+				)
1615
+			);
1616
+			// load template and add to output sent that gets filtered into the_content()
1617
+			EE_Registry::instance()->REQ->add_output($this->checkout->registration_form->get_html());
1618
+		}
1619
+	}
1620
+
1621
+
1622
+	/**
1623
+	 *    add_extra_finalize_registration_inputs
1624
+	 *
1625
+	 * @access    public
1626
+	 * @param $next_step
1627
+	 * @internal  param string $label
1628
+	 * @return void
1629
+	 */
1630
+	public function add_extra_finalize_registration_inputs($next_step)
1631
+	{
1632
+		if ($next_step === 'finalize_registration') {
1633
+			echo '<div id="spco-extra-finalize_registration-inputs-dv"></div>';
1634
+		}
1635
+	}
1636
+
1637
+
1638
+	/**
1639
+	 *    display_registration_footer
1640
+	 *
1641
+	 * @access    public
1642
+	 * @return    string
1643
+	 */
1644
+	public static function display_registration_footer()
1645
+	{
1646
+		if (apply_filters(
1647
+			'FHEE__EE_Front__Controller__show_reg_footer',
1648
+			EE_Registry::instance()->CFG->admin->show_reg_footer
1649
+		)) {
1650
+			add_filter(
1651
+				'FHEE__EEH_Template__powered_by_event_espresso__url',
1652
+				function ($url) {
1653
+					return apply_filters('FHEE__EE_Front_Controller__registration_footer__url', $url);
1654
+				}
1655
+			);
1656
+			echo apply_filters(
1657
+				'FHEE__EE_Front_Controller__display_registration_footer',
1658
+				\EEH_Template::powered_by_event_espresso(
1659
+					'',
1660
+					'espresso-registration-footer-dv',
1661
+					array('utm_content' => 'registration_checkout')
1662
+				)
1663
+			);
1664
+		}
1665
+		return '';
1666
+	}
1667
+
1668
+
1669
+	/**
1670
+	 *    unlock_transaction
1671
+	 *
1672
+	 * @access    public
1673
+	 * @return    void
1674
+	 * @throws EE_Error
1675
+	 */
1676
+	public function unlock_transaction()
1677
+	{
1678
+		if ($this->checkout->transaction instanceof EE_Transaction) {
1679
+			$this->checkout->transaction->unlock();
1680
+		}
1681
+	}
1682
+
1683
+
1684
+	/**
1685
+	 *        _setup_redirect
1686
+	 *
1687
+	 * @access    private
1688
+	 * @return void
1689
+	 */
1690
+	private function _setup_redirect()
1691
+	{
1692
+		if ($this->checkout->continue_reg && $this->checkout->next_step instanceof EE_SPCO_Reg_Step) {
1693
+			$this->checkout->redirect = true;
1694
+			if (empty($this->checkout->redirect_url)) {
1695
+				$this->checkout->redirect_url = $this->checkout->next_step->reg_step_url();
1696
+			}
1697
+			$this->checkout->redirect_url = apply_filters(
1698
+				'FHEE__EED_Single_Page_Checkout___setup_redirect__checkout_redirect_url',
1699
+				$this->checkout->redirect_url,
1700
+				$this->checkout
1701
+			);
1702
+		}
1703
+	}
1704
+
1705
+
1706
+	/**
1707
+	 *   handle ajax message responses and redirects
1708
+	 *
1709
+	 * @access public
1710
+	 * @return void
1711
+	 * @throws EE_Error
1712
+	 */
1713
+	public function go_to_next_step()
1714
+	{
1715
+		if (EE_Registry::instance()->REQ->ajax) {
1716
+			// capture contents of output buffer we started earlier in the request, and insert into JSON response
1717
+			$this->checkout->json_response->set_unexpected_errors(ob_get_clean());
1718
+		}
1719
+		$this->unlock_transaction();
1720
+		// just return for these conditions
1721
+		if ($this->checkout->admin_request
1722
+			|| $this->checkout->action === 'redirect_form'
1723
+			|| $this->checkout->action === 'update_checkout'
1724
+		) {
1725
+			return;
1726
+		}
1727
+		// AJAX response
1728
+		$this->_handle_json_response();
1729
+		// redirect to next step or the Thank You page
1730
+		$this->_handle_html_redirects();
1731
+		// hmmm... must be something wrong, so let's just display the form again !
1732
+		$this->_display_spco_reg_form();
1733
+	}
1734
+
1735
+
1736
+	/**
1737
+	 *   _handle_json_response
1738
+	 *
1739
+	 * @access protected
1740
+	 * @return void
1741
+	 */
1742
+	protected function _handle_json_response()
1743
+	{
1744
+		// if this is an ajax request
1745
+		if (EE_Registry::instance()->REQ->ajax) {
1746
+			$this->checkout->json_response->set_registration_time_limit(
1747
+				$this->checkout->get_registration_time_limit()
1748
+			);
1749
+			$this->checkout->json_response->set_payment_amount($this->checkout->amount_owing);
1750
+			// just send the ajax (
1751
+			$json_response = apply_filters(
1752
+				'FHEE__EE_Single_Page_Checkout__JSON_response',
1753
+				$this->checkout->json_response
1754
+			);
1755
+			echo $json_response;
1756
+			exit();
1757
+		}
1758
+	}
1759
+
1760
+
1761
+	/**
1762
+	 *   _handle_redirects
1763
+	 *
1764
+	 * @access protected
1765
+	 * @return void
1766
+	 */
1767
+	protected function _handle_html_redirects()
1768
+	{
1769
+		// going somewhere ?
1770
+		if ($this->checkout->redirect && ! empty($this->checkout->redirect_url)) {
1771
+			// store notices in a transient
1772
+			EE_Error::get_notices(false, true, true);
1773
+			wp_safe_redirect($this->checkout->redirect_url);
1774
+			exit();
1775
+		}
1776
+	}
1777
+
1778
+
1779
+	/**
1780
+	 *   set_checkout_anchor
1781
+	 *
1782
+	 * @access public
1783
+	 * @return void
1784
+	 */
1785
+	public function set_checkout_anchor()
1786
+	{
1787
+		echo '<a id="checkout" style="float: left; margin-left: -999em;"></a>';
1788
+	}
1789
+
1790
+	/**
1791
+	 *    getRegistrationExpirationNotice
1792
+	 *
1793
+	 * @since     4.9.59.p
1794
+	 * @access    public
1795
+	 * @return    string
1796
+	 */
1797
+	public static function getRegistrationExpirationNotice()
1798
+	{
1799
+		return sprintf(
1800
+			__(
1801
+				'%1$sWe\'re sorry, but your registration time has expired.%2$s%3$s%4$sIf you still wish to complete your registration, please return to the %5$sEvent List%6$sEvent List%7$s and reselect your tickets if available. Please accept our apologies for any inconvenience this may have caused.%8$s',
1802
+				'event_espresso'
1803
+			),
1804
+			'<h4 class="important-notice">',
1805
+			'</h4>',
1806
+			'<br />',
1807
+			'<p>',
1808
+			'<a href="' . get_post_type_archive_link('espresso_events') . '" title="',
1809
+			'">',
1810
+			'</a>',
1811
+			'</p>'
1812
+		);
1813
+	}
1814 1814
 }
Please login to merge, or discard this patch.
Spacing   +44 added lines, -44 removed lines patch added patch discarded remove patch
@@ -100,7 +100,7 @@  discard block
 block discarded – undo
100 100
     public static function set_hooks_admin()
101 101
     {
102 102
         EED_Single_Page_Checkout::set_definitions();
103
-        if (! (defined('DOING_AJAX') && DOING_AJAX)) {
103
+        if ( ! (defined('DOING_AJAX') && DOING_AJAX)) {
104 104
             return;
105 105
         }
106 106
         // going to start an output buffer in case anything gets accidentally output
@@ -206,14 +206,14 @@  discard block
 block discarded – undo
206 206
         }
207 207
         define(
208 208
             'SPCO_BASE_PATH',
209
-            rtrim(str_replace(array('\\', '/'), DS, plugin_dir_path(__FILE__)), DS) . DS
209
+            rtrim(str_replace(array('\\', '/'), DS, plugin_dir_path(__FILE__)), DS).DS
210 210
         );
211
-        define('SPCO_CSS_URL', plugin_dir_url(__FILE__) . 'css' . DS);
212
-        define('SPCO_IMG_URL', plugin_dir_url(__FILE__) . 'img' . DS);
213
-        define('SPCO_JS_URL', plugin_dir_url(__FILE__) . 'js' . DS);
214
-        define('SPCO_INC_PATH', SPCO_BASE_PATH . 'inc' . DS);
215
-        define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH . 'reg_steps' . DS);
216
-        define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH . 'templates' . DS);
211
+        define('SPCO_CSS_URL', plugin_dir_url(__FILE__).'css'.DS);
212
+        define('SPCO_IMG_URL', plugin_dir_url(__FILE__).'img'.DS);
213
+        define('SPCO_JS_URL', plugin_dir_url(__FILE__).'js'.DS);
214
+        define('SPCO_INC_PATH', SPCO_BASE_PATH.'inc'.DS);
215
+        define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH.'reg_steps'.DS);
216
+        define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH.'templates'.DS);
217 217
         EEH_Autoloader::register_autoloaders_for_each_file_in_folder(SPCO_BASE_PATH, true);
218 218
         EE_Registry::$i18n_js_strings['registration_expiration_notice'] = EED_Single_Page_Checkout::getRegistrationExpirationNotice(
219 219
         );
@@ -245,7 +245,7 @@  discard block
 block discarded – undo
245 245
             // we need a
246 246
             if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) {
247 247
                 // copy over to the reg_steps_array
248
-                EED_Single_Page_Checkout::$_reg_steps_array[ $order ] = $reg_step;
248
+                EED_Single_Page_Checkout::$_reg_steps_array[$order] = $reg_step;
249 249
                 // register custom key route for each reg step
250 250
                 // ie: step=>"slug" - this is the entire reason we load the reg steps array now
251 251
                 EE_Config::register_route(
@@ -257,7 +257,7 @@  discard block
 block discarded – undo
257 257
                 // add AJAX or other hooks
258 258
                 if (isset($reg_step['has_hooks']) && $reg_step['has_hooks']) {
259 259
                     // setup autoloaders if necessary
260
-                    if (! class_exists($reg_step['class_name'])) {
260
+                    if ( ! class_exists($reg_step['class_name'])) {
261 261
                         EEH_Autoloader::register_autoloaders_for_each_file_in_folder(
262 262
                             $reg_step['file_path'],
263 263
                             true
@@ -285,19 +285,19 @@  discard block
 block discarded – undo
285 285
         if (empty($reg_steps)) {
286 286
             $reg_steps = array(
287 287
                 10  => array(
288
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'attendee_information',
288
+                    'file_path'  => SPCO_REG_STEPS_PATH.'attendee_information',
289 289
                     'class_name' => 'EE_SPCO_Reg_Step_Attendee_Information',
290 290
                     'slug'       => 'attendee_information',
291 291
                     'has_hooks'  => false,
292 292
                 ),
293 293
                 30  => array(
294
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'payment_options',
294
+                    'file_path'  => SPCO_REG_STEPS_PATH.'payment_options',
295 295
                     'class_name' => 'EE_SPCO_Reg_Step_Payment_Options',
296 296
                     'slug'       => 'payment_options',
297 297
                     'has_hooks'  => true,
298 298
                 ),
299 299
                 999 => array(
300
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'finalize_registration',
300
+                    'file_path'  => SPCO_REG_STEPS_PATH.'finalize_registration',
301 301
                     'class_name' => 'EE_SPCO_Reg_Step_Finalize_Registration',
302 302
                     'slug'       => 'finalize_registration',
303 303
                     'has_hooks'  => false,
@@ -450,7 +450,7 @@  discard block
 block discarded – undo
450 450
                 $this->checkout
451 451
             );
452 452
             // load the reg steps array
453
-            if (! $this->_load_and_instantiate_reg_steps()) {
453
+            if ( ! $this->_load_and_instantiate_reg_steps()) {
454 454
                 EED_Single_Page_Checkout::$_initialized = true;
455 455
                 return;
456 456
             }
@@ -459,7 +459,7 @@  discard block
 block discarded – undo
459 459
             // and the next step
460 460
             $this->checkout->set_next_step();
461 461
             // verify that everything has been setup correctly
462
-            if (! ($this->_verify_transaction_and_get_registrations() && $this->_final_verifications())) {
462
+            if ( ! ($this->_verify_transaction_and_get_registrations() && $this->_final_verifications())) {
463 463
                 EED_Single_Page_Checkout::$_initialized = true;
464 464
                 return;
465 465
             }
@@ -474,7 +474,7 @@  discard block
 block discarded – undo
474 474
             // DEBUG LOG
475 475
             // $this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ );
476 476
             // get reg form
477
-            if (! $this->_check_form_submission()) {
477
+            if ( ! $this->_check_form_submission()) {
478 478
                 EED_Single_Page_Checkout::$_initialized = true;
479 479
                 return;
480 480
             }
@@ -505,7 +505,7 @@  discard block
 block discarded – undo
505 505
      */
506 506
     private function _verify_session()
507 507
     {
508
-        if (! EE_Registry::instance()->SSN instanceof EE_Session) {
508
+        if ( ! EE_Registry::instance()->SSN instanceof EE_Session) {
509 509
             throw new EE_Error(__('The EE_Session class could not be loaded.', 'event_espresso'));
510 510
         }
511 511
         $clear_session_requested = filter_var(
@@ -523,7 +523,7 @@  discard block
 block discarded – undo
523 523
             // EE_Registry::instance()->SSN->reset_cart();
524 524
             // EE_Registry::instance()->SSN->reset_checkout();
525 525
             // EE_Registry::instance()->SSN->reset_transaction();
526
-            if (! $clear_session_requested) {
526
+            if ( ! $clear_session_requested) {
527 527
                 EE_Error::add_attention(
528 528
                     EE_Registry::$i18n_js_strings['registration_expiration_notice'],
529 529
                     __FILE__,
@@ -550,7 +550,7 @@  discard block
 block discarded – undo
550 550
         /** @type EE_Checkout $checkout */
551 551
         $checkout = EE_Registry::instance()->SSN->checkout();
552 552
         // verify
553
-        if (! $checkout instanceof EE_Checkout) {
553
+        if ( ! $checkout instanceof EE_Checkout) {
554 554
             // instantiate EE_Checkout object for handling the properties of the current checkout process
555 555
             $checkout = EE_Registry::instance()->load_file(
556 556
                 SPCO_INC_PATH,
@@ -568,7 +568,7 @@  discard block
 block discarded – undo
568 568
         }
569 569
         $checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize_checkout__checkout', $checkout);
570 570
         // verify again
571
-        if (! $checkout instanceof EE_Checkout) {
571
+        if ( ! $checkout instanceof EE_Checkout) {
572 572
             throw new EE_Error(__('The EE_Checkout class could not be loaded.', 'event_espresso'));
573 573
         }
574 574
         // reset anything that needs a clean slate for each request
@@ -640,7 +640,7 @@  discard block
 block discarded – undo
640 640
      */
641 641
     protected function _display_request_vars()
642 642
     {
643
-        if (! WP_DEBUG) {
643
+        if ( ! WP_DEBUG) {
644 644
             return;
645 645
         }
646 646
         EEH_Debug_Tools::printr($_REQUEST, '$_REQUEST', __FILE__, __LINE__);
@@ -717,7 +717,7 @@  discard block
 block discarded – undo
717 717
         ) {
718 718
             // if not, then loop through raw reg steps array
719 719
             foreach (EED_Single_Page_Checkout::$_reg_steps_array as $order => $reg_step) {
720
-                if (! $this->_load_and_instantiate_reg_step($reg_step, $order)) {
720
+                if ( ! $this->_load_and_instantiate_reg_step($reg_step, $order)) {
721 721
                     return false;
722 722
                 }
723 723
             }
@@ -848,12 +848,12 @@  discard block
 block discarded – undo
848 848
     private function _verify_transaction_and_get_registrations()
849 849
     {
850 850
         // was there already a valid transaction in the checkout from the session ?
851
-        if (! $this->checkout->transaction instanceof EE_Transaction) {
851
+        if ( ! $this->checkout->transaction instanceof EE_Transaction) {
852 852
             // get transaction from db or session
853 853
             $this->checkout->transaction = $this->checkout->reg_url_link && ! is_admin()
854 854
                 ? $this->_get_transaction_and_cart_for_previous_visit()
855 855
                 : $this->_get_cart_for_current_session_and_setup_new_transaction();
856
-            if (! $this->checkout->transaction instanceof EE_Transaction) {
856
+            if ( ! $this->checkout->transaction instanceof EE_Transaction) {
857 857
                 EE_Error::add_error(
858 858
                     __(
859 859
                         'Your Registration and Transaction information could not be retrieved from the db.',
@@ -1084,16 +1084,16 @@  discard block
 block discarded – undo
1084 1084
                         )
1085 1085
                     );
1086 1086
                     // override capabilities for frontend registrations
1087
-                    if (! is_admin()) {
1087
+                    if ( ! is_admin()) {
1088 1088
                         $CreateRegistrationCommand->setCapCheck(
1089 1089
                             new PublicCapabilities('', 'create_new_registration')
1090 1090
                         );
1091 1091
                     }
1092 1092
                     $registration = EE_Registry::instance()->BUS->execute($CreateRegistrationCommand);
1093
-                    if (! $registration instanceof EE_Registration) {
1093
+                    if ( ! $registration instanceof EE_Registration) {
1094 1094
                         throw new InvalidEntityException($registration, 'EE_Registration');
1095 1095
                     }
1096
-                    $registrations[ $registration->ID() ] = $registration;
1096
+                    $registrations[$registration->ID()] = $registration;
1097 1097
                 }
1098 1098
             }
1099 1099
             $registration_processor->fix_reg_final_price_rounding_issue($transaction);
@@ -1136,7 +1136,7 @@  discard block
 block discarded – undo
1136 1136
             $this->checkout
1137 1137
         );
1138 1138
         // verify that current step is still set correctly
1139
-        if (! $this->checkout->current_step instanceof EE_SPCO_Reg_Step) {
1139
+        if ( ! $this->checkout->current_step instanceof EE_SPCO_Reg_Step) {
1140 1140
             EE_Error::add_error(
1141 1141
                 __(
1142 1142
                     'We\'re sorry but the registration process can not proceed because one or more registration steps were not setup correctly. Please refresh the page and try again or contact support.',
@@ -1149,9 +1149,9 @@  discard block
 block discarded – undo
1149 1149
             return false;
1150 1150
         }
1151 1151
         // if returning to SPCO, then verify that primary registrant is set
1152
-        if (! empty($this->checkout->reg_url_link)) {
1152
+        if ( ! empty($this->checkout->reg_url_link)) {
1153 1153
             $valid_registrant = $this->checkout->transaction->primary_registration();
1154
-            if (! $valid_registrant instanceof EE_Registration) {
1154
+            if ( ! $valid_registrant instanceof EE_Registration) {
1155 1155
                 EE_Error::add_error(
1156 1156
                     __(
1157 1157
                         'We\'re sorry but there appears to be an error with the "reg_url_link" or the primary registrant for this transaction. Please refresh the page and try again or contact support.',
@@ -1171,7 +1171,7 @@  discard block
 block discarded – undo
1171 1171
                     $valid_registrant = $registration;
1172 1172
                 }
1173 1173
             }
1174
-            if (! $valid_registrant instanceof EE_Registration) {
1174
+            if ( ! $valid_registrant instanceof EE_Registration) {
1175 1175
                 // hmmm... maybe we have the wrong session because the user is opening multiple tabs ?
1176 1176
                 if (EED_Single_Page_Checkout::$_checkout_verified) {
1177 1177
                     // clear the session, mark the checkout as unverified, and try again
@@ -1215,9 +1215,9 @@  discard block
 block discarded – undo
1215 1215
         $this->checkout->set_reg_step_initiated($this->checkout->current_step);
1216 1216
         // loop thru all steps to call their individual "initialize" methods and set i18n strings for JS
1217 1217
         foreach ($this->checkout->reg_steps as $reg_step) {
1218
-            if (! $reg_step->initialize_reg_step()) {
1218
+            if ( ! $reg_step->initialize_reg_step()) {
1219 1219
                 // if not initialized then maybe this step is being removed...
1220
-                if (! $reinitializing && $reg_step->is_current_step()) {
1220
+                if ( ! $reinitializing && $reg_step->is_current_step()) {
1221 1221
                     // if it was the current step, then we need to start over here
1222 1222
                     $this->_initialize_reg_steps(true);
1223 1223
                     return;
@@ -1269,7 +1269,7 @@  discard block
 block discarded – undo
1269 1269
                         )
1270 1270
                     );
1271 1271
                     // validate submitted form data
1272
-                    if (! $this->checkout->continue_reg || ! $this->checkout->current_step->reg_form->is_valid()) {
1272
+                    if ( ! $this->checkout->continue_reg || ! $this->checkout->current_step->reg_form->is_valid()) {
1273 1273
                         // thou shall not pass !!!
1274 1274
                         $this->checkout->continue_reg = false;
1275 1275
                         // any form validation errors?
@@ -1317,7 +1317,7 @@  discard block
 block discarded – undo
1317 1317
                 break;
1318 1318
             default:
1319 1319
                 // meh... do one of those other steps first
1320
-                if (! empty($this->checkout->action)
1320
+                if ( ! empty($this->checkout->action)
1321 1321
                     && is_callable(array($this->checkout->current_step, $this->checkout->action))
1322 1322
                 ) {
1323 1323
                     // dynamically creates hook point like:
@@ -1337,7 +1337,7 @@  discard block
 block discarded – undo
1337 1337
                         ) {
1338 1338
                             EE_Error::add_success(
1339 1339
                                 $this->checkout->current_step->success_message()
1340
-                                . '<br />' . $this->checkout->next_step->_instructions()
1340
+                                . '<br />'.$this->checkout->next_step->_instructions()
1341 1341
                             );
1342 1342
                         }
1343 1343
                         // pack it up, pack it in...
@@ -1479,7 +1479,7 @@  discard block
 block discarded – undo
1479 1479
         // load css
1480 1480
         wp_register_style(
1481 1481
             'single_page_checkout',
1482
-            SPCO_CSS_URL . 'single_page_checkout.css',
1482
+            SPCO_CSS_URL.'single_page_checkout.css',
1483 1483
             array('espresso_default'),
1484 1484
             EVENT_ESPRESSO_VERSION
1485 1485
         );
@@ -1487,21 +1487,21 @@  discard block
 block discarded – undo
1487 1487
         // load JS
1488 1488
         wp_register_script(
1489 1489
             'jquery_plugin',
1490
-            EE_THIRD_PARTY_URL . 'jquery	.plugin.min.js',
1490
+            EE_THIRD_PARTY_URL.'jquery	.plugin.min.js',
1491 1491
             array('jquery'),
1492 1492
             '1.0.1',
1493 1493
             true
1494 1494
         );
1495 1495
         wp_register_script(
1496 1496
             'jquery_countdown',
1497
-            EE_THIRD_PARTY_URL . 'jquery	.countdown.min.js',
1497
+            EE_THIRD_PARTY_URL.'jquery	.countdown.min.js',
1498 1498
             array('jquery_plugin'),
1499 1499
             '2.1.0',
1500 1500
             true
1501 1501
         );
1502 1502
         wp_register_script(
1503 1503
             'single_page_checkout',
1504
-            SPCO_JS_URL . 'single_page_checkout.js',
1504
+            SPCO_JS_URL.'single_page_checkout.js',
1505 1505
             array('espresso_core', 'underscore', 'ee_form_section_validation'),
1506 1506
             EVENT_ESPRESSO_VERSION,
1507 1507
             true
@@ -1527,7 +1527,7 @@  discard block
 block discarded – undo
1527 1527
          *      AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__attendee_information
1528 1528
          */
1529 1529
         do_action(
1530
-            'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__' . $this->checkout->current_step->slug(),
1530
+            'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__'.$this->checkout->current_step->slug(),
1531 1531
             $this
1532 1532
         );
1533 1533
     }
@@ -1579,7 +1579,7 @@  discard block
 block discarded – undo
1579 1579
                     'layout_strategy' =>
1580 1580
                         new EE_Template_Layout(
1581 1581
                             array(
1582
-                                'layout_template_file' => SPCO_TEMPLATES_PATH . 'registration_page_wrapper.template.php',
1582
+                                'layout_template_file' => SPCO_TEMPLATES_PATH.'registration_page_wrapper.template.php',
1583 1583
                                 'template_args'        => array(
1584 1584
                                     'empty_cart'              => $empty_cart,
1585 1585
                                     'revisit'                 => $this->checkout->revisit,
@@ -1649,7 +1649,7 @@  discard block
 block discarded – undo
1649 1649
         )) {
1650 1650
             add_filter(
1651 1651
                 'FHEE__EEH_Template__powered_by_event_espresso__url',
1652
-                function ($url) {
1652
+                function($url) {
1653 1653
                     return apply_filters('FHEE__EE_Front_Controller__registration_footer__url', $url);
1654 1654
                 }
1655 1655
             );
@@ -1805,7 +1805,7 @@  discard block
 block discarded – undo
1805 1805
             '</h4>',
1806 1806
             '<br />',
1807 1807
             '<p>',
1808
-            '<a href="' . get_post_type_archive_link('espresso_events') . '" title="',
1808
+            '<a href="'.get_post_type_archive_link('espresso_events').'" title="',
1809 1809
             '">',
1810 1810
             '</a>',
1811 1811
             '</p>'
Please login to merge, or discard this patch.