/* global jQuery:false */
/* global TRX_UPDATER_STORAGE:false */

jQuery( document ).ready( function() {

	"use strict";


	// Screen 'Dashboard - Update'
	//-----------------------------------------------------------

	// Update theme components from 'update-core' screen
	var need_update = false,
		update_buttons = jQuery( '.trx_updater_upgrade_button,.trx_updater_backups_button,#upgrade,#upgrade-plugins,#upgrade-plugins-2,#upgrade-themes,#upgrade-themes-2' );

	if ( typeof TRX_UPDATER_STORAGE != 'undefined' && typeof TRX_UPDATER_STORAGE['upgrade_theme_attention'] != 'undefined' && TRX_UPDATER_STORAGE['upgrade_theme_attention'] != '' ) {
		var attention = '<span class="trx_updater_attention">' + TRX_UPDATER_STORAGE['upgrade_theme_attention'] + '</span>';
		jQuery( '#update-themes-table strong' ).each( function() {
			var $target = jQuery( this );
			if ( $target.text() == TRX_UPDATER_STORAGE['upgrade_theme_title'] ) {
				$target.parent().append( attention );
			}
		} );
		jQuery( '.theme-browser .theme[data-slug="' + TRX_UPDATER_STORAGE['upgrade_theme_slug'] + '"]' ).each( function() {
			var $self = jQuery( this );
			// Add attention to the upgrade msg on the theme-item
			var $msg  = $self.find( '.update-message p' );
			if ( $msg.length === 0 ) {
				$msg  = $self.find( '.update-message' );
			}
			if ( $msg.length ) {
				$msg.append( attention );
			}
			// Add attention to the upgrade msg on the theme-details
			$self.find( '.more-details' ).on( 'click', function() {
				setTimeout( function() {
					jQuery( '.theme-overlay .theme-info .notice' ).append( '<p>' + attention + '</p>' );
				}, 500 );
			} );
		} );
	}

	jQuery( '.trx_updater_upgrade_button:not([disabled]),.trx_updater_backups_button:not([disabled])' ).on(
		'click', function(e) {
			var button  = jQuery(this),
				action = button.hasClass( 'trx_updater_upgrade_button' ) 
							? 'update' 
							: ( button.hasClass( 'trx_updater_restore_backups_button' ) 
								? 'restore'
								: ( button.hasClass( 'trx_updater_delete_backups_button' ) 
									? 'delete'
									: ''
									)
								),
				wrapper = button.parents( '.trx_updater_upgrade,.trx_updater_backups' ),
				checked = wrapper.find( 'input[name="checked[]"]:checked' );
			if ( action !== '' ) {
				if ( checked.length > 0 ) {
					if ( action == 'update' || need_update !== false || confirm( TRX_UPDATER_STORAGE['msg_options_' + action] + ( action == 'delete' ? "\n" + TRX_UPDATER_STORAGE['msg_irreversable'] : '' ) ) ) {
						if ( need_update === false ) {
							need_update = checked.length;
							//wrapper.find( '.trx_updater_upgrade_button,.trx_updater_backups_button' ).attr( 'disabled', 'disabled' )
							update_buttons.attr( 'disabled', 'disabled' );
							if ( wrapper.next().hasClass( 'trx_updater_info_box' ) ) {
								wrapper.next().remove();
							}
						}
						var chk = checked.eq(0);
						if ( ! chk.next().hasClass( 'trx_updater_upgrade_status_wrap' ) ) {
							chk.hide();
							chk.after( 
								'<div class="trx_updater_upgrade_status_wrap">'
									+ '<span class="trx_updater_upgrade_status trx_updater_upgrade_status_progress"></span>'
								+ '</div>'
							);
						}
						var status = chk.next().find('.trx_updater_upgrade_status');

						// Add to URL parameter 'activate-multi' to prevent 'welcome screen' from some plugins
						var url = trx_updater_add_to_url( chk.data( action + '-url' ), { 'trx_updater': need_update, 'activate-multi': 1 } );

						// Update current plugin
						jQuery.get(url)
							.done( function(response) {
								var result = false;
								if ( action == 'update' ) {
									if ( chk.data( 'update-result' ) !== undefined ) {
										result = chk.data( 'update-result' );
									} else {
										if ( ! response ) {
											response = '';
											result = false;
										} else {
											if ( response.indexOf( '<html' ) < 0 ) {
												response = '<div>' + response + '</div>';	// Wrap response if it contain only div.wrap
											}
											result = jQuery(response).find('.wrap > iframe').length > 0
															|| jQuery(response).find('.wrap > script').text().indexOf( 'wp.updates.decrementCount(' ) > 0;
										}
									}
									if ( chk.data( 'activate-url' ) ) {
										chk.data( 'update-url', chk.data( 'activate-url' ) );
										chk.data( 'activate-url', false );
										chk.removeAttr( 'activate-url' );
										chk.data( 'update-result', result );
									} else {
										chk.data( 'update-url', false );
										chk.removeAttr( 'update-url' );										
									}
									if ( ! chk.data( 'update-url' ) && window.wp && window.wp.updates && window.wp.updates.decrementCount ) {
										window.wp.updates.decrementCount( "plugin" );
									}
								} else {
									var rez = {};
									if ( response === '' || response === 0 ) {
										rez = { error: TRX_UPDATER_STORAGE['msg_ajax_error'] };
									} else {
										try {
											rez = JSON.parse(response);
										} catch (e) {
											rez = { error: TRX_UPDATER_STORAGE['msg_ajax_error'] };
											console.log(response);
										}
									}
									result = rez.error == '';
								}
								if ( action != 'update' || ! chk.data( 'update-url' ) ) {
									status.addClass( 'trx_updater_upgrade_status_' + ( ! result ? 'error' : 'success' ) );
								}
								setTimeout( function() { button.trigger( 'click' ); }, 10 );
							} )
							.fail( function() {
								status.addClass( 'trx_updater_upgrade_status_error' );
								chk.data( 'update-url', false );
								chk.removeAttr( 'update-url' );										
								setTimeout( function() { button.trigger( 'click' ); }, 10 );
							} )
							.always( function() {
								if ( action != 'update' || ! chk.data( 'update-url' ) ) {
									need_update--;
									chk.get(0).checked = false;
									chk.removeAttr('checked');
									status.removeClass( 'trx_updater_upgrade_status_progress' );
								}
							} );
					}
				} else {
					if ( need_update === 0 && wrapper.find( '.trx_updater_upgrade_status' ).length > 0 ) {
						wrapper.after(
							'<div class="trx_updater_info_box trx_updater_info_box_' + ( wrapper.find( '.trx_updater_upgrade_status_error' ).length > 0 ? 'error' : 'success' ) + '">'
								+ ( wrapper.find( '.trx_updater_upgrade_status_error' ).length > 0
									? TRX_UPDATER_STORAGE['msg_'+action+'_error']
									: TRX_UPDATER_STORAGE['msg_'+action+'_success']
									)
								+ '<br>' + TRX_UPDATER_STORAGE['msg_page_reload']
							+ '</div>'
						);
						//wrapper.find( '.trx_updater_upgrade_button,.trx_updater_backups_button' ).removeAttr( 'disabled' );
						update_buttons.removeAttr( 'disabled' );
						need_update = false;
						setTimeout( function() {
							location.reload();
						}, 3000 );
					}
				}
			}
			e.preventDefault();
			return false;
		}
	);


	// Settings page
	//----------------------------------------------------------------------

	// Show/Hide backups on checkbox changed
	jQuery( 'input[type="checkbox"][name="trx_updater_backups_enable"]' ).on(
		'change', function(e) {
			if ( jQuery(this).get(0).checked ) {
				jQuery('.trx_updater_option_backups_list_row').show();
			} else {
				jQuery('.trx_updater_option_backups_list_row').hide();
			}
			e.preventDefault();
			return false;
		}
	);

	// Restore or Delete selected backups
	jQuery( 'input[type="button"][name="trx_updater_backups_restore"],input[type="button"][name="trx_updater_backups_delete"]' ).on(
		'click', function(e) {
			var action = jQuery(this).attr('name') == 'trx_updater_backups_restore' ? 'restore' : 'delete';
			if ( confirm( TRX_UPDATER_STORAGE['msg_options_' + action] ) ) {
				var checked = trx_updater_get_checklist_values( jQuery( '.trx_updater_option_backups_list' ) );
				if ( checked.length > 0 ) {
					var td = jQuery(this).parents('td').addClass( 'trx_updater_loading' );
					jQuery
						.post(
							TRX_UPDATER_STORAGE['ajax_url'],
							{
								nonce: TRX_UPDATER_STORAGE['ajax_nonce'],
								action: 'trx_updater_' + action + '_backups',
								backups: checked.join(',')
							}
						)
						.done( function(response) {
								var rez = {};
								if (response==='' || response===0) {
									rez = { error: TRX_UPDATER_STORAGE['msg_ajax_error'] };
								} else {
									try {
										rez = JSON.parse(response);
									} catch (e) {
										rez = { error: TRX_UPDATER_STORAGE['msg_ajax_error'] };
										console.log(response);
									}
								}
								for (var i=0; i<checked.length; i++) {
									jQuery('input[type="checkbox"][name="trx_updater_backups_item_'+checked[i]+'"]').each( function() {
										jQuery(this).parent().remove();
									});
								}
								if ( jQuery( '.trx_updater_option_backups_list_row input[type="checkbox"]' ).length == 0 ) {
									jQuery( '.trx_updater_option_backups_list_row' ).hide();
								}
								td.removeClass( 'trx_updater_loading' );
								alert( ( typeof rez.error != 'undefined' && rez.error != '' ? rez.error + "\n\n" : '')
										+ ( typeof rez.success != 'undefined' && rez.success != '' ? rez.success : '')
									);
						} );
				} else {
					alert( TRX_UPDATER_STORAGE['msg_options_select'] );
				}
			}
			e.preventDefault();
			return false;
		}
	);


	// Utilities
	//-------------------------------------------------------------

	// Collect values of checkboxes inside the specified container
	function trx_updater_get_checklist_values( cont ) {
		var values = [];
		jQuery( cont ).find( 'input[type="checkbox"]:checked' ).each( function() {
			values.push( jQuery(this).val() );
		} );
		return values;
	}

	// Add/Change arguments to the url address
	function trx_updater_add_to_url(loc, prm) {
		var ignore_empty = arguments[2] !== undefined ? arguments[2] : true;
		var q = loc.indexOf('?');
		var attr = {};
		if (q > 0) {
			var qq = loc.substr(q+1).split('&');
			var parts = '';
			for (var i=0; i < qq.length; i++) {
				parts = qq[i].split('=');
				attr[parts[0]] = parts.length>1 ? parts[1] : ''; 
			}
		}
		for (var p in prm) {
			attr[p] = prm[p];
		}
		loc = (q > 0 ? loc.substr(0, q) : loc) + '?';
		var i = 0;
		for (p in attr) {
			if (ignore_empty && attr[p] === '') continue;
			loc += (i++ > 0 ? '&' : '') + p + '=' + attr[p];
		}
		return loc;
	}

} );
