/* global ajaxurl */

var jQuery,
	mla_inline_mapping_vars,
	mla = {
		// Properties
		settings: {},
		bulkMap: {
			ids: [],
			inProcess: false,
			doCancel: false
		},

		// Utility functions
		utility: {
		},

		// Components
		inlineMapAttachment: null
	};

( function( $ ) {
	/**
	 * Localized settings and strings
	 */
	mla.settings = typeof mla_inline_mapping_vars === 'undefined' ? {} : mla_inline_mapping_vars;
	mla_inline_mapping_vars = void 0; // delete won't work on Globals

	mla.inlineMapAttachment = {
		init : function(){
			var progressDiv = $( '#mla-progress-div' );

			$('#mla-progress-pause', progressDiv).off( 'click' );
			$('#mla-progress-pause', progressDiv).click( function(){
				if ( mla.bulkMap.inProcess ) {
					mla.bulkMap.doCancel = true;
					return false;
				} else {
					return mla.inlineMapAttachment.revert();
				}
			});

			$('#mla-progress-cancel', progressDiv).off( 'click' );
			$('#mla-progress-cancel', progressDiv).click( function(){
				return mla.inlineMapAttachment.revert();
			});

			$('#mla-progress-resume', progressDiv).off( 'click' );
			$('#mla-progress-resume', progressDiv).click( function(){
				var totalItems = +mla.settings.totalItems, newOffset = + $( '#mla-progress-offset' ).val();

				if ( totalItems < newOffset ) {
					newOffset = totalItems;
				} else {
					if ( 0 > newOffset ) {
						newOffset = 0;
					}
				}

				if ( mla.bulkMap.inProcess ) {
					mla.bulkMap.doCancel = true;
					return false;
				} else {
					return mla.inlineMapAttachment.bulkMap( mla.bulkMap.targetName, newOffset );
				}
			});

			// Clicking "Refresh" submits the form, refreshing the page
			$( '#mla-progress-refresh', progressDiv ).off( 'click' );
			$( '#mla-progress-refresh', progressDiv ).click( function(){
				$( '#mla-progress-refresh' ).prop( 'disabled', true ).css( 'opacity', '0.5' );
			});

			$('#mla-progress-close', progressDiv).off( 'click' );
			$('#mla-progress-close', progressDiv).click( function( e ){
				if ( mla.bulkMap.inProcess ) {
					return false;
				}

				return mla.inlineMapAttachment.revert();
			});

			// add event handler to the Execute All Rules
			$( 'input[type="submit"].mla-mapping' ).click(function( e ){
				e.preventDefault();
				return mla.inlineMapAttachment.bulkMap( e.target.name, 0 );
			});

			// add event handler to the Bulk Actions Apply (top)
			$( 'input[type="submit"]#doaction' ).click(function( e ){
				var action = $( '#bulk-action-selector-top' ).val(), ids;
//console.log( 'Bulk Actions Apply (top) ', e.target.id, ' ', action );
				if ( 'execute' !== action ) {
					return true;
				}
				
				ids = $('tbody th.check-column input[type="checkbox"]').serializeArray();
				if ( 0 === ids.length ) {
					return true;
				}

				$.each( ids, function( index, id ) {
					mla.bulkMap.ids[ index ] = +id.value;
				});
//console.log( JSON.stringify( mla.bulkMap ) );

				e.preventDefault();
				return mla.inlineMapAttachment.bulkMap( 'mapping-options-bulk-execute', 0 );
			});

			// add event handler to the Bulk Actions Apply (bottom)
			$( 'input[type="submit"]#doaction2' ).click(function( e ){
				var action = $( '#bulk-action-selector-bottom' ).val(), ids;
				if ( 'execute' !== action ) {
					return true;
				}
				
				ids = $('tbody th.check-column input[type="checkbox"]').serializeArray();
				if ( 0 === ids.length ) {
					return true;
				}

				$.each( ids, function( index, id ) {
					mla.bulkMap.ids[ index ] = +id.value;
				});

				e.preventDefault();
				return mla.inlineMapAttachment.bulkMap( 'mapping-options-bulk-execute', 0 );
			});

			// add event handler to the Execute rollover links
			$( 'a.execute' ).click(function( e ){
				e.preventDefault();
				return mla.inlineMapAttachment.bulkMap( e.target.id, 0 );
			});
		},

		bulkMap : function( action, initialOffset ) {
			var oldComplete = 0, oldUnchanged = 0, oldSuccess = 0, oldSkip = 0, oldRedone = 0, bulk_ids = [];

			initialOffset = +initialOffset;

			if ( 0 < initialOffset ) {
				oldComplete = typeof mla.bulkMap.complete === 'undefined' ? 0 : mla.bulkMap.complete;
				oldUnchanged = typeof mla.bulkMap.unchanged === 'undefined' ? 0 : mla.bulkMap.unchanged;
				oldSuccess = typeof mla.bulkMap.success === 'undefined' ? 0 : mla.bulkMap.success;
				oldSkip = typeof mla.bulkMap.skip === 'undefined' ? 0 : mla.bulkMap.skip;
				oldRedone = typeof mla.bulkMap.redone === 'undefined' ? 0 : mla.bulkMap.redone;
			}

			// See if we're skipping or re-processing any items
			if ( oldComplete < initialOffset ) {
				oldSkip += initialOffset - oldComplete;
			} else {
				if ( oldComplete > initialOffset ) {
					oldRedone += oldComplete - initialOffset;
				}
			}

			bulk_ids = typeof mla.bulkMap.ids === 'undefined' ? [] : mla.bulkMap.ids;
			mla.bulkMap = {
				ids: bulk_ids,
				inProcess: false,
				doCancel: false,
				chunkSize: +mla.settings.bulkChunkSize,
				targetName: action,
				fields: $( mla.settings.fieldsId + ' :input').serialize(),
				offset: initialOffset,
				waiting: mla.settings.totalItems - initialOffset,
				running: 0,
				complete: initialOffset,
				unchanged: oldUnchanged,
				success: oldSuccess,
				skip: oldSkip,
				redone: oldRedone,
				refresh: false
			};

			mla.inlineMapAttachment.progressOpen();
			mla.inlineMapAttachment.bulkPost();
			return false;
		},

		progressOpen : function(){
			this.revert();

			$( '#mla-progress-meter' ).css( 'width', '0%' );
			$( '#mla-progress-meter' ).html('0%');
			$( '#mla-progress-message' ).html('');
			$( '#mla-progress-error' ).html('');
			$( '#mla-progress-div' ).show();

			// Disable "Close" until the bulk mapping is complete
			$( '#mla-progress-pause' ).prop( 'disabled', false ).css( 'opacity', '1.0' ).show();
			$( '#mla-progress-cancel' ).hide();
			$( '#mla-progress-resume' ).hide();
			$( '#mla-progress-offset' ).hide();
			$( '#mla-progress-refresh' ).hide();
			$( '#mla-progress-close' ).prop( 'disabled', true ).css( 'opacity', '0.5' ).show();
			$( 'html, body' ).animate( { scrollTop: 0 }, 'fast' );
		},

		bulkPost : function() {
			var params, chunk, statusMessage = '',
				spinner = $('#mla-progress-div p.inline-edit-save .spinner'),
				message = $( '#mla-progress-message' ),
				error = $( '#mla-progress-error' );

			// Find the number of items to process
			if ( mla.bulkMap.waiting < mla.bulkMap.chunkSize ) {
				chunk = mla.bulkMap.waiting;
			} else {
				chunk = mla.bulkMap.chunkSize;
			}

			mla.bulkMap.waiting -= chunk;
			mla.bulkMap.running = chunk;

			params = {
				page: mla.settings.page,
				mla_tab: mla.settings.mla_tab,
				screen: mla.settings.screen,
				action: mla.settings.ajax_action,
				mla_admin_nonce: mla.settings.ajax_nonce,
				bulk_action: mla.bulkMap.targetName,
				ids: mla.bulkMap.ids,
				offset: mla.bulkMap.complete,
				length: chunk
			};

			params = $.param( params ) + '&' + mla.bulkMap.fields;

			// make ajax request
			mla.bulkMap.inProcess = true;

			percentComplete = Math.floor( ( 100 * mla.bulkMap.complete ) / mla.settings.totalItems ) + '%';
			$( '#mla-progress-meter' ).css( 'width', percentComplete );
			$( '#mla-progress-meter' ).html( percentComplete );

			if ( 0 < mla.bulkMap.skip ) {
				statusMessage += ', ' + mla.settings.bulkSkip + ': ' + mla.bulkMap.skip;
			}

			if ( 0 < mla.bulkMap.redone ) {
				statusMessage += ', ' + mla.settings.bulkRedone + ': ' + mla.bulkMap.redone;
			}

			if ( mla.settings.useSpinnerClass ) {
				spinner.addClass("is-active");
			} else {
				spinner.show();
			}

			statusMessage = mla.settings.bulkWaiting + ': ' + mla.bulkMap.waiting
				+ ', ' + mla.settings.bulkRunning + ': ' + mla.bulkMap.running
				+ ', ' + mla.settings.bulkComplete + ': ' + mla.bulkMap.complete
				+ statusMessage // skip and redone
				+ ', ' + mla.settings.bulkUnchanged + ': ' + mla.bulkMap.unchanged
				+ ', ' + mla.settings.bulkSuccess + ': ' + mla.bulkMap.success;
			message.html( statusMessage ).show();

			$.ajax( ajaxurl, {
				type: 'POST',
				data: params,
				dataType: 'json'
			}).always( function() {
				if ( mla.settings.useSpinnerClass ) {
					spinner.removeClass("is-active");
				} else {
					spinner.hide();
				}
			}).done( function( response, status ) {
					var responseData = 'no response.data', responseMessage = '';

					if ( response ) {
						if ( ! response.success ) {
							if ( response.responseData ) {
								responseData = response.data;
							}

							error.html( JSON.stringify( response ) );
							mla.bulkMap.waiting = 0; // Stop
						} else {
							if ( 0 == response.data.processed ) {
								// Something went wrong; we're done
								responseMessage = response.data.message;
								mla.bulkMap.waiting = 0; // Stop
							} else {
								// Move the items from Running to Complete
								mla.bulkMap.complete += response.data.processed;
								mla.bulkMap.running = 0;
								mla.bulkMap.unchanged += response.data.unchanged;
								mla.bulkMap.success += response.data.success;

								if ( 'undefined' !== typeof response.data.refresh ) {
									mla.bulkMap.refresh = response.data.refresh;
								}

								percentComplete = Math.floor( ( 100 * mla.bulkMap.complete ) / mla.settings.totalItems ) + '%';
								$( '#mla-progress-meter' ).css( 'width', percentComplete );
								$( '#mla-progress-meter' ).html( percentComplete );

								if ( 0 < mla.bulkMap.skip ) {
									responseMessage += ', ' + mla.settings.bulkSkip + ': ' + mla.bulkMap.skip;
								}

								if ( 0 < mla.bulkMap.redone ) {
									responseMessage += ', ' + mla.settings.bulkRedone + ': ' + mla.bulkMap.redone;
								}

								responseMessage = mla.settings.bulkWaiting + ': ' + mla.bulkMap.waiting
									+ ', ' + mla.settings.bulkComplete + ': ' + mla.bulkMap.complete
									+ responseMessage // skip and redone
									+ ', ' + mla.settings.bulkUnchanged + ': ' + mla.bulkMap.unchanged
									+ ', ' + mla.settings.bulkSuccess + ': ' + mla.bulkMap.success;
							}
							message.html( responseMessage ).show();
						}
					} else {
						error.html( mla.settings.error );
						mla.bulkMap.waiting = 0; // Stop
					}

					if ( mla.bulkMap.doCancel ) {
						message.html( mla.settings.bulkPaused + '. ' +  responseMessage ).show();
						$( '#mla-progress-pause' ).hide();
						$( '#mla-progress-cancel' ).show();
						$( '#mla-progress-resume' ).show();
						$( '#mla-progress-offset' ).val( mla.bulkMap.complete ).show();
					} else {
						if ( mla.bulkMap.waiting ) {
							mla.inlineMapAttachment.bulkPost();
							return;
						}
					}

					if ( mla.bulkMap.refresh ) {
						$( '#mla-progress-close' ).hide();
						$( '#mla-progress-refresh' ).prop( 'disabled', false ).css( 'opacity', '1.0' ).show();
					} else {
						$( '#mla-progress-close' ).prop( 'disabled', false ).css( 'opacity', '1.0' );
					}

					$( '#mla-progress-pause' ).prop( 'disabled', true ).css( 'opacity', '0.5' );
					mla.bulkMap.inProcess = false;
			}).fail( function( jqXHR, status ) {
				if ( 200 == jqXHR.status ) {
					error.html( '(' + status + ') ' + jqXHR.responseText );
				} else {
					error.html( mla.settings.ajaxFailError + ' (' + status + '), jqXHR( ' + jqXHR.status + ', ' + jqXHR.statusText + ', ' + jqXHR.responseText + ')' );
				}
			});
		},

		revert : function(){
			var progressDiv = $( '#mla-progress-div' );

			if ( progressDiv ) {
				if ( mla.settings.useSpinnerClass ) {
					$('p.inline-edit-save .spinner', progressDiv ).removeClass("is-active");
				} else {
					$('p.inline-edit-save .spinner', progressDiv ).hide();
				}

				// Reset Div content to initial values

				$( progressDiv ).hide();
			}

			return false;
		}
	}; // mla.inlineMapAttachment

	$( document ).ready( function() {
		mla.inlineMapAttachment.init();
	});
})( jQuery );
