/**
  * get current class instance
  * @return HW_AWC_Frontend
  */
 public static function getInstance()
 {
     if (!self::$instance) {
         self::$instance = new self();
     }
     //create first of all instance
     return self::$instance;
 }
/**
 * custom dynamic sidebar for dynamic_sidebar() function
 * @param $name: sidebar id
 */
function hw_dynamic_sidebar($name)
{
    $name = apply_filters('hw_dynamic_sidebar', $name);
    $dynamic_settings = HW_AWC_Frontend::get_active_sidebars_settings();
    //_print($dynamic_settings);
    $pages_condition_and = array();
    $pages_condition_or = array();
    //match occurence condition
    $match_occurence = hw_get_setting('match_occurence', 'first_occurence');
    //get cache result for first
    $detect_addition_sidebar = false;
    $data = get_transient('hw_dynamic_sidebar');
    if (empty($data)) {
        $data = array();
    }
    #see: other way in includes/layout-templates/theme.php/HW__Template_Condition
    foreach ($dynamic_settings as $id => $setting) {
        $result = $result_or = array();
        //$and = APF_hw_condition_rules::parseQuery($setting['query_data_and']); //AND relation
        //$or = APF_hw_condition_rules::parseQuery($setting['query_data_or']);  //OR relation
        if (!empty($setting['query_data_and'])) {
            $_result = HW_AWC_Frontend::check_sidebar_changing($setting['query_data_and'], 'AND');
            list($k, $v) = each($_result);
            $result[] = array('template' => $k, 'result' => $v, 'setting' => $setting);
            //$result[$k]
            $pages_condition_and = array_merge($pages_condition_and, $result);
            //override page result for AND relation
        }
        if (!empty($setting['query_data_or'])) {
            $_result_or = HW_AWC_Frontend::check_sidebar_changing($setting['query_data_or'], 'OR');
            list($k, $v) = each($_result_or);
            $result_or[] = array('template' => $k, 'result' => $v, 'setting' => $setting);
            $pages_condition_or = array_merge($pages_condition_or, $result_or);
            //override page result for OR relation
        }
    }
    foreach (array($pages_condition_and, $pages_condition_or) as $pages_condition) {
        if (isset($pages_condition) && is_array($pages_condition)) {
            //get sidebar alternate with AND relation
            $key = base64_encode(serialize($pages_condition));
            if (!empty($data[$key])) {
                $name = $data[$key];
            } else {
                foreach ($pages_condition as $temp => $meet_condition) {
                    if ($meet_condition['result']) {
                        $_name = HW_Validation::valid_objname($name);
                        //get active sidebars
                        $sidebar = get_post_meta($meet_condition['setting']['post_ID'], $_name, true);
                        if (is_active_sidebar($sidebar)) {
                            //make sure sidebar not empty
                            if ($match_occurence == 'first_occurence' && !$detect_addition_sidebar || $match_occurence == 'last_occurence') {
                                $name = $sidebar;
                                //rename sidebar
                                $data[$key] = $name;
                                //save redirect sidebar name
                                $detect_addition_sidebar = true;
                                //detect append
                            }
                        }
                    }
                }
            }
        }
    }
    /*
    if(isset($pages_condition_and) && is_array($pages_condition_and)) {     //get sidebar alternate with AND relation
        $and_key = base64_encode(serialize($pages_condition_and));
        if(!empty($data[$and_key])) $name = $data[$and_key];
        else{
            foreach ($pages_condition_and as $temp => $meet_condition) {
                if($meet_condition['result']) {
                    $_name = HW_Validation::valid_objname($name);
                    //get active sidebars
                    $sidebar = get_post_meta($meet_condition['setting']['post_ID'], $_name, true);
                    if(is_active_sidebar($sidebar)) {   //make sure sidebar not empty
                        $name = $sidebar;   //rename sidebar
                        $data[$and_key] = $name;     //save redirect sidebar name
                        $detect_addition_sidebar = true;    //detect append
                    }
                }
            }
        }
    
    }
    if(isset($pages_condition_or) && is_array($pages_condition_or)) {   //get sidebar alternate with OR relation
        $or_key = base64_encode(serialize($pages_condition_or));
        if(!empty($data[$or_key])) {
            $name = $data[$or_key];
        }
        else {
            foreach ($pages_condition_or as $temp => $meet_condition) {
                if($meet_condition['result']) {
                    $_name = HW_Validation::valid_objname($name);
                    //get active sidebars
                    $sidebar = get_post_meta($meet_condition['setting']['post_ID'], $_name, true);
                    if(is_active_sidebar($sidebar)){    //make sure sidebar not empty
                        $name = $sidebar;   //rename sidebar
                        $data[$or_key] = $name;     //save redirect sidebar name
                        $detect_addition_sidebar = true;        //detect append
                    }
                }
            }
        }
    
    }
    */
    //cache result to database
    if ($detect_addition_sidebar == true) {
        set_transient('hw_dynamic_sidebar', $data);
    }
    dynamic_sidebar($name);
    //load sidebar
}