/**
* prso_theme_gform_get_address_field
* 
* Called by 'prso_theme_gform_get_address_field' function in this document
* Essentially a copy and past of core code from Gravity Forms, allowing us
* to alter how each address field is rendered and laid out.
*
* NOTES: This functions uses almost the same code as Gravity Forms to create
* the field content. This approach was required as Gravity Forms does not yet
* have sufficient filters to allow changes to how fields and their labels are
* rendered. To ensure that the fields meet Zurb Foundation layout we needed to
* tweak the specific order of elements in the DOM.
*
* Although this avoids having to edit the Gravity Forms code base directly
* this still may break in the future if gforms change how their fields are rendered. 
*
* Hooks:
*	Filter:: 'prso_theme_gforms_address_city_class' 	- change class for div around city field
*	Filter:: 'prso_theme_gforms_address_state_class' 	- change class for div around state field
*	Filter:: 'prso_theme_gforms_address_zip_class' 		- change class for div around zip field
*
* @param	array		field
* @param	string		value
* @param	lead_id		int
* @param	form_id		int
* @return	string		address fields html
* @access 	public
* @author	Ben Moody
*/
function prso_theme_gform_get_address_field($field, $value, $lead_id, $form_id)
{
    //Cache foudantion div to start a row
    $div_row = "<div class='row'>";
    $id = $field["id"];
    $field_id = IS_ADMIN || $form_id == 0 ? "input_{$id}" : "input_" . $form_id . "_{$id}";
    $form_id = IS_ADMIN && empty($form_id) ? rgget("id") : $form_id;
    $size = rgar($field, "size");
    $disabled_text = IS_ADMIN && RG_CURRENT_VIEW != "entry" ? "disabled='disabled'" : "";
    $class_suffix = RG_CURRENT_VIEW == "entry" ? "_admin" : "";
    $class = $size . $class_suffix;
    $currency = "";
    if (RG_CURRENT_VIEW == "entry") {
        $lead = RGFormsModel::get_lead($lead_id);
        $post_id = $lead["post_id"];
        $post_link = "";
        if (is_numeric($post_id) && self::is_post_field($field)) {
            $post_link = "You can <a href='post.php?action=edit&post={$post_id}'>edit this post</a> from the post page.";
        }
        $currency = $lead["currency"];
    }
    $street_value = "";
    $street2_value = "";
    $city_value = "";
    $state_value = "";
    $zip_value = "";
    $country_value = "";
    $class_suffix = '';
    if (is_array($value)) {
        $street_value = esc_attr(rgget($field["id"] . ".1", $value));
        $street2_value = esc_attr(rgget($field["id"] . ".2", $value));
        $city_value = esc_attr(rgget($field["id"] . ".3", $value));
        $state_value = esc_attr(rgget($field["id"] . ".4", $value));
        $zip_value = esc_attr(rgget($field["id"] . ".5", $value));
        $country_value = esc_attr(rgget($field["id"] . ".6", $value));
    }
    if (version_compare(GFForms::$version, '1.9.0', '>')) {
        $gf_address = new GF_Field_Address();
        $address_types = $gf_address->get_address_types($form_id);
    } else {
        $address_types = GFCommon::get_address_types($form_id);
    }
    $addr_type = empty($field["addressType"]) ? "international" : $field["addressType"];
    $address_type = $address_types[$addr_type];
    $state_label = empty($address_type["state_label"]) ? __("State", "gravityforms") : $address_type["state_label"];
    $zip_label = empty($address_type["zip_label"]) ? __("Zip Code", "gravityforms") : $address_type["zip_label"];
    $hide_country = !empty($address_type["country"]) || rgget("hideCountry", $field);
    if (empty($country_value)) {
        $country_value = rgget("defaultCountry", $field);
    }
    if (empty($state_value)) {
        $state_value = rgget("defaultState", $field);
    }
    if (version_compare(GFForms::$version, '1.9.0', '>')) {
        $gf_country = new GF_Field_Address();
        $country_list = $gf_country->get_country_dropdown($country_value);
    } else {
        $country_list = GFCommon::get_country_dropdown($country_value);
    }
    //changing css classes based on field format to ensure proper display
    $address_display_format = apply_filters("gform_address_display_format", "default");
    $city_location = $address_display_format == "zip_before_city" ? "right" : "left";
    $zip_location = $address_display_format != "zip_before_city" && rgar($field, "hideState") ? "right" : "left";
    $state_location = $address_display_format == "zip_before_city" ? "left" : "right";
    $country_location = rgar($field, "hideState") ? "left" : "right";
    //address field
    $tabindex = GFCommon::get_tabindex();
    $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 placeholder='" . apply_filters("gform_address_street_{$form_id}", apply_filters("gform_address_street", __("Street Address", "gravityforms"), $form_id), $form_id) . "'/></span>", $id, $field_id, $street_value, $disabled_text, $field_id);
    //address line 2 field
    $street_address2 = "";
    $style = IS_ADMIN && rgget("hideAddress2", $field) ? "style='display:none;'" : "";
    if (IS_ADMIN || !rgget("hideAddress2", $field)) {
        $tabindex = GFCommon::get_tabindex();
        $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 placeholder='" . apply_filters("gform_address_street2_{$form_id}", apply_filters("gform_address_street2", __("Address Line 2", "gravityforms"), $form_id), $form_id) . "'/></span>", $id, $field_id, $street2_value, $disabled_text, $field_id);
    }
    if ($address_display_format == "zip_before_city") {
        //zip field
        $tabindex = GFCommon::get_tabindex();
        $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 placeholder='" . apply_filters("gform_address_zip_{$form_id}", apply_filters("gform_address_zip", $zip_label, $form_id), $form_id) . "'/></span>", $id, $field_id, $zip_value, $disabled_text, $field_id);
        //city field
        $tabindex = GFCommon::get_tabindex();
        $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 placeholder='" . apply_filters("gform_address_city_{$form_id}", apply_filters("gform_address_city", __("City", "gravityforms"), $form_id), $form_id) . "'/></span>", $id, $field_id, $city_value, $disabled_text, $field_id);
        //state field
        $style = IS_ADMIN && rgget("hideState", $field) ? "style='display:none;'" : "";
        if (IS_ADMIN || !rgget("hideState", $field)) {
            $state_field = GFCommon::get_state_field($field, $id, $field_id, $state_value, $disabled_text, $form_id);
            $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);
        } else {
            $state = sprintf("<input type='hidden' class='gform_hidden' name='input_%d.4' id='%s_4' value='%s'/>", $id, $field_id, $state_value);
        }
    } else {
        //city field
        $tabindex = GFCommon::get_tabindex();
        $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 placeholder='" . apply_filters("gform_address_city_{$form_id}", apply_filters("gform_address_city", __("City", "gravityforms"), $form_id), $form_id) . "'/></span>", $id, $field_id, $city_value, $disabled_text, $field_id);
        //state field
        $style = IS_ADMIN && rgget("hideState", $field) ? "style='display:none;'" : "";
        if (IS_ADMIN || !rgget("hideState", $field)) {
            $state_field = prso_theme_gform_get_state_field($field, $id, $field_id, $state_value, $disabled_text, $form_id, $state_label);
            $state = sprintf("<span class='ginput_{$state_location}{$class_suffix}' id='" . $field_id . "_4_container' {$style}>{$state_field}</span>", $field_id);
        } else {
            $state = sprintf("<input type='hidden' class='gform_hidden' name='input_%d.4' id='%s_4' value='%s'/>", $id, $field_id, $state_value);
        }
        //zip field
        $tabindex = GFCommon::get_tabindex();
        $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 placeholder='" . apply_filters("gform_address_zip_{$form_id}", apply_filters("gform_address_zip", $zip_label, $form_id), $form_id) . "'/></span>", $id, $field_id, $zip_value, $disabled_text, $field_id);
    }
    if (IS_ADMIN || !$hide_country) {
        $style = $hide_country ? "style='display:none;'" : "";
        $tabindex = GFCommon::get_tabindex();
        $country = sprintf("<span class='ginput_{$country_location}{$class_suffix}' id='" . $field_id . "_6_container' {$style}><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><select name='input_%d.6' id='%s_6' {$tabindex} %s>%s</select></span>", $id, $field_id, $disabled_text, $country_list, $field_id);
    } else {
        $country = sprintf("<input type='hidden' class='gform_hidden' name='input_%d.6' id='%s_6' value='%s'/>", $id, $field_id, $country_value);
    }
    //Wrap city in foundation divs
    $city = "<div class='" . apply_filters('prso_theme_gforms_address_city_class', 'large-5 columns', $field, $form_id) . "'>{$city}</div>";
    //Wrap state in foundation divs
    $state = "<div class='" . apply_filters('prso_theme_gforms_address_state_class', 'large-4 columns', $field, $form_id) . "'>{$state}</div>";
    //Wrap ZIP in foundation divs
    $zip = "<div class='" . apply_filters('prso_theme_gforms_address_zip_class', 'large-3 columns', $field, $form_id) . "'>{$zip}</div>";
    $inputs = $address_display_format == "zip_before_city" ? $street_address . $street_address2 . $div_row . $zip . $city . $state . "</div>" . $country : $street_address . $street_address2 . $div_row . $city . $state . $zip . "</div>" . $country;
    return "<div class='ginput_complex{$class_suffix} ginput_container' id='{$field_id}'>" . $inputs . "</div>";
}