From da4f19b939d83bd53c8e0bdb729cfd1f4460f1dd Mon Sep 17 00:00:00 2001
From: Wouter Wolters <typo3@wouterwolters.nl>
Date: Sat, 22 Mar 2014 15:02:09 +0100
Subject: [PATCH] [TASK] Refactor Install Tool JavaScript

Resolves: #57182
Releases: 6.3
Change-Id: I2c8a7f594e3716152dfb9acb5246c741f7c9580d
Reviewed-on: http://review.typo3.org/28642
Reviewed-by: Susanne Moog <typo3@susannemoog.de>
Tested-by: Susanne Moog <typo3@susannemoog.de>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
---
 .../Resources/Public/Javascript/Install.js    | 370 +++++++++---------
 1 file changed, 188 insertions(+), 182 deletions(-)

diff --git a/typo3/sysext/install/Resources/Public/Javascript/Install.js b/typo3/sysext/install/Resources/Public/Javascript/Install.js
index 7b810c3b92cc..2f8b59831c04 100644
--- a/typo3/sysext/install/Resources/Public/Javascript/Install.js
+++ b/typo3/sysext/install/Resources/Public/Javascript/Install.js
@@ -21,6 +21,188 @@
 var TYPO3 = {};
 TYPO3.Install = {};
 
