/**
  * setup widget feature
  * @call HW_AWC call from method HW_AWC/_hw_awc_in_widget_form
  * @param WP_Widget $widget
  */
 public static function setup_features_widgets(WP_Widget $widget)
 {
     static $active_features_widgets;
     if (empty($active_features_widgets)) {
         $active_features_widgets = hw_get_setting(array(self::SETTINGS_GROUP, 'active_features_widgets'), array());
     }
     foreach ($active_features_widgets as $item) {
         if (isset($item['active']) && strtolower($item['active']) == 'on' && $item['widget'] == $widget->id_base) {
             HW_AWC_WidgetFeatures::register_widget_feature($widget, $item['feature']);
             //_print($widget->id_base);
             //break;    //please do not break because one widget has more than one feature
         }
     }
 }
 /**
  * load option grid posts
  * @param WP_Widget $t: widget object
  * @param array $instance: widget data
  */
 function do_widget_feature($t, $instance = array())
 {
     $this->widget_instance = $instance;
     //maybe update widget instance
     //$wf_name = $this->get_widget_feature_name('');
     //list registered sidebars
     $sidebars = hwawc_get_active_sidebars_select();
     $sidebar_skins = HW_AWC_Sidebar_Settings::available_widget_skins(true);
     //sidebar skins
     //saved widget configs by specifying group
     $widgetconfig_groups = AWC_WidgetFeature_saveconfig::get_widgets_settings_select(' WHERE _group="' . self::WIDGET_CONFIG_GROUP . '"');
     //HW_UI_Component::build_select_tag($sidebars, '', '');
     echo '<div class="form-wf-shortcode-params" id="' . $this->get_field_id('wfshortcode_container') . '"><fieldset><legend>Tạo shortcode widget</legend>';
     echo '<input type="hidden" class="widget_class" name="' . $this->get_field_name('widget_class') . '" id="' . $this->get_field_id('widget_class') . '" value="' . get_class($t) . '"/>';
     echo '<input type="hidden" class="widget_instance" name="' . $this->get_field_name('widget_instance') . '" id=" ' . $this->get_field_id('widget_instance') . ' " value="' . base64_encode(serialize($instance)) . '"/>';
     //apply widget to sidebar
     echo '<p><label for="' . $this->get_field_id('sidebar') . '">Chọn Sidebar</label><br/>';
     echo '<select class="hw-select sidebar" name="' . $this->get_field_name('sidebar') . '" id="' . $this->get_field_id('sidebar') . '">';
     foreach ($sidebars as $id => $name) {
         $selected = selected($this->get_field_value('sidebar'), $id, false);
         printf('<option value="%s" %s>%s</option>', $id, $selected, $name);
     }
     echo '</select></p>';
     //choose sidebar skin
     echo '<p><label for="' . $this->get_field_id('sidebar_skin') . '">Chọn giao diện Sidebar</label><br/>';
     echo HW_UI_Component::build_select_tag($sidebar_skins, null, array('name' => $this->get_field_name('sidebar_skin'), 'id' => $this->get_field_id('sidebar_skin'), 'class' => 'sidebar_skin'));
     echo '</select></p>';
     //widget config group
     echo '<p><label for="' . $this->get_field_id('config_group') . '">Chọn widget config</label><br/>';
     echo '<select class="config_group" name=" ' . $this->get_field_name('config_group') . ' " id="' . $this->get_field_id('config_group') . '">';
     foreach ($widgetconfig_groups as $id => $text) {
         $selected = selected($this->get_field_value('config_group'), $id, false);
         printf('<option value="%s" %s>%s</option>', $id, $selected, $text);
     }
     echo '</select>';
     echo '<a href="javascript:void(0)" onclick="__awc_feature_shortcode_params.refresh_saved_widgetsconfig(this,\'' . $this->get_field_id('config_group') . '\')">Refresh</a>';
     //you also should be active saveconfig feature
     if (!HW_AWC_WidgetFeatures::check_widget_feature($t, 'saveconfig')) {
         echo '<div>Bạn cũng cần kích hoạt feature "<a href="' . admin_url('options-general.php?page=' . HW_HOANGWEB_Settings::HW_SETTINGS_PAGE) . '" target="_blank">saveconfig</a>" cho widget này.</div>';
     }
     echo '</p>';
     echo '<a href="javascript:void(0)" onclick="__awc_feature_shortcode_params.generate_shortcode(this,jQuery(\'#' . $this->get_field_id('wfshortcode_container') . '\'))" class="button">Tạo shortcode</a>';
     echo '<div></div>';
     echo '<p><em>Hướng dẫn</em>: Sử dụng tính năng "Lưu cài đặt" ở tại widget này để lưu cấu hình của widget (chọn nhóm "Shortcode Widget")</p>';
     echo '</fieldset></div>';
 }
 /**
  * register widget fields feature
  * @param $widget: widget instance
  * @param $feature: give feature name by hoangweb
  */
 public static function register_widget_feature($widget, $feature)
 {
     if (!isset(self::$widgets_fields[$feature])) {
         self::$widgets_fields[$feature] = array();
     }
     $register_features = HW_AWC_WidgetFeatures::get_all_features();
     //get all register features
     //load widget feature from enternal
     $class = self::get_feature_class_byName($feature);
     //'AWC_WidgetFeature_' . $feature;
     if (class_exists($class)) {
         $class = new $class($widget, array());
         $class->feature_name = $feature;
         //widget feature identifier
         $class->feature_url = HW_AWC_WidgetFeatures_URL . '/' . $feature;
         $class->feature_path = HW_AWC_WidgetFeatures_PATH . '/' . $feature;
         $class->option('feature_alias', $register_features[$feature]);
         //set static options
         $class->_static_option('feature_name', $class->feature_name);
         $class->_static_option('feature_url', $class->feature_url);
         $class->_static_option('feature_path', $class->feature_path);
         $class->feature_loaded();
         //add widget feature to manager
         HW_Widget_Features_Setting::add_widget_feature($feature, $class);
         self::_setup_actions($class);
     }
     //prevent to duplicate widgets in one feature ($widget->id_base)
     self::$widgets_fields[$feature][$widget->id_base . '-' . $widget->number] = array('widget' => $widget, 'class' => $class);
 }
 /**
  * add module tab menu
  * @param $module
  * @param $menu
  */
 public static function add_feature_tab_submenu_page($feature, $menu)
 {
     //valid
     if (!HW_AWC_WidgetFeatures::get_features_data($feature)) {
         return;
     }
     //module not found
     if (!isset(self::$menus[$feature]['features_tab_menus'])) {
         self::$menus[$feature]['features_tab_menus'] = array();
     }
     if (!isset(self::$menus[$feature]['features_tab_menus'][$feature])) {
         self::$menus[$feature]['features_tab_menus'][$feature] = $menu;
     }
 }
 /**
  * custom widget callback
  */
 public function _hw_custom_widget_callback_function()
 {
     global $wp_registered_widgets;
     $original_callback_params = func_get_args();
     $widget_id = $original_callback_params[0]['widget_id'];
     $widget_obj = $wp_registered_widgets[$widget_id];
     $original_callback = $widget_obj['original_callback'];
     $wp_registered_widgets[$widget_id]['callback'] = $original_callback;
     //widget object
     $widget = $widget_obj['original_callback'][0];
     $widget_opt = get_option($widget_obj['original_callback'][0]->option_name);
     $widget_num = $widget_obj['params'][0]['number'];
     $instance = $widget_opt[$widget_num];
     //get current widget instance
     $widget_id_base = $wp_registered_widgets[$widget_id]['callback'][0]->id_base;
     //do widget features
     #$features = array('fixed_widget');
     /*$feature = HW_AWC::get_widget_feature($widget, 'fancybox');
       if($feature && HW_AWC::check_widget_feature($widget, 'fancybox') && $feature->is_active($instance) ) {
           if(method_exists($feature, 'do_widget_feature_frontend')) {
               $feature->do_widget_feature_frontend($widget, $instance);
           }
       }*/
     $all_features = HW_AWC_WidgetFeatures::get_all_features();
     $widgets_fields = HW_AWC_WidgetFeatures::get_features_data();
     foreach ($all_features as $name => $text) {
         if (isset($widgets_fields[$name]) && is_array($widgets_fields[$name])) {
             foreach ($widgets_fields[$name] as $widg) {
                 if ($widget == $widg['widget'] || $widg['widget']->id_base == $widget->id_base && $widg['widget']->number == $widget->number) {
                     $feature = $widg['class'];
                     $active = true;
                     if (method_exists($feature, 'is_active')) {
                         //check active widget feature
                         $active = $feature->is_active($instance);
                     }
                     if ($active && method_exists($feature, 'do_widget_feature_frontend')) {
                         $feature->do_widget_feature_frontend($widget, $instance);
                     }
                 }
             }
         }
     }
     if (is_callable($original_callback)) {
         ob_start();
         call_user_func_array($original_callback, $original_callback_params);
         $widget_output = ob_get_clean();
         echo apply_filters('hw_widget_output', $widget_output, $widget_id_base, $widget_id);
     }
 }
 /**
  * @hook hw_sidebars_widgets
  * @param $sidebars
  */
 public static function _sidebars_widgets($sidebars)
 {
     if (is_admin()) {
         return $sidebars;
     }
     global $wp_registered_widgets;
     foreach ($sidebars as $s => $sidebar) {
         if ($s == 'wp_inactive_widgets' || strpos($s, 'orphaned_widgets') === 0 || empty($sidebar)) {
             continue;
         }
         foreach ($sidebar as $w => $widget) {
             // $widget is the id of the widget
             if (!isset($wp_registered_widgets[$widget])) {
                 continue;
             }
             if (isset(self::$checked[$widget])) {
                 $show = self::$checked[$widget];
             } else {
                 $widget_info = HW_AWC::get_widget_data($widget);
                 $opts = $wp_registered_widgets[$widget];
                 $widget_obj = isset($widget_info['widget']) ? $widget_info['widget'] : null;
                 $id_base = isset($widget_info['id_base']) ? $widget_info['id_base'] : '';
                 #$id_base = is_array( $opts['callback'] ) ? $opts['callback'][0]->id_base : $opts['callback'];
                 if (!$id_base) {
                     continue;
                 }
                 $feature = HW_AWC::get_widget_feature($widget, self::_static_option('feature_name'));
                 #
                 if (!$feature || HW_AWC_WidgetFeatures::check_widget_feature($widget, self::_static_option('feature_name') && !$feature->is_active())) {
                     continue;
                 }
                 #$instance = get_option( 'widget_' . $id_base );
                 $instance = $widget_info['instance'];
                 if (!$instance || !is_array($instance)) {
                     continue;
                 }
                 //from 'display widgets' plugin
                 if (isset($instance['_multiwidget']) && $instance['_multiwidget']) {
                     $number = $opts['params'][0]['number'];
                     if (!isset($instance[$number])) {
                         continue;
                     }
                     $instance = $instance[$number];
                     unset($number);
                 }
                 unset($opts);
                 $show = self::show_widget($feature, $instance);
                 self::$checked[$widget] = $show ? true : false;
             }
             if (!$show) {
                 unset($sidebars[$s][$w]);
                 #$this->hide_list[] = "['$s'][$w]";
             }
             unset($widget);
         }
         unset($sidebar);
     }
     return $sidebars;
 }