( function ( $, undefined ) {
	var Field = acf.models.ImageField.extend( {
		type: 'file',

		$control: function () {
			return this.$( '.acf-file-uploader' );
		},

		$input: function () {
			return this.$( 'input[type="hidden"]:first' );
		},

		validateAttachment: function ( attachment ) {
			// defaults
			attachment = attachment || {};

			// WP attachment
			if ( attachment.id !== undefined ) {
				attachment = attachment.attributes;
			}

			// args
			attachment = acf.parseArgs( attachment, {
				url: '',
				alt: '',
				title: '',
				filename: '',
				filesizeHumanReadable: '',
				icon: '/wp-includes/images/media/default.png',
			} );

			// return
			return attachment;
		},

		render: function ( attachment ) {
			// vars
			attachment = this.validateAttachment( attachment );

			// update image
			this.$( 'img' ).attr( {
				src: attachment.icon,
				alt: attachment.alt,
				title: attachment.title,
			} );

			// update elements
			this.$( '[data-name="title"]' ).text( attachment.title );
			this.$( '[data-name="filename"]' )
				.text( attachment.filename )
				.attr( 'href', attachment.url );
			this.$( '[data-name="filesize"]' ).text(
				attachment.filesizeHumanReadable
			);

			// vars
			var val = attachment.id || '';

			// update val
			acf.val( this.$input(), val );

			// update class
			if ( val ) {
				this.$control().addClass( 'has-value' );
			} else {
				this.$control().removeClass( 'has-value' );
			}
		},

		selectAttachment: function () {
			// vars
			var parent = this.parent();
			var multiple = parent && parent.get( 'type' ) === 'repeater';

			// new frame
			var frame = acf.newMediaPopup( {
				mode: 'select',
				title: acf.__( 'Select File' ),
				field: this.get( 'key' ),
				multiple: multiple,
				library: this.get( 'library' ),
				allowedTypes: this.get( 'mime_types' ),
				select: $.proxy( function ( attachment, i ) {
					if ( i > 0 ) {
						this.append( attachment, parent );
					} else {
						this.render( attachment );
					}
				}, this ),
			} );
		},

		editAttachment: function () {
			// vars
			var val = this.val();

			// bail early if no val
			if ( ! val ) {
				return false;
			}

			// popup
			var frame = acf.newMediaPopup( {
				mode: 'edit',
				title: acf.__( 'Edit File' ),
				button: acf.__( 'Update File' ),
				attachment: val,
				field: this.get( 'key' ),
				select: $.proxy( function ( attachment, i ) {
					this.render( attachment );
				}, this ),
			} );
		},
	} );

	acf.registerFieldType( Field );
} )( jQuery );
