src/pyams_skin/resources/js/myams.js
changeset 489 63ea9a94bd47
parent 486 48b7cea0d903
child 490 135a744a7732
--- a/src/pyams_skin/resources/js/myams.js	Wed Dec 12 21:16:29 2018 +0100
+++ b/src/pyams_skin/resources/js/myams.js	Thu Dec 13 14:28:29 2018 +0100
@@ -465,6 +465,75 @@
 
 })(jQuery, this);
 
+(function($, globals) {
+
+	var ams = globals.MyAMS;
+
+	/**
+	 * MyAMS locale strings
+	 */
+	ams.i18n = {
+
+		INFO: "Information",
+		WARNING: "!! WARNING !!",
+		ERROR: "ERROR: ",
+
+		LOADING: "Loading...",
+		PROGRESS: "Processing",
+
+		WAIT: "Please wait!",
+		FORM_SUBMITTED: "This form was already submitted...",
+		NO_SERVER_RESPONSE: "No response from server!",
+
+		ERROR_OCCURED: "An error occured!",
+		ERRORS_OCCURED: "Some errors occured!",
+
+		BAD_LOGIN_TITLE: "Bad login!",
+		BAD_LOGIN_MESSAGE: "Your anthentication credentials didn't allow you to open a session; " +
+						   "please check your credentials or contact administrator.",
+
+		CONFIRM: "Confirm",
+		CONFIRM_REMOVE: "Removing this content can't be undone. Do you confirm?",
+
+		CLEAR_STORAGE_TITLE: "Clear Local Storage",
+		CLEAR_STORAGE_CONTENT: "Would you like to RESET all your saved widgets and clear LocalStorage?",
+
+		BTN_OK: "OK",
+		BTN_CANCEL: "Cancel",
+		BTN_OK_CANCEL: "[OK][Cancel]",
+		BTN_YES: "Yes",
+		BTN_NO: "No",
+		BTN_YES_NO: "[Yes][No]",
+
+		CLIPBOARD_COPY: "Copy to clipboard with Ctrl+C, and Enter",
+		CLIPBOARD_CHARACTER_COPY_OK: "Character copied to clipboard",
+		CLIPBOARD_TEXT_COPY_OK: "Text copied to clipboard",
+
+		FORM_CHANGED_WARNING: "Some changes were not saved. These updates will be lost if you leave this page.",
+		DELETE_WARNING: "This change can't be undone. Are you sure that you want to delete this element?",
+		NO_UPDATE: "No changes were applied.",
+		DATA_UPDATED: "Data successfully updated.",
+
+		HOME: "Home",
+		LOGOUT: "Logout?",
+		LOGOUT_COMMENT: "You can improve your security further after logging out by closing this opened browser",
+
+		SELECT2_PLURAL: 's',
+		SELECT2_MATCH: "One result is available, press enter to select it.",
+		SELECT2_MATCHES: " results are available, use up and down arrow keys to navigate.",
+		SELECT2_NOMATCHES: "No matches found",
+		SELECT2_SEARCHING: "Searching...",
+		SELECT2_LOADMORE: "Loading more results...",
+		SELECT2_INPUT_TOOSHORT: "Please enter {0} more character{1}",
+		SELECT2_INPUT_TOOLONG: "Please delete {0} character{1}",
+		SELECT2_SELECTION_TOOBIG: "You can only select {0} item{1}",
+		SELECT2_FREETAG_PREFIX: "Free text: ",
+
+		DT_COLUMNS: "Columns"
+	};
+
+})(jQuery, this);
+
 /**
  * MyAMS UTF-8 features
  */
@@ -581,7 +650,7 @@
 												var invokedOn = $(this).data("invokedOn");
 												var selectedMenu = $(e.target);
 												settings.menuSelected.call(this, invokedOn, selectedMenu);
-												ams.event.stop(e);
+												ams.event && ams.event.stop(e);
 											});
 					return false;
 				});
@@ -817,14 +886,13 @@
 					}
 				}
 				if (copied) {
-					ams.skin.smallBox('success',
-									  {
-										  title: text.length > 1
-											  ? ams.i18n.CLIPBOARD_TEXT_COPY_OK
-											  : ams.i18n.CLIPBOARD_CHARACTER_COPY_OK,
-										  icon: 'fa fa-fw fa-info-circle font-xs align-top margin-top-10',
-										  timeout: 3000
-									  });
+					ams.skin && ams.skin.smallBox('success', {
+						title: text.length > 1
+							? ams.i18n.CLIPBOARD_TEXT_COPY_OK
+							: ams.i18n.CLIPBOARD_CHARACTER_COPY_OK,
+						icon: 'fa fa-fw fa-info-circle font-xs align-top margin-top-10',
+						timeout: 3000
+					});
 				} else if (globals.prompt) {
 					globals.prompt(ams.i18n.CLIPBOARD_COPY, text);
 				}
@@ -865,22 +933,26 @@
 			if (response && response.statusText && response.statusText.toUpperCase() === 'OK') {
 				return;
 			}
-			response = ams.ajax.getResponse(response);
-			if (response.contentType === 'json') {
-				ams.ajax.handleJSON(response.data);
+			response = ams.ajax && ams.ajax.getResponse(response);
+			if (response) {
+				if (response.contentType === 'json') {
+					ams.ajax.handleJSON(response.data);
+				} else {
+					var title = error || event.statusText || event.type;
+					var message = response.responseText;
+					ams.skin && ams.skin.messageBox('error', {
+						title: ams.i18n.ERROR_OCCURED,
+						content: '<h4>' + title + '</h4><p>' + (message || '') + '</p>',
+						icon: 'fa fa-warning animated shake',
+						timeout: 10000
+					});
+				}
+				if (console) {
+					console.error && console.error(event);
+					console.debug && console.debug(response);
+				}
 			} else {
-				var title = error || event.statusText || event.type;
-				var message = response.responseText;
-				ams.skin.messageBox('error', {
-					title: ams.i18n.ERROR_OCCURED,
-					content: '<h4>' + title + '</h4><p>' + (message || '') + '</p>',
-					icon: 'fa fa-warning animated shake',
-					timeout: 10000
-				});
-			}
-			if (console) {
-				console.error && console.error(event);
-				console.debug && console.debug(response);
+				console.error && console.error("Missing MyAMS AJAX module!")
 			}
 		},
 
@@ -891,20 +963,24 @@
 			if (!error) {
 				return;
 			}
-			var response = ams.ajax.getResponse(request);
-			if (response.contentType === 'json') {
-				ams.ajax.handleJSON(response.data);
+			var response = ams.ajax && ams.ajax.getResponse(request);
+			if (response) {
+				if (response.contentType === 'json') {
+					ams.ajax.handleJSON(response.data);
+				} else {
+					ams.skin.messageBox('error', {
+						title: ams.i18n.ERRORS_OCCURED,
+						content: '<h4>' + status + '</h4><p>' + error + '</p>',
+						icon: "fa fa-warning animated shake",
+						timeout: 10000
+					});
+				}
+				if (console) {
+					console.error && console.error(error);
+					console.debug && console.debug(request);
+				}
 			} else {
-				ams.skin.messageBox('error', {
-					title: ams.i18n.ERRORS_OCCURED,
-					content: '<h4>' + status + '</h4><p>' + error + '</p>',
-					icon: "fa fa-warning animated shake",
-					timeout: 10000
-				});
-			}
-			if (console) {
-				console.error && console.error(error);
-				console.debug && console.debug(request);
+				console.error && console.error("Missing MyAMS AJAX module!")
 			}
 		}
 	};
@@ -1160,14 +1236,14 @@
 					}
 					break;
 				case 'error':
-					ams.form.showErrors(form, result);
+					ams.form && ams.form.showErrors(form, result);
 					break;
 				case 'info':
 				case 'success':
 					if (form !== undefined) {
-						ams.form.resetChanged(form);
+						ams.form && ams.form.resetChanged(form);
 						if (result.close_form !== false) {
-							ams.dialog.close(form);
+							ams.dialog && ams.dialog.close(form);
 						}
 					}
 					break;
@@ -1178,20 +1254,20 @@
 				case 'callback':
 				case 'callbacks':
 					if (form !== undefined) {
-						ams.form.resetChanged(form);
+						ams.form && ams.form.resetChanged(form);
 						if (result.close_form !== false) {
-							ams.dialog.close(form);
+							ams.dialog && ams.dialog.close(form);
 						}
 					}
 					break;
 				case 'modal':
-					ams.dialog.open(result.location);
+					ams.dialog && ams.dialog.open(result.location);
 					break;
 				case 'reload':
 					if (form !== undefined) {
-						ams.form.resetChanged(form);
+						ams.form && ams.form.resetChanged(form);
 						if (result.close_form !== false) {
-							ams.dialog.close(form);
+							ams.dialog && ams.dialog.close(form);
 						}
 					}
 					url = result.location || window.location.hash;
@@ -1199,7 +1275,7 @@
 						url = url.substr(1);
 					}
 					var loadTarget = $(result.target || target || '#content');
