/**
     * display plugin row
     */
    public function display_rows()
    {
        $plugins_allowedtags = array('a' => array('href' => array(), 'title' => array(), 'target' => array()), 'abbr' => array('title' => array()), 'acronym' => array('title' => array()), 'code' => array(), 'pre' => array(), 'em' => array(), 'strong' => array(), 'ul' => array(), 'ol' => array(), 'li' => array(), 'p' => array(), 'br' => array());
        $plugins_group_titles = array('Performance' => _x('Performance', 'Plugin installer group title'), 'Social' => _x('Social', 'Plugin installer group title'), 'Tools' => _x('Tools', 'Plugin installer group title'));
        $group = null;
        foreach ((array) $this->items as $plugin) {
            if (is_object($plugin)) {
                $plugin = (array) $plugin;
            }
            if (isset($plugin['desc'])) {
                $plugin['description'] = $plugin['desc'];
            } else {
                $plugin['description'] = '';
            }
            //author
            if (!isset($plugin['author'])) {
                $plugin['author'] = 'Hoangweb';
            }
            // Display the group heading if there is one
            /*if ( isset( $plugin['group'] ) && $plugin['group'] != $group ) {
            				if ( isset( $this->groups[ $plugin['group'] ] ) ) {
            					$group_name = $this->groups[ $plugin['group'] ];
            					if ( isset( $plugins_group_titles[ $group_name ] ) ) {
            						$group_name = $plugins_group_titles[ $group_name ];
            					}
            				} else {
            					$group_name = $plugin['group'];
            				}
            
            				// Starting a new group, close off the divs of the last one
            				if ( ! empty( $group ) ) {
            					echo '</div></div>';
            				}
            
            				echo '<div class="plugin-group"><h3>' . esc_html( $group_name ) . '</h3>';
            				// needs an extra wrapping div for nth-child selectors to work
            				echo '<div class="plugin-items">';
            
            				$group = $plugin['group'];
            			}*/
            $title = wp_kses($plugin['name'], $plugins_allowedtags);
            // Remove any HTML from the description.
            $description = strip_tags($plugin['description']);
            $version = wp_kses($plugin['version'], $plugins_allowedtags);
            $name = strip_tags($title . ' ' . $version);
            $author = wp_kses($plugin['author'], $plugins_allowedtags);
            if (!empty($author)) {
                $author = ' <cite>' . sprintf(__('By %s'), $author) . '</cite>';
            }
            $action_links = array();
            if (current_user_can('install_plugins') || current_user_can('update_plugins')) {
                $status = _install_plugin_install_status($plugin);
                $nonce = wp_create_nonce('install-module_' . $plugin['slug']);
                $status['url'] = '?page=hw_install_module&action=install-module&module=' . $plugin['slug'] . '&_wpnonce=' . $nonce;
                //by hoangweb
                switch ($status['status']) {
                    case 'install':
                        if ($status['url']) {
                            /* translators: 1: Plugin name and version. */
                            $action_links[] = '<a class="install-now button" data-slug="' . esc_attr($plugin['slug']) . '" href="' . esc_url($status['url']) . '" aria-label="' . esc_attr(sprintf(__('Install %s now'), $name)) . '" data-name="' . esc_attr($name) . '">' . __('Install Now') . '</a>';
                        }
                        break;
                    case 'update_available':
                        if ($status['url']) {
                            /* translators: 1: Plugin name and version */
                            $action_links[] = '<a class="update-now button" data-plugin="' . esc_attr($status['file']) . '" data-slug="' . esc_attr($plugin['slug']) . '" href="' . esc_url($status['url']) . '" aria-label="' . esc_attr(sprintf(__('Update %s now'), $name)) . '" data-name="' . esc_attr($name) . '">' . __('Update Now') . '</a>';
                        }
                        break;
                    case 'latest_installed':
                    case 'newer_installed':
                        $action_links[] = '<span class="button button-disabled" title="' . esc_attr__('This plugin is already installed and is up to date') . ' ">' . _x('Installed', 'plugin') . '</span>';
                        break;
                }
            }
            $details_link = HW_ADMIN_URL . ('/module-install.php?tab=module-information&amp;module=' . $plugin['slug'] . '&amp;TB_iframe=true&amp;width=600&amp;height=550&_root=' . base64_encode(ABSPATH));
            //$module_info = HW_ADMIN_URL. '/module-install.php?tab=module-information&module='.$module['slug'].'&TB_iframe=true&width=772&height=641&_root='. base64_encode((ABSPATH));
            /* translators: 1: Plugin name and version. */
            $action_links[] = '<a href="' . esc_url($details_link) . '" class="thickbox" aria-label="' . esc_attr(sprintf(__('More information about %s'), $name)) . '" data-title="' . esc_attr($name) . '">' . __('More Details') . '</a>';
            if (!empty($plugin['icons']['svg'])) {
                $plugin_icon_url = $plugin['icons']['svg'];
            } elseif (!empty($plugin['icons']['2x'])) {
                $plugin_icon_url = $plugin['icons']['2x'];
            } elseif (!empty($plugin['icons']['1x'])) {
                $plugin_icon_url = $plugin['icons']['1x'];
            } else {
                if (!empty($plugin['icons']['default'])) {
                    $plugin_icon_url = $plugin['icons']['default'];
                } else {
                    $plugin_icon_url = HW_HOANGWEB_IMAGES . '/module-box.png';
                }
            }
            /**
             * Filter the install action links for a plugin.
             *
             * @since 2.7.0
             *
             * @param array $action_links An array of plugin action hyperlinks. Defaults are links to Details and Install Now.
             * @param array $plugin       The plugin currently being listed.
             */
            $action_links = apply_filters('hw_module_install_action_links', $action_links, $plugin);
            $date_format = __('M j, Y @ H:i');
            //$last_updated_timestamp = strtotime( $plugin['last_updated'] );
            ?>
		<div class="plugin-card module-box module-repository plugin-card-<?php 
            echo sanitize_html_class($plugin['slug']);
            ?>
">
			<div class="plugin-card-top">
				<a href="<?php 
            echo esc_url($details_link);
            ?>
" class="thickbox plugin-icon"><img src="<?php 
            echo esc_attr($plugin_icon_url);
            ?>
" /></a>
				<div class="name column-name">
					<h4><a href="<?php 
            echo esc_url($details_link);
            ?>
" class="thickbox"><?php 
            echo $title;
            ?>
</a></h4>
				</div>
				<div class="action-links">
					<?php 
            if ($action_links) {
                echo '<ul class="plugin-action-buttons"><li>' . implode('</li><li>', $action_links) . '</li></ul>';
            }
            ?>
				</div>
				<div class="desc column-description">
					<p><?php 
            echo $description;
            ?>
</p>
					<p class="authors"><?php 
            echo $author;
            ?>
</p>
				</div>
			</div>
			<div class="plugin-card-bottom">
				<div class="vers column-rating">

				</div>
				<div class="column-updated">

				</div>
				<div class="column-downloaded">

				</div>

			</div>
		</div>
		<?php 
        }
        // Close off the group divs of the last one
        /*if ( ! empty( $group ) ) {
        			echo '</div></div>';
        		}*/
    }