+TYPO3.Install.Cache = {
+	/**
+	 * Ajax call to clear all caches.
+	 */
+	clearCache: function() {
+		$.ajax({
+			url: location.href + '&install[controller]=ajax&install[action]=clearCache',
+			cache: false
+		});
+	}
+};
+
+TYPO3.Install.Scrolling = {
+	isScrolledIntoView: function(elem) {
+		var docViewTop = $(window).scrollTop();
+		var docViewBottom = docViewTop + $(window).height();
+		var elemTop = $(elem).offset().top;
+		var elemBottom = elemTop + $(elem).height();
+
+		return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
+	},
+	handleButtonScrolling: function() {
+		if (!this.isScrolledIntoView($('#fixed-footer-handler'))) {
+			$('#fixed-footer').addClass('fixed');
+		} else {
+			$('#fixed-footer').removeClass('fixed');
+		}
+	}
+};
+
+TYPO3.Install.ExtensionChecker = {
+	/**
+	 * Call checkExtensionsCompatibility recursively on error
+	 * so we can find all incompatible extensions
+	 */
+	handleCheckExtensionsError: function() {
+		this.checkExtensionsCompatibility(false);
+	},
+	/**
+	 * Send an ajax request to uninstall an extension (or multiple extensions)
+	 *
+	 * @param extension string of extension(s) - may be comma separated
+	 */
+	uninstallExtension: function(extension) {
+		var self = this;
+		var url = location.href + '&install[controller]=ajax&install[action]=uninstallExtension' +
+			'&install[uninstallExtension][extensions]=' + extension;
+		$.ajax({
+			url: url,
+			cache: false,
+			success: function(data) {
+				if (data === 'OK') {
+					self.checkExtensionsCompatibility(true);
+				} else {
+					if(data === 'unauthorized') {
+						location.reload();
+					}
+					// workaround for xdebug returning 200 OK on fatal errors
+					if (data.substring(data.length - 2) === 'OK') {
+						self.checkExtensionsCompatibility(true);
+					} else {
+						$('.message-loading', '#checkExtensions').hide();
+						$('.message-error .message-body', '#checkExtensions').html(
+							'Something went wrong. Check failed.'
+						);
+					}
+				}
+			},
+			error: function(data) {
+				self.handleCheckExtensionsError();
+			}
+		});
+	},
+	/**
+	 * Handles result of extension compatibility check.
+	 * Displays uninstall buttons for non-compatible extensions.
+	 */
+	handleCheckExtensionsSuccess: function() {
+		var self = this;
+		$.ajax({
+			url: $('#checkExtensions').data('protocolurl'),
+			cache: false,
+			success: function(data) {
+				if (data) {
+					$('.message-error .message-body', '#checkExtensions').html(
+						'The following extensions are not compatible. Please uninstall them and try again. '
+					);
+					var extensions = data.split(',');
+					var unloadButtonWrapper = $('<fieldset class="t3-install-form-submit"></fieldset>');
+					for(var i=0; i<extensions.length; i++) {
+						var extension = extensions[i];
+						var unloadButton = $('<button />', {
+							text: 'Uninstall '+ $.trim(extension),
+							"class": $.trim(extension),
+							click: function(e) {
+								self.uninstallExtension($(this).attr('class'));
+								e.preventDefault();
+								return false;
+							}
+						});
+						var fullButton = unloadButtonWrapper.append(unloadButton);
+						$('.message-error .message-body', '#checkExtensions').append(fullButton);
+					}
+					var unloadAllButton = $('<button />', {
+						text: 'Uninstall all incompatible extensions: '+ data,
+						click: function(e) {
+							$('.message-loading', '#checkExtensions').show();
+							self.uninstallExtension(data);
+							e.preventDefault();
+							return false;
+						}
+					});
+					unloadButtonWrapper.append('<hr />');
+					var fullUnloadAllButton = unloadButtonWrapper.append(unloadAllButton);
+					$('.message-error .message-body', '#checkExtensions').append(fullUnloadAllButton);
+
+					$('.message-loading', '#checkExtensions').hide();
+					$('button', '#checkExtensions').show();
+					$('.message-error', '#checkExtensions').show();
+				} else {
+					$('.typo3-message', '#checkExtensions').hide();
+					$('.message-ok', '#checkExtensions').show();
+				}
+			},
+			error: function() {
+				$('.typo3-message', '#checkExtensions').hide();
+				$('.message-ok', '#checkExtensions').show();
+			}
+		});
+		$.getJSON(
+			$('#checkExtensions').data('errorprotocolurl'),
+			function(data) {
+				$.each(data, function(i, error) {
+					var messageToDisplay = error.message + ' in ' + error.file + ' on line ' + error.line;
+					$('#checkExtensions .typo3-message.message-error').before($(
+						'<div class="typo3-message message-warning"><div class="header-container"><div class="message-header">' +
+						'<strong>' + error.type + '</strong></div><div class="message-body">' +
+						messageToDisplay + '</div></div></div><p></p>'
+					));
+				});
+			}
+		);
+	},
+	/**
+	 * Checks extension compatibility by trying to load ext_tables and ext_localconf via ajax.
+	 *
+	 * @param force
+	 */
+	checkExtensionsCompatibility: function(force) {
+		var self = this;
+		var url = location.href + '&install[controller]=ajax&install[action]=extensionCompatibilityTester';
+		if (force) {
+			TYPO3.Install.Cache.clearCache();
+			url += '&install[extensionCompatibilityTester][forceCheck]=1';
+		} else {
+			url += '&install[extensionCompatibilityTester][forceCheck]=0';
+		}
+		$.ajax({
+			url: url,
+			cache: false,
+			success: function(data) {
+				if (data === 'OK') {
+					self.handleCheckExtensionsSuccess();
+				} else {
+					if(data === 'unauthorized') {
+						location.reload();
+					}
+					// workaround for xdebug returning 200 OK on fatal errors
+					if (data.substring(data.length - 2) === 'OK') {
+						self.handleCheckExtensionsSuccess();
+					} else {
+						self.handleCheckExtensionsError();
+					}
+				}
+			},
+			error: function(data) {
+				self.handleCheckExtensionsError();
+			}
+		});
+	}
+};
+
 TYPO3.Install.Status = {
 	getFolderStatus: function() {
 		var url = location.href + '&install[controller]=ajax&install[action]=folderStatus';
@@ -327,7 +509,7 @@ $(document).ready(function() {
 		$toggleGroup = $(this).closest('.toggleGroup');
 		$toggleGroup.toggleClass('expanded');
 		$toggleGroup.find('.toggleData').toggle();
-		handleButtonScrolling();
+		TYPO3.Install.Scrolling.handleButtonScrolling();
 	});
 
 	$('.toggleAll').on('click', function() {
@@ -340,7 +522,7 @@ $(document).ready(function() {
 			$toggleAll.addClass('expanded');
 			$toggleAll.find('.toggleData').show();
 		}
-		handleButtonScrolling();
+		TYPO3.Install.Scrolling.handleButtonScrolling();
 	});
 
 	// Simple password strength indicator
@@ -391,15 +573,15 @@ $(document).ready(function() {
 		$('button', '#checkExtensions').hide();
 		$('.typo3-message', '#checkExtensions').hide();
 		$('.message-loading', '#checkExtensions').show();
-		checkExtensionsCompatibility(true);
+		TYPO3.Install.ExtensionChecker.checkExtensionsCompatibility(true);
 		e.preventDefault();
 		return false;
 	});
 
 	// Footer scrolling and visibility
 	if ($('#fixed-footer-handler').length > 0) {
-		$(window).scroll(handleButtonScrolling);
-		$('body.backend #typo3-docbody').scroll(handleButtonScrolling);
+		$(window).scroll(TYPO3.Install.Scrolling.handleButtonScrolling());
+		$('body.backend #typo3-docbody').scroll(TYPO3.Install.Scrolling.handleButtonScrolling());
 	}
 
 	// Handle core update
@@ -413,185 +595,9 @@ $(document).ready(function() {
 			$(e.target).closest('.t3-install-form-submit').remove();
 		}));
 	}
+
 	if ($('#t3-install-left').length > 0) {
 		TYPO3.Install.Status.getFolderStatus();
 		TYPO3.Install.Status.getEnvironmentStatus();
 	}
 });
