/**
         * Generates the main JavaScript which renders all the ratings on the page.
         *
         * @param bool $pElement
         */
        public function rw_attach_rating_js($pElement = false)
        {
            if (RWLogger::IsOn()) {
                $params = func_get_args();
                RWLogger::LogEnterence('rw_attach_rating_js', $params);
            }
            $rw_settings = array('blog-post' => array('options' => WP_RW__BLOG_POSTS_OPTIONS), 'front-post' => array('options' => WP_RW__FRONT_POSTS_OPTIONS), 'comment' => array('options' => WP_RW__COMMENTS_OPTIONS), 'page' => array('options' => WP_RW__PAGES_OPTIONS), 'activity-update' => array('options' => WP_RW__ACTIVITY_UPDATES_OPTIONS), 'activity-comment' => array('options' => WP_RW__ACTIVITY_COMMENTS_OPTIONS), 'new-forum-post' => array('options' => WP_RW__ACTIVITY_FORUM_POSTS_OPTIONS), 'new-blog-post' => array('options' => WP_RW__ACTIVITY_BLOG_POSTS_OPTIONS), 'new-blog-comment' => array('options' => WP_RW__ACTIVITY_BLOG_COMMENTS_OPTIONS), 'forum-post' => array('options' => WP_RW__ACTIVITY_FORUM_POSTS_OPTIONS), 'forum-reply' => array('options' => WP_RW__ACTIVITY_FORUM_POSTS_OPTIONS), 'user' => array('options' => WP_RW__USERS_OPTIONS), 'user-post' => array('options' => WP_RW__USERS_POSTS_OPTIONS), 'user-page' => array('options' => WP_RW__USERS_PAGES_OPTIONS), 'user-comment' => array('options' => WP_RW__USERS_COMMENTS_OPTIONS), 'user-activity-update' => array('options' => WP_RW__USERS_ACTIVITY_UPDATES_OPTIONS), 'user-activity-comment' => array('options' => WP_RW__USERS_ACTIVITY_COMMENTS_OPTIONS), 'user-forum-post' => array('options' => WP_RW__USERS_FORUM_POSTS_OPTIONS));
            foreach ($this->_extensions as $ext) {
                $ext_settings = $ext->GetSettings();
                foreach ($ext_settings as $type => $options) {
                    $rw_settings[$options['class']] = array('options' => $options['options']);
                }
            }
            $attach_js = false;
            $criteria_suffix_part = '-criteria';
            if (is_array(self::$ratings) && count(self::$ratings) > 0) {
                foreach (self::$ratings as $urid => $data) {
                    $rclass = $data['rclass'];
                    if (RWLogger::IsOn()) {
                        RWLogger::Log('rw_attach_rating_js', 'Urid = ' . $urid . '; Class = ' . $rclass . ';');
                    }
                    $suffix_pos = strpos($rclass, $criteria_suffix_part);
                    if (false !== $suffix_pos) {
                        /* Use dummy value for the criteria options but
                         * use the settings of the summary rating when
                         * calling RW.initClass below
                         */
                        $rw_settings[$rclass] = 'DUMMY';
                        /*
                         * Make sure that the following code (the if block) will have the main option class, e.g. blog-post,
                         * and not the criterion class, e.g. blog-post-criteria-1. This is because the following
                         * code needs the main option class in order to load the type (blog, page, etc.) settings which include
                         * the themes and other display options. A criterion rating will use these display options,
                         * so this code extracts the main option class from the criterion class.
                         */
                        $rclass = substr($rclass, 0, $suffix_pos);
                    }
                    if (isset($rw_settings[$rclass]) && is_array($rw_settings[$rclass]) && !isset($rw_settings[$rclass]['enabled'])) {
                        if (RWLogger::IsOn()) {
                            RWLogger::Log('rw_attach_rating_js', 'Class = ' . $rclass . ';');
                        }
                        // Forum reply should have exact same settings as forum post.
                        $alias = 'forum-reply' === $rclass ? 'forum-post' : $rclass;
                        $rw_settings[$rclass]['enabled'] = true;
                        // Get rating front posts settings.
                        $rw_settings[$rclass]['options'] = $this->GetOption($rw_settings[$rclass]['options']);
                        /*
                         * We don't want to display the number of votes when the comment rating mode is "Review" or "Admin-only ratings".
                         * So we're modifying the rating label so that it will be based on the vote. e.g.: 5-star vote = "Excellent".
                         */
                        if ('comment' === $rclass && ($this->is_comment_review_mode() || $this->is_comment_admin_ratings_mode())) {
                            $options = $rw_settings[$rclass]['options'];
                            if (!isset($options->label)) {
                                $options->label = new stdClass();
                            }
                            if (!isset($options->label->text)) {
                                $options->label->text = new stdClass();
                            }
                            if (!isset($options->label->text->star)) {
                                $options->label->text->star = new stdClass();
                            }
                            if (!isset($options->label->text->nero)) {
                                $options->label->text->nero = new stdClass();
                            }
                            /**
                             * The following will show the same label when the rating is not empty whether the viewer has already voted or has not voted yet.
                             *
                             * e.g.: Instead of showing "Rate this (2 Votes)" or "5 Votes", the label will be "Excellent", "Good", or "Awful", depending on the label settings.
                             */
                            $options->label->text->star->normal = '{{rating.lastVote}}';
                            $options->label->text->star->rated = '{{rating.lastVote}}';
                            $options->label->text->nero->rated = '{{rating.lastVote}}';
                            $options->label->text->nero->normal = '{{text.rateThis}}';
                            $options->showToolip = false;
                            $options->showReport = false;
                        }
                        if (WP_RW__AVAILABILITY_DISABLED === $this->rw_validate_availability($alias)) {
                            // Disable ratings (set them to be readOnly).
                            $rw_settings[$rclass]['options']->readOnly = true;
                        }
                        $attach_js = true;
                    }
                }
            }
            $is_bp_activity_component = function_exists('bp_is_activity_component') && bp_is_activity_component();
            if (!$attach_js) {
                // Necessary for rendering newly inserted activity ratings
                // when the are no status updates or comments yet
                if ($is_bp_activity_component) {
                    $bp_rclasses = array('activity-update', 'activity-comment');
                    foreach ($bp_rclasses as $rclass) {
                        if (isset($rw_settings[$rclass]) && !isset($rw_settings[$rclass]['enabled'])) {
                            if (RWLogger::IsOn()) {
                                RWLogger::Log('rw_attach_rating_js', 'Class = ' . $rclass . ';');
                            }
                            $rw_settings[$rclass]['enabled'] = true;
                            // Get rating class settings.
                            $rw_settings[$rclass]['options'] = $this->GetOption($rw_settings[$rclass]['options']);
                            if (WP_RW__AVAILABILITY_DISABLED === $this->rw_validate_availability($rclass)) {
                                // Disable ratings (set them to be readOnly).
                                $rw_settings[$rclass]['options']->readOnly = true;
                            }
                            $attach_js = true;
                        }
                    }
                }
            }
            if ($attach_js || $this->_TOP_RATED_WIDGET_LOADED) {
                ?>
					<!-- This site's ratings are powered by RatingWidget plugin v<?php 
                echo WP_RW__VERSION;
                ?>
 - https://rating-widget.com/wordpress-plugin/ -->
					<div class="rw-js-container">
						<?php 
                if (rw_fs()->_has_addons()) {
                    rw_wf()->print_site_script();
                }
                ?>
						<script type="text/javascript">

							// Initialize ratings.
							function RW_Async_Init(){
								RW.init({<?php 
                // User key (uid).
                echo 'uid: "' . $this->account->site_public_key . '"';
                // User id (huid).
                if ($this->account->has_site_id()) {
                    echo ', huid: "' . $this->account->site_id . '"';
                }
                global $pagenow;
                $vid = 0;
                // Only set the vid to 1 if the comment ratings mode is set to "Admin ratings only".
                if ('comment.php' === $pagenow && $this->is_comment_admin_ratings_mode()) {
                    $vid = 1;
                } else {
                    // User logged-in.
                    $user = wp_get_current_user();
                    $vid = $user->ID;
                }
                if ($vid !== 0) {
                    // Set voter id to logged user id.
                    echo ", vid: {$vid}";
                }
                ?>
,
									source: "wordpress",
									options: {
									<?php 
                ?>
								},
								identifyBy: "<?php 
                echo $this->GetOption(WP_RW__IDENTIFY_BY);
                ?>
"
							});
							<?php 
                foreach ($rw_settings as $rclass => $options) {
                    $criteria_class = $rclass;
                    $suffix_pos = strpos($rclass, $criteria_suffix_part);
                    if (false !== $suffix_pos) {
                        $rclass = substr($rclass, 0, $suffix_pos);
                    }
                    if (isset($rw_settings[$rclass]['enabled']) && true === $rw_settings[$rclass]['enabled']) {
                        $alias = 'forum-reply' === $rclass ? 'forum-post' : $rclass;
                        ?>
							var options = <?php 
                        echo !empty($rw_settings[$alias]['options']) ? json_encode($rw_settings[$rclass]['options']) : '{}';
                        ?>
;
							<?php 
                        echo $this->GetCustomSettings($alias);
                        ?>
							<?php 
                        if (rw_fs()->_has_addons()) {
                            ?>
								if ( WF_Engine ) {
									var _beforeRate = options.beforeRate ? options.beforeRate : false;
									options.beforeRate = function(rating, score) {
										var returnValue = true;
										if (false !== _beforeRate) {
											returnValue = _beforeRate(rating, score);
										}

										return WF_Engine.eval( 'beforeVote', rating, score, returnValue );
									};

									var _afterRate = options.afterRate ? options.afterRate : false;
									options.afterRate = function(success, score, rating) {
										if (false !== _afterRate) {
											_afterRate(success, score, rating);
										}

										WF_Engine.eval( 'afterVote', rating, score );

										return true;
									};
								}
							<?php 
                        }
                        ?>
									
							RW.initClass("<?php 
                        echo $criteria_class;
                        ?>
", options);
							<?php 
                    }
                }
                foreach (self::$ratings as $urid => $data) {
                    if (is_string($data['title']) && !empty($data['title']) || is_string($data['permalink']) && !empty($data['permalink']) || isset($data['img'])) {
                        $properties = array();
                        if (is_string($data['title']) && !empty($data['title'])) {
                            $properties[] = 'title: ' . json_encode(esc_js($data['title']));
                        }
                        if (is_string($data['permalink']) && !empty($data['permalink'])) {
                            $properties[] = 'url: ' . json_encode(esc_js($data['permalink']));
                        }
                        if (isset($data['img'])) {
                            $properties[] = 'img: ' . json_encode(esc_js($data['img']));
                        }
                        echo 'RW.initRating("' . $urid . '", {' . implode(', ', $properties) . '});';
                    }
                }
                ?>
							RW.render(function() {
								(function($) {
									$('.rw-rating-table:not(.rw-no-labels):not(.rw-comment-admin-rating)').each(function() {
										var ratingTable = $(this);

										// Find the current width before floating left or right to
										// keep the ratings aligned
										var col1 = ratingTable.find('td:first');
										var widthCol1 = col1.width();
										ratingTable.find('td:first-child').width(widthCol1);

										if (ratingTable.hasClass('rw-rtl')) {
											ratingTable.find('td').css({float: 'right'});
										} else {
											ratingTable.find('td').css({float: 'left'});
										}
									});
								})(jQuery);
							}, <?php 
                echo !$this->_TOP_RATED_WIDGET_LOADED ? 'true' : 'false';
                ?>
);
							}

							RW_Advanced_Options = {
								blockFlash: !(<?php 
                $flash = $this->GetOption(WP_RW__FLASH_DEPENDENCY, true);
                echo in_array($flash, array('true', 'false')) ? $flash : (false === $flash ? 'false' : 'true');
                ?>
)
							};

							// Append RW JS lib.
							if (typeof(RW) == "undefined"){
								(function(){
									var rw = document.createElement("script");
									rw.type = "text/javascript"; rw.async = true;
									rw.src = "<?php 
                echo rw_get_js_url('external' . (!WP_RW__DEBUG ? '.min' : '') . '.php');
                ?>
?wp=<?php 
                echo WP_RW__VERSION;
                ?>
";
									var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(rw, s);
								})();
							}
						</script>
					</div>
					<!-- / RatingWidget plugin -->
					<?php 
                // Enqueue the script that will handle the rendering
                // of the rating of the newly inserted BuddyPress status update
                // or comment
                if ($is_bp_activity_component) {
                    rw_enqueue_script('rw-site-ajax-handler', WP_RW__PLUGIN_URL . 'resources/js/site-ajax-handler.js');
                }
            }
        }
if (!defined('ABSPATH')) {
    exit;
}
// Retrieve available add-on settings tabs and their form fields.
$addons_settings_tab = apply_filters('rw_wf_addons_settings_tab', array());
// Get the selected add-on tab
$selected_key = '';
if (isset($_GET['add-on']) && !empty($_GET['add-on'])) {
    $selected_key = $_GET['add-on'];
} else {
    // If there is no selected add-on tab, select the first tab.
    $tab_keys = array_keys($addons_settings_tab);
    $selected_key = $tab_keys[0];
}
// Retrieve all add-ons' settings.
$addons_settings = rw_wf()->get_addons_settings();
if (false !== $addons_settings && isset($addons_settings->{$selected_key})) {
    $selected_addon_settings = $addons_settings->{$selected_key};
} else {
    $selected_addon_settings = new stdClass();
}
?>
<div class="wrap rw-dir-ltr rw-wp-container">
	<h2 class="nav-tab-wrapper rw-nav-tab-wrapper">
		<?php 
foreach ($addons_settings_tab as $tab_key => $tab_settings) {
    ?>
			<a href="<?php 
    echo esc_url(add_query_arg(array('add-on' => $tab_key)));
    ?>
"
,
	currentPost: <?php 
echo json_encode(get_post());
?>
,
	currentPostCategories: <?php 
echo json_encode(get_the_category());
?>
,
	currentUserId: <?php 
echo json_encode(get_current_user_id());
?>
,
	actions: {}
};

<?php 
$active_actions = rw_wf()->get_active_actions();
if (!empty($active_actions)) {
    foreach ($active_actions as $action_id) {
        do_action('init_workflow_action', $action_id);
    }
}
?>
	
<?php 
do_action('rw_wf_after_init_engine_options');
?>

var WF_Engine = new Class_WF_Engine( engineOptions, jQuery );
</script>