/**
 * Display plugin information in dialog box form.
 * @hook install_plugins_pre_plugin-information
 */
function hw_install_module_information()
{
    global $tab;
    if (empty($_REQUEST['module'])) {
        return;
    }
    $api = modules_api('module_information', array('slug' => wp_unslash($_REQUEST['module']), 'is_ssl' => is_ssl(), 'fields' => array('banners' => true, 'reviews' => true, 'downloaded' => false, 'active_installs' => true)));
    //for testing
    $api = (object) array('name' => 'HW YARPP', 'version' => '1.0', 'author' => 'hoangweb', 'slug' => 'hw-yarpp', 'last_updated' => time());
    if (is_wp_error($api)) {
        wp_die($api);
    }
    $plugins_section_titles = array('description' => _x('Description', 'Plugin installer section title'), 'installation' => _x('Installation', 'Plugin installer section title'));
    $section = 'description';
    // Default to the Description tab,
    $_tab = 'plugin-information';
    //esc_attr( $tab ); because avaiable exists css for 'plugin-information'
    iframe_header(__('HW Module Install'));
    echo '<div id="plugin-information-scrollable">';
    echo "<div id='{$_tab}-title' class=''><div class='vignette'></div><h2>{$api->name}</h2></div>";
    //tabs
    echo "<div id='{$_tab}-tabs' class=''>\n";
    echo "<a href='#' class=''>Tab</a>";
    echo "<a href='#' class=''>Tab 1</a>";
    echo "</div>\n";
    $date_format = __('M j, Y @ H:i');
    $last_updated_timestamp = strtotime($api->last_updated);
    ?>
    <div id="<?php 
    echo $_tab;
    ?>
-content" class='<?php 
    ?>
'>
        <!-- right info -->
        <div class="fyi">
            <ul>
    <?php 
    if (!empty($api->version)) {
        ?>
        <li><strong><?php 
        _e('Version:');
        ?>
</strong> <?php 
        echo $api->version;
        ?>
</li>
    <?php 
    }
    if (!empty($api->author)) {
        ?>
        <li><strong><?php 
        _e('Author:');
        ?>
</strong> <?php 
        echo links_add_target($api->author, '_blank');
        ?>
</li>
    <?php 
    }
    if (!empty($api->last_updated)) {
        ?>
        <li><strong><?php 
        _e('Last Updated:');
        ?>
</strong> <span title="<?php 
        echo esc_attr(date_i18n($date_format, $last_updated_timestamp));
        ?>
">
				<?php 
        printf(__('%s ago'), human_time_diff($last_updated_timestamp));
        ?>
			</span></li>
    <?php 
    }
    if (!empty($api->slug) && empty($api->external)) {
        ?>
        <li><a target="_blank" href="https://develop.hoangweb.com/plugins/<?php 
        echo $api->slug;
        ?>
/"><?php 
        _e('Hoangweb.com Plugin Page &#187;');
        ?>
</a></li>
    <?php 
    }
    ?>
            </ul>
        </div>
        <!-- tabs content -->
        <div id="section-holder" class="wrap">
            <?php 
    if (!empty($api->sections)) {
        foreach ((array) $api->sections as $section_name => $content) {
            $content = links_add_base_url($content, 'https://develop.hoangweb.com/modules/' . $api->slug . '/');
            $content = links_add_target($content, '_blank');
            $san_section = esc_attr($section_name);
            $display = $section_name === $section ? 'block' : 'none';
            echo "\t<div id='section-{$san_section}' class='section' style='display: {$display};'>\n";
            echo $content;
            echo "\t</div>\n";
        }
    }
    ?>
        </div>
    </div>

<?php 
    echo '</div>';
    #plugin-information-scrollable
    echo "<div id='{$tab}-footer'>\n";
    if (!empty($api->download_link) && (current_user_can('install_plugins') || current_user_can('update_plugins'))) {
        $status = _install_plugin_install_status($api);
        switch ($status['status']) {
            case 'install':
                if ($status['url']) {
                    echo '<a class="button button-primary right" href="' . $status['url'] . '" target="_parent">' . __('Install Now') . '</a>';
                }
                break;
            case 'update_available':
                if ($status['url']) {
                    echo '<a data-slug="' . esc_attr($api->slug) . '" id="plugin_update_from_iframe" class="button button-primary right" href="' . $status['url'] . '" target="_parent">' . __('Install Update Now') . '</a>';
                }
                break;
        }
    }
    echo "</div>\n";
    iframe_footer();
    exit;
}