/**
  * Returns the list of experiments.
  *
  * If the experiments are not cached and it's the first time we call the
  * operation in a specific request, the function accesses AppEngine and
  * retrieves the list of experiments from there.
  *
  * @return array the list of experiments.
  *
  * @since 1.0.10
  */
 public static function get_experiments()
 {
     require_once NELIOAB_MODELS_DIR . '/goals/goals-manager.php';
     // Retrieve the experiments from the current static class
     if (self::$experiments) {
         return self::$experiments;
     }
     if (self::CACHE_ALL_EXPERIMENTS) {
         // If they are not yet loaded, retrieve them from the cache
         self::$experiments = get_option('nelioab_experiments', false);
         if (self::$experiments) {
             return self::$experiments;
         }
     }
     // If the cache does not yet contain the experiments, get them from AE
     require_once NELIOAB_UTILS_DIR . '/backend.php';
     $json_data = NelioABBackend::remote_get(sprintf(NELIOAB_BACKEND_URL . '/site/%s/exp', NelioABAccountSettings::get_site_id()));
     $json_data = json_decode($json_data['body']);
     self::$experiments = array();
     if (isset($json_data->items)) {
         foreach ($json_data->items as $json_exp) {
             /** @var NelioABExperiment $exp */
             $exp = NULL;
             $id = $json_exp->key->id;
             $type = NelioABExperiment::kind_to_type($json_exp->kind);
             switch ($type) {
                 case NelioABExperiment::POST_ALT_EXP:
                 case NelioABExperiment::PAGE_ALT_EXP:
                 case NelioABExperiment::PAGE_OR_POST_ALT_EXP:
                 case NelioABExperiment::CPT_ALT_EXP:
                     /** @var NelioABPostAlternativeExperiment $aux */
                     $aux = new NelioABPostAlternativeExperiment($id);
                     if (isset($json_exp->originalPost)) {
                         $aux->set_original($json_exp->originalPost);
                     }
                     $exp = $aux;
                     break;
                 case NelioABExperiment::HEADLINE_ALT_EXP:
                     /** @var NelioABHeadlineAlternativeExperiment $aux */
                     $aux = new NelioABHeadlineAlternativeExperiment($id);
                     if (isset($json_exp->originalPost)) {
                         $aux->set_original($json_exp->originalPost);
                     }
                     $exp = $aux;
                     break;
                 case NelioABExperiment::WC_PRODUCT_SUMMARY_ALT_EXP:
                     /** @var NelioABHeadlineAlternativeExperiment $aux */
                     $aux = new NelioABProductSummaryAlternativeExperiment($id);
                     if (isset($json_exp->originalPost)) {
                         $aux->set_original($json_exp->originalPost);
                     }
                     $exp = $aux;
                     break;
                 case NelioABExperiment::THEME_ALT_EXP:
                     $exp = new NelioABThemeAlternativeExperiment($id);
                     break;
                 case NelioABExperiment::CSS_ALT_EXP:
                     $exp = new NelioABCssAlternativeExperiment($id);
                     break;
                 case NelioABExperiment::WIDGET_ALT_EXP:
                     $exp = new NelioABWidgetAlternativeExperiment($id);
                     break;
                 case NelioABExperiment::MENU_ALT_EXP:
                     $exp = new NelioABMenuAlternativeExperiment($id);
                     break;
                 case NelioABExperiment::HEATMAP_EXP:
                     /** @var NelioABHeatmapExperiment $aux */
                     $aux = new NelioABHeatmapExperiment($id);
                     if (isset($json_exp->originalPost)) {
                         $aux->set_post_id($json_exp->originalPost);
                     }
                     $exp = $aux;
                     break;
             }
             if (!$exp) {
                 continue;
             }
             $exp->set_type($type);
             $exp->set_name($json_exp->name);
             $exp->set_status($json_exp->status);
             if (self::CACHE_ALL_EXPERIMENTS && $exp->get_status() == NelioABExperiment::STATUS_RUNNING) {
                 $exp = self::load_experiment_by_id($id, $type);
             }
             if (isset($json_exp->description)) {
                 $exp->set_description($json_exp->description);
             }
             if (isset($json_exp->creation)) {
                 try {
                     $exp->set_creation_date($json_exp->creation);
                 } catch (Exception $exception) {
                 }
             }
             if (isset($json_exp->start)) {
                 try {
                     $exp->set_start_date($json_exp->start);
                 } catch (Exception $exception) {
                 }
             }
             if (isset($json_exp->finalization)) {
                 try {
                     $exp->set_end_date($json_exp->finalization);
                 } catch (Exception $exception) {
                 }
             }
             if (isset($json_exp->daysFinished)) {
                 try {
                     $exp->set_days_since_finalization($json_exp->daysFinished);
                 } catch (Exception $exception) {
                 }
             }
             array_push(self::$experiments, $exp);
         }
     }
     if (self::CACHE_ALL_EXPERIMENTS) {
         update_option('nelioab_experiments', self::$experiments);
     }
     return self::$experiments;
 }
 public static function load($id)
 {
     $json_data = NelioABBackend::remote_get(NELIOAB_BACKEND_URL . '/exp/post/' . $id);
     $json_data = json_decode($json_data['body']);
     $exp = new NelioABPostAlternativeExperiment($json_data->key->id);
     $exp->set_name($json_data->name);
     if (isset($json_data->description)) {
         $exp->set_description($json_data->description);
     }
     $exp->set_type_using_text($json_data->kind);
     $exp->set_original($json_data->originalPost);
     if (isset($json_data->postType)) {
         $exp->set_post_type($json_data->postType);
     }
     $exp->set_status($json_data->status);
     $exp->set_finalization_mode($json_data->finalizationMode);
     if (isset($json_data->finalizationModeValue)) {
         $exp->set_finalization_value($json_data->finalizationModeValue);
     }
     $exp->track_heatmaps(false);
     if (isset($json_data->showHeatmap) && $json_data->showHeatmap) {
         $exp->track_heatmaps($json_data->showHeatmap);
     }
     if (isset($json_data->start)) {
         $exp->set_start_date($json_data->start);
     }
     if (isset($json_data->finalization)) {
         $exp->set_end_date($json_data->finalization);
     }
     if (isset($json_data->goals)) {
         NelioABExperiment::load_goals_from_json($exp, $json_data->goals);
     }
     $alternatives = array();
     if (isset($json_data->alternatives)) {
         foreach ($json_data->alternatives as $json_alt) {
             $alt = new NelioABAlternative($json_alt->key->id);
             $alt->set_name($json_alt->name);
             $alt->set_value($json_alt->value);
             array_push($alternatives, $alt);
         }
     }
     $exp->set_appspot_alternatives($alternatives);
     return $exp;
 }
 public function build_experiment_from_post_data()
 {
     $exp = new NelioABPostAlternativeExperiment($_POST['exp_id']);
     $exp->set_original($_POST['exp_original']);
     $exp = $this->compose_basic_alt_exp_using_post_data($exp);
     if (isset($_POST['custom_post_types'])) {
         $exp->set_post_type($_POST['custom_post_types']);
     }
     foreach ($exp->get_appspot_alternatives() as $alt) {
         $id = '' . $alt->get_id();
         $aux = explode(':', $id);
         $alt->set_id($aux[0]);
         $alt->set_value($aux[1]);
     }
     foreach ($exp->get_local_alternatives() as $alt) {
         $alt->set_value($alt->get_id());
     }
     global $nelioab_admin_controller;
     $nelioab_admin_controller->data = $exp;
 }