<?php

/*
*  ACF Attachment Form Class
*
*  All the logic for adding fields to attachments
*
*  @class       acf_form_attachment
*  @package     ACF
*  @subpackage  Forms
*/

if ( ! class_exists( 'acf_form_attachment' ) ) :

	class acf_form_attachment {

		/*
		*  __construct
		*
		*  This function will setup the class functionality
		*
		*  @type    function
		*  @date    5/03/2014
		*  @since   5.0.0
		*
		*  @param   n/a
		*  @return  n/a
		*/

		function __construct() {

			// actions
			add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );

			// render
			add_filter( 'attachment_fields_to_edit', array( $this, 'edit_attachment' ), 10, 2 );

			// save
			add_filter( 'attachment_fields_to_save', array( $this, 'save_attachment' ), 10, 2 );

		}


		/*
		*  admin_enqueue_scripts
		*
		*  This action is run after post query but before any admin script / head actions.
		*  It is a good place to register all actions.
		*
		*  @type    action (admin_enqueue_scripts)
		*  @date    26/01/13
		*  @since   3.6.0
		*
		*  @param   N/A
		*  @return  N/A
		*/

		function admin_enqueue_scripts() {

			// bail early if not valid screen
			if ( ! acf_is_screen( array( 'attachment', 'upload' ) ) ) {
				return;
			}

			// load acf scripts
			acf_enqueue_scripts(
				array(
					'uploader' => true,
				)
			);

			// actions
			if ( acf_is_screen( 'upload' ) ) {
				add_action( 'admin_footer', array( $this, 'admin_footer' ), 0 );
			}
		}


		/*
		*  admin_footer
		*
		*  This function will add acf_form_data to the WP 4.0 attachment grid
		*
		*  @type    action (admin_footer)
		*  @date    11/09/2014
		*  @since   5.0.0
		*
		*  @param   n/a
		*  @return  n/a
		*/

		function admin_footer() {

			// render post data
			acf_form_data(
				array(
					'screen'  => 'attachment',
					'post_id' => 0,
				)
			);

			?>
<script type="text/javascript">
	
// WP saves attachment on any input change, so unload is not needed
acf.unload.active = 0;

</script>
			<?php

		}


		/*
		*  edit_attachment
		*
		*  description
		*
		*  @type    function
		*  @date    8/10/13
		*  @since   5.0.0
		*
		*  @param   $post_id (int)
		*  @return  $post_id (int)
		*/

		function edit_attachment( $form_fields, $post ) {

			// vars
			$is_page = acf_is_screen( 'attachment' );
			$post_id = $post->ID;
			$el      = 'tr';

			// get field groups
			$field_groups = acf_get_field_groups(
				array(
					'attachment_id' => $post_id,
					'attachment'    => $post_id, // Leave for backwards compatibility
				)
			);

			// render
			if ( ! empty( $field_groups ) ) {

				// get acf_form_data
				ob_start();

				acf_form_data(
					array(
						'screen'  => 'attachment',
						'post_id' => $post_id,
					)
				);

				// open
				echo '</td></tr>';

				// loop
				foreach ( $field_groups as $field_group ) {

						// load fields
						$fields = acf_get_fields( $field_group );

						// override instruction placement for modal
					if ( ! $is_page ) {

						$field_group['instruction_placement'] = 'field';
					}

						// render
						acf_render_fields( $fields, $post_id, $el, $field_group['instruction_placement'] );

				}

				// close
				echo '<tr class="compat-field-acf-blank"><td>';

				$html = ob_get_contents();

				ob_end_clean();

				$form_fields['acf-form-data'] = array(
					'label' => '',
					'input' => 'html',
					'html'  => $html,
				);

			}

			// return
			return $form_fields;

		}


		/*
		*  save_attachment
		*
		*  description
		*
		*  @type    function
		*  @date    8/10/13
		*  @since   5.0.0
		*
		*  @param   $post_id (int)
		*  @return  $post_id (int)
		*/

		function save_attachment( $post, $attachment ) {

			// bail early if not valid nonce
			if ( ! acf_verify_nonce( 'attachment' ) ) {
				return $post;
			}

			// bypass validation for ajax
			if ( acf_is_ajax( 'save-attachment-compat' ) ) {
				acf_save_post( $post['ID'] );

				// validate and save
			} elseif ( acf_validate_save_post( true ) ) {
				acf_save_post( $post['ID'] );
			}

			// return
			return $post;
		}


	}

	new acf_form_attachment();

endif;

?>
