PageRenderTime 98ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 1ms

/wp-content/plugins/gravityforms/common.php

https://github.com/webgefrickel/frckl-init-wordpress
PHP | 5422 lines | 3928 code | 1070 blank | 424 comment | 838 complexity | d1de7789de1cdea7028e24d86ce5bc5a MD5 | raw file
Possible License(s): LGPL-3.0, LGPL-2.1, GPL-2.0
  1. <?php
  2. class GFCommon{
  3. public static $version = "1.7.9";
  4. public static $tab_index = 1;
  5. public static $errors = array();
  6. private static $messages = array();
  7. public static function get_selection_fields($form, $selected_field_id){
  8. $str = "";
  9. foreach($form["fields"] as $field){
  10. $input_type = RGFormsModel::get_input_type($field);
  11. $field_label = RGFormsModel::get_label($field);
  12. if($input_type == "checkbox" || $input_type == "radio" || $input_type == "select"){
  13. $selected = $field["id"] == $selected_field_id ? "selected='selected'" : "";
  14. $str .= "<option value='" . $field["id"] . "' " . $selected . ">" . $field_label . "</option>";
  15. }
  16. }
  17. return $str;
  18. }
  19. public static function is_numeric($value, $number_format=""){
  20. switch($number_format){
  21. case "decimal_dot" :
  22. return preg_match("/^(-?[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]+)?)$/", $value);
  23. break;
  24. case "decimal_comma" :
  25. return preg_match("/^(-?[0-9]{1,3}(?:\.?[0-9]{3})*(?:,[0-9]+)?)$/", $value);
  26. break;
  27. default :
  28. return preg_match("/^(-?[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]{2})?)$/", $value) || preg_match("/^(-?[0-9]{1,3}(?:\.?[0-9]{3})*(?:,[0-9]{2})?)$/", $value);
  29. }
  30. }
  31. public static function trim_all($text){
  32. $text = trim($text);
  33. do{
  34. $prev_text = $text;
  35. $text = str_replace(" ", " ", $text);
  36. }
  37. while($text != $prev_text);
  38. return $text;
  39. }
  40. public static function format_number($number, $number_format){
  41. if(!is_numeric($number))
  42. return $number;
  43. //replacing commas with dots and dots with commas
  44. if($number_format == "decimal_comma"){
  45. $number = str_replace(",", "|", $number);
  46. $number = str_replace(".", ",", $number);
  47. $number = str_replace("|", ".", $number);
  48. }
  49. return $number;
  50. }
  51. public static function recursive_add_index_file($dir) {
  52. if(!is_dir($dir))
  53. return;
  54. if(!($dp = opendir($dir)))
  55. return;
  56. //ignores all errors
  57. set_error_handler(create_function("", "return 0;"), E_ALL);
  58. //creates an empty index.html file
  59. if($f = fopen($dir . "/index.html", 'w'))
  60. fclose($f);
  61. //restores error handler
  62. restore_error_handler();
  63. while((false !== $file = readdir($dp))){
  64. if(is_dir("$dir/$file") && $file != '.' && $file !='..')
  65. self::recursive_add_index_file("$dir/$file");
  66. }
  67. closedir($dp);
  68. }
  69. public static function clean_number($number, $number_format=""){
  70. if(rgblank($number))
  71. return $number;
  72. $decimal_char = "";
  73. if($number_format == "decimal_dot")
  74. $decimal_char = ".";
  75. else if($number_format == "decimal_comma")
  76. $decimal_char = ",";
  77. $float_number = "";
  78. $clean_number = "";
  79. $is_negative = false;
  80. //Removing all non-numeric characters
  81. $array = str_split($number);
  82. foreach($array as $char){
  83. if (($char >= '0' && $char <= '9') || $char=="," || $char==".")
  84. $clean_number .= $char;
  85. else if($char == '-')
  86. $is_negative = true;
  87. }
  88. //Removing thousand separators but keeping decimal point
  89. $array = str_split($clean_number);
  90. for($i=0, $count = sizeof($array); $i<$count; $i++)
  91. {
  92. $char = $array[$i];
  93. if ($char >= '0' && $char <= '9')
  94. $float_number .= $char;
  95. else if(empty($decimal_char) && ($char == "." || $char == ",") && strlen($clean_number) - $i <= 3)
  96. $float_number .= ".";
  97. else if($decimal_char == $char)
  98. $float_number .= ".";
  99. }
  100. if($is_negative)
  101. $float_number = "-" . $float_number;
  102. return $float_number;
  103. }
  104. public static function json_encode($value){
  105. return json_encode($value);
  106. }
  107. public static function json_decode($str, $is_assoc=true){
  108. return json_decode($str, $is_assoc);
  109. }
  110. //Returns the url of the plugin's root folder
  111. public static function get_base_url(){
  112. $folder = basename(dirname(__FILE__));
  113. return plugins_url($folder);
  114. }
  115. //Returns the physical path of the plugin's root folder
  116. public static function get_base_path(){
  117. $folder = basename(dirname(__FILE__));
  118. return WP_PLUGIN_DIR . "/" . $folder;
  119. }
  120. public static function get_email_fields($form){
  121. $fields = array();
  122. foreach($form["fields"] as $field){
  123. if(RGForms::get("type", $field) == "email" || RGForms::get("inputType", $field) == "email")
  124. $fields[] = $field;
  125. }
  126. return $fields;
  127. }
  128. public static function truncate_middle($text, $max_length){
  129. if(strlen($text) <= $max_length)
  130. return $text;
  131. $middle = intval($max_length / 2);
  132. return substr($text, 0, $middle) . "..." . substr($text, strlen($text) - $middle, $middle);
  133. }
  134. public static function is_invalid_or_empty_email($email){
  135. return empty($email) || !self::is_valid_email($email);
  136. }
  137. public static function is_valid_url($url){
  138. return preg_match('!^(http|https)://([\w-]+\.?)+[\w-]+(:\d+)?(/[\w- ./?~%&=+\']*)?$!', $url);
  139. }
  140. public static function is_valid_email($email){
  141. return preg_match('/^(([a-zA-Z0-9_.\-+!#$&\'*+=?^`{|}~])+\@((([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+|localhost) *,? *)+$/', $email);
  142. }
  143. public static function get_label($field, $input_id = 0, $input_only = false){
  144. return RGFormsModel::get_label($field, $input_id, $input_only);
  145. }
  146. public static function get_input($field, $id){
  147. return RGFormsModel::get_input($field, $id);
  148. }
  149. public static function insert_variables($fields, $element_id, $hide_all_fields=false, $callback="", $onchange="", $max_label_size=40, $exclude = null, $args="", $class_name=""){
  150. if($fields == null)
  151. $fields = array();
  152. if($exclude == null)
  153. $exclude = array();
  154. $exclude = apply_filters("gform_merge_tag_list_exclude", $exclude, $element_id, $fields);
  155. $merge_tags = self::get_merge_tags($fields, $element_id, $hide_all_fields, $exclude, $args);
  156. $onchange = empty($onchange) ? "InsertVariable('{$element_id}', '{$callback}');" : $onchange;
  157. $class = trim($class_name . " gform_merge_tags");
  158. ?>
  159. <select id="<?php echo $element_id?>_variable_select" onchange="<?php echo $onchange ?>" class="<?php echo esc_attr($class)?>">
  160. <option value=''><?php _e("Insert Merge Tag", "gravityforms"); ?></option>
  161. <?php foreach($merge_tags as $group => $group_tags) {
  162. $group_label = rgar($group_tags, 'label');
  163. $tags = rgar($group_tags, 'tags');
  164. if(empty($group_tags['tags']))
  165. continue;
  166. if($group_label) { ?>
  167. <optgroup label="<?php echo $group_label; ?>">
  168. <?php } ?>
  169. <?php foreach($tags as $tag) { ?>
  170. <option value="<?php echo $tag['tag']; ?>"><?php echo $tag['label']; ?></option>
  171. <?php }
  172. if($group_label) { ?>
  173. </optgroup>
  174. <?php }
  175. } ?>
  176. </select>
  177. <?php
  178. }
  179. public static function OLD_insert_variables($fields, $element_id, $hide_all_fields=false, $callback="", $onchange="", $max_label_size=40, $exclude = null, $args="", $class_name=""){
  180. if($fields == null)
  181. $fields = array();
  182. if($exclude == null)
  183. $exclude = array();
  184. $exclude = apply_filters("gform_merge_tag_list_exclude", $exclude, $element_id, $fields);
  185. $onchange = empty($onchange) ? "InsertVariable('{$element_id}', '{$callback}');" : $onchange;
  186. $class = trim($class_name . " gform_merge_tags");
  187. ?>
  188. <select id="<?php echo $element_id?>_variable_select" onchange="<?php echo $onchange ?>" class="<?php echo esc_attr($class)?>">
  189. <option value=''><?php _e("Insert Merge Tag", "gravityforms"); ?></option>
  190. <?php
  191. if(!$hide_all_fields){
  192. ?>
  193. <option value='{all_fields}'><?php _e("All Submitted Fields", "gravityforms"); ?></option>
  194. <?php
  195. }
  196. $required_fields = array();
  197. $optional_fields = array();
  198. $pricing_fields = array();
  199. foreach($fields as $field){
  200. if(rgget("displayOnly", $field))
  201. continue;
  202. $input_type = RGFormsModel::get_input_type($field);
  203. //skip field types that should be excluded
  204. if(is_array($exclude) && in_array($input_type, $exclude))
  205. continue;
  206. if($field["isRequired"]){
  207. switch($input_type){
  208. case "name" :
  209. if($field["nameFormat"] == "extended"){
  210. $prefix = GFCommon::get_input($field, $field["id"] + 0.2);
  211. $suffix = GFCommon::get_input($field, $field["id"] + 0.8);
  212. $optional_field = $field;
  213. $optional_field["inputs"] = array($prefix, $suffix);
  214. //Add optional name fields to the optional list
  215. $optional_fields[] = $optional_field;
  216. //Remove optional name field from required list
  217. unset($field["inputs"][0]);
  218. unset($field["inputs"][3]);
  219. }
  220. $required_fields[] = $field;
  221. break;
  222. default:
  223. $required_fields[] = $field;
  224. }
  225. }
  226. else{
  227. $optional_fields[] = $field;
  228. }
  229. if(self::is_pricing_field($field["type"])){
  230. $pricing_fields[] = $field;
  231. }
  232. }
  233. if(!empty($required_fields)){
  234. ?>
  235. <optgroup label="<?php _e("Required form fields", "gravityforms"); ?>">
  236. <?php
  237. foreach($required_fields as $field){
  238. self::insert_field_variable($field, $max_label_size, $args);
  239. }
  240. ?>
  241. </optgroup>
  242. <?php
  243. }
  244. if(!empty($optional_fields)){
  245. ?>
  246. <optgroup label="<?php _e("Optional form fields", "gravityforms"); ?>">
  247. <?php
  248. foreach($optional_fields as $field){
  249. self::insert_field_variable($field, $max_label_size, $args);
  250. }
  251. ?>
  252. </optgroup>
  253. <?php
  254. }
  255. if(!empty($pricing_fields)){
  256. ?>
  257. <optgroup label="<?php _e("Pricing form fields", "gravityforms"); ?>">
  258. <?php
  259. if(!$hide_all_fields){
  260. ?>
  261. <option value='{pricing_fields}'><?php _e("All Pricing Fields", "gravityforms"); ?></option>
  262. <?php
  263. }?>
  264. <?php
  265. foreach($pricing_fields as $field){
  266. self::insert_field_variable($field, $max_label_size, $args);
  267. }
  268. ?>
  269. </optgroup>
  270. <?php
  271. }
  272. ?>
  273. <optgroup label="<?php _e("Other", "gravityforms"); ?>">
  274. <option value='{ip}'><?php _e("Client IP Address", "gravityforms"); ?></option>
  275. <option value='{date_mdy}'><?php _e("Date", "gravityforms"); ?> (mm/dd/yyyy)</option>
  276. <option value='{date_dmy}'><?php _e("Date", "gravityforms"); ?> (dd/mm/yyyy)</option>
  277. <option value='{embed_post:ID}'><?php _e("Embed Post/Page Id", "gravityforms"); ?></option>
  278. <option value='{embed_post:post_title}'><?php _e("Embed Post/Page Title", "gravityforms"); ?></option>
  279. <option value='{embed_url}'><?php _e("Embed URL", "gravityforms"); ?></option>
  280. <option value='{entry_id}'><?php _e("Entry Id", "gravityforms"); ?></option>
  281. <option value='{entry_url}'><?php _e("Entry URL", "gravityforms"); ?></option>
  282. <option value='{form_id}'><?php _e("Form Id", "gravityforms"); ?></option>
  283. <option value='{form_title}'><?php _e("Form Title", "gravityforms"); ?></option>
  284. <option value='{referer}'><?php _e("HTTP Referer URL", "gravityforms"); ?></option>
  285. <option value='{user_agent}'><?php _e("HTTP User Agent", "gravityforms"); ?></option>
  286. <?php if(self::has_post_field($fields)){ ?>
  287. <option value='{post_id}'><?php _e("Post Id", "gravityforms"); ?></option>
  288. <option value='{post_edit_url}'><?php _e("Post Edit URL", "gravityforms"); ?></option>
  289. <?php } ?>
  290. <option value='{user:display_name}'><?php _e("User Display Name", "gravityforms"); ?></option>
  291. <option value='{user:user_email}'><?php _e("User Email", "gravityforms"); ?></option>
  292. <option value='{user:user_login}'><?php _e("User Login", "gravityforms"); ?></option>
  293. </optgroup>
  294. <?php
  295. $custom_merge_tags = apply_filters('gform_custom_merge_tags', array(), rgars($fields, '0/formId'), $fields, $element_id);
  296. if(is_array($custom_merge_tags) && !empty($custom_merge_tags)) { ?>
  297. <optgroup label="<?php _e("Custom", "gravityforms"); ?>">
  298. <?php foreach($custom_merge_tags as $custom_merge_tag) { ?>
  299. <option value='<?php echo rgar($custom_merge_tag, 'tag'); ?>'><?php echo rgar($custom_merge_tag, 'label'); ?></option>
  300. <?php } ?>
  301. </optgroup>
  302. <?php } ?>
  303. </select>
  304. <?php
  305. }
  306. /**
  307. * This function is used by the gfMergeTags JS object to get the localized label for non-field merge tags as well as
  308. * for backwards compatability with the gform_custom_merge_tags hook. Lastly, this plugin is used by the soon-to-be
  309. * deprecrated insert_variables() function as the new gfMergeTags object has not yet been applied to the Post Content
  310. * Template setting.
  311. *
  312. * @param $fields
  313. * @param $element_id
  314. * @param bool $hide_all_fields
  315. * @param array $exclude_field_types
  316. * @param string $option
  317. * @return array
  318. */
  319. public static function get_merge_tags($fields, $element_id, $hide_all_fields = false, $exclude_field_types = array(), $option = '') {
  320. if($fields == null)
  321. $fields = array();
  322. if($exclude_field_types == null)
  323. $exclude_field_types = array();
  324. $required_fields = $optional_fields = $pricing_fields = array();
  325. $ungrouped = $required_group = $optional_group = $pricing_group = $other_group = array();
  326. if(!$hide_all_fields)
  327. $ungrouped[] = array('tag' => '{all_fields}', 'label' => __('All Submitted Fields', 'gravityforms'));
  328. // group fields by required, optional, and pricing
  329. foreach($fields as $field) {
  330. if(rgget("displayOnly", $field))
  331. continue;
  332. $input_type = RGFormsModel::get_input_type($field);
  333. // skip field types that should be excluded
  334. if(is_array($exclude_field_types) && in_array($input_type, $exclude_field_types))
  335. continue;
  336. if(rgar($field, 'isRequired')) {
  337. switch($input_type) {
  338. case "name" :
  339. if(rgar($field,"nameFormat") == "extended") {
  340. $prefix = GFCommon::get_input($field, $field["id"] + 0.2);
  341. $suffix = GFCommon::get_input($field, $field["id"] + 0.8);
  342. $optional_field = $field;
  343. $optional_field["inputs"] = array($prefix, $suffix);
  344. //Add optional name fields to the optional list
  345. $optional_fields[] = $optional_field;
  346. //Remove optional name field from required list
  347. unset($field["inputs"][0]);
  348. unset($field["inputs"][3]);
  349. }
  350. $required_fields[] = $field;
  351. break;
  352. default:
  353. $required_fields[] = $field;
  354. }
  355. }
  356. else {
  357. $optional_fields[] = $field;
  358. }
  359. if(self::is_pricing_field($field["type"])){
  360. $pricing_fields[] = $field;
  361. }
  362. }
  363. if(!empty($required_fields)){
  364. foreach($required_fields as $field){
  365. $required_group = array_merge($required_group, self::get_field_merge_tags($field, $option));
  366. }
  367. }
  368. if(!empty($optional_fields)){
  369. foreach($optional_fields as $field){
  370. $optional_group = array_merge($optional_group, self::get_field_merge_tags($field, $option));
  371. }
  372. }
  373. if(!empty($pricing_fields)){
  374. if(!$hide_all_fields)
  375. $pricing_group[] = array('tag' => '{pricing_fields}', 'label' => __("All Pricing Fields", "gravityforms"));
  376. foreach($pricing_fields as $field){
  377. $pricing_group = array_merge($pricing_group, self::get_field_merge_tags($field, $option));
  378. }
  379. }
  380. $other_group[] = array('tag' => '{ip}', 'label' => __("Client IP Address", "gravityforms"));
  381. $other_group[] = array('tag' => '{date_mdy}', 'label' => __("Date", "gravityforms") . ' (mm/dd/yyyy)');
  382. $other_group[] = array('tag' => '{date_dmy}', 'label' => __("Date", "gravityforms") . ' (dd/mm/yyyy)');
  383. $other_group[] = array('tag' => '{embed_post:ID}', 'label' => __("Embed Post/Page Id", "gravityforms"));
  384. $other_group[] = array('tag' => '{embed_post:post_title}', 'label' => __("Embed Post/Page Title", "gravityforms"));
  385. $other_group[] = array('tag' => '{embed_url}', 'label' => __("Embed URL", "gravityforms"));
  386. $other_group[] = array('tag' => '{entry_id}', 'label' => __("Entry Id", "gravityforms"));
  387. $other_group[] = array('tag' => '{entry_url}', 'label' => __("Entry URL", "gravityforms"));
  388. $other_group[] = array('tag' => '{form_id}', 'label' => __("Form Id", "gravityforms"));
  389. $other_group[] = array('tag' => '{form_title}', 'label' => __("Form Title", "gravityforms"));
  390. $other_group[] = array('tag' => '{user_agent}', 'label' => __("HTTP User Agent", "gravityforms"));
  391. $other_group[] = array('tag' => '{referer}', 'label' => __("HTTP Referer URL", "gravityforms"));
  392. if(self::has_post_field($fields)) {
  393. $other_group[] = array('tag' => '{post_id}', 'label' => __("Post Id", "gravityforms"));
  394. $other_group[] = array('tag' => '{post_edit_url}', 'label' => __("Post Edit URL", "gravityforms"));
  395. }
  396. $other_group[] = array('tag' => '{user:display_name}', 'label' => __("User Display Name", "gravityforms"));
  397. $other_group[] = array('tag' => '{user:user_email}', 'label' => __("User Email", "gravityforms"));
  398. $other_group[] = array('tag' => '{user:user_login}', 'label' => __("User Login", "gravityforms"));
  399. $custom_group = apply_filters('gform_custom_merge_tags', array(), rgars($fields, '0/formId'), $fields, $element_id);
  400. $merge_tags = array(
  401. 'ungrouped' => array(
  402. 'label' => false,
  403. 'tags' => $ungrouped
  404. ),
  405. 'required' => array(
  406. 'label' => __("Required form fields", "gravityforms"),
  407. 'tags' => $required_group
  408. ),
  409. 'optional' => array(
  410. 'label' => __("Optional form fields", "gravityforms"),
  411. 'tags' => $optional_group
  412. ),
  413. 'pricing' => array(
  414. 'label' => __("Pricing form fields", "gravityforms"),
  415. 'tags' => $pricing_group
  416. ),
  417. 'other' => array(
  418. 'label' => __("Other", "gravityforms"),
  419. 'tags' => $other_group
  420. ),
  421. 'custom' => array(
  422. 'label' => __("Custom", "gravityforms"),
  423. 'tags' => $custom_group
  424. )
  425. );
  426. return $merge_tags;
  427. }
  428. public static function get_field_merge_tags($field, $option="") {
  429. $merge_tags = array();
  430. $tag_args = RGFormsModel::get_input_type($field) == "list" ? ":{$option}" : ""; //args currently only supported by list field
  431. if(isset($field["inputs"]) && is_array($field["inputs"])) {
  432. if(RGFormsModel::get_input_type($field) == "checkbox") {
  433. $value = "{" . esc_html(GFCommon::get_label($field, $field["id"])) . ":" . $field["id"] . "{$tag_args}}";
  434. $merge_tags[] = array( 'tag' => $value, 'label' => esc_html(GFCommon::get_label($field, $field["id"])) );
  435. }
  436. foreach($field["inputs"] as $input) {
  437. $value = "{" . esc_html(GFCommon::get_label($field, $input["id"])) . ":" . $input["id"] . "{$tag_args}}";
  438. $merge_tags[] = array( 'tag' => $value, 'label' => esc_html(GFCommon::get_label($field, $input["id"])) );
  439. }
  440. }
  441. else {
  442. $value = "{" . esc_html(GFCommon::get_label($field)) . ":" . $field["id"] . "{$tag_args}}";
  443. $merge_tags[] = array( 'tag' => $value, 'label' => esc_html(GFCommon::get_label($field)) );
  444. }
  445. return $merge_tags;
  446. }
  447. public static function insert_field_variable($field, $max_label_size=40, $args=""){
  448. $tag_args = RGFormsModel::get_input_type($field) == "list" ? ":{$args}" : ""; //args currently only supported by list field
  449. if(is_array($field["inputs"]))
  450. {
  451. if(RGFormsModel::get_input_type($field) == "checkbox"){
  452. ?>
  453. <option value='<?php echo "{" . esc_html(GFCommon::get_label($field, $field["id"])) . ":" . $field["id"] . "{$tag_args}}" ?>'><?php echo esc_html(GFCommon::get_label($field, $field["id"])) ?></option>
  454. <?php
  455. }
  456. foreach($field["inputs"] as $input){
  457. ?>
  458. <option value='<?php echo "{" . esc_html(GFCommon::get_label($field, $input["id"])) . ":" . $input["id"] . "{$tag_args}}" ?>'><?php echo esc_html(GFCommon::get_label($field, $input["id"])) ?></option>
  459. <?php
  460. }
  461. }
  462. else{
  463. ?>
  464. <option value='<?php echo "{" . esc_html(GFCommon::get_label($field)) . ":" . $field["id"] . "{$tag_args}}" ?>'><?php echo esc_html(GFCommon::get_label($field)) ?></option>
  465. <?php
  466. }
  467. }
  468. public static function insert_post_content_variables($fields, $element_id, $callback, $max_label_size=25){
  469. // TODO: replace with class-powered merge tags
  470. self::insert_variables($fields, $element_id, true, "", "InsertPostContentVariable('{$element_id}', '{$callback}');", $max_label_size, null, "", "gform_content_template_merge_tags");
  471. ?>
  472. &nbsp;&nbsp;
  473. <select id="<?php echo $element_id?>_image_size_select" onchange="InsertPostImageVariable('<?php echo $element_id ?>', '<?php echo $element_id ?>'); SetCustomFieldTemplate();" style="display:none;">
  474. <option value=""><?php _e("Select image size", "gravityforms") ?></option>
  475. <option value="thumbnail"><?php _e("Thumbnail", "gravityforms") ?></option>
  476. <option value="thumbnail:left"><?php _e("Thumbnail - Left Aligned", "gravityforms") ?></option>
  477. <option value="thumbnail:center"><?php _e("Thumbnail - Centered", "gravityforms") ?></option>
  478. <option value="thumbnail:right"><?php _e("Thumbnail - Right Aligned", "gravityforms") ?></option>
  479. <option value="medium"><?php _e("Medium", "gravityforms") ?></option>
  480. <option value="medium:left"><?php _e("Medium - Left Aligned", "gravityforms") ?></option>
  481. <option value="medium:center"><?php _e("Medium - Centered", "gravityforms") ?></option>
  482. <option value="medium:right"><?php _e("Medium - Right Aligned", "gravityforms") ?></option>
  483. <option value="large"><?php _e("Large", "gravityforms") ?></option>
  484. <option value="large:left"><?php _e("Large - Left Aligned", "gravityforms") ?></option>
  485. <option value="large:center"><?php _e("Large - Centered", "gravityforms") ?></option>
  486. <option value="large:right"><?php _e("Large - Right Aligned", "gravityforms") ?></option>
  487. <option value="full"><?php _e("Full Size", "gravityforms") ?></option>
  488. <option value="full:left"><?php _e("Full Size - Left Aligned", "gravityforms") ?></option>
  489. <option value="full:center"><?php _e("Full Size - Centered", "gravityforms") ?></option>
  490. <option value="full:right"><?php _e("Full Size - Right Aligned", "gravityforms") ?></option>
  491. </select>
  492. <?php
  493. }
  494. public static function insert_calculation_variables($fields, $element_id, $onchange = '', $callback = '', $max_label_size=40) {
  495. if($fields == null)
  496. $fields = array();
  497. $onchange = empty($onchange) ? "InsertVariable('{$element_id}', '{$callback}');" : $onchange;
  498. $class = 'gform_merge_tags';
  499. ?>
  500. <select id="<?php echo $element_id?>_variable_select" onchange="<?php echo $onchange ?>" class="<?php echo esc_attr($class)?>">
  501. <option value=''><?php _e("Insert Merge Tag", "gravityforms"); ?></option>
  502. <optgroup label="<?php _e("Allowable form fields", "gravityforms"); ?>">
  503. <?php
  504. foreach($fields as $field) {
  505. if(!self::is_valid_for_calcuation($field))
  506. continue;
  507. if(RGFormsModel::get_input_type($field) == 'checkbox') {
  508. foreach($field["inputs"] as $input){
  509. ?>
  510. <option value='<?php echo "{" . esc_html(GFCommon::get_label($field, $input["id"])) . ":" . $input["id"] . "}" ?>'><?php echo esc_html(GFCommon::get_label($field, $input["id"])) ?></option>
  511. <?php
  512. }
  513. } else {
  514. self::insert_field_variable($field, $max_label_size);
  515. }
  516. }
  517. ?>
  518. </optgroup>
  519. <?php
  520. $custom_merge_tags = apply_filters('gform_custom_merge_tags', array(), rgars($fields, '0/formId'), $fields, $element_id);
  521. if(is_array($custom_merge_tags) && !empty($custom_merge_tags)) { ?>
  522. <optgroup label="<?php _e("Custom", "gravityforms"); ?>">
  523. <?php foreach($custom_merge_tags as $custom_merge_tag) { ?>
  524. <option value='<?php echo rgar($custom_merge_tag, 'tag'); ?>'><?php echo rgar($custom_merge_tag, 'label'); ?></option>
  525. <?php } ?>
  526. </optgroup>
  527. <?php } ?>
  528. </select>
  529. <?php
  530. }
  531. private static function get_post_image_variable($media_id, $arg1, $arg2, $is_url = false){
  532. if($is_url){
  533. $image = wp_get_attachment_image_src($media_id, $arg1);
  534. if ( $image )
  535. list($src, $width, $height) = $image;
  536. return $src;
  537. }
  538. switch($arg1){
  539. case "title" :
  540. $media = get_post($media_id);
  541. return $media->post_title;
  542. case "caption" :
  543. $media = get_post($media_id);
  544. return $media->post_excerpt;
  545. case "description" :
  546. $media = get_post($media_id);
  547. return $media->post_content;
  548. default :
  549. $img = wp_get_attachment_image($media_id, $arg1, false, array("class" => "size-{$arg1} align{$arg2} wp-image-{$media_id}"));
  550. return $img;
  551. }
  552. }
  553. public static function replace_variables_post_image($text, $post_images, $lead){
  554. preg_match_all('/{[^{]*?:(\d+)(:([^:]*?))?(:([^:]*?))?(:url)?}/mi', $text, $matches, PREG_SET_ORDER);
  555. if(is_array($matches))
  556. {
  557. foreach($matches as $match){
  558. $input_id = $match[1];
  559. //ignore fields that are not post images
  560. if(!isset($post_images[$input_id]))
  561. continue;
  562. //Reading alignment and "url" parameters.
  563. //Format could be {image:5:medium:left:url} or {image:5:medium:url}
  564. $size_meta = empty($match[3]) ? "full" : $match[3];
  565. $align = empty($match[5]) ? "none" : $match[5];
  566. if($align == "url"){
  567. $align = "none";
  568. $is_url = true;
  569. }
  570. else{
  571. $is_url = rgar($match,6) == ":url";
  572. }
  573. $media_id = $post_images[$input_id];
  574. $value = is_wp_error($media_id) ? "" : self::get_post_image_variable($media_id, $size_meta, $align, $is_url);
  575. $text = str_replace($match[0], $value , $text);
  576. }
  577. }
  578. return $text;
  579. }
  580. public static function implode_non_blank($separator, $array){
  581. if(!is_array($array))
  582. return "";
  583. $ary = array();
  584. foreach($array as $item){
  585. if(!rgblank($item))
  586. $ary[] = $item;
  587. }
  588. return implode($separator, $ary);
  589. }
  590. private static function format_variable_value($value, $url_encode, $esc_html, $format){
  591. if($esc_html)
  592. $value = esc_html($value);
  593. if($format == "html")
  594. $value = nl2br($value);
  595. if($url_encode)
  596. $value = urlencode($value);
  597. return $value;
  598. }
  599. public static function replace_variables($text, $form, $lead, $url_encode = false, $esc_html=true, $nl2br = true, $format="html"){
  600. $text = $nl2br ? nl2br($text) : $text;
  601. //Replacing field variables: {FIELD_LABEL:FIELD_ID} {My Field:2}
  602. preg_match_all('/{[^{]*?:(\d+(\.\d+)?)(:(.*?))?}/mi', $text, $matches, PREG_SET_ORDER);
  603. if(is_array($matches))
  604. {
  605. foreach($matches as $match){
  606. $input_id = $match[1];
  607. $field = RGFormsModel::get_field($form,$input_id);
  608. $value = RGFormsModel::get_lead_field_value($lead, $field);
  609. $raw_value = $value;
  610. if(is_array($value))
  611. $value = rgar($value, $input_id);
  612. $value = self::format_variable_value($value, $url_encode, $esc_html, $format);
  613. switch(RGFormsModel::get_input_type($field)){
  614. case "fileupload" :
  615. $value = str_replace(" ", "%20", $value);
  616. break;
  617. case "post_image" :
  618. list($url, $title, $caption, $description) = explode("|:|", $value);
  619. $value = str_replace(" ", "%20", $url);
  620. break;
  621. case "checkbox" :
  622. case "select" :
  623. case "radio" :
  624. $use_value = rgar($match,4) == "value";
  625. $use_price = in_array(rgar($match,4), array("price", "currency"));
  626. $format_currency = rgar($match,4) == "currency";
  627. if(is_array($raw_value) && (string)intval($input_id) != $input_id){
  628. $items = array($input_id => $value); //float input Ids. (i.e. 4.1 ). Used when targeting specific checkbox items
  629. }
  630. else if(is_array($raw_value)){
  631. $items = $raw_value;
  632. }
  633. else{
  634. $items = array($input_id => $raw_value);
  635. }
  636. $ary = array();
  637. foreach($items as $input_id => $item){
  638. if($use_value){
  639. list($val, $price) = rgexplode("|", $item, 2);
  640. }
  641. else if($use_price){
  642. list($name, $val) = rgexplode("|", $item, 2);
  643. if($format_currency)
  644. $val = GFCommon::to_money($val, rgar($lead, "currency"));
  645. }
  646. else if($field["type"] == "post_category"){
  647. $use_id = strtolower(rgar($match,4)) == "id";
  648. $item_value = self::format_post_category($item, $use_id);
  649. $val = RGFormsModel::is_field_hidden($form, $field, array(), $lead) ? "" : $item_value;
  650. }
  651. else{
  652. $val = RGFormsModel::is_field_hidden($form, $field, array(), $lead) ? "" : RGFormsModel::get_choice_text($field, $raw_value, $input_id);
  653. }
  654. $ary[] = self::format_variable_value($val, $url_encode, $esc_html, $format);
  655. }
  656. $value = self::implode_non_blank(", ", $ary);
  657. break;
  658. case "multiselect" :
  659. if($field["type"] == "post_category"){
  660. $use_id = strtolower(rgar($match,4)) == "id";
  661. $items = explode(",", $value);
  662. if(is_array($items)){
  663. $cats = array();
  664. foreach($items as $item){
  665. $cat = self::format_post_category($item, $use_id);
  666. $cats[] = self::format_variable_value($cat, $url_encode, $esc_html, $format);
  667. }
  668. $value = self::implode_non_blank(", ", $cats);
  669. }
  670. }
  671. break;
  672. case "date" :
  673. $value = self::date_display($value, rgar($field,"dateFormat"));
  674. break;
  675. case "total" :
  676. $format_numeric = rgar($match,4) == "price";
  677. $value = $format_numeric ? GFCommon::to_number($value) : GFCommon::to_money($value);
  678. $value = self::format_variable_value($value, $url_encode, $esc_html, $format);
  679. break;
  680. case "post_category" :
  681. $use_id = strtolower(rgar($match,4)) == "id";
  682. $value = self::format_post_category($value, $use_id);
  683. $value = self::format_variable_value($value, $url_encode, $esc_html, $format);
  684. break;
  685. case "list" :
  686. $output_format = in_array(rgar($match,4), array("text", "html", "url")) ? rgar($match,4) : $format;
  687. $value = self::get_lead_field_display($field, $raw_value, $lead["currency"], true, $output_format);
  688. break;
  689. }
  690. if(rgar($match,4) == "label"){
  691. $value = empty($value) ? "" : rgar($field, "label");
  692. }
  693. else if(rgar($match,4) == "qty" && $field["type"] == "product"){
  694. //getting quantity associated with product field
  695. $products = self::get_product_fields($form, $lead, false, false);
  696. $value = 0;
  697. foreach($products["products"] as $product_id => $product)
  698. {
  699. if($product_id == $field["id"])
  700. $value = $product["quantity"];
  701. }
  702. }
  703. //filter can change merge code variable
  704. $value = apply_filters("gform_merge_tag_filter", $value, $input_id, rgar($match,4), $field, $raw_value);
  705. if($value === false)
  706. $value = "";
  707. $text = str_replace($match[0], $value , $text);
  708. }
  709. }
  710. //replacing global variables
  711. //form title
  712. $text = str_replace("{form_title}", $url_encode ? urlencode($form["title"]) : $form["title"], $text);
  713. $matches = array();
  714. preg_match_all("/{all_fields(:(.*?))?}/", $text, $matches, PREG_SET_ORDER);
  715. foreach($matches as $match){
  716. $options = explode(",", rgar($match,2));
  717. $use_value = in_array("value", $options);
  718. $display_empty = in_array("empty", $options);
  719. $use_admin_label = in_array("admin", $options);
  720. //all submitted fields using text
  721. if (strpos($text, $match[0]) !== false){
  722. $text = str_replace($match[0], self::get_submitted_fields($form, $lead, $display_empty, !$use_value, $format, $use_admin_label, "all_fields", rgar($match,2)), $text);
  723. }
  724. }
  725. //all submitted fields including empty fields
  726. if (strpos($text, "{all_fields_display_empty}") !== false){
  727. $text = str_replace("{all_fields_display_empty}", self::get_submitted_fields($form, $lead, true, true, $format, false, "all_fields_display_empty"), $text);
  728. }
  729. //pricing fields
  730. if (strpos($text, "{pricing_fields}") !== false){
  731. $text = str_replace("{pricing_fields}", self::get_submitted_pricing_fields($form, $lead, $format), $text);
  732. }
  733. //form id
  734. $text = str_replace("{form_id}", $url_encode ? urlencode($form["id"]) : $form["id"], $text);
  735. //entry id
  736. $text = str_replace("{entry_id}", $url_encode ? urlencode(rgar($lead, "id")) : rgar($lead, "id"), $text);
  737. //entry url
  738. $entry_url = get_bloginfo("wpurl") . "/wp-admin/admin.php?page=gf_entries&view=entry&id=" . $form["id"] . "&lid=" . rgar($lead,"id");
  739. $text = str_replace("{entry_url}", $url_encode ? urlencode($entry_url) : $entry_url, $text);
  740. //post id
  741. $text = str_replace("{post_id}", $url_encode ? urlencode($lead["post_id"]) : $lead["post_id"], $text);
  742. //admin email
  743. $wp_email = get_bloginfo("admin_email");
  744. $text = str_replace("{admin_email}", $url_encode ? urlencode($wp_email) : $wp_email, $text);
  745. //post edit url
  746. $post_url = get_bloginfo("wpurl") . "/wp-admin/post.php?action=edit&post=" . $lead["post_id"];
  747. $text = str_replace("{post_edit_url}", $url_encode ? urlencode($post_url) : $post_url, $text);
  748. $text = self::replace_variables_prepopulate($text, $url_encode);
  749. // hook allows for custom merge tags
  750. $text = apply_filters('gform_replace_merge_tags', $text, $form, $lead, $url_encode, $esc_html, $nl2br, $format);
  751. // TODO: Deprecate the 'gform_replace_merge_tags' and replace it with a call to the 'gform_merge_tag_filter'
  752. //$text = apply_filters('gform_merge_tag_filter', $text, false, false, false );
  753. return $text;
  754. }
  755. public static function format_post_category($value, $use_id){
  756. list($item_value, $item_id) = rgexplode(":", $value, 2);
  757. if($use_id && !empty($item_id))
  758. $item_value = $item_id;
  759. return $item_value;
  760. }
  761. public static function get_embed_post(){
  762. global $embed_post, $post, $wp_query;
  763. if($embed_post){
  764. return $embed_post;
  765. }
  766. if(!rgempty("gform_embed_post")){
  767. $post_id = absint(rgpost("gform_embed_post"));
  768. $embed_post = get_post($post_id);
  769. }
  770. else if($wp_query->is_in_loop){
  771. $embed_post = $post;
  772. }
  773. else{
  774. $embed_post = array();
  775. }
  776. }
  777. public static function replace_variables_prepopulate($text, $url_encode=false){
  778. //embed url
  779. $text = str_replace("{embed_url}", $url_encode ? urlencode(RGFormsModel::get_current_page_url()) : RGFormsModel::get_current_page_url(), $text);
  780. $local_timestamp = self::get_local_timestamp(time());
  781. //date (mm/dd/yyyy)
  782. $local_date_mdy = date_i18n("m/d/Y", $local_timestamp, true);
  783. $text = str_replace("{date_mdy}", $url_encode ? urlencode($local_date_mdy) : $local_date_mdy, $text);
  784. //date (dd/mm/yyyy)
  785. $local_date_dmy = date_i18n("d/m/Y", $local_timestamp, true);
  786. $text = str_replace("{date_dmy}", $url_encode ? urlencode($local_date_dmy) : $local_date_dmy, $text);
  787. //ip
  788. $text = str_replace("{ip}", $url_encode ? urlencode($_SERVER['REMOTE_ADDR']) : $_SERVER['REMOTE_ADDR'], $text);
  789. global $post;
  790. $post_array = self::object_to_array($post);
  791. preg_match_all("/\{embed_post:(.*?)\}/", $text, $matches, PREG_SET_ORDER);
  792. foreach($matches as $match){
  793. $full_tag = $match[0];
  794. $property = $match[1];
  795. $text = str_replace($full_tag, $url_encode ? urlencode($post_array[$property]) : $post_array[$property], $text);
  796. }
  797. //embed post custom fields
  798. preg_match_all("/\{custom_field:(.*?)\}/", $text, $matches, PREG_SET_ORDER);
  799. foreach($matches as $match){
  800. $full_tag = $match[0];
  801. $custom_field_name = $match[1];
  802. $custom_field_value = !empty($post_array["ID"]) ? get_post_meta($post_array["ID"], $custom_field_name, true) : "";
  803. $text = str_replace($full_tag, $url_encode ? urlencode($custom_field_value) : $custom_field_value, $text);
  804. }
  805. //user agent
  806. $text = str_replace("{user_agent}", $url_encode ? urlencode(RGForms::get("HTTP_USER_AGENT", $_SERVER)) : RGForms::get("HTTP_USER_AGENT", $_SERVER), $text);
  807. //referrer
  808. $text = str_replace("{referer}", $url_encode ? urlencode(RGForms::get("HTTP_REFERER", $_SERVER)) : RGForms::get("HTTP_REFERER", $_SERVER), $text);
  809. //logged in user info
  810. global $userdata, $wp_version, $current_user;
  811. $user_array = self::object_to_array($userdata);
  812. preg_match_all("/\{user:(.*?)\}/", $text, $matches, PREG_SET_ORDER);
  813. foreach($matches as $match){
  814. $full_tag = $match[0];
  815. $property = $match[1];
  816. $value = version_compare($wp_version, '3.3', '>=') ? $current_user->get($property) : $user_array[$property];
  817. $value = $url_encode ? urlencode($value) : $value;
  818. $text = str_replace($full_tag, $value, $text);
  819. }
  820. return $text;
  821. }
  822. public static function object_to_array($object){
  823. $array=array();
  824. if(!empty($object)){
  825. foreach($object as $member=>$data)
  826. $array[$member]=$data;
  827. }
  828. return $array;
  829. }
  830. public static function is_empty_array($val){
  831. if(!is_array($val))
  832. $val = array($val);
  833. $ary = array_values($val);
  834. foreach($ary as $item){
  835. if(!rgblank($item))
  836. return false;
  837. }
  838. return true;
  839. }
  840. public static function get_submitted_fields($form, $lead, $display_empty=false, $use_text=false, $format="html", $use_admin_label=false, $merge_tag="", $options=""){
  841. $field_data = "";
  842. if($format == "html"){
  843. $field_data = '<table width="99%" border="0" cellpadding="1" cellspacing="0" bgcolor="#EAEAEA"><tr><td>
  844. <table width="100%" border="0" cellpadding="5" cellspacing="0" bgcolor="#FFFFFF">
  845. ';
  846. }
  847. $options_array = explode(",", $options);
  848. $no_admin = in_array("noadmin", $options_array);
  849. $no_hidden = in_array("nohidden", $options_array);
  850. $has_product_fields = false;
  851. foreach($form["fields"] as $field){
  852. $field_value = "";
  853. $field_label = $use_admin_label && !rgempty("adminLabel", $field) ? rgar($field, "adminLabel") : esc_html(GFCommon::get_label($field));
  854. switch($field["type"]){
  855. case "captcha" :
  856. break;
  857. case "section" :
  858. if((!GFCommon::is_section_empty($field, $form, $lead) || $display_empty) && !rgar($field, "adminOnly")){
  859. switch($format){
  860. case "text" :
  861. $field_value = "--------------------------------\n{$field_label}\n\n";
  862. break;
  863. default:
  864. $field_value = sprintf('<tr>
  865. <td colspan="2" style="font-size:14px; font-weight:bold; background-color:#EEE; border-bottom:1px solid #DFDFDF; padding:7px 7px">%s</td>
  866. </tr>
  867. ', $field_label);
  868. break;
  869. }
  870. }
  871. $field_value = apply_filters("gform_merge_tag_filter", $field_value, $merge_tag, $options, $field, $field_label);
  872. $field_data .= $field_value;
  873. break;
  874. case "password" :
  875. //ignore password fields
  876. break;
  877. default :
  878. //ignore product fields as they will be grouped together at the end of the grid
  879. if(self::is_product_field($field["type"])){
  880. $has_product_fields = true;
  881. continue;
  882. }
  883. else if(RGFormsModel::is_field_hidden($form, $field, array(), $lead)){
  884. //ignore fields hidden by conditional logic
  885. continue;
  886. }
  887. $raw_field_value = RGFormsModel::get_lead_field_value($lead, $field);
  888. $field_value = GFCommon::get_lead_field_display($field, $raw_field_value, rgar($lead,"currency"), $use_text, $format, "email");
  889. $display_field = true;
  890. //depending on parameters, don't display adminOnly or hidden fields
  891. if($no_admin && rgar($field, "adminOnly"))
  892. $display_field = false;
  893. else if($no_hidden && RGFormsModel::get_input_type($field) == "hidden")
  894. $display_field = false;
  895. //if field is not supposed to be displayed, pass false to filter. otherwise, pass field's value
  896. if(!$display_field)
  897. $field_value = false;
  898. $field_value = apply_filters("gform_merge_tag_filter", $field_value, $merge_tag, $options, $field, $raw_field_value);
  899. if($field_value === false)
  900. continue;
  901. if( !empty($field_value) || strlen($field_value) > 0 || $display_empty){
  902. switch($format){
  903. case "text" :
  904. $field_data .= "{$field_label}: {$field_value}\n\n";
  905. break;
  906. default:
  907. $field_data .= sprintf('<tr bgcolor="#EAF2FA">
  908. <td colspan="2">
  909. <font style="font-family: sans-serif; font-size:12px;"><strong>%s</strong></font>
  910. </td>
  911. </tr>
  912. <tr bgcolor="#FFFFFF">
  913. <td width="20">&nbsp;</td>
  914. <td>
  915. <font style="font-family: sans-serif; font-size:12px;">%s</font>
  916. </td>
  917. </tr>
  918. ', $field_label, empty($field_value) && strlen($field_value) == 0 ? "&nbsp;" : $field_value);
  919. break;
  920. }
  921. }
  922. }
  923. }
  924. if($has_product_fields)
  925. $field_data .= self::get_submitted_pricing_fields($form, $lead, $format, $use_text, $use_admin_label);
  926. if($format == "html"){
  927. $field_data .='</table>
  928. </td>
  929. </tr>
  930. </table>';
  931. }
  932. return $field_data;
  933. }
  934. public static function get_submitted_pricing_fields($form, $lead, $format, $use_text=true, $use_admin_label=false){
  935. $form_id = $form["id"];
  936. $order_label = apply_filters("gform_order_label_{$form["id"]}", apply_filters("gform_order_label", __("Order", "gravityforms"), $form["id"]), $form["id"]);
  937. $products = GFCommon::get_product_fields($form, $lead, $use_text, $use_admin_label);
  938. $total = 0;
  939. $field_data = "";
  940. switch($format){
  941. case "text" :
  942. if(!empty($products["products"])){
  943. $field_data = "--------------------------------\n" . $order_label . "\n\n";
  944. foreach($products["products"] as $product){
  945. $product_name = $product["quantity"] . " " . $product["name"];
  946. $price = self::to_number($product["price"]);
  947. if(!empty($product["options"])){
  948. $product_name .= " (";
  949. $options = array();
  950. foreach($product["options"] as $option){
  951. $price += self::to_number($option["price"]);
  952. $options[] = $option["option_name"];
  953. }
  954. $product_name .= implode(", ", $options) . ")";
  955. }
  956. $subtotal = floatval($product["quantity"]) * $price;
  957. $total += $subtotal;
  958. $field_data .= "{$product_name}: " . self::to_money($subtotal, $lead["currency"]) . "\n\n";
  959. }
  960. $total += floatval($products["shipping"]["price"]);
  961. if(!empty($products["shipping"]["name"]))
  962. $field_data .= $products["shipping"]["name"] . ": " . self::to_money($products["shipping"]["price"], $lead["currency"]) . "\n\n";
  963. $field_data .= __("Total", "gravityforms") . ": " . self::to_money($total, $lead["currency"]) . "\n\n";
  964. }
  965. break;
  966. default :
  967. if(!empty($products["products"])){
  968. $field_data ='<tr bgcolor="#EAF2FA">
  969. <td colspan="2">
  970. <font style="font-family: sans-serif; font-size:12px;"><strong>' . $order_label . '</strong></font>
  971. </td>
  972. </tr>
  973. <tr bgcolor="#FFFFFF">
  974. <td width="20">&nbsp;</td>
  975. <td>
  976. <table cellspacing="0" width="97%" style="border-left:1px solid #DFDFDF; border-top:1px solid #DFDFDF">
  977. <thead>
  978. <th style="background-color:#F4F4F4; border-bottom:1px solid #DFDFDF; border-right:1px solid #DFDFDF; padding:7px; font-family: sans-serif; font-size:12px; text-align:left">' . apply_filters("gform_product_{$form_id}", apply_filters("gform_product", __("Product", "gravityforms"), $form_id), $form_id) . '</th>
  979. <th style="background-color:#F4F4F4; border-bottom:1px solid #DFDFDF; border-right:1px solid #DFDFDF; padding:7px; width:50px; font-family: sans-serif; font-size:12px; text-align:center">' . apply_filters("gform_product_qty_{$form_id}", apply_filters("gform_product_qty", __("Qty", "gravityforms"), $form_id), $form_id) . '</th>
  980. <th style="background-color:#F4F4F4; border-bottom:1px solid #DFDFDF; border-right:1px solid #DFDFDF; padding:7px; width:155px; font-family: sans-serif; font-size:12px; text-align:left">' . apply_filters("gform_product_unitprice_{$form_id}", apply_filters("gform_product_unitprice", __("Unit Price", "gravityforms"), $form_id), $form_id) . '</th>
  981. <th style="background-color:#F4F4F4; border-bottom:1px solid #DFDFDF; border-right:1px solid #DFDFDF; padding:7px; width:155px; font-family: sans-serif; font-size:12px; text-align:left">' . apply_filters("gform_product_price_{$form_id}", apply_filters("gform_product_price", __("Price", "gravityforms"), $form_id), $form_id) . '</th>
  982. </thead>
  983. <tbody>';
  984. foreach($products["products"] as $product){
  985. $field_data .= '<tr>
  986. <td style="border-bottom:1px solid #DFDFDF; border-right:1px solid #DFDFDF; padding:7px; font-family: sans-serif; font-size:11px;" >
  987. <strong style="color:#BF461E; font-size:12px; margin-bottom:5px">' . esc_html($product["name"]) .'</strong>
  988. <ul style="margin:0">';
  989. $price = self::to_number($product["price"]);
  990. if(is_array(rgar($product,"options"))){
  991. foreach($product["options"] as $option){
  992. $price += self::to_number($option["price"]);
  993. $field_data .= '<li style="padding:4px 0 4px 0">' . $option["option_label"] .'</li>';
  994. }
  995. }
  996. $subtotal = floatval($product["quantity"]) * $price;
  997. $total += $subtotal;
  998. $field_data .='</ul>
  999. </td>
  1000. <td style="border-bottom:1px solid #DFDFDF; border-right:1px solid #DFDFDF; padding:7px; text-align:center; width:50px; font-family: sans-serif; font-size:11px;" >' . $product["quantity"] .'</td>
  1001. <td style="border-bottom:1px solid #DFDFDF; border-right:1px solid #DFDFDF; padding:7px; width:155px; font-family: sans-serif; font-size:11px;" >' . self::to_money($price, $lead["currency"]) .'</td>
  1002. <td style="border-bottom:1px solid #DFDFDF; border-right:1px solid #DFDFDF; padding:7px; width:155px; font-family: sans-serif; font-size:11px;" >' . self::to_money($subtotal, $lead["currency"]) .'</td>
  1003. </tr>';
  1004. }
  1005. $total += floatval($products["shipping"]["price"]);
  1006. $field_data .= '</tbody>
  1007. <tfoot>';
  1008. if(!empty($products["shipping"]["name"])){
  1009. $field_data .= '
  1010. <tr>
  1011. <td colspan="2" rowspan="2" style="background-color:#F4F4F4; border-bottom:1px solid #DFDFDF; border-right:1px solid #DFDFDF; padding:7px; font-size:11px;">&nbsp;</td>
  1012. <td style="border-bottom:1px solid #DFDFDF; border-right:1px solid #DFDFDF; padding:7px; text-align:right; width:155px; font-family: sans-serif;"><strong style="font-size:12px;">' . $products["shipping"]["name"] . '</strong></td>
  1013. <td style="border-bottom:1px solid #DFDFDF; border-right:1px solid #DFDFDF; padding:7px; width:155px; font-family: sans-serif;"><strong style="font-size:12px;">'. self::to_money($products["shipping"]["price"], $lead["currency"]) . '</strong></td>
  1014. </tr>
  1015. ';
  1016. }
  1017. $field_data .= '
  1018. <tr>';
  1019. if(empty($products["shipping"]["name"])){
  1020. $field_data .= '
  1021. <td colspan="2" style="background-color:#F4F4F4; border-bottom:1px solid #DFDFDF; border-right:1px solid #DFDFDF; padding:7px; font-size:11px;">&nbsp;</td>';
  1022. }
  1023. $field_data .= '
  1024. <td style="border-bottom:1px solid #DFDFDF; border-right:1px solid #DFDFDF; padding:7px; text-align:right; width:155px; font-family: sans-serif;"><strong style="font-size:12px;">' . __("Total:", "gravityforms") . '</strong></td>
  1025. <td style="border-bottom:1px solid #DFDFDF; border-right:1px solid #DFDFDF; padding:7px; width:155px; font-family: sans-serif;"><strong style="font-size:12px;">'. self::to_money($total, $lead["currency"]) . '</strong></td>
  1026. </tr>
  1027. </tfoot>
  1028. </table>
  1029. </td>
  1030. </tr>';
  1031. }
  1032. break;
  1033. }
  1034. return $field_data;
  1035. }
  1036. public static function send_user_notification($form, $lead, $override_options = false){
  1037. _deprecated_function("send_user_notification", "1.7", "send_notification");
  1038. $notification = self::prepare_user_notification($form, $lead, $override_options);
  1039. self::send_email($notification["from"], $notification["to"], $notification["bcc"], $notification["reply_to"], $notification["subject"], $notification["message"], $notification["from_name"], $notification["message_format"], $notification["attachments"]);
  1040. }
  1041. public static function send_admin_notification($form, $lead, $override_options = false){
  1042. _deprecated_function("send_admin_notification", "1.7", "send_notification");
  1043. $notification = self::prepare_admin_notification($form, $lead, $override_options);
  1044. self::send_email($notification["from"], $notification["to"], $notification["bcc"], $notification["replyTo"], $notification["subject"], $notification["message"], $notification["from_name"], $notification["message_format"], $notification["attachments"]);
  1045. }
  1046. private static function prepare_user_notification($form, $lead, $override_options = false){
  1047. $form_id = $form["id"];
  1048. if(!isset($form["autoResponder"]))
  1049. return;
  1050. //handling autoresponder email
  1051. $to_field = isset($form["autoResponder"]["toField"]) ? rgget($form["autoResponder"]["toField"], $lead) : "";
  1052. $to = apply_filters("gform_autoresponder_email_{$form_id}", apply_filters("gform_autoresponder_email", $to_field, $form), $form);
  1053. $subject = GFCommon::replace_variables(rgget("subject", $form["autoResponder"]), $form, $lead, false, false);
  1054. $message_format = apply_filters("gform_notification_format_{$form["id"]}", apply_filters("gform_notification_format", "html", "user", $form, $lead), "user", $form, $lead);
  1055. $message = GFCommon::replace_variables(rgget("message", $form["autoResponder"]), $form, $lead, false, false, !rgget("disableAutoformat", $form["autoResponder"]), $message_format);
  1056. $message = do_shortcode($message);
  1057. //Running trough variable replacement
  1058. $to = GFCommon::replace_variables($to, $form, $lead, false, false);
  1059. $from = GFCommon::replace_variables(rgget("from", $form["autoResponder"]), $form, $lead, false, false);
  1060. $bcc = GFCommon::replace_variables(rgget("bcc", $form["autoResponder"]), $form, $lead, false, false);
  1061. $reply_to = GFCommon::replace_variables(rgget("replyTo", $form["autoResponder"]), $form, $lead, false, false);
  1062. $from_name = GFCommon::replace_variables(rgget("fromName", $form["autoResponder"]), $form, $lead, false, false);
  1063. // override default values if override options provided
  1064. if($override_options && is_array($override_options)){
  1065. foreach($override_options as $override_key => $override_value){
  1066. ${$override_key} = $override_value;
  1067. }
  1068. }
  1069. $attachments = apply_filters("gform_user_notification_attachments_{$form_id}", apply_filters("gform_user_notification_attachments", array(), $lead, $form), $lead, $form);
  1070. //Disabling autoformat to prevent double autoformatting of messages
  1071. $disableAutoformat = "1";
  1072. return compact("to", "from", "bcc", "reply_to", "subject", "message", "from_name", "message_format", "attachments", "disableAutoformat");
  1073. }
  1074. private static function prepare_admin_notification($form, $lead, $override_options = false){
  1075. $form_id = $form["id"];
  1076. //handling admin notification email
  1077. $subject = GFCommon::replace_variables(rgget("subject", $form["notification"]), $form, $lead, false, false);
  1078. $message_format = apply_filters("gform_notification_format_{$form["id"]}", apply_filters("gform_notification_format", "html", "admin", $form, $lead), "admin", $form, $lead);
  1079. $message = GFCommon::replace_variables(rgget("message", $form["notification"]), $form, $lead, false, false, !rgget("disableAutoformat", $form["notification"]), $message_format);
  1080. $message = do_shortcode($message);
  1081. $version_info = self::get_version_info();
  1082. $is_expired = !rgempty("expiration_time", $version_info) && $version_info["expiration_time"] < time();
  1083. if(!$version_info["is_valid_key"] && $is_expired){
  1084. $message .= "<br/><br/>Your Gravity Forms License Key has expired. In order to continue receiving support and software updates you must renew your license key. You can do so by following the renewal instructions on the Gravity Forms Settings page in your WordPress Dashboard or by <a href='http://www.gravityhelp.com/renew-license/?key=" . self::get_key() . "'>clicking here</a>.";
  1085. }
  1086. $from = rgempty("fromField", $form["notification"]) ? rgget("from", $form["notification"]) : rgget($form["notification"]["fromField"], $lead);
  1087. if(rgempty("fromNameField", $form["notification"])){
  1088. $from_name = rgget("fromName", $form["notification"]);
  1089. }
  1090. else{
  1091. $field = RGFormsModel::get_field($form, rgget("fromNameField", $form["notification"]));
  1092. $value = RGFormsModel::get_lead_field_value($lead, $field);
  1093. $from_name = GFCommon::get_lead_field_display($field, $value);
  1094. }
  1095. $replyTo = rgempty("replyToField", $form["notification"]) ? rgget("replyTo", $form["notification"]): rgget($form["notification"]["replyToField"], $lead);
  1096. if(rgempty("routing", $form["notification"])){
  1097. $email_to = rgempty("toField", $form["notification"]) ? rgget("to", $form["notification"]) : rgget("toField", $form["notification"]);
  1098. }
  1099. else{
  1100. $email_to = array();
  1101. foreach($form["notification"]["routing"] as $routing){
  1102. $source_field = RGFormsModel::get_field($form, $routing["fieldId"]);
  1103. $field_value = RGFormsModel::get_lead_field_value($lead, $source_field);
  1104. $is_value_match = RGFormsModel::is_value_match($field_value, $routing["value"], $routing["operator"], $source_field) && !RGFormsModel::is_field_hidden($form, $source_field, array(), $lead);
  1105. if ($is_value_match)
  1106. $email_to[] = $routing["email"];
  1107. }
  1108. $email_to = join(",", $email_to);
  1109. }
  1110. //Running through variable replacement
  1111. $email_to = GFCommon::replace_variables($email_to, $form, $lead, false, false);
  1112. $from = GFCommon::replace_variables($from, $form, $lead, false, false);
  1113. $bcc = GFCommon::replace_variables(rgget("bcc", $form["notification"]), $form, $lead, false, false);
  1114. $reply_to = GFCommon::replace_variables($replyTo, $form, $lead, false, false);
  1115. $from_name = GFCommon::replace_variables($from_name, $form, $lead, false, false);
  1116. //Filters the admin notification email to address. Allows users to change email address before notification is sent
  1117. $to = apply_filters("gform_notification_email_{$form_id}" , apply_filters("gform_notification_email", $email_to, $lead), $lead);
  1118. // override default values if override options provided
  1119. if($override_options && is_array($override_options)){
  1120. foreach($override_options as $override_key => $override_value){
  1121. ${$override_key} = $override_value;
  1122. }
  1123. }
  1124. $attachments = apply_filters("gform_admin_notification_attachments_{$form_id}", apply_filters("gform_admin_notification_attachments", array(), $lead, $form), $lead, $form);
  1125. //Disabling autoformat to prevent double autoformatting of messages
  1126. $disableAutoformat = "1";
  1127. return compact("to", "from", "bcc", "replyTo", "subject", "message", "from_name", "message_format", "attachments", "disableAutoformat");
  1128. }
  1129. public static function send_notification($notification, $form, $lead){
  1130. $notification = apply_filters("gform_notification_{$form["id"]}", apply_filters("gform_notification", $notification, $form, $lead), $form, $lead);
  1131. $to_field = "";
  1132. if(rgar($notification, "toType") == "field"){
  1133. $to_field = rgar($notification, "toField");
  1134. if(rgempty("toField", $notification)){
  1135. $to_field = rgar($notification, "to");
  1136. }
  1137. }
  1138. $email_to = rgar($notification, "to");
  1139. //do routing logic if "to" field doesn't have a value (to support legacy notifications what will run routing prior to this method
  1140. if(empty($email_to) && rgar($notification, "toType") == "routing"){
  1141. $email_to = array();
  1142. foreach($notification["routing"] as $routing){
  1143. $source_field = RGFormsModel::get_field($form, $routing["fieldId"]);
  1144. $field_value = RGFormsModel::get_lead_field_value($lead, $source_field);
  1145. $is_value_match = RGFormsModel::is_value_match($field_value, $routing["value"], $routing["operator"], $source_field) && !RGFormsModel::is_field_hidden($form, $source_field, array(), $lead);
  1146. if ($is_value_match)
  1147. $email_to[] = $routing["email"];
  1148. }
  1149. $email_to = join(",", $email_to);
  1150. }
  1151. else if (!empty($to_field)) {
  1152. $source_field = RGFormsModel::get_field($form, $to_field);
  1153. $email_to = RGFormsModel::get_lead_field_value($lead, $source_field);
  1154. }
  1155. //Running through variable replacement
  1156. $to = GFCommon::replace_variables($email_to, $form, $lead, false, false);
  1157. $subject = GFCommon::replace_variables(rgar($notification, "subject"), $form, $lead, false, false);
  1158. $from = GFCommon::replace_variables(rgar($notification, "from"), $form, $lead, false, false);
  1159. $from_name = GFCommon::replace_variables(rgar($notification, "fromName"), $form, $lead, false, false);
  1160. $bcc = GFCommon::replace_variables(rgar($notification, "bcc"), $form, $lead, false, false);
  1161. $replyTo = GFCommon::replace_variables(rgar($notification, "replyTo"), $form, $lead, false, false);
  1162. $message_format = rgempty("message_format", $notification) ? "html" : rgar($notification, "message_format");
  1163. $message = GFCommon::replace_variables(rgar($notification, "message"), $form, $lead, false, false, !rgar($notification, "disableAutoformat"), $message_format);
  1164. $message = do_shortcode($message);
  1165. // allow attachments to be passed as a single path (string) or an array of paths, if string provided, add to array
  1166. $attachments = rgar( $notification, "attachments" );
  1167. if( !empty( $attachments ) ) {
  1168. $attachments = is_array( $attachments ) ? $attachments : array( $attachments );
  1169. } else {
  1170. $attachments = array();
  1171. }
  1172. self::send_email($from, $to, $bcc, $replyTo, $subject, $message, $from_name, $message_format, $attachments);
  1173. return compact("to", "from", "bcc", "replyTo", "subject", "message", "from_name", "message_format", "attachments");
  1174. }
  1175. public static function send_notifications($notification_ids, $form, $lead, $do_conditional_logic = true, $event = "form_submission"){
  1176. if(!is_array($notification_ids)){
  1177. return;
  1178. }
  1179. foreach($notification_ids as $notification_id){
  1180. if(!isset($form["notifications"][$notification_id])){
  1181. continue;
  1182. }
  1183. $notification = $form["notifications"][$notification_id];
  1184. //check conditional logic when appropriate
  1185. if($do_conditional_logic && !GFCommon::evaluate_conditional_logic( rgar($notification,"conditionalLogic"), $form, $lead) ){
  1186. continue;
  1187. }
  1188. if(rgar($notification,"type") == "user"){
  1189. //Getting user notification from legacy structure (for backwards compatibility)
  1190. $legacy_notification = GFCommon::prepare_user_notification($form, $lead);
  1191. $notification = self::merge_legacy_notification($notification, $legacy_notification);
  1192. }
  1193. else if(rgar($notification,"type") == "admin"){
  1194. //Getting admin notification from legacy structure (for backwards compatibility)
  1195. $legacy_notification = GFCommon::prepare_admin_notification($form, $lead);
  1196. $notification = self::merge_legacy_notification($notification, $legacy_notification);
  1197. }
  1198. //sending notification
  1199. self::send_notification($notification, $form, $lead);
  1200. }
  1201. }
  1202. public static function send_form_submission_notifications($form, $lead){
  1203. $notifications = self::get_notifications_to_send("form_submission", $form, $lead);
  1204. $notifications_to_send = array();
  1205. //running through filters that disable form submission notifications
  1206. foreach($notifications as $notification){
  1207. if(rgar($notification,"type") == "user" && apply_filters("gform_disable_user_notification_{$form["id"]}", apply_filters("gform_disable_user_notification", false, $form, $lead), $form, $lead)){
  1208. //skip user notification if it has been disabled by a hook
  1209. continue;
  1210. }
  1211. else if(rgar($notification,"type") == "admin" && apply_filters("gform_disable_admin_notification_{$form["id"]}", apply_filters("gform_disable_admin_notification", false, $form, $lead), $form, $lead)){
  1212. //skip admin notification if it has been disabled by a hook
  1213. continue;
  1214. }
  1215. if(apply_filters("gform_disable_notification_{$form["id"]}", apply_filters("gform_disable_notification", false, $notification, $form, $lead), $notification, $form, $lead)){
  1216. //skip notifications if it has been disabled by a hook
  1217. continue;
  1218. }
  1219. $notifications_to_send[] = $notification["id"];
  1220. }
  1221. self::send_notifications($notifications_to_send, $form, $lead, true, "form_submission");
  1222. }
  1223. private static function merge_legacy_notification($notification, $notification_data){
  1224. $keys = array("to", "from", "bcc", "replyTo", "subject", "message", "from_name", "message_format", "attachments", "disableAutoformat");
  1225. foreach($keys as $key)
  1226. $notification[$key] = rgar($notification_data,$key);
  1227. return $notification;
  1228. }
  1229. public static function get_notifications_to_send($action, $form, $lead){
  1230. $notifications = self::get_notifications($action, $form);
  1231. $notifications_to_send = array();
  1232. foreach($notifications as $notification){
  1233. if(GFCommon::evaluate_conditional_logic(rgar($notification,"conditionalLogic"), $form, $lead)){
  1234. $notifications_to_send[] = $notification;
  1235. }
  1236. }
  1237. return $notifications_to_send;
  1238. }
  1239. public static function get_notifications($action, $form){
  1240. if(rgempty("notifications", $form))
  1241. return array();
  1242. $notifications = array();
  1243. foreach($form["notifications"] as $notification){
  1244. if(rgar($notification, "event") == $action)
  1245. $notifications[] = $notification;
  1246. }
  1247. return $notifications;
  1248. }
  1249. public static function has_admin_notification($form){
  1250. return (!empty($form["notification"]["to"]) || !empty($form["notification"]["routing"])) && (!empty($form["notification"]["subject"]) || !empty($form["notification"]["message"]));
  1251. }
  1252. public static function has_user_notification($form){
  1253. return !empty($form["autoResponder"]["toField"]) && (!empty($form["autoResponder"]["subject"]) || !empty($form["autoResponder"]["message"]));
  1254. }
  1255. private static function send_email($from, $to, $bcc, $reply_to, $subject, $message, $from_name="", $message_format="html", $attachments=""){
  1256. $to = str_replace(" ", "", $to);
  1257. $bcc = str_replace(" ", "", $bcc);
  1258. //invalid to email address or no content. can't send email
  1259. if(!GFCommon::is_valid_email($to) || (empty($subject) && empty($message))){
  1260. GFCommon::log_debug("Cannot send email because either the TO address is invalid or there is no SUBJECT or MESSAGE.");
  1261. GFCommon::log_debug(print_r(compact("to", "subject", "message"), true));
  1262. return;
  1263. }
  1264. if(!GFCommon::is_valid_email($from))
  1265. $from = get_bloginfo("admin_email");
  1266. //invalid from address. can't send email
  1267. if(!GFCommon::is_valid_email($from)){
  1268. GFCommon::log_debug("Cannot send email because the FROM address is invalid.");
  1269. GFCommon::log_debug(print_r(compact("to", "from", "subject"), true));
  1270. return;
  1271. }
  1272. $content_type = $message_format == "html" ? "text/html" : "text/plain";
  1273. $name = empty($from_name) ? $from : $from_name;
  1274. $headers = array();
  1275. $headers["From"] = "From: \"{$name}\" <{$from}>";
  1276. if(GFCommon::is_valid_email($reply_to))
  1277. $headers["Reply-To"] = "Reply-To: {$reply_to}";
  1278. if(GFCommon::is_valid_email($bcc))
  1279. $headers["Bcc"] = "Bcc: $bcc";
  1280. $headers["Content-type"] = "Content-type: {$content_type}; charset=" . get_option('blog_charset');
  1281. $abort_email = false;
  1282. extract(apply_filters("gform_pre_send_email", compact("to", "subject", "message", "headers", "attachments", "abort_email"), $message_format));
  1283. $is_success = false;
  1284. if(!$abort_email){
  1285. GFCommon::log_debug("Sending email via wp_mail()");
  1286. GFCommon::log_debug(print_r(compact("to", "subject", "message", "headers", "attachments", "abort_email"), true));
  1287. $is_success = wp_mail($to, $subject, $message, $headers, $attachments);
  1288. GFCommon::log_debug("Result from wp_mail(): {$is_success}");
  1289. }
  1290. do_action("gform_after_email", $is_success, $to, $subject, $message, $headers, $attachments, $message_format);
  1291. }
  1292. public static function has_post_field($fields){
  1293. foreach($fields as $field){
  1294. if(in_array($field["type"], array("post_title", "post_content", "post_excerpt", "post_category", "post_image", "post_tags", "post_custom_field")))
  1295. return true;
  1296. }
  1297. return false;
  1298. }
  1299. public static function has_list_field($form){
  1300. return self::has_field_by_type($form, 'list');
  1301. }
  1302. public static function has_credit_card_field($form){
  1303. return self::has_field_by_type($form, 'creditcard');
  1304. }
  1305. private static function has_field_by_type($form, $type) {
  1306. if(is_array($form["fields"])){
  1307. foreach($form["fields"] as $field){
  1308. if(RGFormsModel::get_input_type($field) == $type)
  1309. return true;
  1310. }
  1311. }
  1312. return false;
  1313. }
  1314. public static function current_user_can_any($caps){
  1315. if(!is_array($caps)){
  1316. $has_cap = current_user_can($caps) || current_user_can("gform_full_access");
  1317. return $has_cap;
  1318. }
  1319. foreach($caps as $cap){
  1320. if(current_user_can($cap)){
  1321. return true;
  1322. }
  1323. }
  1324. $has_full_access = current_user_can("gform_full_access");
  1325. return $has_full_access;
  1326. }
  1327. public static function current_user_can_which($caps){
  1328. foreach($caps as $cap){
  1329. if(current_user_can($cap))
  1330. return $cap;
  1331. }
  1332. return "";
  1333. }
  1334. public static function is_pricing_field($field_type){
  1335. return self::is_product_field($field_type) || $field_type == "donation";
  1336. }
  1337. public static function is_product_field($field_type){
  1338. return in_array($field_type, array("option", "quantity", "product", "total", "shipping", "calculation"));
  1339. }
  1340. public static function all_caps(){
  1341. return array( 'gravityforms_edit_forms',
  1342. 'gravityforms_delete_forms',
  1343. 'gravityforms_create_form',
  1344. 'gravityforms_view_entries',
  1345. 'gravityforms_edit_entries',
  1346. 'gravityforms_delete_entries',
  1347. 'gravityforms_view_settings',
  1348. 'gravityforms_edit_settings',
  1349. 'gravityforms_export_entries',
  1350. 'gravityforms_uninstall',
  1351. 'gravityforms_view_entry_notes',
  1352. 'gravityforms_edit_entry_notes',
  1353. 'gravityforms_view_updates',
  1354. 'gravityforms_addon_browser',
  1355. 'gravityforms_preview_forms'
  1356. );
  1357. }
  1358. public static function delete_directory($dir) {
  1359. if(!file_exists($dir))
  1360. return;
  1361. if ($handle = opendir($dir)){
  1362. $array = array();
  1363. while (false !== ($file = readdir($handle))) {
  1364. if ($file != "." && $file != "..") {
  1365. if(is_dir($dir.$file)){
  1366. if(!@rmdir($dir.$file)) // Empty directory? Remove it
  1367. self::delete_directory($dir.$file.'/'); // Not empty? Delete the files inside it
  1368. }
  1369. else{
  1370. @unlink($dir.$file);
  1371. }
  1372. }
  1373. }
  1374. closedir($handle);
  1375. @rmdir($dir);
  1376. }
  1377. }
  1378. public static function get_remote_message(){
  1379. return stripslashes(get_option("rg_gforms_message"));
  1380. }
  1381. public static function get_key(){
  1382. return get_option("rg_gforms_key");
  1383. }
  1384. public static function has_update($use_cache=true){
  1385. $version_info = GFCommon::get_version_info($use_cache);
  1386. return version_compare(GFCommon::$version, $version_info["version"], '<');
  1387. }
  1388. public static function get_key_info($key){
  1389. $options = array('method' => 'POST', 'timeout' => 3);
  1390. $options['headers'] = array(
  1391. 'Content-Type' => 'application/x-www-form-urlencoded; charset=' . get_option('blog_charset'),
  1392. 'User-Agent' => 'WordPress/' . get_bloginfo("version"),
  1393. 'Referer' => get_bloginfo("url")
  1394. );
  1395. $request_url = GRAVITY_MANAGER_URL . "/api.php?op=get_key&key={$key}";
  1396. $raw_response = wp_remote_request($request_url, $options);
  1397. if ( is_wp_error( $raw_response ) || $raw_response['response']['code'] != 200)
  1398. return array();
  1399. $key_info = unserialize(trim($raw_response["body"]));
  1400. return $key_info ? $key_info : array();
  1401. }
  1402. public static function get_version_info($cache=true){
  1403. $raw_response = get_transient("gform_update_info");
  1404. if(!$cache)
  1405. $raw_response = null;
  1406. if(!$raw_response){
  1407. //Getting version number
  1408. $options = array('method' => 'POST', 'timeout' => 20);
  1409. $options['headers'] = array(
  1410. 'Content-Type' => 'application/x-www-form-urlencoded; charset=' . get_option('blog_charset'),
  1411. 'User-Agent' => 'WordPress/' . get_bloginfo("version"),
  1412. 'Referer' => get_bloginfo("url")
  1413. );
  1414. $request_url = GRAVITY_MANAGER_URL . "/version.php?" . self::get_remote_request_params();
  1415. $raw_response = wp_remote_request($request_url, $options);
  1416. //caching responses.
  1417. set_transient("gform_update_info", $raw_response, 86400); //caching for 24 hours
  1418. }
  1419. if ( is_wp_error( $raw_response ) || 200 != $raw_response['response']['code']) {
  1420. return array("is_valid_key" => "1", "version" => "", "url" => "");
  1421. } else {
  1422. list($is_valid_key, $version, $url, $exp_time) = array_pad(explode("||", $raw_response['body']), 4, false);
  1423. $info = array("is_valid_key" => $is_valid_key, "version" => $version, "url" => $url);
  1424. if($exp_time)
  1425. $info["expiration_time"] = $exp_time;
  1426. return $info;
  1427. }
  1428. }
  1429. public static function get_remote_request_params(){
  1430. global $wpdb;
  1431. return sprintf("of=GravityForms&key=%s&v=%s&wp=%s&php=%s&mysql=%s", urlencode(self::get_key()), urlencode(self::$version), urlencode(get_bloginfo("version")), urlencode(phpversion()), urlencode($wpdb->db_version()));
  1432. }
  1433. public static function ensure_wp_version(){
  1434. if(!GF_SUPPORTED_WP_VERSION){
  1435. echo "<div class='error' style='padding:10px;'>" . sprintf(__("Gravity Forms require WordPress %s or greater. You must upgrade WordPress in order to use Gravity Forms", "gravityforms"), GF_MIN_WP_VERSION) . "</div>";
  1436. return false;
  1437. }
  1438. return true;
  1439. }
  1440. public static function check_update($option, $cache=true){
  1441. if(!is_object($option))
  1442. return $option;
  1443. $version_info = self::get_version_info($cache);
  1444. if (!$version_info)
  1445. return $option;
  1446. $plugin_path = "gravityforms/gravityforms.php";
  1447. if(empty($option->response[$plugin_path]))
  1448. $option->response[$plugin_path] = new stdClass();
  1449. //Empty response means that the key is invalid. Do not queue for upgrade
  1450. if(!$version_info["is_valid_key"] || version_compare(GFCommon::$version, $version_info["version"], '>=')){
  1451. unset($option->response[$plugin_path]);
  1452. }
  1453. else{
  1454. $option->response[$plugin_path]->url = "http://www.gravityforms.com";
  1455. $option->response[$plugin_path]->slug = "gravityforms";
  1456. $option->response[$plugin_path]->package = str_replace("{KEY}", GFCommon::get_key(), $version_info["url"]);
  1457. $option->response[$plugin_path]->new_version = $version_info["version"];
  1458. $option->response[$plugin_path]->id = "0";
  1459. }
  1460. return $option;
  1461. }
  1462. public static function cache_remote_message(){
  1463. //Getting version number
  1464. $key = GFCommon::get_key();
  1465. $body = "key=$key";
  1466. $options = array('method' => 'POST', 'timeout' => 3, 'body' => $body);
  1467. $options['headers'] = array(
  1468. 'Content-Type' => 'application/x-www-form-urlencoded; charset=' . get_option('blog_charset'),
  1469. 'Content-Length' => strlen($body),
  1470. 'User-Agent' => 'WordPress/' . get_bloginfo("version"),
  1471. 'Referer' => get_bloginfo("url")
  1472. );
  1473. $request_url = GRAVITY_MANAGER_URL . "/message.php?" . GFCommon::get_remote_request_params();
  1474. $raw_response = wp_remote_request($request_url, $options);
  1475. if ( is_wp_error( $raw_response ) || 200 != $raw_response['response']['code'] )
  1476. $message = "";
  1477. else
  1478. $message = $raw_response['body'];
  1479. //validating that message is a valid Gravity Form message. If message is invalid, don't display anything
  1480. if(substr($message, 0, 10) != "<!--GFM-->")
  1481. $message = "";
  1482. update_option("rg_gforms_message", $message);
  1483. }
  1484. public static function get_local_timestamp($timestamp){
  1485. return $timestamp + (get_option( 'gmt_offset' ) * 3600 );
  1486. }
  1487. public static function get_gmt_timestamp($local_timestamp){
  1488. return $local_timestamp - (get_option( 'gmt_offset' ) * 3600 );
  1489. }
  1490. public static function format_date($gmt_datetime, $is_human = true, $date_format="", $include_time=true){
  1491. if(empty($gmt_datetime))
  1492. return "";
  1493. //adjusting date to local configured Time Zone
  1494. $lead_gmt_time = mysql2date("G", $gmt_datetime);
  1495. $lead_local_time = self::get_local_timestamp($lead_gmt_time);
  1496. if(empty($date_format))
  1497. $date_format = get_option('date_format');
  1498. if($is_human){
  1499. $time_diff = time() - $lead_gmt_time;
  1500. if ($time_diff > 0 && $time_diff < 24*60*60)
  1501. $date_display = sprintf(__('%s ago', 'gravityforms'), human_time_diff($lead_gmt_time));
  1502. else
  1503. $date_display = $include_time ? sprintf(__('%1$s at %2$s', 'gravityforms'), date_i18n($date_format, $lead_local_time, true), date_i18n(get_option('time_format'), $lead_local_time, true)) : date_i18n($date_format, $lead_local_time, true);
  1504. }
  1505. else{
  1506. $date_display = $include_time ? sprintf(__('%1$s at %2$s', 'gravityforms'), date_i18n($date_format, $lead_local_time, true), date_i18n(get_option('time_format'), $lead_local_time, true)) : date_i18n($date_format, $lead_local_time, true);
  1507. }
  1508. return $date_display;
  1509. }
  1510. public static function get_selection_value($value){
  1511. $ary = explode("|", $value);
  1512. $val = $ary[0];
  1513. return $val;
  1514. }
  1515. public static function selection_display($value, $field, $currency="", $use_text=false){
  1516. $ary = explode("|", $value);
  1517. $val = $ary[0];
  1518. $price = count($ary) > 1 ? $ary[1] : "";
  1519. if($use_text)
  1520. $val = RGFormsModel::get_choice_text($field, $val);
  1521. if(!empty($price))
  1522. return "$val (" . self::to_money($price, $currency) . ")";
  1523. else
  1524. return $val;
  1525. }
  1526. public static function date_display($value, $format = "mdy"){
  1527. $date = self::parse_date($value, $format);
  1528. if(empty($date))
  1529. return $value;
  1530. list($position, $separator) = rgexplode("_", $format, 2);
  1531. switch($separator){
  1532. case "dash" :
  1533. $separator = "-";
  1534. break;
  1535. case "dot" :
  1536. $separator = ".";
  1537. break;
  1538. default :
  1539. $separator = "/";
  1540. break;
  1541. }
  1542. switch($position){
  1543. case "ymd" :
  1544. return $date["year"] . $separator . $date["month"] . $separator . $date["day"];
  1545. break;
  1546. case "dmy" :
  1547. return $date["day"] . $separator . $date["month"] . $separator . $date["year"];
  1548. break;
  1549. default :
  1550. return $date["month"] . $separator . $date["day"] . $separator . $date["year"];
  1551. break;
  1552. }
  1553. }
  1554. public static function parse_date($date, $format="mdy"){
  1555. $date_info = array();
  1556. $position = substr($format, 0, 3);
  1557. if(is_array($date)){
  1558. switch($position){
  1559. case "mdy" :
  1560. $date_info["month"] = rgar($date, 0);
  1561. $date_info["day"] = rgar($date, 1);
  1562. $date_info["year"] = rgar($date, 2);
  1563. break;
  1564. case "dmy" :
  1565. $date_info["day"] = rgar($date, 0);
  1566. $date_info["month"] = rgar($date, 1);
  1567. $date_info["year"] = rgar($date, 2);
  1568. break;
  1569. case "ymd" :
  1570. $date_info["year"] = rgar($date, 0);
  1571. $date_info["month"] = rgar($date, 1);
  1572. $date_info["day"] = rgar($date, 2);
  1573. break;
  1574. }
  1575. return $date_info;
  1576. }
  1577. $date = preg_replace("|[/\.]|", "-", $date);
  1578. if(preg_match('/^(\d{1,4})-(\d{1,2})-(\d{1,4})$/', $date, $matches)){
  1579. if(strlen($matches[1]) == 4){
  1580. //format yyyy-mm-dd
  1581. $date_info["year"] = $matches[1];
  1582. $date_info["month"] = $matches[2];
  1583. $date_info["day"] = $matches[3];
  1584. }
  1585. else if ($position == "mdy"){
  1586. //format mm-dd-yyyy
  1587. $date_info["month"] = $matches[1];
  1588. $date_info["day"] = $matches[2];
  1589. $date_info["year"] = $matches[3];
  1590. }
  1591. else{
  1592. //format dd-mm-yyyy
  1593. $date_info["day"] = $matches[1];
  1594. $date_info["month"] = $matches[2];
  1595. $date_info["year"] = $matches[3];
  1596. }
  1597. }
  1598. return $date_info;
  1599. }
  1600. public static function truncate_url($url){
  1601. $truncated_url = basename($url);
  1602. if(empty($truncated_url))
  1603. $truncated_url = dirname($url);
  1604. $ary = explode("?", $truncated_url);
  1605. return $ary[0];
  1606. }
  1607. public static function get_tabindex(){
  1608. return GFCommon::$tab_index > 0 ? "tabindex='" . GFCommon::$tab_index++ . "'" : "";
  1609. }
  1610. public static function get_checkbox_choices($field, $value, $disabled_text){
  1611. $choices = "";
  1612. if(is_array($field["choices"])){
  1613. $choice_number = 1;
  1614. $count = 1;
  1615. foreach($field["choices"] as $choice){
  1616. if($choice_number % 10 == 0) //hack to skip numbers ending in 0. so that 5.1 doesn't conflict with 5.10
  1617. $choice_number++;
  1618. $input_id = $field["id"] . '.' . $choice_number;
  1619. $id = $field["id"] . '_' . $choice_number++;
  1620. if(empty($_POST) && rgar($choice,"isSelected")){
  1621. $checked = "checked='checked'";
  1622. }
  1623. else if(is_array($value) && RGFormsModel::choice_value_match($field, $choice, rgget($input_id, $value))){
  1624. $checked = "checked='checked'";
  1625. }
  1626. else if(!is_array($value) && RGFormsModel::choice_value_match($field, $choice, $value)){
  1627. $checked = "checked='checked'";
  1628. }
  1629. else{
  1630. $checked = "";
  1631. }
  1632. $logic_event = self::get_logic_event($field, "click");
  1633. $tabindex = self::get_tabindex();
  1634. $choice_value = $choice["value"];
  1635. if(rgget("enablePrice", $field))
  1636. $choice_value .= "|" . GFCommon::to_number(rgar($choice,"price"));
  1637. $choices.= sprintf("<li class='gchoice_$id'><input name='input_%s' type='checkbox' $logic_event value='%s' %s id='choice_%s' $tabindex %s /><label for='choice_%s'>%s</label></li>", $input_id, esc_attr($choice_value), $checked, $id, $disabled_text, $id, $choice["text"]);
  1638. if(IS_ADMIN && RG_CURRENT_VIEW != "entry" && $count >=5)
  1639. break;
  1640. $count++;
  1641. }
  1642. $total = sizeof($field["choices"]);
  1643. if($count < $total)
  1644. $choices .= "<li class='gchoice_total'>" . sprintf(__("%d of %d items shown. Edit field to view all", "gravityforms"), $count, $total) . "</li>";
  1645. }
  1646. return apply_filters("gform_field_choices_" . rgget("formId", $field), apply_filters("gform_field_choices", $choices, $field), $field);
  1647. }
  1648. public static function get_radio_choices($field, $value="", $disabled_text){
  1649. $choices = "";
  1650. if(is_array($field["choices"])){
  1651. $choice_id = 0;
  1652. // add "other" choice to choices if enabled
  1653. if(rgar($field, 'enableOtherChoice')) {
  1654. $other_default_value = GFCommon::get_other_choice_value();
  1655. $field["choices"][] = array('text' => $other_default_value, 'value' => 'gf_other_choice', 'isSelected' => false, 'isOtherChoice' => true);
  1656. }
  1657. $logic_event = self::get_logic_event($field, "click");
  1658. $count = 1;
  1659. foreach($field["choices"] as $choice){
  1660. $id = $field["id"] . '_' . $choice_id++;
  1661. $field_value = !empty($choice["value"]) || rgar($field, "enableChoiceValue") ? $choice["value"] : $choice["text"];
  1662. if(rgget("enablePrice", $field))
  1663. $field_value .= "|" . GFCommon::to_number(rgar($choice,"price"));
  1664. if(rgblank($value) && RG_CURRENT_VIEW != "entry"){
  1665. $checked = rgar($choice,"isSelected") ? "checked='checked'" : "";
  1666. }
  1667. else {
  1668. $checked = RGFormsModel::choice_value_match($field, $choice, $value) ? "checked='checked'" : "";
  1669. }
  1670. $tabindex = self::get_tabindex();
  1671. $label = sprintf("<label for='choice_%s'>%s</label>", $id, $choice["text"]);
  1672. $input_focus = '';
  1673. // handle "other" choice
  1674. if(rgar($choice, 'isOtherChoice')) {
  1675. $onfocus = !IS_ADMIN ? 'jQuery(this).prev("input").attr("checked", true); if(jQuery(this).val() == "' . $other_default_value . '") { jQuery(this).val(""); }' : '';
  1676. $onblur = !IS_ADMIN ? 'if(jQuery(this).val().replace(" ", "") == "") { jQuery(this).val("' . $other_default_value . '"); }' : '';
  1677. $input_focus = !IS_ADMIN ? "onfocus=\"jQuery(this).next('input').focus();\"" : "";
  1678. $value_exists = RGFormsModel::choices_value_match($field, $field["choices"], $value);
  1679. if($value == 'gf_other_choice' && rgpost("input_{$field["id"]}_other")){
  1680. $other_value = rgpost("input_{$field["id"]}_other");
  1681. } else if(!$value_exists && !empty($value)){
  1682. $other_value = $value;
  1683. $value = 'gf_other_choice';
  1684. $checked = "checked='checked'";
  1685. } else {
  1686. $other_value = $other_default_value;
  1687. }
  1688. $label = "<input name='input_{$field["id"]}_other' type='text' value='" . esc_attr($other_value) . "' onfocus='$onfocus' onblur='$onblur' $tabindex $disabled_text />";
  1689. }
  1690. $choices .= sprintf("<li class='gchoice_$id'><input name='input_%d' type='radio' value='%s' %s id='choice_%s' $tabindex %s $logic_event %s />%s</li>", $field["id"], esc_attr($field_value), $checked, $id, $disabled_text, $input_focus, $label);
  1691. if(IS_ADMIN && RG_CURRENT_VIEW != "entry" && $count >=5)
  1692. break;
  1693. $count++;
  1694. }
  1695. $total = sizeof($field["choices"]);
  1696. if($count < $total)
  1697. $choices .= "<li class='gchoice_total'>" . sprintf(__("%d of %d items shown. Edit field to view all", "gravityforms"), $count, $total) . "</li>";
  1698. }
  1699. return apply_filters("gform_field_choices_" . rgget("formId", $field), apply_filters("gform_field_choices", $choices, $field), $field);
  1700. }
  1701. public static function get_field_type_title($type){
  1702. switch($type){
  1703. case "text" :
  1704. return __("Single Line Text", "gravityforms");
  1705. case "textarea" :
  1706. return __("Paragraph Text", "gravityforms");
  1707. case "select" :
  1708. return __("Drop Down", "gravityforms");
  1709. case "multiselect" :
  1710. return __("Multi Select", "gravityforms");
  1711. case "number" :
  1712. return __("Number", "gravityforms");
  1713. case "checkbox" :
  1714. return __("Checkboxes", "gravityforms");
  1715. case "radio" :
  1716. return __("Radio Buttons", "gravityforms");
  1717. case "hidden" :
  1718. return __("Hidden", "gravityforms");
  1719. case "html" :
  1720. return __("HTML", "gravityforms");
  1721. case "section" :
  1722. return __("Section Break", "gravityforms");
  1723. case "page" :
  1724. return __("Page Break", "gravityforms");
  1725. case "name" :
  1726. return __("Name", "gravityforms");
  1727. case "date" :
  1728. return __("Date", "gravityforms");
  1729. case "time" :
  1730. return __("Time", "gravityforms");
  1731. case "phone" :
  1732. return __("Phone", "gravityforms");
  1733. case "address" :
  1734. return __("Address", "gravityforms");
  1735. case "website" :
  1736. return __("Website", "gravityforms");
  1737. case "email" :
  1738. return __("Email", "gravityforms");
  1739. case "password" :
  1740. return __("Password", "gravityforms");
  1741. case "fileupload" :
  1742. return __("File Upload", "gravityforms");
  1743. case "captcha" :
  1744. return __("CAPTCHA", "gravityforms");
  1745. case "list" :
  1746. return __("List", "gravityforms");
  1747. case "creditcard" :
  1748. return __("Credit Card", "gravityforms");
  1749. case "post_title" :
  1750. return __("Title", "gravityforms");
  1751. case "post_content" :
  1752. return __("Body", "gravityforms");
  1753. case "post_excerpt" :
  1754. return __("Excerpt", "gravityforms");
  1755. case "post_tags" :
  1756. return __("Tags", "gravityforms");
  1757. case "post_category" :
  1758. return __("Category", "gravityforms");
  1759. case "post_image" :
  1760. return __("Image", "gravityforms");
  1761. case "post_custom_field" :
  1762. return __("Custom Field", "gravityforms");
  1763. case "product" :
  1764. return __("Product", "gravityforms");
  1765. case "quantity" :
  1766. return __("Quantity", "gravityforms");
  1767. case "option" :
  1768. return __("Option", "gravityforms");
  1769. case "shipping" :
  1770. return __("Shipping", "gravityforms");
  1771. case "total" :
  1772. return __("Total", "gravityforms");
  1773. default :
  1774. return apply_filters("gform_field_type_title", $type, $type);
  1775. }
  1776. }
  1777. public static function get_select_choices($field, $value=""){
  1778. $choices = "";
  1779. if(RG_CURRENT_VIEW == "entry" && empty($value))
  1780. $choices .= "<option value=''></option>";
  1781. if(is_array(rgar($field, "choices"))){
  1782. foreach($field["choices"] as $choice){
  1783. //needed for users upgrading from 1.0
  1784. $field_value = !empty($choice["value"]) || rgget("enableChoiceValue", $field) || $field['type'] == 'post_category' ? $choice["value"] : $choice["text"];
  1785. if(rgget("enablePrice", $field))
  1786. $field_value .= "|" . GFCommon::to_number(rgar($choice,"price"));
  1787. if(rgblank($value) && RG_CURRENT_VIEW != "entry"){
  1788. $selected = rgar($choice,"isSelected") ? "selected='selected'" : "";
  1789. }
  1790. else{
  1791. if(is_array($value)){
  1792. $is_match = false;
  1793. foreach($value as $item){
  1794. if(RGFormsModel::choice_value_match($field, $choice, $item)){
  1795. $is_match = true;
  1796. break;
  1797. }
  1798. }
  1799. $selected = $is_match ? "selected='selected'" : "";
  1800. }
  1801. else{
  1802. $selected = RGFormsModel::choice_value_match($field, $choice, $value) ? "selected='selected'" : "";
  1803. }
  1804. }
  1805. $choices.= sprintf("<option value='%s' %s>%s</option>", esc_attr($field_value), $selected, esc_html($choice["text"]));
  1806. }
  1807. }
  1808. return $choices;
  1809. }
  1810. public static function is_section_empty($section_field, $form, $lead){
  1811. $cache_key = "GFCommon::is_section_empty_" . $form["id"] . "_" . $section_field["id"];
  1812. $value = GFCache::get($cache_key);
  1813. if($value !== false)
  1814. return $value == true;
  1815. $fields = self::get_section_fields($form, $section_field["id"]);
  1816. if(!is_array($fields)){
  1817. GFCache::set($cache_key, 1);
  1818. return true;
  1819. }
  1820. foreach($fields as $field){
  1821. $val = RGFormsModel::get_lead_field_value($lead, $field);
  1822. $val = GFCommon::get_lead_field_display($field, $val, rgar($lead, 'currency'));
  1823. if(!self::is_product_field($field["type"]) && !rgblank($val)){
  1824. GFCache::set($cache_key, 0);
  1825. return false;
  1826. }
  1827. }
  1828. GFCache::set($cache_key, 1);
  1829. return true;
  1830. }
  1831. public static function get_section_fields($form, $section_field_id){
  1832. $fields = array();
  1833. $in_section = false;
  1834. foreach($form["fields"] as $field){
  1835. if(in_array($field["type"], array("section", "page")) && $in_section)
  1836. return $fields;
  1837. if($field["id"] == $section_field_id)
  1838. $in_section = true;
  1839. if($in_section)
  1840. $fields[] = $field;
  1841. }
  1842. return $fields;
  1843. }
  1844. public static function get_countries(){
  1845. return apply_filters("gform_countries", array(
  1846. __('Afghanistan', 'gravityforms'),__('Albania', 'gravityforms'),__('Algeria', 'gravityforms'), __('American Samoa', 'gravityforms'), __('Andorra', 'gravityforms'),__('Angola', 'gravityforms'),__('Antigua and Barbuda', 'gravityforms'),__('Argentina', 'gravityforms'),__('Armenia', 'gravityforms'),__('Australia', 'gravityforms'),__('Austria', 'gravityforms'),__('Azerbaijan', 'gravityforms'),__('Bahamas', 'gravityforms'),__('Bahrain', 'gravityforms'),__('Bangladesh', 'gravityforms'),__('Barbados', 'gravityforms'),__('Belarus', 'gravityforms'),__('Belgium', 'gravityforms'),__('Belize', 'gravityforms'),__('Benin', 'gravityforms'),__('Bermuda', 'gravityforms'),__('Bhutan', 'gravityforms'),__('Bolivia', 'gravityforms'),__('Bosnia and Herzegovina', 'gravityforms'),__('Botswana', 'gravityforms'),__('Brazil', 'gravityforms'),__('Brunei', 'gravityforms'),__('Bulgaria', 'gravityforms'),__('Burkina Faso', 'gravityforms'),__('Burundi', 'gravityforms'),__('Cambodia', 'gravityforms'),__('Cameroon', 'gravityforms'),__('Canada', 'gravityforms'),__('Cape Verde', 'gravityforms'),__('Central African Republic', 'gravityforms'),__('Chad', 'gravityforms'),__('Chile', 'gravityforms'),__('China', 'gravityforms'),__('Colombia', 'gravityforms'),__('Comoros', 'gravityforms'),__('Congo, Democratic Republic of the', 'gravityforms'),__('Congo, Republic of the', 'gravityforms'),__('Costa Rica', 'gravityforms'),__('C&ocirc;te d\'Ivoire', 'gravityforms'),__('Croatia', 'gravityforms'),__('Cuba', 'gravityforms'),__('Cyprus', 'gravityforms'),__('Czech Republic', 'gravityforms'),__('Denmark', 'gravityforms'),__('Djibouti', 'gravityforms'),__('Dominica', 'gravityforms'),__('Dominican Republic', 'gravityforms'),__('East Timor', 'gravityforms'),__('Ecuador', 'gravityforms'),__('Egypt', 'gravityforms'),__('El Salvador', 'gravityforms'),__('Equatorial Guinea', 'gravityforms'),__('Eritrea', 'gravityforms'),__('Estonia', 'gravityforms'),__('Ethiopia', 'gravityforms'),__('Fiji', 'gravityforms'),__('Finland', 'gravityforms'),__('France', 'gravityforms'),__('Gabon', 'gravityforms'),
  1847. __('Gambia', 'gravityforms'),__('Georgia', 'gravityforms'),__('Germany', 'gravityforms'),__('Ghana', 'gravityforms'),__('Greece', 'gravityforms'),__('Greenland', 'gravityforms'),__('Grenada', 'gravityforms'),__('Guam', 'gravityforms'),__('Guatemala', 'gravityforms'),__('Guinea', 'gravityforms'),__('Guinea-Bissau', 'gravityforms'),__('Guyana', 'gravityforms'),__('Haiti', 'gravityforms'),__('Honduras', 'gravityforms'),__('Hong Kong', 'gravityforms'),__('Hungary', 'gravityforms'),__('Iceland', 'gravityforms'),__('India', 'gravityforms'),__('Indonesia', 'gravityforms'),__('Iran', 'gravityforms'),__('Iraq', 'gravityforms'),__('Ireland', 'gravityforms'),__('Israel', 'gravityforms'),__('Italy', 'gravityforms'),__('Jamaica', 'gravityforms'),__('Japan', 'gravityforms'),__('Jordan', 'gravityforms'),__('Kazakhstan', 'gravityforms'),__('Kenya', 'gravityforms'),__('Kiribati', 'gravityforms'),__('North Korea', 'gravityforms'),__('South Korea', 'gravityforms'),__('Kuwait', 'gravityforms'),__('Kyrgyzstan', 'gravityforms'),__('Laos', 'gravityforms'),__('Latvia', 'gravityforms'),__('Lebanon', 'gravityforms'),__('Lesotho', 'gravityforms'),__('Liberia', 'gravityforms'),__('Libya', 'gravityforms'),__('Liechtenstein', 'gravityforms'),__('Lithuania', 'gravityforms'),__('Luxembourg', 'gravityforms'),__('Macedonia', 'gravityforms'),__('Madagascar', 'gravityforms'),__('Malawi', 'gravityforms'),__('Malaysia', 'gravityforms'),__('Maldives', 'gravityforms'),__('Mali', 'gravityforms'),__('Malta', 'gravityforms'),__('Marshall Islands', 'gravityforms'),__('Mauritania', 'gravityforms'),__('Mauritius', 'gravityforms'),__('Mexico', 'gravityforms'),__('Micronesia', 'gravityforms'),__('Moldova', 'gravityforms'),__('Monaco', 'gravityforms'),__('Mongolia', 'gravityforms'),__('Montenegro', 'gravityforms'),__('Morocco', 'gravityforms'),__('Mozambique', 'gravityforms'),__('Myanmar', 'gravityforms'),__('Namibia', 'gravityforms'),__('Nauru', 'gravityforms'),__('Nepal', 'gravityforms'),__('Netherlands', 'gravityforms'),__('New Zealand', 'gravityforms'),
  1848. __('Nicaragua', 'gravityforms'),__('Niger', 'gravityforms'),__('Nigeria', 'gravityforms'),__('Norway', 'gravityforms'), __('Northern Mariana Islands', 'gravityforms'), __('Oman', 'gravityforms'),__('Pakistan', 'gravityforms'),__('Palau', 'gravityforms'),__('Palestine', 'gravityforms'),__('Panama', 'gravityforms'),__('Papua New Guinea', 'gravityforms'),__('Paraguay', 'gravityforms'),__('Peru', 'gravityforms'),__('Philippines', 'gravityforms'),__('Poland', 'gravityforms'),__('Portugal', 'gravityforms'),__('Puerto Rico', 'gravityforms'),__('Qatar', 'gravityforms'),__('Romania', 'gravityforms'),__('Russia', 'gravityforms'),__('Rwanda', 'gravityforms'),__('Saint Kitts and Nevis', 'gravityforms'),__('Saint Lucia', 'gravityforms'),__('Saint Vincent and the Grenadines', 'gravityforms'),__('Samoa', 'gravityforms'),__('San Marino', 'gravityforms'),__('Sao Tome and Principe', 'gravityforms'),__('Saudi Arabia', 'gravityforms'),__('Senegal', 'gravityforms'),__('Serbia and Montenegro', 'gravityforms'),__('Seychelles', 'gravityforms'),__('Sierra Leone', 'gravityforms'),__('Singapore', 'gravityforms'),__('Slovakia', 'gravityforms'),__('Slovenia', 'gravityforms'),__('Solomon Islands', 'gravityforms'),__('Somalia', 'gravityforms'),__('South Africa', 'gravityforms'),__('Spain', 'gravityforms'),__('Sri Lanka', 'gravityforms'),__('Sudan', 'gravityforms'),__('Sudan, South', 'gravityforms'),__('Suriname', 'gravityforms'),__('Swaziland', 'gravityforms'),__('Sweden', 'gravityforms'),__('Switzerland', 'gravityforms'),__('Syria', 'gravityforms'),__('Taiwan', 'gravityforms'),__('Tajikistan', 'gravityforms'),__('Tanzania', 'gravityforms'),__('Thailand', 'gravityforms'),__('Togo', 'gravityforms'),__('Tonga', 'gravityforms'),__('Trinidad and Tobago', 'gravityforms'),__('Tunisia', 'gravityforms'),__('Turkey', 'gravityforms'),__('Turkmenistan', 'gravityforms'),__('Tuvalu', 'gravityforms'),__('Uganda', 'gravityforms'),__('Ukraine', 'gravityforms'),__('United Arab Emirates', 'gravityforms'),__('United Kingdom', 'gravityforms'),
  1849. __('United States', 'gravityforms'),__('Uruguay', 'gravityforms'),__('Uzbekistan', 'gravityforms'),__('Vanuatu', 'gravityforms'),__('Vatican City', 'gravityforms'),__('Venezuela', 'gravityforms'),__('Vietnam', 'gravityforms'), __('Virgin Islands, British', 'gravityforms'), __('Virgin Islands, U.S.', 'gravityforms'),__('Yemen', 'gravityforms'),__('Zambia', 'gravityforms'),__('Zimbabwe', 'gravityforms')));
  1850. }
  1851. public static function get_country_code($country_name) {
  1852. $codes = array(
  1853. __('AFGHANISTAN', 'gravityforms') => "AF" ,
  1854. __('ALBANIA', 'gravityforms') => "AL" ,
  1855. __('ALGERIA', 'gravityforms') => "DZ" ,
  1856. __('AMERICAN SAMOA', 'gravityforms') => "AS" ,
  1857. __('ANDORRA', 'gravityforms') => "AD" ,
  1858. __('ANGOLA', 'gravityforms') => "AO" ,
  1859. __('ANTIGUA AND BARBUDA', 'gravityforms') => "AG" ,
  1860. __('ARGENTINA', 'gravityforms') => "AR" ,
  1861. __('ARMENIA', 'gravityforms') => "AM" ,
  1862. __('AUSTRALIA', 'gravityforms') => "AU" ,
  1863. __('AUSTRIA', 'gravityforms') => "AT" ,
  1864. __('AZERBAIJAN', 'gravityforms') => "AZ" ,
  1865. __('BAHAMAS', 'gravityforms') => "BS" ,
  1866. __('BAHRAIN', 'gravityforms') => "BH" ,
  1867. __('BANGLADESH', 'gravityforms') => "BD" ,
  1868. __('BARBADOS', 'gravityforms') => "BB" ,
  1869. __('BELARUS', 'gravityforms') => "BY" ,
  1870. __('BELGIUM', 'gravityforms') => "BE" ,
  1871. __('BELIZE', 'gravityforms') => "BZ" ,
  1872. __('BENIN', 'gravityforms') => "BJ" ,
  1873. __('BERMUDA', 'gravityforms') => "BM" ,
  1874. __('BHUTAN', 'gravityforms') => "BT" ,
  1875. __('BOLIVIA', 'gravityforms') => "BO" ,
  1876. __('BOSNIA AND HERZEGOVINA', 'gravityforms') => "BA" ,
  1877. __('BOTSWANA', 'gravityforms') => "BW" ,
  1878. __('BRAZIL', 'gravityforms') => "BR" ,
  1879. __('BRUNEI', 'gravityforms') => "BN" ,
  1880. __('BULGARIA', 'gravityforms') => "BG" ,
  1881. __('BURKINA FASO', 'gravityforms') => "BF" ,
  1882. __('BURUNDI', 'gravityforms') => "BI" ,
  1883. __('CAMBODIA', 'gravityforms') => "KH" ,
  1884. __('CAMEROON', 'gravityforms') => "CM" ,
  1885. __('CANADA', 'gravityforms') => "CA" ,
  1886. __('CAPE VERDE', 'gravityforms') => "CV" ,
  1887. __('CENTRAL AFRICAN REPUBLIC', 'gravityforms') => "CF" ,
  1888. __('CHAD', 'gravityforms') => "TD" ,
  1889. __('CHILE', 'gravityforms') => "CL" ,
  1890. __('CHINA', 'gravityforms') => "CN" ,
  1891. __('COLOMBIA', 'gravityforms') => "CO" ,
  1892. __('COMOROS', 'gravityforms') => "KM" ,
  1893. __('CONGO, DEMOCRATIC REPUBLIC OF THE', 'gravityforms') => "CD" ,
  1894. __('CONGO, REPUBLIC OF THE', 'gravityforms') => "CG" ,
  1895. __('COSTA RICA', 'gravityforms') => "CR" ,
  1896. __('C&OCIRC;TE D\'IVOIRE', 'gravityforms') => "CI" ,
  1897. __('CROATIA', 'gravityforms') => "HR" ,
  1898. __('CUBA', 'gravityforms') => "CU" ,
  1899. __('CYPRUS', 'gravityforms') => "CY" ,
  1900. __('CZECH REPUBLIC', 'gravityforms') => "CZ" ,
  1901. __('DENMARK', 'gravityforms') => "DK" ,
  1902. __('DJIBOUTI', 'gravityforms') => "DJ" ,
  1903. __('DOMINICA', 'gravityforms') => "DM" ,
  1904. __('DOMINICAN REPUBLIC', 'gravityforms') => "DO" ,
  1905. __('EAST TIMOR', 'gravityforms') => "TL" ,
  1906. __('ECUADOR', 'gravityforms') => "EC" ,
  1907. __('EGYPT', 'gravityforms') => "EG" ,
  1908. __('EL SALVADOR', 'gravityforms') => "SV" ,
  1909. __('EQUATORIAL GUINEA', 'gravityforms') => "GQ" ,
  1910. __('ERITREA', 'gravityforms') => "ER" ,
  1911. __('ESTONIA', 'gravityforms') => "EE" ,
  1912. __('ETHIOPIA', 'gravityforms') => "ET" ,
  1913. __('FIJI', 'gravityforms') => "FJ" ,
  1914. __('FINLAND', 'gravityforms') => "FI" ,
  1915. __('FRANCE', 'gravityforms') => "FR" ,
  1916. __('GABON', 'gravityforms') => "GA" ,
  1917. __('GAMBIA', 'gravityforms') => "GM" ,
  1918. __('GEORGIA', 'gravityforms') => "GE" ,
  1919. __('GERMANY', 'gravityforms') => "DE" ,
  1920. __('GHANA', 'gravityforms') => "GH" ,
  1921. __('GREECE', 'gravityforms') => "GR" ,
  1922. __('GREENLAND', 'gravityforms') => "GL" ,
  1923. __('GRENADA', 'gravityforms') => "GD" ,
  1924. __('GUAM', 'gravityforms') => "GU" ,
  1925. __('GUATEMALA', 'gravityforms') => "GT" ,
  1926. __('GUINEA', 'gravityforms') => "GN" ,
  1927. __('GUINEA-BISSAU', 'gravityforms') => "GW" ,
  1928. __('GUYANA', 'gravityforms') => "GY" ,
  1929. __('HAITI', 'gravityforms') => "HT" ,
  1930. __('HONDURAS', 'gravityforms') => "HN" ,
  1931. __('HONG KONG', 'gravityforms') => "HK" ,
  1932. __('HUNGARY', 'gravityforms') => "HU" ,
  1933. __('ICELAND', 'gravityforms') => "IS" ,
  1934. __('INDIA', 'gravityforms') => "IN" ,
  1935. __('INDONESIA', 'gravityforms') => "ID" ,
  1936. __('IRAN', 'gravityforms') => "IR" ,
  1937. __('IRAQ', 'gravityforms') => "IQ" ,
  1938. __('IRELAND', 'gravityforms') => "IE" ,
  1939. __('ISRAEL', 'gravityforms') => "IL" ,
  1940. __('ITALY', 'gravityforms') => "IT" ,
  1941. __('JAMAICA', 'gravityforms') => "JM" ,
  1942. __('JAPAN', 'gravityforms') => "JP" ,
  1943. __('JORDAN', 'gravityforms') => "JO" ,
  1944. __('KAZAKHSTAN', 'gravityforms') => "KZ" ,
  1945. __('KENYA', 'gravityforms') => "KE" ,
  1946. __('KIRIBATI', 'gravityforms') => "KI" ,
  1947. __('NORTH KOREA', 'gravityforms') => "KP" ,
  1948. __('SOUTH KOREA', 'gravityforms') => "KR" ,
  1949. __('KUWAIT', 'gravityforms') => "KW" ,
  1950. __('KYRGYZSTAN', 'gravityforms') => "KG" ,
  1951. __('LAOS', 'gravityforms') => "LA" ,
  1952. __('LATVIA', 'gravityforms') => "LV" ,
  1953. __('LEBANON', 'gravityforms') => "LB" ,
  1954. __('LESOTHO', 'gravityforms') => "LS" ,
  1955. __('LIBERIA', 'gravityforms') => "LR" ,
  1956. __('LIBYA', 'gravityforms') => "LY" ,
  1957. __('LIECHTENSTEIN', 'gravityforms') => "LI" ,
  1958. __('LITHUANIA', 'gravityforms') => "LT" ,
  1959. __('LUXEMBOURG', 'gravityforms') => "LU" ,
  1960. __('MACEDONIA', 'gravityforms') => "MK" ,
  1961. __('MADAGASCAR', 'gravityforms') => "MG" ,
  1962. __('MALAWI', 'gravityforms') => "MW" ,
  1963. __('MALAYSIA', 'gravityforms') => "MY" ,
  1964. __('MALDIVES', 'gravityforms') => "MV" ,
  1965. __('MALI', 'gravityforms') => "ML" ,
  1966. __('MALTA', 'gravityforms') => "MT" ,
  1967. __('MARSHALL ISLANDS', 'gravityforms') => "MH" ,
  1968. __('MAURITANIA', 'gravityforms') => "MR" ,
  1969. __('MAURITIUS', 'gravityforms') => "MU" ,
  1970. __('MEXICO', 'gravityforms') => "MX" ,
  1971. __('MICRONESIA', 'gravityforms') => "FM" ,
  1972. __('MOLDOVA', 'gravityforms') => "MD" ,
  1973. __('MONACO', 'gravityforms') => "MC" ,
  1974. __('MONGOLIA', 'gravityforms') => "MN" ,
  1975. __('MONTENEGRO', 'gravityforms') => "ME" ,
  1976. __('MOROCCO', 'gravityforms') => "MA" ,
  1977. __('MOZAMBIQUE', 'gravityforms') => "MZ" ,
  1978. __('MYANMAR', 'gravityforms') => "MM" ,
  1979. __('NAMIBIA', 'gravityforms') => "NA" ,
  1980. __('NAURU', 'gravityforms') => "NR" ,
  1981. __('NEPAL', 'gravityforms') => "NP" ,
  1982. __('NETHERLANDS', 'gravityforms') => "NL" ,
  1983. __('NEW ZEALAND', 'gravityforms') => "NZ" ,
  1984. __('NICARAGUA', 'gravityforms') => "NI" ,
  1985. __('NIGER', 'gravityforms') => "NE" ,
  1986. __('NIGERIA', 'gravityforms') => "NG" ,
  1987. __('NORTHERN MARIANA ISLANDS', 'gravityforms') => "MP" ,
  1988. __('NORWAY', 'gravityforms') => "NO" ,
  1989. __('OMAN', 'gravityforms') => "OM" ,
  1990. __('PAKISTAN', 'gravityforms') => "PK" ,
  1991. __('PALAU', 'gravityforms') => "PW" ,
  1992. __('PALESTINE', 'gravityforms') => "PS" ,
  1993. __('PANAMA', 'gravityforms') => "PA" ,
  1994. __('PAPUA NEW GUINEA', 'gravityforms') => "PG" ,
  1995. __('PARAGUAY', 'gravityforms') => "PY" ,
  1996. __('PERU', 'gravityforms') => "PE" ,
  1997. __('PHILIPPINES', 'gravityforms') => "PH" ,
  1998. __('POLAND', 'gravityforms') => "PL" ,
  1999. __('PORTUGAL', 'gravityforms') => "PT" ,
  2000. __('PUERTO RICO', 'gravityforms') => "PR" ,
  2001. __('QATAR', 'gravityforms') => "QA" ,
  2002. __('ROMANIA', 'gravityforms') => "RO" ,
  2003. __('RUSSIA', 'gravityforms') => "RU" ,
  2004. __('RWANDA', 'gravityforms') => "RW" ,
  2005. __('SAINT KITTS AND NEVIS', 'gravityforms') => "KN" ,
  2006. __('SAINT LUCIA', 'gravityforms') => "LC" ,
  2007. __('SAINT VINCENT AND THE GRENADINES', 'gravityforms') => "VC" ,
  2008. __('SAMOA', 'gravityforms') => "WS" ,
  2009. __('SAN MARINO', 'gravityforms') => "SM" ,
  2010. __('SAO TOME AND PRINCIPE', 'gravityforms') => "ST" ,
  2011. __('SAUDI ARABIA', 'gravityforms') => "SA" ,
  2012. __('SENEGAL', 'gravityforms') => "SN" ,
  2013. __('SERBIA AND MONTENEGRO', 'gravityforms') => "RS" ,
  2014. __('SEYCHELLES', 'gravityforms') => "SC" ,
  2015. __('SIERRA LEONE', 'gravityforms') => "SL" ,
  2016. __('SINGAPORE', 'gravityforms') => "SG" ,
  2017. __('SLOVAKIA', 'gravityforms') => "SK" ,
  2018. __('SLOVENIA', 'gravityforms') => "SI" ,
  2019. __('SOLOMON ISLANDS', 'gravityforms') => "SB" ,
  2020. __('SOMALIA', 'gravityforms') => "SO" ,
  2021. __('SOUTH AFRICA', 'gravityforms') => "ZA" ,
  2022. __('SPAIN', 'gravityforms') => "ES" ,
  2023. __('SRI LANKA', 'gravityforms') => "LK" ,
  2024. __('SUDAN', 'gravityforms') => "SD" ,
  2025. __('SUDAN, SOUTH', 'gravityforms') => "SS" ,
  2026. __('SURINAME', 'gravityforms') => "SR" ,
  2027. __('SWAZILAND', 'gravityforms') => "SZ" ,
  2028. __('SWEDEN', 'gravityforms') => "SE" ,
  2029. __('SWITZERLAND', 'gravityforms') => "CH" ,
  2030. __('SYRIA', 'gravityforms') => "SY" ,
  2031. __('TAIWAN', 'gravityforms') => "TW" ,
  2032. __('TAJIKISTAN', 'gravityforms') => "TJ" ,
  2033. __('TANZANIA', 'gravityforms') => "TZ" ,
  2034. __('THAILAND', 'gravityforms') => "TH" ,
  2035. __('TOGO', 'gravityforms') => "TG" ,
  2036. __('TONGA', 'gravityforms') => "TO" ,
  2037. __('TRINIDAD AND TOBAGO', 'gravityforms') => "TT" ,
  2038. __('TUNISIA', 'gravityforms') => "TN" ,
  2039. __('TURKEY', 'gravityforms') => "TR" ,
  2040. __('TURKMENISTAN', 'gravityforms') => "TM" ,
  2041. __('TUVALU', 'gravityforms') => "TV" ,
  2042. __('UGANDA', 'gravityforms') => "UG" ,
  2043. __('UKRAINE', 'gravityforms') => "UA" ,
  2044. __('UNITED ARAB EMIRATES', 'gravityforms') => "AE" ,
  2045. __('UNITED KINGDOM', 'gravityforms') => "GB" ,
  2046. __('UNITED STATES', 'gravityforms') => "US" ,
  2047. __('URUGUAY', 'gravityforms') => "UY" ,
  2048. __('UZBEKISTAN', 'gravityforms') => "UZ" ,
  2049. __('VANUATU', 'gravityforms') => "VU" ,
  2050. __('VATICAN CITY', 'gravityforms') => "" ,
  2051. __('VENEZUELA', 'gravityforms') => "VE" ,
  2052. __('VIRGIN ISLANDS, BRITISH', 'gravityforms') => "VG" ,
  2053. __('VIRGIN ISLANDS, U.S.', 'gravityforms') => "VI" ,
  2054. __('VIETNAM', 'gravityforms') => "VN" ,
  2055. __('YEMEN', 'gravityforms') => "YE" ,
  2056. __('ZAMBIA', 'gravityforms') => "ZM" ,
  2057. __('ZIMBABWE', 'gravityforms') => "ZW" );
  2058. return rgar($codes, strtoupper($country_name));
  2059. }
  2060. public static function get_us_states(){
  2061. return array(__("Alabama","gravityforms"),__("Alaska","gravityforms"),__("Arizona","gravityforms"),__("Arkansas","gravityforms"),__("California","gravityforms"),__("Colorado","gravityforms"),__("Connecticut","gravityforms"),__("Delaware","gravityforms"),__("District of Columbia", "gravityforms"), __("Florida","gravityforms"),__("Georgia","gravityforms"),__("Hawaii","gravityforms"),__("Idaho","gravityforms"),__("Illinois","gravityforms"),__("Indiana","gravityforms"),__("Iowa","gravityforms"),__("Kansas","gravityforms"),__("Kentucky","gravityforms"),__("Louisiana","gravityforms"),__("Maine","gravityforms"),__("Maryland","gravityforms"),__("Massachusetts","gravityforms"),__("Michigan","gravityforms"),__("Minnesota","gravityforms"),__("Mississippi","gravityforms"),__("Missouri","gravityforms"),__("Montana","gravityforms"),__("Nebraska","gravityforms"),__("Nevada","gravityforms"),__("New Hampshire","gravityforms"),__("New Jersey","gravityforms"),__("New Mexico","gravityforms"),__("New York","gravityforms"),__("North Carolina","gravityforms"),__("North Dakota","gravityforms"),__("Ohio","gravityforms"),__("Oklahoma","gravityforms"),__("Oregon","gravityforms"),__("Pennsylvania","gravityforms"),__("Rhode Island","gravityforms"),__("South Carolina","gravityforms"),__("South Dakota","gravityforms"),__("Tennessee","gravityforms"),__("Texas","gravityforms"),__("Utah","gravityforms"),__("Vermont","gravityforms"),__("Virginia","gravityforms"),__("Washington","gravityforms"),__("West Virginia","gravityforms"),__("Wisconsin","gravityforms"),__("Wyoming","gravityforms"), __("Armed Forces Americas","gravityforms"), __("Armed Forces Europe","gravityforms"),__("Armed Forces Pacific","gravityforms"));
  2062. }
  2063. public static function get_us_state_code($state_name){
  2064. $states = array(
  2065. strtoupper(__("Alabama","gravityforms")) => "AL",
  2066. strtoupper(__("Alaska","gravityforms")) => "AK",
  2067. strtoupper(__("Arizona","gravityforms")) => "AZ",
  2068. strtoupper(__("Arkansas","gravityforms")) => "AR",
  2069. strtoupper(__("California","gravityforms")) => "CA",
  2070. strtoupper(__("Colorado","gravityforms")) => "CO",
  2071. strtoupper(__("Connecticut","gravityforms")) => "CT",
  2072. strtoupper(__("Delaware","gravityforms")) => "DE",
  2073. strtoupper(__("District of Columbia", "gravityforms")) => "DC",
  2074. strtoupper(__("Florida","gravityforms")) => "FL",
  2075. strtoupper(__("Georgia","gravityforms")) => "GA",
  2076. strtoupper(__("Hawaii","gravityforms")) => "HI",
  2077. strtoupper(__("Idaho","gravityforms")) => "ID",
  2078. strtoupper(__("Illinois","gravityforms")) => "IL",
  2079. strtoupper(__("Indiana","gravityforms")) => "IN",
  2080. strtoupper(__("Iowa","gravityforms")) => "IA",
  2081. strtoupper(__("Kansas","gravityforms")) => "KS",
  2082. strtoupper(__("Kentucky","gravityforms")) => "KY",
  2083. strtoupper(__("Louisiana","gravityforms")) => "LA",
  2084. strtoupper(__("Maine","gravityforms")) => "ME",
  2085. strtoupper(__("Maryland","gravityforms")) => "MD",
  2086. strtoupper(__("Massachusetts","gravityforms")) => "MA",
  2087. strtoupper(__("Michigan","gravityforms")) => "MI",
  2088. strtoupper(__("Minnesota","gravityforms")) => "MN",
  2089. strtoupper(__("Mississippi","gravityforms")) => "MS",
  2090. strtoupper(__("Missouri","gravityforms")) => "MO",
  2091. strtoupper(__("Montana","gravityforms")) => "MT",
  2092. strtoupper(__("Nebraska","gravityforms")) => "NE",
  2093. strtoupper(__("Nevada","gravityforms")) => "NV",
  2094. strtoupper(__("New Hampshire","gravityforms")) => "NH",
  2095. strtoupper(__("New Jersey","gravityforms")) => "NJ",
  2096. strtoupper(__("New Mexico","gravityforms")) => "NM",
  2097. strtoupper(__("New York","gravityforms")) => "NY",
  2098. strtoupper(__("North Carolina","gravityforms")) => "NC",
  2099. strtoupper(__("North Dakota","gravityforms")) => "ND",
  2100. strtoupper(__("Ohio","gravityforms")) => "OH",
  2101. strtoupper(__("Oklahoma","gravityforms")) => "OK",
  2102. strtoupper(__("Oregon","gravityforms")) => "OR",
  2103. strtoupper(__("Pennsylvania","gravityforms")) => "PA",
  2104. strtoupper(__("Rhode Island","gravityforms")) => "RI",
  2105. strtoupper(__("South Carolina","gravityforms")) => "SC",
  2106. strtoupper(__("South Dakota","gravityforms")) => "SD",
  2107. strtoupper(__("Tennessee","gravityforms")) => "TN",
  2108. strtoupper(__("Texas","gravityforms")) => "TX",
  2109. strtoupper(__("Utah","gravityforms")) => "UT",
  2110. strtoupper(__("Vermont","gravityforms")) => "VT",
  2111. strtoupper(__("Virginia","gravityforms")) => "VA",
  2112. strtoupper(__("Washington","gravityforms")) => "WA",
  2113. strtoupper(__("West Virginia","gravityforms")) => "WV",
  2114. strtoupper(__("Wisconsin","gravityforms")) => "WI",
  2115. strtoupper(__("Wyoming","gravityforms")) => "WY",
  2116. strtoupper(__("Armed Forces Americas","gravityforms")) => "AA",
  2117. strtoupper(__("Armed Forces Europe","gravityforms")) => "AE",
  2118. strtoupper(__("Armed Forces Pacific","gravityforms")) => "AP"
  2119. );
  2120. $code = isset($states[strtoupper($state_name)]) ? $states[strtoupper($state_name)] : strtoupper($state_name);
  2121. return $code;
  2122. }
  2123. public static function get_canadian_provinces(){
  2124. return array(__("Alberta","gravityforms"),__("British Columbia","gravityforms"),__("Manitoba","gravityforms"),__("New Brunswick","gravityforms"),__("Newfoundland & Labrador","gravityforms"),__("Northwest Territories","gravityforms"),__("Nova Scotia","gravityforms"),__("Nunavut","gravityforms"),__("Ontario","gravityforms"),__("Prince Edward Island","gravityforms"),__("Quebec","gravityforms"),__("Saskatchewan","gravityforms"),__("Yukon","gravityforms"));
  2125. }
  2126. public static function get_state_dropdown($states, $selected_state=""){
  2127. $str = "";
  2128. foreach($states as $state){
  2129. $selected = $state == $selected_state ? "selected='selected'" : "";
  2130. $str .= "<option value='" . esc_attr($state) . "' $selected>" . $state . "</option>";
  2131. }
  2132. return $str;
  2133. }
  2134. public static function get_us_state_dropdown($selected_state = ""){
  2135. $states = array_merge(array(''), self::get_us_states());
  2136. foreach($states as $state){
  2137. $selected = $state == $selected_state ? "selected='selected'" : "";
  2138. $str .= "<option value='" . esc_attr($state) . "' $selected>" . $state . "</option>";
  2139. }
  2140. return $str;
  2141. }
  2142. public static function get_canadian_provinces_dropdown($selected_province = ""){
  2143. $states = array_merge(array(''), self::get_canadian_provinces());
  2144. foreach($states as $state){
  2145. $selected = $state == $selected_province ? "selected='selected'" : "";
  2146. $str .= "<option value='" . esc_attr($state) . "' $selected>" . $state . "</option>";
  2147. }
  2148. return $str;
  2149. }
  2150. public static function get_country_dropdown($selected_country = ""){
  2151. $str = "";
  2152. $countries = array_merge(array(''), self::get_countries());
  2153. foreach($countries as $country){
  2154. $selected = $country == $selected_country ? "selected='selected'" : "";
  2155. $str .= "<option value='" . esc_attr($country) . "' $selected>" . $country . "</option>";
  2156. }
  2157. return $str;
  2158. }
  2159. public static function is_post_field($field){
  2160. return in_array($field["type"], array("post_title", "post_tags", "post_category", "post_custom_field", "post_content", "post_excerpt", "post_image"));
  2161. }
  2162. public static function get_range_message($field){
  2163. $min = $field["rangeMin"];
  2164. $max = $field["rangeMax"];
  2165. $message = "";
  2166. if(is_numeric($min) && is_numeric($max))
  2167. $message = sprintf(__("Please enter a value between %s and %s.", "gravityforms"), "<strong>$min</strong>", "<strong>$max</strong>") ;
  2168. else if(is_numeric($min))
  2169. $message = sprintf(__("Please enter a value greater than or equal to %s.", "gravityforms"), "<strong>$min</strong>");
  2170. else if(is_numeric($max))
  2171. $message = sprintf(__("Please enter a value less than or equal to %s.", "gravityforms"), "<strong>$max</strong>");
  2172. else if($field["failed_validation"])
  2173. $message = __("Please enter a valid number", "gravityforms");
  2174. return $message;
  2175. }
  2176. public static function get_fields_by_type($form, $types){
  2177. $fields = array();
  2178. if(!is_array(rgar($form,"fields")))
  2179. return $fields;
  2180. foreach($form["fields"] as $field){
  2181. if(in_array(rgar($field,"type"), $types))
  2182. $fields[] = $field;
  2183. }
  2184. return $fields;
  2185. }
  2186. public static function has_pages($form){
  2187. return sizeof(self::get_fields_by_type($form, array("page"))) > 0;
  2188. }
  2189. public static function get_product_fields_by_type($form, $types, $product_id){
  2190. global $_product_fields;
  2191. $key = json_encode($types) . "_" . $product_id . "_" . $form["id"];
  2192. if(!isset($_product_fields[$key])){
  2193. $fields = array();
  2194. for($i=0, $count=sizeof($form["fields"]); $i<$count; $i++){
  2195. $field = $form["fields"][$i];
  2196. if(in_array($field["type"], $types) && $field["productField"] == $product_id){
  2197. $fields[] = $field;
  2198. }
  2199. }
  2200. $_product_fields[$key] = $fields;
  2201. }
  2202. return $_product_fields[$key];
  2203. }
  2204. private static function get_month_dropdown($name="", $id="", $selected_value="", $tabindex="", $disabled_text=""){
  2205. return self::get_number_dropdown($name, $id, $selected_value, $tabindex, $disabled_text, __("Month", "gravityforms"), 1, 12);
  2206. }
  2207. private static function get_day_dropdown($name="", $id="", $selected_value="", $tabindex="", $disabled_text=""){
  2208. return self::get_number_dropdown($name, $id, $selected_value, $tabindex, $disabled_text, __("Day", "gravityforms"), 1, 31);
  2209. }
  2210. private static function get_year_dropdown($name="", $id="", $selected_value="", $tabindex="", $disabled_text=""){
  2211. $year_min = apply_filters("gform_date_min_year", "1920");
  2212. $year_max = apply_filters("gform_date_max_year", date("Y") + 1);
  2213. return self::get_number_dropdown($name, $id, $selected_value, $tabindex, $disabled_text, __("Year", "gravityforms"), $year_max, $year_min);
  2214. }
  2215. private static function get_number_dropdown($name, $id, $selected_value, $tabindex, $disabled_text, $placeholder, $start_number, $end_number){
  2216. $str = "<select name='{$name}' id='{$id}' {$tabindex} {$disabled_text} >";
  2217. if($placeholder !== false)
  2218. $str .= "<option value=''>{$placeholder}</option>";
  2219. $increment = $start_number < $end_number ? 1 : -1;
  2220. for($i=$start_number; $i!= ($end_number + $increment); $i += $increment){
  2221. $selected = intval($i) == intval($selected_value) ? "selected='selected'" : "";
  2222. $str .= "<option value='{$i}' {$selected}>{$i}</option>";
  2223. }
  2224. $str .= "</select>";
  2225. return $str;
  2226. }
  2227. private static function get_logic_event($field, $event){
  2228. if(empty($field["conditionalLogicFields"]) || IS_ADMIN)
  2229. return "";
  2230. switch($event){
  2231. case "keyup" :
  2232. return "onchange='gf_apply_rules(" . $field["formId"] . "," . GFCommon::json_encode($field["conditionalLogicFields"]) . ");' onkeyup='clearTimeout(__gf_timeout_handle); __gf_timeout_handle = setTimeout(\"gf_apply_rules(" . $field["formId"] . "," . GFCommon::json_encode($field["conditionalLogicFields"]) . ")\", 300);'";
  2233. break;
  2234. case "click" :
  2235. return "onclick='gf_apply_rules(" . $field["formId"] . "," . GFCommon::json_encode($field["conditionalLogicFields"]) . ");'";
  2236. break;
  2237. case "change" :
  2238. return "onchange='gf_apply_rules(" . $field["formId"] . "," . GFCommon::json_encode($field["conditionalLogicFields"]) . ");'";
  2239. break;
  2240. }
  2241. }
  2242. public static function has_field_calculation($field) {
  2243. if($field['type'] == 'number') {
  2244. return rgar($field, 'enableCalculation') && rgar($field, 'calculationFormula');
  2245. }
  2246. return RGFormsModel::get_input_type($field) == 'calculation';
  2247. }
  2248. public static function get_field_input($field, $value="", $lead_id=0, $form_id=0){
  2249. $id = $field["id"];
  2250. $field_id = IS_ADMIN || $form_id == 0 ? "input_$id" : "input_" . $form_id . "_$id";
  2251. $form_id = IS_ADMIN && empty($form_id) ? rgget("id") : $form_id;
  2252. $size = rgar($field, "size");
  2253. $disabled_text = (IS_ADMIN && RG_CURRENT_VIEW != "entry") ? "disabled='disabled'" : "";
  2254. $class_suffix = RG_CURRENT_VIEW == "entry" ? "_admin" : "";
  2255. $class = $size . $class_suffix;
  2256. $currency = "";
  2257. if(RG_CURRENT_VIEW == "entry"){
  2258. $lead = RGFormsModel::get_lead($lead_id);
  2259. $post_id = $lead["post_id"];
  2260. $post_link = "";
  2261. if(is_numeric($post_id) && self::is_post_field($field)){
  2262. $post_link = "You can <a href='post.php?action=edit&post=$post_id'>edit this post</a> from the post page.";
  2263. }
  2264. $currency = $lead["currency"];
  2265. }
  2266. $field_input = apply_filters("gform_field_input", "", $field, $value, $lead_id, $form_id);
  2267. if($field_input)
  2268. return $field_input;
  2269. //product fields are not editable
  2270. if(RG_CURRENT_VIEW == "entry" && self::is_product_field($field["type"]))
  2271. return "<div class='ginput_container'>" . __("Product fields are not editable", "gravityforms") . "</div>";
  2272. else if(RG_CURRENT_VIEW == "entry" && $field["type"] == "donation")
  2273. return "<div class='ginput_container'>" . __("Donations are not editable", "gravityforms") . "</div>";
  2274. // add categories as choices for Post Category field
  2275. if($field['type'] == 'post_category')
  2276. $field = self::add_categories_as_choices($field, $value);
  2277. $max_length = "";
  2278. $html5_attributes = "";
  2279. switch(RGFormsModel::get_input_type($field)){
  2280. case "total" :
  2281. if(RG_CURRENT_VIEW == "entry")
  2282. return "<div class='ginput_container'><input type='text' name='input_{$id}' value='{$value}' /></div>";
  2283. else
  2284. return "<div class='ginput_container'><span class='ginput_total ginput_total_{$form_id}'>" . self::to_money("0") . "</span><input type='hidden' name='input_{$id}' id='{$field_id}' class='gform_hidden'/></div>";
  2285. break;
  2286. case "calculation" :
  2287. case "singleproduct" :
  2288. $product_name = !is_array($value) || empty($value[$field["id"] . ".1"]) ? esc_attr($field["label"]) : esc_attr($value[$field["id"] . ".1"]);
  2289. $price = !is_array($value) || empty($value[$field["id"] . ".2"]) ? rgget("basePrice", $field) : esc_attr($value[$field["id"] . ".2"]);
  2290. $quantity = is_array($value) ? esc_attr($value[$field["id"] . ".3"]) : "";
  2291. if(empty($price))
  2292. $price = 0;
  2293. $form = RGFormsModel::get_form_meta($form_id);
  2294. $has_quantity = sizeof(GFCommon::get_product_fields_by_type($form, array("quantity"), $field["id"])) > 0;
  2295. if($has_quantity)
  2296. $field["disableQuantity"] = true;
  2297. $quantity_field = "";
  2298. if(IS_ADMIN){
  2299. $style = rgget("disableQuantity", $field) ? "style='display:none;'" : "";
  2300. $quantity_field = " <span class='ginput_quantity_label' {$style}>" . apply_filters("gform_product_quantity_{$form_id}",apply_filters("gform_product_quantity",__("Quantity:", "gravityforms"), $form_id), $form_id) . "</span> <input type='text' name='input_{$id}.3' value='{$quantity}' id='ginput_quantity_{$form_id}_{$field["id"]}' class='ginput_quantity' size='10' />";
  2301. }
  2302. else if(!rgget("disableQuantity", $field)){
  2303. $tabindex = self::get_tabindex();
  2304. $quantity_field .= " <span class='ginput_quantity_label'>" . apply_filters("gform_product_quantity_{$form_id}",apply_filters("gform_product_quantity",__("Quantity:", "gravityforms"), $form_id), $form_id) . "</span> <input type='text' name='input_{$id}.3' value='{$quantity}' id='ginput_quantity_{$form_id}_{$field["id"]}' class='ginput_quantity' size='10' {$tabindex}/>";
  2305. }
  2306. else{
  2307. if(!is_numeric($quantity))
  2308. $quantity = 1;
  2309. if(!$has_quantity){
  2310. $quantity_field .= "<input type='hidden' name='input_{$id}.3' value='{$quantity}' class='ginput_quantity_{$form_id}_{$field["id"]} gform_hidden' />";
  2311. }
  2312. }
  2313. return "<div class='ginput_container'><input type='hidden' name='input_{$id}.1' value='{$product_name}' class='gform_hidden' /><span class='ginput_product_price_label'>" . apply_filters("gform_product_price_{$form_id}", apply_filters("gform_product_price",__("Price", "gravityforms"), $form_id), $form_id) . ":</span> <span class='ginput_product_price' id='{$field_id}'>" . esc_html(GFCommon::to_money($price, $currency)) ."</span><input type='hidden' name='input_{$id}.2' id='ginput_base_price_{$form_id}_{$field["id"]}' class='gform_hidden' value='" . esc_attr($price) . "'/>{$quantity_field}</div>";
  2314. break;
  2315. case "hiddenproduct" :
  2316. $form = RGFormsModel::get_form_meta($form_id);
  2317. $has_quantity_field = sizeof(GFCommon::get_product_fields_by_type($form, array("quantity"), $field["id"])) > 0;
  2318. $product_name = !is_array($value) || empty($value[$field["id"] . ".1"]) ? esc_attr($field["label"]) : esc_attr($value[$field["id"] . ".1"]);
  2319. $quantity = is_array($value) ? esc_attr($value[$field["id"] . ".3"]) : "1";
  2320. $price = !is_array($value) || empty($value[$field["id"] . ".2"]) ? rgget("basePrice", $field) : esc_attr($value[$field["id"] . ".2"]);
  2321. if(empty($price))
  2322. $price = 0;
  2323. $quantity_field = $has_quantity_field ? "" : "<input type='hidden' name='input_{$id}.3' value='" . esc_attr($quantity) . "' id='ginput_quantity_{$form_id}_{$field["id"]}' class='gform_hidden' />";
  2324. $product_name_field = "<input type='hidden' name='input_{$id}.1' value='{$product_name}' class='gform_hidden' />";
  2325. $field_type = IS_ADMIN ? "text" : "hidden";
  2326. return $quantity_field . $product_name_field . sprintf("<input name='input_%d.2' id='ginput_base_price_{$form_id}_{$field["id"]}' type='{$field_type}' value='%s' class='gform_hidden ginput_amount' %s/>", $id, esc_attr($price), $disabled_text);
  2327. break;
  2328. case "singleshipping" :
  2329. $price = !empty($value) ? $value : rgget("basePrice", $field);
  2330. if(empty($price))
  2331. $price = 0;
  2332. return "<div class='ginput_container'><input type='hidden' name='input_{$id}' value='{$price}' class='gform_hidden'/><span class='ginput_shipping_price' id='{$field_id}'>" . GFCommon::to_money($price, $currency) ."</span></div>";
  2333. break;
  2334. case "website":
  2335. $is_html5 = RGFormsModel::is_html5_enabled();
  2336. $value = empty($value) && !$is_html5 ? "http://" : $value;
  2337. $html_input_type = $is_html5 ? "url" : "text";
  2338. $html5_attributes = $is_html5 ? "placeholder='http://'" : "";
  2339. case "text":
  2340. if(empty($html_input_type))
  2341. $html_input_type = "text";
  2342. if(rgget("enablePasswordInput", $field) && RG_CURRENT_VIEW != "entry")
  2343. $html_input_type = "password";
  2344. if(is_numeric(rgget("maxLength", $field)))
  2345. $max_length = "maxlength='{$field["maxLength"]}'";
  2346. if(!empty($post_link))
  2347. return $post_link;
  2348. $logic_event = self::get_logic_event($field, "keyup");
  2349. $tabindex = self::get_tabindex();
  2350. return sprintf("<div class='ginput_container'><input name='input_%d' id='%s' type='%s' value='%s' class='%s' $max_length $tabindex $logic_event $html5_attributes %s/></div>", $id, $field_id, $html_input_type, esc_attr($value), esc_attr($class), $disabled_text);
  2351. break;
  2352. case "email":
  2353. if(!empty($post_link))
  2354. return $post_link;
  2355. $html_input_type = RGFormsModel::is_html5_enabled() ? "email" : "text";
  2356. if(IS_ADMIN && RG_CURRENT_VIEW != "entry"){
  2357. $single_style = rgget("emailConfirmEnabled", $field) ? "style='display:none;'" : "";
  2358. $confirm_style = rgget("emailConfirmEnabled", $field) ? "" : "style='display:none;'";
  2359. return "<div class='ginput_container ginput_single_email' {$single_style}><input name='input_{$id}' type='{$html_input_type}' class='" . esc_attr($class) . "' disabled='disabled' /><div class='gf_clear gf_clear_complex'></div></div><div class='ginput_complex ginput_container ginput_confirm_email' {$confirm_style} id='{$field_id}_container'><span id='{$field_id}_1_container' class='ginput_left'><input type='text' name='input_{$id}' id='{$field_id}' disabled='disabled' /><label for='{$field_id}'>" . apply_filters("gform_email_{$form_id}", apply_filters("gform_email",__("Enter Email", "gravityforms"), $form_id), $form_id) . "</label></span><span id='{$field_id}_2_container' class='ginput_right'><input type='text' name='input_{$id}_2' id='{$field_id}_2' disabled='disabled' /><label for='{$field_id}_2'>" . apply_filters("gform_email_confirm_{$form_id}", apply_filters("gform_email_confirm",__("Confirm Email", "gravityforms"), $form_id), $form_id) . "</label></span><div class='gf_clear gf_clear_complex'></div></div>";
  2360. }
  2361. else{
  2362. $logic_event = self::get_logic_event($field, "keyup");
  2363. if(rgget("emailConfirmEnabled", $field) && RG_CURRENT_VIEW != "entry"){
  2364. $first_tabindex = self::get_tabindex();
  2365. $last_tabindex = self::get_tabindex();
  2366. return "<div class='ginput_complex ginput_container' id='{$field_id}_container'><span id='{$field_id}_1_container' class='ginput_left'><input type='{$html_input_type}' name='input_{$id}' id='{$field_id}' value='" . esc_attr($value) . "' {$first_tabindex} {$logic_event} {$disabled_text}/><label for='{$field_id}'>" . apply_filters("gform_email_{$form_id}", apply_filters("gform_email",__("Enter Email", "gravityforms"), $form_id), $form_id) . "</label></span><span id='{$field_id}_2_container' class='ginput_right'><input type='{$html_input_type}' name='input_{$id}_2' id='{$field_id}_2' value='" . esc_attr(rgpost("input_" . $id ."_2")) . "' {$last_tabindex} {$disabled_text}/><label for='{$field_id}_2'>" . apply_filters("gform_email_confirm_{$form_id}", apply_filters("gform_email_confirm",__("Confirm Email", "gravityforms"), $form_id), $form_id) . "</label></span><div class='gf_clear gf_clear_complex'></div></div>";
  2367. }
  2368. else{
  2369. $tabindex = self::get_tabindex();
  2370. return sprintf("<div class='ginput_container'><input name='input_%d' id='%s' type='%s' value='%s' class='%s' {$max_length} {$tabindex} {$html5_attributes} {$logic_event} %s/></div>", $id, $field_id, $html_input_type, esc_attr($value), esc_attr($class), $disabled_text);
  2371. }
  2372. }
  2373. break;
  2374. case "honeypot":
  2375. $autocomplete = RGFormsModel::is_html5_enabled() ? "autocomplete='off'" : "";
  2376. return "<div class='ginput_container'><input name='input_{$id}' id='{$field_id}' type='text' value='' {$autocomplete}/></div>";
  2377. break;
  2378. case "hidden" :
  2379. if(!empty($post_link))
  2380. return $post_link;
  2381. $field_type = IS_ADMIN ? "text" : "hidden";
  2382. $class_attribute = IS_ADMIN ? "" : "class='gform_hidden'";
  2383. return sprintf("<input name='input_%d' id='%s' type='$field_type' $class_attribute value='%s' %s/>", $id, $field_id, esc_attr($value), $disabled_text);
  2384. break;
  2385. case "html" :
  2386. $content = IS_ADMIN ? "<img class='gfield_html_block' src='" . self::get_base_url() . "/images/gf-html-admin-placeholder.jpg' alt='HTML Block'/>" : $field["content"];
  2387. $content = GFCommon::replace_variables_prepopulate($content); //adding support for merge tags
  2388. $content = do_shortcode($content); //adding support for shortcodes
  2389. return $content;
  2390. break;
  2391. case "adminonly_hidden" :
  2392. if(!is_array($field["inputs"]))
  2393. return sprintf("<input name='input_%d' id='%s' class='gform_hidden' type='hidden' value='%s'/>", $id, $field_id, esc_attr($value));
  2394. $fields = "";
  2395. foreach($field["inputs"] as $input){
  2396. $fields .= sprintf("<input name='input_%s' class='gform_hidden' type='hidden' value='%s'/>", $input["id"], esc_attr(rgar($value, strval($input["id"]))));
  2397. }
  2398. return $fields;
  2399. break;
  2400. case "number" :
  2401. if(!empty($post_link))
  2402. return $post_link;
  2403. $instruction = "";
  2404. $read_only = "";
  2405. if(!IS_ADMIN){
  2406. if(GFCommon::has_field_calculation($field)) {
  2407. // calculation-enabled fields should be read only
  2408. $read_only = 'readonly="readonly"';
  2409. } else {
  2410. $message = self::get_range_message($field);
  2411. $validation_class = $field["failed_validation"] ? "validation_message" : "";
  2412. if(!$field["failed_validation"] && !empty($message) && empty($field["errorMessage"]))
  2413. $instruction = "<div class='instruction $validation_class'>" . $message . "</div>";
  2414. }
  2415. }
  2416. $is_html5 = RGFormsModel::is_html5_enabled();
  2417. $html_input_type = $is_html5 && !GFCommon::has_field_calculation($field) ? "number" : "text"; // chrome does not allow number fields to have commas, calculations display numbers with commas
  2418. $step_attr = $is_html5 ? "step='any'" : "";
  2419. $logic_event = self::get_logic_event($field, "keyup");
  2420. $tabindex = self::get_tabindex();
  2421. return sprintf("<div class='ginput_container'><input name='input_%d' id='%s' type='{$html_input_type}' {$step_attr} value='%s' class='%s' {$tabindex} {$logic_event} {$read_only} %s/>%s</div>", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text, $instruction);
  2422. case "donation" :
  2423. $tabindex = self::get_tabindex();
  2424. return sprintf("<div class='ginput_container'><input name='input_%d' id='%s' type='text' value='%s' class='%s ginput_donation_amount' $tabindex %s/></div>", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
  2425. case "price" :
  2426. $logic_event = self::get_logic_event($field, "keyup");
  2427. $tabindex = self::get_tabindex();
  2428. return sprintf("<div class='ginput_container'><input name='input_%d' id='%s' type='text' value='%s' class='%s ginput_amount' {$tabindex} {$logic_event} %s/></div>", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
  2429. case "phone" :
  2430. if(!empty($post_link))
  2431. return $post_link;
  2432. $instruction = $field["phoneFormat"] == "standard" ? __("Phone format:", "gravityforms") . " (###)###-####" : "";
  2433. $instruction_div = rgget("failed_validation", $field) && !empty($instruction) ? "<div class='instruction validation_message'>$instruction</div>" : "";
  2434. $html_input_type = RGFormsModel::is_html5_enabled() ? "tel" : "text";
  2435. $logic_event = self::get_logic_event($field, "keyup");
  2436. $tabindex = self::get_tabindex();
  2437. return sprintf("<div class='ginput_container'><input name='input_%d' id='%s' type='{$html_input_type}' value='%s' class='%s' {$tabindex} {$logic_event} %s/>{$instruction_div}</div>", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
  2438. case "textarea":
  2439. $max_chars = "";
  2440. $logic_event = self::get_logic_event($field, "keyup");
  2441. $tabindex = self::get_tabindex();
  2442. return sprintf("<div class='ginput_container'><textarea name='input_%d' id='%s' class='textarea %s' {$tabindex} {$logic_event} %s rows='10' cols='50'>%s</textarea></div>{$max_chars}", $id, $field_id, esc_attr($class), $disabled_text, esc_html($value));
  2443. case "post_title":
  2444. case "post_tags":
  2445. case "post_custom_field":
  2446. $tabindex = self::get_tabindex();
  2447. $logic_event = self::get_logic_event($field, "keyup");
  2448. return !empty($post_link) ? $post_link : sprintf("<div class='ginput_container'><input name='input_%d' id='%s' type='text' value='%s' class='%s' {$tabindex} {$logic_event} %s/></div>", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
  2449. break;
  2450. case "post_content":
  2451. case "post_excerpt":
  2452. $max_chars = "";
  2453. $logic_event = self::get_logic_event($field, "keyup");
  2454. $tabindex = self::get_tabindex();
  2455. return !empty($post_link) ? $post_link : sprintf("<div class='ginput_container'><textarea name='input_%d' id='%s' class='textarea %s' {$tabindex} {$logic_event} %s rows='10' cols='50'>%s</textarea></div>{$max_chars}", $id, $field_id, esc_attr($class), $disabled_text, esc_html($value));
  2456. break;
  2457. case "post_category" :
  2458. if(!empty($post_link))
  2459. return $post_link;
  2460. if(rgget("displayAllCategories", $field) && !IS_ADMIN){
  2461. $default_category = rgget("categoryInitialItemEnabled", $field) ? "-1" : get_option('default_category');
  2462. $selected = empty($value) ? $default_category : $value;
  2463. $args = array('echo' => 0, 'selected' => $selected, "class" => esc_attr($class) . " gfield_select", 'hide_empty' => 0, 'name' => "input_$id", 'orderby' => 'name', 'hierarchical' => true );
  2464. if(self::$tab_index > 0)
  2465. $args["tab_index"] = self::$tab_index++;
  2466. if(rgget("categoryInitialItemEnabled", $field)){
  2467. $args["show_option_none"] = empty($field["categoryInitialItem"]) ? " " : $field["categoryInitialItem"];
  2468. }
  2469. $args = apply_filters("gform_post_category_args_{$field["id"]}", apply_filters("gform_post_category_args", $args, $field), $field);
  2470. return "<div class='ginput_container'>" . wp_dropdown_categories($args) . "</div>";
  2471. }
  2472. else{
  2473. $tabindex = self::get_tabindex();
  2474. if(is_array(rgar($field, "choices")))
  2475. usort($field["choices"], create_function('$a,$b', 'return strcmp($a["text"], $b["text"]);'));
  2476. $choices = self::get_select_choices($field, $value);
  2477. //Adding first option
  2478. if(rgget("categoryInitialItemEnabled", $field)){
  2479. $selected = empty($value) ? "selected='selected'" : "";
  2480. $choices = "<option value='-1' {$selected}>{$field["categoryInitialItem"]}</option>" . $choices;
  2481. }
  2482. return sprintf("<div class='ginput_container'><select name='input_%d' id='%s' class='%s gfield_select' {$tabindex} %s>%s</select></div>", $id, $field_id, esc_attr($class), $disabled_text, $choices);
  2483. }
  2484. break;
  2485. case "post_image" :
  2486. if(!empty($post_link))
  2487. return $post_link;
  2488. $title = esc_attr(rgget($field["id"] . ".1", $value));
  2489. $caption = esc_attr(rgget($field["id"] . ".4", $value));
  2490. $description = esc_attr(rgget($field["id"] . ".7", $value));
  2491. //hidding meta fields for admin
  2492. $hidden_style = "style='display:none;'";
  2493. $title_style = !rgget("displayTitle", $field) && IS_ADMIN ? $hidden_style : "";
  2494. $caption_style = !rgget("displayCaption", $field) && IS_ADMIN ? $hidden_style : "";
  2495. $description_style = !rgget("displayDescription", $field) && IS_ADMIN ? $hidden_style : "";
  2496. $file_label_style = IS_ADMIN && !(rgget("displayTitle", $field) || rgget("displayCaption", $field) || rgget("displayDescription", $field)) ? $hidden_style : "";
  2497. $hidden_class = $preview = "";
  2498. $file_info = RGFormsModel::get_temp_filename($form_id, "input_{$id}");
  2499. if($file_info){
  2500. $hidden_class = " gform_hidden";
  2501. $file_label_style = $hidden_style;
  2502. $preview = "<span class='ginput_preview'><strong>" . esc_html($file_info["uploaded_filename"]) . "</strong> | <a href='javascript:;' onclick='gformDeleteUploadedFile({$form_id}, {$id});'>" . __("delete", "gravityforms") . "</a></span>";
  2503. }
  2504. //in admin, render all meta fields to allow for immediate feedback, but hide the ones not selected
  2505. $file_label = (IS_ADMIN || rgget("displayTitle", $field) || rgget("displayCaption", $field) || rgget("displayDescription", $field)) ? "<label for='$field_id' class='ginput_post_image_file' $file_label_style>" . apply_filters("gform_postimage_file_{$form_id}",apply_filters("gform_postimage_file",__("File", "gravityforms"), $form_id), $form_id) . "</label>" : "";
  2506. $tabindex = self::get_tabindex();
  2507. $upload = sprintf("<span class='ginput_full$class_suffix'>{$preview}<input name='input_%d' id='%s' type='file' value='%s' class='%s' $tabindex %s/>$file_label</span>", $id, $field_id, esc_attr($value), esc_attr($class . $hidden_class), $disabled_text);
  2508. $tabindex = self::get_tabindex();
  2509. $title_field = rgget("displayTitle", $field) || IS_ADMIN ? sprintf("<span class='ginput_full$class_suffix ginput_post_image_title' $title_style><input type='text' name='input_%d.1' id='%s_1' value='%s' $tabindex %s/><label for='%s_1'>" . apply_filters("gform_postimage_title_{$form_id}",apply_filters("gform_postimage_title",__("Title", "gravityforms"), $form_id), $form_id) . "</label></span>", $id, $field_id, $title, $disabled_text, $field_id) : "";
  2510. $tabindex = self::get_tabindex();
  2511. $caption_field = rgget("displayCaption", $field) || IS_ADMIN ? sprintf("<span class='ginput_full$class_suffix ginput_post_image_caption' $caption_style><input type='text' name='input_%d.4' id='%s_4' value='%s' $tabindex %s/><label for='%s_4'>" . apply_filters("gform_postimage_caption_{$form_id}",apply_filters("gform_postimage_caption",__("Caption", "gravityforms"), $form_id), $form_id) . "</label></span>", $id, $field_id, $caption, $disabled_text, $field_id) : "";
  2512. $tabindex = self::get_tabindex();
  2513. $description_field = rgget("displayDescription", $field) || IS_ADMIN? sprintf("<span class='ginput_full$class_suffix ginput_post_image_description' $description_style><input type='text' name='input_%d.7' id='%s_7' value='%s' $tabindex %s/><label for='%s_7'>" . apply_filters("gform_postimage_description_{$form_id}",apply_filters("gform_postimage_description",__("Description", "gravityforms"), $form_id), $form_id) . "</label></span>", $id, $field_id, $description, $disabled_text, $field_id) : "";
  2514. return "<div class='ginput_complex$class_suffix ginput_container'>" . $upload . $title_field . $caption_field . $description_field . "</div>";
  2515. break;
  2516. case "multiselect" :
  2517. if(!empty($post_link))
  2518. return $post_link;
  2519. $placeholder = rgar($field, "enableEnhancedUI") ? "data-placeholder='" . esc_attr(apply_filters("gform_multiselect_placeholder_{$form_id}", apply_filters("gform_multiselect_placeholder", __("Click to select...", "gravityforms"), $form_id), $form_id)) . "'" : "";
  2520. $logic_event = self::get_logic_event($field, "keyup");
  2521. $css_class = trim(esc_attr($class) . " gfield_select");
  2522. $size = rgar($field, "multiSelectSize");
  2523. if(empty($size))
  2524. $size = 7;
  2525. $tabindex = self::get_tabindex();
  2526. return sprintf("<div class='ginput_container'><select multiple='multiple' {$placeholder} size='{$size}' name='input_%d[]' id='%s' {$logic_event} class='%s' $tabindex %s>%s</select></div>", $id, $field_id, $css_class, $disabled_text, self::get_select_choices($field, $value));
  2527. break;
  2528. case "select" :
  2529. if(!empty($post_link))
  2530. return $post_link;
  2531. $logic_event = self::get_logic_event($field, "change");
  2532. $css_class = trim(esc_attr($class) . " gfield_select");
  2533. $tabindex = self::get_tabindex();
  2534. return sprintf("<div class='ginput_container'><select name='input_%d' id='%s' $logic_event class='%s' $tabindex %s>%s</select></div>", $id, $field_id, $css_class, $disabled_text, self::get_select_choices($field, $value));
  2535. case "checkbox" :
  2536. if(!empty($post_link))
  2537. return $post_link;
  2538. return sprintf("<div class='ginput_container'><ul class='gfield_checkbox' id='%s'>%s</ul></div>", $field_id, self::get_checkbox_choices($field, $value, $disabled_text));
  2539. case "radio" :
  2540. if(!empty($post_link))
  2541. return $post_link;
  2542. return sprintf("<div class='ginput_container'><ul class='gfield_radio' id='%s'>%s</ul></div>", $field_id, self::get_radio_choices($field, $value, $disabled_text));
  2543. case "password" :
  2544. $first_tabindex = self::get_tabindex();
  2545. $last_tabindex = self::get_tabindex();
  2546. $strength_style = !rgar($field,"passwordStrengthEnabled") ? "style='display:none;'" : "";
  2547. $strength = rgar($field,"passwordStrengthEnabled") || IS_ADMIN ? "<div id='{$field_id}_strength_indicator' class='gfield_password_strength' {$strength_style}>" . __("Strength indicator", "gravityforms") . "</div><input type='hidden' class='gform_hidden' id='{$field_id}_strength' name='input_{$id}_strength' />" : "";
  2548. $action = !IS_ADMIN ? "gformShowPasswordStrength(\"$field_id\");" : "";
  2549. $onchange= rgar($field,"passwordStrengthEnabled") ? "onchange='{$action}'" : "";
  2550. $onkeyup = rgar($field,"passwordStrengthEnabled") ? "onkeyup='{$action}'" : "";
  2551. $pass = RGForms::post("input_" . $id ."_2");
  2552. return sprintf("<div class='ginput_complex$class_suffix ginput_container' id='{$field_id}_container'><span id='" . $field_id . "_1_container' class='ginput_left'><input type='password' name='input_%d' id='%s' {$onkeyup} {$onchange} value='%s' $first_tabindex %s/><label for='%s'>" . apply_filters("gform_password_{$form_id}", apply_filters("gform_password",__("Enter Password", "gravityforms"), $form_id), $form_id) . "</label></span><span id='" . $field_id . "_2_container' class='ginput_right'><input type='password' name='input_%d_2' id='%s_2' {$onkeyup} {$onchange} value='%s' $last_tabindex %s/><label for='%s_2'>" . apply_filters("gform_password_confirm_{$form_id}", apply_filters("gform_password_confirm",__("Confirm Password", "gravityforms"), $form_id), $form_id) . "</label></span><div class='gf_clear gf_clear_complex'></div></div>{$strength}", $id, $field_id, esc_attr($value), $disabled_text, $field_id, $id, $field_id, esc_attr($pass), $disabled_text, $field_id);
  2553. case "name" :
  2554. $prefix = "";
  2555. $first = "";
  2556. $last = "";
  2557. $suffix = "";
  2558. if(is_array($value)){
  2559. $prefix = esc_attr(RGForms::get($field["id"] . ".2", $value));
  2560. $first = esc_attr(RGForms::get($field["id"] . ".3", $value));
  2561. $last = esc_attr(RGForms::get($field["id"] . ".6", $value));
  2562. $suffix = esc_attr(RGForms::get($field["id"] . ".8", $value));
  2563. }
  2564. switch(rgget("nameFormat", $field)){
  2565. case "extended" :
  2566. $prefix_tabindex = self::get_tabindex();
  2567. $first_tabindex = self::get_tabindex();
  2568. $last_tabindex = self::get_tabindex();
  2569. $suffix_tabindex = self::get_tabindex();
  2570. return sprintf("<div class='ginput_complex$class_suffix ginput_container' id='$field_id'><span id='" . $field_id . "_2_container' class='name_prefix'><input type='text' name='input_%d.2' id='%s_2' value='%s' $prefix_tabindex %s/><label for='%s_2'>" . apply_filters("gform_name_prefix_{$form_id}",apply_filters("gform_name_prefix",__("Prefix", "gravityforms"), $form_id), $form_id) . "</label></span><span id='" . $field_id . "_3_container' class='name_first'><input type='text' name='input_%d.3' id='%s_3' value='%s' $first_tabindex %s/><label for='%s_3'>" . apply_filters("gform_name_first_{$form_id}",apply_filters("gform_name_first",__("First", "gravityforms"), $form_id), $form_id) . "</label></span><span id='" . $field_id . "_6_container' class='name_last'><input type='text' name='input_%d.6' id='%s_6' value='%s' $last_tabindex %s/><label for='%s_6'>" . apply_filters("gform_name_last_{$form_id}", apply_filters("gform_name_last", __("Last", "gravityforms"), $form_id), $form_id) . "</label></span><span id='" . $field_id . "_8_container' class='name_suffix'><input type='text' name='input_%d.8' id='%s_8' value='%s' $suffix_tabindex %s/><label for='%s_8'>" . apply_filters("gform_name_suffix_{$form_id}", apply_filters("gform_name_suffix", __("Suffix", "gravityforms"), $form_id), $form_id) . "</label></span></div>", $id, $field_id, $prefix, $disabled_text, $field_id, $id, $field_id, $first, $disabled_text, $field_id, $id, $field_id, $last, $disabled_text, $field_id, $id, $field_id, $suffix, $disabled_text, $field_id);
  2571. case "simple" :
  2572. $tabindex = self::get_tabindex();
  2573. return sprintf("<div class='ginput_container'><input name='input_%d' id='%s' type='text' value='%s' class='%s' $tabindex %s/></div>", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
  2574. default :
  2575. $first_tabindex = self::get_tabindex();
  2576. $last_tabindex = self::get_tabindex();
  2577. return sprintf("<div class='ginput_complex$class_suffix ginput_container' id='$field_id'><span id='" . $field_id . "_3_container' class='ginput_left'><input type='text' name='input_%d.3' id='%s_3' value='%s' $first_tabindex %s/><label for='%s_3'>" . apply_filters("gform_name_first_{$form_id}", apply_filters("gform_name_first",__("First", "gravityforms"), $form_id), $form_id) . "</label></span><span id='" . $field_id . "_6_container' class='ginput_right'><input type='text' name='input_%d.6' id='%s_6' value='%s' $last_tabindex %s/><label for='%s_6'>" . apply_filters("gform_name_last_{$form_id}", apply_filters("gform_name_last",__("Last", "gravityforms"), $form_id), $form_id) . "</label></span><div class='gf_clear gf_clear_complex'></div></div>", $id, $field_id, $first, $disabled_text, $field_id, $id, $field_id, $last, $disabled_text, $field_id);
  2578. }
  2579. case "address" :
  2580. $street_value ="";
  2581. $street2_value ="";
  2582. $city_value ="";
  2583. $state_value ="";
  2584. $zip_value ="";
  2585. $country_value ="";
  2586. if(is_array($value)){
  2587. $street_value = esc_attr(rgget($field["id"] . ".1",$value));
  2588. $street2_value = esc_attr(rgget($field["id"] . ".2",$value));
  2589. $city_value = esc_attr(rgget($field["id"] . ".3",$value));
  2590. $state_value = esc_attr(rgget($field["id"] . ".4",$value));
  2591. $zip_value = esc_attr(rgget($field["id"] . ".5",$value));
  2592. $country_value = esc_attr(rgget($field["id"] . ".6",$value));
  2593. }
  2594. $address_types = self::get_address_types($form_id);
  2595. $addr_type = empty($field["addressType"]) ? "international" : $field["addressType"];
  2596. $address_type = $address_types[$addr_type];
  2597. $state_label = empty($address_type["state_label"]) ? __("State", "gravityforms") : $address_type["state_label"];
  2598. $zip_label = empty($address_type["zip_label"]) ? __("Zip Code", "gravityforms") : $address_type["zip_label"];
  2599. $hide_country = !empty($address_type["country"]) || rgget("hideCountry", $field);
  2600. if(empty($country_value))
  2601. $country_value = rgget("defaultCountry", $field);
  2602. if(empty($state_value))
  2603. $state_value = rgget("defaultState", $field);
  2604. $country_list = self::get_country_dropdown($country_value);
  2605. //changing css classes based on field format to ensure proper display
  2606. $address_display_format = apply_filters("gform_address_display_format", "default");
  2607. $city_location = $address_display_format == "zip_before_city" ? "right" : "left";
  2608. $zip_location = $address_display_format != "zip_before_city" && rgar($field,"hideState") ? "right" : "left";
  2609. $state_location = $address_display_format == "zip_before_city" ? "left" : "right";
  2610. $country_location = rgar($field,"hideState") ? "left" : "right";
  2611. //address field
  2612. $tabindex = self::get_tabindex();
  2613. $street_address = sprintf("<span class='ginput_full$class_suffix' id='" . $field_id . "_1_container'><input type='text' name='input_%d.1' id='%s_1' value='%s' $tabindex %s/><label for='%s_1' id='" . $field_id . "_1_label'>" . apply_filters("gform_address_street_{$form_id}", apply_filters("gform_address_street",__("Street Address", "gravityforms"), $form_id), $form_id) . "</label></span>", $id, $field_id, $street_value, $disabled_text, $field_id);
  2614. //address line 2 field
  2615. $street_address2 = "";
  2616. $style = (IS_ADMIN && rgget("hideAddress2", $field)) ? "style='display:none;'" : "";
  2617. if(IS_ADMIN || !rgget("hideAddress2", $field)){
  2618. $tabindex = self::get_tabindex();
  2619. $street_address2 = sprintf("<span class='ginput_full$class_suffix' id='" . $field_id . "_2_container' $style><input type='text' name='input_%d.2' id='%s_2' value='%s' $tabindex %s/><label for='%s_2' id='" . $field_id . "_2_label'>" . apply_filters("gform_address_street2_{$form_id}",apply_filters("gform_address_street2",__("Address Line 2", "gravityforms"), $form_id), $form_id) . "</label></span>", $id, $field_id, $street2_value, $disabled_text, $field_id);
  2620. }
  2621. if($address_display_format == "zip_before_city"){
  2622. //zip field
  2623. $tabindex = self::get_tabindex();
  2624. $zip = sprintf("<span class='ginput_{$zip_location}$class_suffix' id='" . $field_id . "_5_container'><input type='text' name='input_%d.5' id='%s_5' value='%s' $tabindex %s/><label for='%s_5' id='" . $field_id . "_5_label'>" . apply_filters("gform_address_zip_{$form_id}", apply_filters("gform_address_zip", $zip_label, $form_id), $form_id) . "</label></span>", $id, $field_id, $zip_value, $disabled_text, $field_id);
  2625. //city field
  2626. $tabindex = self::get_tabindex();
  2627. $city = sprintf("<span class='ginput_{$city_location}$class_suffix' id='" . $field_id . "_3_container'><input type='text' name='input_%d.3' id='%s_3' value='%s' $tabindex %s/><label for='%s_3' id='{$field_id}_3_label'>" . apply_filters("gform_address_city_{$form_id}", apply_filters("gform_address_city",__("City", "gravityforms"), $form_id), $form_id) . "</label></span>", $id, $field_id, $city_value, $disabled_text, $field_id);
  2628. //state field
  2629. $style = (IS_ADMIN && rgget("hideState", $field)) ? "style='display:none;'" : "";
  2630. if(IS_ADMIN || !rgget("hideState", $field)){
  2631. $state_field = self::get_state_field($field, $id, $field_id, $state_value, $disabled_text, $form_id);
  2632. $state = sprintf("<span class='ginput_{$state_location}$class_suffix' id='" . $field_id . "_4_container' $style>$state_field<label for='%s_4' id='" . $field_id . "_4_label'>" . apply_filters("gform_address_state_{$form_id}", apply_filters("gform_address_state", $state_label, $form_id), $form_id) . "</label></span>", $field_id);
  2633. }
  2634. else{
  2635. $state = sprintf("<input type='hidden' class='gform_hidden' name='input_%d.4' id='%s_4' value='%s'/>", $id, $field_id, $state_value);
  2636. }
  2637. }
  2638. else{
  2639. //city field
  2640. $tabindex = self::get_tabindex();
  2641. $city = sprintf("<span class='ginput_{$city_location}$class_suffix' id='" . $field_id . "_3_container'><input type='text' name='input_%d.3' id='%s_3' value='%s' $tabindex %s/><label for='%s_3' id='$field_id.3_label'>" . apply_filters("gform_address_city_{$form_id}", apply_filters("gform_address_city",__("City", "gravityforms"), $form_id), $form_id) . "</label></span>", $id, $field_id, $city_value, $disabled_text, $field_id);
  2642. //state field
  2643. $style = (IS_ADMIN && rgget("hideState", $field)) ? "style='display:none;'" : "";
  2644. if(IS_ADMIN || !rgget("hideState", $field)){
  2645. $state_field = self::get_state_field($field, $id, $field_id, $state_value, $disabled_text, $form_id);
  2646. $state = sprintf("<span class='ginput_{$state_location}$class_suffix' id='" . $field_id . "_4_container' $style>$state_field<label for='%s_4' id='" . $field_id . "_4_label'>" . apply_filters("gform_address_state_{$form_id}", apply_filters("gform_address_state", $state_label, $form_id), $form_id) . "</label></span>", $field_id);
  2647. }
  2648. else{
  2649. $state = sprintf("<input type='hidden' class='gform_hidden' name='input_%d.4' id='%s_4' value='%s'/>", $id, $field_id, $state_value);
  2650. }
  2651. //zip field
  2652. $tabindex = self::get_tabindex();
  2653. $zip = sprintf("<span class='ginput_{$zip_location}$class_suffix' id='" . $field_id . "_5_container'><input type='text' name='input_%d.5' id='%s_5' value='%s' $tabindex %s/><label for='%s_5' id='" . $field_id . "_5_label'>" . apply_filters("gform_address_zip_{$form_id}", apply_filters("gform_address_zip", $zip_label, $form_id), $form_id) . "</label></span>", $id, $field_id, $zip_value, $disabled_text, $field_id);
  2654. }
  2655. if(IS_ADMIN || !$hide_country){
  2656. $style = $hide_country ? "style='display:none;'" : "";
  2657. $tabindex = self::get_tabindex();
  2658. $country = sprintf("<span class='ginput_{$country_location}$class_suffix' id='" . $field_id . "_6_container' $style><select name='input_%d.6' id='%s_6' $tabindex %s>%s</select><label for='%s_6' id='" . $field_id . "_6_label'>" . apply_filters("gform_address_country_{$form_id}", apply_filters("gform_address_country",__("Country", "gravityforms"), $form_id), $form_id) . "</label></span>", $id, $field_id, $disabled_text, $country_list, $field_id);
  2659. }
  2660. else{
  2661. $country = sprintf("<input type='hidden' class='gform_hidden' name='input_%d.6' id='%s_6' value='%s'/>", $id, $field_id, $country_value);
  2662. }
  2663. $inputs = $address_display_format == "zip_before_city" ? $street_address . $street_address2 . $zip . $city . $state . $country : $street_address . $street_address2 . $city . $state . $zip . $country;
  2664. return "<div class='ginput_complex$class_suffix ginput_container' id='$field_id'>" . $inputs . "<div class='gf_clear gf_clear_complex'></div></div>";
  2665. case "date" :
  2666. if(!empty($post_link))
  2667. return $post_link;
  2668. $format = empty($field["dateFormat"]) ? "mdy" : esc_attr($field["dateFormat"]);
  2669. $field_position = substr($format, 0, 3);
  2670. if(IS_ADMIN && RG_CURRENT_VIEW != "entry"){
  2671. $datepicker_display = in_array(rgget("dateType", $field), array("datefield", "datedropdown")) ? "none" : "inline";
  2672. $datefield_display = rgget("dateType", $field) == "datefield" ? "inline" : "none";
  2673. $dropdown_display = rgget("dateType", $field) == "datedropdown" ? "inline" : "none";
  2674. $icon_display = rgget("calendarIconType", $field) == "calendar" ? "inline" : "none";
  2675. $month_field = "<div class='gfield_date_month ginput_date' id='gfield_input_date_month' style='display:$datefield_display'><input name='ginput_month' type='text' disabled='disabled'/><label>" . __("MM", "gravityforms") . "</label></div>";
  2676. $day_field = "<div class='gfield_date_day ginput_date' id='gfield_input_date_day' style='display:$datefield_display'><input name='ginput_day' type='text' disabled='disabled'/><label>" . __("DD", "gravityforms") . "</label></div>";
  2677. $year_field = "<div class='gfield_date_year ginput_date' id='gfield_input_date_year' style='display:$datefield_display'><input type='text' name='ginput_year' disabled='disabled'/><label>" . __("YYYY", "gravityforms") . "</label></div>";
  2678. $month_dropdown = "<div class='gfield_date_dropdown_month ginput_date_dropdown' id='gfield_dropdown_date_month' style='display:$dropdown_display'>" . self::get_month_dropdown("","","","","disabled='disabled'") . "</div>";
  2679. $day_dropdown = "<div class='gfield_date_dropdown_day ginput_date_dropdown' id='gfield_dropdown_date_day' style='display:$dropdown_display'>" . self::get_day_dropdown("","","","","disabled='disabled'") . "</div>";
  2680. $year_dropdown = "<div class='gfield_date_dropdown_year ginput_date_dropdown' id='gfield_dropdown_date_year' style='display:$dropdown_display'>" . self::get_year_dropdown("","","","","disabled='disabled'") . "</div>";
  2681. $field_string ="<div class='ginput_container' id='gfield_input_datepicker' style='display:$datepicker_display'><input name='ginput_datepicker' type='text' /><img src='" . GFCommon::get_base_url() . "/images/calendar.png' id='gfield_input_datepicker_icon' style='display:$icon_display'/></div>";
  2682. switch($field_position){
  2683. case "dmy" :
  2684. $field_string .= $day_field . $month_field . $year_field . $day_dropdown . $month_dropdown . $year_dropdown;
  2685. break;
  2686. case "ymd" :
  2687. $field_string .= $year_field . $month_field . $day_field . $year_dropdown . $month_dropdown . $day_dropdown;
  2688. break;
  2689. default :
  2690. $field_string .= $month_field . $day_field . $year_field . $month_dropdown . $day_dropdown . $year_dropdown;
  2691. break;
  2692. }
  2693. return $field_string;
  2694. }
  2695. else{
  2696. $date_info = self::parse_date($value, $format);
  2697. $date_type = rgget("dateType", $field);
  2698. if(in_array($date_type, array("datefield", "datedropdown")))
  2699. {
  2700. switch($field_position){
  2701. case "dmy" :
  2702. $tabindex = self::get_tabindex();
  2703. $field_str = $date_type == "datedropdown"
  2704. ? "<div class='clear-multi'><div class='gfield_date_dropdown_day ginput_container' id='{$field_id}'>" . self::get_day_dropdown("input_{$id}[]", "{$field_id}_1", rgar($date_info,"day"), $tabindex, $disabled_text) . "</div>"
  2705. : sprintf("<div class='clear-multi'><div class='gfield_date_day ginput_container' id='%s'><input type='text' maxlength='2' name='input_%d[]' id='%s_2' value='%s' $tabindex %s/><label for='%s_2'>" . __("DD", "gravityforms") . "</label></div>", $field_id, $id, $field_id, rgget("day", $date_info), $disabled_text, $field_id);
  2706. $tabindex = self::get_tabindex();
  2707. $field_str .= $date_type == "datedropdown"
  2708. ? "<div class='gfield_date_dropdown_month ginput_container' id='{$field_id}'>" . self::get_month_dropdown("input_{$id}[]", "{$field_id}_1", rgar($date_info,"month"), $tabindex, $disabled_text) . "</div>"
  2709. : sprintf("<div class='gfield_date_month ginput_container' id='%s'><input type='text' maxlength='2' name='input_%d[]' id='%s_1' value='%s' $tabindex %s/><label for='%s_1'>" . __("MM", "gravityforms") . "</label></div>", $field_id, $id, $field_id, rgget("month", $date_info), $disabled_text, $field_id);
  2710. $tabindex = self::get_tabindex();
  2711. $field_str .= $date_type == "datedropdown"
  2712. ? "<div class='gfield_date_dropdown_year ginput_container' id='{$field_id}'>" . self::get_year_dropdown("input_{$id}[]", "{$field_id}_1", rgar($date_info,"year"), $tabindex, $disabled_text) . "</div></div>"
  2713. : sprintf("<div class='gfield_date_year ginput_container' id='%s'><input type='text' maxlength='4' name='input_%d[]' id='%s_3' value='%s' $tabindex %s/><label for='%s_3'>" . __("YYYY", "gravityforms") . "</label></div></div>", $field_id, $id, $field_id, rgget("year", $date_info), $disabled_text, $field_id);
  2714. break;
  2715. case "ymd" :
  2716. $tabindex = self::get_tabindex();
  2717. $field_str = $date_type == "datedropdown"
  2718. ? "<div class='clear-multi'><div class='gfield_date_dropdown_year ginput_container' id='{$field_id}'>" . self::get_year_dropdown("input_{$id}[]", "{$field_id}_1", rgar($date_info,"year"), $tabindex, $disabled_text) . "</div>"
  2719. : sprintf("<div class='clear-multi'><div class='gfield_date_year ginput_container' id='%s'><input type='text' maxlength='4' name='input_%d[]' id='%s_3' value='%s' $tabindex %s/><label for='%s_3'>" . __("YYYY", "gravityforms") . "</label></div>", $field_id, $id, $field_id, rgget("year", $date_info), $disabled_text, $field_id);
  2720. $field_str .= $date_type == "datedropdown"
  2721. ? "<div class='gfield_date_dropdown_month ginput_container' id='{$field_id}'>" . self::get_month_dropdown("input_{$id}[]", "{$field_id}_1", rgar($date_info,"month"), $tabindex, $disabled_text) . "</div>"
  2722. : sprintf("<div class='gfield_date_month ginput_container' id='%s'><input type='text' maxlength='2' name='input_%d[]' id='%s_1' value='%s' $tabindex %s/><label for='%s_1'>" . __("MM", "gravityforms") . "</label></div>", $field_id, $id, $field_id, rgar($date_info,"month"), $disabled_text, $field_id);
  2723. $tabindex = self::get_tabindex();
  2724. $field_str .= $date_type == "datedropdown"
  2725. ? "<div class='gfield_date_dropdown_day ginput_container' id='{$field_id}'>" . self::get_day_dropdown("input_{$id}[]", "{$field_id}_1", rgar($date_info,"day"), $tabindex, $disabled_text) . "</div></div>"
  2726. : sprintf("<div class='gfield_date_day ginput_container' id='%s'><input type='text' maxlength='2' name='input_%d[]' id='%s_2' value='%s' $tabindex %s/><label for='%s_2'>" . __("DD", "gravityforms") . "</label></div></div>", $field_id, $id, $field_id, rgar($date_info,"day"), $disabled_text, $field_id);
  2727. break;
  2728. default :
  2729. $tabindex = self::get_tabindex();
  2730. $field_str = $date_type == "datedropdown"
  2731. ? "<div class='clear-multi'><div class='gfield_date_dropdown_month ginput_container' id='{$field_id}'>" . self::get_month_dropdown("input_{$id}[]", "{$field_id}_1", rgar($date_info,"month"), $tabindex, $disabled_text) . "</div>"
  2732. : sprintf("<div class='clear-multi'><div class='gfield_date_month ginput_container' id='%s'><input type='text' maxlength='2' name='input_%d[]' id='%s_1' value='%s' $tabindex %s/><label for='%s_1'>" . __("MM", "gravityforms") . "</label></div>", $field_id, $id, $field_id, rgar($date_info,"month"), $disabled_text, $field_id);
  2733. $tabindex = self::get_tabindex();
  2734. $field_str .= $date_type == "datedropdown"
  2735. ? "<div class='gfield_date_dropdown_day ginput_container' id='{$field_id}'>" . self::get_day_dropdown("input_{$id}[]", "{$field_id}_1", rgar($date_info,"day"), $tabindex, $disabled_text) . "</div>"
  2736. : sprintf("<div class='gfield_date_day ginput_container' id='%s'><input type='text' maxlength='2' name='input_%d[]' id='%s_2' value='%s' $tabindex %s/><label for='%s_2'>" . __("DD", "gravityforms") . "</label></div>", $field_id, $id, $field_id, rgar($date_info,"day"), $disabled_text, $field_id);
  2737. $tabindex = self::get_tabindex();
  2738. $field_str .= $date_type == "datedropdown"
  2739. ? "<div class='gfield_date_dropdown_year ginput_container' id='{$field_id}'>" . self::get_year_dropdown("input_{$id}[]", "{$field_id}_1", rgar($date_info,"year"), $tabindex, $disabled_text) . "</div></div>"
  2740. : sprintf("<div class='gfield_date_year ginput_container' id='%s'><input type='text' maxlength='4' name='input_%d[]' id='%s_3' value='%s' $tabindex %s/><label for='%s_3'>" . __("YYYY", "gravityforms") . "</label></div></div>", $field_id, $id, $field_id, rgget("year", $date_info), $disabled_text, $field_id);
  2741. break;
  2742. }
  2743. return $field_str;
  2744. }
  2745. else
  2746. {
  2747. $value = GFCommon::date_display($value, $format);
  2748. $icon_class = $field["calendarIconType"] == "none" ? "datepicker_no_icon" : "datepicker_with_icon";
  2749. $icon_url = empty($field["calendarIconUrl"]) ? GFCommon::get_base_url() . "/images/calendar.png" : $field["calendarIconUrl"];
  2750. $tabindex = self::get_tabindex();
  2751. return sprintf("<div class='ginput_container'><input name='input_%d' id='%s' type='text' value='%s' class='datepicker %s %s %s' $tabindex %s/> </div><input type='hidden' id='gforms_calendar_icon_$field_id' class='gform_hidden' value='$icon_url'/>", $id, $field_id, esc_attr($value), esc_attr($class), $format, $icon_class, $disabled_text);
  2752. }
  2753. }
  2754. case "time" :
  2755. if(!empty($post_link))
  2756. return $post_link;
  2757. $hour = $minute = $am_selected = $pm_selected = "";
  2758. if(!is_array($value) && !empty($value)){
  2759. preg_match('/^(\d*):(\d*) ?(.*)$/', $value, $matches);
  2760. $hour = esc_attr($matches[1]);
  2761. $minute = esc_attr($matches[2]);
  2762. $am_selected = rgar($matches,3) == "am" ? "selected='selected'" : "";
  2763. $pm_selected = rgar($matches,3) == "pm" ? "selected='selected'" : "";
  2764. }
  2765. else if(is_array($value)){
  2766. $hour = esc_attr($value[0]);
  2767. $minute = esc_attr($value[1]);
  2768. $am_selected = rgar($value,2) == "am" ? "selected='selected'" : "";
  2769. $pm_selected = rgar($value,2) == "pm" ? "selected='selected'" : "";
  2770. }
  2771. $hour_tabindex = self::get_tabindex();
  2772. $minute_tabindex = self::get_tabindex();
  2773. $ampm_tabindex = self::get_tabindex();
  2774. $ampm_field_style = is_admin() && rgar($field, "timeFormat") == "24" ? "style='display:none;'" : "";
  2775. $ampm_field = is_admin() || rgar($field, "timeFormat") != "24" ? "<div class='gfield_time_ampm ginput_container' {$ampm_field_style}><select name='input_{$id}[]' id='{$field_id}_3' $ampm_tabindex {$disabled_text}><option value='am' {$am_selected}>" . __("AM", "gravityforms") . "</option><option value='pm' {$pm_selected}>" . __("PM", "gravityforms") . "</option></select></div>" : "";
  2776. return sprintf("<div class='clear-multi'><div class='gfield_time_hour ginput_container' id='%s'><input type='text' maxlength='2' name='input_%d[]' id='%s_1' value='%s' $hour_tabindex %s/> : <label for='%s_1'>" . __("HH", "gravityforms") . "</label></div><div class='gfield_time_minute ginput_container'><input type='text' maxlength='2' name='input_%d[]' id='%s_2' value='%s' $minute_tabindex %s/><label for='%s_2'>" . __("MM", "gravityforms") . "</label></div>{$ampm_field}</div>", $field_id, $id, $field_id, $hour, $disabled_text, $field_id, $id, $field_id, $minute, $disabled_text, $field_id);
  2777. case "fileupload" :
  2778. $tabindex = self::get_tabindex();
  2779. $upload = sprintf("<input name='input_%d' id='%s' type='file' value='%s' size='20' class='%s' $tabindex %s/>", $id, $field_id, esc_attr($value), esc_attr($class), $disabled_text);
  2780. if(IS_ADMIN && !empty($value)){
  2781. $value = esc_attr($value);
  2782. $preview = sprintf("<div id='preview_%d'><a href='%s' target='_blank' alt='%s' title='%s'>%s</a><a href='%s' target='_blank' alt='" . __("Download file", "gravityforms") . "' title='" . __("Download file", "gravityforms") . "'><img src='%s' style='margin-left:10px;'/></a><a href='javascript:void(0);' alt='" . __("Delete file", "gravityforms") . "' title='" . __("Delete file", "gravityforms") . "' onclick='DeleteFile(%d,%d);' ><img src='%s' style='margin-left:10px;'/></a></div>", $id, $value, $value, $value, GFCommon::truncate_url($value), $value, GFCommon::get_base_url() . "/images/download.png", $lead_id, $id, GFCommon::get_base_url() . "/images/delete.png");
  2783. return $preview . "<div id='upload_$id' style='display:none;'>$upload</div>";
  2784. }
  2785. else{
  2786. $file_info = RGFormsModel::get_temp_filename($form_id, "input_{$id}");
  2787. if($file_info && !$field["failed_validation"]){
  2788. $preview = "<span class='ginput_preview'><strong>" . esc_html($file_info["uploaded_filename"]) . "</strong> | <a href='javascript:;' onclick='gformDeleteUploadedFile({$form_id}, {$id});'>" . __("delete", "gravityforms") . "</a></span>";
  2789. return "<div class='ginput_container'>" . str_replace(" class='", " class='gform_hidden ", $upload) . " {$preview}</div>";
  2790. }
  2791. else{
  2792. return "<div class='ginput_container'>$upload</div>";
  2793. }
  2794. }
  2795. case "captcha" :
  2796. switch(rgget("captchaType", $field)){
  2797. case "simple_captcha" :
  2798. $size = rgempty("simpleCaptchaSize", $field) ? "medium" : $field["simpleCaptchaSize"];
  2799. $captcha = self::get_captcha($field);
  2800. $tabindex = self::get_tabindex();
  2801. $dimensions = IS_ADMIN ? "" : "width='" . rgar($captcha,"width") . "' height='" . rgar($captcha,"height") . "'";
  2802. return "<div class='gfield_captcha_container'><img class='gfield_captcha' src='" . rgar($captcha,"url") . "' alt='' {$dimensions} /><div class='gfield_captcha_input_container simple_captcha_{$size}'><input type='text' name='input_{$id}' id='{$field_id}' {$tabindex}/><input type='hidden' name='input_captcha_prefix_{$id}' value='" . rgar($captcha,"prefix") . "' /></div></div>";
  2803. break;
  2804. case "math" :
  2805. $size = empty($field["simpleCaptchaSize"]) ? "medium" : $field["simpleCaptchaSize"];
  2806. $captcha_1 = self::get_math_captcha($field, 1);
  2807. $captcha_2 = self::get_math_captcha($field, 2);
  2808. $captcha_3 = self::get_math_captcha($field, 3);
  2809. $tabindex = self::get_tabindex();
  2810. $dimensions = IS_ADMIN ? "" : "width='{$captcha_1["width"]}' height='{$captcha_1["height"]}'";
  2811. return "<div class='gfield_captcha_container'><img class='gfield_captcha' src='{$captcha_1["url"]}' alt='' {$dimensions} /><img class='gfield_captcha' src='{$captcha_2["url"]}' alt='' {$dimensions} /><img class='gfield_captcha' src='{$captcha_3["url"]}' alt='' {$dimensions} /><div class='gfield_captcha_input_container math_{$size}'><input type='text' name='input_{$id}' id='input_{$field_id}' {$tabindex}/><input type='hidden' name='input_captcha_prefix_{$id}' value='{$captcha_1["prefix"]},{$captcha_2["prefix"]},{$captcha_3["prefix"]}' /></div></div>";
  2812. break;
  2813. default:
  2814. if(!function_exists("recaptcha_get_html")){
  2815. require_once(GFCommon::get_base_path() . '/recaptchalib.php');
  2816. }
  2817. $theme = empty($field["captchaTheme"]) ? "red" : esc_attr($field["captchaTheme"]);
  2818. $publickey = get_option("rg_gforms_captcha_public_key");
  2819. $privatekey = get_option("rg_gforms_captcha_private_key");
  2820. if(IS_ADMIN){
  2821. if(empty($publickey) || empty($privatekey)){
  2822. return "<div class='captcha_message'>" . __("To use the reCaptcha field you must first do the following:", "gravityforms") . "</div><div class='captcha_message'>1 - <a href='http://www.google.com/recaptcha/whyrecaptcha' target='_blank'>" . sprintf(__("Sign up%s for a free reCAPTCHA account", "gravityforms"), "</a>") . "</div><div class='captcha_message'>2 - " . sprintf(__("Enter your reCAPTCHA keys in the %ssettings page%s", "gravityforms"), "<a href='?page=gf_settings'>", "</a>") . "</div>";
  2823. }
  2824. else{
  2825. return "<div class='ginput_container'><img class='gfield_captcha' src='" . GFCommon::get_base_url() . "/images/captcha_$theme.jpg' alt='reCAPTCHA' title='reCAPTCHA'/></div>";
  2826. }
  2827. }
  2828. else{
  2829. $language = empty($field["captchaLanguage"]) ? "en" : esc_attr($field["captchaLanguage"]);
  2830. $options = "<script type='text/javascript'>" . apply_filters("gform_cdata_open", "") . " var RecaptchaOptions = {theme : '$theme'}; if(parseInt('" . self::$tab_index . "') > 0) {RecaptchaOptions.tabindex = " . self::$tab_index++ . ";}" .
  2831. apply_filters("gform_recaptcha_init_script", "", $form_id, $field) . apply_filters("gform_cdata_close", "") . "</script>";
  2832. $is_ssl = !empty($_SERVER['HTTPS']);
  2833. return $options . "<div class='ginput_container' id='$field_id'>" . recaptcha_get_html($publickey, null, $is_ssl, $language) . "</div>";
  2834. }
  2835. }
  2836. break;
  2837. case "creditcard" :
  2838. $card_number = "";
  2839. $card_name = "";
  2840. $expiration_date = "";
  2841. $expiration_month = "";
  2842. $expiration_year = "";
  2843. $security_code = "";
  2844. $autocomplete = RGFormsModel::is_html5_enabled() ? "autocomplete='off'" : "";
  2845. if(is_array($value)){
  2846. $card_number = esc_attr(rgget($field["id"] . ".1",$value));
  2847. $card_name = esc_attr(rgget($field["id"] . ".5",$value));
  2848. $expiration_date = rgget($field["id"] . ".2",$value);
  2849. if(!is_array($expiration_date) && !empty($expiration_date))
  2850. $expiration_date = explode("/", $expiration_date);
  2851. if(is_array($expiration_date) && count($expiration_date) == 2){
  2852. $expiration_month = $expiration_date[0];
  2853. $expiration_year = $expiration_date[1];
  2854. }
  2855. $security_code = esc_attr(rgget($field["id"] . ".3",$value));
  2856. }
  2857. $action = !IS_ADMIN ? "gformMatchCard(\"{$field_id}_1\");" : "";
  2858. $onchange= "onchange='{$action}'";
  2859. $onkeyup = "onkeyup='{$action}'";
  2860. $card_icons = '';
  2861. $cards = GFCommon::get_card_types();
  2862. $card_style = rgar($field, 'creditCardStyle') ? rgar($field, 'creditCardStyle') : 'style1';
  2863. foreach($cards as $card) {
  2864. $style = "";
  2865. if(self::is_card_supported($field, $card["slug"])){
  2866. $print_card = true;
  2867. }
  2868. else if (IS_ADMIN){
  2869. $print_card = true;
  2870. $style = "style='display:none;'";
  2871. }
  2872. else{
  2873. $print_card = false;
  2874. }
  2875. if($print_card){
  2876. $card_icons .= "<div class='gform_card_icon gform_card_icon_{$card['slug']}' {$style}>{$card['name']}</div>";
  2877. }
  2878. }
  2879. $payment_methods = apply_filters("gform_payment_methods", array(), $field, $form_id);
  2880. $payment_options = "";
  2881. if(is_array($payment_methods)){
  2882. foreach($payment_methods as $payment_method){
  2883. $checked = rgpost("gform_payment_method") == $payment_method["key"] ? "checked='checked'" : "";
  2884. $payment_options .="<div class='gform_payment_option gform_payment_{$payment_method["key"]}'><input type='radio' name='gform_payment_method' value='{$payment_method["key"]}' id='gform_payment_method_{$payment_method["key"]}' onclick='gformToggleCreditCard();' {$checked}/> {$payment_method["label"]}</div>";
  2885. }
  2886. }
  2887. $checked = rgpost("gform_payment_method") == "creditcard" || rgempty("gform_payment_method") ? "checked='checked'" : "";
  2888. $card_radio_button = empty($payment_options) ? "" : "<input type='radio' name='gform_payment_method' id='gform_payment_method_creditcard' value='creditcard' onclick='gformToggleCreditCard();' {$checked}/>";
  2889. $card_icons = "{$payment_options}<div class='gform_card_icon_container gform_card_icon_{$card_style}'>{$card_radio_button}{$card_icons}</div>";
  2890. //card number fields
  2891. $tabindex = self::get_tabindex();
  2892. $card_field = sprintf("<span class='ginput_full{$class_suffix}' id='{$field_id}_1_container' >{$card_icons}<input type='text' name='input_%d.1' id='%s_1' value='%s' {$tabindex} %s {$onchange} {$onkeyup} {$autocomplete} /><label for='%s_1' id='{$field_id}_1_label'>" . apply_filters("gform_card_number_{$form_id}", apply_filters("gform_card_number",__("Card Number", "gravityforms"), $form_id), $form_id) . "</label></span>", $id, $field_id, $card_number, $disabled_text, $field_id);
  2893. //expiration date field
  2894. $expiration_field = "<span class='ginput_full{$class_suffix} ginput_cardextras' id='{$field_id}_2_container'>".
  2895. "<span class='ginput_cardinfo_left{$class_suffix}' id='{$field_id}_2_container'>".
  2896. "<span class='ginput_card_expiration_container ginput_card_field'>".
  2897. // month selector
  2898. "<select name='input_{$id}.2[]' id='{$field_id}_2_month' " . self::get_tabindex() . " {$disabled_text} class='ginput_card_expiration ginput_card_expiration_month'>" . self::get_expiration_months($expiration_month) . "</select>".
  2899. // year selector
  2900. "<select name='input_{$id}.2[]' id='{$field_id}_2_year' " . self::get_tabindex() . " {$disabled_text} class='ginput_card_expiration ginput_card_expiration_year'>" . self::get_expiration_years($expiration_year) . "</select>".
  2901. // label for the expiration fields
  2902. "<label for='{$field_id}_2_month' >" . apply_filters("gform_card_expiration_{$form_id}", apply_filters("gform_card_expiration",__("Expiration Date", "gravityforms"), $form_id), $form_id) . "</label>".
  2903. "</span>".
  2904. "</span>";
  2905. //security code field
  2906. $tabindex = self::get_tabindex();
  2907. $security_field = "<span class='ginput_cardinfo_right{$class_suffix}' id='{$field_id}_2_container'>".
  2908. "<input type='text' name='input_{$id}.3' id='{$field_id}_3' {$tabindex} {$disabled_text} class='ginput_card_security_code' value='{$security_code}' {$autocomplete} />".
  2909. "<span class='ginput_card_security_code_icon'>&nbsp;</span>".
  2910. "<label for='{$field_id}_3' >" . apply_filters("gform_card_security_code_{$form_id}", apply_filters("gform_card_security_code",__("Security Code", "gravityforms"), $form_id), $form_id) . "</label>".
  2911. "</span>".
  2912. "</span>";
  2913. $tabindex = self::get_tabindex();
  2914. $card_name_field = sprintf("<span class='ginput_full{$class_suffix}' id='{$field_id}_5_container'><input type='text' name='input_%d.5' id='%s_5' value='%s' {$tabindex} %s /><label for='%s_5' id='{$field_id}_5_label'>" . apply_filters("gform_card_name_{$form_id}", apply_filters("gform_card_name",__("Cardholder Name", "gravityforms"), $form_id), $form_id) . "</label></span>", $id, $field_id, $card_name, $disabled_text, $field_id);
  2915. return "<div class='ginput_complex{$class_suffix} ginput_container' id='{$field_id}'>" . $card_field . $expiration_field . $security_field . $card_name_field . " </div>";
  2916. break;
  2917. case "list" :
  2918. if(!empty($value))
  2919. $value = maybe_unserialize($value);
  2920. if(!is_array($value))
  2921. $value = array(array());
  2922. $has_columns = is_array(rgar($field, "choices"));
  2923. $columns = $has_columns ? rgar($field, "choices") : array(array());
  2924. $list = "<div class='ginput_container ginput_list'>" .
  2925. "<table class='gfield_list'>";
  2926. $class_attr = "";
  2927. if($has_columns){
  2928. $list .= "<colgroup>";
  2929. $colnum = 1;
  2930. foreach($columns as $column){
  2931. $odd_even = ($colnum % 2) == 0 ? "even" : "odd";
  2932. $list .= "<col id='gfield_list_{$field["id"]}_col{$colnum}' class='gfield_list_col_{$odd_even}'></col>";
  2933. $colnum++;
  2934. }
  2935. $list .= "</colgroup>";
  2936. $list .= "<thead><tr>";
  2937. foreach($columns as $column){
  2938. $list .= "<th>" . esc_html($column["text"]) . "</th>";
  2939. }
  2940. $list .= "<th>&nbsp;</th></tr></thead>";
  2941. }
  2942. else{
  2943. $list .= "<colgroup><col id='gfield_list_{$field["id"]}_col1' class='gfield_list_col_odd'></col></colgroup>";
  2944. }
  2945. $delete_display = count($value) == 1 ? "visibility:hidden;" : "";
  2946. $maxRow = intval(rgar($field, "maxRows"));
  2947. $disabled_icon_class = !empty($maxRow) && count($value) >= $maxRow ? "gfield_icon_disabled" : "";
  2948. $list .= "<tbody>";
  2949. $rownum = 1;
  2950. foreach($value as $item){
  2951. $odd_even = ($rownum % 2) == 0 ? "even" : "odd";
  2952. $list .= "<tr class='gfield_list_row_{$odd_even}'>";
  2953. $colnum = 1;
  2954. foreach($columns as $column){
  2955. //getting value. taking into account columns being added/removed from form meta
  2956. if(is_array($item)){
  2957. if($has_columns){
  2958. $val = rgar($item, $column["text"]);
  2959. }
  2960. else{
  2961. $vals = array_values($item);
  2962. $val = rgar($vals, 0);
  2963. }
  2964. }
  2965. else{
  2966. $val = $colnum == 1 ? $item : "";
  2967. }
  2968. $list .= "<td class='gfield_list_cell gfield_list_{$field["id"]}_cell{$colnum}'>" . self::get_list_input($field, $has_columns, $column, $val, $form_id) . "</td>";
  2969. $colnum++;
  2970. }
  2971. $add_icon = !rgempty("addIconUrl", $field) ? $field["addIconUrl"] : GFCommon::get_base_url() . "/images/add.png";
  2972. $delete_icon = !rgempty("deleteIconUrl", $field) ? $field["deleteIconUrl"] : GFCommon::get_base_url() . "/images/remove.png";
  2973. $on_click = IS_ADMIN && RG_CURRENT_VIEW != "entry" ? "" : "onclick='gformAddListItem(this, {$maxRow})'";
  2974. if(rgar($field, "maxRows") != 1){
  2975. $list .="<td class='gfield_list_icons'>";
  2976. $list .=" <img src='{$add_icon}' class='add_list_item {$disabled_icon_class}' {$disabled_text} title='" . __("Add a row", "gravityforms") . "' alt='" . __("Add a row", "gravityforms") . "' {$on_click} style='cursor:pointer; margin:0 3px;' />" .
  2977. " <img src='{$delete_icon}' {$disabled_text} title='" . __("Remove this row", "gravityforms") . "' alt='" . __("Remove this row", "gravityforms") . "' class='delete_list_item' style='cursor:pointer; {$delete_display}' onclick='gformDeleteListItem(this, {$maxRow})' />";
  2978. $list .="</td>";
  2979. }
  2980. $list .= "</tr>";
  2981. if(!empty($maxRow) && $rownum >= $maxRow)
  2982. break;
  2983. $rownum++;
  2984. }
  2985. $list .="</tbody></table></div>";
  2986. return $list;
  2987. break;
  2988. }
  2989. }
  2990. public static function is_ssl(){
  2991. global $wordpress_https;
  2992. $is_ssl = false;
  2993. $has_https_plugin = class_exists('WordPressHTTPS') && isset($wordpress_https);
  2994. $has_is_ssl_method = $has_https_plugin && method_exists('WordPressHTTPS', 'is_ssl');
  2995. $has_isSsl_method = $has_https_plugin && method_exists('WordPressHTTPS', 'isSsl');
  2996. //Use the WordPress HTTPs plugin if installed
  2997. if ($has_https_plugin && $has_is_ssl_method){
  2998. $is_ssl = $wordpress_https->is_ssl();
  2999. }
  3000. else if ($has_https_plugin && $has_isSsl_method){
  3001. $is_ssl = $wordpress_https->isSsl();
  3002. }
  3003. else{
  3004. $is_ssl = is_ssl();
  3005. }
  3006. if(!$is_ssl && isset($_SERVER["HTTP_CF_VISITOR"]) && strpos($_SERVER["HTTP_CF_VISITOR"], "https")){
  3007. $is_ssl=true;
  3008. }
  3009. return apply_filters("gform_is_ssl", $is_ssl);
  3010. }
  3011. public static function is_card_supported($field, $card_slug){
  3012. $supported_cards = rgar($field, 'creditCards');
  3013. $default_cards = array('amex', 'discover', 'mastercard', 'visa');
  3014. if(!empty($supported_cards) && in_array($card_slug, $supported_cards)) {
  3015. return true;
  3016. }
  3017. else if(empty($supported_cards) && in_array($card_slug, $default_cards)) {
  3018. return true;
  3019. }
  3020. return false;
  3021. }
  3022. public static function is_preview(){
  3023. $url_info = parse_url(RGFormsModel::get_current_page_url());
  3024. $file_name = basename($url_info["path"]);
  3025. return $file_name == "preview.php" || rgget("gf_page", $_GET) == "preview";
  3026. }
  3027. private static function get_expiration_months($selected_month){
  3028. $str = "<option value=''>" . __("Month", "gravityforms") . "</option>";
  3029. for($i=1; $i<13; $i++){
  3030. $selected = intval($selected_month) == $i ? "selected='selected'" : "";
  3031. $month = str_pad($i, 2, "0", STR_PAD_LEFT);
  3032. $str .= "<option value='{$i}' {$selected}>{$month}</option>";
  3033. }
  3034. return $str;
  3035. }
  3036. private static function get_expiration_years($selected_year){
  3037. $str = "<option value=''>" . __("Year", "gravityforms") . "</option>";
  3038. $year = intval(date("Y"));
  3039. for($i=$year; $i < ($year + 20); $i++){
  3040. $selected = intval($selected_year) == $i ? "selected='selected'" : "";
  3041. $str .= "<option value='{$i}' {$selected}>{$i}</option>";
  3042. }
  3043. return $str;
  3044. }
  3045. private static function get_list_input($field, $has_columns, $column, $value, $form_id){
  3046. $tabindex = GFCommon::get_tabindex();
  3047. $column_index = 1;
  3048. if($has_columns && is_array(rgar($field, "choices"))){
  3049. foreach($field["choices"] as $choice){
  3050. if($choice["text"] == $column["text"])
  3051. break;
  3052. $column_index++;
  3053. }
  3054. }
  3055. $input_info = array("type" => "text");
  3056. $input_info = apply_filters("gform_column_input_{$form_id}_{$field["id"]}_{$column_index}", apply_filters("gform_column_input", $input_info, $field, rgar($column, "text"), $value, $form_id), $field, rgar($column, "text"), $value, $form_id);
  3057. switch($input_info["type"]){
  3058. case "select" :
  3059. $input = "<select name='input_{$field["id"]}[]' {$tabindex} >";
  3060. if(!is_array($input_info["choices"]))
  3061. $input_info["choices"] = explode(",", $input_info["choices"]);
  3062. foreach($input_info["choices"] as $choice){
  3063. if(is_array($choice)){
  3064. $choice_value = $choice["value"];
  3065. $choice_text = $choice["text"];
  3066. $choice_selected = $choice["isSelected"];
  3067. }
  3068. else{
  3069. $choice_value = $choice;
  3070. $choice_text = $choice;
  3071. $choice_selected = false;
  3072. }
  3073. $is_selected = empty($value) ? $choice_selected : $choice_value == $value;
  3074. $selected = $is_selected ? "selected='selected'" : "";
  3075. $input .= "<option value='" . esc_attr($choice_value) . "' {$selected}>" . esc_html($choice_text) . "</option>";
  3076. }
  3077. $input .= "</select>";
  3078. break;
  3079. default :
  3080. $input = "<input type='text' name='input_{$field["id"]}[]' value='" . esc_attr($value) . "' {$tabindex}/>";
  3081. break;
  3082. }
  3083. return apply_filters("gform_column_input_content_{$form_id}_{$field["id"]}_{$column_index}",
  3084. apply_filters("gform_column_input_content", $input, $input_info, $field, rgar($column, "text"), $value, $form_id),
  3085. $input_info, $field, rgar($column, "text"), $value, $form_id);
  3086. }
  3087. public static function to_money($number, $currency_code=""){
  3088. if(!class_exists("RGCurrency"))
  3089. require_once("currency.php");
  3090. if(empty($currency_code))
  3091. $currency_code = self::get_currency();
  3092. $currency = new RGCurrency($currency_code);
  3093. return $currency->to_money($number);
  3094. }
  3095. public static function to_number($text, $currency_code=""){
  3096. if(!class_exists("RGCurrency"))
  3097. require_once("currency.php");
  3098. if(empty($currency_code))
  3099. $currency_code = self::get_currency();
  3100. $currency = new RGCurrency($currency_code);
  3101. return $currency->to_number($text);
  3102. }
  3103. public static function get_currency(){
  3104. $currency = get_option("rg_gforms_currency");
  3105. $currency = empty($currency) ? "USD" : $currency;
  3106. return apply_filters("gform_currency", $currency);
  3107. }
  3108. public static function get_simple_captcha(){
  3109. $captcha = new ReallySimpleCaptcha();
  3110. $captcha->tmp_dir = RGFormsModel::get_upload_path("captcha") . "/";
  3111. return $captcha;
  3112. }
  3113. public static function get_captcha($field){
  3114. if(!class_exists("ReallySimpleCaptcha"))
  3115. return array();
  3116. $captcha = self::get_simple_captcha();
  3117. //If captcha folder does not exist and can't be created, return an empty captcha
  3118. if(!wp_mkdir_p($captcha->tmp_dir))
  3119. return array();
  3120. $captcha->char_length = 5;
  3121. switch(rgar($field,"simpleCaptchaSize")){
  3122. case "small" :
  3123. $captcha->img_size = array( 100, 28 );
  3124. $captcha->font_size = 18;
  3125. $captcha->base = array( 8, 20 );
  3126. $captcha->font_char_width = 17;
  3127. break;
  3128. case "large" :
  3129. $captcha->img_size = array( 200, 56 );
  3130. $captcha->font_size = 32;
  3131. $captcha->base = array( 18, 42 );
  3132. $captcha->font_char_width = 35;
  3133. break;
  3134. default :
  3135. $captcha->img_size = array( 150, 42 );
  3136. $captcha->font_size = 26;
  3137. $captcha->base = array( 15, 32 );
  3138. $captcha->font_char_width = 25;
  3139. break;
  3140. }
  3141. if(!empty($field["simpleCaptchaFontColor"])){
  3142. $captcha->fg = self::hex2rgb($field["simpleCaptchaFontColor"]);
  3143. }
  3144. if(!empty($field["simpleCaptchaBackgroundColor"])){
  3145. $captcha->bg = self::hex2rgb($field["simpleCaptchaBackgroundColor"]);
  3146. }
  3147. $word = $captcha->generate_random_word();
  3148. $prefix = mt_rand();
  3149. $filename = $captcha->generate_image($prefix, $word);
  3150. $url = RGFormsModel::get_upload_url("captcha") . "/" . $filename;
  3151. $path = $captcha->tmp_dir . $filename;
  3152. return array("path"=>$path, "url"=> $url, "height" => $captcha->img_size[1], "width" => $captcha->img_size[0], "prefix" => $prefix);
  3153. }
  3154. public static function get_math_captcha($field, $pos){
  3155. if(!class_exists("ReallySimpleCaptcha"))
  3156. return array();
  3157. $captcha = self::get_simple_captcha();
  3158. //If captcha folder does not exist and can't be created, return an empty captcha
  3159. if(!wp_mkdir_p($captcha->tmp_dir))
  3160. return array();
  3161. $captcha->char_length = 1;
  3162. if($pos == 1 || $pos == 3)
  3163. $captcha->chars = '0123456789';
  3164. else
  3165. $captcha->chars = '+';
  3166. switch(rgar($field,"simpleCaptchaSize")){
  3167. case "small" :
  3168. $captcha->img_size = array( 23, 28 );
  3169. $captcha->font_size = 18;
  3170. $captcha->base = array( 6, 20 );
  3171. $captcha->font_char_width = 17;
  3172. break;
  3173. case "large" :
  3174. $captcha->img_size = array( 36, 56 );
  3175. $captcha->font_size = 32;
  3176. $captcha->base = array( 10, 42 );
  3177. $captcha->font_char_width = 35;
  3178. break;
  3179. default :
  3180. $captcha->img_size = array( 30, 42 );
  3181. $captcha->font_size = 26;
  3182. $captcha->base = array( 9, 32 );
  3183. $captcha->font_char_width = 25;
  3184. break;
  3185. }
  3186. if(!empty($field["simpleCaptchaFontColor"])){
  3187. $captcha->fg = self::hex2rgb($field["simpleCaptchaFontColor"]);
  3188. }
  3189. if(!empty($field["simpleCaptchaBackgroundColor"])){
  3190. $captcha->bg = self::hex2rgb($field["simpleCaptchaBackgroundColor"]);
  3191. }
  3192. $word = $captcha->generate_random_word();
  3193. $prefix = mt_rand();
  3194. $filename = $captcha->generate_image($prefix, $word);
  3195. $url = RGFormsModel::get_upload_url("captcha") . "/" . $filename;
  3196. $path = $captcha->tmp_dir . $filename;
  3197. return array("path"=>$path, "url"=> $url, "height" => $captcha->img_size[1], "width" => $captcha->img_size[0], "prefix" => $prefix);
  3198. }
  3199. private static function hex2rgb($color){
  3200. if ($color[0] == '#')
  3201. $color = substr($color, 1);
  3202. if (strlen($color) == 6)
  3203. list($r, $g, $b) = array($color[0].$color[1],
  3204. $color[2].$color[3],
  3205. $color[4].$color[5]);
  3206. elseif (strlen($color) == 3)
  3207. list($r, $g, $b) = array($color[0].$color[0], $color[1].$color[1], $color[2].$color[2]);
  3208. else
  3209. return false;
  3210. $r = hexdec($r); $g = hexdec($g); $b = hexdec($b);
  3211. return array($r, $g, $b);
  3212. }
  3213. public static function get_address_types($form_id){
  3214. $addressTypes = array(
  3215. "international" => array("label" => __("International", "gravityforms"),"zip_label" => apply_filters("gform_address_zip_{$form_id}",apply_filters("gform_address_zip", __("ZIP / Postal Code", "gravityforms"), $form_id), $form_id),"state_label" => apply_filters("gform_address_state_{$form_id}",apply_filters("gform_address_state",__("State / Province / Region", "gravityforms"), $form_id), $form_id)),
  3216. "us" => array("label" => __("United States", "gravityforms"),"zip_label" => apply_filters("gform_address_zip_{$form_id}",apply_filters("gform_address_zip", __("ZIP Code", "gravityforms"), $form_id), $form_id), "state_label" => apply_filters("gform_address_state_{$form_id}",apply_filters("gform_address_state",__("State", "gravityforms"), $form_id), $form_id), "country" => "United States", "states" => array_merge(array(''), GFCommon::get_us_states())),
  3217. "canadian" => array("label" => __("Canadian", "gravityforms"), "zip_label" => apply_filters("gform_address_zip_{$form_id}",apply_filters("gform_address_zip", __("Postal Code", "gravityforms"), $form_id), $form_id), "state_label" => apply_filters("gform_address_state_{$form_id}",apply_filters("gform_address_state",__("Province", "gravityforms"), $form_id), $form_id),"country" => "Canada", "states" => array_merge(array(''), GFCommon::get_canadian_provinces()))
  3218. );
  3219. return apply_filters("gform_address_types_{$form_id}", apply_filters("gform_address_types", $addressTypes, $form_id), $form_id);
  3220. }
  3221. private static function get_state_field($field, $id, $field_id, $state_value, $disabled_text, $form_id){
  3222. $state_dropdown_class = $state_text_class = $state_style = $text_style = $state_field_id = "";
  3223. if(empty($state_value)){
  3224. $state_value = rgget("defaultState", $field);
  3225. //for backwards compatibility (canadian address type used to store the default state into the defaultProvince property)
  3226. if (rgget("addressType", $field) == "canadian" && !rgempty("defaultProvince", $field))
  3227. $state_value = $field["defaultProvince"];
  3228. }
  3229. $address_type = rgempty("addressType", $field) ? "international" : $field["addressType"];
  3230. $address_types = self::get_address_types($form_id);
  3231. $has_state_drop_down = isset($address_types[$address_type]["states"]) && is_array($address_types[$address_type]["states"]);
  3232. if(IS_ADMIN && RG_CURRENT_VIEW != "entry"){
  3233. $state_dropdown_class = "class='state_dropdown'";
  3234. $state_text_class = "class='state_text'";
  3235. $state_style = !$has_state_drop_down ? "style='display:none;'" : "";
  3236. $text_style = $has_state_drop_down ? "style='display:none;'" : "";
  3237. $state_field_id = "";
  3238. }
  3239. else{
  3240. //id only displayed on front end
  3241. $state_field_id = "id='" . $field_id . "_4'";
  3242. }
  3243. $tabindex = self::get_tabindex();
  3244. $states = empty($address_types[$address_type]["states"]) ? array() : $address_types[$address_type]["states"];
  3245. $state_dropdown = sprintf("<select name='input_%d.4' %s $tabindex %s $state_dropdown_class $state_style>%s</select>", $id, $state_field_id, $disabled_text, GFCommon::get_state_dropdown($states, $state_value));
  3246. $tabindex = self::get_tabindex();
  3247. $state_text = sprintf("<input type='text' name='input_%d.4' %s value='%s' $tabindex %s $state_text_class $text_style/>", $id, $state_field_id, $state_value, $disabled_text);
  3248. if(IS_ADMIN && RG_CURRENT_VIEW != "entry")
  3249. return $state_dropdown . $state_text;
  3250. else if($has_state_drop_down)
  3251. return $state_dropdown;
  3252. else
  3253. return $state_text;
  3254. }
  3255. public static function get_lead_field_display($field, $value, $currency="", $use_text=false, $format="html", $media="screen"){
  3256. if($field['type'] == 'post_category')
  3257. $value = self::prepare_post_category_value($value, $field);
  3258. switch(RGFormsModel::get_input_type($field)){
  3259. case "name" :
  3260. if(is_array($value)){
  3261. $prefix = trim(rgget($field["id"] . ".2", $value));
  3262. $first = trim(rgget($field["id"] . ".3", $value));
  3263. $last = trim(rgget($field["id"] . ".6", $value));
  3264. $suffix = trim(rgget($field["id"] . ".8", $value));
  3265. $name = $prefix;
  3266. $name .= !empty($name) && !empty($first) ? " $first" : $first;
  3267. $name .= !empty($name) && !empty($last) ? " $last" : $last;
  3268. $name .= !empty($name) && !empty($suffix) ? " $suffix" : $suffix;
  3269. return $name;
  3270. }
  3271. else{
  3272. return $value;
  3273. }
  3274. break;
  3275. case "creditcard" :
  3276. if(is_array($value)){
  3277. $card_number = trim(rgget($field["id"] . ".1", $value));
  3278. $card_type = trim(rgget($field["id"] . ".4", $value));
  3279. $separator = $format == "html" ? "<br/>" : "\n";
  3280. return empty($card_number) ? "" : $card_type . $separator . $card_number;
  3281. }
  3282. else{
  3283. return "";
  3284. }
  3285. break;
  3286. case "address" :
  3287. if(is_array($value)){
  3288. $street_value = trim(rgget($field["id"] . ".1", $value));
  3289. $street2_value = trim(rgget($field["id"] . ".2", $value));
  3290. $city_value = trim(rgget($field["id"] . ".3", $value));
  3291. $state_value = trim(rgget($field["id"] . ".4", $value));
  3292. $zip_value = trim(rgget($field["id"] . ".5", $value));
  3293. $country_value = trim(rgget($field["id"] . ".6", $value));
  3294. $line_break = $format == "html" ? "<br />" : "\n";
  3295. $address_display_format = apply_filters("gform_address_display_format", "default");
  3296. if($address_display_format == "zip_before_city"){
  3297. /*
  3298. Sample:
  3299. 3333 Some Street
  3300. suite 16
  3301. 2344 City, State
  3302. Country
  3303. */
  3304. $addr_ary = array();
  3305. $addr_ary[] = $street_value;
  3306. if(!empty($street2_value))
  3307. $addr_ary[] = $street2_value;
  3308. $zip_line = trim($zip_value . " " . $city_value);
  3309. $zip_line .= !empty($zip_line) && !empty($state_value) ? ", {$state_value}" : $state_value;
  3310. $zip_line = trim($zip_line);
  3311. if(!empty($zip_line))
  3312. $addr_ary[] = $zip_line;
  3313. if(!empty($country_value))
  3314. $addr_ary[] = $country_value;
  3315. $address = implode("<br />", $addr_ary);
  3316. }
  3317. else{
  3318. $address = $street_value;
  3319. $address .= !empty($address) && !empty($street2_value) ? $line_break . $street2_value : $street2_value;
  3320. $address .= !empty($address) && (!empty($city_value) || !empty($state_value)) ? $line_break. $city_value : $city_value;
  3321. $address .= !empty($address) && !empty($city_value) && !empty($state_value) ? ", $state_value" : $state_value;
  3322. $address .= !empty($address) && !empty($zip_value) ? " $zip_value" : $zip_value;
  3323. $address .= !empty($address) && !empty($country_value) ? $line_break . $country_value : $country_value;
  3324. }
  3325. //adding map link
  3326. if(!empty($address) && $format == "html"){
  3327. $address_qs = str_replace($line_break, " ", $address); //replacing <br/> and \n with spaces
  3328. $address_qs = urlencode($address_qs);
  3329. $address .= "<br/><a href='http://maps.google.com/maps?q={$address_qs}' target='_blank' class='map-it-link'>Map It</a>";
  3330. }
  3331. return $address;
  3332. }
  3333. else{
  3334. return "";
  3335. }
  3336. break;
  3337. case "email" :
  3338. return GFCommon::is_valid_email($value) && $format == "html" ? "<a href='mailto:$value'>$value</a>" : $value;
  3339. break;
  3340. case "website" :
  3341. return GFCommon::is_valid_url($value) && $format == "html" ? "<a href='$value' target='_blank'>$value</a>" : $value;
  3342. break;
  3343. case "checkbox" :
  3344. if(is_array($value)){
  3345. $items = '';
  3346. foreach($value as $key => $item){
  3347. if(!empty($item)){
  3348. switch($format){
  3349. case "text" :
  3350. $items .= GFCommon::selection_display($item, $field, $currency, $use_text) . ", ";
  3351. break;
  3352. default:
  3353. $items .= "<li>" . GFCommon::selection_display($item, $field, $currency, $use_text) . "</li>";
  3354. break;
  3355. }
  3356. }
  3357. }
  3358. if(empty($items)){
  3359. return "";
  3360. }
  3361. else if($format == "text"){
  3362. return substr($items, 0, strlen($items)-2); //removing last comma
  3363. }
  3364. else{
  3365. return "<ul class='bulleted'>$items</ul>";
  3366. }
  3367. }
  3368. else{
  3369. return $value;
  3370. }
  3371. break;
  3372. case "post_image" :
  3373. $ary = explode("|:|", $value);
  3374. $url = count($ary) > 0 ? $ary[0] : "";
  3375. $title = count($ary) > 1 ? $ary[1] : "";
  3376. $caption = count($ary) > 2 ? $ary[2] : "";
  3377. $description = count($ary) > 3 ? $ary[3] : "";
  3378. if(!empty($url)){
  3379. $url = str_replace(" ", "%20", $url);
  3380. switch($format){
  3381. case "text" :
  3382. $value = $url;
  3383. $value .= !empty($title) ? "\n\n" . $field["label"] . " (" . __("Title", "gravityforms") . "): " . $title : "";
  3384. $value .= !empty($caption) ? "\n\n" . $field["label"] . " (" . __("Caption", "gravityforms") . "): " . $caption : "";
  3385. $value .= !empty($description) ? "\n\n" . $field["label"] . " (" . __("Description", "gravityforms") . "): " . $description : "";
  3386. break;
  3387. default :
  3388. $value = "<a href='$url' target='_blank' title='" . __("Click to view", "gravityforms") . "'><img src='$url' width='100' /></a>";
  3389. $value .= !empty($title) ? "<div>Title: $title</div>" : "";
  3390. $value .= !empty($caption) ? "<div>Caption: $caption</div>" : "";
  3391. $value .= !empty($description) ? "<div>Description: $description</div>": "";
  3392. break;
  3393. }
  3394. }
  3395. return $value;
  3396. case "fileupload" :
  3397. $file_path = $value;
  3398. if(!empty($file_path)){
  3399. $info = pathinfo($file_path);
  3400. $file_path = esc_attr(str_replace(" ", "%20", $file_path));
  3401. $value = $format == "text" ? $file_path : "<a href='$file_path' target='_blank' title='" . __("Click to view", "gravityforms") . "'>" . $info["basename"] . "</a>";
  3402. }
  3403. return $value;
  3404. break;
  3405. case "date" :
  3406. return GFCommon::date_display($value, rgar($field, "dateFormat"));
  3407. break;
  3408. case "radio" :
  3409. case "select" :
  3410. return GFCommon::selection_display($value, $field, $currency, $use_text);
  3411. break;
  3412. case "multiselect" :
  3413. if(empty($value) || $format == "text")
  3414. return $value;
  3415. $value = explode(",", $value);
  3416. $items = '';
  3417. foreach($value as $item){
  3418. $items .= "<li>" . GFCommon::selection_display($item, $field, $currency, $use_text) . "</li>";
  3419. }
  3420. return "<ul class='bulleted'>{$items}</ul>";
  3421. break;
  3422. case "calculation" :
  3423. case "singleproduct" :
  3424. if(is_array($value) && !empty($value)){
  3425. $product_name = trim($value[$field["id"] . ".1"]);
  3426. $price = trim($value[$field["id"] . ".2"]);
  3427. $quantity = trim($value[$field["id"] . ".3"]);
  3428. $product = $product_name . ", " . __("Qty: ", "gravityforms") . $quantity . ", " . __("Price: ", "gravityforms") . $price;
  3429. return $product;
  3430. }
  3431. else{
  3432. return "";
  3433. }
  3434. break;
  3435. case "number" :
  3436. return GFCommon::format_number($value, rgar($field, "numberFormat"));
  3437. break;
  3438. case "singleshipping" :
  3439. case "donation" :
  3440. case "total" :
  3441. case "price" :
  3442. return GFCommon::to_money($value, $currency);
  3443. case "list" :
  3444. if(empty($value))
  3445. return "";
  3446. $value = unserialize($value);
  3447. $has_columns = is_array($value[0]);
  3448. if(!$has_columns){
  3449. $items = '';
  3450. foreach($value as $key => $item){
  3451. if(!empty($item)){
  3452. switch($format){
  3453. case "text" :
  3454. $items .= $item . ", ";
  3455. break;
  3456. case "url" :
  3457. $items .= $item . ",";
  3458. break;
  3459. default :
  3460. if($media == "email"){
  3461. $items .= "<li>{$item}</li>";
  3462. }
  3463. else{
  3464. $items .= "<li>{$item}</li>";
  3465. }
  3466. break;
  3467. }
  3468. }
  3469. }
  3470. if(empty($items)){
  3471. return "";
  3472. }
  3473. else if($format == "text"){
  3474. return substr($items, 0, strlen($items)-2); //removing last comma
  3475. }
  3476. else if($format == "url"){
  3477. return substr($items, 0, strlen($items)-1); //removing last comma
  3478. }
  3479. else if($media == "email"){
  3480. return "<ul class='bulleted'>{$items}</ul>";
  3481. }
  3482. else{
  3483. return "<ul class='bulleted'>{$items}</ul>";
  3484. }
  3485. }
  3486. else if(is_array($value)){
  3487. $columns = array_keys($value[0]);
  3488. $list = "";
  3489. switch($format){
  3490. case "text" :
  3491. $is_first_row = true;
  3492. foreach($value as $item){
  3493. if(!$is_first_row)
  3494. $list .= "\n\n" . $field["label"] . ": ";
  3495. $list .= implode(",", array_values($item));
  3496. $is_first_row = false;
  3497. }
  3498. break;
  3499. case "url" :
  3500. foreach($value as $item){
  3501. $list .= implode("|", array_values($item)) . ",";
  3502. }
  3503. if(!empty($list))
  3504. $list = substr($list, 0, strlen($list)-1);
  3505. break;
  3506. default :
  3507. if($media == "email"){
  3508. $list = "<table class='gfield_list' style='border-top: 1px solid #DFDFDF; border-left: 1px solid #DFDFDF; border-spacing: 0; padding: 0; margin: 2px 0 6px; width: 100%'><thead><tr>";
  3509. //reading columns from entry data
  3510. foreach($columns as $column){
  3511. $list .= "<th style='background-image: none; border-right: 1px solid #DFDFDF; border-bottom: 1px solid #DFDFDF; padding: 6px 10px; font-family: sans-serif; font-size: 12px; font-weight: bold; background-color: #F1F1F1; color:#333; text-align:left'>" . esc_html($column) . "</th>";
  3512. }
  3513. $list .= "</tr></thead>";
  3514. $list .= "<tbody style='background-color: #F9F9F9'>";
  3515. foreach($value as $item){
  3516. $list .= "<tr>";
  3517. foreach($columns as $column){
  3518. $val = rgar($item, $column);
  3519. $list .= "<td style='padding: 6px 10px; border-right: 1px solid #DFDFDF; border-bottom: 1px solid #DFDFDF; border-top: 1px solid #FFF; font-family: sans-serif; font-size:12px;'>{$val}</td>";
  3520. }
  3521. $list .="</tr>";
  3522. }
  3523. $list .="<tbody></table>";
  3524. }
  3525. else{
  3526. $list = "<table class='gfield_list'><thead><tr>";
  3527. //reading columns from entry data
  3528. foreach($columns as $column){
  3529. $list .= "<th>" . esc_html($column) . "</th>";
  3530. }
  3531. $list .= "</tr></thead>";
  3532. $list .= "<tbody>";
  3533. foreach($value as $item){
  3534. $list .= "<tr>";
  3535. foreach($columns as $column){
  3536. $val = rgar($item, $column);
  3537. $list .= "<td>{$val}</td>";
  3538. }
  3539. $list .="</tr>";
  3540. }
  3541. $list .="<tbody></table>";
  3542. }
  3543. break;
  3544. }
  3545. return $list;
  3546. }
  3547. return "";
  3548. break;
  3549. default :
  3550. if (!is_array($value))
  3551. {
  3552. return nl2br($value);
  3553. }
  3554. break;
  3555. }
  3556. }
  3557. public static function get_product_fields($form, $lead, $use_choice_text=false, $use_admin_label=false){
  3558. $products = array();
  3559. $product_info = null;
  3560. // retrieve static copy of product info (only for "real" entries)
  3561. if(!rgempty("id", $lead)){
  3562. $product_info = gform_get_meta(rgar($lead,'id'), "gform_product_info_{$use_choice_text}_{$use_admin_label}");
  3563. }
  3564. // if no static copy, generate from form/lead info
  3565. if(!$product_info) {
  3566. foreach($form["fields"] as $field){
  3567. $id = $field["id"];
  3568. $lead_value = RGFormsModel::get_lead_field_value($lead, $field);
  3569. $quantity_field = self::get_product_fields_by_type($form, array("quantity"), $id);
  3570. $quantity = sizeof($quantity_field) > 0 && !RGFormsModel::is_field_hidden($form, $quantity_field[0], array(), $lead) ? RGFormsModel::get_lead_field_value($lead, $quantity_field[0]) : 1;
  3571. switch($field["type"]){
  3572. case "product" :
  3573. //ignore products that have been hidden by conditional logic
  3574. $is_hidden = RGFormsModel::is_field_hidden($form, $field, array(), $lead);
  3575. if($is_hidden)
  3576. continue;
  3577. //if single product, get values from the multiple inputs
  3578. if(is_array($lead_value)){
  3579. $product_quantity = sizeof($quantity_field) == 0 && !rgar($field,"disableQuantity") ? rgget($id . ".3", $lead_value) : $quantity;
  3580. if(empty($product_quantity))
  3581. continue;
  3582. if(!rgget($id, $products))
  3583. $products[$id] = array();
  3584. $products[$id]["name"] = $use_admin_label && !rgempty("adminLabel", $field) ? $field["adminLabel"] : $lead_value[$id . ".1"];
  3585. $products[$id]["price"] = rgar($lead_value, $id . ".2");
  3586. $products[$id]["quantity"] = $product_quantity;
  3587. }
  3588. else if(!empty($lead_value)){
  3589. if(empty($quantity))
  3590. continue;
  3591. if(!rgar($products,$id))
  3592. $products[$id] = array();
  3593. if($field["inputType"] == "price"){
  3594. $name = $field["label"];
  3595. $price = $lead_value;
  3596. }
  3597. else{
  3598. list($name, $price) = explode("|", $lead_value);
  3599. }
  3600. $products[$id]["name"] = !$use_choice_text ? $name : RGFormsModel::get_choice_text($field, $name);
  3601. $products[$id]["price"] = $price;
  3602. $products[$id]["quantity"] = $quantity;
  3603. $products[$id]["options"] = array();
  3604. }
  3605. if(isset($products[$id])){
  3606. $options = self::get_product_fields_by_type($form, array("option"), $id);
  3607. foreach($options as $option){
  3608. $option_value = RGFormsModel::get_lead_field_value($lead, $option);
  3609. $option_label = empty($option["adminLabel"]) ? $option["label"] : $option["adminLabel"];
  3610. if(is_array($option_value)){
  3611. foreach($option_value as $value){
  3612. $option_info = self::get_option_info($value, $option, $use_choice_text);
  3613. if(!empty($option_info))
  3614. $products[$id]["options"][] = array("field_label" => rgar($option, "label"), "option_name"=> rgar($option_info, "name"), "option_label" => $option_label . ": " . rgar($option_info, "name"), "price" => rgar($option_info,"price"));
  3615. }
  3616. }
  3617. else if(!empty($option_value)){
  3618. $option_info = self::get_option_info($option_value, $option, $use_choice_text);
  3619. $products[$id]["options"][] = array("field_label" => rgar($option, "label"), "option_name"=> rgar($option_info, "name"), "option_label" => $option_label . ": " . rgar($option_info, "name"), "price" => rgar($option_info,"price"));
  3620. }
  3621. }
  3622. }
  3623. break;
  3624. }
  3625. }
  3626. $shipping_field = self::get_fields_by_type($form, array("shipping"));
  3627. $shipping_price = $shipping_name = "";
  3628. if(!empty($shipping_field) && !RGFormsModel::is_field_hidden($form, $shipping_field[0], array(), $lead)){
  3629. $shipping_price = RGFormsModel::get_lead_field_value($lead, $shipping_field[0]);
  3630. $shipping_name = $shipping_field[0]["label"];
  3631. if($shipping_field[0]["inputType"] != "singleshipping"){
  3632. list($shipping_method, $shipping_price) = explode("|", $shipping_price);
  3633. $shipping_name = $shipping_field[0]["label"] . " ($shipping_method)";
  3634. }
  3635. }
  3636. $shipping_price = self::to_number($shipping_price);
  3637. $product_info = array("products" => $products, "shipping" => array("name" => $shipping_name, "price" => $shipping_price));
  3638. $product_info = apply_filters("gform_product_info_{$form["id"]}", apply_filters("gform_product_info", $product_info, $form, $lead), $form, $lead);
  3639. // save static copy of product info (only for "real" entries)
  3640. if(!rgempty("id", $lead) && !empty($product_info["products"])){
  3641. gform_update_meta($lead['id'], "gform_product_info_{$use_choice_text}_{$use_admin_label}", $product_info);
  3642. }
  3643. }
  3644. return $product_info;
  3645. }
  3646. public static function get_order_total($form, $lead) {
  3647. $products = self::get_product_fields($form, $lead, false);
  3648. return self::get_total($products);
  3649. }
  3650. public static function get_total($products) {
  3651. $total = 0;
  3652. foreach($products["products"] as $product){
  3653. $price = self::to_number($product["price"]);
  3654. if(is_array(rgar($product,"options"))){
  3655. foreach($product["options"] as $option){
  3656. $price += self::to_number($option["price"]);
  3657. }
  3658. }
  3659. $subtotal = floatval($product["quantity"]) * $price;
  3660. $total += $subtotal;
  3661. }
  3662. $total += floatval($products["shipping"]["price"]);
  3663. return $total;
  3664. }
  3665. public static function get_option_info($value, $option, $use_choice_text){
  3666. if(empty($value))
  3667. return array();
  3668. list($name, $price) = explode("|", $value);
  3669. if($use_choice_text)
  3670. $name = RGFormsModel::get_choice_text($option, $name);
  3671. return array("name" => $name, "price" => $price);
  3672. }
  3673. public static function gform_do_shortcode($content){
  3674. $is_ajax = false;
  3675. $forms = GFFormDisplay::get_embedded_forms($content, $is_ajax);
  3676. foreach($forms as $form){
  3677. GFFormDisplay::print_form_scripts($form, $is_ajax);
  3678. }
  3679. return do_shortcode($content);
  3680. }
  3681. public static function has_akismet(){
  3682. return function_exists('akismet_http_post');
  3683. }
  3684. public static function akismet_enabled($form_id) {
  3685. if(!self::has_akismet())
  3686. return false;
  3687. // if no option is set, leave akismet enabled; otherwise, use option value true/false
  3688. $enabled_by_setting = get_option('rg_gforms_enable_akismet') === false ? true : get_option('rg_gforms_enable_akismet') == true;
  3689. $enabled_by_filter = apply_filters("gform_akismet_enabled_$form_id", apply_filters("gform_akismet_enabled", $enabled_by_setting));
  3690. return $enabled_by_filter;
  3691. }
  3692. public static function is_akismet_spam($form, $lead){
  3693. global $akismet_api_host, $akismet_api_port;
  3694. $fields = self::get_akismet_fields($form, $lead);
  3695. //Submitting info do Akismet
  3696. $response = akismet_http_post($fields, $akismet_api_host, '/1.1/comment-check', $akismet_api_port );
  3697. $is_spam = trim(rgar($response, 1)) == "true";
  3698. return $is_spam;
  3699. }
  3700. public static function mark_akismet_spam($form, $lead, $is_spam){
  3701. global $akismet_api_host, $akismet_api_port;
  3702. $fields = self::get_akismet_fields($form, $lead);
  3703. $as = $is_spam ? "spam" : "ham";
  3704. //Submitting info do Akismet
  3705. akismet_http_post($fields, $akismet_api_host, '/1.1/submit-'.$as, $akismet_api_port );
  3706. }
  3707. private static function get_akismet_fields($form, $lead){
  3708. //Gathering Akismet information
  3709. $akismet_info = array();
  3710. $akismet_info['comment_type'] = 'gravity_form';
  3711. $akismet_info['comment_author'] = self::get_akismet_field("name", $form, $lead);
  3712. $akismet_info['comment_author_email'] = self::get_akismet_field("email", $form, $lead);
  3713. $akismet_info['comment_author_url'] = self::get_akismet_field("website", $form, $lead);
  3714. $akismet_info['comment_content'] = self::get_akismet_field("textarea", $form, $lead);
  3715. $akismet_info['contact_form_subject'] = $form["title"];
  3716. $akismet_info['comment_author_IP'] = $lead["ip"];
  3717. $akismet_info['permalink'] = $lead["source_url"];
  3718. $akismet_info['user_ip'] = preg_replace( '/[^0-9., ]/', '', $lead["ip"] );
  3719. $akismet_info['user_agent'] = $lead["user_agent"];
  3720. $akismet_info['referrer'] = is_admin() ? "" : $_SERVER['HTTP_REFERER'];
  3721. $akismet_info['blog'] = get_option('home');
  3722. $akismet_info = apply_filters("gform_akismet_fields_{$form["id"]}", apply_filters("gform_akismet_fields", $akismet_info, $form, $lead), $form, $lead);
  3723. return http_build_query($akismet_info);
  3724. }
  3725. private static function get_akismet_field($field_type, $form, $lead){
  3726. $fields = GFCommon::get_fields_by_type($form, array($field_type));
  3727. if(empty($fields))
  3728. return "";
  3729. $value = RGFormsModel::get_lead_field_value($lead, $fields[0]);
  3730. switch($field_type){
  3731. case "name" :
  3732. $value = GFCommon::get_lead_field_display($fields[0], $value);
  3733. break;
  3734. }
  3735. return $value;
  3736. }
  3737. public static function get_other_choice_value(){
  3738. $value = apply_filters('gform_other_choice_value', __("Other", "gravityforms"));
  3739. return $value;
  3740. }
  3741. public static function get_browser_class() {
  3742. global $is_lynx, $is_gecko, $is_IE, $is_opera, $is_NS4, $is_safari, $is_chrome, $is_iphone, $post;
  3743. $classes = array();
  3744. //adding browser related class
  3745. if($is_lynx) $classes[] = 'gf_browser_lynx';
  3746. else if($is_gecko) $classes[] = 'gf_browser_gecko';
  3747. else if($is_opera) $classes[] = 'gf_browser_opera';
  3748. else if($is_NS4) $classes[] = 'gf_browser_ns4';
  3749. else if($is_safari) $classes[] = 'gf_browser_safari';
  3750. else if($is_chrome) $classes[] = 'gf_browser_chrome';
  3751. else if($is_IE) $classes[] = 'gf_browser_ie';
  3752. else $classes[] = 'gf_browser_unknown';
  3753. //adding IE version
  3754. if($is_IE){
  3755. if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6') !== false)
  3756. $classes[] = 'gf_browser_ie6';
  3757. else if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 7') !== false)
  3758. $classes[] = 'gf_browser_ie7';
  3759. if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 8') !== false)
  3760. $classes[] = 'gf_browser_ie8';
  3761. if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 9') !== false)
  3762. $classes[] = 'gf_browser_ie9';
  3763. }
  3764. if($is_iphone) $classes[] = 'gf_browser_iphone';
  3765. return implode(" " , $classes);
  3766. }
  3767. public static function create_post($form, &$lead) {
  3768. $disable_post = apply_filters("gform_disable_post_creation_{$form["id"]}", apply_filters("gform_disable_post_creation", false, $form, $lead), $form, $lead);
  3769. $post_id = 0;
  3770. if(!$disable_post){
  3771. //creates post if the form has any post fields
  3772. $post_id = RGFormsModel::create_post($form, $lead);
  3773. }
  3774. return $post_id;
  3775. }
  3776. public static function evaluate_conditional_logic($logic, $form, $lead) {
  3777. if(!$logic || !is_array($logic["rules"]))
  3778. return true;
  3779. $entry_meta_keys = array_keys(GFFormsModel::get_entry_meta($form["id"]));
  3780. $match_count = 0;
  3781. if(is_array($logic["rules"])){
  3782. foreach($logic["rules"] as $rule) {
  3783. if (in_array($rule["fieldId"], $entry_meta_keys)){
  3784. $is_value_match = GFFormsModel::is_value_match(rgar($lead,$rule["fieldId"]), $rule["value"], $rule["operator"]);;
  3785. } else {
  3786. $source_field = GFFormsModel::get_field($form, $rule["fieldId"]);
  3787. $field_value = empty($lead) ? GFFormsModel::get_field_value($source_field, array()) : GFFormsModel::get_lead_field_value($lead, $source_field);
  3788. $is_value_match = GFFormsModel::is_value_match($field_value, $rule["value"], $rule["operator"], $source_field);
  3789. }
  3790. if($is_value_match)
  3791. $match_count++;
  3792. }
  3793. }
  3794. $do_action = ($logic["logicType"] == "all" && $match_count == sizeof($logic["rules"]) ) || ($logic["logicType"] == "any" && $match_count > 0);
  3795. return $do_action;
  3796. }
  3797. public static function get_card_types(){
  3798. $cards = array (
  3799. array ( 'name' => 'American Express',
  3800. 'slug' => 'amex',
  3801. 'lengths' => '15',
  3802. 'prefixes' => '34,37',
  3803. 'checksum' => true
  3804. ),
  3805. array ( 'name' => 'Discover',
  3806. 'slug' => 'discover',
  3807. 'lengths' => '16',
  3808. 'prefixes' => '6011,622,64,65',
  3809. 'checksum' => true
  3810. ),
  3811. array ( 'name' => 'MasterCard',
  3812. 'slug' => 'mastercard',
  3813. 'lengths' => '16',
  3814. 'prefixes' => '51,52,53,54,55',
  3815. 'checksum' => true
  3816. ),
  3817. array ( 'name' => 'Visa',
  3818. 'slug' => 'visa',
  3819. 'lengths' => '13,16',
  3820. 'prefixes' => '4,417500,4917,4913,4508,4844',
  3821. 'checksum' => true
  3822. ),
  3823. array ( 'name' => 'JCB',
  3824. 'slug' => 'jcb',
  3825. 'lengths' => '16',
  3826. 'prefixes' => '35',
  3827. 'checksum' => true
  3828. ),
  3829. array ( 'name' => 'Maestro',
  3830. 'slug' => 'maestro',
  3831. 'lengths' => '12,13,14,15,16,18,19',
  3832. 'prefixes' => '5018,5020,5038,6304,6759,6761',
  3833. 'checksum' => true
  3834. )
  3835. );
  3836. $cards = apply_filters("gform_creditcard_types", $cards);
  3837. return $cards;
  3838. }
  3839. public static function get_card_type($number){
  3840. //removing spaces from number
  3841. $number = str_replace (' ', '', $number);
  3842. if(empty($number))
  3843. return false;
  3844. $cards = self::get_card_types();
  3845. $matched_card = false;
  3846. foreach($cards as $card){
  3847. if(self::matches_card_type($number, $card)){
  3848. $matched_card = $card;
  3849. break;
  3850. }
  3851. }
  3852. if($matched_card && $matched_card["checksum"] && !self::is_valid_card_checksum($number))
  3853. $matched_card = false;
  3854. return $matched_card ? $matched_card : false;
  3855. }
  3856. private static function matches_card_type($number, $card){
  3857. //checking prefix
  3858. $prefixes = explode(',',$card['prefixes']);
  3859. $matches_prefix = false;
  3860. foreach($prefixes as $prefix){
  3861. if(preg_match("|^{$prefix}|", $number)){
  3862. $matches_prefix = true;
  3863. break;
  3864. }
  3865. }
  3866. //checking length
  3867. $lengths = explode(',',$card['lengths']);
  3868. $matches_length = false;
  3869. foreach($lengths as $length){
  3870. if(strlen($number) == absint($length)){
  3871. $matches_length = true;
  3872. break;
  3873. }
  3874. }
  3875. return $matches_prefix && $matches_length;
  3876. }
  3877. private static function is_valid_card_checksum($number){
  3878. $checksum = 0;
  3879. $num = 0;
  3880. $multiplier = 1;
  3881. // Process each character starting at the right
  3882. for ($i = strlen($number) - 1; $i >= 0; $i--) {
  3883. //Multiply current digit by multiplier (1 or 2)
  3884. $num = $number{$i} * $multiplier;
  3885. // If the result is in greater than 9, add 1 to the checksum total
  3886. if ($num >= 10) {
  3887. $checksum++;
  3888. $num -= 10;
  3889. }
  3890. //Update checksum
  3891. $checksum += $num;
  3892. //Update multiplier
  3893. $multiplier = $multiplier == 1 ? 2 : 1;
  3894. }
  3895. return $checksum % 10 == 0;
  3896. }
  3897. public static function is_wp_version($min_version){
  3898. return !version_compare(get_bloginfo("version"), "{$min_version}.dev1", '<');
  3899. }
  3900. public static function add_categories_as_choices($field, $value) {
  3901. $choices = $inputs = array();
  3902. $is_post = isset($_POST["gform_submit"]);
  3903. $has_placeholder = rgar($field, 'categoryInitialItemEnabled') && RGFormsModel::get_input_type($field) == 'select';
  3904. if($has_placeholder)
  3905. $choices[] = array('text' => rgar($field, 'categoryInitialItem'), 'value' => '', 'isSelected' => true);
  3906. if(rgar($field, "displayAllCategories")) {
  3907. $args = array('hide_empty' => false, 'orderby' => 'name');
  3908. $args = apply_filters("gform_post_category_args_{$field["id"]}", apply_filters("gform_post_category_args", $args, $field), $field);
  3909. $terms = get_terms('category', $args);
  3910. $walker = new GFCategoryWalker();
  3911. $categories = $walker->walk($terms, 0, array(0)); // 3rd parameter prevents notices triggered by $walker::display_element() function which checks $args[0]
  3912. foreach($categories as $category) {
  3913. $selected = $value == $category->term_id ||
  3914. (
  3915. empty($value) &&
  3916. get_option('default_category') == $category->term_id &&
  3917. RGFormsModel::get_input_type($field) == 'select' && // only preselect default category on select fields
  3918. !$is_post &&
  3919. !$has_placeholder
  3920. );
  3921. $choices[] = array('text' => $category->name, 'value' => $category->term_id, 'isSelected' => $selected);
  3922. }
  3923. } else {
  3924. $choices = array_merge($choices, $field['choices']);
  3925. }
  3926. if(empty($choices))
  3927. $choices[] = array('text' => 'You must select at least one category.', 'value' => '');
  3928. $choice_number = 1;
  3929. foreach($choices as $choice) {
  3930. if($choice_number % 10 == 0) //hack to skip numbers ending in 0. so that 5.1 doesn't conflict with 5.10
  3931. $choice_number++;
  3932. $input_id = $field["id"] . '.' . $choice_number;
  3933. $inputs[] = array('id' => $input_id, 'label' => $choice['text'], 'name' => '');
  3934. $choice_number++;
  3935. }
  3936. $field['choices'] = $choices;
  3937. if(RGFormsModel::get_input_type($field) == 'checkbox')
  3938. $field['inputs'] = $inputs;
  3939. return $field;
  3940. }
  3941. public static function prepare_post_category_value($value, $field, $mode = 'entry_detail') {
  3942. if(!is_array($value))
  3943. $value = explode(',', $value);
  3944. $cat_names = array();
  3945. $cat_ids = array();
  3946. foreach($value as $cat_string) {
  3947. $ary = explode(":", $cat_string);
  3948. $cat_name = count($ary) > 0 ? $ary[0] : "";
  3949. $cat_id = count($ary) > 1 ? $ary[1] : $ary[0];
  3950. if(!empty($cat_name))
  3951. $cat_names[] = $cat_name;
  3952. if(!empty($cat_id))
  3953. $cat_ids[] = $cat_id;
  3954. }
  3955. sort($cat_names);
  3956. switch($mode) {
  3957. case 'entry_list':
  3958. $value = self::implode_non_blank(', ', $cat_names);
  3959. break;
  3960. case 'entry_detail':
  3961. $value = RGFormsModel::get_input_type($field) == 'checkbox' ? $cat_names : self::implode_non_blank(', ', $cat_names);
  3962. break;
  3963. case 'conditional_logic':
  3964. $value = array_values($cat_ids);
  3965. break;
  3966. }
  3967. return $value;
  3968. }
  3969. public static function calculate($field, $form, $lead) {
  3970. $formula = apply_filters('gform_calculation_formula', rgar($field, 'calculationFormula'), $field, $form, $lead);
  3971. preg_match_all('/{[^{]*?:(\d+(\.\d+)?)(:(.*?))?}/mi', $formula, $matches, PREG_SET_ORDER);
  3972. if(is_array($matches)) {
  3973. foreach($matches as $match) {
  3974. list($text, $input_id) = $match;
  3975. $value = self::get_calculation_value($match[1], $form, $lead);
  3976. $formula = str_replace($match[0], $value, $formula);
  3977. }
  3978. }
  3979. $number = eval("return {$formula};");
  3980. return preg_match("/^[0-9 -\/*\(\)]+$/", $formula) ? eval("return {$formula};") : false;
  3981. }
  3982. public static function round_number($number, $rounding){
  3983. if(is_numeric($rounding) && $rounding >= 0){
  3984. $number = round($number, $rounding);
  3985. }
  3986. return $number;
  3987. }
  3988. public static function get_calculation_value($field_id, $form, $lead) {
  3989. $filters = array('price', 'value', '');
  3990. $value = false;
  3991. foreach($filters as $filter) {
  3992. if (is_numeric($value)){
  3993. //value found, exit loop
  3994. break;
  3995. }
  3996. $value = GFCommon::to_number(GFCommon::replace_variables("{:{$field_id}:$filter}", $form, $lead));
  3997. }
  3998. if(!$value || !is_numeric($value))
  3999. $value = 0;
  4000. return $value;
  4001. }
  4002. public static function conditional_shortcode($attributes, $content = null) {
  4003. extract(shortcode_atts(array(
  4004. 'merge_tag' => '',
  4005. 'condition' => '',
  4006. 'value' => ''
  4007. ), $attributes));
  4008. return RGFormsModel::matches_operation($merge_tag, $value, $condition) ? do_shortcode($content) : '';
  4009. }
  4010. public static function is_valid_for_calcuation($field) {
  4011. $supported_input_types = array('text', 'select', 'number', 'checkbox', 'radio', 'hidden', 'singleproduct', 'price', 'hiddenproduct', 'calculation', 'singleshipping');
  4012. $unsupported_field_types = array('category');
  4013. $input_type = RGFormsModel::get_input_type($field);
  4014. return in_array($input_type, $supported_input_types) && !in_array($input_type, $unsupported_field_types);
  4015. }
  4016. public static function log_error($message){
  4017. if(class_exists("GFLogging"))
  4018. {
  4019. GFLogging::include_logger();
  4020. GFLogging::log_message("gravityforms", $message, KLogger::ERROR);
  4021. }
  4022. }
  4023. public static function log_debug($message){
  4024. if(class_exists("GFLogging"))
  4025. {
  4026. GFLogging::include_logger();
  4027. GFLogging::log_message("gravityforms", $message, KLogger::DEBUG);
  4028. }
  4029. }
  4030. public static function echo_if($condition, $text) {
  4031. switch($text) {
  4032. case 'checked':
  4033. $text = 'checked="checked"';
  4034. break;
  4035. case 'selected':
  4036. $text = 'selected="selected"';
  4037. }
  4038. echo $condition ? $text : '';
  4039. }
  4040. public static function gf_global($echo = true) {
  4041. require_once(GFCommon::get_base_path() . '/currency.php');
  4042. $gf_global = array();
  4043. $gf_global["gf_currency_config"] = RGCurrency::get_currency(GFCommon::get_currency());
  4044. $gf_global["base_url"] = GFCommon::get_base_url();
  4045. $gf_global_json = 'var gf_global = ' . json_encode($gf_global) . ';';
  4046. if(!$echo)
  4047. return $gf_global_json;
  4048. echo $gf_global_json;
  4049. }
  4050. public static function gf_vars($echo = true) {
  4051. if(!class_exists("RGCurrency"))
  4052. require_once("currency.php");
  4053. $gf_vars = array();
  4054. $gf_vars["active"] = __("Active", "gravityforms");
  4055. $gf_vars["inactive"] = __("Inactive", "gravityforms");
  4056. $gf_vars["save"] = __("Save", "gravityforms");
  4057. $gf_vars["update"] = __("Update", "gravityforms");
  4058. $gf_vars["previousLabel" ] = __("Previous", "gravityforms");
  4059. $gf_vars["selectFormat" ] = __("Select a format", "gravityforms");
  4060. $gf_vars["editToViewAll" ] = __("5 of %d items shown. Edit field to view all", "gravityforms");
  4061. $gf_vars["enterValue" ] = __("Enter a value", "gravityforms");
  4062. $gf_vars["formTitle" ] = __("Untitled Form", "gravityforms");
  4063. $gf_vars["formDescription" ] = __("We would love to hear from you! Please fill out this form and we will get in touch with you shortly.", "gravityforms");
  4064. $gf_vars["formConfirmationMessage" ] = __("Thanks for contacting us! We will get in touch with you shortly.", "gravityforms");
  4065. $gf_vars["buttonText" ] = __("Submit", "gravityforms");
  4066. $gf_vars["loading" ] = __("Loading...", "gravityforms");
  4067. $gf_vars["thisFieldIf"] = __('this field if', 'gravityforms');
  4068. $gf_vars["thisPage"] = __("this page", "gravityforms");
  4069. $gf_vars["thisFormButton"] = __('this form button', 'gravityforms');
  4070. $gf_vars["show"] = __('Show', 'gravityforms');
  4071. $gf_vars["hide"] = __('Hide', 'gravityforms');
  4072. $gf_vars["all"] = __('All', 'gravityforms');
  4073. $gf_vars["any"] = __('Any', 'gravityforms');
  4074. $gf_vars["ofTheFollowingMatch"] = __('of the following match:', 'gravityforms');
  4075. $gf_vars["is"] = __('is', 'gravityforms');
  4076. $gf_vars["isNot"] = __('is not', 'gravityforms');
  4077. $gf_vars["greaterThan"] = __('greater than', 'gravityforms');
  4078. $gf_vars["lessThan"] = __('less than', 'gravityforms');
  4079. $gf_vars["contains"] = __('contains', 'gravityforms');
  4080. $gf_vars["startsWith"] = __('starts with', 'gravityforms');
  4081. $gf_vars["endsWith"] = __('ends with', 'gravityforms');
  4082. $gf_vars["thisConfirmation"] = __('Use this confirmation if', 'gravityforms');
  4083. $gf_vars["thisNotification"] = __('Send this notification if', 'gravityforms');
  4084. $gf_vars["confirmationSave"] = __('Save', 'gravityforms');
  4085. $gf_vars["confirmationSaving"] = __('Saving...', 'gravityforms');
  4086. $gf_vars["confirmationAreYouSure"] = __('Are you sure you wish to cancel these changes?', 'gravityforms');
  4087. $gf_vars["confirmationIssueSaving"] = __('There was an issue saving this confirmation.', 'gravityforms');
  4088. $gf_vars["confirmationConfirmDelete"] = __('Are you sure you wish to delete this confirmation?', 'gravityforms');
  4089. $gf_vars["confirmationIssueDeleting"] = __('There was an issue deleting this confirmation.', 'gravityforms');
  4090. $gf_vars["confirmationConfirmDiscard"] = __('There are unsaved changes to the current confirmation. Would you like to discard these changes?', 'gravityforms');
  4091. $gf_vars["confirmationDefaultName"] = __('Untitled Confirmation', 'gravityforms');
  4092. $gf_vars["confirmationDefaultMessage"] = __('Thanks for contacting us! We will get in touch with you shortly.', 'gravityforms');
  4093. $gf_vars["confirmationInvalidPageSelection"] = __('Please select a page.', "gravityforms");
  4094. $gf_vars["confirmationInvalidRedirect"] = __('Please enter a URL.', "gravityforms");
  4095. $gf_vars["confirmationInvalidName"] = __('Please enter a confirmation name.', "gravityforms");
  4096. $gf_vars["conditionalLogicDependency"] = __('This form contains conditional logic dependent upon this field. Are you sure you want to delete this field? \'OK\' to delete, \'Cancel\' to abort.', 'gravityforms');
  4097. $gf_vars["conditionalLogicDependencyChoice"] = __('This form contains conditional logic dependent upon this choice. Are you sure you want to delete this choice? \'OK\' to delete, \'Cancel\' to abort.', 'gravityforms');
  4098. $gf_vars["conditionalLogicDependencyChoiceEdit"] = __('This form contains conditional logic dependent upon this choice. Are you sure you want to modify this choice? \'OK\' to delete, \'Cancel\' to abort.', 'gravityforms');
  4099. $gf_vars["mergeTagsTooltip"] = __('<h6>Merge Tags</h6>Merge tags allow you to dynamically populate submitted field values in your form content wherever this merge tag icon is present.', 'gravityforms');
  4100. $gf_vars["baseUrl"] = GFCommon::get_base_url();
  4101. $gf_vars["gf_currency_config"] = RGCurrency::get_currency(GFCommon::get_currency());
  4102. $gf_vars["otherChoiceValue"] = GFCommon::get_other_choice_value();
  4103. $gf_vars["isFormDelete"] = false;
  4104. if(is_admin() && rgget('id')) {
  4105. $form = RGFormsModel::get_form_meta(rgget('id'));
  4106. $gf_vars["mergeTags"] = GFCommon::get_merge_tags($form['fields'], '', false);
  4107. }
  4108. $gf_vars_json = 'var gf_vars = ' . json_encode($gf_vars) . ';';
  4109. if(!$echo){
  4110. return $gf_vars_json;
  4111. }
  4112. else {
  4113. echo $gf_vars_json;
  4114. }
  4115. }
  4116. public static function is_bp_active() {
  4117. return defined('BP_VERSION') ? true : false;
  4118. }
  4119. public static function add_message($message, $is_error = false) {
  4120. if($is_error) {
  4121. self::$errors[] = $message;
  4122. } else {
  4123. self::$messages[] = $message;
  4124. }
  4125. }
  4126. public static function add_error_message($message) {
  4127. self::add_message($message, true);
  4128. }
  4129. public static function display_admin_message($errors = false, $messages = false) {
  4130. if(!$errors)
  4131. $errors = self::$errors;
  4132. if(!$messages)
  4133. $messages = self::$messages;
  4134. $errors = apply_filters('gform_admin_error_messages', $errors);
  4135. $messages = apply_filters('gform_admin_messages', $messages);
  4136. if(!empty($errors)) { ?>
  4137. <div class="error below-h2">
  4138. <?php if(count($errors) > 1) { ?>
  4139. <ul style="margin: 0.5em 0 0; padding: 2px;">
  4140. <li><?php echo implode('</li><li>', $errors); ?></li>
  4141. </ul>
  4142. <?php } else { ?>
  4143. <p><?php echo $errors[0]; ?></p>
  4144. <?php } ?>
  4145. </div>
  4146. <?php }
  4147. else if(!empty($messages)) { ?>
  4148. <div id="message" class="updated below-h2">
  4149. <?php if(count($messages) > 1) { ?>
  4150. <ul style="margin: 0.5em 0 0; padding: 2px;">
  4151. <li><?php echo implode('</li><li>', $messages); ?></li>
  4152. </ul>
  4153. <?php } else { ?>
  4154. <p><?php echo $messages[0]; ?></p>
  4155. <?php } ?>
  4156. </div>
  4157. <?php }
  4158. }
  4159. private static function requires_gf_vars() {
  4160. $dependent_scripts = array( 'gform_form_admin', 'gform_gravityforms', 'gform_form_editor' );
  4161. foreach( $dependent_scripts as $script ) {
  4162. if( wp_script_is( $script ) )
  4163. return true;
  4164. }
  4165. return false;
  4166. }
  4167. public static function maybe_output_gf_vars() {
  4168. if( self::requires_gf_vars() ){
  4169. echo '<script type="text/javascript">' . self::gf_vars(false) . '</script>';
  4170. }
  4171. }
  4172. }
  4173. class GFCategoryWalker extends Walker {
  4174. /**
  4175. * @see Walker::$tree_type
  4176. * @since 2.1.0
  4177. * @var string
  4178. */
  4179. var $tree_type = 'category';
  4180. /**
  4181. * @see Walker::$db_fields
  4182. * @since 2.1.0
  4183. * @todo Decouple this
  4184. * @var array
  4185. */
  4186. var $db_fields = array ('parent' => 'parent', 'id' => 'term_id');
  4187. /**
  4188. * @see Walker::start_el()
  4189. * @since 2.1.0
  4190. *
  4191. * @param string $output Passed by reference. Used to append additional content.
  4192. * @param object $category Category data object.
  4193. * @param int $depth Depth of category. Used for padding.
  4194. * @param array $args Uses 'selected' and 'show_count' keys, if they exist.
  4195. */
  4196. function start_el( &$output, $object, $depth = 0, $args = array(), $current_object_id = 0) {
  4197. $pad = str_repeat('&nbsp;', $depth * 3);
  4198. $object->name = "{$pad}{$object->name}";
  4199. $output[] = $object;
  4200. }
  4201. }
  4202. /**
  4203. *
  4204. * Notes:
  4205. * 1. The WordPress Transients API does not support boolean
  4206. * values so boolean values should be converted to integers
  4207. * or arrays before setting the values as persistent.
  4208. *
  4209. * 2. The transients API only deletes the transient from the database
  4210. * when the transient is accessed after it has expired. WordPress doesn't
  4211. * do any garbage collection of transients.
  4212. *
  4213. */
  4214. class GFCache {
  4215. private static $_transient_prefix = "GFCache_";
  4216. private static $_cache = array();
  4217. public static function get($key, &$found = null) {
  4218. global $blog_id;
  4219. if (is_multisite())
  4220. $key = $blog_id . ':' . $key;
  4221. if (isset(self::$_cache[$key])) {
  4222. $found = true;
  4223. $data = rgar(self::$_cache[$key], "data");
  4224. return $data;
  4225. }
  4226. $data = self::get_transient($key);
  4227. if (false === ($data)) {
  4228. $found = false;
  4229. return false;
  4230. } else {
  4231. self::$_cache[$key] = array("data" => $data, "is_persistent" => true);
  4232. $found = true;
  4233. return $data;
  4234. }
  4235. }
  4236. public static function set($key, $data, $is_persistent = false, $expiration = 0) {
  4237. global $blog_id;
  4238. $success = true;
  4239. if (is_multisite())
  4240. $key = $blog_id . ':' . $key;
  4241. if ($is_persistent)
  4242. $success = self::set_transient($key, $data, $expiration);
  4243. self::$_cache[$key] = array("data" => $data, "is_persistent" => $is_persistent);
  4244. return $success;
  4245. }
  4246. public static function delete($key) {
  4247. global $blog_id;
  4248. $success = true;
  4249. if (is_multisite())
  4250. $key = $blog_id . ':' . $key;
  4251. if (isset(self::$_cache[$key])) {
  4252. if (self::$_cache[$key]["is_persistent"])
  4253. $success = self::delete_transient($key);
  4254. unset(self::$_cache[$key]);
  4255. } else {
  4256. $success = self::delete_transient($key);
  4257. }
  4258. return $success;
  4259. }
  4260. public static function flush($flush_persistent = false) {
  4261. global $wpdb;
  4262. self::$_cache = array();
  4263. if(false === $flush_persistent)
  4264. return true;
  4265. if (is_multisite()) {
  4266. $sql = "
  4267. DELETE FROM $wpdb->sitemeta
  4268. WHERE meta_key LIKE '_site_transient_timeout_GFCache_%' OR
  4269. meta_key LIKE '_site_transient_GFCache_%'
  4270. ";
  4271. } else {
  4272. $sql = "
  4273. DELETE FROM $wpdb->options
  4274. WHERE option_name LIKE '_transient_timeout_GFCache_%' OR
  4275. option_name LIKE '_transient_GFCache_%'
  4276. ";
  4277. }
  4278. $rows_deleted = $wpdb->query($sql);
  4279. $success = $rows_deleted !== false ? true : false;
  4280. return $success;
  4281. }
  4282. private static function delete_transient($key) {
  4283. $key = self::$_transient_prefix . $key;
  4284. if (is_multisite())
  4285. $success = delete_site_transient($key);
  4286. else
  4287. $success = delete_transient($key);
  4288. return $success;
  4289. }
  4290. private static function set_transient($key, $data, $expiration) {
  4291. $key = self::$_transient_prefix . $key;
  4292. if (is_multisite())
  4293. $success = set_site_transient($key, $data, $expiration);
  4294. else
  4295. $success = set_transient($key, $data, $expiration);
  4296. return $success;
  4297. }
  4298. private static function get_transient($key) {
  4299. $key = self::$_transient_prefix . $key;
  4300. if (is_multisite())
  4301. $data = get_site_transient($key);
  4302. else
  4303. $data = get_transient($key);
  4304. return $data;
  4305. }
  4306. }