-					ams.skin.loadURL(url, loadTarget, {
+					ams.skin && ams.skin.loadURL(url, loadTarget, {
 						preLoadCallback: ams.getFunctionByName(result.pre_reload) || function() {
 							$('[data-ams-pre-reload]', loadTarget).each(function() {
 								ams.executeFunctionByName($(this).data('ams-pre-reload'));
@@ -1216,9 +1292,9 @@
 					break;
 				case 'redirect':
 					if (form !== undefined) {
-						ams.form.resetChanged(form);
+						ams.form && ams.form.resetChanged(form);
 						if (result.close_form === true) {
-							ams.dialog.close(form);
+							ams.dialog && ams.dialog.close(form);
 						}
 					}
 					url = result.location || window.location.href;
@@ -1251,7 +1327,7 @@
 					container.text(content.text);
 				} else {
 					container.html(content.html);
-					ams.initContent(container);
+					ams.initContent && ams.initContent(container);
 				}
 				if (!content.keep_hidden) {
 					container.removeClass('hidden');
@@ -1266,7 +1342,7 @@
 						container.text(content.text);
 					} else {
 						container.html(content.html);
-						ams.initContent(container);
+						ams.initContent && ams.initContent(container);
 					}
 					if (!content.keep_hidden) {
 						container.removeClass('hidden');
@@ -1279,32 +1355,32 @@
 				message = result.message;
 				if (typeof(message) === 'string') {
 					if ((status === 'info') || (status === 'success')) {
-						ams.skin.smallBox(status, {
-											  title: message,
-											  icon: 'fa fa-fw fa-info-circle font-xs align-top margin-top-10',
-											  timeout: 3000
-										  });
+						ams.skin && ams.skin.smallBox(status, {
+							title: message,
+							icon: 'fa fa-fw fa-info-circle font-xs align-top margin-top-10',
+							timeout: 3000
+						});
 					} else {
-						ams.skin.alert($(form || '#content'), status, message);
+						ams.skin && ams.skin.alert($(form || '#content'), status, message);
 					}
 				} else {
-					ams.skin.alert($(message.target || target || form || '#content'),
-								   message.status || 'success',
-								   message.header,
-								   message.body,
-								   message.subtitle);
+					ams.skin && ams.skin.alert($(message.target || target || form || '#content'),
+											   message.status || 'success',
+											   message.header,
+											   message.body,
+											   message.subtitle);
 				}
 			}
 			if (result.smallbox) {
 				message = result.smallbox;
 				if (typeof(message) === 'string') {
-					ams.skin.smallBox(result.smallbox_status || status, {
+					ams.skin && ams.skin.smallBox(result.smallbox_status || status, {
 						title: result.smallbox,
 						icon: result.smallbox_icon || 'fa fa-fw fa-info-circle font-xs align-top margin-top-10',
 						timeout: result.smallbox_timeout || 3000
 					});
 				} else {
-					ams.skin.smallBox(message.status || status, {
+					ams.skin && ams.skin.smallBox(message.status || status, {
 						title: message.message,
 						icon: message.icon || 'fa fa-fw fa-info-circle font-xs align-top margin-top-10',
 						timeout: message.timeout || 3000
@@ -1314,23 +1390,23 @@
 			if (result.messagebox) {
 				message = result.messagebox;
 				if (typeof(message) === 'string') {
-					ams.skin.messageBox('info', {
-											title: ams.i18n.ERROR_OCCURED,
-											content: message,
-											timeout: 10000
-										});
+					ams.skin && ams.skin.messageBox('info', {
+						title: ams.i18n.ERROR_OCCURED,
+						content: message,
+						timeout: 10000
+					});
 				} else {
 					var messageStatus = message.status || 'info';
 					if (messageStatus === 'error' && form && target) {
 						ams.executeFunctionByName(form.data('ams-form-submit-error') || 'MyAMS.form.finalizeSubmitOnError', form, target);
 					}
-					ams.skin.messageBox(messageStatus, {
-											title: message.title || ams.i18n.ERROR_OCCURED,
-											content: message.content,
-											icon: message.icon,
-											number: message.number,
-											timeout: message.timeout === null ? undefined : (message.timeout || 10000)
-										});
+					ams.skin && ams.skin.messageBox(messageStatus, {
+						title: message.title || ams.i18n.ERROR_OCCURED,
+						content: message.content,
+						icon: message.icon,
+						number: message.number,
+						timeout: message.timeout === null ? undefined : (message.timeout || 10000)
+					});
 				}
 			}
 			if (result.event) {
@@ -1401,51 +1477,50 @@
 		 *  - @callback: name of a callback which will be called on server response
 		 */
 		query: function(query, method, options, callback) {
-			ams.ajax.check($.jsonRPC,
-						   ams.baseURL + 'ext/jquery-jsonrpc' + ams.devext + '.js',
-						   function() {
-								if (typeof(options) === 'function') {
-									callback = options;
-									options = {};
-								}
-								else if (!options) {
-									options = {};
-								}
-								if (callback === 'undefined') {
-									callback = options.callback;
-								}
-								if (typeof(callback) === 'string') {
-									callback = ams.getFunctionByName(callback);
-								}
-								delete options.callback;
-
-								var params = {};
-								if (typeof(query) === 'string') {
-									params.query = query;
-								} else if (typeof(query) === 'object') {
-									$.extend(params, query);
-								}
-								$.extend(params, options);
-
-								var result;
-								var defaults = {
-									id: new Date().getTime(),
-									params: params,
-									success: callback || function(data) {
-										result = data;
-									},
-									error: ams.error.show
-								};
-								var settings = $.extend({}, defaults, options);
-								$.jsonRPC.withOptions({
-									endPoint: ams.jsonrpc.getAddr(options.url),
-									namespace: options.namespace,
-									cache: false
-								}, function() {
-									$.jsonRPC.request(method, settings);
-								});
-								return result;
-						   });
+			ams.ajax && ams.ajax.check($.jsonRPC,
+									   ams.baseURL + 'ext/jquery-jsonrpc' + ams.devext + '.js',
+									   function() {
+										   if (typeof (options) === 'function') {
+											   callback = options;
+											   options = {};
+										   } else if (!options) {
+											   options = {};
+										   }
+										   if (callback === 'undefined') {
+											   callback = options.callback;
+										   }
+										   if (typeof (callback) === 'string') {
+											   callback = ams.getFunctionByName(callback);
+										   }
+										   delete options.callback;
+
+										   var params = {};
+										   if (typeof (query) === 'string') {
+											   params.query = query;
+										   } else if (typeof (query) === 'object') {
+											   $.extend(params, query);
+										   }
+										   $.extend(params, options);
+
+										   var result;
+										   var defaults = {
+											   id: new Date().getTime(),
+											   params: params,
+											   success: callback || function(data) {
+												   result = data;
+											   },
+											   error: ams.error && ams.error.show
+										   };
+										   var settings = $.extend({}, defaults, options);
+										   $.jsonRPC.withOptions({
+																	 endPoint: ams.jsonrpc.getAddr(options.url),
+																	 namespace: options.namespace,
+																	 cache: false
+																 }, function() {
+											   $.jsonRPC.request(method, settings);
+										   });
+										   return result;
+									   });
 		},
 
 		/**
@@ -1457,43 +1532,42 @@
 		 *  - @callback: name of a callback which will be called on server response
 		 */
 		post: function(method, data, options, callback) {
-			ams.ajax.check($.jsonRPC,
-						   ams.baseURL + 'ext/jquery-jsonrpc' + ams.devext + '.js',
-						   function() {
-								if (typeof(options) === 'function') {
-									callback = options;
-									options = {};
-								}
-								else if (!options) {
-									options = {};
-								}
-								if (typeof(callback) === 'undefined') {
-									callback = options.callback;
-								}
-								if (typeof(callback) === 'string') {
-									callback = ams.getFunctionByName(callback);
-								}
-								delete options.callback;
-
-								var result;
-								var defaults = {
-									id: new Date().getTime(),
-									params: data,
-									success: callback || function(data) {
-										result = data;
-									},
-									error: ams.error.show
-								};
-								var settings = $.extend({}, defaults, options);
-								$.jsonRPC.withOptions({
-									endPoint: ams.jsonrpc.getAddr(options.url),
-									namespace: options.namespace,
-									cache: false
-								}, function() {
-									$.jsonRPC.request(method, settings);
-								});
-								return result;
-						   });
+			ams.ajax && ams.ajax.check($.jsonRPC,
+									   ams.baseURL + 'ext/jquery-jsonrpc' + ams.devext + '.js',
+									   function() {
+										   if (typeof (options) === 'function') {
+											   callback = options;
+											   options = {};
+										   } else if (!options) {
+											   options = {};
+										   }
+										   if (typeof (callback) === 'undefined') {
+											   callback = options.callback;
+										   }
+										   if (typeof (callback) === 'string') {
+											   callback = ams.getFunctionByName(callback);
+										   }
+										   delete options.callback;
+
+										   var result;
+										   var defaults = {
+											   id: new Date().getTime(),
+											   params: data,
+											   success: callback || function(data) {
+												   result = data;
+											   },
+											   error: ams.error && ams.error.show
+										   };
+										   var settings = $.extend({}, defaults, options);
+										   $.jsonRPC.withOptions({
+																	 endPoint: ams.jsonrpc.getAddr(options.url),
+																	 namespace: options.namespace,
+																	 cache: false
+																 }, function() {
+											   $.jsonRPC.request(method, settings);
+										   });
+										   return result;
+									   });
 		}
 	};
 
@@ -1527,38 +1601,37 @@
 		 *  - @callback: name of a callback which will be called on server response
 		 */
 		post: function(url, method, data, options, callback) {
-			ams.ajax.check($.xmlrpc,
-						   ams.baseURL + 'ext/jquery-xmlrpc' + ams.devext + '.js',
-						   function() {
-								if (typeof(options) === 'function') {
-									callback = options;
-									options = {};
-								}
-								else if (!options) {
-									options = {};
-								}
-								if (typeof(callback) === 'undefined') {
-									callback = options.callback;
-								}
-								if (typeof(callback) === 'string') {
-									callback = ams.getFunctionByName(callback);
-								}
-								delete options.callback;
-
-								var result;
-								var defaults = {
-									url: ams.xmlrpc.getAddr(url),
-									methodName: method,
-									params: data,
-									success: callback || function(response /*, status, xhr*/) {
-										result = response;
-									},
-									error: ams.error.show
-								};
-								var settings = $.extend({}, defaults, options);
-								$.xmlrpc(settings);
-								return result;
-						   });
+			ams.ajax && ams.ajax.check($.xmlrpc,
+									   ams.baseURL + 'ext/jquery-xmlrpc' + ams.devext + '.js',
+									   function() {
+										   if (typeof (options) === 'function') {
+											   callback = options;
+											   options = {};
+										   } else if (!options) {
+											   options = {};
+										   }
+										   if (typeof (callback) === 'undefined') {
+											   callback = options.callback;
+										   }
+										   if (typeof (callback) === 'string') {
+											   callback = ams.getFunctionByName(callback);
+										   }
+										   delete options.callback;
+
+										   var result;
+										   var defaults = {
+											   url: ams.xmlrpc.getAddr(url),
+											   methodName: method,
+											   params: data,
+											   success: callback || function(response /*, status, xhr*/) {
+												   result = response;
+											   },
+											   error: ams.error && ams.error.show
+										   };
+										   var settings = $.extend({}, defaults, options);
+										   $.xmlrpc(settings);
+										   return result;
+									   });
 		}
 	};
 
@@ -1670,7 +1743,7 @@
 						cancelCallback.call(element);
 					}
 				} else {
-					ams.skin.bigBox({
+					ams.skin && ams.skin.bigBox({
 						title: ams.i18n.WARNING,
 						content: '<i class="text-danger fa fa-2x fa-bell shake animated"></i>&nbsp; ' + ams.i18n.FORM_CHANGED_WARNING,
 						buttons: ams.i18n.BTN_OK_CANCEL
@@ -1717,7 +1790,7 @@
 			// Prevent multiple submits of the same form
 			if (form.data('submitted')) {
 				if (!form.data('ams-form-hide-submitted')) {
-					ams.skin.messageBox('warning', {
+					ams.skin && ams.skin.messageBox('warning', {
 						title: ams.i18n.WAIT,
 						content: ams.i18n.FORM_SUBMITTED,
 						icon: 'fa fa-save shake animated',
@@ -1727,7 +1800,7 @@
 				return false;
 			}
 			// Check submit validators
-			if (!ams.form._checkSubmitValidators(form)) {
+			if (ams.form && !ams.form._checkSubmitValidators(form)) {
 				return false;
 			}
 			// Remove remaining status messages
@@ -1739,283 +1812,283 @@
 				button.data('ams-progress-content', button.html());
 				button.button('loading');
 			}
-			ams.ajax.check($.fn.ajaxSubmit,
-						   ams.baseURL + 'ext/jquery-form-3.49' + ams.devext + '.js',
-						   function() {
-
-								function _submitAjaxForm(form, options) {
-
-									var button,
-										buttonData,
-										buttonTarget;
-									var data = form.data();
-									var formOptions = data.amsFormOptions;
-									var formData;
-									var formDataCallback;
-
-									var progressHandler;
-									var progressInterval;
-									var progressCallback;
-									var progressEndCallback;
-
-									// Inner progress status handler
-									function _getProgress(handler, progress_id) {
-
-										var interval;
-
-										function _clearProgressStatus() {
-											clearInterval(interval);
-											ams.form.resetAfterSubmit(form, button);
-											button.html(button.data('ams-progress-content'));
-											ams.executeFunctionByName(progressEndCallback, form, button);
-											ams.form.resetChanged(form);
-										}
-
-										function _getProgressStatus() {
-											ams.ajax.post(handler,
-														  {progress_id: progress_id},
-														  {error: _clearProgressStatus},
-														  ams.getFunctionByName(progressCallback) || function(result, status) {
-															if (status === 'success') {
-																if (result.status === 'running') {
-																	if (result.message) {
-																		button.text(result.message);
-																	} else {
-																		var text = button.data('ams-progress-text') || ams.i18n.PROGRESS;
-																		if (result.current) {
-																			text += ': ' + result.current + '/ ' + (result.length || 100);
-																		} else {
-																			text += '...';
-																		}
-																		button.text(text);
-																	}
-																} else if (result.status === 'finished') {
-																	_clearProgressStatus();
-																}
-															} else {
-																_clearProgressStatus();
-															}
-														  });
-										}
-
-										button.button('loading');
-										interval = setInterval(_getProgressStatus, progressInterval);
-									}
-
-									// Initialize form data
-									if (submitOptions) {
-										formDataCallback = submitOptions.formDataInitCallback;
-									}
-									if (formDataCallback) {
-										delete submitOptions.formDataInitCallback;
-									} else {
-										formDataCallback = data.amsFormDataInitCallback;
-									}
-									if (formDataCallback) {
-										var veto = {};
-										formData = ams.executeFunctionByName(formDataCallback, form, veto);
-										if (veto.veto) {
-											button = form.data('ams-submit-button');
-											if (button) {
-												button.button('reset');
-											}
-											ams.form.finalizeSubmitFooter.call(form);
-											return false;
-										}
-									} else {
-										formData = data.amsFormData || {};
-									}
-
-									// Check submit button for custom action handler and target
-									button = $(form.data('ams-submit-button'));
-									if (button && button.exists()) {
-										buttonData = button.data();
-										buttonTarget = buttonData.amsFormSubmitTarget;
-									} else {
-										buttonData = {};
-									}
-
-									// Check action URL
-									var url;
-									var formHandler = handler || buttonData.amsFormHandler || data.amsFormHandler || '';
-									if (formHandler.startsWith(window.location.protocol)) {
-										url = formHandler;
-									} else {
-										var action = buttonData.amsFormAction || form.attr('action').replace(/#/, '');
-										if (action.startsWith(window.location.protocol)) {
-											url = action;
-										} else {
-											url = ams.ajax.getAddr() + action;
-										}
-										url += formHandler;
-									}
-									progressHandler = buttonData.amsProgressHandler || data.amsProgressHandler || '';
-									progressInterval = buttonData.amsProgressInterval || data.amsProgressInterval || 1000;
-									progressCallback = buttonData.amsProgressCallback || data.amsProgressCallback;
-									progressEndCallback = buttonData.amsProgressEndCallback || data.amsProgressEndCallback;
-
-									// Initialize submit target with AJAX indicator
-									var target = null;
-									if (submitOptions && submitOptions.initSubmitTarget) {
-										ams.executeFunctionByName(submitOptions.initSubmitTarget, form);
-									} else {
-										if (data.amsFormInitSubmitTarget) {
-											target = $(buttonTarget || data.amsFormSubmitTarget || '#content');
-											ams.executeFunctionByName(data.amsFormInitSubmit || 'MyAMS.form.initSubmit', form, target);
-										} else if (!data.amsFormHideSubmitFooter) {
-											ams.executeFunctionByName(data.amsFormInitSubmit || 'MyAMS.form.initSubmitFooter', form);
-										}
-									}
-
-									// Complete form data
-									if (submitOptions) {
-										formData = $.extend({}, formData, submitOptions.form_data);
-									}
-
-									// Check progress handler
-									var hasUpload;
-									if (progressHandler) {
-										formData.progress_id = ams.generateUUID();
-									} else {
-										// Check progress meter via Apache progress module
-										hasUpload = typeof(options.uuid) !== 'undefined';
-										if (hasUpload) {
-											if (url.indexOf('X-Progress-ID') < 0) {
-												url += "?X-Progress-ID=" + options.uuid;
-											}
-											delete options.uuid;
-										}
-									}
-
-									// Initialize default AJAX settings
-									var defaults = {
-										url: url,
-										type: 'post',
-										cache: false,
-										data: formData,
-										dataType: data.amsFormDatatype,
-										beforeSerialize: function(/*form, options*/) {
-											if (typeof(globals.tinyMCE) !== 'undefined') {
-												globals.tinyMCE.triggerSave();
-											}
-										},
-										beforeSubmit: function(data, form /*, options*/) {
-											form.data('submitted', true);
-										},
-										error: function(request, status, error, form) {
-											if (target) {
-												ams.executeFunctionByName(data.amsFormSubmitError || 'MyAMS.form.finalizeSubmitOnError', form, target);
-											}
-											ams.form.resetAfterSubmit(form);
-										},
-										iframe: hasUpload
-									};
-
-									// Initialize IFrame for custom download target
-									var downloadTarget = (submitOptions && submitOptions.downloadTarget) || data.amsFormDownloadTarget;
-									if (downloadTarget) {
-										var iframe = $('iframe[name="' + downloadTarget + '"]');
-										if (!iframe.exists()) {
-											iframe = $('<iframe></iframe>').hide()
-																		   .attr('name', downloadTarget)
-																		   .appendTo($('body'));
-										}
-										defaults = $.extend({}, defaults, {
-											iframe: true,
-											iframeTarget: iframe,
-											success: function(result, status, request, form) {
-												var modal = $(form).parents('.modal-dialog');
-												if (modal.exists()) {
-													ams.dialog.close(form);
-												} else {
-													var callback;
-													var button = form.data('ams-submit-button');
-													if (button) {
-														callback = button.data('ams-form-submit-callback');
-													}
-													if (!callback) {
-														callback = ams.getFunctionByName(data.amsFormSubmitCallback) || ams.form._submitCallback;
-													}
-													try {
-														callback.call(form, result, status, request, form);
-													} finally {
-														ams.form.resetAfterSubmit(form);
-														ams.form.resetChanged(form);
-													}
-												}
-											}
-										});
-									} else {
-										defaults = $.extend({}, defaults, {
-											error: function(request, status, error, form) {
-												if (target) {
-													ams.executeFunctionByName(data.amsFormSubmitError || 'MyAMS.form.finalizeSubmitOnError', form, target);
-												}
-												ams.form.resetAfterSubmit(form);
-											},
-											success: function(result, status, request, form) {
-												var callback;
-												var button = form.data('ams-submit-button');
-												if (button) {
-													callback = button.data('ams-form-submit-callback');
-												}
-												if (!callback) {
-													callback = ams.getFunctionByName(data.amsFormSubmitCallback) || ams.form._submitCallback;
-												}
-												try {
-													callback.call(form, result, status, request, form);
-												} finally {
-													ams.form.resetAfterSubmit(form);
-													ams.form.resetChanged(form);
-												}
-											},
-											iframe: hasUpload
-										});
-									}
-									var settings = $.extend({}, defaults, options, formOptions, submitOptions);
-
-									// Initialize progress handler
-									if (progressHandler) {
-										_getProgress(progressHandler, formData.progress_id);
-									}
-
-									// Submit form
-									$(form).ajaxSubmit(settings);
-
-									// If external download target is specified, reset form submit button and footer
-									if (downloadTarget) {
-										var modal = $(form).parents('.modal-dialog');
-										var keepModal = modal.exists() && button.exists() && button.data('ams-keep-modal');
-										if (modal.exists() && (keepModal !== true)) {
-											ams.dialog.close(form);
-										} else {
-											if (!progressHandler) {
-												setTimeout(function () {
-													ams.form.resetAfterSubmit(form, button);
-													ams.form.resetChanged(form);
-												}, button.data('ams-form-reset-timeout') || 2000);
-											}
-										}
-									}
-								}
-
-								var hasUpload = (form.data('ams-form-ignore-uploads') !== true) &&
-												($('INPUT[type="file"]', form).length > 0);
-								if (hasUpload) {
-									// JQuery-progressbar plug-in must be loaded synchronously!!
-									// Otherwise, hidden input fields created by jquery-validate plug-in
-									// and matching named buttons will be deleted (on first form submit)
-									// before JQuery-form plug-in can get them when submitting the form...
-									ams.ajax.check($.progressBar,
-												   ams.baseURL + 'ext/jquery-progressbar' + ams.devext + '.js');
-									var settings = $.extend({}, {
-										uuid: $.progressBar.submit(form)
-									});
-									_submitAjaxForm(form, settings);
-								} else {
-									_submitAjaxForm(form, {});
-								}
-						   });
+			ams.ajax && ams.ajax.check($.fn.ajaxSubmit,
+									   ams.baseURL + 'ext/jquery-form-3.49' + ams.devext + '.js',
+									   function() {
+
+										   function _submitAjaxForm(form, options) {
+
+											   var button,
+												   buttonData,
+												   buttonTarget;
+											   var data = form.data();
+											   var formOptions = data.amsFormOptions;
+											   var formData;
+											   var formDataCallback;
+
+											   var progressHandler;
+											   var progressInterval;
+											   var progressCallback;
+											   var progressEndCallback;
+
+											   // Inner progress status handler
+											   function _getProgress(handler, progress_id) {
+
+												   var interval;
+
+												   function _clearProgressStatus() {
+													   clearInterval(interval);
+													   ams.form.resetAfterSubmit(form, button);
+													   button.html(button.data('ams-progress-content'));
+													   ams.executeFunctionByName(progressEndCallback, form, button);
+													   ams.form.resetChanged(form);
+												   }
+
+												   function _getProgressStatus() {
+													   ams.ajax && ams.ajax.post(handler,
+																				 {progress_id: progress_id},
+																				 {error: _clearProgressStatus},
+																				 ams.getFunctionByName(progressCallback) || function(result, status) {
+																						 if (status === 'success') {
+																							 if (result.status === 'running') {
+																								 if (result.message) {
+																									 button.text(result.message);
+																								 } else {
+																									 var text = button.data('ams-progress-text') || ams.i18n.PROGRESS;
+																									 if (result.current) {
+																										 text += ': ' + result.current + '/ ' + (result.length || 100);
+																									 } else {
+																										 text += '...';
+																									 }
+																									 button.text(text);
+																								 }
+																							 } else if (result.status === 'finished') {
+																								 _clearProgressStatus();
+																							 }
+																						 } else {
+																							 _clearProgressStatus();
+																						 }
+																					 });
+												   }
+
+												   button.button('loading');
+												   interval = setInterval(_getProgressStatus, progressInterval);
+											   }
+
+											   // Initialize form data
+											   if (submitOptions) {
+												   formDataCallback = submitOptions.formDataInitCallback;
+											   }
+											   if (formDataCallback) {
+												   delete submitOptions.formDataInitCallback;
+											   } else {
+												   formDataCallback = data.amsFormDataInitCallback;
+											   }
+											   if (formDataCallback) {
+												   var veto = {};
+												   formData = ams.executeFunctionByName(formDataCallback, form, veto);
+												   if (veto.veto) {
+													   button = form.data('ams-submit-button');
+													   if (button) {
+														   button.button('reset');
+													   }
+													   ams.form.finalizeSubmitFooter.call(form);
+													   return false;
+												   }
+											   } else {
+												   formData = data.amsFormData || {};
+											   }
+
+											   // Check submit button for custom action handler and target
+											   button = $(form.data('ams-submit-button'));
+											   if (button && button.exists()) {
+												   buttonData = button.data();
+												   buttonTarget = buttonData.amsFormSubmitTarget;
+											   } else {
+												   buttonData = {};
+											   }
+
+											   // Check action URL
+											   var url;
+											   var formHandler = handler || buttonData.amsFormHandler || data.amsFormHandler || '';
+											   if (formHandler.startsWith(window.location.protocol)) {
+												   url = formHandler;
+											   } else {
+												   var action = buttonData.amsFormAction || form.attr('action').replace(/#/, '');
+												   if (action.startsWith(window.location.protocol)) {
+													   url = action;
+												   } else {
+													   url = ams.ajax && (ams.ajax.getAddr() + action);
+												   }
+												   url += formHandler;
+											   }
+											   progressHandler = buttonData.amsProgressHandler || data.amsProgressHandler || '';
+											   progressInterval = buttonData.amsProgressInterval || data.amsProgressInterval || 1000;
+											   progressCallback = buttonData.amsProgressCallback || data.amsProgressCallback;
+											   progressEndCallback = buttonData.amsProgressEndCallback || data.amsProgressEndCallback;
+
+											   // Initialize submit target with AJAX indicator
+											   var target = null;
+											   if (submitOptions && submitOptions.initSubmitTarget) {
+												   ams.executeFunctionByName(submitOptions.initSubmitTarget, form);
+											   } else {
+												   if (data.amsFormInitSubmitTarget) {
+													   target = $(buttonTarget || data.amsFormSubmitTarget || '#content');
+													   ams.executeFunctionByName(data.amsFormInitSubmit || 'MyAMS.form.initSubmit', form, target);
+												   } else if (!data.amsFormHideSubmitFooter) {
+													   ams.executeFunctionByName(data.amsFormInitSubmit || 'MyAMS.form.initSubmitFooter', form);
+												   }
+											   }
+
+											   // Complete form data
+											   if (submitOptions) {
+												   formData = $.extend({}, formData, submitOptions.form_data);
+											   }
+
+											   // Check progress handler
+											   var hasUpload;
+											   if (progressHandler) {
+												   formData.progress_id = ams.generateUUID();
+											   } else {
+												   // Check progress meter via Apache progress module
+												   hasUpload = typeof (options.uuid) !== 'undefined';
+												   if (hasUpload) {
+													   if (url.indexOf('X-Progress-ID') < 0) {
+														   url += "?X-Progress-ID=" + options.uuid;
+													   }
+													   delete options.uuid;
+												   }
+											   }
+
+											   // Initialize default AJAX settings
+											   var defaults = {
+												   url: url,
+												   type: 'post',
+												   cache: false,
+												   data: formData,
+												   dataType: data.amsFormDatatype,
+												   beforeSerialize: function(/*form, options*/) {
+													   if (typeof (globals.tinyMCE) !== 'undefined') {
+														   globals.tinyMCE.triggerSave();
+													   }
+												   },
+												   beforeSubmit: function(data, form /*, options*/) {
+													   form.data('submitted', true);
+												   },
+												   error: function(request, status, error, form) {
+													   if (target) {
+														   ams.executeFunctionByName(data.amsFormSubmitError || 'MyAMS.form.finalizeSubmitOnError', form, target);
+													   }
+													   ams.form.resetAfterSubmit(form);
+												   },
+												   iframe: hasUpload
+											   };
+
+											   // Initialize IFrame for custom download target
+											   var downloadTarget = (submitOptions && submitOptions.downloadTarget) || data.amsFormDownloadTarget;
+											   if (downloadTarget) {
+												   var iframe = $('iframe[name="' + downloadTarget + '"]');
+												   if (!iframe.exists()) {
+													   iframe = $('<iframe></iframe>').hide()
+														   .attr('name', downloadTarget)
+														   .appendTo($('body'));
+												   }
+												   defaults = $.extend({}, defaults, {
+													   iframe: true,
+													   iframeTarget: iframe,
+													   success: function(result, status, request, form) {
+														   var modal = $(form).parents('.modal-dialog');
+														   if (modal.exists()) {
+															   ams.dialog && ams.dialog.close(form);
+														   } else {
+															   var callback;
+															   var button = form.data('ams-submit-button');
+															   if (button) {
+																   callback = button.data('ams-form-submit-callback');
+															   }
+															   if (!callback) {
+																   callback = ams.getFunctionByName(data.amsFormSubmitCallback) || ams.form._submitCallback;
+															   }
+															   try {
+																   callback.call(form, result, status, request, form);
+															   } finally {
+																   ams.form.resetAfterSubmit(form);
+																   ams.form.resetChanged(form);
+															   }
+														   }
+													   }
+												   });
+											   } else {
+												   defaults = $.extend({}, defaults, {
+													   error: function(request, status, error, form) {
+														   if (target) {
+															   ams.executeFunctionByName(data.amsFormSubmitError || 'MyAMS.form.finalizeSubmitOnError', form, target);
+														   }
+														   ams.form.resetAfterSubmit(form);
+													   },
+													   success: function(result, status, request, form) {
+														   var callback;
+														   var button = form.data('ams-submit-button');
+														   if (button) {
+															   callback = button.data('ams-form-submit-callback');
+														   }
+														   if (!callback) {
+															   callback = ams.getFunctionByName(data.amsFormSubmitCallback) || ams.form._submitCallback;
+														   }
+														   try {
+															   callback.call(form, result, status, request, form);
+														   } finally {
+															   ams.form.resetAfterSubmit(form);
+															   ams.form.resetChanged(form);
+														   }
+													   },
+													   iframe: hasUpload
+												   });
+											   }
+											   var settings = $.extend({}, defaults, options, formOptions, submitOptions);
+
+											   // Initialize progress handler
+											   if (progressHandler) {
+												   _getProgress(progressHandler, formData.progress_id);
+											   }
+
+											   // Submit form
+											   $(form).ajaxSubmit(settings);
+
+											   // If external download target is specified, reset form submit button and footer
+											   if (downloadTarget) {
+												   var modal = $(form).parents('.modal-dialog');
+												   var keepModal = modal.exists() && button.exists() && button.data('ams-keep-modal');
+												   if (modal.exists() && (keepModal !== true)) {
+													   ams.dialog && ams.dialog.close(form);
+												   } else {
+													   if (!progressHandler) {
+														   setTimeout(function() {
+															   ams.form.resetAfterSubmit(form, button);
+															   ams.form.resetChanged(form);
+														   }, button.data('ams-form-reset-timeout') || 2000);
+													   }
+												   }
+											   }
+										   }
+
+										   var hasUpload = (form.data('ams-form-ignore-uploads') !== true) &&
+											   ($('INPUT[type="file"]', form).length > 0);
+										   if (hasUpload) {
+											   // JQuery-progressbar plug-in must be loaded synchronously!!
+											   // Otherwise, hidden input fields created by jquery-validate plug-in
+											   // and matching named buttons will be deleted (on first form submit)
+											   // before JQuery-form plug-in can get them when submitting the form...
+											   ams.ajax && ams.ajax.check($.progressBar,
+																		  ams.baseURL + 'ext/jquery-progressbar' + ams.devext + '.js');
+											   var settings = $.extend({}, {
+												   uuid: $.progressBar.submit(form)
+											   });
+											   _submitAjaxForm(form, settings);
+										   } else {
+											   _submitAjaxForm(form, {});
+										   }
+									   });
 			return false;
 		},
 
@@ -2135,9 +2208,11 @@
 			if (data.amsFormDatatype) {
 				dataType = data.amsFormDatatype;
 			} else {
-				var response = ams.ajax.getResponse(request);
-				dataType = response.contentType;
-				result = response.data;
+				var response = ams.ajax && ams.ajax.getResponse(request);
+				if (response) {
+					dataType = response.contentType;
+					result = response.data;
+				}
 			}
 
 			var target;
@@ -2149,7 +2224,7 @@
 
 			switch (dataType) {
 				case 'json':
-					ams.ajax.handleJSON(result, form, target);
+					ams.ajax && ams.ajax.handleJSON(result, form, target);
 					break;
 				case 'script':
 					break;
@@ -2162,7 +2237,7 @@
 				default:
 					ams.form.resetChanged(form);
 					if (button && (button.data('ams-keep-modal') !== true)) {
-						ams.dialog.close(form);
+						ams.dialog && ams.dialog.close(form);
 					}
 					if (!target.exists()) {
 						target = $('body');
@@ -2173,7 +2248,7 @@
 						  .html(result)
 						  .delay(50)
 						  .animate({opacity: '1.0'}, 300);
-					ams.initContent(target);
+					ams.initContent && ams.initContent(target);
 					ams.form.setFocus(target);
 			}
 			var callback = request.getResponseHeader('X-AMS-Callback');
@@ -2230,7 +2305,7 @@
 			}
 			if (output.length > 0) {
 				var header = output.length === 1 ? ams.i18n.ERROR_OCCURED : ams.i18n.ERRORS_OCCURED;
-				ams.skin.alert(form, 'danger', header, output);
+				ams.skin && ams.skin.alert(form, 'danger', header, output);
 				return false;
 			} else {
 				return result;
@@ -2253,10 +2328,10 @@
 		showErrors: function(form, errors) {
 			var header;
 			if (typeof(errors) === 'string') {
-				ams.skin.alert(form, 'error', ams.i18n.ERROR_OCCURED, errors);
+				ams.skin && ams.skin.alert(form, 'error', ams.i18n.ERROR_OCCURED, errors);
 			} else if (errors instanceof Array) {
 				header = errors.length === 1 ? ams.i18n.ERROR_OCCURED : ams.i18n.ERRORS_OCCURED;
-				ams.skin.alert(form, 'error', header, errors);
+				ams.skin && ams.skin.alert(form, 'error', header, errors);
 			} else {
 				$('.state-error', form).removeClass('state-error');
 				header = errors.error_header ||
@@ -2303,7 +2378,7 @@
 						}
 					}
 				}
-				ams.skin.alert($('.form-group:first', form), errors.error_level || 'error', header, message, errors.error_message);
+				ams.skin && ams.skin.alert($('.form-group:first', form), errors.error_level || 'error', header, message, errors.error_message);
 			}
 		}
 	};
@@ -2381,106 +2456,106 @@
 		 * Modal dialog opener
 		 */
 		open: function(source, options, callbacks) {
-			ams.ajax.check($.fn.modalmanager,
-						   ams.baseURL + 'ext/bootstrap-modalmanager' + ams.devext + '.js',
-						   function() {
-								ams.ajax.check($.fn.modal.defaults,
-											   ams.baseURL + 'ext/bootstrap-modal' + ams.devext + '.js',
-								function(first_load) {
-									if (first_load) {
-										$(document).off('click.modal');
-										$.fn.modal.defaults.spinner = $.fn.modalmanager.defaults.spinner =
-											'<div class="loading-spinner" style="width: 200px; margin-left: -100px;">' +
-												'<div class="progress progress-striped active">' +
-													'<div class="progress-bar" style="width: 100%;"></div>' +
-												'</div>' +
-											'</div>';
-									}
-
-									var sourceData;
-									var url;
-									if (typeof(source) === 'string') {
-										sourceData = {};
-										url = source;
-									} else {
-										sourceData = source.data();
-										url = source.attr('href') || sourceData.amsUrl;
-										var url_getter = ams.getFunctionByName(url);
-										if (typeof(url_getter) === 'function') {
-											url = url_getter.call(source);
-										}
-									}
-									if (!url) {
-										return;
-									}
-									$('body').modalmanager('loading');
-									if (url.indexOf('#') === 0) {
-										// Inner hidden modal dialog
-										$(url).modal('show');
-									} else {
-										// Remote URL modal dialog
-										$.ajax({
-											url: url,
-											type: 'get',
-											cache: sourceData.amsAllowCache === undefined ? false : sourceData.amsAllowCache,
-											data: options,
-											success: function(data, status, request) {
-												$('body').modalmanager('removeLoading');
-												var response = ams.ajax.getResponse(request);
-												var dataType = response.contentType;
-												var result = response.data;
-												switch (dataType) {
-													case 'json':
-														ams.ajax.handleJSON(result, $($(source).data('ams-json-target') || '#content'));
-														break;
-													case 'script':
-														break;
-													case 'xml':
-														break;
-													case 'html':
-														/* falls through */
-													case 'text':
-														/* falls through */
-													default:
-														var content = $(result);
-														var dialog = $('.modal-dialog', content.wrap('<div></div>').parent());
-														var dialogData = dialog.data() || {};
-														var dataOptions = {
-															backdrop: 'static',
-															overflow: dialogData.amsModalOverflow || '.modal-viewport',
-															maxHeight: dialogData.amsModalMaxHeight === undefined ?
-																	function() {
-																		return $(window).height() -
-																					$('.modal-header', content).outerHeight(true) -
-																					$('footer', content).outerHeight(true) - 85;
-																	}
-																	: ams.getFunctionByName(dialogData.amsModalMaxHeight)
-														};
-														var settings = $.extend({}, dataOptions, dialogData.amsModalOptions);
-														settings = ams.executeFunctionByName(dialogData.amsModalInitCallback, dialog, settings) || settings;
-														if (callbacks) {
-															if (callbacks.shown) {
-																ams.dialog.registerShownCallback(callbacks.shown, content);
-															}
-															if (callbacks.hide) {
-																ams.dialog.registerHideCallback(callbacks.hide, content);
-															}
-														}
-														$('<div>').addClass('modal fade')
-																  .append(content)
-																  .modal(settings)
-																  .on('shown', ams.dialog.shown)
-																  .on('hidden', ams.dialog.hidden);
-														ams.initContent(content);
-														if (sourceData.amsLogEvent !== false) {
-															ams.stats.logPageview(url);
-														}
-												}
-											}
-										});
-									}
-								});
-						   });
+			ams.ajax && ams.ajax.check($.fn.modalmanager,
+									   ams.baseURL + 'ext/bootstrap-modalmanager' + ams.devext + '.js',
+									   function() {
+										   ams.ajax.check($.fn.modal.defaults,
+														  ams.baseURL + 'ext/bootstrap-modal' + ams.devext + '.js',
+														  function(first_load) {
+															  if (first_load) {
+																  $(document).off('click.modal');
+																  $.fn.modal.defaults.spinner = $.fn.modalmanager.defaults.spinner =
+																	  '<div class="loading-spinner" style="width: 200px; margin-left: -100px;">' +
+																	  '<div class="progress progress-striped active">' +
+																	  '<div class="progress-bar" style="width: 100%;"></div>' +
+																	  '</div>' +
+																	  '</div>';
+															  }
+
+															  var sourceData;
+															  var url;
+															  if (typeof (source) === 'string') {
+																  sourceData = {};
+																  url = source;
+															  } else {
+																  sourceData = source.data();
+																  url = source.attr('href') || sourceData.amsUrl;
+																  var url_getter = ams.getFunctionByName(url);
+																  if (typeof (url_getter) === 'function') {
+																	  url = url_getter.call(source);
+																  }
+															  }
+															  if (!url) {
+																  return;
+															  }
+															  $('body').modalmanager('loading');
+															  if (url.indexOf('#') === 0) {
+																  // Inner hidden modal dialog
+																  $(url).modal('show');
+															  } else {
+																  // Remote URL modal dialog
+																  $.ajax({
+																			 url: url,
+																			 type: 'get',
+																			 cache: sourceData.amsAllowCache === undefined ? false : sourceData.amsAllowCache,
+																			 data: options,
+																			 success: function(data, status, request) {
+																				 $('body').modalmanager('removeLoading');
+																				 var response = ams.ajax.getResponse(request);
+																				 var dataType = response.contentType;
+																				 var result = response.data;
+																				 switch (dataType) {
+																					 case 'json':
+																						 ams.ajax.handleJSON(result, $($(source).data('ams-json-target') || '#content'));
+																						 break;
+																					 case 'script':
+																						 break;
+																					 case 'xml':
+																						 break;
+																					 case 'html':
+																					 /* falls through */
+																					 case 'text':
+																					 /* falls through */
+																					 default:
+																						 var content = $(result);
+																						 var dialog = $('.modal-dialog', content.wrap('<div></div>').parent());
+																						 var dialogData = dialog.data() || {};
+																						 var dataOptions = {
+																							 backdrop: 'static',
+																							 overflow: dialogData.amsModalOverflow || '.modal-viewport',
+																							 maxHeight: dialogData.amsModalMaxHeight === undefined ?
+																								 function() {
+																									 return $(window).height() -
+																										 $('.modal-header', content).outerHeight(true) -
+																										 $('footer', content).outerHeight(true) - 85;
+																								 }
+																								 : ams.getFunctionByName(dialogData.amsModalMaxHeight)
+																						 };
+																						 var settings = $.extend({}, dataOptions, dialogData.amsModalOptions);
+																						 settings = ams.executeFunctionByName(dialogData.amsModalInitCallback, dialog, settings) || settings;
+																						 if (callbacks) {
+																							 if (callbacks.shown) {
+																								 ams.dialog.registerShownCallback(callbacks.shown, content);
+																							 }
+																							 if (callbacks.hide) {
+																								 ams.dialog.registerHideCallback(callbacks.hide, content);
+																							 }
+																						 }
+																						 $('<div>').addClass('modal fade')
+																							 .append(content)
+																							 .modal(settings)
+																							 .on('shown', ams.dialog.shown)
+																							 .on('hidden', ams.dialog.hidden);
+																						 ams.initContent && ams.initContent(content);
+																						 if (sourceData.amsLogEvent !== false) {
+																							 ams.stats && ams.stats.logPageview(url);
+																						 }
+																				 }
+																			 }
+																		 });
+															  }
+														  });
+									   });
 		},
 
 		/**
@@ -2554,7 +2629,7 @@
 				}
 			}
 
-			ams.form.setFocus(modal);
+			ams.form && ams.form.setFocus(modal);
 		},
 
 		/**
@@ -2580,7 +2655,7 @@
 		hidden: function(e) {
 			var modal = e.target;
 			// Call registered cleaning callbacks
-			ams.skin.cleanContainer(modal);
+			ams.skin && ams.skin.cleanContainer(modal);
 			// Check for hidden callbacks defined via data API
 			$('[data-ams-hidden-callback]', modal).each(function() {
 				var callback = ams.getFunctionByName($(this).data('ams-hidden-callback'));
@@ -2673,7 +2748,7 @@
 		select2QueryUrlResultsCallback: function(data, page, context) {
 			switch (data.status) {
 				case 'error':
-					ams.skin.messageBox('error', {
+					ams.skin && ams.skin.messageBox('error', {
 						title: ams.i18n.ERROR_OCCURED,
 						content: '<h4>' + data.error_message + '</h4>',
 						icon: "fa fa-warning animated shake",
@@ -2682,7 +2757,7 @@
 					break;
 				case 'modal':
 					$(this).data('select2').dropdown.hide();
-					ams.dialog.open(data.location);
+					ams.dialog && ams.dialog.open(data.location);
 					break;
 				default:
 					return {
@@ -2703,7 +2778,7 @@
 			}
 			switch (result.status) {
 				case 'error':
-					ams.skin.messageBox('error', {
+					ams.skin && ams.skin.messageBox('error', {
 						title: ams.i18n.ERROR_OCCURED,
 						content: '<h4>' + result.error_message + '</h4>',
 						icon: "fa fa-warning animated shake",
@@ -2712,7 +2787,7 @@
 					break;
 				case 'modal':
 					$(this).data('select2').dropdown.hide();
-					ams.dialog.open(result.location);
+					ams.dialog && ams.dialog.open(result.location);
 					break;
 				default:
 					options.callback({
@@ -2737,7 +2812,7 @@
 						ams.getFunctionByName(data.amsSelect2HelperCallback) || function(result) {
 							if (result) {
 								target.html(result);
-								ams.initContent(target);
+								ams.initContent && ams.initContent(target);
 							} else {
 								target.empty();
 							}
@@ -2748,17 +2823,17 @@
 					break;
 				case 'json-rpc':
 					target.html('<div class="text-center"><i class="fa fa-2x fa-gear fa-spin"></i></div>');
-					ams.jsonrpc.post(data.amsSelect2HelperMethod,
-									 {value: source.val()},
-									 {url: data.amsSelect2HelperUrl},
-									 ams.getFunctionByName(data.amsSelect2HelperCallback) || function(result) {
-										if (result.result) {
-											target.html(result.result);
-											ams.initContent(target);
-										} else {
-											target.empty();
-										}
-									 });
+					ams.jsonrpc && ams.jsonrpc.post(data.amsSelect2HelperMethod,
+													{value: source.val()},
+													{url: data.amsSelect2HelperUrl},
+													ams.getFunctionByName(data.amsSelect2HelperCallback) || function(result) {
+															if (result.result) {
+																target.html(result.result);
+																ams.initContent && ams.initContent(target);
+															} else {
+																target.empty();
+															}
+														});
 					break;
 				default:
 					var callback = data.amsSelect2HelperCallback;
@@ -2775,13 +2850,13 @@
 			}
 			var menuData = menu.data();
 			if (menuData.toggle === 'modal') {
-				ams.dialog.open(menu);
+				ams.dialog && ams.dialog.open(menu);
 			} else {
 				var href = menu.attr('href') || menuData.amsUrl;
 				if (!href || href.startsWith('javascript') || menu.attr('target')) {
 					return;
 				}
-				ams.event.stop();
+				ams.event && ams.event.stop();
 				var hrefGetter = ams.getFunctionByName(href);
 				if (typeof(hrefGetter) === 'function') {
 					href = hrefGetter.call(menu, target);
@@ -2795,11 +2870,11 @@
 					href = href.replace(/\%23/, '#');
 					target = menu.data('ams-target');
 					if (target) {
-						ams.form.confirmChangedForm(target, function () {
-							ams.skin.loadURL(href, target, menu.data('ams-link-options'), menu.data('ams-link-callback'));
+						ams.form && ams.form.confirmChangedForm(target, function () {
+							ams.skin && ams.skin.loadURL(href, target, menu.data('ams-link-options'), menu.data('ams-link-callback'));
 						});
 					} else {
-						ams.form.confirmChangedForm(function () {
+						ams.form && ams.form.confirmChangedForm(function () {
 							if (href.startsWith('#')) {
 								if (href !== location.hash) {
 									if (ams.root.hasClass('mobile-view-activated')) {
@@ -2869,6 +2944,8 @@
  */
 (function($, globals) {
 
+	"use strict";
+
 	var ams = globals.MyAMS;
 
 	ams.plugins = {
@@ -2890,7 +2967,7 @@
 			var disabled = [];
 			$('[data-ams-plugins-disabled]', element).each(function() {
 				var plugins = $(this).data('ams-plugins-disabled').split(/\s+/);
-				for (var index=0; index < plugins.length; index++) {
+				for (var index = 0; index < plugins.length; index++) {
 					disabled.push(plugins[index]);
 				}
 			});
@@ -2905,9 +2982,9 @@
 					var plugin = plugins[name];
 					plugin.css = plugin.css || new_plugin.css;
 					plugin.callbacks.push({
-						callback: new_plugin.callback,
-						context: new_plugin.context
-					});
+											  callback: new_plugin.callback,
+											  context: new_plugin.context
+										  });
 					if (new_plugin.register) {
 						plugin.register = true;
 					}
@@ -2935,7 +3012,7 @@
 
 				var source = $(this);
 				var amsPlugins = source.data('ams-plugins');
-				if (typeof(amsPlugins) === 'string') {
+				if (typeof (amsPlugins) === 'string') {
 					var names = source.data('ams-plugins').split(/\s+/);
 					for (var index = 0; index < names.length; index++) {
 						name = names[index];
@@ -2967,7 +3044,7 @@
 				var callbacks = plugin.callbacks,
 					callback;
 				if (callbacks && callbacks.length) {
-					for (index=0; index < callbacks.length; index++) {
+					for (index = 0; index < callbacks.length; index++) {
 						callback = callbacks[index];
 						callback.callback = ams.getFunctionByName(callback.callback);
 						if (plugin.register !== false) {
@@ -2987,7 +3064,7 @@
 				// If running in async mode, newly registered plug-ins are run
 				// before callback is called so we call plug-in manually
 				if ((reload !== true) && callbacks && callbacks.length && (plugin.async !== false)) {
-					for (index=0; index < callbacks.length; index++) {
+					for (index = 0; index < callbacks.length; index++) {
 						callback = callbacks[index];
 						ams.executeFunctionByName(callback.callback, element, callback.context);
 					}
@@ -2998,7 +3075,7 @@
 				// Update context for an already loaded plug-in
 				var enabled = ams.plugins.enabled[name];
 				// Clean all plug-in contexts
-				for (index=0; index < enabled.length; index++) {
+				for (index = 0; index < enabled.length; index++) {
 					var callback = enabled[index];
 					if (callback && callback.context && !ams.isInDOM(callback.context)) {
 						enabled[index] = null;
@@ -3031,14 +3108,14 @@
 				}
 				var callbacks = ams.plugins.enabled[index];
 				if (callbacks) {
-					switch (typeof(callbacks)) {
+					switch (typeof (callbacks)) {
 						case 'function':
 							callbacks(element);
 							break;
 						default:
 							for (var cbIndex = 0; cbIndex < callbacks.length; cbIndex++) {
 								var callback = callbacks[cbIndex];
-								switch (typeof(callback)) {
+								switch (typeof (callback)) {
 									case 'function':
 										callback(element);
 										break;
@@ -3067,7 +3144,7 @@
 					for (var name in data) {
 						if (data.hasOwnProperty(name)) {
 							var elementData = data[name];
-							if (typeof(elementData) !== 'string') {
+							if (typeof (elementData) !== 'string') {
 								elementData = JSON.stringify(elementData);
 							}
 							dataElement.attr('data-' + name, elementData);
@@ -3085,7 +3162,7 @@
 		 * @callback: a callback function which can be called after plug-in registry
 		 */
 		register: function(plugin, name, callback) {
-			if (typeof(name) === 'function') {
+			if (typeof (name) === 'function') {
 				callback = name;
 				name = null;
 			}
@@ -3096,10 +3173,10 @@
 				}
 				return;
 			}
-			if (typeof(plugin) === 'object') {
+			if (typeof (plugin) === 'object') {
 				var src = plugin.src;
 				if (src) {
-					ams.ajax.check(plugin.callback, src, function(first_load) {
+					ams.ajax && ams.ajax.check(plugin.callback, src, function(first_load) {
 						if (first_load) {
 							ams.plugins.enabled[name] = ams.getFunctionByName(plugin.callback);
 							if (plugin.css) {
@@ -3119,7 +3196,7 @@
 						ams.executeFunctionByName(callback);
 					}
 				}
-			} else if (typeof(plugin) === 'function') {
+			} else if (typeof (plugin) === 'function') {
 				ams.plugins.enabled[name] = plugin;
 				if (callback) {
 					ams.executeFunctionByName(callback);
@@ -3128,6 +3205,31 @@
 		}
 	};
 
+	ams.plugins.i18n = {
+		widgets: {},
+		validate: {},
+		datatables: {},
+		fancybox: {
+			ERROR: "Can't load requested content.",
+			RETRY: "Please check URL or try again later.",
+			CLOSE: "Close",
+			NEXT: "Next",
+			PREVIOUS: "Previous"
+		},
+		dndupload: {
+			FILES_SELECTED: '{count} files selected',
+			CHOOSE_FILE: 'Select file(s)',
+			ADD_INFO: 'to add them to current folder,',
+			DRAG_FILE: 'or drag and drop them here!',
+			UPLOAD: 'Upload',
+			UPLOADING: 'Uploading&hellip;',
+			DONE: 'Done!',
+			UPLOAD_MORE: 'Upload more?',
+			ERROR: 'Error!',
+			TRY_AGAIN: 'Try again?'
+		}
+	};
+
 })(jQuery, this);
 
 /**
@@ -3176,10 +3278,10 @@
 					if (width && height) {
 						svg.get(0).setAttribute('viewBox',
 												'0 0 ' + Math.round(parseFloat(width)) + ' ' +
-														 Math.round(parseFloat(height)));
+													Math.round(parseFloat(height)));
 					}
 					svg.attr('width', '100%')
-					   .attr('height', 'auto');
+						.attr('height', 'auto');
 				})
 			}
 		},
@@ -3190,35 +3292,35 @@
 		hint: function(element) {
 			var hints = $('.hint:not(:parents(.nohints))', element);
 			if (hints.length > 0) {
-				ams.ajax.check($.fn.tipsy,
-							   ams.baseURL + 'ext/jquery-tipsy' + ams.devext + '.js',
-							   function() {
-								   ams.getCSS(ams.baseURL + '../css/ext/jquery-tipsy' + ams.devext + '.css',
-											  'jquery-tipsy', function() {
-									   hints.each(function () {
-										   var hint = $(this);
-										   var data = hint.data();
-										   var dataOptions = {
-											   html: data.amsHintHtml === undefined ? (hint.attr('title') || '').startsWith('<') : data.amsHintHtml,
-											   title: ams.getFunctionByName(data.amsHintTitleGetter) || function () {
-												   var hint = $(this);
-												   var result = hint.attr('original-title') ||
-																hint.attr(data.amsHintTitleAttr || 'title') ||
-																(data.amsHintHtml ? hint.html() : hint.text());
-												   result = result.replace(/\?_="/, '?_=' + new Date().getTime() + '"');
-												   return result;
-											   },
-											   opacity: data.amsHintOpacity || 0.95,
-											   gravity: data.amsHintGravity || 'sw',
-											   offset: data.amsHintOffset || 0
-										   };
-										   var settings = $.extend({}, dataOptions, data.amsHintOptions);
-										   settings = ams.executeFunctionByName(data.amsHintInitCallback, hint, settings) || settings;
-										   var plugin = hint.tipsy(settings);
-										   ams.executeFunctionByName(data.amsHintAfterInitCallback, hint, plugin, settings);
-									   });
-								   });
-							   });
+				ams.ajax && ams.ajax.check($.fn.tipsy,
+										   ams.baseURL + 'ext/jquery-tipsy' + ams.devext + '.js',
+										   function() {
+											   ams.getCSS(ams.baseURL + '../css/ext/jquery-tipsy' + ams.devext + '.css',
+														  'jquery-tipsy', function() {
+													   hints.each(function() {
+														   var hint = $(this);
+														   var data = hint.data();
+														   var dataOptions = {
+															   html: data.amsHintHtml === undefined ? (hint.attr('title') || '').startsWith('<') : data.amsHintHtml,
+															   title: ams.getFunctionByName(data.amsHintTitleGetter) || function() {
+																   var hint = $(this);
+																   var result = hint.attr('original-title') ||
+																	   hint.attr(data.amsHintTitleAttr || 'title') ||
+																	   (data.amsHintHtml ? hint.html() : hint.text());
+																   result = result.replace(/\?_="/, '?_=' + new Date().getTime() + '"');
+																   return result;
+															   },
+															   opacity: data.amsHintOpacity || 0.95,
+															   gravity: data.amsHintGravity || 'sw',
+															   offset: data.amsHintOffset || 0
+														   };
+														   var settings = $.extend({}, dataOptions, data.amsHintOptions);
+														   settings = ams.executeFunctionByName(data.amsHintInitCallback, hint, settings) || settings;
+														   var plugin = hint.tipsy(settings);
+														   ams.executeFunctionByName(data.amsHintAfterInitCallback, hint, plugin, settings);
+													   });
+												   });
+										   });
 			}
 		},
 
@@ -3233,7 +3335,7 @@
 					var data = menu.data();
 					var dataOptions = {
 						menuSelector: data.amsContextmenuSelector,
-						menuSelected: ams.helpers.contextMenuHandler
+						menuSelected: ams.helpers && ams.helpers.contextMenuHandler
 					};
 					var settings = $.extend({}, dataOptions, data.amsContextmenuOptions);
 					settings = ams.executeFunctionByName(data.amsContextmenuInitCallback, menu, settings) || settings;
@@ -3255,8 +3357,8 @@
 					$('<i class="fa fa-fw"></i>')
 						.prependTo($(this))
 						.addClass(data.amsSwitcherState === 'open' ?
-								  (data.amsSwitcherMinusClass || 'fa-minus') :
-								  (data.amsSwitcherPlusClass || 'fa-plus'));
+									  (data.amsSwitcherMinusClass || 'fa-minus') :
+									  (data.amsSwitcherPlusClass || 'fa-plus'));
 					legend.on('click', function(e) {
 						e.preventDefault();
 						var veto = {};
@@ -3267,11 +3369,11 @@
 						if (fieldset.hasClass('switched')) {
 							fieldset.removeClass('switched');
 							$('.fa', legend).removeClass(data.amsSwitcherPlusClass || 'fa-plus')
-											.addClass(data.amsSwitcherMinusClass || 'fa-minus');
+								.addClass(data.amsSwitcherMinusClass || 'fa-minus');
 							legend.trigger('ams.switcher.opened', [legend]);
 							var id = legend.attr('id');
 							if (id) {
-								$('legend.switcher[data-ams-switcher-sync="'+id+'"]', fieldset).each(function() {
+								$('legend.switcher[data-ams-switcher-sync="' + id + '"]', fieldset).each(function() {
 									var switcher = $(this);
 									if (switcher.parents('fieldset').hasClass('switched')) {
 										switcher.click();
@@ -3281,7 +3383,7 @@
 						} else {
 							fieldset.addClass('switched');
 							$('.fa', legend).removeClass(data.amsSwitcherMinusClass || 'fa-minus')
-											.addClass(data.amsSwitcherPlusClass || 'fa-plus');
+								.addClass(data.amsSwitcherPlusClass || 'fa-plus');
 							legend.trigger('ams.switcher.closed', [legend]);
 						}
 					});
@@ -3303,7 +3405,7 @@
 				var data = legend.data();
 				if (!data.amsChecker) {
 					var checker = $('<label class="checkbox"></label>');
-					var fieldname = data.amsCheckerFieldname || ('checker_'+ams.generateId());
+					var fieldname = data.amsCheckerFieldname || ('checker_' + ams.generateId());
 					var checkboxId = fieldname.replace(/\./, '_');
 					var prefix = data.amsCheckerHiddenPrefix;
 					var hidden = null;
@@ -3312,19 +3414,19 @@
 					var marker = data.amsCheckerMarker || false;
 					if (prefix) {
 						hidden = $('<input type="hidden">').attr('name', prefix + fieldname)
-														   .val(data.amsCheckerState === 'on' ? checkedValue : uncheckedValue)
-														   .prependTo(legend);
+							.val(data.amsCheckerState === 'on' ? checkedValue : uncheckedValue)
+							.prependTo(legend);
 					} else if (marker) {
 						$('<input type="hidden">').attr('name', marker)
-												  .attr('value', 1)
-												  .prependTo(legend);
+							.attr('value', 1)
+							.prependTo(legend);
 					}
 					var input = $('<input type="checkbox">').attr('name', fieldname)
-															.attr('id', checkboxId)
-															.data('ams-checker-hidden-input', hidden)
-															.data('ams-checker-init', true)
-															.val(data.amsCheckerValue || true)
-															.attr('checked', data.amsCheckerState === 'on' ? 'checked' : null);
+						.attr('id', checkboxId)
+						.data('ams-checker-hidden-input', hidden)
+						.data('ams-checker-init', true)
+						.val(data.amsCheckerValue || true)
+						.attr('checked', data.amsCheckerState === 'on' ? 'checked' : null);
 					if (data.amsCheckerReadonly) {
 						input.attr('disabled', 'disabled');
 					} else {
@@ -3372,7 +3474,7 @@
 					input.appendTo(checker);
 					$('>label', legend).attr('for', input.attr('id'));
 					checker.append('<i></i>')
-						   .prependTo(legend);
+						.prependTo(legend);
 					var required = $('[required]', fieldset);
 					required.attr('data-required', true);
 					if (data.amsCheckerState === 'on') {
@@ -3397,19 +3499,19 @@
 		slider: function(element) {
 			var sliders = $('.slider', element);
 			if (sliders.length > 0) {
-				ams.ajax.check($.fn.slider,
-							   ams.baseURL + 'ext/bootstrap-slider-2.0.0' + ams.devext + '.js',
-							   function() {
-									sliders.each(function() {
-										var slider = $(this);
-										var data = slider.data();
-										var dataOptions = {};
-										var settings = $.extend({}, dataOptions, slider.data.amsSliderOptions);
-										settings = ams.executeFunctionByName(data.amsSliderInitCallback, slider, settings) || settings;
-										var plugin = slider.slider(settings);
-										ams.executeFunctionByName(data.amsSliderAfterInitCallback, slider, plugin, settings);
-									});
-							   });
+				ams.ajax && ams.ajax.check($.fn.slider,
+										   ams.baseURL + 'ext/bootstrap-slider-2.0.0' + ams.devext + '.js',
+										   function() {
+											   sliders.each(function() {
+												   var slider = $(this);
+												   var data = slider.data();
+												   var dataOptions = {};
+												   var settings = $.extend({}, dataOptions, slider.data.amsSliderOptions);
+												   settings = ams.executeFunctionByName(data.amsSliderInitCallback, slider, settings) || settings;
+												   var plugin = slider.slider(settings);
+												   ams.executeFunctionByName(data.amsSliderAfterInitCallback, slider, plugin, settings);
+											   });
+										   });
 			}
 		},
 
@@ -3522,19 +3624,19 @@
 		typeahead: function(element) {
 			var typeaheads = $('.typeahead', element);
 			if (typeaheads.length > 0) {
-				ams.ajax.check($.fn.typeahead,
-							   ams.baseURL + 'ext/jquery-typeahead' + ams.devext + '.js',
-							   function() {
-									typeaheads.each(function() {
-										var input = $(this);
-										var data = input.data();
-										var dataOptions = {};
-										var settings = $.extend({}, dataOptions, data.amsTypeaheadOptions);
-										settings = ams.executeFunctionByName(data.amsTypeaheadInitCallback, input, settings) || settings;
-										var plugin = input.typeahead(settings);
-										ams.executeFunctionByName(data.amsTypeaheadAfterInitCallback, input, plugin, settings);
-									});
-							   });
+				ams.ajax && ams.ajax.check($.fn.typeahead,
+										   ams.baseURL + 'ext/jquery-typeahead' + ams.devext + '.js',
+										   function() {
+											   typeaheads.each(function() {
+												   var input = $(this);
+												   var data = input.data();
+												   var dataOptions = {};
+												   var settings = $.extend({}, dataOptions, data.amsTypeaheadOptions);
+												   settings = ams.executeFunctionByName(data.amsTypeaheadInitCallback, input, settings) || settings;
+												   var plugin = input.typeahead(settings);
+												   ams.executeFunctionByName(data.amsTypeaheadAfterInitCallback, input, plugin, settings);
+											   });
+										   });
 			}
 		},
 
@@ -3544,61 +3646,61 @@
 		treeview: function(element) {
 			var treeviews = $('.treeview', element);
 			if (treeviews.length > 0) {
-				ams.ajax.check($.fn.treview,
-							   ams.baseURL + 'ext/bootstrap-treeview' + ams.devext + '.js',
-							   function() {
-									ams.getCSS(ams.baseURL + '../css/ext/bootstrap-treeview' + ams.devext + '.css',
-											   'bootstrap-treeview',
-											   function() {
-												   treeviews.each(function () {
-													   var treeview = $(this);
-													   var data = treeview.data();
-													   var dataOptions = {
-														   data: data.amsTreeviewData,
-														   levels: data.amsTreeviewLevels,
-														   injectStyle: data.amsTreeviewInjectStyle,
-														   expandIcon: data.amsTreeviewExpandIcon || 'fa fa-fw fa-plus-square-o',
-														   collapseIcon: data.amsTreeviewCollaspeIcon || 'fa fa-fw fa-minus-square-o',
-														   emptyIcon: data.amsTreeviewEmptyIcon || 'fa fa-fw',
-														   nodeIcon: data.amsTreeviewNodeIcon,
-														   selectedIcon: data.amsTreeviewSelectedIcon,
-														   checkedIcon: data.amsTreeviewCheckedIcon || 'fa fa-fw fa-check-square-o',
-														   uncheckedIcon: data.amsTreeviewUncheckedIcon || 'fa fa-fw fa-square-o',
-														   color: data.amsTreeviewColor,
-														   backColor: data.amsTreeviewBackColor,
-														   borderColor: data.amsTreeviewBorderColor,
-														   onHoverColor: data.amsTreeviewHoverColor,
-														   selectedColor: data.amsTreeviewSelectedColor,
-														   selectedBackColor: data.amsTreeviewSelectedBackColor,
-														   unselectableColor: data.amsTreeviewUnselectableColor || 'rgba(1,1,1,0.25)',
-														   unselectableBackColor: data.amsTreeviewUnselectableBackColor || 'rgba(1,1,1,0.25)',
-														   enableLinks: data.amsTreeviewEnableLinks,
-														   highlightSelected: data.amsTreeviewHighlightSelected,
-														   highlightSearchResults: data.amsTreeviewhighlightSearchResults,
-														   showBorder: data.amsTreeviewShowBorder,
-														   showIcon: data.amsTreeviewShowIcon,
-														   showCheckbox: data.amsTreeviewShowCheckbox,
-														   showTags: data.amsTreeviewShowTags,
-														   toggleUnselectable: data.amsTreeviewToggleUnselectable,
-														   multiSelect: data.amsTreeviewMultiSelect,
-														   onNodeChecked: ams.getFunctionByName(data.amsTreeviewNodeChecked),
-														   onNodeCollapsed: ams.getFunctionByName(data.amsTreeviewNodeCollapsed),
-														   onNodeDisabled: ams.getFunctionByName(data.amsTreeviewNodeDisabled),
-														   onNodeEnabled: ams.getFunctionByName(data.amsTreeviewNodeEnabled),
-														   onNodeExpanded: ams.getFunctionByName(data.amsTreeviewNodeExpanded),
-														   onNodeSelected: ams.getFunctionByName(data.amsTreeviewNodeSelected),
-														   onNodeUnchecked: ams.getFunctionByName(data.amsTreeviewNodeUnchecked),
-														   onNodeUnselected: ams.getFunctionByName(data.amsTreeviewNodeUnselected),
-														   onSearchComplete: ams.getFunctionByName(data.amsTreeviewSearchComplete),
-														   onSearchCleared: ams.getFunctionByName(data.amsTreeviewSearchCleared)
-													   };
-													   var settings = $.extend({}, dataOptions, data.amsTreeviewOptions);
-													   settings = ams.executeFunctionByName(data.amsTreeviewInitcallback, treeview, settings) || settings;
-													   var plugin = treeview.treeview(settings);
-													   ams.executeFunctionByName(data.amsTreeviewAfterInitCallback, treeview, plugin, settings);
-												   });
-											   });
-							   });
+				ams.ajax && ams.ajax.check($.fn.treview,
+										   ams.baseURL + 'ext/bootstrap-treeview' + ams.devext + '.js',
+										   function() {
+											   ams.getCSS(ams.baseURL + '../css/ext/bootstrap-treeview' + ams.devext + '.css',
+														  'bootstrap-treeview',
+														  function() {
+															  treeviews.each(function() {
+																  var treeview = $(this);
+																  var data = treeview.data();
+																  var dataOptions = {
+																	  data: data.amsTreeviewData,
+																	  levels: data.amsTreeviewLevels,
+																	  injectStyle: data.amsTreeviewInjectStyle,
+																	  expandIcon: data.amsTreeviewExpandIcon || 'fa fa-fw fa-plus-square-o',
+																	  collapseIcon: data.amsTreeviewCollaspeIcon || 'fa fa-fw fa-minus-square-o',
+																	  emptyIcon: data.amsTreeviewEmptyIcon || 'fa fa-fw',
+																	  nodeIcon: data.amsTreeviewNodeIcon,
+																	  selectedIcon: data.amsTreeviewSelectedIcon,
+																	  checkedIcon: data.amsTreeviewCheckedIcon || 'fa fa-fw fa-check-square-o',
+																	  uncheckedIcon: data.amsTreeviewUncheckedIcon || 'fa fa-fw fa-square-o',
+																	  color: data.amsTreeviewColor,
+																	  backColor: data.amsTreeviewBackColor,
+																	  borderColor: data.amsTreeviewBorderColor,
+																	  onHoverColor: data.amsTreeviewHoverColor,
+																	  selectedColor: data.amsTreeviewSelectedColor,
+																	  selectedBackColor: data.amsTreeviewSelectedBackColor,
+																	  unselectableColor: data.amsTreeviewUnselectableColor || 'rgba(1,1,1,0.25)',
+																	  unselectableBackColor: data.amsTreeviewUnselectableBackColor || 'rgba(1,1,1,0.25)',
+																	  enableLinks: data.amsTreeviewEnableLinks,
+																	  highlightSelected: data.amsTreeviewHighlightSelected,
+																	  highlightSearchResults: data.amsTreeviewhighlightSearchResults,
+																	  showBorder: data.amsTreeviewShowBorder,
+																	  showIcon: data.amsTreeviewShowIcon,
+																	  showCheckbox: data.amsTreeviewShowCheckbox,
+																	  showTags: data.amsTreeviewShowTags,
+																	  toggleUnselectable: data.amsTreeviewToggleUnselectable,
+																	  multiSelect: data.amsTreeviewMultiSelect,
+																	  onNodeChecked: ams.getFunctionByName(data.amsTreeviewNodeChecked),
+																	  onNodeCollapsed: ams.getFunctionByName(data.amsTreeviewNodeCollapsed),
+																	  onNodeDisabled: ams.getFunctionByName(data.amsTreeviewNodeDisabled),
+																	  onNodeEnabled: ams.getFunctionByName(data.amsTreeviewNodeEnabled),
+																	  onNodeExpanded: ams.getFunctionByName(data.amsTreeviewNodeExpanded),
+																	  onNodeSelected: ams.getFunctionByName(data.amsTreeviewNodeSelected),
+																	  onNodeUnchecked: ams.getFunctionByName(data.amsTreeviewNodeUnchecked),
+																	  onNodeUnselected: ams.getFunctionByName(data.amsTreeviewNodeUnselected),
+																	  onSearchComplete: ams.getFunctionByName(data.amsTreeviewSearchComplete),
+																	  onSearchCleared: ams.getFunctionByName(data.amsTreeviewSearchCleared)
+																  };
+																  var settings = $.extend({}, dataOptions, data.amsTreeviewOptions);
+																  settings = ams.executeFunctionByName(data.amsTreeviewInitcallback, treeview, settings) || settings;
+																  var plugin = treeview.treeview(settings);
+																  ams.executeFunctionByName(data.amsTreeviewAfterInitCallback, treeview, plugin, settings);
+															  });
+														  });
+										   });
 			}
 		},
 
@@ -3608,195 +3710,199 @@
 		select2: function(element) {
 			var selects = $('.select2', element);
 			if (selects.length > 0) {
-				ams.ajax.check($.fn.select2,
-							   ams.baseURL + 'ext/jquery-select2-3.5.4' + ams.devext + '.js',
-							   function() {
-									selects.each(function() {
-										var select = $(this);
-										var data = select.data();
-										if (data.select2) {
-											// Already initialized
-											return;
-										}
-										var dataOptions = {
-											placeholder: data.amsSelect2Placeholder,
-											multiple: data.amsSelect2Multiple,
-											minimumInputLength: data.amsSelect2MinimumInputLength || 0,
-											maximumSelectionSize: data.amsSelect2MaximumSelectionSize,
-											openOnEnter: data.amsSelect2EnterOpen === undefined ? true : data.amsSelect2EnterOpen,
-											allowClear: data.amsSelect2AllowClear === undefined ? true : data.amsSelect2AllowClear,
-											width: data.amsSelect2Width || '100%',
-											initSelection: ams.getFunctionByName(data.amsSelect2InitSelection),
-											formatSelection: data.amsSelect2FormatSelection === undefined ?
-																ams.helpers.select2FormatSelection
-																: ams.getFunctionByName(data.amsSelect2FormatSelection),
-											formatResult: ams.getFunctionByName(data.amsSelect2FormatResult),
-											formatMatches: data.amsSelect2FormatMatches === undefined ?
-																function(matches) {
-																	if (matches === 1) {
-																		return ams.i18n.SELECT2_MATCH;
-																	} else {
-																		return matches + ams.i18n.SELECT2_MATCHES;
-																	}
-																}
-																: ams.getFunctionByName(data.amsSelect2FormatMatches),
-											formatNoMatches: data.amsSelect2FormatResult === undefined ?
-																function(term) {
-																	return ams.i18n.SELECT2_NOMATCHES;
-																}
-																: ams.getFunctionByName(data.amsSelect2FormatResult),
-											formatInputTooShort: data.amsSelect2FormatInputTooShort === undefined ?
-																function(input, min) {
-																	var n = min - input.length;
-																	return ams.i18n.SELECT2_INPUT_TOOSHORT
-																					.replace(/\{0\}/, n)
-																					.replace(/\{1\}/, n === 1 ? "" : ams.i18n.SELECT2_PLURAL);
-																}
-																: ams.getFunctionByName(data.amsSelect2FormatInputTooShort),
-											formatInputTooLong: data.amsSelect2FormatInputTooLong === undefined ?
-																function(input, max) {
-																	var n = input.length - max;
-																	return ams.i18n.SELECT2_INPUT_TOOLONG
-																					.replace(/\{0\}/, n)
-																					.replace(/\{1\}/, n === 1 ? "" : ams.i18n.SELECT2_PLURAL);
-																}
-																: ams.getFunctionByName(data.amsSelect2FormatInputTooLong),
-											formatSelectionTooBig: data.amsSelect2FormatSelectionTooBig === undefined ?
-																function(limit) {
-																	return ams.i18n.SELECT2_SELECTION_TOOBIG
-																					.replace(/\{0\}/, limit)
-																					.replace(/\{1\}/, limit === 1 ? "" : ams.i18n.SELECT2_PLURAL);
-																}
-																: ams.getFunctionByName(data.amsSelect2FormatSelectionTooBig),
-											formatLoadMore: data.amsSelect2FormatLoadMore === undefined ?
-																function (pageNumber) {
-																	return ams.i18n.SELECT2_LOADMORE;
-																}
-																: ams.getFunctionByName(data.amsSelect2FormatLoadMore),
-											formatSearching: data.amsSelect2FormatSearching === undefined ?
-																function() {
-																	return ams.i18n.SELECT2_SEARCHING;
-																}
-																: ams.getFunctionByName(data.amsSelect2FormatSearching),
-											separator: data.amsSelect2Separator || ',',
-											tokenSeparators: data.amsSelect2TokensSeparators || [','],
-											tokenizer: ams.getFunctionByName(data.amsSelect2Tokenizer)
-										};
-
-										switch (select.context.type) {
-											case 'text':
-											case 'hidden':
-												if (!dataOptions.initSelection) {
-													var valuesData = select.data('ams-select2-values');
-													if (valuesData) {
-														dataOptions.initSelection = function(element, callback) {
-															var data = [];
-															$(element.val().split(dataOptions.separator)).each(function() {
-																data.push({id: this,
-																		   text: valuesData[this] || this});
-															});
-															callback(data);
-														};
-													}
-												}
-												break;
-											default:
-												break;
-										}
-
-										if (select.attr('readonly')) {
-											if (select.attr('type') === 'hidden') {
-												dataOptions.query = function () {
-													return [];
-												};
-											}
-										} else if (data.amsSelect2Query) {
-											// Custom query method
-											dataOptions.query = ams.getFunctionByName(data.amsSelect2Query);
-											dataOptions.minimumInputLength = data.amsSelect2MinimumInputLength || 1;
-										} else if (data.amsSelect2QueryUrl) {
-											// AJAX query
-											dataOptions.ajax = {
-												url: data.amsSelect2QueryUrl,
-												quietMillis: data.amsSelect2QuietMillis || 200,
-												type: data.amsSelect2QueryType || 'POST',
-												dataType: data.amsSelect2QueryDatatype || 'json',
-												data: function(term, page, context) {
-													var options = {};
-													options[data.amsSelect2QueryParamName || 'query'] = term;
-													options[data.amsSelect2PageParamName || 'page'] = page;
-													options[data.amsSelect2ContextParamName || 'context'] = context;
-													return $.extend({}, options, data.amsSelect2QueryOptions);
-												},
-												results: ams.helpers.select2QueryUrlResultsCallback
-											};
-											dataOptions.minimumInputLength = data.amsSelect2MinimumInputLength || 1;
-										} else if (data.amsSelect2QueryMethod) {
-											// JSON-RPC query
-											dataOptions.query = function(options) {
-												var settings = {
-													id: new Date().getTime(),
-													params: data.amsSelect2QueryParams || {},
-													success: function(result) {
-														return ams.helpers.select2QueryMethodSuccessCallback.call(select, result, 'success', options);
-													},
-													error: ams.error.show
-												};
-												settings.params[data.amsSelect2QueryParamName || 'query'] = options.term;
-												settings.params[data.amsSelect2PageParamName || 'page'] = options.page;
-												settings.params[data.amsSelect2ContextParamName || 'context'] = options.context;
-												settings = $.extend({}, settings, data.amsSelect2QueryOptions);
-												settings = ams.executeFunctionByName(data.amsSelect2QueryInitCallback, select, settings) || settings;
-												ams.ajax.check($.jsonRPC,
-															   ams.baseURL + 'ext/jquery-jsonrpc' + ams.devext + '.js',
-															   function() {
-																	$.jsonRPC.withOptions({
-																		endPoint: data.amsSelect2MethodTarget || ams.jsonrpc.getAddr(),
-																		namespace: data.amsSelect2MethodNamespace,
-																		cache: false
-																	}, function() {
-																		$.jsonRPC.request(data.amsSelect2QueryMethod, settings);
-																	});
-															   });
-											};
-											dataOptions.minimumInputLength = data.amsSelect2MinimumInputLength || 1;
-										} else if (data.amsSelect2Tags) {
-											// Tags mode
-											dataOptions.tags = data.amsSelect2Tags;
-										} else if (data.amsSelect2Data) {
-											// Provided data mode
-											dataOptions.data = data.amsSelect2Data;
-										}
-
-										if (data.amsSelect2EnableFreeTags) {
-											dataOptions.createSearchChoice = function(term) {
-												return {id: term,
-														text: (data.amsSelect2FreeTagsPrefix || ams.i18n.SELECT2_FREETAG_PREFIX) + term};
-											};
-										}
-
-										var settings = $.extend({}, dataOptions, data.amsSelect2Options);
-										settings = ams.executeFunctionByName(data.amsSelect2InitCallback, select, settings) || settings;
-										var plugin = select.select2(settings);
-										ams.executeFunctionByName(data.amsSelect2AfterInitCallback, select, plugin, settings);
-										if (select.hasClass('ordered')) {
-											ams.ajax.check($.fn.select2Sortable,
-														   ams.baseURL + 'ext/jquery-select2-sortable' + ams.devext + '.js',
+				ams.ajax && ams.ajax.check($.fn.select2,
+										   ams.baseURL + 'ext/jquery-select2-3.5.4' + ams.devext + '.js',
+										   function() {
+											   selects.each(function() {
+												   var select = $(this);
+												   var data = select.data();
+												   if (data.select2) {
+													   // Already initialized
+													   return;
+												   }
+												   var dataOptions = {
+													   placeholder: data.amsSelect2Placeholder,
+													   multiple: data.amsSelect2Multiple,
+													   minimumInputLength: data.amsSelect2MinimumInputLength || 0,
+													   maximumSelectionSize: data.amsSelect2MaximumSelectionSize,
+													   openOnEnter: data.amsSelect2EnterOpen === undefined ? true : data.amsSelect2EnterOpen,
+													   allowClear: data.amsSelect2AllowClear === undefined ? true : data.amsSelect2AllowClear,
+													   width: data.amsSelect2Width || '100%',
+													   initSelection: ams.getFunctionByName(data.amsSelect2InitSelection),
+													   formatSelection: data.amsSelect2FormatSelection === undefined
+														   ? ams.helpers && ams.helpers.select2FormatSelection
+														   : ams.getFunctionByName(data.amsSelect2FormatSelection),
+													   formatResult: ams.getFunctionByName(data.amsSelect2FormatResult),
+													   formatMatches: data.amsSelect2FormatMatches === undefined ?
+														   function(matches) {
+															   if (matches === 1) {
+																   return ams.i18n.SELECT2_MATCH;
+															   } else {
+																   return matches + ams.i18n.SELECT2_MATCHES;
+															   }
+														   }
+														   : ams.getFunctionByName(data.amsSelect2FormatMatches),
+													   formatNoMatches: data.amsSelect2FormatResult === undefined ?
+														   function(term) {
+															   return ams.i18n.SELECT2_NOMATCHES;
+														   }
+														   : ams.getFunctionByName(data.amsSelect2FormatResult),
+													   formatInputTooShort: data.amsSelect2FormatInputTooShort === undefined ?
+														   function(input, min) {
+															   var n = min - input.length;
+															   return ams.i18n.SELECT2_INPUT_TOOSHORT
+																   .replace(/\{0\}/, n)
+																   .replace(/\{1\}/, n === 1 ? "" : ams.i18n.SELECT2_PLURAL);
+														   }
+														   : ams.getFunctionByName(data.amsSelect2FormatInputTooShort),
+													   formatInputTooLong: data.amsSelect2FormatInputTooLong === undefined ?
+														   function(input, max) {
+															   var n = input.length - max;
+															   return ams.i18n.SELECT2_INPUT_TOOLONG
+																   .replace(/\{0\}/, n)
+																   .replace(/\{1\}/, n === 1 ? "" : ams.i18n.SELECT2_PLURAL);
+														   }
+														   : ams.getFunctionByName(data.amsSelect2FormatInputTooLong),
+													   formatSelectionTooBig: data.amsSelect2FormatSelectionTooBig === undefined ?
+														   function(limit) {
+															   return ams.i18n.SELECT2_SELECTION_TOOBIG
+																   .replace(/\{0\}/, limit)
+																   .replace(/\{1\}/, limit === 1 ? "" : ams.i18n.SELECT2_PLURAL);
+														   }
+														   : ams.getFunctionByName(data.amsSelect2FormatSelectionTooBig),
+													   formatLoadMore: data.amsSelect2FormatLoadMore === undefined ?
+														   function(pageNumber) {
+															   return ams.i18n.SELECT2_LOADMORE;
+														   }
+														   : ams.getFunctionByName(data.amsSelect2FormatLoadMore),
+													   formatSearching: data.amsSelect2FormatSearching === undefined ?
 														   function() {
-																select.select2Sortable({
-																	bindOrder: 'sortableStop'
-																});
-														   });
-										}
-
-										select.on('change', function() {
-											var validator = $(select.get(0).form).data('validator');
-											if (validator !== undefined) {
-												$(select).valid();
-											}
-										});
-									});
-							   });
+															   return ams.i18n.SELECT2_SEARCHING;
+														   }
+														   : ams.getFunctionByName(data.amsSelect2FormatSearching),
+													   separator: data.amsSelect2Separator || ',',
+													   tokenSeparators: data.amsSelect2TokensSeparators || [','],
+													   tokenizer: ams.getFunctionByName(data.amsSelect2Tokenizer)
+												   };
+
+												   switch (select.context.type) {
+													   case 'text':
+													   case 'hidden':
+														   if (!dataOptions.initSelection) {
+															   var valuesData = select.data('ams-select2-values');
+															   if (valuesData) {
+																   dataOptions.initSelection = function(element, callback) {
+																	   var data = [];
+																	   $(element.val().split(dataOptions.separator)).each(function() {
+																		   data.push({
+																						 id: this,
+																						 text: valuesData[this] || this
+																					 });
+																	   });
+																	   callback(data);
+																   };
+															   }
+														   }
+														   break;
+													   default:
+														   break;
+												   }
+
+												   if (select.attr('readonly')) {
+													   if (select.attr('type') === 'hidden') {
+														   dataOptions.query = function() {
+															   return [];
+														   };
+													   }
+												   } else if (data.amsSelect2Query) {
+													   // Custom query method
+													   dataOptions.query = ams.getFunctionByName(data.amsSelect2Query);
+													   dataOptions.minimumInputLength = data.amsSelect2MinimumInputLength || 1;
+												   } else if (data.amsSelect2QueryUrl) {
+													   // AJAX query
+													   dataOptions.ajax = {
+														   url: data.amsSelect2QueryUrl,
+														   quietMillis: data.amsSelect2QuietMillis || 200,
+														   type: data.amsSelect2QueryType || 'POST',
+														   dataType: data.amsSelect2QueryDatatype || 'json',
+														   data: function(term, page, context) {
+															   var options = {};
+															   options[data.amsSelect2QueryParamName || 'query'] = term;
+															   options[data.amsSelect2PageParamName || 'page'] = page;
+															   options[data.amsSelect2ContextParamName || 'context'] = context;
+															   return $.extend({}, options, data.amsSelect2QueryOptions);
+														   },
+														   results: ams.helpers && ams.helpers.select2QueryUrlResultsCallback
+													   };
+													   dataOptions.minimumInputLength = data.amsSelect2MinimumInputLength || 1;
+												   } else if (data.amsSelect2QueryMethod) {
+													   // JSON-RPC query
+													   dataOptions.query = function(options) {
+														   var settings = {
+															   id: new Date().getTime(),
+															   params: data.amsSelect2QueryParams || {},
+															   success: function(result) {
+																   return ams.helpers && ams.helpers.select2QueryMethodSuccessCallback.call(select, result, 'success', options);
+															   },
+															   error: ams.error && ams.error.show
+														   };
+														   settings.params[data.amsSelect2QueryParamName || 'query'] = options.term;
+														   settings.params[data.amsSelect2PageParamName || 'page'] = options.page;
+														   settings.params[data.amsSelect2ContextParamName || 'context'] = options.context;
+														   settings = $.extend({}, settings, data.amsSelect2QueryOptions);
+														   settings = ams.executeFunctionByName(data.amsSelect2QueryInitCallback, select, settings) || settings;
+														   ams.ajax && ams.ajax.check($.jsonRPC,
+																					  ams.baseURL + 'ext/jquery-jsonrpc' + ams.devext + '.js',
+																					  function() {
+																						  $.jsonRPC.withOptions({
+																													endPoint: data.amsSelect2MethodTarget || (ams.jsonrpc && ams.jsonrpc.getAddr()),
+																													namespace: data.amsSelect2MethodNamespace,
+																													cache: false
+																												}, function() {
+																							  $.jsonRPC.request(data.amsSelect2QueryMethod, settings);
+																						  });
+																					  });
+													   };
+													   dataOptions.minimumInputLength = data.amsSelect2MinimumInputLength || 1;
+												   } else if (data.amsSelect2Tags) {
+													   // Tags mode
+													   dataOptions.tags = data.amsSelect2Tags;
+												   } else if (data.amsSelect2Data) {
+													   // Provided data mode
+													   dataOptions.data = data.amsSelect2Data;
+												   }
+
+												   if (data.amsSelect2EnableFreeTags) {
+													   dataOptions.createSearchChoice = function(term) {
+														   return {
+															   id: term,
+															   text: (data.amsSelect2FreeTagsPrefix || ams.i18n.SELECT2_FREETAG_PREFIX) + term
+														   };
+													   };
+												   }
+
+												   var settings = $.extend({}, dataOptions, data.amsSelect2Options);
+												   settings = ams.executeFunctionByName(data.amsSelect2InitCallback, select, settings) || settings;
+												   var plugin = select.select2(settings);
+												   ams.executeFunctionByName(data.amsSelect2AfterInitCallback, select, plugin, settings);
+												   if (select.hasClass('ordered')) {
+													   ams.ajax && ams.ajax.check($.fn.select2Sortable,
+																				  ams.baseURL + 'ext/jquery-select2-sortable' + ams.devext + '.js',
+																				  function() {
+																					  select.select2Sortable({
+																												 bindOrder: 'sortableStop'
+																											 });
+																				  });
+												   }
+
+												   select.on('change', function() {
+													   var validator = $(select.get(0).form).data('validator');
+													   if (validator !== undefined) {
+														   $(select).valid();
+													   }
+												   });
+											   });
+										   });
 			}
 		},
 
@@ -3806,22 +3912,22 @@
 		maskedit: function(element) {
 			var masks = $('[data-mask]', element);
 			if (masks.length > 0) {
-				ams.ajax.check($.fn.mask,
-							   ams.baseURL + 'ext/jquery-maskedinput-1.4.1' + ams.devext + '.js',
-							   function() {
-									masks.each(function() {
-										var mask = $(this);
-										var data = mask.data();
-										var dataOptions = {
-											placeholder: data.amsMaskeditPlaceholder === undefined ? 'X' : data.amsMaskeditPlaceholder,
-											complete: ams.getFunctionByName(data.amsMaskeditComplete)
-										};
-										var settings = $.extend({}, dataOptions, data.amsMaskeditOptions);
-										settings = ams.executeFunctionByName(data.amsMaskeditInitCallback, mask, settings) || settings;
-										var plugin = mask.mask(mask.attr('data-mask'), settings);
-										ams.executeFunctionByName(data.amsMaskeditAfterInitCallback, mask, plugin, settings);
-									});
-							   });
+				ams.ajax && ams.ajax.check($.fn.mask,
+										   ams.baseURL + 'ext/jquery-maskedinput-1.4.1' + ams.devext + '.js',
+										   function() {
+											   masks.each(function() {
+												   var mask = $(this);
+												   var data = mask.data();
+												   var dataOptions = {
+													   placeholder: data.amsMaskeditPlaceholder === undefined ? 'X' : data.amsMaskeditPlaceholder,
+													   complete: ams.getFunctionByName(data.amsMaskeditComplete)
+												   };
+												   var settings = $.extend({}, dataOptions, data.amsMaskeditOptions);
+												   settings = ams.executeFunctionByName(data.amsMaskeditInitCallback, mask, settings) || settings;
+												   var plugin = mask.mask(mask.attr('data-mask'), settings);
+												   ams.executeFunctionByName(data.amsMaskeditAfterInitCallback, mask, plugin, settings);
+											   });
+										   });
 			}
 		},
 
@@ -3836,26 +3942,26 @@
 		inputmask: function(element) {
 			var masks = $('input[data-input-mask]', element);
 			if (masks.length > 0) {
-				ams.ajax.check($.fn.inputmask,
-							   ams.baseURL + 'ext/jquery-inputmask-bundle-3.2.8' + ams.devext + '.js',
-							   function() {
-									masks.each(function() {
-										var input = $(this);
-										var data = input.data();
-										var dataOptions;
-										if (typeof(data.inputMask) === 'object') {
-											dataOptions = data.inputMask;
-										} else {
-											dataOptions = {
-												mask: data.inputMask.toString()
-											};
-										}
-										var settings = $.extend({}, dataOptions, data.amsInputmaskOptions);
-										settings = ams.executeFunctionByName(data.amsInputmaskInitCallback, input, settings) || settings;
-										var plugin = input.inputmask(settings);
-										ams.executeFunctionByName(data.amsInputmaskAfterInitCallback, input, plugin, settings);
-									});
-							   });
+				ams.ajax && ams.ajax.check($.fn.inputmask,
+										   ams.baseURL + 'ext/jquery-inputmask-bundle-3.2.8' + ams.devext + '.js',
+										   function() {
+											   masks.each(function() {
+												   var input = $(this);
+												   var data = input.data();
+												   var dataOptions;
+												   if (typeof (data.inputMask) === 'object') {
+													   dataOptions = data.inputMask;
+												   } else {
+													   dataOptions = {
+														   mask: data.inputMask.toString()
+													   };
+												   }
+												   var settings = $.extend({}, dataOptions, data.amsInputmaskOptions);
+												   settings = ams.executeFunctionByName(data.amsInputmaskInitCallback, input, settings) || settings;
+												   var plugin = input.inputmask(settings);
+												   ams.executeFunctionByName(data.amsInputmaskAfterInitCallback, input, plugin, settings);
+											   });
+										   });
 			}
 		},
 
@@ -3865,34 +3971,34 @@
 		datepicker: function(element) {
 			var datepickers = $('.datepicker', element);
 			if (datepickers.length > 0) {
-				ams.ajax.check($.fn.datetimepicker,
-							   ams.baseURL + 'ext/jquery-datetimepicker' + ams.devext + '.js',
-							   function(first_load) {
-									if (first_load) {
-										ams.dialog.registerHideCallback(ams.helpers.datetimepickerDialogHiddenCallback);
-									}
-									ams.getCSS(ams.baseURL + '../css/ext/jquery-datetimepicker' + ams.devext + '.css',
-											   'jquery-datetimepicker',
-											   function () {
-												   datepickers.each(function () {
-													   var input = $(this);
-													   var data = input.data();
-													   var dataOptions = {
-														   lang: data.amsDatetimepickerLang || ams.lang,
-														   format: data.amsDatetimepickerFormat || 'd/m/y',
-														   datepicker: true,
-														   dayOfWeekStart: 1,
-														   timepicker: false,
-														   closeOnDateSelect: data.amsDatetimepickerCloseOnSelect === undefined ? true : data.amsDatetimepickerCloseOnSelect,
-														   weeks: data.amsDatetimepickerWeeks
-													   };
-													   var settings = $.extend({}, dataOptions, data.amsDatetimepickerOptions);
-													   settings = ams.executeFunctionByName(data.amsDatetimepickerInitCallback, input, settings) || settings;
-													   var plugin = input.datetimepicker(settings);
-													   ams.executeFunctionByName(data.amsDatetimepickerAfterInitCallback, input, plugin, settings);
-												   });
-											   });
-							   });
+				ams.ajax && ams.ajax.check($.fn.datetimepicker,
+										   ams.baseURL + 'ext/jquery-datetimepicker' + ams.devext + '.js',
+										   function(first_load) {
+											   if (first_load) {
+												   ams.dialog && ams.dialog.registerHideCallback(ams.helpers && ams.helpers.datetimepickerDialogHiddenCallback);
+											   }
+											   ams.getCSS(ams.baseURL + '../css/ext/jquery-datetimepicker' + ams.devext + '.css',
+														  'jquery-datetimepicker',
+														  function() {
+															  datepickers.each(function() {
+																  var input = $(this);
+																  var data = input.data();
+																  var dataOptions = {
+																	  lang: data.amsDatetimepickerLang || ams.lang,
+																	  format: data.amsDatetimepickerFormat || 'd/m/y',
+																	  datepicker: true,
+																	  dayOfWeekStart: 1,
+																	  timepicker: false,
+																	  closeOnDateSelect: data.amsDatetimepickerCloseOnSelect === undefined ? true : data.amsDatetimepickerCloseOnSelect,
+																	  weeks: data.amsDatetimepickerWeeks
+																  };
+																  var settings = $.extend({}, dataOptions, data.amsDatetimepickerOptions);
+																  settings = ams.executeFunctionByName(data.amsDatetimepickerInitCallback, input, settings) || settings;
+																  var plugin = input.datetimepicker(settings);
+																  ams.executeFunctionByName(data.amsDatetimepickerAfterInitCallback, input, plugin, settings);
+															  });
+														  });
+										   });
 			}
 		},
 
@@ -3902,35 +4008,35 @@
 		datetimepicker: function(element) {
 			var datetimepickers = $('.datetimepicker', element);
 			if (datetimepickers.length > 0) {
-				ams.ajax.check($.fn.datetimepicker,
-							   ams.baseURL + 'ext/jquery-datetimepicker' + ams.devext + '.js',
-							   function(first_load) {
-									if (first_load) {
-										ams.dialog.registerHideCallback(ams.helpers.datetimepickerDialogHiddenCallback);
-									}
-									ams.getCSS(ams.baseURL + '../css/ext/jquery-datetimepicker' + ams.devext + '.css',
-											   'jquery-datetimepicker',
-											   function () {
-												   datetimepickers.each(function () {
-													   var input = $(this);
-													   var data = input.data();
-													   var dataOptions = {
-														   lang: data.amsDatetimepickerLang || ams.lang,
-														   format: data.amsDatetimepickerFormat || 'd/m/y H:i',
-														   datepicker: true,
-														   dayOfWeekStart: 1,
-														   timepicker: true,
-														   closeOnDateSelect: data.amsDatetimepickerCloseOnSelect === undefined ? true : data.amsDatetimepickerCloseOnSelect,
-														   closeOnTimeSelect: data.amsDatetimepickerCloseOnSelect === undefined ? true : data.amsDatetimepickerCloseOnSelect,
-														   weeks: data.amsDatetimepickerWeeks
-													   };
-													   var settings = $.extend({}, dataOptions, data.amsDatetimepickerOptions);
-													   settings = ams.executeFunctionByName(data.amsDatetimepickerInitCallback, input, settings) || settings;
-													   var plugin = input.datetimepicker(settings);
-													   ams.executeFunctionByName(data.amsDatetimepickerAfterInitCallback, input, plugin, settings);
-												   });
-											   });
-							   });
+				ams.ajax && ams.ajax.check($.fn.datetimepicker,
+										   ams.baseURL + 'ext/jquery-datetimepicker' + ams.devext + '.js',
+										   function(first_load) {
+											   if (first_load) {
+												   ams.dialog && ams.dialog.registerHideCallback(ams.helpers && ams.helpers.datetimepickerDialogHiddenCallback);
+											   }
+											   ams.getCSS(ams.baseURL + '../css/ext/jquery-datetimepicker' + ams.devext + '.css',
+														  'jquery-datetimepicker',
+														  function() {
+															  datetimepickers.each(function() {
+																  var input = $(this);
+																  var data = input.data();
+																  var dataOptions = {
+																	  lang: data.amsDatetimepickerLang || ams.lang,
+																	  format: data.amsDatetimepickerFormat || 'd/m/y H:i',
+																	  datepicker: true,
+																	  dayOfWeekStart: 1,
+																	  timepicker: true,
+																	  closeOnDateSelect: data.amsDatetimepickerCloseOnSelect === undefined ? true : data.amsDatetimepickerCloseOnSelect,
+																	  closeOnTimeSelect: data.amsDatetimepickerCloseOnSelect === undefined ? true : data.amsDatetimepickerCloseOnSelect,
+																	  weeks: data.amsDatetimepickerWeeks
+																  };
+																  var settings = $.extend({}, dataOptions, data.amsDatetimepickerOptions);
+																  settings = ams.executeFunctionByName(data.amsDatetimepickerInitCallback, input, settings) || settings;
+																  var plugin = input.datetimepicker(settings);
+																  ams.executeFunctionByName(data.amsDatetimepickerAfterInitCallback, input, plugin, settings);
+															  });
+														  });
+										   });
 			}
 		},
 
@@ -3940,32 +4046,32 @@
 		timepicker: function(element) {
 			var timepickers = $('.timepicker', element);
 			if (timepickers.length > 0) {
-				ams.ajax.check($.fn.datetimepicker,
-							   ams.baseURL + 'ext/jquery-datetimepicker' + ams.devext + '.js',
-							   function(first_load) {
-									if (first_load) {
-										ams.dialog.registerHideCallback(ams.helpers.datetimepickerDialogHiddenCallback);
-									}
-									ams.getCSS(ams.baseURL + '../css/ext/jquery-datetimepicker' + ams.devext + '.css',
-											   'jquery-datetimepicker',
-											   function() {
-												   timepickers.each(function () {
-													   var input = $(this);
-													   var data = input.data();
-													   var dataOptions = {
-														   lang: data.amsDatetimepickerLang || ams.lang,
-														   format: data.amsDatetimepickerFormat || 'H:i',
-														   datepicker: false,
-														   timepicker: true,
-														   closeOnTimeSelect: data.amsDatetimepickerCloseOnSelect === undefined ? true : data.amsDatetimepickerCloseOnSelect
-													   };
-													   var settings = $.extend({}, dataOptions, data.amsDatetimepickerOptions);
-													   settings = ams.executeFunctionByName(data.amsDatetimepickerInitCallback, input, settings) || settings;
-													   var plugin = input.datetimepicker(settings);
-													   ams.executeFunctionByName(data.amsDatetimepickerAfterInitCallback, input, plugin, settings);
-												   });
-											   });
-							   });
+				ams.ajax && ams.ajax.check($.fn.datetimepicker,
+										   ams.baseURL + 'ext/jquery-datetimepicker' + ams.devext + '.js',
+										   function(first_load) {
+											   if (first_load) {
+												   ams.dialog && ams.dialog.registerHideCallback(ams.helpers && ams.helpers.datetimepickerDialogHiddenCallback);
+											   }
+											   ams.getCSS(ams.baseURL + '../css/ext/jquery-datetimepicker' + ams.devext + '.css',
+														  'jquery-datetimepicker',
+														  function() {
+															  timepickers.each(function() {
+																  var input = $(this);
+																  var data = input.data();
+																  var dataOptions = {
+																	  lang: data.amsDatetimepickerLang || ams.lang,
+																	  format: data.amsDatetimepickerFormat || 'H:i',
+																	  datepicker: false,
+																	  timepicker: true,
+																	  closeOnTimeSelect: data.amsDatetimepickerCloseOnSelect === undefined ? true : data.amsDatetimepickerCloseOnSelect
+																  };
+																  var settings = $.extend({}, dataOptions, data.amsDatetimepickerOptions);
+																  settings = ams.executeFunctionByName(data.amsDatetimepickerInitCallback, input, settings) || settings;
+																  var plugin = input.datetimepicker(settings);
+																  ams.executeFunctionByName(data.amsDatetimepickerAfterInitCallback, input, plugin, settings);
+															  });
+														  });
+										   });
 			}
 		},
 
@@ -3975,25 +4081,25 @@
 		colorpicker: function(element) {
 			var colorpickers = $('.colorpicker', element);
 			if (colorpickers.length > 0) {
-				ams.ajax.check($.fn.minicolors,
-							   ams.baseURL + 'ext/jquery-minicolors' + ams.devext + '.js',
-							   function() {
-									ams.getCSS(ams.baseURL + '../css/ext/jquery-minicolors' + ams.devext + '.css',
-											   'jquery-minicolors',
-											   function () {
-												   colorpickers.each(function () {
-													   var input = $(this);
-													   var data = input.data();
-													   var dataOptions = {
-														   position: data.amsColorpickerPosition || input.closest('.input').data('ams-colorpicker-position') || 'bottom left'
-													   };
-													   var settings = $.extend({}, dataOptions, data.amsColorpickerOptions);
-													   settings = ams.executeFunctionByName(data.amsColorpickerInitCallback, input, settings) || settings;
-													   var plugin = input.minicolors(settings);
-													   ams.executeFunctionByName(data.amsDatetimepickerAfterInitCallback, input, plugin, settings);
-												   });
-											   });
-							   });
+				ams.ajax && ams.ajax.check($.fn.minicolors,
+										   ams.baseURL + 'ext/jquery-minicolors' + ams.devext + '.js',
+										   function() {
+											   ams.getCSS(ams.baseURL + '../css/ext/jquery-minicolors' + ams.devext + '.css',
+														  'jquery-minicolors',
+														  function() {
+															  colorpickers.each(function() {
+																  var input = $(this);
+																  var data = input.data();
+																  var dataOptions = {
+																	  position: data.amsColorpickerPosition || input.closest('.input').data('ams-colorpicker-position') || 'bottom left'
+																  };
+																  var settings = $.extend({}, dataOptions, data.amsColorpickerOptions);
+																  settings = ams.executeFunctionByName(data.amsColorpickerInitCallback, input, settings) || settings;
+																  var plugin = input.minicolors(settings);
+																  ams.executeFunctionByName(data.amsDatetimepickerAfterInitCallback, input, plugin, settings);
+															  });
+														  });
+										   });
 			}
 		},
 
@@ -4003,27 +4109,27 @@
 		dndupload: function(element) {
 			var uploads = $('.dndupload', element);
 			if (uploads.length > 0) {
-				ams.ajax.check($.fn.dndupload,
-							   ams.baseURL + 'ext/jquery-dndupload' + ams.devext + '.js',
-							   function() {
-									ams.getCSS(ams.baseURL + '../css/ext/jquery-dndupload' + ams.devext + '.css',
-											   'jquery-dndupload',
-											   function () {
-												   uploads.each(function () {
-													   var upload = $(this);
-													   var data = upload.data();
-													   var dataOptions = {
-														   action: data.amsDnduploadAction || upload.attr('action') || 'upload-files',
-														   fieldname: data.amsDnduploadFieldname || 'files',
-														   autosubmit: data.amsDnduploadAutosubmit
-													   };
-													   var settings = $.extend({}, dataOptions, data.amsDnduploadOptions);
-													   settings = ams.executeFunctionByName(data.amsDnduploadInitCallback, upload, settings) || settings;
-													   var plugin = upload.dndupload(settings);
-													   ams.executeFunctionByName(data.amsDnduploadAfterInitcallback, upload, plugin, settings);
-												   });
-											   });
-							   });
+				ams.ajax && ams.ajax.check($.fn.dndupload,
+										   ams.baseURL + 'ext/jquery-dndupload' + ams.devext + '.js',
+										   function() {
+											   ams.getCSS(ams.baseURL + '../css/ext/jquery-dndupload' + ams.devext + '.css',
+														  'jquery-dndupload',
+														  function() {
+															  uploads.each(function() {
+																  var upload = $(this);
+																  var data = upload.data();
+																  var dataOptions = {
+																	  action: data.amsDnduploadAction || upload.attr('action') || 'upload-files',
+																	  fieldname: data.amsDnduploadFieldname || 'files',
+																	  autosubmit: data.amsDnduploadAutosubmit
+																  };
+																  var settings = $.extend({}, dataOptions, data.amsDnduploadOptions);
+																  settings = ams.executeFunctionByName(data.amsDnduploadInitCallback, upload, settings) || settings;
+																  var plugin = upload.dndupload(settings);
+																  ams.executeFunctionByName(data.amsDnduploadAfterInitcallback, upload, plugin, settings);
+															  });
+														  });
+										   });
 			}
 		},
 
@@ -4033,92 +4139,92 @@
 		validate: function(element) {
 			var forms = $('FORM:not([novalidate])', element);
 			if (forms.length > 0) {
-				ams.ajax.check($.fn.validate,
-							   ams.baseURL + 'ext/jquery-validate-1.17.0' + ams.devext + '.js',
-							   function(first_load) {
-									if (first_load) {
-										$.validator.setDefaults({
-											highlight: function(element) {
-												$(element).closest('.form-group, label:not(:parents(.form-group))').addClass('state-error');
-											},
-											unhighlight: function(element) {
-												$(element).closest('.form-group, label:not(:parents(.form-group))').removeClass('state-error');
-											},
-											errorElement: 'span',
-											errorClass: 'state-error',
-											errorPlacement: function(error, element) {
-												var label = element.parents('label:first');
-												if (label.length) {
-													error.insertAfter(label);
-												} else {
-													error.insertAfter(element);
-												}
-											}
-										});
-										if (ams.plugins.i18n) {
-											for (var key in ams.plugins.i18n.validate) {
-												if (!ams.plugins.i18n.validate.hasOwnProperty(key)) {
-													continue;
-												}
-												var message = ams.plugins.i18n.validate[key];
-												if ((typeof(message) === 'string') &&
-													(message.indexOf('{0}') > -1)) {
-													ams.plugins.i18n.validate[key] = $.validator.format(message);
-												}
-											}
-											$.extend($.validator.messages, ams.plugins.i18n.validate);
-										}
-									}
-									forms.each(function() {
-										var form = $(this);
-										var data = form.data();
-										var dataOptions = {
-											ignore: null,
-											submitHandler: form.attr('data-async') !== undefined ?
+				ams.ajax && ams.ajax.check($.fn.validate,
+										   ams.baseURL + 'ext/jquery-validate-1.17.0' + ams.devext + '.js',
+										   function(first_load) {
+											   if (first_load) {
+												   $.validator.setDefaults({
+																			   highlight: function(element) {
+																				   $(element).closest('.form-group, label:not(:parents(.form-group))').addClass('state-error');
+																			   },
+																			   unhighlight: function(element) {
+																				   $(element).closest('.form-group, label:not(:parents(.form-group))').removeClass('state-error');
+																			   },
+																			   errorElement: 'span',
+																			   errorClass: 'state-error',
+																			   errorPlacement: function(error, element) {
+																				   var label = element.parents('label:first');
+																				   if (label.length) {
+																					   error.insertAfter(label);
+																				   } else {
+																					   error.insertAfter(element);
+																				   }
+																			   }
+																		   });
+												   if (ams.plugins && ams.plugins.i18n) {
+													   for (var key in ams.plugins.i18n.validate) {
+														   if (!ams.plugins.i18n.validate.hasOwnProperty(key)) {
+															   continue;
+														   }
+														   var message = ams.plugins.i18n.validate[key];
+														   if ((typeof (message) === 'string') &&
+															   (message.indexOf('{0}') > -1)) {
+															   ams.plugins.i18n.validate[key] = $.validator.format(message);
+														   }
+													   }
+													   $.extend($.validator.messages, ams.plugins.i18n.validate);
+												   }
+											   }
+											   forms.each(function() {
+												   var form = $(this);
+												   var data = form.data();
+												   var dataOptions = {
+													   ignore: null,
+													   submitHandler: form.attr('data-async') !== undefined ?
 														   data.amsFormSubmitHandler === undefined ?
-																function() {
-																	// JQuery-form plug-in must be loaded synchronously!!
-																	// Otherwise, hidden input fields created by jquery-validate plug-in
-																	// and matching named buttons will be deleted (on first form submit)
-																	// before JQuery-form plug-in can get them when submitting the form...
-																	$('.state-error', form).removeClass('state-error');
-																	ams.ajax.check($.fn.ajaxSubmit,
-																				   ams.baseURL + 'ext/jquery-form-3.49' + ams.devext + '.js');
-																	return ams.form.submit(form);
-																}
-																: ams.getFunctionByName(data.amsFormSubmitHandler)
+															   function() {
+																   // JQuery-form plug-in must be loaded synchronously!!
+																   // Otherwise, hidden input fields created by jquery-validate plug-in
+																   // and matching named buttons will be deleted (on first form submit)
+																   // before JQuery-form plug-in can get them when submitting the form...
+																   $('.state-error', form).removeClass('state-error');
+																   ams.ajax && ams.ajax.check($.fn.ajaxSubmit,
+																							  ams.baseURL + 'ext/jquery-form-3.49' + ams.devext + '.js');
+																   return ams.form && ams.form.submit(form);
+															   }
+															   : ams.getFunctionByName(data.amsFormSubmitHandler)
 														   : undefined,
-											invalidHandler: form.attr('data-async') !== undefined ?
-															data.amsFormInvalidHandler === undefined ?
-																function(event, validator) {
-																	$('.state-error', form).removeClass('state-error');
-																	for (var index=0; index < validator.errorList.length; index++) {
-																		var error = validator.errorList[index];
-																		var tabIndex = $(error.element).parents('.tab-pane').index() + 1;
-																		if (tabIndex > 0) {
-																			var navTabs = $('.nav-tabs', $(error.element).parents('.tabforms'));
-																			$('li:nth-child(' + tabIndex + ')', navTabs)
-																					.removeClassPrefix('state-')
-																					.addClass('state-error');
-																			$('li.state-error:first a', navTabs).click();
-																		}
-																	}
-																}
-																: ams.getFunctionByName(data.amsFormInvalidHandler)
-															: undefined
-										};
-										$('[data-ams-validate-rules]', form).each(function(index) {
-											if (index === 0) {
-												dataOptions.rules = {};
-											}
-											dataOptions.rules[$(this).attr('name')] = $(this).data('ams-validate-rules');
-										});
-										var settings = $.extend({}, dataOptions, data.amsValidateOptions);
-										settings = ams.executeFunctionByName(data.amsValidateInitCallback, form, settings) || settings;
-										var plugin = form.validate(settings);
-										ams.executeFunctionByName(data.amsValidateAfterInitCallback, form, plugin, settings);
-									});
-							   });
+													   invalidHandler: form.attr('data-async') !== undefined ?
+														   data.amsFormInvalidHandler === undefined ?
+															   function(event, validator) {
+																   $('.state-error', form).removeClass('state-error');
+																   for (var index = 0; index < validator.errorList.length; index++) {
+																	   var error = validator.errorList[index];
+																	   var tabIndex = $(error.element).parents('.tab-pane').index() + 1;
+																	   if (tabIndex > 0) {
+																		   var navTabs = $('.nav-tabs', $(error.element).parents('.tabforms'));
+																		   $('li:nth-child(' + tabIndex + ')', navTabs)
+																			   .removeClassPrefix('state-')
+																			   .addClass('state-error');
+																		   $('li.state-error:first a', navTabs).click();
+																	   }
+																   }
+															   }
+															   : ams.getFunctionByName(data.amsFormInvalidHandler)
+														   : undefined
+												   };
+												   $('[data-ams-validate-rules]', form).each(function(index) {
+													   if (index === 0) {
+														   dataOptions.rules = {};
+													   }
+													   dataOptions.rules[$(this).attr('name')] = $(this).data('ams-validate-rules');
+												   });
+												   var settings = $.extend({}, dataOptions, data.amsValidateOptions);
+												   settings = ams.executeFunctionByName(data.amsValidateInitCallback, form, settings) || settings;
+												   var plugin = form.validate(settings);
+												   ams.executeFunctionByName(data.amsValidateAfterInitCallback, form, plugin, settings);
+											   });
+										   });
 			}
 		},
 
@@ -4128,258 +4234,257 @@
 		datatable: function(element) {
 			var tables = $('.datatable', element);
 			if (tables.length > 0) {
-				ams.ajax.check($.fn.dataTable,
-							   ams.baseURL + 'ext/jquery-dataTables-1.9.4' + ams.devext + '.js',
-							   function() {
-									ams.ajax.check($.fn.dataTableExt.oPagination.bootstrap_full,
-												   ams.baseURL + 'myams-dataTables' + ams.devext + '.js',
-												   function() {
-													   $(tables).each(function () {
-														   var table = $(this);
-														   var data = table.data();
-														   var extensions = (data.amsDatatableExtensions || '').split(/\s+/);
-														   // Check DOM elements
-														   var sDom = data.amsDatatableSdom ||
-															   "W" +
-															   ((extensions.indexOf('colreorder') >= 0 ||
-															   extensions.indexOf('colreorderwithresize') >= 0) ? 'R' : '') +
-															   "<'dt-top-row'" +
-															   (extensions.indexOf('colvis') >= 0 ? 'C' : '') +
-															   ((data.amsDatatablePagination === false ||
-															   data.amsDatatablePaginationSize === false) ? '' : 'L') +
-															   (data.amsDatatableGlobalFilter === false ? '' : 'F') +
-															   ">r<'dt-wrapper't" +
-															   (extensions.indexOf('scroller') >= 0 ? 'S' : '') +
-															   "><'dt-row dt-bottom-row'<'row'<'col-sm-6'" +
-															   (data.amsDatatableInformation === false ? '' : 'i') +
-															   "><'col-sm-6 text-right'p>>";
-
-														   var index;
-														   // Check initial sorting
-														   var sorting = data.amsDatatableSorting;
-														   if (typeof(sorting) === 'string') {
-															   var sortings = sorting.split(';');
-															   sorting = [];
-															   for (index = 0; index < sortings.length; index++) {
-																   var colSorting = sortings[index].split(',');
-																   colSorting[0] = parseInt(colSorting[0]);
-																   sorting.push(colSorting);
-															   }
-														   }
-														   // Check columns sortings
-														   var columns = [];
-														   var column;
-														   var sortables = $('th', table).listattr('data-ams-datatable-sortable');
-														   for (index = 0; index < sortables.length; index++) {
-															   var sortable = sortables[index];
-															   if (sortable !== undefined) {
-																   column = columns[index] || {};
-																   column.bSortable = typeof(sortable) === 'string' ? JSON.parse(sortable) : sortable;
-																   columns[index] = column;
-															   } else {
-																   columns[index] = columns[index] || {};
-															   }
-														   }
-														   // Check columns types
-														   var sortTypes = $('th', table).listattr('data-ams-datatable-stype');
-														   for (index = 0; index < sortTypes.length; index++) {
-															   var sortType = sortTypes[index];
-															   if (sortType) {
-																   column = columns[index] || {};
-																   column.sType = sortType;
-																   columns[index] = column;
-															   } else {
-																   columns[index] = columns[index] || {};
-															   }
-														   }
-														   // Set options
-														   var dataOptions = {
-															   bJQueryUI: false,
-															   bServerSide: data.amsDatatableServerSide || false,
-															   sAjaxSource: data.amsDatatableServerSide === true ? data.amsDatatableAjaxSource : undefined,
-															   sServerMethod: data.amsDatatableServerSide === true ? 'POST' : undefined,
-															   bFilter: data.amsDatatableGlobalFilter !== false || extensions.indexOf('columnfilter') >= 0,
-															   bPaginate: data.amsDatatablePagination !== false,
-															   bInfo: data.amsDatatableInfo !== false,
-															   bSort: data.amsDatatableSort !== false,
-															   aaSorting: sorting,
-															   aoColumns: columns.length > 0 ? columns : undefined,
-															   bDeferRender: true,
-															   bAutoWidth: false,
-															   iDisplayLength: data.amsDatatableDisplayLength || 25,
-															   sPaginationType: data.amsDatatablePaginationType || 'bootstrap_full',
-															   sDom: sDom,
-															   oLanguage: ams.plugins.i18n.datatables,
-															   fnInitComplete: function (oSettings, json) {
-																   $('.ColVis_Button').addClass('btn btn-default btn-sm')
-																	   .html((ams.plugins.i18n.datatables.sColumns || "Columns") +
-																			 ' <i class="fa fa-fw fa-caret-down"></i>');
-															   }
-														   };
-														   var settings = $.extend({}, dataOptions, data.amsDatatableOptions);
-														   var checkers = [];
-														   var sources = [];
-														   var callbacks = [];
-														   if (extensions.length > 0) {
-															   for (index = 0; index < extensions.length; index++) {
-																   switch (extensions[index]) {
-																	   case 'autofill':
-																		   checkers.push($.fn.dataTable.AutoFill);
-																		   sources.push(ams.baseURL + 'ext/jquery-dataTables-autoFill' + ams.devext + '.js');
-																		   break;
-																	   case 'columnfilter':
-																		   checkers.push($.fn.columnFilter);
-																		   sources.push(ams.baseURL + 'ext/jquery-dataTables-columnFilter' + ams.devext + '.js');
-																		   break;
-																	   case 'colreorder':
-																		   checkers.push($.fn.dataTable.ColReorder);
-																		   sources.push(ams.baseURL + 'ext/jquery-dataTables-colReorder' + ams.devext + '.js');
-																		   break;
-																	   case 'colreorderwithresize':
-																		   checkers.push(window.ColReorder);
-																		   sources.push(ams.baseURL + 'ext/jquery-dataTables-colReorderWithResize' + ams.devext + '.js');
-																		   break;
-																	   case 'colvis':
-																		   checkers.push($.fn.dataTable.ColVis);
-																		   sources.push(ams.baseURL + 'ext/jquery-dataTables-colVis' + ams.devext + '.js');
-																		   callbacks.push(function () {
-																			   var cvDefault = {
-																				   activate: 'click',
-																				   sAlign: 'right'
-																			   };
-																			   settings.oColVis = $.extend({}, cvDefault, data.amsDatatableColvisOptions);
-																		   });
-																		   break;
-																	   case 'editable':
-																		   checkers.push($.fn.editable);
-																		   sources.push(ams.baseURL + 'ext/jquery-jeditable' + ams.devext + '.js');
-																		   checkers.push($.fn.makeEditable);
-																		   sources.push(ams.baseURL + 'ext/jquery-dataTables-editable' + ams.devext + '.js');
-																		   break;
-																	   case 'fixedcolumns':
-																		   checkers.push($.fn.dataTable.FixedColumns);
-																		   sources.push(ams.baseURL + 'ext/jquery-dataTables-fixedColumns' + ams.devext + '.js');
-																		   break;
-																	   case 'fixedheader':
-																		   checkers.push($.fn.dataTable.Fixedheader);
-																		   sources.push(ams.baseURL + 'ext/jquery-dataTables-fixedHeader' + ams.devext + '.js');
-																		   break;
-																	   case 'keytable':
-																		   checkers.push(window.keyTable);
-																		   sources.push(ams.baseURL + 'ext/jquery-dataTables-keyTable' + ams.devext + '.js');
-																		   break;
-																	   case 'rowgrouping':
-																		   checkers.push($.fn.rowGrouping);
-																		   sources.push(ams.baseURL + 'ext/jquery-dataTables-rowGrouping' + ams.devext + '.js');
-																		   break;
-																	   case 'rowreordering':
-																		   checkers.push($.fn.rowReordering);
-																		   sources.push(ams.baseURL + 'ext/jquery-dataTables-rowReordering' + ams.devext + '.js');
-																		   break;
-																	   case 'scroller':
-																		   checkers.push($.fn.dataTable.Scroller);
-																		   sources.push(ams.baseURL + 'ext/jquery-dataTables-scroller' + ams.devext + '.js');
-																		   break;
-																	   default:
-																		   break;
-																   }
-															   }
-														   }
-
-														   function initTable() {
-															   settings = ams.executeFunctionByName(data.amsDatatableInitCallback, table, settings) || settings;
-															   try {  // Some settings can easily generate DataTables exceptions...
-																   var plugin = table.dataTable(settings);
-																   ams.executeFunctionByName(data.amsDatatableAfterInitCallback, table, plugin, settings);
-																   if (extensions.length > 0) {
-																	   for (index = 0; index < extensions.length; index++) {
-																		   switch (extensions[index]) {
-																			   case 'autofill':
-																				   var afSettings = $.extend({}, data.amsDatatableAutofillOptions, settings.autofill);
-																				   afSettings = ams.executeFunctionByName(data.amsDatatableAutofillInitCallback, table, afSettings) || afSettings;
-																				   table.data('ams-autofill', data.amsDatatableAutofillConstructor === undefined ?
-																					   new $.fn.dataTable.AutoFill(table, afSettings)
-																					   : ams.executeFunctionByName(data.amsDatatableAutofillConstructor, table, plugin, afSettings));
-																				   break;
-																			   case 'columnfilter':
-																				   var cfDefault = {
-																					   sPlaceHolder: 'head:after'
-																				   };
-																				   var cfSettings = $.extend({}, cfDefault, data.amsDatatableColumnfilterOptions, settings.columnfilter);
-																				   cfSettings = ams.executeFunctionByName(data.amsDatatableColumnfilterInitCallback, table, cfSettings) || cfSettings;
-																				   table.data('ams-columnfilter', data.amsDatatableColumnfilterConstructor === undefined ?
-																					   plugin.columnFilter(cfSettings)
-																					   : ams.executeFunctionByName(data.amsDatatableColumnfilterConstructor, table, plugin, cfSettings));
-																				   break;
-																			   case 'editable':
-																				   var edSettings = $.extend({}, data.amsDatatableEditableOptions, settings.editable);
-																				   edSettings = ams.executeFunctionByName(data.amsDatatableEditableInitCallback, table, edSettings) || edSettings;
-																				   table.data('ams-editable', data.amsDatatableEditableConstructor === undefined ?
-																					   table.makeEditable(edSettings)
-																					   : ams.executeFunctionByName(data.amsDatatableEditableConstructor, table, plugin, edSettings));
-																				   break;
-																			   case 'fixedcolumns':
-																				   var fcSettings = $.extend({}, data.amsDatatableFixedcolumnsOptions, settings.fixedcolumns);
-																				   fcSettings = ams.executeFunctionByName(data.amsDatatableFixedcolumnsInitCallback, table, fcSettings) || fcSettings;
-																				   table.data('ams-fixedcolumns', data.amsDatatableFixedcolumnsConstructor === undefined ?
-																					   new $.fn.dataTable.FixedColumns(table, fcSettings)
-																					   : ams.executeFunctionByName(data.amsDatatableFixedcolumnsConstructor, table, plugin, fcSettings));
-																				   break;
-																			   case 'fixedheader':
-																				   var fhSettings = $.extend({}, data.amsDatatableFixedheaderOptions, settings.fixedheader);
-																				   fhSettings = ams.executeFunctionByName(data.amsDatatableFixedheadeInitCallback, table, fhSettings) || fhSettings;
-																				   table.data('ams-fixedheader', data.amsDatatableFixedheaderConstructor === undefined ?
-																					   new $.fn.dataTable.FixedHeader(table, fhSettings)
-																					   : ams.executeFunctionByName(data.amsDatatableFixedheaderConstructor, table, plugin, fhSettings));
-																				   break;
-																			   case 'keytable':
-																				   var ktDefault = {
-																					   table: table.get(0),
-																					   datatable: plugin
-																				   };
-																				   var ktSettings = $.extend({}, ktDefault, data.amsDatatableKeytableOptions, settings.keytable);
-																				   ktSettings = ams.executeFunctionByName(data.amsDatatableKeytableInitCallback, table, ktSettings) || ktSettings;
-																				   table.data('ams-keytable', data.amsDatatableKeytableConstructor === undefined ?
-																					   new KeyTable(ktSettings)
-																					   : ams.executeFunctionByName(data.amsDatatableKeytableConstructor, table, plugin, ktSettings));
-																				   break;
-																			   case 'rowgrouping':
-																				   var rgSettings = $.extend({}, data.amsDatatableRowgroupingOptions, settings.rowgrouping);
-																				   rgSettings = ams.executeFunctionByName(data.amsDatatableRowgroupingInitCallback, table, rgSettings) || rgSettings;
-																				   table.data('ams-rowgrouping', data.amsDatatableRowgroupingConstructor === undefined ?
-																					   table.rowGrouping(rgSettings)
-																					   : ams.executeFunctionByName(data.amsDatatableRowgroupingConstructor, table, plugin, rgSettings));
-																				   break;
-																			   case 'rowreordering':
-																				   var rrSettings = $.extend({}, data.amsDatatableRowreorderingOptions, settings.rowreordering);
-																				   rrSettings = ams.executeFunctionByName(data.amsDatatableRowreorderingInitCallback, table, rrSettings) || rrSettings;
-																				   table.data('ams-rowreordering', data.amsDatatableRowreorderingConstructor === undefined ?
-																					   table.rowReordering(rrSettings)
-																					   : ams.executeFunctionByName(data.amsDatatableRowreorderingConstructor, table, plugin, rrSettings));
-																				   break;
-																			   default:
-																				   break;
-																		   }
-																	   }
-																   }
-																   if (data.amsDatatableFinalizeCallback) {
-																	   var finalizers = data.amsDatatableFinalizeCallback.split(/\s+/);
-																	   if (finalizers.length > 0) {
-																		   for (index = 0; index < finalizers.length; index++) {
-																			   ams.executeFunctionByName(finalizers[index], table, plugin, settings);
-																		   }
-																	   }
-																   }
-															   }
-															   catch (e) {
-															   }
-														   }
-
-														   callbacks.push(initTable);
-														   ams.ajax.check(checkers, sources, callbacks);
-													   });
-												   });
-							   });
+				ams.ajax && ams.ajax.check($.fn.dataTable,
+										   ams.baseURL + 'ext/jquery-dataTables-1.9.4' + ams.devext + '.js',
+										   function() {
+											   ams.ajax.check($.fn.dataTableExt.oPagination.bootstrap_full,
+															  ams.baseURL + 'myams-dataTables' + ams.devext + '.js',
+															  function() {
+																  $(tables).each(function() {
+																	  var table = $(this);
+																	  var data = table.data();
+																	  var extensions = (data.amsDatatableExtensions || '').split(/\s+/);
+																	  // Check DOM elements
+																	  var sDom = data.amsDatatableSdom ||
+																		  "W" +
+																		  ((extensions.indexOf('colreorder') >= 0 ||
+																			  extensions.indexOf('colreorderwithresize') >= 0) ? 'R' : '') +
+																		  "<'dt-top-row'" +
+																		  (extensions.indexOf('colvis') >= 0 ? 'C' : '') +
+																		  ((data.amsDatatablePagination === false ||
+																			  data.amsDatatablePaginationSize === false) ? '' : 'L') +
+																		  (data.amsDatatableGlobalFilter === false ? '' : 'F') +
+																		  ">r<'dt-wrapper't" +
+																		  (extensions.indexOf('scroller') >= 0 ? 'S' : '') +
+																		  "><'dt-row dt-bottom-row'<'row'<'col-sm-6'" +
+																		  (data.amsDatatableInformation === false ? '' : 'i') +
+																		  "><'col-sm-6 text-right'p>>";
+
+																	  var index;
+																	  // Check initial sorting
+																	  var sorting = data.amsDatatableSorting;
+																	  if (typeof (sorting) === 'string') {
+																		  var sortings = sorting.split(';');
+																		  sorting = [];
+																		  for (index = 0; index < sortings.length; index++) {
+																			  var colSorting = sortings[index].split(',');
+																			  colSorting[0] = parseInt(colSorting[0]);
+																			  sorting.push(colSorting);
+																		  }
+																	  }
+																	  // Check columns sortings
+																	  var columns = [];
+																	  var column;
+																	  var sortables = $('th', table).listattr('data-ams-datatable-sortable');
+																	  for (index = 0; index < sortables.length; index++) {
+																		  var sortable = sortables[index];
+																		  if (sortable !== undefined) {
+																			  column = columns[index] || {};
+																			  column.bSortable = typeof (sortable) === 'string' ? JSON.parse(sortable) : sortable;
+																			  columns[index] = column;
+																		  } else {
+																			  columns[index] = columns[index] || {};
+																		  }
+																	  }
+																	  // Check columns types
+																	  var sortTypes = $('th', table).listattr('data-ams-datatable-stype');
+																	  for (index = 0; index < sortTypes.length; index++) {
+																		  var sortType = sortTypes[index];
+																		  if (sortType) {
+																			  column = columns[index] || {};
+																			  column.sType = sortType;
+																			  columns[index] = column;
+																		  } else {
+																			  columns[index] = columns[index] || {};
+																		  }
+																	  }
+																	  // Set options
+																	  var dataOptions = {
+																		  bJQueryUI: false,
+																		  bServerSide: data.amsDatatableServerSide || false,
+																		  sAjaxSource: data.amsDatatableServerSide === true ? data.amsDatatableAjaxSource : undefined,
+																		  sServerMethod: data.amsDatatableServerSide === true ? 'POST' : undefined,
+																		  bFilter: data.amsDatatableGlobalFilter !== false || extensions.indexOf('columnfilter') >= 0,
+																		  bPaginate: data.amsDatatablePagination !== false,
+																		  bInfo: data.amsDatatableInfo !== false,
+																		  bSort: data.amsDatatableSort !== false,
+																		  aaSorting: sorting,
+																		  aoColumns: columns.length > 0 ? columns : undefined,
+																		  bDeferRender: true,
+																		  bAutoWidth: false,
+																		  iDisplayLength: data.amsDatatableDisplayLength || 25,
+																		  sPaginationType: data.amsDatatablePaginationType || 'bootstrap_full',
+																		  sDom: sDom,
+																		  oLanguage: ams.plugins && ams.plugins.i18n.datatables,
+																		  fnInitComplete: function(oSettings, json) {
+																			  $('.ColVis_Button').addClass('btn btn-default btn-sm')
+																				  .html(((ams.plugins && ams.plugins.i18n.datatables.sColumns) || "Columns") +
+																							' <i class="fa fa-fw fa-caret-down"></i>');
+																		  }
+																	  };
+																	  var settings = $.extend({}, dataOptions, data.amsDatatableOptions);
+																	  var checkers = [];
+																	  var sources = [];
+																	  var callbacks = [];
+																	  if (extensions.length > 0) {
+																		  for (index = 0; index < extensions.length; index++) {
+																			  switch (extensions[index]) {
+																				  case 'autofill':
+																					  checkers.push($.fn.dataTable.AutoFill);
+																					  sources.push(ams.baseURL + 'ext/jquery-dataTables-autoFill' + ams.devext + '.js');
+																					  break;
+																				  case 'columnfilter':
+																					  checkers.push($.fn.columnFilter);
+																					  sources.push(ams.baseURL + 'ext/jquery-dataTables-columnFilter' + ams.devext + '.js');
+																					  break;
+																				  case 'colreorder':
+																					  checkers.push($.fn.dataTable.ColReorder);
+																					  sources.push(ams.baseURL + 'ext/jquery-dataTables-colReorder' + ams.devext + '.js');
+																					  break;
+																				  case 'colreorderwithresize':
+																					  checkers.push(window.ColReorder);
+																					  sources.push(ams.baseURL + 'ext/jquery-dataTables-colReorderWithResize' + ams.devext + '.js');
+																					  break;
+																				  case 'colvis':
+																					  checkers.push($.fn.dataTable.ColVis);
+																					  sources.push(ams.baseURL + 'ext/jquery-dataTables-colVis' + ams.devext + '.js');
+																					  callbacks.push(function() {
+																						  var cvDefault = {
+																							  activate: 'click',
+																							  sAlign: 'right'
+																						  };
+																						  settings.oColVis = $.extend({}, cvDefault, data.amsDatatableColvisOptions);
+																					  });
+																					  break;
+																				  case 'editable':
+																					  checkers.push($.fn.editable);
+																					  sources.push(ams.baseURL + 'ext/jquery-jeditable' + ams.devext + '.js');
+																					  checkers.push($.fn.makeEditable);
+																					  sources.push(ams.baseURL + 'ext/jquery-dataTables-editable' + ams.devext + '.js');
+																					  break;
+																				  case 'fixedcolumns':
+																					  checkers.push($.fn.dataTable.FixedColumns);
+																					  sources.push(ams.baseURL + 'ext/jquery-dataTables-fixedColumns' + ams.devext + '.js');
+																					  break;
+																				  case 'fixedheader':
+																					  checkers.push($.fn.dataTable.Fixedheader);
+																					  sources.push(ams.baseURL + 'ext/jquery-dataTables-fixedHeader' + ams.devext + '.js');
+																					  break;
+																				  case 'keytable':
+																					  checkers.push(window.keyTable);
+																					  sources.push(ams.baseURL + 'ext/jquery-dataTables-keyTable' + ams.devext + '.js');
+																					  break;
+																				  case 'rowgrouping':
+																					  checkers.push($.fn.rowGrouping);
+																					  sources.push(ams.baseURL + 'ext/jquery-dataTables-rowGrouping' + ams.devext + '.js');
+																					  break;
+																				  case 'rowreordering':
+																					  checkers.push($.fn.rowReordering);
+																					  sources.push(ams.baseURL + 'ext/jquery-dataTables-rowReordering' + ams.devext + '.js');
+																					  break;
+																				  case 'scroller':
+																					  checkers.push($.fn.dataTable.Scroller);
+																					  sources.push(ams.baseURL + 'ext/jquery-dataTables-scroller' + ams.devext + '.js');
+																					  break;
+																				  default:
+																					  break;
+																			  }
+																		  }
+																	  }
+
+																	  function initTable() {
+																		  settings = ams.executeFunctionByName(data.amsDatatableInitCallback, table, settings) || settings;
+																		  try {  // Some settings can easily generate DataTables exceptions...
+																			  var plugin = table.dataTable(settings);
+																			  ams.executeFunctionByName(data.amsDatatableAfterInitCallback, table, plugin, settings);
+																			  if (extensions.length > 0) {
+																				  for (index = 0; index < extensions.length; index++) {
+																					  switch (extensions[index]) {
+																						  case 'autofill':
+																							  var afSettings = $.extend({}, data.amsDatatableAutofillOptions, settings.autofill);
+																							  afSettings = ams.executeFunctionByName(data.amsDatatableAutofillInitCallback, table, afSettings) || afSettings;
+																							  table.data('ams-autofill', data.amsDatatableAutofillConstructor === undefined ?
+																								  new $.fn.dataTable.AutoFill(table, afSettings)
+																								  : ams.executeFunctionByName(data.amsDatatableAutofillConstructor, table, plugin, afSettings));
+																							  break;
+																						  case 'columnfilter':
+																							  var cfDefault = {
+																								  sPlaceHolder: 'head:after'
+																							  };
+																							  var cfSettings = $.extend({}, cfDefault, data.amsDatatableColumnfilterOptions, settings.columnfilter);
+																							  cfSettings = ams.executeFunctionByName(data.amsDatatableColumnfilterInitCallback, table, cfSettings) || cfSettings;
+																							  table.data('ams-columnfilter', data.amsDatatableColumnfilterConstructor === undefined ?
+																								  plugin.columnFilter(cfSettings)
+																								  : ams.executeFunctionByName(data.amsDatatableColumnfilterConstructor, table, plugin, cfSettings));
+																							  break;
+																						  case 'editable':
+																							  var edSettings = $.extend({}, data.amsDatatableEditableOptions, settings.editable);
+																							  edSettings = ams.executeFunctionByName(data.amsDatatableEditableInitCallback, table, edSettings) || edSettings;
+																							  table.data('ams-editable', data.amsDatatableEditableConstructor === undefined ?
+																								  table.makeEditable(edSettings)
+																								  : ams.executeFunctionByName(data.amsDatatableEditableConstructor, table, plugin, edSettings));
+																							  break;
+																						  case 'fixedcolumns':
+																							  var fcSettings = $.extend({}, data.amsDatatableFixedcolumnsOptions, settings.fixedcolumns);
+																							  fcSettings = ams.executeFunctionByName(data.amsDatatableFixedcolumnsInitCallback, table, fcSettings) || fcSettings;
+																							  table.data('ams-fixedcolumns', data.amsDatatableFixedcolumnsConstructor === undefined ?
+																								  new $.fn.dataTable.FixedColumns(table, fcSettings)
+																								  : ams.executeFunctionByName(data.amsDatatableFixedcolumnsConstructor, table, plugin, fcSettings));
+																							  break;
+																						  case 'fixedheader':
+																							  var fhSettings = $.extend({}, data.amsDatatableFixedheaderOptions, settings.fixedheader);
+																							  fhSettings = ams.executeFunctionByName(data.amsDatatableFixedheadeInitCallback, table, fhSettings) || fhSettings;
+																							  table.data('ams-fixedheader', data.amsDatatableFixedheaderConstructor === undefined ?
+																								  new $.fn.dataTable.FixedHeader(table, fhSettings)
+																								  : ams.executeFunctionByName(data.amsDatatableFixedheaderConstructor, table, plugin, fhSettings));
+																							  break;
+																						  case 'keytable':
+																							  var ktDefault = {
+																								  table: table.get(0),
+																								  datatable: plugin
+																							  };
+																							  var ktSettings = $.extend({}, ktDefault, data.amsDatatableKeytableOptions, settings.keytable);
+																							  ktSettings = ams.executeFunctionByName(data.amsDatatableKeytableInitCallback, table, ktSettings) || ktSettings;
+																							  table.data('ams-keytable', data.amsDatatableKeytableConstructor === undefined ?
+																								  new KeyTable(ktSettings)
+																								  : ams.executeFunctionByName(data.amsDatatableKeytableConstructor, table, plugin, ktSettings));
+																							  break;
+																						  case 'rowgrouping':
+																							  var rgSettings = $.extend({}, data.amsDatatableRowgroupingOptions, settings.rowgrouping);
+																							  rgSettings = ams.executeFunctionByName(data.amsDatatableRowgroupingInitCallback, table, rgSettings) || rgSettings;
+																							  table.data('ams-rowgrouping', data.amsDatatableRowgroupingConstructor === undefined ?
+																								  table.rowGrouping(rgSettings)
+																								  : ams.executeFunctionByName(data.amsDatatableRowgroupingConstructor, table, plugin, rgSettings));
+																							  break;
+																						  case 'rowreordering':
+																							  var rrSettings = $.extend({}, data.amsDatatableRowreorderingOptions, settings.rowreordering);
+																							  rrSettings = ams.executeFunctionByName(data.amsDatatableRowreorderingInitCallback, table, rrSettings) || rrSettings;
+																							  table.data('ams-rowreordering', data.amsDatatableRowreorderingConstructor === undefined ?
+																								  table.rowReordering(rrSettings)
+																								  : ams.executeFunctionByName(data.amsDatatableRowreorderingConstructor, table, plugin, rrSettings));
+																							  break;
+																						  default:
+																							  break;
+																					  }
+																				  }
+																			  }
+																			  if (data.amsDatatableFinalizeCallback) {
+																				  var finalizers = data.amsDatatableFinalizeCallback.split(/\s+/);
+																				  if (finalizers.length > 0) {
+																					  for (index = 0; index < finalizers.length; index++) {
+																						  ams.executeFunctionByName(finalizers[index], table, plugin, settings);
+																					  }
+																				  }
+																			  }
+																		  } catch (e) {
+																		  }
+																	  }
+
+																	  callbacks.push(initTable);
+																	  ams.ajax && ams.ajax.check(checkers, sources, callbacks);
+																  });
+															  });
+										   });
 			}
 		},
 
@@ -4389,68 +4494,68 @@
 		tablednd: function(element) {
 			var tables = $('.table-dnd', element);
 			if (tables.length > 0) {
-				ams.ajax.check($.fn.tableDnD,
-							   ams.baseURL + 'ext/jquery-tablednd' + ams.devext + '.js',
-							   function() {
-									tables.each(function() {
-										var table = $(this);
-										var data = table.data();
-										if (data.amsTabledndDragHandle) {
-											$('tr', table).addClass('no-drag-handle');
-										} else {
-											$(table).on('mouseover', 'tr', function () {
-												$(this.cells[0]).addClass('drag-handle');
-											}).on('mouseout', 'tr', function () {
-												$(this.cells[0]).removeClass('drag-handle');
-											});
-										}
-										var dataOptions = {
-											onDragClass: data.amsTabledndDragClass || 'dragging-row',
-											onDragStart: ams.getFunctionByName(data.amsTabledndDragStart),
-											dragHandle: data.amsTabledndDragHandle,
-											scrollAmount: data.amsTabledndScrollAmount,
-											onAllowDrop: data.amsTabledndAllowDrop,
-											onDrop: ams.getFunctionByName(data.amsTabledndDrop) || function(dnd_table, row) {
-												var target = data.amsTabledndDropTarget;
-												if (target) {
-													// Disable row click handler
-													$(row).data('ams-disabled-handlers', 'click');
-													try {
-														var rows = [];
-														$(dnd_table.rows).each(function() {
-															var rowId = $(this).data('ams-element-name');
-															if (rowId) {
-																rows.push(rowId);
-															}
-														});
-														var localTarget = ams.getFunctionByName(target);
-														if (typeof(localTarget) === 'function') {
-															localTarget.call(table, dnd_table, rows);
-														} else {
-															if (!target.startsWith(window.location.protocol)) {
-																var location = data.amsLocation;
-																if (location) {
-																	target = location + '/' + target;
-																}
-															}
-															ams.ajax.post(target, {names: JSON.stringify(rows)});
-														}
-													} finally {
-														// Restore row click handler
-														setTimeout(function() {
-															$(row).removeData('ams-disabled-handlers');
-														}, 50);
-													}
-												}
-												return false;
-											}
-										};
-										var settings = $.extend({}, dataOptions, data.amsTabledndOptions);
-										settings = ams.executeFunctionByName(data.amsTabledndInitCallback, table, settings) || settings;
-										var plugin = table.tableDnD(settings);
-										ams.executeFunctionByName(data.amsTabledndAfterInitCallback, table, plugin, settings);
-									});
-							   });
+				ams.ajax && ams.ajax.check($.fn.tableDnD,
+										   ams.baseURL + 'ext/jquery-tablednd' + ams.devext + '.js',
+										   function() {
+											   tables.each(function() {
+												   var table = $(this);
+												   var data = table.data();
+												   if (data.amsTabledndDragHandle) {
+													   $('tr', table).addClass('no-drag-handle');
+												   } else {
+													   $(table).on('mouseover', 'tr', function() {
+														   $(this.cells[0]).addClass('drag-handle');
+													   }).on('mouseout', 'tr', function() {
+														   $(this.cells[0]).removeClass('drag-handle');
+													   });
+												   }
+												   var dataOptions = {
+													   onDragClass: data.amsTabledndDragClass || 'dragging-row',
+													   onDragStart: ams.getFunctionByName(data.amsTabledndDragStart),
+													   dragHandle: data.amsTabledndDragHandle,
+													   scrollAmount: data.amsTabledndScrollAmount,
+													   onAllowDrop: data.amsTabledndAllowDrop,
+													   onDrop: ams.getFunctionByName(data.amsTabledndDrop) || function(dnd_table, row) {
+														   var target = data.amsTabledndDropTarget;
+														   if (target) {
+															   // Disable row click handler
+															   $(row).data('ams-disabled-handlers', 'click');
+															   try {
+																   var rows = [];
+																   $(dnd_table.rows).each(function() {
+																	   var rowId = $(this).data('ams-element-name');
+																	   if (rowId) {
+																		   rows.push(rowId);
+																	   }
+																   });
+																   var localTarget = ams.getFunctionByName(target);
+																   if (typeof (localTarget) === 'function') {
+																	   localTarget.call(table, dnd_table, rows);
+																   } else {
+																	   if (!target.startsWith(window.location.protocol)) {
+																		   var location = data.amsLocation;
+																		   if (location) {
+																			   target = location + '/' + target;
+																		   }
+																	   }
+																	   ams.ajax && ams.ajax.post(target, {names: JSON.stringify(rows)});
+																   }
+															   } finally {
+																   // Restore row click handler
+																   setTimeout(function() {
+																	   $(row).removeData('ams-disabled-handlers');
+																   }, 50);
+															   }
+														   }
+														   return false;
+													   }
+												   };
+												   var settings = $.extend({}, dataOptions, data.amsTabledndOptions);
+												   settings = ams.executeFunctionByName(data.amsTabledndInitCallback, table, settings) || settings;
+												   var plugin = table.tableDnD(settings);
+												   ams.executeFunctionByName(data.amsTabledndAfterInitCallback, table, plugin, settings);
+											   });
+										   });
 			}
 		},
 
@@ -4460,39 +4565,39 @@
 		wizard: function(element) {
 			var wizards = $('.wizard', element);
 			if (wizards.length > 0) {
-				ams.ajax.check($.fn.bootstrapWizard,
-							   ams.baseURL + 'ext/bootstrap-wizard-1.4.2' + ams.devext + '.js',
-							   function() {
-									wizards.each(function() {
-										var wizard = $(this);
-										var data = wizard.data();
-										var dataOptions = {
-											withVisible: data.amsWizardWithVisible === undefined ? true : data.amsWizardWithVisible,
-											tabClass: data.amsWizardTabClass,
-											firstSelector: data.amsWizardFirstSelector,
-											previousSelector: data.amsWizardPreviousSelector,
-											nextSelector: data.amsWizardNextSelector,
-											lastSelector: data.amsWizardLastSelector,
-											finishSelector: data.amsWizardFinishSelector,
-											backSelector: data.amsWizardBackSelector,
-											onInit: ams.getFunctionByName(data.amsWizardInit),
-											onShow: ams.getFunctionByName(data.amsWizardShow),
-											onNext: ams.getFunctionByName(data.amsWizardNext),
-											onPrevious: ams.getFunctionByName(data.amsWizardPrevious),
-											onFirst: ams.getFunctionByName(data.amsWizardFirst),
-											onLast: ams.getFunctionByName(data.amsWizardLast),
-											onBack: ams.getFunctionByName(data.amsWizardBack),
-											onFinish: ams.getFunctionByName(data.amsWizardFinish),
-											onTabChange: ams.getFunctionByName(data.amsWizardTabChange),
-											onTabClick: ams.getFunctionByName(data.amsWizardTabClick),
-											onTabShow: ams.getFunctionByName(data.amsWizardTabShow)
-										};
-										var settings = $.extend({}, dataOptions, data.amsWizardOptions);
-										settings = ams.executeFunctionByName(data.amsWizardInitCallback, wizard, settings) || settings;
-										var plugin = wizard.bootstrapWizard(settings);
-										ams.executeFunctionByName(data.amsWizardAfterInitCallback, wizard, plugin, settings);
-									});
-							   });
+				ams.ajax && ams.ajax.check($.fn.bootstrapWizard,
+										   ams.baseURL + 'ext/bootstrap-wizard-1.4.2' + ams.devext + '.js',
+										   function() {
+											   wizards.each(function() {
+												   var wizard = $(this);
+												   var data = wizard.data();
+												   var dataOptions = {
+													   withVisible: data.amsWizardWithVisible === undefined ? true : data.amsWizardWithVisible,
+													   tabClass: data.amsWizardTabClass,
+													   firstSelector: data.amsWizardFirstSelector,
+													   previousSelector: data.amsWizardPreviousSelector,
+													   nextSelector: data.amsWizardNextSelector,
+													   lastSelector: data.amsWizardLastSelector,
+													   finishSelector: data.amsWizardFinishSelector,
+													   backSelector: data.amsWizardBackSelector,
+													   onInit: ams.getFunctionByName(data.amsWizardInit),
+													   onShow: ams.getFunctionByName(data.amsWizardShow),
+													   onNext: ams.getFunctionByName(data.amsWizardNext),
+													   onPrevious: ams.getFunctionByName(data.amsWizardPrevious),
+													   onFirst: ams.getFunctionByName(data.amsWizardFirst),
+													   onLast: ams.getFunctionByName(data.amsWizardLast),
+													   onBack: ams.getFunctionByName(data.amsWizardBack),
+													   onFinish: ams.getFunctionByName(data.amsWizardFinish),
+													   onTabChange: ams.getFunctionByName(data.amsWizardTabChange),
+													   onTabClick: ams.getFunctionByName(data.amsWizardTabClick),
+													   onTabShow: ams.getFunctionByName(data.amsWizardTabShow)
+												   };
+												   var settings = $.extend({}, dataOptions, data.amsWizardOptions);
+												   settings = ams.executeFunctionByName(data.amsWizardInitCallback, wizard, settings) || settings;
+												   var plugin = wizard.bootstrapWizard(settings);
+												   ams.executeFunctionByName(data.amsWizardAfterInitCallback, wizard, plugin, settings);
+											   });
+										   });
 			}
 		},
 
@@ -4513,82 +4618,82 @@
 			var editors = $('.tinymce', element);
 			if (editors.length > 0) {
 				var baseURL = ams.baseURL + 'ext/tinymce' + (ams.devmode ? '/dev' : '');
-				ams.ajax.check(window.tinymce,
-							   baseURL + '/tinymce' + ams.devext + '.js',
-							   function(first_load) {
-
-									function initEditors() {
-										editors.each(function() {
-											var editor = $(this);
-											var data = editor.data();
-											var dataOptions = {
-												theme: data.amsTinymceTheme || "modern",
-												language: ams.lang,
-												menubar: data.amsTinymceMenubar !== false,
-												statusbar: data.amsTinymceStatusbar !== false,
-												plugins: data.amsTinymcePlugins || [
-													"advlist autosave autolink lists link charmap print preview hr anchor pagebreak",
-													"searchreplace wordcount visualblocks visualchars code fullscreen",
-													"insertdatetime nonbreaking save table contextmenu directionality",
-													"emoticons paste textcolor colorpicker textpattern autoresize"
-												],
-												toolbar: data.amsTinymceToolbar,
-												toolbar1: data.amsTinymceToolbar1 === false ? false : data.amsTinymceToolbar1 ||
-													"undo redo | pastetext | styleselect | bold italic | alignleft " +
-													"aligncenter alignright alignjustify | bullist numlist " +
-													"outdent indent",
-												toolbar2: data.amsTinymceToolbar2 === false ? false : data.amsTinymceToolbar2 ||
-													"forecolor backcolor emoticons | charmap link image media | " +
-													"fullscreen preview print | code",
-												content_css: data.amsTinymceContentCss,
-												formats: data.amsTinymceFormats,
-												style_formats: data.amsTinymceStyleFormats,
-												block_formats: data.amsTinymceBlockFormats,
-												valid_classes: data.amsTinymceValidClasses,
-												image_advtab: true,
-												image_list: ams.getFunctionByName(data.amsTinymceImageList) || data.amsTinymceImageList,
-												image_class_list: data.amsTinymceImageClassList,
-												link_list: ams.getFunctionByName(data.amsTinymceLinkList) || data.amsTinymceLinkList,
-												link_class_list: data.amsTinymceLinkClassList,
-												paste_as_text: data.amsTinymcePasteAsText === undefined ? true : data.amsTinymcePasteAsText,
-												paste_auto_cleanup_on_paste: data.amsTinymcePasteAutoCleanup === undefined ? true : data.amsTinymcePasteAutoCleanup,
-												paste_strip_class_attributes: data.amsTinymcePasteStripClassAttributes || 'all',
-												paste_remove_spans: data.amsTinymcePaseRemoveSpans === undefined ? true : data.amsTinymcePasteRemoveSpans,
-												paste_remove_styles: data.amsTinymcePasteRemoveStyles === undefined ? true : data.amsTinymcePasteRemoveStyles,
-												height: data.amsTinymceHeight || 50,
-												min_height: 50,
-												resize: true,
-												autoresize_min_height: 50,
-												autoresize_max_height: 500
-											};
-											if (data.amsTinymceExternalPlugins) {
-												var names = data.amsTinymceExternalPlugins.split(/\s+/);
-												for (var index in names) {
-													if (!names.hasOwnProperty(index)) {
-														continue;
-													}
-													var pluginSrc = editor.data('ams-tinymce-plugin-' + names[index]);
-													tinymce.PluginManager.load(names[index], ams.getSource(pluginSrc));
-												}
-											}
-											var settings = $.extend({}, dataOptions, data.amsTinymceOptions);
-											settings = ams.executeFunctionByName(data.amsTinymceInitCallback, editor, settings) || settings;
-											var plugin = editor.tinymce(settings);
-											ams.executeFunctionByName(data.amsTinymceAfterInitCallback, editor, plugin, settings);
-										});
-									}
-
-									if (first_load) {
-										ams.getScript(baseURL + '/jquery.tinymce' + ams.devext + '.js', function() {
-											tinymce.baseURL = baseURL;
-											tinymce.suffix = ams.devext;
-											ams.skin.registerCleanCallback(cleanEditors);
-											initEditors();
-										});
-									} else {
-										initEditors();
-									}
-							   });
+				ams.ajax && ams.ajax.check(window.tinymce,
+										   baseURL + '/tinymce' + ams.devext + '.js',
+										   function(first_load) {
+
+											   function initEditors() {
+												   editors.each(function() {
+													   var editor = $(this);
+													   var data = editor.data();
+													   var dataOptions = {
+														   theme: data.amsTinymceTheme || "modern",
+														   language: ams.lang,
+														   menubar: data.amsTinymceMenubar !== false,
+														   statusbar: data.amsTinymceStatusbar !== false,
+														   plugins: data.amsTinymcePlugins || [
+															   "advlist autosave autolink lists link charmap print preview hr anchor pagebreak",
+															   "searchreplace wordcount visualblocks visualchars code fullscreen",
+															   "insertdatetime nonbreaking save table contextmenu directionality",
+															   "emoticons paste textcolor colorpicker textpattern autoresize"
+														   ],
+														   toolbar: data.amsTinymceToolbar,
+														   toolbar1: data.amsTinymceToolbar1 === false ? false : data.amsTinymceToolbar1 ||
+															   "undo redo | pastetext | styleselect | bold italic | alignleft " +
+															   "aligncenter alignright alignjustify | bullist numlist " +
+															   "outdent indent",
+														   toolbar2: data.amsTinymceToolbar2 === false ? false : data.amsTinymceToolbar2 ||
+															   "forecolor backcolor emoticons | charmap link image media | " +
+															   "fullscreen preview print | code",
+														   content_css: data.amsTinymceContentCss,
+														   formats: data.amsTinymceFormats,
+														   style_formats: data.amsTinymceStyleFormats,
+														   block_formats: data.amsTinymceBlockFormats,
+														   valid_classes: data.amsTinymceValidClasses,
+														   image_advtab: true,
+														   image_list: ams.getFunctionByName(data.amsTinymceImageList) || data.amsTinymceImageList,
+														   image_class_list: data.amsTinymceImageClassList,
+														   link_list: ams.getFunctionByName(data.amsTinymceLinkList) || data.amsTinymceLinkList,
+														   link_class_list: data.amsTinymceLinkClassList,
+														   paste_as_text: data.amsTinymcePasteAsText === undefined ? true : data.amsTinymcePasteAsText,
+														   paste_auto_cleanup_on_paste: data.amsTinymcePasteAutoCleanup === undefined ? true : data.amsTinymcePasteAutoCleanup,
+														   paste_strip_class_attributes: data.amsTinymcePasteStripClassAttributes || 'all',
+														   paste_remove_spans: data.amsTinymcePaseRemoveSpans === undefined ? true : data.amsTinymcePasteRemoveSpans,
+														   paste_remove_styles: data.amsTinymcePasteRemoveStyles === undefined ? true : data.amsTinymcePasteRemoveStyles,
+														   height: data.amsTinymceHeight || 50,
+														   min_height: 50,
+														   resize: true,
+														   autoresize_min_height: 50,
+														   autoresize_max_height: 500
+													   };
+													   if (data.amsTinymceExternalPlugins) {
+														   var names = data.amsTinymceExternalPlugins.split(/\s+/);
+														   for (var index in names) {
+															   if (!names.hasOwnProperty(index)) {
+																   continue;
+															   }
+															   var pluginSrc = editor.data('ams-tinymce-plugin-' + names[index]);
+															   tinymce.PluginManager.load(names[index], ams.getSource(pluginSrc));
+														   }
+													   }
+													   var settings = $.extend({}, dataOptions, data.amsTinymceOptions);
+													   settings = ams.executeFunctionByName(data.amsTinymceInitCallback, editor, settings) || settings;
+													   var plugin = editor.tinymce(settings);
+													   ams.executeFunctionByName(data.amsTinymceAfterInitCallback, editor, plugin, settings);
+												   });
+											   }
+
+											   if (first_load) {
+												   ams.getScript(baseURL + '/jquery.tinymce' + ams.devext + '.js', function() {
+													   tinymce.baseURL = baseURL;
+													   tinymce.suffix = ams.devext;
+													   ams.skin && ams.skin.registerCleanCallback(cleanEditors);
+													   initEditors();
+												   });
+											   } else {
+												   initEditors();
+											   }
+										   });
 			}
 		},
 
@@ -4598,48 +4703,48 @@
 		imgareaselect: function(element) {
 			var images = $('.imgareaselect', element);
 			if (images.length > 0) {
-				ams.ajax.check($.fn.imgAreaSelect,
-							   ams.baseURL + 'ext/jquery-imgareaselect-0.9.11-rc1' + ams.devext + '.js',
-							   function() {
-									ams.getCSS(ams.baseURL + '../css/ext/jquery-imgareaselect' + ams.devext + '.css',
-											  'jquery-imgareaselect',
-											   function() {
-												   images.each(function () {
-													   var image = $(this);
-													   var data = image.data();
-													   var parent = data.amsImgareaselectParent ? image.parents(data.amsImgareaselectParent) : 'body';
-													   var dataOptions = {
-														   instance: true,
-														   handles: true,
-														   parent: parent,
-														   x1: data.amsImgareaselectX1 || 0,
-														   y1: data.amsImgareaselectY1 || 0,
-														   x2: data.amsImgareaselectX2 || data.amsImgareaselectImageWidth,
-														   y2: data.amsImgareaselectY2 || data.amsImgareaselectImageHeight,
-														   imageWidth: data.amsImgareaselectImageWidth,
-														   imageHeight: data.amsImgareaselectImageHeight,
-														   minWidth: 128,
-														   minHeight: 128,
-														   aspectRatio: data.amsImgareaselectRatio,
-														   onSelectEnd: ams.getFunctionByName(data.amsImgareaselectSelectEnd) || function (img, selection) {
-															   var target = data.amsImgareaselectTargetField || 'image_';
-															   $('input[name="' + target + 'x1"]', parent).val(selection.x1);
-															   $('input[name="' + target + 'y1"]', parent).val(selection.y1);
-															   $('input[name="' + target + 'x2"]', parent).val(selection.x2);
-															   $('input[name="' + target + 'y2"]', parent).val(selection.y2);
-														   }
-													   };
-													   var settings = $.extend({}, dataOptions, data.amsImgareaselectOptions);
-													   settings = ams.executeFunctionByName(data.amsImgareaselectInitCallback, image, settings) || settings;
-													   var plugin = image.imgAreaSelect(settings);
-													   ams.executeFunctionByName(data.amsImgareaselectAfterInitCallback, image, plugin, settings);
-													   // Add update timeout when plug-in is displayed into a modal dialog
-													   setTimeout(function () {
-														   plugin.update();
-													   }, 250);
-												   });
-											   });
-							   });
+				ams.ajax && ams.ajax.check($.fn.imgAreaSelect,
+										   ams.baseURL + 'ext/jquery-imgareaselect-0.9.11-rc1' + ams.devext + '.js',
+										   function() {
+											   ams.getCSS(ams.baseURL + '../css/ext/jquery-imgareaselect' + ams.devext + '.css',
+														  'jquery-imgareaselect',
+														  function() {
+															  images.each(function() {
+																  var image = $(this);
+																  var data = image.data();
+																  var parent = data.amsImgareaselectParent ? image.parents(data.amsImgareaselectParent) : 'body';
+																  var dataOptions = {
+																	  instance: true,
+																	  handles: true,
+																	  parent: parent,
+																	  x1: data.amsImgareaselectX1 || 0,
+																	  y1: data.amsImgareaselectY1 || 0,
+																	  x2: data.amsImgareaselectX2 || data.amsImgareaselectImageWidth,
+																	  y2: data.amsImgareaselectY2 || data.amsImgareaselectImageHeight,
+																	  imageWidth: data.amsImgareaselectImageWidth,
+																	  imageHeight: data.amsImgareaselectImageHeight,
+																	  minWidth: 128,
+																	  minHeight: 128,
+																	  aspectRatio: data.amsImgareaselectRatio,
+																	  onSelectEnd: ams.getFunctionByName(data.amsImgareaselectSelectEnd) || function(img, selection) {
+																		  var target = data.amsImgareaselectTargetField || 'image_';
+																		  $('input[name="' + target + 'x1"]', parent).val(selection.x1);
+																		  $('input[name="' + target + 'y1"]', parent).val(selection.y1);
+																		  $('input[name="' + target + 'x2"]', parent).val(selection.x2);
+																		  $('input[name="' + target + 'y2"]', parent).val(selection.y2);
+																	  }
+																  };
+																  var settings = $.extend({}, dataOptions, data.amsImgareaselectOptions);
+																  settings = ams.executeFunctionByName(data.amsImgareaselectInitCallback, image, settings) || settings;
+																  var plugin = image.imgAreaSelect(settings);
+																  ams.executeFunctionByName(data.amsImgareaselectAfterInitCallback, image, plugin, settings);
+																  // Add update timeout when plug-in is displayed into a modal dialog
+																  setTimeout(function() {
+																	  plugin.update();
+																  }, 250);
+															  });
+														  });
+										   });
 			}
 		},
 
@@ -4649,97 +4754,97 @@
 		fancybox: function(element) {
 			var fancyboxes = $('.fancybox', element);
 			if (fancyboxes.length > 0) {
-				ams.ajax.check($.fn.fancybox,
-							   ams.baseURL + 'ext/jquery-fancybox-2.1.5' + ams.devext + '.js',
-							   function() {
-									ams.getCSS(ams.baseURL + '../css/ext/jquery-fancybox-2.1.5' + ams.devext + '.css',
-										'jquery-fancybox',
-										function() {
-											fancyboxes.each(function () {
-												var fancybox = $(this);
-												var data = fancybox.data();
-												var elements = fancybox;
-												var index,
-													helper;
-												if (data.amsFancyboxElements) {
-													elements = $(data.amsFancyboxElements, fancybox);
-												}
-												var helpers = (data.amsFancyboxHelpers || '').split(/\s+/);
-												if (helpers.length > 0) {
-													for (index = 0; index < helpers.length; index++) {
-														helper = helpers[index];
-														switch (helper) {
-															case 'buttons':
-																ams.ajax.check($.fancybox.helpers.buttons,
-																	ams.baseURL + 'ext/fancybox-helpers/fancybox-buttons' + ams.devext + '.js');
-																break;
-															case 'thumbs':
-																ams.ajax.check($.fancybox.helpers.thumbs,
-																	ams.baseURL + 'ext/fancybox-helpers/fancybox-thumbs' + ams.devext + '.js');
-																break;
-															case 'media':
-																ams.ajax.check($.fancybox.helpers.media,
-																	ams.baseURL + 'ext/fancybox-helpers/fancybox-media' + ams.devext + '.js');
-																break;
-															default:
-																break;
-														}
-													}
-												}
-												var dataOptions = {
-													type: data.amsFancyboxType,
-													padding: data.amsFancyboxPadding || 10,
-													margin: data.amsFancyboxMargin || 10,
-													loop: data.amsFancyboxLoop,
-													beforeLoad: ams.getFunctionByName(data.amsFancyboxBeforeLoad) || function () {
-														var title;
-														if (data.amsFancyboxTitleGetter) {
-															title = ams.executeFunctionByName(data.amsFancyboxTitleGetter, this);
-														}
-														if (!title) {
-															var content = $('*:first', this.element);
-															title = content.attr('original-title') || content.attr('title');
-															if (!title) {
-																title = $(this.element).attr('original-title') || $(this.element).attr('title');
-															}
-														}
-														this.title = title;
-													},
-													afterLoad: ams.getFunctionByName(data.amsFancyboxAfterLoad),
-													helpers: {
-														title: {
-															type: 'inside'
-														}
-													}
-												};
-												if (helpers.length > 0) {
-													for (index = 0; index < helpers.length; index++) {
-														helper = helpers[index];
-														switch (helper) {
-															case 'buttons':
-																dataOptions.helpers.buttons = {
-																	position: data.amsFancyboxButtonsPosition || 'top'
-																};
-																break;
-															case 'thumbs':
-																dataOptions.helpers.thumbs = {
-																	width: data.amsFancyboxThumbsWidth || 50,
-																	height: data.amsFancyboxThumbsHeight || 50
-																};
-																break;
-															case 'media':
-																dataOptions.helpers.media = true;
-																break;
-														}
-													}
-												}
-												var settings = $.extend({}, dataOptions, data.amsFancyboxOptions);
-												settings = ams.executeFunctionByName(data.amsFancyboxInitCallback, fancybox, settings) || settings;
-												var plugin = elements.fancybox(settings);
-												ams.executeFunctionByName(data.amsFancyboxAfterInitCallback, fancybox, plugin, settings);
-											});
-										});
-							   });
+				ams.ajax && ams.ajax.check($.fn.fancybox,
+										   ams.baseURL + 'ext/jquery-fancybox-2.1.5' + ams.devext + '.js',
+										   function() {
+											   ams.getCSS(ams.baseURL + '../css/ext/jquery-fancybox-2.1.5' + ams.devext + '.css',
+														  'jquery-fancybox',
+														  function() {
+															  fancyboxes.each(function() {
+																  var fancybox = $(this);
+																  var data = fancybox.data();
+																  var elements = fancybox;
+																  var index,
+																	  helper;
+																  if (data.amsFancyboxElements) {
+																	  elements = $(data.amsFancyboxElements, fancybox);
+																  }
+																  var helpers = (data.amsFancyboxHelpers || '').split(/\s+/);
+																  if (helpers.length > 0) {
+																	  for (index = 0; index < helpers.length; index++) {
+																		  helper = helpers[index];
+																		  switch (helper) {
+																			  case 'buttons':
+																				  ams.ajax && ams.ajax.check($.fancybox.helpers.buttons,
+																											 ams.baseURL + 'ext/fancybox-helpers/fancybox-buttons' + ams.devext + '.js');
+																				  break;
+																			  case 'thumbs':
+																				  ams.ajax && ams.ajax.check($.fancybox.helpers.thumbs,
+																											 ams.baseURL + 'ext/fancybox-helpers/fancybox-thumbs' + ams.devext + '.js');
+																				  break;
+																			  case 'media':
+																				  ams.ajax && ams.ajax.check($.fancybox.helpers.media,
+																											 ams.baseURL + 'ext/fancybox-helpers/fancybox-media' + ams.devext + '.js');
+																				  break;
+																			  default:
+																				  break;
+																		  }
+																	  }
+																  }
+																  var dataOptions = {
+																	  type: data.amsFancyboxType,
+																	  padding: data.amsFancyboxPadding || 10,
+																	  margin: data.amsFancyboxMargin || 10,
+																	  loop: data.amsFancyboxLoop,
+																	  beforeLoad: ams.getFunctionByName(data.amsFancyboxBeforeLoad) || function() {
+																		  var title;
+																		  if (data.amsFancyboxTitleGetter) {
+																			  title = ams.executeFunctionByName(data.amsFancyboxTitleGetter, this);
+																		  }
+																		  if (!title) {
+																			  var content = $('*:first', this.element);
+																			  title = content.attr('original-title') || content.attr('title');
+																			  if (!title) {
+																				  title = $(this.element).attr('original-title') || $(this.element).attr('title');
+																			  }
+																		  }
+																		  this.title = title;
+																	  },
+																	  afterLoad: ams.getFunctionByName(data.amsFancyboxAfterLoad),
+																	  helpers: {
+																		  title: {
+																			  type: 'inside'
+																		  }
+																	  }
+																  };
+																  if (helpers.length > 0) {
+																	  for (index = 0; index < helpers.length; index++) {
+																		  helper = helpers[index];
+																		  switch (helper) {
+																			  case 'buttons':
+																				  dataOptions.helpers.buttons = {
+																					  position: data.amsFancyboxButtonsPosition || 'top'
+																				  };
+																				  break;
+																			  case 'thumbs':
+																				  dataOptions.helpers.thumbs = {
+																					  width: data.amsFancyboxThumbsWidth || 50,
+																					  height: data.amsFancyboxThumbsHeight || 50
+																				  };
+																				  break;
+																			  case 'media':
+																				  dataOptions.helpers.media = true;
+																				  break;
+																		  }
+																	  }
+																  }
+																  var settings = $.extend({}, dataOptions, data.amsFancyboxOptions);
+																  settings = ams.executeFunctionByName(data.amsFancyboxInitCallback, fancybox, settings) || settings;
+																  var plugin = elements.fancybox(settings);
+																  ams.executeFunctionByName(data.amsFancyboxAfterInitCallback, fancybox, plugin, settings);
+															  });
+														  });
+										   });
 			}
 		},
 
@@ -4749,45 +4854,45 @@
 		chart: function(element) {
 			var charts = $('.chart', element);
 			if (charts.length > 0) {
-				ams.ajax.check($.fn.plot,
-							   ams.baseURL + 'flot/jquery.flot' + ams.devext + '.js',
-							   function() {
-									charts.each(function() {
-
-										function checkPlugin(plugin) {
-											for (var index in $.plot.plugins) {
-												if ($.plot.plugins.hasOwnProperty(index)) {
-													var pluginInfo = $.plot.plugins[index];
-													if (pluginInfo.name === plugin) {
-														return pluginInfo;
-													}
-												}
-											}
-											return null;
-										}
-
-										var chart = $(this);
-										var data = chart.data();
-										var dataOptions = {};
-										var plugins = (data.amsChartPlugins || '').split(/\s+/);
-										if (plugins.length > 0) {
-											for (var index in plugins) {
-												if (plugins.hasOwnProperty(index)) {
-													var pluginName = plugins[index];
-													if (!checkPlugin(pluginName)) {
-														ams.getScript(ams.baseURL + 'flot/jquery.flot.' + pluginName + ams.devext + '.js');
-													}
-												}
-											}
-										}
-										var settings = $.extend({}, dataOptions, data.amsChartOptions);
-										settings = ams.executeFunctionByName(data.amsChartInitCallback, chart, settings) || settings;
-										var chartData = data.amsChartData;
-										chartData = ams.executeFunctionByName(data.amsChartInitData, chart, chartData) || chartData;
-										var plugin = chart.plot(chartData, settings);
-										ams.executeFunctionByName(data.amsChartAfterInitCallback, chart, plugin, settings);
-									});
-							   });
+				ams.ajax && ams.ajax.check($.fn.plot,
+										   ams.baseURL + 'flot/jquery.flot' + ams.devext + '.js',
+										   function() {
+											   charts.each(function() {
+
+												   function checkPlugin(plugin) {
+													   for (var index in $.plot.plugins) {
+														   if ($.plot.plugins.hasOwnProperty(index)) {
+															   var pluginInfo = $.plot.plugins[index];
+															   if (pluginInfo.name === plugin) {
+																   return pluginInfo;
+															   }
+														   }
+													   }
+													   return null;
+												   }
+
+												   var chart = $(this);
+												   var data = chart.data();
+												   var dataOptions = {};
+												   var plugins = (data.amsChartPlugins || '').split(/\s+/);
+												   if (plugins.length > 0) {
+													   for (var index in plugins) {
+														   if (plugins.hasOwnProperty(index)) {
+															   var pluginName = plugins[index];
+															   if (!checkPlugin(pluginName)) {
+																   ams.getScript(ams.baseURL + 'flot/jquery.flot.' + pluginName + ams.devext + '.js');
+															   }
+														   }
+													   }
+												   }
+												   var settings = $.extend({}, dataOptions, data.amsChartOptions);
+												   settings = ams.executeFunctionByName(data.amsChartInitCallback, chart, settings) || settings;
+												   var chartData = data.amsChartData;
+												   chartData = ams.executeFunctionByName(data.amsChartInitData, chart, chartData) || chartData;
+												   var plugin = chart.plot(chartData, settings);
+												   ams.executeFunctionByName(data.amsChartAfterInitCallback, chart, plugin, settings);
+											   });
+										   });
 			}
 		},
 
@@ -4797,11 +4902,11 @@
 		graphs: function(element) {
 			var graphs = $('.sparkline', element);
 			if (graphs.length > 0) {
-				ams.ajax.check(ams.graphs,
-							   ams.baseURL + 'myams-graphs' + ams.devext + '.js',
-							   function() {
-									ams.graphs.init(graphs);
-							   });
+				ams.ajax && ams.ajax.check(ams.graphs,
+										   ams.baseURL + 'myams-graphs' + ams.devext + '.js',
+										   function() {
+											   ams.graphs.init(graphs);
+										   });
 			}
 		},
 
@@ -4811,29 +4916,29 @@
 		scrollbars: function(element) {
 			var scrollbars = $('.scrollbar', element);
 			if (scrollbars.length > 0) {
-				ams.ajax.check($.event.special.mousewheel,
-							   ams.baseURL + 'ext/jquery-mousewheel.min.js',
-							   function() {
-									ams.ajax.check($.fn.mCustomScrollbar,
-												   ams.baseURL + 'ext/jquery-mCustomScrollbar' + ams.devext + '.js',
-												   function() {
-														ams.getCSS(ams.baseURL + '../css/ext/jquery-mCustomScrollbar.css',
-																   'jquery-mCustomScrollbar',
-																   function () {
-																	   scrollbars.each(function () {
-																		   var scrollbar = $(this);
-																		   var data = scrollbar.data();
-																		   var dataOptions = {
-																			   theme: data.amsScrollbarTheme || 'light'
-																		   };
-																		   var settings = $.extend({}, dataOptions, data.amsScrollbarOptions);
-																		   settings = ams.executeFunctionByName(data.amsScrollbarInitCallback, scrollbar, settings) || settings;
-																		   var plugin = scrollbar.mCustomScrollbar(settings);
-																		   ams.executeFunctionByName(data.amsScrollbarAfterInitCallback, scrollbar, plugin, settings);
-																	   });
-																   });
-												   });
-								});
+				ams.ajax && ams.ajax.check($.event.special.mousewheel,
+										   ams.baseURL + 'ext/jquery-mousewheel.min.js',
+										   function() {
+											   ams.ajax.check($.fn.mCustomScrollbar,
+															  ams.baseURL + 'ext/jquery-mCustomScrollbar' + ams.devext + '.js',
+															  function() {
+																  ams.getCSS(ams.baseURL + '../css/ext/jquery-mCustomScrollbar.css',
+																			 'jquery-mCustomScrollbar',
+																			 function() {
+																				 scrollbars.each(function() {
+																					 var scrollbar = $(this);
+																					 var data = scrollbar.data();
+																					 var dataOptions = {
+																						 theme: data.amsScrollbarTheme || 'light'
+																					 };
+																					 var settings = $.extend({}, dataOptions, data.amsScrollbarOptions);
+																					 settings = ams.executeFunctionByName(data.amsScrollbarInitCallback, scrollbar, settings) || settings;
+																					 var plugin = scrollbar.mCustomScrollbar(settings);
+																					 ams.executeFunctionByName(data.amsScrollbarAfterInitCallback, scrollbar, plugin, settings);
+																				 });
+																			 });
+															  });
+										   });
 			}
 		}
 	});
@@ -4941,7 +5046,7 @@
 			var message = data.amsAlertMessage || settings.message;
 			var subtitle = data.amsAlertSubtitle || settings.subtitle;
 			var margin = data.amsAlertMargin === undefined ? (settings.margin === undefined ? false : settings.margin) : data.amsAlertMargin;
-			ams.skin.alert(parent, status, header, message, subtitle, margin);
+			ams.skin && ams.skin.alert(parent, status, header, message, subtitle, margin);
 		},
 
 		/**
@@ -4970,7 +5075,7 @@
 			});
 			var status = data.amsMessageboxStatus || dataOptions.status || 'info';
 			var callback = ams.getFunctionByName(data.amsMessageboxCallback || dataOptions.callback);
-			ams.skin.messageBox(status, settings, callback);
+			ams.skin && ams.skin.messageBox(status, settings, callback);
 		},
 
 		/**
@@ -4999,7 +5104,7 @@
 			});
 			var status = data.amsSmallboxStatus || dataOptions.status || 'info';
 			var callback = ams.getFunctionByName(data.amsSmallboxCallback || dataOptions.callback);
-			ams.skin.smallBox(status, settings, callback);
+			ams.skin && ams.skin.smallBox(status, settings, callback);
 		}
 	};
 
@@ -5069,7 +5174,7 @@
 		deleteElement: function() {
 			return function() {
 				var link = $(this);
-				ams.skin.bigBox({
+				ams.skin && ams.skin.bigBox({
 					title: ams.i18n.WARNING,
 					content: '<i class="text-danger fa fa-fw fa-bell"></i>&nbsp; ' + ams.i18n.DELETE_WARNING,
 					status: 'info',
@@ -5084,7 +5189,7 @@
 						}
 						var deleteTarget = tr.data('ams-delete-target') || table.data('ams-delete-target') || 'delete-element.json';
 						var objectName = tr.data('ams-element-name');
-						ams.ajax.post(location + deleteTarget, {'object_name': objectName}, function(result, status) {
+						ams.ajax && ams.ajax.post(location + deleteTarget, {'object_name': objectName}, function(result, status) {
 							if (result.status === 'success') {
 								if (table.hasClass('datatable')) {
 									table.dataTable().fnDeleteRow(tr[0]);
@@ -5092,10 +5197,10 @@
 									tr.remove();
 								}
 								if (result.handle_json) {
-									ams.ajax.handleJSON(result);
+									ams.ajax && ams.ajax.handleJSON(result);
 								}
 							} else {
-								ams.ajax.handleJSON(result);
+								ams.ajax && ams.ajax.handleJSON(result);
 							}
 						});
 					}
@@ -5113,8 +5218,8 @@
 				var row = source.parents('tr').first();
 				var table = row.parents('table');
 				$('i', source).attr('class', 'fa fa-fw fa-spinner fa-pulse');
-				ams.ajax.post(table.data('ams-location') + '/' +
-							 (cell.data('ams-attribute-switcher') || table.data('ams-attribute-switcher')),
+				ams.ajax && ams.ajax.post(table.data('ams-location') + '/' +
+										  (cell.data('ams-attribute-switcher') || table.data('ams-attribute-switcher')),
 					{object_name: row.data('ams-element-name')},
 					function(result, status) {
 						if (result.visible) {
@@ -5137,8 +5242,8 @@
 				var row = source.parents('tr').first();
 				var table = row.parents('table');
 				$('i', source).attr('class', 'fa fa-fw fa-spinner fa-pulse');
-				ams.ajax.post(table.data('ams-location') + '/' +
-							  (cell.data('ams-attribute-switcher') || table.data('ams-attribute-switcher')),
+				ams.ajax && ams.ajax.post(table.data('ams-location') + '/' +
+										  (cell.data('ams-attribute-switcher') || table.data('ams-attribute-switcher')),
 					{object_name: row.data('ams-element-name')},
 					function(result, status) {
 						if (result[attribute] || result['on']) {
@@ -5189,7 +5294,7 @@
 				var sourceName = tr.data('ams-element-name');
 				switcher.removeClass('fa-plus-square-o')
 						.addClass('fa-cog fa-spin');
-				ams.ajax.post(location + '/' + sourceName + '/' + treeNodesTarget, {
+				ams.ajax && ams.ajax.post(location + '/' + sourceName + '/' + treeNodesTarget, {
 					can_sort: !$('td.sorter', tr).is(':empty')
 				}, function(result, status) {
 					if (result.length > 0) {
@@ -5197,8 +5302,8 @@
 						for (var index = 0; index < result.length; index++) {
 							var new_row = $(result[index]);
 							new_row.insertAfter(old_row)
-								   .addClass('no-drag-handle');
-							ams.initContent(new_row);
+								.addClass('no-drag-handle');
+							ams.initContent && ams.initContent(new_row);
 							old_row = new_row;
 						}
 						if (table.hasClass('table-dnd')) {
@@ -5206,7 +5311,7 @@
 						}
 					}
 					switcher.removeClass('fa-cog fa-spin')
-							.addClass('fa-minus-square-o');
+						.addClass('fa-minus-square-o');
 				});
 			}
 		},
@@ -5222,14 +5327,14 @@
 			if (switcher.hasClass('fa-minus-square-o')) {
 				$('tr[data-ams-tree-node-parent-id]').filter('tr[data-ams-tree-node-parent-id!="' + tableID + '"]').remove();
 				$('i.switch', table).removeClass('fa-minus-square-o')
-									.addClass('fa-plus-square-o');
+					.addClass('fa-plus-square-o');
 			} else {
 				var tr = $('tbody tr', table).first();
 				var location = table.data('ams-location') || '';
 				var target = table.data('ams-tree-nodes-target') || 'get-tree.json';
 				switcher.removeClass('fa-plus-square-o')
-						.addClass('fa-cog fa-spin');
-				ams.ajax.post(location + '/' + target, {
+					.addClass('fa-cog fa-spin');
+				ams.ajax && ams.ajax.post(location + '/' + target, {
 					can_sort: !$('td.sorter', tr).is(':empty')
 				}, function(result, status) {
 					$('tr[data-ams-tree-node-id]', table).remove();
@@ -5242,16 +5347,16 @@
 							new_row.insertAfter(old_row);
 						}
 						new_row.addClass('no-drag-handle');
-						ams.initContent(new_row);
+						ams.initContent && ams.initContent(new_row);
 						old_row = new_row;
 					}
 					if (table.hasClass('table-dnd')) {
 						table.tableDnDUpdate();
 					}
 					$('i.switch', table).removeClass('fa-plus-square-o')
-										.addClass('fa-minus-square-o');
+						.addClass('fa-minus-square-o');
 					switcher.removeClass('fa-cog fa-spin')
-							.addClass('fa-minus-square-o');
+						.addClass('fa-minus-square-o');
 				});
 			}
 		},
@@ -5313,7 +5418,7 @@
 					}
 					// Call ordering target
 					var localTarget = ams.getFunctionByName(target);
-					if (typeof(localTarget) === 'function') {
+					if (typeof (localTarget) === 'function') {
 						localTarget.call(table, dnd_table, post_data);
 					} else {
 						if (!target.startsWith(window.location.protocol)) {
@@ -5329,7 +5434,7 @@
 							order: JSON.stringify($('tr[data-ams-tree-node-id]').listattr('data-ams-tree-node-id')),
 							can_sort: !$('td.sorter', row).is(':empty')
 						};
-						ams.ajax.post(target, post_data, function(result) {
+						ams.ajax && ams.ajax.post(target, post_data, function(result) {
 
 							function removeChildRows(rowID) {
 								var childs = $('tr[data-ams-tree-node-parent-id="' + rowID + '"]');
@@ -5361,7 +5466,7 @@
 											new_row.prependTo(body)
 												.addClass('no-drag-handle');
 										}
-										ams.initContent(new_row);
+										ams.initContent && ams.initContent(new_row);
 										old_row = new_row;
 									}
 								}
@@ -5396,7 +5501,6 @@
 		 */
 		_setPageHeight: function() {
 			var mainHeight = $('#main').height();
-			var menuHeight = ams.leftPanel.height();
 			var windowHeight = $(window).height() - ams.navbarHeight;
 			if (mainHeight > windowHeight) {
 				ams.root.css('min-height', mainHeight + ams.navbarHeight);
@@ -5422,16 +5526,16 @@
 		 * Show/hide shortcut buttons
 		 */
 		_showShortcutButtons: function() {
-			ams.shortcuts.animate({
-				height: 'show'
-			}, 200, 'easeOutCirc');
+			ams.shortcuts && ams.shortcuts.animate({
+													   height: 'show'
+												   }, 200, 'easeOutCirc');
 			ams.root.addClass('shortcut-on');
 		},
 
 		_hideShortcutButtons: function() {
-			ams.shortcuts.animate({
-				height: 'hide'
-			}, 300, 'easeOutCirc');
+			ams.shortcuts && ams.shortcuts.animate({
+													   height: 'hide'
+												   }, 300, 'easeOutCirc');
 			ams.root.removeClass('shortcut-on');
 		},
 
@@ -5442,10 +5546,10 @@
 			var badge = $('.badge', '#user-activity >span');
 			if (parseInt(badge.text()) > 0) {
 				badge.removeClass("hidden")
-					 .addClass("bg-color-red bounceIn animated");
+					.addClass("bg-color-red bounceIn animated");
 			} else {
 				badge.addClass("hidden")
-					 .removeClass("bg-color-red bounceIn animated");
+					.removeClass("bg-color-red bounceIn animated");
 			}
 		},
 
@@ -5465,7 +5569,7 @@
 			var target = $('[id="' + options.object_id + '"]');
 			target.replaceWith($(options.content));
 			target = $('[id="' + options.object_id + '"]');
-			ams.initContent(target);
+			ams.initContent && ams.initContent(target);
 			return target;
 		},
 
@@ -5487,7 +5591,7 @@
 			}
 			var label = widget.parents('.input').last();
 			label.html(options.content);
-			ams.initContent(label);
+			ams.initContent && ams.initContent(label);
 			return label;
 		},
 
@@ -5498,7 +5602,7 @@
 			var widget = $('[id="' + options.object_id + '"]').parents('.ams-widget:first');
 			widget.replaceWith($(options.table));
 			widget = $('[id="' + options.object_id + '"]').parents('.ams-widget:first');
-			ams.initContent(widget);
+			ams.initContent && ams.initContent(widget);
 			return widget;
 		},
 
@@ -5508,9 +5612,11 @@
 		 */
 		refreshSwitchedTable: function(options) {
 			var widget = ams.skin.refreshTable(options);
-			var legend = widget.siblings('legend');
-			if (legend.parents('fieldset:first').hasClass('switched')) {
-				legend.click();
+			if (widget) {
+				var legend = widget.siblings('legend');
+				if (legend.parents('fieldset:first').hasClass('switched')) {
+					legend.click();
+				}
 			}
 		},
 
@@ -5522,7 +5628,7 @@
 			var table = tr.parents('table').first();
 			var new_tr = $(options.row);
 			tr.replaceWith(new_tr);
-			ams.initContent(new_tr);
+			ams.initContent && ams.initContent(new_tr);
 			if (table.hasClass('table-dnd')) {
 				new_tr.addClass('no-drag-handle');
 				table.tableDnDUpdate();
@@ -5542,7 +5648,7 @@
 			if (index > -1) {
 				var cell = $($('td', tr).get(index));
 				cell.html(options.cell);
-				ams.initContent(cell);
+				ams.initContent && ams.initContent(cell);
 			}
 		},
 
@@ -5555,21 +5661,21 @@
 			if (switcher.hasClass('fa-plus-square-o')) {
 				var container = datatype.parents('table');
 				innerdiv.html('<h1 class="loading"><i class="fa fa-gear fa-spin"></i></h1>');
-				ams.ajax.post(container.data('ams-location') + '/' + source.data('ams-switch-handler'),
-					{object_name: datatype.data('ams-element-name')},
-					function (result) {
-						innerdiv.html(result);
-						if (result) {
-							ams.initContent(innerdiv);
-							switcher.removeClass('fa-plus-square-o')
-									.addClass('fa-minus-square-o');
-						}
-					});
+				ams.ajax && ams.ajax.post(container.data('ams-location') + '/' + source.data('ams-switch-handler'),
+										  {object_name: datatype.data('ams-element-name')},
+										  function(result) {
+											  innerdiv.html(result);
+											  if (result) {
+												  ams.initContent && ams.initContent(innerdiv);
+												  switcher.removeClass('fa-plus-square-o')
+													  .addClass('fa-minus-square-o');
+											  }
+										  });
 			} else {
 				ams.skin.cleanContainer(innerdiv);
 				innerdiv.empty();
 				switcher.removeClass('fa-minus-square-o')
-						.addClass('fa-plus-square-o');
+					.addClass('fa-plus-square-o');
 			}
 		},
 
@@ -5580,22 +5686,22 @@
 			if (ams.enableWidgets) {
 				var widgets = $('.ams-widget', element);
 				if (widgets.length > 0) {
-					ams.ajax.check($.fn.MyAMSWidget,
-								   ams.baseURL + 'myams-widgets' + ams.devext + '.js',
-								   function () {
-									   widgets.each(function () {
-										   var widget = $(this);
-										   var data = widget.data();
-										   var dataOptions = {
-											   deleteSettingsKey: '#deletesettingskey-options',
-											   deletePositionKey: '#deletepositionkey-options'
-										   };
-										   var settings = $.extend({}, dataOptions, data.amsWidgetOptions);
-										   settings = ams.executeFunctionByName(data.amsWidgetInitcallback, widget, settings) || settings;
-										   widget.MyAMSWidget(settings);
-									   });
-									   globals.MyAMSWidget.initWidgetsGrid($('.ams-widget-grid', element));
-								   });
+					ams.ajax && ams.ajax.check($.fn.MyAMSWidget,
+											   ams.baseURL + 'myams-widgets' + ams.devext + '.js',
+											   function() {
+												   widgets.each(function() {
+													   var widget = $(this);
+													   var data = widget.data();
+													   var dataOptions = {
+														   deleteSettingsKey: '#deletesettingskey-options',
+														   deletePositionKey: '#deletepositionkey-options'
+													   };
+													   var settings = $.extend({}, dataOptions, data.amsWidgetOptions);
+													   settings = ams.executeFunctionByName(data.amsWidgetInitcallback, widget, settings) || settings;
+													   widget.MyAMSWidget(settings);
+												   });
+												   globals.MyAMSWidget.initWidgetsGrid($('.ams-widget-grid', element));
+											   });
 				}
 			}
 		},
@@ -5627,7 +5733,7 @@
 				'<i class="fa fa-fw fa-warning"></i> ' + header +
 				'</h4>' +
 				(subtitle ? ('<p>' + subtitle + '</p>') : '');
-			if (typeof(message) === 'string') {
+			if (typeof (message) === 'string') {
 				content += '<ul><li>' + message + '</li></ul>';
 			} else if (message) {
 				content += '<ul>';
@@ -5650,73 +5756,73 @@
 		 * Big message box
 		 */
 		bigBox: function(options, callback) {
-			ams.ajax.check(ams.notify,
-						   ams.baseURL + 'myams-notify' + ams.devext + '.js',
-						   function() {
-								ams.notify.messageBox(options, callback);
-						   });
+			ams.ajax && ams.ajax.check(ams.notify,
+									   ams.baseURL + 'myams-notify' + ams.devext + '.js',
+									   function() {
+										   ams.notify.messageBox(options, callback);
+									   });
 		},
 
 		/**
 		 * Medium notification message box, displayed on page's bottom right
 		 */
 		messageBox: function(status, options, callback) {
-			if (typeof(status) === 'object') {
+			if (typeof (status) === 'object') {
 				callback = options;
 				options = status || {};
 				status = 'info';
 			}
-			ams.ajax.check(ams.notify,
-						   ams.baseURL + 'myams-notify' + ams.devext + '.js',
-						   function() {
-							   switch (status) {
-								   case 'error':
-								   case 'danger':
-									   options.color = '#C46A69';
-									   break;
-								   case 'warning':
-									   options.color = '#C79121';
-									   break;
-								   case 'success':
-									   options.color = '#739E73';
-									   break;
-								   default:
-									   options.color = options.color || '#3276B1';
-							   }
-							   options.sound = false;
-							   ams.notify.bigBox(options, callback);
-						   });
+			ams.ajax && ams.ajax.check(ams.notify,
+									   ams.baseURL + 'myams-notify' + ams.devext + '.js',
+									   function() {
+										   switch (status) {
+											   case 'error':
+											   case 'danger':
+												   options.color = '#C46A69';
+												   break;
+											   case 'warning':
+												   options.color = '#C79121';
+												   break;
+											   case 'success':
+												   options.color = '#739E73';
+												   break;
+											   default:
+												   options.color = options.color || '#3276B1';
+										   }
+										   options.sound = false;
+										   ams.notify.bigBox(options, callback);
+									   });
 		},
 
 		/**
 		 * Small notification message box, displayed on page's top right
 		 */
 		smallBox: function(status, options, callback) {
-			if (typeof(status) === 'object') {
+			if (typeof (status) === 'object') {
 				callback = options;
 				options = status || {};
 				status = 'info';
 			}
-			ams.ajax.check(ams.notify,
-						   ams.baseURL + 'myams-notify' + ams.devext + '.js',
-						   function () {
-							   switch (status) {
-								   case 'error':
-								   case 'danger':
-									   options.color = '#C46A69';
-									   break;
-								   case 'warning':
-									   options.color = '#C79121';
-									   break;
-								   case 'success':
-									   options.color = '#739E73';
-									   break;
-								   default:
-									   options.color = options.color || '#3276B1';
-							   }
-							   options.sound = false;
-							   ams.notify.smallBox(options, callback);
-						   });
+			ams.ajax && ams.ajax.check(ams.notify,
+									   ams.baseURL + 'myams-notify' + ams.devext + '.js',
+									   function() {
+										   switch (status) {
+											   case 'error':
+											   case 'danger':
+												   options.color = '#C46A69';
+												   break;
+											   case 'warning':
+												   options.color = '#C79121';
+												   break;
+											   case 'success':
+												   options.color = '#739E73';
+												   break;
+											   default:
+												   options.color = options.color || '#3276B1';
+										   }
+										   options.sound = false;
+										   ams.notify.smallBox(options, callback);
+									   });
 		},
 
 		/**
@@ -5726,20 +5832,20 @@
 		 * @param options: scroll options
 		 */
 		scrollTo: function(element, options) {
-			ams.ajax.check($.scrollTo,
-						   ams.baseURL + 'ext/jquery-scrollto-2.1.2' + ams.devext + '.js',
-						   function() {
-								var body = $('body');
-								var offset = options.offset || 0;
-								if (body.hasClass('fixed-header')) {
-									offset -= $('#header').height();
-								}
-								if (body.hasClass('fixed-ribbon')) {
-									offset -= $('#ribbon').height();
-								}
-								options = $.extend({}, options, {offset: offset});
-								$.scrollTo(element, options);
-						   });
+			ams.ajax && ams.ajax.check($.scrollTo,
+									   ams.baseURL + 'ext/jquery-scrollto-2.1.2' + ams.devext + '.js',
+									   function() {
+										   var body = $('body');
+										   var offset = options.offset || 0;
+										   if (body.hasClass('fixed-header')) {
+											   offset -= $('#header').height();
+										   }
+										   if (body.hasClass('fixed-ribbon')) {
+											   offset -= $('#ribbon').height();
+										   }
+										   options = $.extend({}, options, {offset: offset});
+										   $.scrollTo(element, options);
+									   });
 		},
 
 		/**
@@ -5750,8 +5856,8 @@
 			$('li', crumb).not('.parent').remove();
 			if (!$('li', crumb).exists()) {
 				crumb.append($('<li></li>').append($('<a></a>').text(ams.i18n.HOME)
-															   .addClass('padding-right-5')
-															   .attr('href', $('nav a[href!="#"]:first').attr('href'))));
+													   .addClass('padding-right-5')
+													   .attr('href', $('nav a[href!="#"]:first').attr('href'))));
 			}
 			$('LI.active >A', 'nav').each(function() {
 				var menu = $(this);
@@ -5761,8 +5867,8 @@
 									  .end()
 									  .text());
 				var item = $("<li></li>").append(menu.attr('href').replace(/^#/, '') ?
-												 $("<a></a>").html(body).attr('href', menu.attr('href'))
-												 : body);
+													 $("<a></a>").html(body).attr('href', menu.attr('href'))
+													 : body);
 				crumb.append(item);
 			});
 		},
@@ -5797,13 +5903,15 @@
 				if (menu.exists()) {
 					updateActiveMenus(menu);
 				}
-				ams.skin.loadURL(url, container, {afterLoadCallback: function() {
-					var prefix = $('html head title').data('ams-title-prefix');
-					document.title = (prefix ? prefix + ' > ' : '') +
-						($('[data-ams-page-title]:first', container).data('ams-page-title') ||
-						menu.attr('title') ||
-						document.title);
-				}});
+				ams.skin.loadURL(url, container, {
+					afterLoadCallback: function() {
+						var prefix = $('html head title').data('ams-title-prefix');
+						document.title = (prefix ? prefix + ' > ' : '') +
+							($('[data-ams-page-title]:first', container).data('ams-page-title') ||
+								menu.attr('title') ||
+								document.title);
+					}
+				});
 			} else {
 				var activeUrl = $('[data-ams-active-menu]').data('ams-active-menu');
 				if (activeUrl) {
@@ -5855,7 +5963,7 @@
 		 */
 		cleanContainer: function(container) {
 			var callbacks = ams.skin._clean_callbacks;
-			for (var index=0; index < callbacks.length; index++) {
+			for (var index = 0; index < callbacks.length; index++) {
 				callbacks[index].call(container);
 			}
 		},
@@ -5867,7 +5975,7 @@
 			if (url.startsWith('#')) {
 				url = url.substr(1);
 			}
-			if (typeof(options) === 'function') {
+			if (typeof (options) === 'function') {
 				callback = options;
 				options = {};
 			} else if (options === undefined) {
@@ -5898,44 +6006,46 @@
 					if (callback) {
 						ams.executeFunctionByName(callback, this, data, status, request, options);
 					} else {
-						var response = ams.ajax.getResponse(request);
-						var dataType = response.contentType;
-						var result = response.data;
-						$('.loading', container).remove();
-						switch (dataType) {
-							case 'json':
-								ams.ajax.handleJSON(result, container);
-								break;
-							case 'script':
-								break;
-							case 'xml':
-								break;
-							case 'html':
+						var response = ams.ajax && ams.ajax.getResponse(request);
+						if (response) {
+							var dataType = response.contentType;
+							var result = response.data;
+							$('.loading', container).remove();
+							switch (dataType) {
+								case 'json':
+									ams.ajax.handleJSON(result, container);
+									break;
+								case 'script':
+									break;
+								case 'xml':
+									break;
+								case 'html':
 								/* falls through */
-							case 'text':
+								case 'text':
 								/* falls through */
-							default:
-								// Show and init container
-								container.parents('.hidden').removeClass('hidden');
-								$('.alert', container.parents('.alerts-container')).remove();
-								container.css({opacity: '0.0'})
-										 .html(data)
-										 .removeClass('hidden')
-										 .delay(50)
-										 .animate({opacity: '1.0'}, 300);
-								ams.initContent(container);
-								ams.form.setFocus(container);
+								default:
+									// Show and init container
+									container.parents('.hidden').removeClass('hidden');
+									$('.alert', container.parents('.alerts-container')).remove();
+									container.css({opacity: '0.0'})
+										.html(data)
+										.removeClass('hidden')
+										.delay(50)
+										.animate({opacity: '1.0'}, 300);
+									ams.initContent && ams.initContent(container);
+									ams.form && ams.form.setFocus(container);
+							}
+							if (options && options.afterLoadCallback) {
+								ams.executeFunctionByName(options.afterLoadCallback, this, options.afterLoadCallbackOptions);
+							}
+							ams.stats && ams.stats.logPageview();
 						}
-						if (options && options.afterLoadCallback) {
-							ams.executeFunctionByName(options.afterLoadCallback, this, options.afterLoadCallbackOptions);
-						}
-						ams.stats.logPageview();
 					}
 				},
 				error: function(request, errorOptions, error) {
 					container.html('<h3 class="error"><i class="fa fa-warning txt-color-orangeDark"></i> ' +
-								   ams.i18n.ERROR + error + '</h3>' +
-								   request.responseText);
+									   ams.i18n.ERROR + error + '</h3>' +
+									   request.responseText);
 					if (options && options.afterErrorCallback) {
 						ams.executeFunctionByName(options.afterErrorCallback, this);
 					}
@@ -5955,13 +6065,13 @@
 			switch (handlerType) {
 				case 'json':
 					var method = options.method || 'setUserLanguage';
-					ams.jsonrpc.post(method, {lang: lang}, function() {
+					ams.jsonrpc && ams.jsonrpc.post(method, {lang: lang}, function() {
 						window.location.reload(true);
 					});
 					break;
 				case 'ajax':
 					var href = options.href || 'setUserLanguage';
-					ams.ajax.post(href, {lang: lang}, function() {
+					ams.ajax && ams.ajax.post(href, {lang: lang}, function() {
 						window.location.reload(true);
 					});
 					break;
@@ -6052,8 +6162,8 @@
 					}
 				}
 			},
-			progress: ams.ajax.progress,
-			progressUpload: ams.ajax.progress,
+			progress: ams.ajax && ams.ajax.progress,
+			progressUpload: ams.ajax && ams.ajax.progress,
 			xhr: function() {
 				var request = xhr();
 				if (request && (typeof(request.addEventListener) === "function")) {
@@ -6067,9 +6177,9 @@
 				return request;
 			}
 		});
-		$(document).ajaxStart(ams.ajax.start);
-		$(document).ajaxStop(ams.ajax.stop);
-		$(document).ajaxError(ams.error.ajax);
+		$(document).ajaxStart(ams.ajax && ams.ajax.start);
+		$(document).ajaxStop(ams.ajax && ams.ajax.stop);
+		$(document).ajaxError(ams.error && ams.error.ajax);
 
 		// Check for minified state in local storage
 		var state = globals.localStorage && globals.localStorage.getItem('window-state');
@@ -6085,32 +6195,32 @@
 			ams.root.addClass('mobile-detected');
 			ams.device = 'mobile';
 			if (ams.enableFastclick) {
-				ams.ajax.check($.fn.noClickDelay,
-							   ams.baseURL + '/ext/jquery-smartclick' + ams.devext + '.js',
-							   function() {
-								   $('NAV UL A').noClickDelay();
-								   $('A', '#hide-menu').noClickDelay();
-							   });
+				ams.ajax && ams.ajax.check($.fn.noClickDelay,
+										   ams.baseURL + '/ext/jquery-smartclick' + ams.devext + '.js',
+										   function() {
+											   $('NAV UL A').noClickDelay();
+											   $('A', '#hide-menu').noClickDelay();
+										   });
 			}
 		}
 
 		// Switch shortcuts
 		$('#show-shortcuts').click(function(e) {
 			if (ams.shortcuts.is(":visible")) {
-				ams.skin._hideShortcutButtons();
+				ams.skin && ams.skin._hideShortcutButtons();
 			} else {
-				ams.skin._showShortcutButtons();
+				ams.skin && ams.skin._showShortcutButtons();
 			}
 			e.preventDefault();
 		});
 		ams.shortcuts.click(function(e) {
-			ams.skin._hideShortcutButtons();
+			ams.skin && ams.skin._hideShortcutButtons();
 		});
 
 		$(document).mouseup(function(e) {
 			if (!ams.shortcuts.is(e.target) &&
 				ams.shortcuts.has(e.target).length === 0) {
-				ams.skin._hideShortcutButtons();
+				ams.skin && ams.skin._hideShortcutButtons();
 			}
 		});
 
@@ -6137,7 +6247,7 @@
 			}
 			e.preventDefault();
 		});
-		ams.skin.checkNotification();
+		ams.skin && ams.skin.checkNotification();
 
 		$(document).mouseup(function(e) {
 			var dropdown = $('.ajax-dropdown');
@@ -6162,7 +6272,7 @@
 					href.call(this);
 				} else {
 					var container = $('.ajax-notifications');
-					ams.skin.loadURL(href, container);
+					ams.skin && ams.skin.loadURL(href, container);
 				}
 			}
 		});
@@ -6174,7 +6284,7 @@
 			//get the link
 			ams.loginURL = $(this).attr('href');
 			// ask verification
-			ams.skin.bigBox({
+			ams.skin && ams.skin.bigBox({
 				title : "<i class='fa fa-sign-out txt-color-orangeDark'></i> " + ams.i18n.LOGOUT +
 						" <span class='txt-color-orangeDark'><strong>" + $('#show-shortcut').text() + "</strong></span> ?",
 				content : ams.i18n.LOGOUT_COMMENT,
@@ -6223,7 +6333,7 @@
 
 		// Reset widgets
 		$('#refresh').click(function(e) {
-			ams.skin.bigBox({
+			ams.skin && ams.skin.bigBox({
 				title: "<i class='fa fa-refresh' style='color: green'></i> " + ams.i18n.CLEAR_STORAGE_TITLE,
 				content: ams.i18n.CLEAR_STORAGE_CONTENT,
 				buttons: '['+ams.i18n.BTN_CANCEL+']['+ams.i18n.BTN_OK+']'
@@ -6247,17 +6357,17 @@
 		});
 
 		// Resize events
-		ams.ajax.check($.resize,
-					   ams.baseURL + 'ext/jquery-resize' + ams.devext + '.js',
-					   function() {
-						   $('#main').resize(function() {
-							   ams.skin._setPageHeight();
-							   ams.skin._checkMobileWidth();
-						   });
-						   nav.resize(function() {
-							   ams.skin._setPageHeight();
-						   });
-					   });
+		ams.ajax && ams.ajax.check($.resize,
+								   ams.baseURL + 'ext/jquery-resize' + ams.devext + '.js',
+								   function() {
+									   $('#main').resize(function() {
+										   ams.skin._setPageHeight();
+										   ams.skin._checkMobileWidth();
+									   });
+									   nav.resize(function() {
+										   ams.skin._setPageHeight();
+									   });
+								   });
 
 		// Init AJAX navigation
 		if (ams.ajaxNav) {
@@ -6304,16 +6414,16 @@
 					} else {
 						var target = link.data('ams-target');
 						if (target) {
-							ams.form.confirmChangedForm(target, function () {
-								ams.skin.loadURL(href, target, link.data('ams-link-options'), link.data('ams-link-callback'));
+							ams.form && ams.form.confirmChangedForm(target, function () {
+								ams.skin && ams.skin.loadURL(href, target, link.data('ams-link-options'), link.data('ams-link-callback'));
 							});
 						} else {
-							ams.form.confirmChangedForm(function () {
+							ams.form && ams.form.confirmChangedForm(function() {
 								if (href.startsWith('#')) {
 									if (href !== location.hash) {
 										if (ams.root.hasClass('mobile-view-activated')) {
 											ams.root.removeClass('hidden-menu');
-											window.setTimeout(function () {
+											window.setTimeout(function() {
 												window.location.hash = href;
 											}, 50);
 										} else {
@@ -6332,19 +6442,19 @@
 				e.preventDefault();
 				var target = $(e.currentTarget);
 				window.open(target.attr('href'));
-				ams.stats.logEvent(target.data('ams-stats-category') || 'Navigation',
-								   target.data('ams-stats-action') || 'External',
-								   target.data('ams-stats-label') || target.attr('href'));
+				ams.stats && ams.stats.logEvent(target.data('ams-stats-category') || 'Navigation',
+												target.data('ams-stats-action') || 'External',
+												target.data('ams-stats-label') || target.attr('href'));
 			});
 			$(document).on('click', 'a[target="_top"]', function(e) {
 				e.preventDefault();
-				ams.form.confirmChangedForm(function() {
+				ams.form && ams.form.confirmChangedForm(function() {
 					window.location = $(e.currentTarget).attr('href');
 				});
 			});
 
 			// Check URL when hash changed
-			$(window).on('hashchange', ams.skin.checkURL);
+			$(window).on('hashchange', ams.skin && ams.skin.checkURL);
 		}
 
 		// Initialize modal dialogs links
@@ -6362,7 +6472,7 @@
 				e.stopPropagation();
 			}
 			e.preventDefault();
-			ams.dialog.open(source);
+			ams.dialog && ams.dialog.open(source);
 			if (source.parents('#shortcut').exists()) {
 				setTimeout(ams.skin._hideShortcutButtons, 300);
 			}
@@ -6465,7 +6575,7 @@
 					}
 				});
 			}, 10);
-			ams.form.setFocus(form);
+			ams.form && ams.form.setFocus(form);
 		});
 
 		// Initialize custom reset handlers
@@ -6547,7 +6657,7 @@
 					return;
 				}
 				link.append('<i class="fa fa-spin fa-cog margin-left-5"></i>');
-				ams.skin.loadURL(data.amsUrl, link.attr('href'), {
+				ams.skin && ams.skin.loadURL(data.amsUrl, link.attr('href'), {
 					afterLoadCallback: function() {
 						if (data.amsTabLoadOnce) {
 							link.data('ams-tab-loaded', true);
@@ -6564,7 +6674,7 @@
 		// Check modal form dialogs on close
 		$(document).on('hide.bs.modal', function(e) {
 			var modal = $(e.target);
-			ams.form.confirmChangedForm(modal, function() {
+			ams.form && ams.form.confirmChangedForm(modal, function() {
 				// Confirm closing if OK
 				var bsModal = modal.data('modal') || modal.data('bs.modal');
 				if (bsModal) {
@@ -6580,18 +6690,18 @@
 
 		// Enable custom MyAMS refresh events
 		$(document).on('myams.refresh', function(event, options) {
-			ams.executeFunctionByName(options.handler || ams.skin.refreshContent, event.target, options);
+			ams.executeFunctionByName(options.handler || (ams.skin && ams.skin.refreshContent), event.target, options);
 		});
 
 		// Init page content
 		ams.initContent(document);
 		if (ams.ajaxNav && nav.exists()) {
-			ams.skin.checkURL();
+			ams.skin && ams.skin.checkURL();
 		}
-		ams.form.setFocus(document);
+		ams.form && ams.form.setFocus(document);
 
 		// Add unload event listener to check for modified forms
-		$(window).on('beforeunload', ams.form.checkBeforeUnload);
+		$(window).on('beforeunload', ams.form && ams.form.checkBeforeUnload);
 
 	};
 
@@ -6616,108 +6726,19 @@
 		});
 
 		// Init registered plug-ins and callbacks
-		ams.plugins.init(element);
-		ams.callbacks.init(element);
-		ams.events.init(element);
-		ams.form.init(element);
+		ams.plugins && ams.plugins.init(element);
+		ams.callbacks && ams.callbacks.init(element);
+		ams.events && ams.events.init(element);
+		ams.form && ams.form.init(element);
 
 		// Initialize widgets
 		if (ams.device === 'desktop') {
-			ams.skin._initDesktopWidgets(element);
+			ams.skin && ams.skin._initDesktopWidgets(element);
 		} else {
-			ams.skin._initMobileWidgets(element);
+			ams.skin && ams.skin._initMobileWidgets(element);
 		}
-		ams.skin._setPageHeight();
-
-	};
-
-
-	/**
-	 * MyAMS locale strings
-	 */
-	ams.i18n = {
-
-		INFO: "Information",
-		WARNING: "!! WARNING !!",
-		ERROR: "ERROR: ",
-
-		LOADING: "Loading...",
-		PROGRESS: "Processing",
-
-		WAIT: "Please wait!",
-		FORM_SUBMITTED: "This form was already submitted...",
-		NO_SERVER_RESPONSE: "No response from server!",
-
-		ERROR_OCCURED: "An error occured!",
-		ERRORS_OCCURED: "Some errors occured!",
-
-		BAD_LOGIN_TITLE: "Bad login!",
-		BAD_LOGIN_MESSAGE: "Your anthentication credentials didn't allow you to open a session; " +
-						   "please check your credentials or contact administrator.",
-
-		CONFIRM: "Confirm",
-		CONFIRM_REMOVE: "Removing this content can't be undone. Do you confirm?",
-
-		CLEAR_STORAGE_TITLE: "Clear Local Storage",
-		CLEAR_STORAGE_CONTENT: "Would you like to RESET all your saved widgets and clear LocalStorage?",
-
-		BTN_OK: "OK",
-		BTN_CANCEL: "Cancel",
-		BTN_OK_CANCEL: "[OK][Cancel]",
-		BTN_YES: "Yes",
-		BTN_NO: "No",
-		BTN_YES_NO: "[Yes][No]",
-
-		CLIPBOARD_COPY: "Copy to clipboard with Ctrl+C, and Enter",
-		CLIPBOARD_CHARACTER_COPY_OK: "Character copied to clipboard",
-		CLIPBOARD_TEXT_COPY_OK: "Text copied to clipboard",
-
-		FORM_CHANGED_WARNING: "Some changes were not saved. These updates will be lost if you leave this page.",
-		DELETE_WARNING: "This change can't be undone. Are you sure that you want to delete this element?",
-		NO_UPDATE: "No changes were applied.",
-		DATA_UPDATED: "Data successfully updated.",
-
-		HOME: "Home",
-		LOGOUT: "Logout?",
-		LOGOUT_COMMENT: "You can improve your security further after logging out by closing this opened browser",
-
-		SELECT2_PLURAL: 's',
-		SELECT2_MATCH: "One result is available, press enter to select it.",
-		SELECT2_MATCHES: " results are available, use up and down arrow keys to navigate.",
-		SELECT2_NOMATCHES: "No matches found",
-		SELECT2_SEARCHING: "Searching...",
-		SELECT2_LOADMORE: "Loading more results...",
-		SELECT2_INPUT_TOOSHORT: "Please enter {0} more character{1}",
-		SELECT2_INPUT_TOOLONG: "Please delete {0} character{1}",
-		SELECT2_SELECTION_TOOBIG: "You can only select {0} item{1}",
-		SELECT2_FREETAG_PREFIX: "Free text: ",
-
-		DT_COLUMNS: "Columns"
-	}
-
-	ams.plugins.i18n = {
-		widgets: {},
-		validate: {},
-		datatables: {},
-		fancybox: {
-			ERROR: "Can't load requested content.",
-			RETRY: "Please check URL or try again later.",
-			CLOSE: "Close",
-			NEXT: "Next",
-			PREVIOUS: "Previous"
-		},
-		dndupload: {
-			FILES_SELECTED: '{count} files selected',
-			CHOOSE_FILE: 'Select file(s)',
-			ADD_INFO: 'to add them to current folder,',
-			DRAG_FILE: 'or drag and drop them here!',
-			UPLOAD: 'Upload',
-			UPLOADING: 'Uploading&hellip;',
-			DONE: 'Done!',
-			UPLOAD_MORE: 'Upload more?',
-			ERROR: 'Error!',
-			TRY_AGAIN: 'Try again?'
-		}
+		ams.skin && ams.skin._setPageHeight();
+
 	};