public static function get_field_matches($args)
 {
     extract($args);
     $f = $orig_f;
     $where_is = '=';
     //If using <, >, or != and $f is NOT a field ID
     if ($f < 20 and !is_numeric($val)) {
         // >, <, <=, >=  TODO: %, !%
         $orig_val = $val;
         $lpos = strpos($val, '<');
         $gpos = strpos($val, '>');
         $not_pos = strpos($val, '!=');
         if ($not_pos !== false) {
             //If string contains !=
             $where_is = '!=';
             $str = explode($where_is, $orig_val);
             $f = $str[0];
             $val = $str[1];
             if (empty($entry_ids) && $after_where == 0) {
                 //If entry IDs have not been set by a previous $atts
                 global $wpdb;
                 $query = $wpdb->prepare("SELECT id FROM {$wpdb->prefix}frm_items WHERE form_id=%d", $field->form_id);
                 //By default, don't get drafts
                 if ($drafts != 'both') {
                     $query .= $wpdb->prepare(" AND is_draft=%d", $drafts);
                 }
                 $entry_ids = $wpdb->get_col($query);
                 unset($query);
             }
             $val = FrmAppHelper::replace_quotes($val);
             $val = trim(trim($val, "'"), '"');
         } else {
             if ($lpos !== false || $gpos !== false) {
                 //If string contains greater than or less than
                 $where_is = ($gpos !== false and $lpos !== false and $lpos > $gpos or $lpos === false) ? '>' : '<';
                 $str = explode($where_is, $orig_val);
                 if (count($str) == 2) {
                     $f = $str[0];
                     $val = $str[1];
                 } else {
                     if (count($str) == 3) {
                         //3 parts assumes a structure like '-1 month'<255<'1 month'
                         $val = str_replace($str[0] . $where_is, '', $orig_val);
                         $entry_ids = self::get_field_matches(compact('entry_ids', 'orig_f', 'val', 'id', 'atts', 'field', 'form_posts', 'after_where', 'drafts'));
                         $after_where = true;
                         $f = $str[1];
                         $val = $str[0];
                         $where_is = $where_is == '<' ? '>' : '<';
                     }
                 }
                 if (strpos($val, '=') === 0) {
                     $where_is .= '=';
                     $val = substr($val, 1);
                 }
                 $val = FrmAppHelper::replace_quotes($val);
                 $val = trim(trim($val, "'"), '"');
             }
         }
     }
     if (!is_numeric($f)) {
         if (in_array($f, array('created_at', 'updated_at'))) {
             global $wpdb;
             $query = $wpdb->prepare("SELECT id FROM {$wpdb->prefix}frm_items WHERE {$f} {$where_is} %s AND form_id = %d", $val, $field->form_id);
             if ($after_where) {
                 if (!$entry_ids) {
                     return array();
                 }
                 $query .= ' AND id in (' . implode(',', $entry_ids) . ')';
             }
             $entry_ids = $wpdb->get_col($query);
             return $entry_ids;
         } else {
             //check for field keys
             $frm_field = new FrmField();
             $this_field = $frm_field->getOne($f);
             if ($this_field) {
                 $f = $this_field->id;
             } else {
                 //If no field ID
                 return $entry_ids;
             }
             unset($this_field);
         }
     }
     unset($orig_f);
     $where_atts = apply_filters('frm_stats_where', array('where_is' => $where_is, 'where_val' => $val), array('id' => $id, 'atts' => $atts));
     $val = $where_atts['where_val'];
     $where_is = $where_atts['where_is'];
     unset($where_atts);
     $entry_ids = FrmProAppHelper::filter_where($entry_ids, array('where_opt' => $f, 'where_is' => $where_is, 'where_val' => $val, 'form_id' => $field->form_id, 'form_posts' => $form_posts, 'after_where' => $after_where, 'drafts' => $drafts));
     unset($f);
     unset($val);
     return $entry_ids;
 }
 public static function get_field_matches($args)
 {
     extract($args);
     $f = $orig_f;
     $where_is = '=';
     //If using <, >, <=, >=, or != TODO: %, !%.
     //Note: $f will be numeric if using <, >, <=, >=, != OR if using x=val, but the code in the if/else statement will not actually do anything to x=val.
     if (is_numeric($f)) {
         //Note: $f will count up for certain atts
         $orig_val = $val;
         $lpos = strpos($val, '<');
         $gpos = strpos($val, '>');
         $not_pos = strpos($val, '!=');
         $dash_pos = strpos($val, '-');
         if ($not_pos !== false) {
             //If string contains !=
             //If entry IDs have not been set by a previous $atts
             if (empty($entry_ids) && $after_where == 0) {
                 $query = array('form_id' => $field->form_id);
                 //By default, don't get drafts
                 if ($drafts != 'both') {
                     $query['is_draft'] = $drafts;
                 }
                 $entry_ids = FrmDb::get_col('frm_items', $query);
                 unset($query);
             }
             $where_is = '!=';
             $str = explode($where_is, $orig_val);
             $f = $str[0];
             $val = $str[1];
         } else {
             if ($lpos !== false || $gpos !== false) {
                 //If string contains greater than or less than
                 $where_is = $gpos !== false && $lpos !== false && $lpos > $gpos || $lpos === false ? '>' : '<';
                 $str = explode($where_is, $orig_val);
                 if (count($str) == 2) {
                     $f = $str[0];
                     $val = $str[1];
                 } else {
                     if (count($str) == 3) {
                         //3 parts assumes a structure like '-1 month'<255<'1 month'
                         $val = str_replace($str[0] . $where_is, '', $orig_val);
                         $entry_ids = self::get_field_matches(compact('entry_ids', 'orig_f', 'val', 'id', 'atts', 'field', 'form_posts', 'after_where', 'drafts'));
                         $after_where = true;
                         $f = $str[1];
                         $val = $str[0];
                         $where_is = $where_is == '<' ? '>' : '<';
                     }
                 }
                 if (strpos($val, '=') === 0) {
                     $where_is .= '=';
                     $val = substr($val, 1);
                 }
                 // If field key contains a dash, then it won't be put in as $f automatically (WordPress quirk maybe?)
                 // Use $f < 5 to decrease the likelihood of this section being used when $f is a field ID (like x=val)
             } else {
                 if ($dash_pos !== false && strpos($val, '=') !== false && $f < 5) {
                     $str = explode($where_is, $orig_val);
                     $f = $str[0];
                     $val = $str[1];
                 }
             }
         }
     }
     // If this function has looped through at least once, and there aren't any entry IDs
     if ($after_where && !$entry_ids) {
         return array();
     }
     //If using field key
     if (!is_numeric($f)) {
         if (in_array($f, array('created_at', 'updated_at'))) {
             global $wpdb;
             $val = FrmAppHelper::replace_quotes($val);
             $val = str_replace(array('"', "'"), "", $val);
             $val = date('Y-m-d', strtotime($val));
             $query = array('form_id' => $field->form_id, $f . FrmDb::append_where_is($where_is) => $val);
             // Entry IDs may be set even if after_where isn't true
             if ($entry_ids) {
                 $query['id'] = $entry_ids;
             }
             $entry_ids = FrmDb::get_col('frm_items', $query);
             return $entry_ids;
         } else {
             //check for field keys
             $this_field = FrmField::getOne($f);
             if ($this_field) {
                 $f = $this_field->id;
             } else {
                 //If no field ID
                 return $entry_ids;
             }
             unset($this_field);
         }
     }
     unset($orig_f);
     //Prepare val
     $val = FrmAppHelper::replace_quotes($val);
     $val = trim(trim($val, "'"), '"');
     $where_atts = apply_filters('frm_stats_where', array('where_is' => $where_is, 'where_val' => $val), array('id' => $id, 'atts' => $atts));
     $val = $where_atts['where_val'];
     $where_is = $where_atts['where_is'];
     unset($where_atts);
     $entry_ids = FrmProAppHelper::filter_where($entry_ids, array('where_opt' => $f, 'where_is' => $where_is, 'where_val' => $val, 'form_id' => $field->form_id, 'form_posts' => $form_posts, 'after_where' => $after_where, 'drafts' => $drafts));
     unset($f);
     unset($val);
     return $entry_ids;
 }
 public static function graph_shortcode($atts)
 {
     $defaults = array('id' => false, 'id2' => false, 'id3' => false, 'id4' => false, 'ids' => array(), 'colors' => '', 'grid_color' => '#CCC', 'is3d' => false, 'height' => 400, 'width' => 400, 'truncate_label' => 7, 'bg_color' => '#FFFFFF', 'truncate' => 40, 'response_count' => 10, 'user_id' => false, 'entry_id' => false, 'title' => '', 'type' => 'default', 'x_axis' => false, 'data_type' => 'count', 'limit' => '', 'show_key' => false, 'min' => '', 'max' => '', 'y_title' => '', 'x_title' => '', 'include_zero' => false, 'field' => false, 'title_size' => '', 'title_font' => '', 'tooltip_label' => '', 'start_date' => '', 'end_date' => '', 'x_start' => '', 'x_end' => '', 'group_by' => '', 'x_order' => 'default', 'atts' => false);
     // TODO: Remove limit from docs, add x_order='desc' and x_order='field_options'
     // Remove id from docs. Just use ids to simplify.
     // Remove either x start or start_date from docs
     // Remove either x_end or end_date from docs
     // Make sure x_order is set up to work with abc
     // If no id, stop now
     if (!$atts || !$atts['id']) {
         echo __('You must include a field id or key in your graph shortcode.', 'formidable');
         return;
     }
     if (isset($atts['type']) && $atts['type'] == 'geo') {
         $defaults['truncate_label'] = 100;
         $defaults['width'] = 600;
     }
     if (isset($atts['include_js'])) {
         unset($atts['include_js']);
     }
     // Set up array for filtering fields
     // TODO: Ask about simpler way
     $temp_atts = $atts;
     foreach ($defaults as $unset => $val) {
         unset($temp_atts[$unset], $unset, $val);
     }
     foreach ($temp_atts as $unset => $val) {
         unset($atts[$unset]);
         $atts['atts'][$unset] = $val;
         unset($unset, $val);
     }
     // User's values should override default values
     $atts = array_merge($defaults, $atts);
     global $wpdb;
     // Reverse compatibility for id2, id3, and id4
     if (!$atts['ids'] && ($atts['id2'] || $atts['id3'] || $atts['id4'])) {
         _deprecated_argument(__FUNCTION__, '1.07.05', __('id2, id3, and id4 are deprecated. Please use ids instead.', 'formidable'));
         $atts['ids'] = array($atts['id2'], $atts['id3'], $atts['id4']);
         $atts['ids'] = implode(',', $atts['ids']);
         unset($atts['id2'], $atts['id3'], $atts['id4']);
     }
     //x_start and start_date do the same thing
     // Reverse compatibility for x_start
     if ($atts['start_date'] || $atts['x_start']) {
         if ($atts['x_start']) {
             $atts['start_date'] = $atts['x_start'];
             unset($atts['x_start']);
         }
         $atts['start_date'] = FrmAppHelper::replace_quotes($atts['start_date']);
     }
     //x_end and end_date do the same thing
     // Reverse compatibility for x_end
     if ($atts['end_date'] || $atts['x_end']) {
         if ($atts['x_end']) {
             $atts['end_date'] = $atts['x_end'];
             unset($atts['x_end']);
         }
         $atts['end_date'] = FrmAppHelper::replace_quotes($atts['end_date']);
     }
     // Reverse compatibility for x_order=0
     if (!$atts['x_order']) {
         $atts['x_order'] = 'field_opts';
     }
     // If limit is set, get only the top results
     if ($atts['limit']) {
         $atts['x_order'] = 'desc';
     }
     $atts['user_id'] = FrmAppHelper::get_user_id_param($atts['user_id']);
     if ($atts['entry_id']) {
         $atts['entry_id'] = explode(',', $atts['entry_id']);
         //make sure all values are numeric
         //TODO: Make this work with entry keys
         $atts['entry_id'] = array_filter($atts['entry_id'], 'is_numeric');
         if (empty($atts['entry_id'])) {
             // don't continue if there are no entry ids
             return;
         }
         $atts['entry_id'] = implode(',', $atts['entry_id']);
     }
     // Switch to entry_ids for easier reference
     $atts['entry_ids'] = $atts['entry_id'];
     unset($atts['entry_id']);
     //Convert $tooltip_label to array
     if ($atts['tooltip_label']) {
         $atts['tooltip_label'] = explode(',', $atts['tooltip_label']);
     }
     // This will only be an object when coming from show()
     if (is_object($atts['field'])) {
         $fields = array($atts['field']);
         // If creating multiple graphs with one shortcode
     } else {
         $atts['id'] = explode(',', $atts['id']);
         foreach ($atts['id'] as $key => $id) {
             //If using field keys, retrieve the field IDs
             if (!is_numeric($id)) {
                 $atts['id'][$key] = FrmDb::get_var($wpdb->prefix . 'frm_fields', array('field_key' => $id));
             }
             unset($key, $id);
         }
         //make sure all field IDs are numeric - TODO: ask Steph if this is redundant
         $atts['id'] = array_filter($atts['id'], 'is_numeric');
         if (empty($atts['id'])) {
             // don't continue if there is nothing to graph
             return;
         }
         $fields = FrmField::getAll(array('fi.id' => $atts['id']));
         // No longer needed
         unset($atts['id']);
     }
     if (!empty($atts['colors'])) {
         $atts['colors'] = explode(',', $atts['colors']);
     }
     // Trigger js load
     global $frm_vars;
     $frm_vars['forms_loaded'][] = true;
     $html = '';
     foreach ($fields as $field) {
         $data = self::get_google_graph($field, $atts);
         if (empty($data)) {
             $html .= apply_filters('frm_no_data_graph', '<div class="frm_no_data_graph">' . __('No Data', 'formidable') . '</div>');
             continue;
         }
         $html .= '<div id="chart_' . $data['graph_id'] . '" style="height:' . $atts['height'] . ';width:' . $atts['width'] . '"></div>';
     }
     return $html;
 }