-
-function handleButtonScrolling() {
-	if (!isScrolledIntoView($('#fixed-footer-handler'))) {
-		$('#fixed-footer').addClass('fixed');
-	} else {
-		$('#fixed-footer').removeClass('fixed');
-	}
-}
-function isScrolledIntoView(elem) {
-	var docViewTop = $(window).scrollTop();
-	var docViewBottom = docViewTop + $(window).height();
-	var elemTop = $(elem).offset().top;
-	var elemBottom = elemTop + $(elem).height();
-
-	return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
-}
-
-/**
- * Checks extension compatibility by trying to load ext_tables and ext_localconf
- * via ajax.
- *
- * @param force
- */
-function checkExtensionsCompatibility(force) {
-	var url = location.href + '&install[controller]=ajax&install[action]=extensionCompatibilityTester';
-	if (force) {
-		clearCache();
-		url += '&install[extensionCompatibilityTester][forceCheck]=1';
-	} else {
-		url += '&install[extensionCompatibilityTester][forceCheck]=0';
-	}
-	$.ajax({
-		url: url,
-		cache: false,
-		success: function(data) {
-			if (data === 'OK') {
-				handleCheckExtensionsSuccess();
-			} else {
-				if(data === 'unauthorized') {
-					location.reload();
-				}
-				// workaround for xdebug returning 200 OK on fatal errors
-				if (data.substring(data.length - 2) === 'OK') {
-					handleCheckExtensionsSuccess();
-				} else {
-					handleCheckExtensionsError();
-				}
-			}
-		},
-		error: function(data) {
-			handleCheckExtensionsError();
-		}
-	});
-}
-
-/**
- * Handles result of extension compatibility check.
- * Displays uninstall buttons for non-compatible extensions.
- */
-function handleCheckExtensionsSuccess() {
-	$.ajax({
-		url: $('#checkExtensions').data('protocolurl'),
-		cache: false,
-		success: function(data) {
-			if (data) {
-				$('.message-error .message-body', '#checkExtensions').html(
-					'The following extensions are not compatible. Please uninstall them and try again. '
-				);
-				var extensions = data.split(',');
-				var unloadButtonWrapper = $('<fieldset class="t3-install-form-submit"></fieldset>');
-				for(var i=0; i<extensions.length; i++) {
-					var extension = extensions[i];
-					var unloadButton = $('<button />', {
-						text: 'Uninstall '+ $.trim(extension),
-						"class": $.trim(extension),
-						click: function(e) {
-							uninstallExtension($(this).attr('class'));
-							e.preventDefault();
-							return false;
-						}
-					});
-					var fullButton = unloadButtonWrapper.append(unloadButton);
-					$('.message-error .message-body', '#checkExtensions').append(fullButton);
-				}
-				var unloadAllButton = $('<button />', {
-					text: 'Uninstall all incompatible extensions: '+ data,
-					click: function(e) {
-						$('.message-loading', '#checkExtensions').show();
-						uninstallExtension(data);
-						e.preventDefault();
-						return false;
-					}
-				});
-				unloadButtonWrapper.append('<hr />');
-				var fullUnloadAllButton = unloadButtonWrapper.append(unloadAllButton);
-				$('.message-error .message-body', '#checkExtensions').append(fullUnloadAllButton);
-
-				$('.message-loading', '#checkExtensions').hide();
-				$('button', '#checkExtensions').show();
-				$('.message-error', '#checkExtensions').show();
-			} else {
-				$('.typo3-message', '#checkExtensions').hide();
-				$('.message-ok', '#checkExtensions').show();
-			}
-		},
-		error: function() {
-			$('.typo3-message', '#checkExtensions').hide();
-			$('.message-ok', '#checkExtensions').show();
-		}
-	});
-	$.getJSON(
-		$('#checkExtensions').data('errorprotocolurl'),
-		function(data) {
-			$.each(data, function(i, error) {
-				var messageToDisplay = error.message + ' in ' + error.file + ' on line ' + error.line;
-				$('#checkExtensions .typo3-message.message-error').before($(
-					'<div class="typo3-message message-warning"><div class="header-container"><div class="message-header">' +
-					'<strong>' + error.type + '</strong></div><div class="message-body">' +
-					messageToDisplay + '</div></div></div><p></p>'
-				));
-			});
-		}
-	);
-}
-
-/**
- * Call checkExtensionsCompatibility recursively on error
- * so we can find all incompatible extensions
- */
-function handleCheckExtensionsError() {
-	checkExtensionsCompatibility(false);
-}
-
-/**
- * Send an ajax request to uninstall an extension (or multiple extensions)
- *
- * @param extension string of extension(s) - may be comma separated
- */
-function uninstallExtension(extension) {
-	var url = location.href + '&install[controller]=ajax&install[action]=uninstallExtension' +
-		'&install[uninstallExtension][extensions]=' + extension;
-	$.ajax({
-		url: url,
-		cache: false,
-		success: function(data) {
-			if (data === 'OK') {
-				checkExtensionsCompatibility(true);
-			} else {
-				if(data === 'unauthorized') {
-					location.reload();
-				}
-				// workaround for xdebug returning 200 OK on fatal errors
-				if (data.substring(data.length - 2) === 'OK') {
-					checkExtensionsCompatibility(true);
-				} else {
-					$('.message-loading', '#checkExtensions').hide();
-					$('.message-error .message-body', '#checkExtensions').html(
-						'Something went wrong. Check failed.'
-					);
-				}
-			}
-		},
-		error: function(data) {
-			handleCheckExtensionsError();
-		}
-	});
-}
-
-/**
- * Ajax call to clear all caches.
- */
-function clearCache() {
-	$.ajax({
-		url: location.href + '&install[controller]=ajax&install[action]=clearCache',
-		cache: false
-	});
-}
\ No newline at end of file
-- 
GitLab