private function _getScript_ImageSelector($sReferrer)
{
$_sThickBoxTitle = esc_js($this->oMsg->get('upload_image'));
$_sThickBoxButtonUseThis = esc_js($this->oMsg->get('use_this_image'));
$_sInsertFromURL = esc_js($this->oMsg->get('insert_from_url'));
if (!function_exists('wp_enqueue_media')) {
return <<<JAVASCRIPTS
/**
* Bind/rebinds the thickbox script the given selector element.
* The fMultiple parameter does not do anything. It is there to be consistent with the one for the WordPress version 3.5 or above.
*/
setAdminPageFrameworkImageUploader = function( sInputID, fMultiple, fExternalSource ) {
jQuery( '#select_image_' + sInputID ).unbind( 'click' ); // for repeatable fields
jQuery( '#select_image_' + sInputID ).click( function() {
var sPressedID = jQuery( this ).attr( 'id' );
window.sInputID = sPressedID.substring( 13 ); // remove the select_image_ prefix and set a property to pass it to the editor callback method.
window.original_send_to_editor = window.send_to_editor;
window.send_to_editor = hfAdminPageFrameworkSendToEditorImage;
var fExternalSource = jQuery( this ).attr( 'data-enable_external_source' );
tb_show( '{$_sThickBoxTitle}', 'media-upload.php?post_id=1&enable_external_source=' + fExternalSource + '&referrer={$sReferrer}&button_label={$_sThickBoxButtonUseThis}&type=image&TB_iframe=true', false );
return false; // do not click the button after the script by returning false.
});
}
var hfAdminPageFrameworkSendToEditorImage = function( sRawHTML ) {
var sHTML = '<div>' + sRawHTML + '</div>'; // This is for the 'From URL' tab. Without the wrapper element. the below attr() method don't catch attributes.
var src = jQuery( 'img', sHTML ).attr( 'src' );
var alt = jQuery( 'img', sHTML ).attr( 'alt' );
var title = jQuery( 'img', sHTML ).attr( 'title' );
var width = jQuery( 'img', sHTML ).attr( 'width' );
var height = jQuery( 'img', sHTML ).attr( 'height' );
var classes = jQuery( 'img', sHTML ).attr( 'class' );
var id = ( classes ) ? classes.replace( /(.*?)wp-image-/, '' ) : ''; // attachment ID
var sCaption = sRawHTML.replace( /\\[(\\w+).*?\\](.*?)\\[\\/(\\w+)\\]/m, '\$2' )
.replace( /<a.*?>(.*?)<\\/a>/m, '' );
var align = sRawHTML.replace( /^.*?\\[\\w+.*?\\salign=([\\'\\"])(.*?)[\\'\\"]\\s.+\$/mg, '\$2' ); //\\'\\" syntax fixer
var link = jQuery( sHTML ).find( 'a:first' ).attr( 'href' );
// Escape the strings of some of the attributes.
var sCaption = jQuery( '<div/>' ).text( sCaption ).html();
var sAlt = jQuery( '<div/>' ).text( alt ).html();
var title = jQuery( '<div/>' ).text( title ).html();
// If the user wants to save relevant attributes, set them.
var sInputID = window.sInputID; // window.sInputID should be assigned when the thickbox is opened.
jQuery( '#' + sInputID ).val( src ); // sets the image url in the main text field. The url field is mandatory so it does not have the suffix.
jQuery( '#' + sInputID + '_id' ).val( id );
jQuery( '#' + sInputID + '_width' ).val( width );
jQuery( '#' + sInputID + '_height' ).val( height );
jQuery( '#' + sInputID + '_caption' ).val( sCaption );
jQuery( '#' + sInputID + '_alt' ).val( sAlt );
jQuery( '#' + sInputID + '_title' ).val( title );
jQuery( '#' + sInputID + '_align' ).val( align );
jQuery( '#' + sInputID + '_link' ).val( link );
// Update the preview
jQuery( '#image_preview_' + sInputID ).attr( 'alt', alt );
jQuery( '#image_preview_' + sInputID ).attr( 'title', title );
jQuery( '#image_preview_' + sInputID ).attr( 'data-classes', classes );
jQuery( '#image_preview_' + sInputID ).attr( 'data-id', id );
jQuery( '#image_preview_' + sInputID ).attr( 'src', src ); // updates the preview image
jQuery( '#image_preview_container_' + sInputID ).css( 'display', '' ); // updates the visibility
jQuery( '#image_preview_' + sInputID ).show() // updates the visibility
// restore the original send_to_editor
window.send_to_editor = window.original_send_to_editor;
// close the thickbox
tb_remove();
}
JAVASCRIPTS;
}
return <<<JAVASCRIPTS
// Global Function Literal
/**
* Binds/rebinds the uploader button script to the specified element with the given ID.
*/
setAdminPageFrameworkImageUploader = function( sInputID, fMultiple, fExternalSource ) {
var _bEscaped = false; // indicates whether the frame is escaped/cancelled.
var _oCustomImageUploader;
// The input element.
jQuery( '#' + sInputID + '[data-show_preview=\\"1\\"]' ).unbind( 'change' ); // for repeatable fields
jQuery( '#' + sInputID + '[data-show_preview=\\"1\\"]' ).change( function( e ) {
var _sImageURL = jQuery( this ).val();
// Check if it is a valid image url.
jQuery( '<img>', {
src: _sImageURL,
error: function() {},
load: function() {
// if valid, set the preview.
setImagePreviewElement(
sInputID,
{
url: _sImageURL
}
);
}
});
} );
// The Select button element.
jQuery( '#select_image_' + sInputID ).unbind( 'click' ); // for repeatable fields
jQuery( '#select_image_' + sInputID ).click( function( e ) {
// Reassign the input id from the pressed element ( do not use the passed parameter value to the caller function ) for repeatable sections.
var sInputID = jQuery( this ).attr( 'id' ).substring( 13 ); // remove the select_image_ prefix and set a property to pass it to the editor callback method.
window.wpActiveEditor = null;
e.preventDefault();
// If the uploader object has already been created, reopen the dialog
if ( 'object' === typeof _oCustomImageUploader ) {
_oCustomImageUploader.open();
return;
}
// Store the original select object in a global variable
oAdminPageFrameworkOriginalImageUploaderSelectObject = wp.media.view.MediaFrame.Select;
// Assign a custom select object
wp.media.view.MediaFrame.Select = fExternalSource ? getAdminPageFrameworkCustomMediaUploaderSelectObject() : oAdminPageFrameworkOriginalImageUploaderSelectObject;
_oCustomImageUploader = wp.media({
id: sInputID,
title: fExternalSource ? '{$_sInsertFromURL}' : '{$_sThickBoxTitle}',
button: {
text: '{$_sThickBoxButtonUseThis}'
},
type: 'image',
library: { type : 'image' },
multiple: fMultiple, // Set this to true to allow multiple files to be selected
metadata: {},
});
// When the uploader window closes,
_oCustomImageUploader.on( 'escape', function() {
_bEscaped = true;
return false;
});
_oCustomImageUploader.on( 'close', function() {
var state = _oCustomImageUploader.state();
// Check if it's an external URL
if ( typeof( state.props ) != 'undefined' && typeof( state.props.attributes ) != 'undefined' ) {
// 3.4.2+ Somehow the image object breaks when it is passed to a function or cloned or enclosed in an object so recreateing it manually.
var _oImage = {}, _sKey;
for ( _sKey in state.props.attributes ) {
_oImage[ _sKey ] = state.props.attributes[ _sKey ];
}
}
// If the _oImage variable is not defined at this point, it's an attachment, not an external URL.
if ( typeof( _oImage ) !== 'undefined' ) {
setImagePreviewElementWithDelay( sInputID, _oImage );
} else {
var _oNewField;
_oCustomImageUploader.state().get( 'selection' ).each( function( oAttachment, iIndex ) {
var _oAttributes = oAttachment.hasOwnProperty( 'attributes' )
? oAttachment.attributes
: {};
if ( 0 === iIndex ){
// place first attachment in the field
setImagePreviewElementWithDelay( sInputID, _oAttributes );
return true;
}
var _oFieldContainer = 'undefined' === typeof _oNewField
? jQuery( '#' + sInputID ).closest( '.admin-page-framework-field' )
: _oNewField;
_oNewField = jQuery( this ).addAdminPageFrameworkRepeatableField( _oFieldContainer.attr( 'id' ) );
var sInputIDOfNewField = _oNewField.find( 'input' ).attr( 'id' );
setImagePreviewElementWithDelay( sInputIDOfNewField, _oAttributes );
});
}
// Restore the original select object.
wp.media.view.MediaFrame.Select = oAdminPageFrameworkOriginalImageUploaderSelectObject;
});
// Open the uploader dialog
_oCustomImageUploader.open();
return false;
});
var setImagePreviewElementWithDelay = function( sInputID, oImage, iMilliSeconds ) {
iMilliSeconds = 'undefined' === typeof iMilliSeconds ? 100 : iMilliSeconds;
setTimeout( function (){
if ( ! _bEscaped ) {
setImagePreviewElement( sInputID, oImage );
}
_bEscaped = false;
}, iMilliSeconds );
}
}
/**
* Removes the set values to the input tags.
*
* @since 3.2.0
*/
removeInputValuesForImage = function( oElem ) {
var _oImageInput = jQuery( oElem ).closest( '.admin-page-framework-field' ).find( '.image-field input' );
if ( _oImageInput.length <= 0 ) {
return;
}
// Find the input tag.
var _sInputID = _oImageInput.first().attr( 'id' );
// Remove the associated values.
setImagePreviewElement( _sInputID, {} );
}
/**
* Sets the preview element.
*
* @since 3.2.0 Changed the scope to global.
*/
setImagePreviewElement = function( sInputID, oImage ) {
var oImage = jQuery.extend(
true, // recursive
{
caption: '',
alt: '',
title: '',
url: '',
id: '',
width: '',
height: '',
align: '',
link: '',
},
oImage
);
// Escape the strings of some of the attributes.
var _sCaption = jQuery( '<div/>' ).text( oImage.caption ).html();
var _sAlt = jQuery( '<div/>' ).text( oImage.alt ).html();
var _sTitle = jQuery( '<div/>' ).text( oImage.title ).html();
// If the user wants the attributes to be saved, set them in the input tags.
jQuery( 'input#' + sInputID ).val( oImage.url ); // the url field is mandatory so it does not have the suffix.
jQuery( 'input#' + sInputID + '_id' ).val( oImage.id );
jQuery( 'input#' + sInputID + '_width' ).val( oImage.width );
jQuery( 'input#' + sInputID + '_height' ).val( oImage.height );
jQuery( 'input#' + sInputID + '_caption' ).val( _sCaption );
jQuery( 'input#' + sInputID + '_alt' ).val( _sAlt );
jQuery( 'input#' + sInputID + '_title' ).val( _sTitle );
jQuery( 'input#' + sInputID + '_align' ).val( oImage.align );
jQuery( 'input#' + sInputID + '_link' ).val( oImage.link );
// Update up the preview
jQuery( '#image_preview_' + sInputID ).attr( 'data-id', oImage.id );
jQuery( '#image_preview_' + sInputID ).attr( 'data-width', oImage.width );
jQuery( '#image_preview_' + sInputID ).attr( 'data-height', oImage.height );
jQuery( '#image_preview_' + sInputID ).attr( 'data-caption', _sCaption );
jQuery( '#image_preview_' + sInputID ).attr( 'alt', _sAlt );
jQuery( '#image_preview_' + sInputID ).attr( 'title', _sTitle );
jQuery( '#image_preview_' + sInputID ).attr( 'src', oImage.url );
if ( oImage.url ) {
jQuery( '#image_preview_container_' + sInputID ).show();
} else {
jQuery( '#image_preview_container_' + sInputID ).hide();
}
}
JAVASCRIPTS;
}