public static function getView ( GD_ReportConfig $ReportConfig, array $options = array() ) {
        $widget = 'GD_Widget'.ucwords($ReportConfig->getDisplayType());
        if ( class_exists($widget) ) {
            $w = new $widget($ReportConfig);
        } else {
            throw new Exception($widget.' does not exist.');
        }

        return $w->getView($options);
    }
    public function getConfig($report) {
        $id = null;
        if ( !empty($report->nid) ) {
            $id = $report->nid;
        } else if ( !empty($report->id) ) {
            $id = $report->id;
        }

        if (isset($id) && isset(self::$configList[$id])) {
            return self::$configList[$id];
        } else {
            $conf = null;
            if ( !empty($report->nid) && !is_null($report->nid) ) {
                $config = json_decode(trim(get_node_field_value($report,'field_report_conf')), true);
                $conf = new GD_ReportConfig($config);
                $conf->setNode($report);
                $conf->setDescription(get_node_field_value($report,'field_report_desc'));
                $conf->setTitle($report->title);
            } else {
                if (is_array($report->config)) {
                    $config = $report->config;
                    $conf = new GD_ReportConfig($config);
                    if (!empty($report->style)) {
                        $conf->setStyle($report->style);
                    } else {
                        $conf->setStyle('');
                    }
                    if (isset($report->title)) {
                        $conf->setTitle($report->title);
                    }
                } else {
                    $config = json_decode(trim($report->config), true);
                    $conf = new GD_ReportConfig($config['config']);
                    if ( !empty($report->style) ) {
                        $conf->setStyle($report->style);
                    } else {
                        $conf->setStyle('');
                    }
                }
            }

            if (isset($id)) {
                $conf->setId($id);
                self::$configList[$id] = $conf;
            }
            return $conf;
        }
    }
    public function updateReportConfig ( GD_ReportConfig $ReportConfig ) {

        // signal dashboard
        $ReportConfig->setDashboard(isset($this->id) ? $this->id : true);

        // apply drilldowns
        foreach ( $this->drilldowns as $d ) {
            if ( $d->report == $ReportConfig->getId() ) {
                foreach ($d->filters as $k => $f) {
                    $add = false;
                    foreach ($ReportConfig->getFilters() as $f2) {
                        if ( $f == $f2->name && $f2->exposed ) {
                            $add = true;
                            break;
                        }
                    }

                    if (!$add) {
                        unset($d->filters[$k]);
                    }
                }
                $ReportConfig->addDrilldown($d);
            }
        }

        // apply filters
        $f = $this->getFilters();
        if ( !empty($f) && count($ReportConfig->getFilters()) ) {
            // this has the filter list
            foreach ($f as $dashboard_filter) {
                // find corresponding report filter
                foreach ( $ReportConfig->getFilters() as $report_filter ) {
                    if ( $dashboard_filter->name == $report_filter->name && $report_filter->exposed) {
                        $ReportConfig->updateFilterValue($report_filter->name, $report_filter->exposed, $dashboard_filter);
                    }
                }
            }
        }
    }