;(function($){
// Unique instance of "advadsMapiConnectClass"
var INSTANCE = null;
var advadsMapiConnectClass = function( content, options ) {
this.options = {};
this.modal = $( '#gadsense-modal' );
this.frame = null;
if ( 'undefined' == typeof content || ! content ) {
content = 'confirm-code';
}
this.setOptions( options );
this.init();
this.show( content );
return this;
};
advadsMapiConnectClass.prototype = {
constructor: advadsMapiConnectClass,
// Set options, for re-use of existing instance for a different purpose.
setOptions: function( options ) {
var defaultOptions = {
onSuccess: false,
onError: false,
};
if ( 'undefined' == typeof options ) {
options = defaultOptions;
}
this.options = $.extend( {}, defaultOptions, options);
},
// Tasks to do after a successful connection.
exit: function(){
if ( this.options.onSuccess ) {
if ( 'function' == typeof this.options.onSuccess ) {
this.options.onSuccess( this );
}
} else {
this.hide();
}
},
// Submit OAuth2 code for account connection.
submitOAuthCode: function( code ) {
var that = this;
if ( '' == code ) return;
$( '.gadsense-overlay' ).css( 'display', 'block' );
$( '#gadsense-modal-error' ).hide();
var data = {
action: 'advads_gadsense_mapi_confirm_code',
code: code,
nonce: AdsenseMAPI.nonce,
};
$.ajax({
url: ajaxurl,
type: 'post',
data: data,
success:function(response, status, XHR){
$( '#mapi-code' ).val( '' );
if ( response.status && true === response.status && response['token_data'] ) {
that.getAccountDetails( response['token_data'] );
} else {
// Connection error handling.
console.log( response );
$( '.gadsense-overlay' ).css( 'display', 'none' );
$( '#mapi-code' ).val( '' );
$( '#gadsense-modal-content-inner .dashicons-dismiss' ).trigger( 'click' );
}
},
error:function(request, status, error){
$( '#gadsense-loading-overlay' ).css( 'display', 'none' );
},
});
},
// Initialization - mostly binding events.
init: function(){
var that = this;
// Close the modal and hide errors.
$( document ).on( 'click', '#gadsense-modal .dashicons-dismiss', function(){
that.hide();
} );
// Account selection
$( document ).on( 'click', '.gadsense-modal-content-inner[data-content="account-selector"] button', function( ev ) {
var adsenseID = $( '#mapi-select-account' ).val();
var tokenData = false;
var tokenString = $( '.gadsense-modal-content-inner[data-content="account-selector"] input.token-data' ).val();
var details = false;
var detailsString = $( '.gadsense-modal-content-inner[data-content="account-selector"] input.accounts-details' ).val();
try {
tokenData = JSON.parse( tokenString );
} catch ( Ex ) {
console.error( 'Bad token data : ' + tokenString );
}
try {
details = JSON.parse( detailsString );
} catch ( Ex ) {
console.error( 'Bad account details : ' + detailsString );
}
if ( details ) {
$( '.gadsense-overlay' ).css( 'display', 'block' );
var data = {
action: 'advads_gadsense_mapi_select_account',
nonce: AdsenseMAPI.nonce,
account : details[ adsenseID ],
'token_data': tokenData,
};
$.ajax({
url: ajaxurl,
type: 'post',
data: data,
success:function(response, status, XHR){
if ( response.status && true === response.status ) {
INSTANCE.exit();
} else {
console.log( response );
}
},
error:function(request, status, error){
$( '#gadsense-loading-overlay' ).css( 'display', 'none' );
},
});
}
} );
},
// Get account info based on a newly obtained token.
getAccountDetails: function( tokenData ){
var data = {
action: 'advads_gadsense_mapi_get_details',
nonce: AdsenseMAPI.nonce
};
data.token_data = tokenData;
$.ajax( {
url: ajaxurl,
type: 'post',
data: data,
success: function ( response ) {
if ( response.success && true === response.success ) {
if ( response.data && response.data.reload ) {
INSTANCE.exit();
} else if ( response.data && response.data.token_data ) {
INSTANCE.switchContent( 'account-selector' );
INSTANCE.frame.find( 'select' ).html( response.data.html );
INSTANCE.frame.find( 'input.token-data' ).val( JSON.stringify( response.data.token_data ) );
INSTANCE.frame.find( 'input.accounts-details' ).val( JSON.stringify( response.data.details ) );
} else {
INSTANCE.switchContent( 'error' );
INSTANCE.frame.find( '.error-message' ).text( JSON.stringify( response ) );
}
}
},
error: function ( request, status, error ) {
if ( request.responseJSON ) {
if ( request.responseJSON.data.error ) {
INSTANCE.switchContent( 'error' );
INSTANCE.frame.find( '.error-message' ).text( request.responseJSON.data.error );
if ( typeof AdsenseMAPI.connectErrorMsg[request.responseJSON.data.error] !== 'undefined' ) {
INSTANCE.frame.find( '.error-description' ).html( AdsenseMAPI.connectErrorMsg[request.responseJSON.data.error] );
}
} else if ( request.responseJSON.data.message ) {
INSTANCE.frame.find( '.error-message' ).text( request.responseJSON.data.message );
}
return;
}
$( '#gadsense-loading-overlay' ).css( 'display', 'none' );
}
} );
},
// Switch between frames in the modal container.
switchContent: function( content ) {
if ( this.modal.find( '.gadsense-modal-content-inner[data-content="' + content + '"]' ).length ) {
this.modal.find( '.gadsense-modal-content-inner' ).css( 'display', 'none' );
this.frame = this.modal.find( '.gadsense-modal-content-inner[data-content="' + content + '"]' );
this.frame.css( 'display', 'block' );
$( '.gadsense-overlay' ).css( 'display', 'none' );
}
},
// Show the modal frame with a given content.
show: function( content ) {
if ( 'undefined' == typeof content ) {
content = 'confirm-code';
}
this.switchContent( content );
if ( 'open-google' == content ) {
window.location.href = AdsenseMAPI.oAuth2;
} else {
this.modal.css( 'display', 'block' );
}
},
// Hide the modal frame
hide: function(){
window.location.href = this.modal.attr( 'data-return' );
},
};
window.advadsMapiConnectClass = advadsMapiConnectClass;
// Shortcut function.
window.advadsMapiConnect = function( content, options ) {
if ( 'undefined' == typeof content || ! content ) {
content = 'confirm-code';
}
if ( 'undefined' == typeof options ) {
options = {};
}
if ( null === INSTANCE ) {
INSTANCE = new advadsMapiConnectClass( content, options );
} else {
INSTANCE.show( content, options );
}
}
$(function(){
// Move the the pop-up outside of any form.
$( '#wpwrap' ).append( $( '#gadsense-modal' ) );
if ( $( '#advads-adsense-oauth-code' ).length ) {
INSTANCE = new advadsMapiConnectClass( 'confirm-code', {} );
INSTANCE.submitOAuthCode( $( '#advads-adsense-oauth-code' ).val() );
}
});
})(window.jQuery);