/**
 * Instantiates the plugin and setup all modules.
 *
 * @since 1.0.0
 */
function visualizer_launch()
{
    // setup environment
    define('VISUALIZER_BASEFILE', __FILE__);
    define('VISUALIZER_ABSURL', plugins_url('/', __FILE__));
    define('VISUALIZER_ABSPATH', dirname(__FILE__));
    if (!defined('VISUALIZER_CSV_DELIMITER')) {
        define('VISUALIZER_CSV_DELIMITER', ',');
    }
    if (!defined('VISUALIZER_CSV_ENCLOSURE')) {
        define('VISUALIZER_CSV_ENCLOSURE', '"');
    }
    // don't load the plugin if cron job is running or doing autosave
    $doing_autosave = defined('DOING_AUTOSAVE') && DOING_AUTOSAVE;
    $doing_cron = defined('DOING_CRON') && DOING_CRON;
    $doing_ajax = defined('DOING_AJAX') && DOING_AJAX;
    if ($doing_autosave || $doing_cron) {
        return;
    }
    // instantiate the plugin
    $plugin = Visualizer_Plugin::instance();
    // set general modules
    $plugin->setModule(Visualizer_Module_Setup::NAME);
    $plugin->setModule(Visualizer_Module_Sources::NAME);
    if ($doing_ajax) {
        // set ajax modules
        $plugin->setModule(Visualizer_Module_Chart::NAME);
    } else {
        if (is_admin()) {
            // set admin modules
            $plugin->setModule(Visualizer_Module_Admin::NAME);
        } else {
            // set frontend modules
            $plugin->setModule(Visualizer_Module_Frontend::NAME);
        }
    }
}