src/ztfy/myams/resources/js/myams.js
changeset 180 172ddcb92995
parent 178 2c3ba8d90123
child 182 681edeb5c6ef
--- a/src/ztfy/myams/resources/js/myams.js	Wed Oct 05 17:36:07 2016 +0200
+++ b/src/ztfy/myams/resources/js/myams.js	Thu Oct 06 15:44:22 2016 +0200
@@ -60,6 +60,15 @@
 
 
 	/**
+	 * JQuery 'hasvalue' expression
+	 * Filter inputs containing value
+	 */
+	$.expr[":"].hasvalue =  function(obj, index, meta /*, stack*/) {
+		return $(obj).val() !== "";
+	};
+
+
+	/**
 	 * JQuery 'econtains' expression
 	 * Case insensitive contains expression
 	 */
@@ -216,9 +225,9 @@
 											.off('click')
 											.on('click', function (e) {
 												$(this).hide();
-												var $invokedOn = $(this).data("invokedOn");
-												var $selectedMenu = $(e.target);
-												settings.menuSelected.call(this, $invokedOn, $selectedMenu);
+												var invokedOn = $(this).data("invokedOn");
+												var selectedMenu = $(e.target);
+												settings.menuSelected.call(this, invokedOn, selectedMenu);
 												ams.event.stop(e);
 											});
 					return false;
@@ -249,17 +258,17 @@
 
 			// Add a mark [+] to a multilevel menu
 			menu.find("LI").each(function() {
-				var menu_item = $(this);
-				if (menu_item.find("UL").size() > 0) {
+				var menuItem = $(this);
+				if (menuItem.find("UL").size() > 0) {
 
 					// add the multilevel sign next to the link
-					menu_item.find("A:first")
+					menuItem.find("A:first")
 							 .append("<b class='collapse-sign'>" + settings.closedSign + "</b>");
 
 					// avoid jumping to the top of the page when the href is an #
-					var first_link = menu_item.find("A:first");
-					if (first_link.attr('href') === "#") {
-						first_link.click(function() {
+					var firstLink = menuItem.find("A:first");
+					if (firstLink.attr('href') === "#") {
+						firstLink.click(function() {
 							return false;
 						});
 					}
@@ -268,11 +277,11 @@
 
 			// Open active level
 			menu.find("LI.active").each(function() {
-				var active_parent = $(this).parents('UL');
-				var active_item = active_parent.parent('LI');
-				active_parent.slideDown(settings.speed);
-				active_item.find("b:first").html(settings.openedSign);
-				active_item.addClass("open");
+				var activeParent = $(this).parents('UL');
+				var activeItem = activeParent.parent('LI');
+				activeParent.slideDown(settings.speed);
+				activeItem.find("b:first").html(settings.openedSign);
+				activeItem.addClass("open");
 			});
 
 			menu.find("LI A").on('click', function() {
@@ -281,7 +290,7 @@
 					return;
 				}
 				var href = link.attr('href').replace(/^#/,'');
-				var parent_ul = link.parent().find("UL");
+				var parentUL = link.parent().find("UL");
 				if (settings.accordion) {
 					var parents = link.parent().parents("UL");
 					var visible = menu.find("UL:visible");
@@ -294,24 +303,24 @@
 							}
 						});
 						if (close) {
-							if (parent_ul !== visible[visibleIndex]) {
+							if (parentUL !== visible[visibleIndex]) {
 								var visibleItem = $(visible[visibleIndex]);
 								if (href || !visibleItem.hasClass('active')) {
 									visibleItem.slideUp(settings.speed, function () {
 										$(this).parent("LI")
-											.removeClass('open')
-											.find("B:first")
-											.delay(settings.speed)
-											.html(settings.closedSign);
+											   .removeClass('open')
+											   .find("B:first")
+											   .delay(settings.speed)
+											   .html(settings.closedSign);
 									});
 								}
 							}
 						}
 					});
 				}
-				var first_ul = link.parent().find("UL:first");
-				if (!href && first_ul.is(":visible") && !first_ul.hasClass("active")) {
-					first_ul.slideUp(settings.speed, function() {
+				var firstUL = link.parent().find("UL:first");
+				if (!href && firstUL.is(":visible") && !firstUL.hasClass("active")) {
+					firstUL.slideUp(settings.speed, function() {
 						link.parent("LI")
 							.removeClass("open")
 							.find("B:first")
@@ -319,7 +328,7 @@
 							.html(settings.closedSign);
 					});
 				} else /*if (link.attr('href') !== location.hash)*/ {
-					first_ul.slideDown(settings.speed, function() {
+					firstUL.slideDown(settings.speed, function() {
 						link.parent("LI")
 							.addClass("open")
 							.find("B:first")
@@ -404,14 +413,14 @@
 			devmode: true,
 			devext: '',
 			lang: 'en',
-			throttle_delay: 350,
-			menu_speed: 235,
-			navbar_height: 49,
-			ajax_nav: true,
-			enable_widgets: true,
-			enable_mobile: false,
-			enable_fastclick: false,
-			warn_on_form_change: false,
+			throttleDelay: 350,
+			menuSpeed: 235,
+			navbarHeight: 49,
+			ajaxNav: true,
+			enableWidgets: true,
+			enableMobile: false,
+			enableFastclick: false,
+			warnOnFormChange: false,
 			ismobile: (/iphone|ipad|ipod|android|blackberry|mini|windows\sce|palm/i.test(navigator.userAgent.toLowerCase()))
 		};
 	}
@@ -661,9 +670,9 @@
 			if (response.statusText === 'OK') {
 				return;
 			}
-			var ajax_response = ams.ajax.getResponse(response);
-			if (ajax_response.content_type === 'json') {
-				ams.ajax.handleJSON(ajax_response.data);
+			var response = ams.ajax.getResponse(response);
+			if (response.contentType === 'json') {
+				ams.ajax.handleJSON(response.data);
 			} else {
 				var title = event.statusText || event.type;
 				var message = response.responseText;
@@ -688,7 +697,7 @@
 				return;
 			}
 			var response = ams.ajax.getResponse(request);
-			if (response.content_type === 'json') {
+			if (response.contentType === 'json') {
 				ams.ajax.handleJSON(response.data);
 			} else {
 				ams.skin.messageBox('error', {
@@ -769,8 +778,6 @@
 		 * Handle AJAX upload and download progress
 		 *
 		 * @param event: the source event
-		 * @param request: the request
-		 * @param options: AJAX options
 		 */
 		progress: function(event) {
 			if (!event.lengthComputable) {
@@ -829,37 +836,37 @@
 		 * Extract data type and result from response
 		 */
 		getResponse: function(request) {
-			var content_type = request.getResponseHeader('content-type'),
-				data_type,
+			var contentType = request.getResponseHeader('content-type'),
+				dataType,
 				result;
-			if (content_type) {
+			if (contentType) {
 				// Got server response
-				if (content_type.startsWith('application/javascript')) {
-					data_type = 'script';
+				if (contentType.startsWith('application/javascript')) {
+					dataType = 'script';
 					result = request.responseText;
-				} else if (content_type.startsWith('text/html')) {
-					data_type = 'html';
+				} else if (contentType.startsWith('text/html')) {
+					dataType = 'html';
 					result = request.responseText;
-				} else if (content_type.startsWith('text/xml')) {
-					data_type = 'xml';
+				} else if (contentType.startsWith('text/xml')) {
+					dataType = 'xml';
 					result = request.responseText;
 				} else {
 					result = request.responseJSON;
 					if (result) {
-						data_type = 'json';
+						dataType = 'json';
 					} else {
 						try {
 							result = JSON.parse(request.responseText);
-							data_type = 'json';
+							dataType = 'json';
 						} catch (e) {
 							result = request.responseText;
-							data_type = 'text';
+							dataType = 'text';
 						}
 					}
 				}
 			} else {
 				// Probably no response from server...
-				data_type = 'json';
+				dataType = 'json';
 				result = {
 					status: 'alert',
 					alert: {
@@ -868,7 +875,7 @@
 					}
 				};
 			}
-			return {content_type: data_type,
+			return {contentType: dataType,
 					data: result};
 		},
 
@@ -1029,11 +1036,11 @@
 											timeout: 10000
 										});
 				} else {
-					var message_status = message.status || 'info';
-					if (message_status === 'error' && form && target) {
+					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(message_status,
+					ams.skin.messageBox(messageStatus,
 										{title: message.title || ams.i18n.ERROR_OCCURED,
 										 content: message.content,
 										 icon: message.icon,
@@ -1248,7 +1255,7 @@
 		init: function(element) {
 			// Activate form changes if required
 			var forms;
-			if (ams.warn_on_form_change) {
+			if (ams.warnOnFormChange) {
 				forms = $('FORM[data-ams-warn-on-change!="false"]', element);
 			} else {
 				forms = $('FORM[data-ams-warn-on-change="true"]', element);
@@ -1359,14 +1366,14 @@
 		/**
 		 * Submit given form
 		 */
-		submit: function(form, handler, submit_options) {
+		submit: function(form, handler, submitOptions) {
 			// Check params
 			form = $(form);
 			if (!form.exists()) {
 				return false;
 			}
 			if (typeof(handler) === 'object') {
-				submit_options = handler;
+				submitOptions = handler;
 				handler = undefined;
 			}
 			// Prevent multiple submits of the same form
@@ -1400,17 +1407,17 @@
 								function _submitAjaxForm(form, options) {
 
 									var button,
-										button_data,
-										button_target;
+										buttonData,
+										buttonTarget;
 									var data = form.data();
-									var form_options = data.amsFormOptions;
-									var form_data;
-									var form_data_callback;
-
-									var progress_handler;
-									var progress_interval;
-									var progress_callback;
-									var progress_end_callback;
+									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) {
@@ -1420,14 +1427,14 @@
 										function _clearProgressStatus() {
 											button.button('reset');
 											clearInterval(interval);
-											ams.executeFunctionByName(progress_end_callback, form, button);
+											ams.executeFunctionByName(progressEndCallback, form, button);
 										}
 
 										function _getProgressStatus() {
 											ams.ajax.post(handler,
 														  {progress_id: progress_id},
 														  {error: _clearProgressStatus},
-														  ams.getFunctionByName(progress_callback) || function(result, status) {
+														  ams.getFunctionByName(progressCallback) || function(result, status) {
 															if (status == 'success') {
 																if (result.status === 'running') {
 																	if (result.message) {
@@ -1446,24 +1453,24 @@
 										}
 
 										button.button('loading');
-										interval = setInterval(_getProgressStatus, progress_interval);
+										interval = setInterval(_getProgressStatus, progressInterval);
 									}
 
 									// Initialize form data
-									if (submit_options) {
-										form_data_callback = submit_options.formDataInitCallback;
+									if (submitOptions) {
+										formDataCallback = submitOptions.formDataInitCallback;
 									}
-									if (form_data_callback) {
-										delete submit_options.formDataInitCallback;
+									if (formDataCallback) {
+										delete submitOptions.formDataInitCallback;
 									} else {
-										form_data_callback = data.amsFormDataInitCallback;
+										formDataCallback = data.amsFormDataInitCallback;
 									}
-									if (form_data_callback) {
+									if (formDataCallback) {
 										var veto = {};
-										if (typeof(form_data_callback) === 'function') {
-											form_data = form_data_callback.call(form, veto);
+										if (typeof(formDataCallback) === 'function') {
+											formData = formDataCallback.call(form, veto);
 										} else {
-											form_data = ams.executeFunctionByName(form_data_callback, form, veto);
+											formData = ams.executeFunctionByName(formDataCallback, form, veto);
 										}
 										if (veto.veto) {
 											button = form.data('ams-submit-button');
@@ -1474,44 +1481,44 @@
 											return false;
 										}
 									} else {
-										form_data = data.amsFormData || {};
+										formData = data.amsFormData || {};
 									}
 
 									// Check submit button for custom action handler and target
 									button = $(form.data('ams-submit-button'));
 									if (button && button.exists()) {
-										button_data = button.data();
-										button_target = button_data.amsFormSubmitTarget;
+										buttonData = button.data();
+										buttonTarget = buttonData.amsFormSubmitTarget;
 									} else {
-										button_data = {};
+										buttonData = {};
 									}
 
 									// Check action URL
 									var url;
-									var form_handler = handler || button_data.amsFormHandler || data.amsFormHandler || '';
-									if (form_handler.startsWith(window.location.protocol)) {
-										url = form_handler;
+									var formHandler = handler || buttonData.amsFormHandler || data.amsFormHandler || '';
+									if (formHandler.startsWith(window.location.protocol)) {
+										url = formHandler;
 									} else {
-										var action = button_data.amsFormAction || form.attr('action').replace(/#/, '');
+										var action = buttonData.amsFormAction || form.attr('action').replace(/#/, '');
 										if (action.startsWith(window.location.protocol)) {
 											url = action;
 										} else {
 											url = ams.ajax.getAddr() + action;
 										}
-										url += form_handler;
+										url += formHandler;
 									}
-									progress_handler = button_data.amsProgressHandler || data.amsProgressHandler || '';
-									progress_interval = button_data.amsProgressInterval || data.amsProgressInterval || 1000;
-									progress_callback = button_data.amsProgressCallback || data.amsProgressCallback;
-									progress_end_callback = button_data.amsProgressEndCallback || data.amsProgressEndCallback;
+									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 (submit_options && submit_options.initSubmitTarget) {
-										ams.executeFunctionByName(submit_options.initSubmitTarget, form);
+									if (submitOptions && submitOptions.initSubmitTarget) {
+										ams.executeFunctionByName(submitOptions.initSubmitTarget, form);
 									} else {
 										if (data.amsFormInitSubmitTarget) {
-											target = $(button_target || data.amsFormSubmitTarget || '#content');
+											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);
@@ -1519,14 +1526,14 @@
 									}
 
 									// Complete form data
-									if (submit_options) {
-										form_data = $.extend({}, form_data, submit_options.form_data);
+									if (submitOptions) {
+										formData = $.extend({}, formData, submitOptions.form_data);
 									}
 
 									// Check progress handler
 									var hasUpload;
-									if (progress_handler) {
-										form_data.progress_id = ams.generateUUID();
+									if (progressHandler) {
+										formData.progress_id = ams.generateUUID();
 									} else {
 										// Check progress meter via Apache progress module
 										hasUpload = typeof(options.uuid) !== 'undefined';
@@ -1543,7 +1550,7 @@
 										url: url,
 										type: 'post',
 										cache: false,
-										data: form_data,
+										data: formData,
 										dataType: data.amsFormDatatype,
 										beforeSerialize: function(/*form, options*/) {
 											if (typeof(globals.tinyMCE) !== 'undefined') {
@@ -1563,12 +1570,12 @@
 									};
 
 									// Initialize IFrame for custom download target
-									var download_target = (submit_options && submit_options.downloadTarget) || data.amsFormDownloadTarget;
-									if (download_target) {
-										var iframe = $('iframe[name="' + 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', download_target)
+																		   .attr('name', downloadTarget)
 																		   .appendTo($('body'));
 										}
 										defaults = $.extend({}, defaults, {
@@ -1623,21 +1630,21 @@
 											iframe: hasUpload
 										});
 									}
-									var settings = $.extend({}, defaults, options, form_options, submit_options);
+									var settings = $.extend({}, defaults, options, formOptions, submitOptions);
 
 									// Initialize progress handler
-									if (progress_handler) {
-										_getProgress(progress_handler, form_data.progress_id);
+									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 (download_target) {
+									if (downloadTarget) {
 										var modal = $(form).parents('.modal-dialog');
-										var keep_modal = modal.exists() && button.exists() && button.data('ams-keep-modal');
-										if (modal.exists() && (keep_modal !== true)) {
+										var keepModal = modal.exists() && button.exists() && button.data('ams-keep-modal');
+										if (modal.exists() && (keepModal !== true)) {
 											ams.dialog.close(form);
 										} else {
 											setTimeout(function() {
@@ -1780,13 +1787,13 @@
 			}
 
 			var data = form.data();
-			var data_type;
+			var dataType;
 			if (data.amsFormDatatype) {
-				data_type = data.amsFormDatatype;
+				dataType = data.amsFormDatatype;
 			} else {
-				var request_data = ams.ajax.getResponse(request);
-				data_type = request_data.content_type;
-				result = request_data.data;
+				var response = ams.ajax.getResponse(request);
+				dataType = response.contentType;
+				result = response.data;
 			}
 
 			var target;
@@ -1796,7 +1803,7 @@
 				target = $(data.amsFormSubmitTarget || '#content');
 			}
 
-			switch (data_type) {
+			switch (dataType) {
 				case 'json':
 					ams.ajax.handleJSON(result, form, target);
 					break;
@@ -1837,9 +1844,9 @@
 		 */
 		_getSubmitValidators: function(form) {
 			var validators = [];
-			var form_validator = form.data('ams-form-validator');
-			if (form_validator) {
-				validators.push([form, form_validator]);
+			var formValidator = form.data('ams-form-validator');
+			if (formValidator) {
+				validators.push([form, formValidator]);
 			}
 			$('[data-ams-form-validator]', form).each(function() {
 				var source = $(this);
@@ -1868,11 +1875,11 @@
 				var validator = validators[index];
 				var source = validator[0];
 				var handler = validator[1];
-				var validator_result = ams.executeFunctionByName(handler, form, source);
-				if (validator_result === false) {
+				var validatorResult = ams.executeFunctionByName(handler, form, source);
+				if (validatorResult === false) {
 					result = false;
-				} else if (typeof(validator_result) === 'string') {
-					output.push(validator_result);
+				} else if (typeof(validatorResult) === 'string') {
+					output.push(validatorResult);
 				} else if (result.length && (result.length > 0)) {
 					output = output.concat(result);
 				}
@@ -1925,22 +1932,22 @@
 				if (errors.widgets) {
 					for (index = 0; index < errors.widgets.length; index++) {
 						// set widget status message
-						var widget_data = errors.widgets[index];
-						var widget = $('[name="' + widget_data.name + '"]', form);
+						var widgetData = errors.widgets[index];
+						var widget = $('[name="' + widgetData.name + '"]', form);
 						widget.parents('label:first')
 								.removeClassPrefix('state-')
 								.addClass('state-error')
-								.after('<span for="name" class="state-error">' + widget_data.message + '</span>');
+								.after('<span for="name" class="state-error">' + widgetData.message + '</span>');
 						// complete form alert message
-						if (widget_data.label) {
-							message.push(widget_data.label + ' : ' + widget_data.message);
+						if (widgetData.label) {
+							message.push(widgetData.label + ' : ' + widgetData.message);
 						}
 						// mark parent tab (if any) with error status
-						var tab_index = widget.parents('.tab-pane').index() + 1;
-						if (tab_index > 0) {
-							var nav_tabs = $('.nav-tabs', $(widget).parents('.tabforms'));
-							$('li:nth-child(' + tab_index + ')', nav_tabs).removeClassPrefix('state-')
-									.addClass('state-error');
+						var tabIndex = widget.parents('.tab-pane').index() + 1;
+						if (tabIndex > 0) {
+							var navTabs = $('.nav-tabs', $(widget).parents('.tabforms'));
+							$('li:nth-child(' + tabIndex + ')', navTabs).removeClassPrefix('state-')
+																		.addClass('state-error');
 							$('li.state-error:first a', form).click();
 						}
 					}
@@ -2034,14 +2041,14 @@
 											'</div>';
 									}
 
-									var source_data;
+									var sourceData;
 									var url;
 									if (typeof(source) === 'string') {
-										source_data = {};
+										sourceData = {};
 										url = source;
 									} else {
-										source_data = source.data();
-										url = source.attr('href') || source_data.amsUrl;
+										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);
@@ -2059,14 +2066,14 @@
 										$.ajax({
 											url: url,
 											type: 'get',
-											cache: source_data.amsAllowCache === undefined ? false : source_data.amsAllowCache,
+											cache: sourceData.amsAllowCache === undefined ? false : sourceData.amsAllowCache,
 											data: options,
 											success: function(data, status, request) {
 												$('body').modalmanager('removeLoading');
-												var request_data = ams.ajax.getResponse(request);
-												var data_type = request_data.content_type;
-												var result = request_data.data;
-												switch (data_type) {
+												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;
@@ -2081,27 +2088,27 @@
 													default:
 														var content = $(result);
 														var dialog = $('.modal-dialog', content.wrap('<div></div>').parent());
-														var dialog_data = dialog.data();
-														var data_options = {
+														var dialogData = dialog.data();
+														var dataOptions = {
 															backdrop: 'static',
-															overflow: dialog_data.amsModalOverflow || '.modal-viewport',
-															maxHeight: dialog_data.amsModalMaxHeight === undefined ?
+															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(dialog_data.amsModalMaxHeight)
+																	: ams.getFunctionByName(dialogData.amsModalMaxHeight)
 														};
-														var settings = $.extend({}, data_options, dialog_data.amsModalOptions);
-														settings = ams.executeFunctionByName(dialog_data.amsModalInitCallback, dialog, settings) || settings;
+														var settings = $.extend({}, dataOptions, dialogData.amsModalOptions);
+														settings = ams.executeFunctionByName(dialogData.amsModalInitCallback, dialog, settings) || settings;
 														$('<div>').addClass('modal fade')
 																  .append(content)
 																  .modal(settings)
 																  .on('shown', ams.dialog.shown)
 																  .on('hidden', ams.dialog.hidden);
 														ams.initContent(content);
-														if (source_data.amsLogEvent !== false) {
+														if (sourceData.amsLogEvent !== false) {
 															ams.stats.logPageview(url);
 														}
 												}
@@ -2120,14 +2127,14 @@
 
 			function resetViewport(ev) {
 				var top = $('.scrollmarker.top', viewport);
-				var top_position = viewport.scrollTop();
-				if (top_position > 0) {
+				var topPosition = viewport.scrollTop();
+				if (topPosition > 0) {
 					top.show();
 				} else {
 					top.hide();
 				}
 				var bottom = $('.scrollmarker.bottom', viewport);
-				if (maxHeight + top_position >= viewport.get(0).scrollHeight) {
+				if (maxHeight + topPosition >= viewport.get(0).scrollHeight) {
 					bottom.hide();
 				} else {
 					bottom.show();
@@ -2314,18 +2321,18 @@
 
 		/** Context menu handler */
 		contextMenuHandler: function(target, menu) {
-			var menu_data = menu.data();
-			if (menu_data.toggle === 'modal') {
+			var menuData = menu.data();
+			if (menuData.toggle === 'modal') {
 				ams.dialog.open(menu);
 			} else {
-				var href = menu.attr('href') || menu_data.amsUrl;
+				var href = menu.attr('href') || menuData.amsUrl;
 				if (!href || href.startsWith('javascript') || menu.attr('target')) {
 					return;
 				}
 				ams.event.stop();
-				var href_getter = ams.getFunctionByName(href);
-				if (typeof(href_getter) === 'function') {
-					href = href_getter.call(menu, target);
+				var hrefGetter = ams.getFunctionByName(href);
+				if (typeof(hrefGetter) === 'function') {
+					href = hrefGetter.call(menu, target);
 				}
 				if (typeof(href) === 'function') {
 					// Javascript function call
@@ -2436,26 +2443,26 @@
 			$('[data-ams-plugins]', element).each(function() {
 
 				var source = $(this);
-				var ams_plugins = source.data('ams-plugins');
-				if (typeof(ams_plugins) === 'string') {
+				var amsPlugins = source.data('ams-plugins');
+				if (typeof(amsPlugins) === 'string') {
 					var names = source.data('ams-plugins').split(/\s+/);
 					for (var index = 0; index < names.length; index++) {
 						name = names[index];
-						var new_plugin = {
+						var newPlugin = {
 							src: source.data('ams-plugin-' + name + '-src'),
 							css: source.data('ams-plugin-' + name + '-css'),
 							callback: source.data('ams-plugin-' + name + '-callback'),
 							register: source.data('ams-plugin-' + name + '-register'),
 							async: source.data('ams-plugin-' + name + '-async')
 						};
-						_registerPlugin(name, new_plugin);
+						_registerPlugin(name, newPlugin);
 					}
 				} else {
-					for (name in ams_plugins) {
-						if (!ams_plugins.hasOwnProperty(name)) {
+					for (name in amsPlugins) {
+						if (!amsPlugins.hasOwnProperty(name)) {
 							continue;
 						}
-						_registerPlugin(name, ams_plugins[name]);
+						_registerPlugin(name, amsPlugins[name]);
 					}
 				}
 			});
@@ -2511,8 +2518,8 @@
 							callbacks(element);
 							break;
 						default:
-							for (var cb_index = 0; cb_index < callbacks.length; cb_index++) {
-								var callback = callbacks[cb_index];
+							for (var cbIndex = 0; cbIndex < callbacks.length; cbIndex++) {
+								var callback = callbacks[cbIndex];
 								if (typeof(callback) === 'function') {
 									callback(element);
 								}
@@ -2530,12 +2537,12 @@
 		 */
 		initData: function(element) {
 			$('[data-ams-data]', element).each(function() {
-				var data_element = $(this);
-				var data = data_element.data('ams-data');
+				var dataElement = $(this);
+				var data = dataElement.data('ams-data');
 				if (data) {
 					for (var name in data) {
 						if (data.hasOwnProperty(name)) {
-							data_element.attr('data-' + name, data[name]);
+							dataElement.attr('data-' + name, data[name]);
 						}
 					}
 				}
@@ -2621,7 +2628,7 @@
 									   hints.each(function () {
 										   var hint = $(this);
 										   var data = hint.data();
-										   var data_options = {
+										   var dataOptions = {
 											   html: data.amsHintHtml,
 											   title: ams.getFunctionByName(data.amsHintTitleGetter) || function () {
 												   var hint = $(this);
@@ -2633,7 +2640,7 @@
 											   gravity: data.amsHintGravity || 'sw',
 											   offset: data.amsHintOffset || 0
 										   };
-										   var settings = $.extend({}, data_options, data.amsHintOptions);
+										   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);
@@ -2651,11 +2658,11 @@
 					menus.each(function() {
 						var menu = $(this);
 						var data = menu.data();
-						var data_options = {
+						var dataOptions = {
 							menuSelector: data.amsContextmenuSelector,
 							menuSelected: ams.helpers.contextMenuHandler
 						};
-						var settings = $.extend({}, data_options, data.amsContextmenuOptions);
+						var settings = $.extend({}, dataOptions, data.amsContextmenuOptions);
 						settings = ams.executeFunctionByName(data.amsContextmenuInitCallback, menu, settings) || settings;
 						var plugin = menu.contextMenu(settings);
 						ams.executeFunctionByName(data.amsContextmenuAfterInitCallback, menu, plugin, settings);
@@ -2724,7 +2731,7 @@
 					if (!data.amsChecker) {
 						var checker = $('<label class="checkbox"></label>');
 						var fieldname = data.amsCheckerFieldname || ('checker_'+ams.generateId());
-						var checkbox_id = fieldname.replace(/\./, '_');
+						var checkboxId = fieldname.replace(/\./, '_');
 						var prefix = data.amsCheckerHiddenPrefix;
 						var hidden = null;
 						var checkedValue = data.amsCheckerHiddenValueOn || 'true';
@@ -2740,7 +2747,7 @@
 													  .prependTo(legend);
 						}
 						var input = $('<input type="checkbox">').attr('name', fieldname)
-																.attr('id', checkbox_id)
+																.attr('id', checkboxId)
 																.data('ams-checker-hidden-input', hidden)
 																.data('ams-checker-init', true)
 																.val(data.amsCheckerValue || true)
@@ -2820,8 +2827,8 @@
 										sliders.each(function() {
 											var slider = $(this);
 											var data = slider.data();
-											var data_options = {};
-											var settings = $.extend({}, data_options, slider.data.amsSliderOptions);
+											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);
@@ -2839,13 +2846,13 @@
 					draggables.each(function() {
 						var draggable = $(this);
 						var data = draggable.data();
-						var data_options = {
+						var dataOptions = {
 							containment: data.amsDraggableContainment,
 							helper: ams.getFunctionByName(data.amsDraggableHelper) || data.amsDraggableHelper,
 							start: ams.getFunctionByName(data.amsDraggableStart),
 							stop: ams.getFunctionByName(data.amsDraggableStop)
 						};
-						var settings = $.extend({}, data_options, data.amsDraggableOptions);
+						var settings = $.extend({}, dataOptions, data.amsDraggableOptions);
 						settings = ams.executeFunctionByName(data.amsDraggableInitCallback, draggable, settings) || settings;
 						var plugin = draggable.draggable(settings);
 						draggable.disableSelection();
@@ -2863,7 +2870,7 @@
 					sortables.each(function() {
 						var sortable = $(this);
 						var data = sortable.data();
-						var data_options = {
+						var dataOptions = {
 							items: data.amsSortableItems,
 							handle: data.amsSortableHandle,
 							connectWith: data.amsSortableConnectwith,
@@ -2873,7 +2880,7 @@
 							placeholder: data.amsSortablePlaceholder,
 							stop: ams.getFunctionByName(data.amsSortableStop)
 						};
-						var settings = $.extend({}, data_options, data.amsSortableOptions);
+						var settings = $.extend({}, dataOptions, data.amsSortableOptions);
 						settings = ams.executeFunctionByName(data.amsSortableInitCallback, sortable, settings) || settings;
 						var plugin = sortable.sortable(settings);
 						sortable.disableSelection();
@@ -2891,7 +2898,7 @@
 					resizables.each(function() {
 						var resizable = $(this);
 						var data = resizable.data();
-						var data_options = {
+						var dataOptions = {
 							autoHide: data.amsResizableAutohide === false ? true : data.amsResizableAutohide,
 							containment: data.amsResizableContainment,
 							grid: data.amsResizableGrid,
@@ -2899,7 +2906,7 @@
 							start: ams.getFunctionByName(data.amsResizableStart),
 							stop: ams.getFunctionByName(data.amsResizableStop)
 						};
-						var settings = $.extend({}, data_options, data.amsResizableOptions);
+						var settings = $.extend({}, dataOptions, data.amsResizableOptions);
 						settings = ams.executeFunctionByName(data.amsResizableInitCallback, resizable, settings) || settings;
 						var plugin = resizable.resizable(settings);
 						resizable.disableSelection();
@@ -2920,8 +2927,8 @@
 										typeaheads.each(function() {
 											var input = $(this);
 											var data = input.data();
-											var data_options = {};
-											var settings = $.extend({}, data_options, data.amsTypeaheadOptions);
+											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);
@@ -2942,7 +2949,7 @@
 										selects.each(function() {
 											var select = $(this);
 											var data = select.data();
-											var data_options = {
+											var dataOptions = {
 												placeholder: data.amsSelect2Placeholder,
 												multiple: data.amsSelect2Multiple,
 												minimumInputLength: data.amsSelect2MinimumInputLength || 0,
@@ -3010,14 +3017,14 @@
 											switch (select.context.type) {
 												case 'text':
 												case 'hidden':
-													if (!data_options.initSelection) {
-														var values_data = select.data('ams-select2-values');
-														if (values_data) {
-															data_options.initSelection = function(element, callback) {
+													if (!dataOptions.initSelection) {
+														var valuesData = select.data('ams-select2-values');
+														if (valuesData) {
+															dataOptions.initSelection = function(element, callback) {
 																var data = [];
-																$(element.val().split(data_options.separator)).each(function() {
+																$(element.val().split(dataOptions.separator)).each(function() {
 																	data.push({id: this,
-																			   text: values_data[this] || this});
+																			   text: valuesData[this] || this});
 																});
 																callback(data);
 															};
@@ -3030,17 +3037,17 @@
 
 											if (select.attr('readonly')) {
 												if (select.attr('type') === 'hidden') {
-													data_options.query = function () {
+													dataOptions.query = function () {
 														return [];
 													};
 												}
 											} else if (data.amsSelect2Query) {
 												// Custom query method
-												data_options.query = ams.getFunctionByName(data.amsSelect2Query);
-												data_options.minimumInputLength = data.amsSelect2MinimumInputLength || 1;
+												dataOptions.query = ams.getFunctionByName(data.amsSelect2Query);
+												dataOptions.minimumInputLength = data.amsSelect2MinimumInputLength || 1;
 											} else if (data.amsSelect2QueryUrl) {
 												// AJAX query
-												data_options.ajax = {
+												dataOptions.ajax = {
 													url: data.amsSelect2QueryUrl,
 													quietMillis: data.amsSelect2QuietMillis || 200,
 													type: data.amsSelect2QueryType || 'POST',
@@ -3054,10 +3061,10 @@
 													},
 													results: ams.helpers.select2QueryUrlResultsCallback
 												};
-												data_options.minimumInputLength = data.amsSelect2MinimumInputLength || 1;
+												dataOptions.minimumInputLength = data.amsSelect2MinimumInputLength || 1;
 											} else if (data.amsSelect2QueryMethod) {
 												// JSON-RPC query
-												data_options.query = function(options) {
+												dataOptions.query = function(options) {
 													var settings = {
 														url: data.amsSelect2MethodTarget || ams.jsonrpc.getAddr(),
 														type: data.amsSelect2MethodType || 'POST',
@@ -3075,28 +3082,28 @@
 													settings = $.extend({}, settings, data.amsSelect2QueryOptions);
 													settings = ams.executeFunctionByName(data.amsSelect2QueryInitCallback, select, settings) || settings;
 													ams.ajax.check($.jsonRpc,
-																   ams.baseURL + 'ext/jquery-jsonrpc' + (ams.devmode ? '.js' : '.min.js'),
+																   ams.baseURL + 'ext/jquery-jsonrpc' + ams.devext + '.js',
 																   function() {
 																		$.jsonRpc(settings);
 																   });
 												};
-												data_options.minimumInputLength = data.amsSelect2MinimumInputLength || 1;
+												dataOptions.minimumInputLength = data.amsSelect2MinimumInputLength || 1;
 											} else if (data.amsSelect2Tags) {
 												// Tags mode
-												data_options.tags = data.amsSelect2Tags;
+												dataOptions.tags = data.amsSelect2Tags;
 											} else if (data.amsSelect2Data) {
 												// Provided data mode
-												data_options.data = data.amsSelect2Data;
+												dataOptions.data = data.amsSelect2Data;
 											}
 
 											if (data.amsSelect2EnableFreeTags) {
-												data_options.createSearchChoice = function(term) {
+												dataOptions.createSearchChoice = function(term) {
 													return {id: term,
 															text: (data.amsSelect2FreeTagsPrefix || ams.i18n.SELECT2_FREETAG_PREFIX) + term};
 												};
 											}
 
-											var settings = $.extend({}, data_options, data.amsSelect2Options);
+											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);
@@ -3133,11 +3140,11 @@
 										masks.each(function() {
 											var mask = $(this);
 											var data = mask.data();
-											var data_options = {
+											var dataOptions = {
 												placeholder: data.amsMaskeditPlaceholder === undefined ? 'X' : data.amsMaskeditPlaceholder,
 												complete: ams.getFunctionByName(data.amsMaskeditComplete)
 											};
-											var settings = $.extend({}, data_options, data.amsMaskeditOptions);
+											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);
@@ -3163,15 +3170,15 @@
 										masks.each(function() {
 											var input = $(this);
 											var data = input.data();
-											var data_options;
+											var dataOptions;
 											if (typeof(data.inputMask) === 'object') {
-												data_options = data.inputMask;
+												dataOptions = data.inputMask;
 											} else {
-												data_options = {
+												dataOptions = {
 													mask: data.inputMask.toString()
 												};
 											}
-											var settings = $.extend({}, data_options, data.amsInputmaskOptions);
+											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);
@@ -3196,14 +3203,14 @@
 										datepickers.each(function() {
 											var input = $(this);
 											var data = input.data();
-											var data_options = {
+											var dataOptions = {
 												lang: data.amsDatetimepickerLang || ams.lang,
 												format: data.amsDatetimepickerFormat || 'd/m/y',
 												datepicker: true,
 												dayOfWeekStart: 1,
 												timepicker: false
 											};
-											var settings = $.extend({}, data_options, data.amsDatetimepickerOptions);
+											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);
@@ -3228,14 +3235,14 @@
 										datetimepickers.each(function() {
 											var input = $(this);
 											var data = input.data();
-											var data_options = {
+											var dataOptions = {
 												lang: data.amsDatetimepickerLang || ams.lang,
 												format: data.amsDatetimepickerFormat || 'd/m/y H:i',
 												datepicker: true,
 												dayOfWeekStart: 1,
 												timepicker: true
 											};
-											var settings = $.extend({}, data_options, data.amsDatetimepickerOptions);
+											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);
@@ -3260,13 +3267,13 @@
 										timepickers.each(function() {
 											var input = $(this);
 											var data = input.data();
-											var data_options = {
+											var dataOptions = {
 												lang: data.amsDatetimepickerLang || ams.lang,
 												format: data.amsDatetimepickerFormat || 'H:i',
 												datepicker: false,
 												timepicker: true
 											};
-											var settings = $.extend({}, data_options, data.amsDatetimepickerOptions);
+											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);
@@ -3290,10 +3297,10 @@
 										colorpickers.each(function() {
 											var input = $(this);
 											var data = input.data();
-											var data_options = {
+											var dataOptions = {
 												position: data.amsColorpickerPosition || input.closest('label.input').data('ams-colorpicker-position') || 'bottom left'
 											};
-											var settings = $.extend({}, data_options, data.amsColorpickerOptions);
+											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);
@@ -3347,7 +3354,7 @@
 										forms.each(function() {
 											var form = $(this);
 											var data = form.data();
-											var data_options = {
+											var dataOptions = {
 												ignore: null,
 												submitHandler: form.attr('data-async') !== undefined ?
 															   data.amsFormSubmitHandler === undefined ?
@@ -3369,13 +3376,13 @@
 																		$('.state-error', form).removeClass('state-error');
 																		for (var index=0; index < validator.errorList.length; index++) {
 																			var error = validator.errorList[index];
-																			var tab_index = $(error.element).parents('.tab-pane').index() + 1;
-																			if (tab_index > 0) {
-																				var nav_tabs = $('.nav-tabs', $(error.element).parents('.tabforms'));
-																				$('li:nth-child(' + tab_index + ')', nav_tabs)
+																			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', nav_tabs).click();
+																				$('li.state-error:first a', navTabs).click();
 																			}
 																		}
 																	}
@@ -3384,11 +3391,11 @@
 											};
 											$('[data-ams-validate-rules]', form).each(function(index) {
 												if (index === 0) {
-													data_options.rules = {};
+													dataOptions.rules = {};
 												}
-												data_options.rules[$(this).attr('name')] = $(this).data('ams-validate-rules');
+												dataOptions.rules[$(this).attr('name')] = $(this).data('ams-validate-rules');
 											});
-											var settings = $.extend({}, data_options, data.amsValidateOptions);
+											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);
@@ -3435,24 +3442,35 @@
 												var sortings = sorting.split(';');
 												sorting = [];
 												for (index=0; index < sortings.length; index++) {
-													var col_sorting = sortings[index].split(',');
-													col_sorting[0] = parseInt(col_sorting[0]);
-													sorting.push(col_sorting);
+													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 = sortable;
+													columns[index] = column;
 												}
 											}
 											// Check columns types
-											var columns = [];
-											var sort_types = $('th', table).listattr('data-ams-datatable-stype');
-											for (index=0; index < sort_types.length; index++) {
-												var sort_type = sort_types[index];
-												if (sort_type) {
-													var column = columns[index] || {};
-													column.sType = sort_type;
+											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;
 												}
 											}
 											// Set options
-											var data_options = {
+											var dataOptions = {
 												bJQueryUI: false,
 												bFilter: data.amsDatatableGlobalFilter !== false || extensions.indexOf('columnfilter') >= 0,
 												bPaginate: data.amsDatatablePagination !== false,
@@ -3468,10 +3486,11 @@
 												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>');
+																	   .html((ams.plugins.i18n.datatables.sColumns || "Columns") +
+																			 ' <i class="fa fa-fw fa-caret-down"></i>');
 												}
 											};
-											var settings = $.extend({}, data_options, data.amsDatatableOptions);
+											var settings = $.extend({}, dataOptions, data.amsDatatableOptions);
 											if (extensions.length > 0) {
 												for (index=0; index < extensions.length; index++) {
 													switch (extensions[index]) {
@@ -3494,11 +3513,11 @@
 														case 'colvis':
 															ams.ajax.check($.fn.dataTable.ColVis,
 																		   ams.baseURL + 'ext/jquery-dataTables-colVis' + ams.devext + '.js');
-															var cv_default = {
+															var cvDefault = {
 																activate: 'click',
 																sAlign: 'right'
 															};
-															settings.oColVis = $.extend({}, cv_default, data.amsDatatableColvisOptions);
+															settings.oColVis = $.extend({}, cvDefault, data.amsDatatableColvisOptions);
 															break;
 														case 'editable':
 															ams.ajax.check($.fn.editable,
@@ -3543,67 +3562,67 @@
 													for (index=0; index < extensions.length; index++) {
 														switch (extensions[index]) {
 															case 'autofill':
-																var af_settings = $.extend({}, data.amsDatatableAutofillOptions, settings.autofill);
-																af_settings = ams.executeFunctionByName(data.amsDatatableAutofillInitCallback, table, af_settings) || af_settings;
+																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, af_settings)
-																							: ams.executeFunctionByName(data.amsDatatableAutofillConstructor, table, plugin, af_settings));
+																							new $.fn.dataTable.AutoFill(table, afSettings)
+																							: ams.executeFunctionByName(data.amsDatatableAutofillConstructor, table, plugin, afSettings));
 																break;
 															case 'columnfilter':
-																var cf_default = {
+																var cfDefault = {
 																	sPlaceHolder: 'head:after'
 																};
-																var cf_settings = $.extend({}, cf_default, data.amsDatatableColumnfilterOptions, settings.columnfilter);
-																cf_settings = ams.executeFunctionByName(data.amsDatatableColumnfilterInitCallback, table, cf_settings) || cf_settings;
+																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(cf_settings)
-																							: ams.executeFunctionByName(data.amsDatatableColumnfilterConstructor, table, plugin, cf_settings));
+																							plugin.columnFilter(cfSettings)
+																							: ams.executeFunctionByName(data.amsDatatableColumnfilterConstructor, table, plugin, cfSettings));
 																break;
 															case 'editable':
-																var ed_settings = $.extend({}, data.amsDatatableEditableOptions, settings.editable);
-																ed_settings = ams.executeFunctionByName(data.amsDatatableEditableInitCallback, table, ed_settings) || ed_settings;
+																var edSettings = $.extend({}, data.amsDatatableEditableOptions, settings.editable);
+																edSettings = ams.executeFunctionByName(data.amsDatatableEditableInitCallback, table, edSettings) || edSettings;
 																table.data('ams-editable', data.amsDatatableEditableConstructor === undefined ?
-																							table.makeEditable(ed_settings)
-																							: ams.executeFunctionByName(data.amsDatatableEditableConstructor, table, plugin, ed_settings));
+																							table.makeEditable(edSettings)
+																							: ams.executeFunctionByName(data.amsDatatableEditableConstructor, table, plugin, edSettings));
 																break;
 															case 'fixedcolumns':
-																var fc_settings = $.extend({}, data.amsDatatableFixedcolumnsOptions, settings.fixedcolumns);
-																fc_settings = ams.executeFunctionByName(data.amsDatatableFixedcolumnsInitCallback, table, fc_settings) || fc_settings;
+																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, fc_settings)
-																							: ams.executeFunctionByName(data.amsDatatableFixedcolumnsConstructor, table, plugin, fc_settings));
+																							new $.fn.dataTable.FixedColumns(table, fcSettings)
+																							: ams.executeFunctionByName(data.amsDatatableFixedcolumnsConstructor, table, plugin, fcSettings));
 																break;
 															case 'fixedheader':
-																var fh_settings = $.extend({}, data.amsDatatableFixedheaderOptions, settings.fixedheader);
-																fh_settings = ams.executeFunctionByName(data.amsDatatableFixedheadeInitCallback, table, fh_settings) || fh_settings;
+																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, fh_settings)
-																							: ams.executeFunctionByName(data.amsDatatableFixedheaderConstructor, table, plugin, fh_settings));
+																							new $.fn.dataTable.FixedHeader(table, fhSettings)
+																							: ams.executeFunctionByName(data.amsDatatableFixedheaderConstructor, table, plugin, fhSettings));
 																break;
 															case 'keytable':
-																var kt_default = {
+																var ktDefault = {
 																	table: table.get(0),
 																	datatable: plugin
 																};
-																var kt_settings = $.extend({}, kt_default, data.amsDatatableKeytableOptions, settings.keytable);
-																kt_settings = ams.executeFunctionByName(data.amsDatatableKeytableInitCallback, table, kt_settings) || kt_settings;
+																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(kt_settings)
-																							: ams.executeFunctionByName(data.amsDatatableKeytableConstructor, table, plugin, kt_settings));
+																							new KeyTable(ktSettings)
+																							: ams.executeFunctionByName(data.amsDatatableKeytableConstructor, table, plugin, ktSettings));
 																break;
 															case 'rowgrouping':
-																var rg_settings = $.extend({}, data.amsDatatableRowgroupingOptions, settings.rowgrouping);
-																rg_settings = ams.executeFunctionByName(data.amsDatatableRowgroupingInitCallback, table, rg_settings) || rg_settings;
+																var rgSettings = $.extend({}, data.amsDatatableRowgroupingOptions, settings.rowgrouping);
+																rgSettings = ams.executeFunctionByName(data.amsDatatableRowgroupingInitCallback, table, rgSettings) || rgSettings;
 																table.data('ams-rowgrouping', data.amsDatatableRowgroupingConstructor === undefined ?
-																							table.rowGrouping(rg_settings)
-																							: ams.executeFunctionByName(data.amsDatatableRowgroupingConstructor, table, plugin, rg_settings));
+																							table.rowGrouping(rgSettings)
+																							: ams.executeFunctionByName(data.amsDatatableRowgroupingConstructor, table, plugin, rgSettings));
 																break;
 															case 'rowreordering':
-																var rr_settings = $.extend({}, data.amsDatatableRowreorderingOptions, settings.rowreordering);
-																rr_settings = ams.executeFunctionByName(data.amsDatatableRowreorderingInitCallback, table, rr_settings) || rr_settings;
+																var rrSettings = $.extend({}, data.amsDatatableRowreorderingOptions, settings.rowreordering);
+																rrSettings = ams.executeFunctionByName(data.amsDatatableRowreorderingInitCallback, table, rrSettings) || rrSettings;
 																table.data('ams-rowreordering', data.amsDatatableRowreorderingConstructor === undefined ?
-																							table.rowReordering(rr_settings)
-																							: ams.executeFunctionByName(data.amsDatatableRowreorderingConstructor, table, plugin, rr_settings));
+																							table.rowReordering(rrSettings)
+																							: ams.executeFunctionByName(data.amsDatatableRowreorderingConstructor, table, plugin, rrSettings));
 																break;
 															default:
 																break;
@@ -3644,7 +3663,7 @@
 													$(this.cells[0]).removeClass('drag-handle');
 												});
 											}
-											var data_options = {
+											var dataOptions = {
 												onDragClass: data.amsTabledndDragClass || 'dragging-row',
 												onDragStart: ams.getFunctionByName(data.amsTabledndDragStart),
 												dragHandle: data.amsTabledndDragHandle,
@@ -3657,14 +3676,14 @@
 														$(row).data('ams-disabled-handlers', 'click');
 														var rows = [];
 														$(dnd_table.rows).each(function() {
-															var row_id = $(this).data('ams-element-name');
-															if (row_id) {
-																rows.push(row_id);
+															var rowId = $(this).data('ams-element-name');
+															if (rowId) {
+																rows.push(rowId);
 															}
 														});
-														var local_target = ams.getFunctionByName(target);
-														if (typeof(local_target) === 'function') {
-															local_target.call(table, dnd_table, rows);
+														var localTarget = ams.getFunctionByName(target);
+														if (typeof(localTarget) === 'function') {
+															localTarget.call(table, dnd_table, rows);
 														} else {
 															ams.ajax.post(target, {names: JSON.stringify(rows)});
 														}
@@ -3676,7 +3695,7 @@
 													return false;
 												}
 											};
-											var settings = $.extend({}, data_options, data.amsTabledndOptions);
+											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);
@@ -3701,7 +3720,7 @@
 										   var image = $(this);
 										   var data = image.data();
 										   var parent = data.amsImgareaselectParent ? image.parents(data.amsImgareaselectParent) : 'body';
-										   var data_options = {
+										   var dataOptions = {
 											   instance: true,
 											   handles: true,
 											   parent: parent,
@@ -3722,7 +3741,7 @@
 												   $('input[name="' + target + 'y2"]', parent).val(selection.y2);
 											   }
 										   };
-										   var settings = $.extend({}, data_options, data.amsImgareaselectOptions);
+										   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);
@@ -3772,7 +3791,7 @@
 													}
 												}
 											}
-											var data_options = {
+											var dataOptions = {
 												type: data.amsFancyboxType,
 												padding: data.amsFancyboxPadding || 10,
 												margin: data.amsFancyboxMargin || 10,
@@ -3785,7 +3804,7 @@
 													}
 												}
 											};
-											var settings = $.extend({}, data_options, data.amsFancyboxOptions);
+											var settings = $.extend({}, dataOptions, data.amsFancyboxOptions);
 											settings = ams.executeFunctionByName(data.amsFancyboxInitCallback, fancybox, settings) || settings;
 											var plugin = fancybox.fancybox(settings);
 											ams.executeFunctionByName(data.amsFancyboxAfterInitCallback, fancybox, plugin, settings);
@@ -3827,10 +3846,10 @@
 															scrollbars.each(function() {
 																var scrollbar = $(this);
 																var data = scrollbar.data();
-																var data_options = {
+																var dataOptions = {
 																	theme: data.amsScrollbarTheme || 'light'
 																};
-																var settings = $.extend({}, data_options, data.amsScrollbarOptions);
+																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);
@@ -3920,16 +3939,16 @@
 		 */
 		messageBox: function(options) {
 			var data = $(this).data();
-			var data_options = $.extend({}, options, data.amsMessageboxOptions);
-			var settings = $.extend({}, data_options, {
-				title: data.amsMessageboxTitle || data_options.title || '',
-				content: data.amsMessageboxContent || data_options.content || '',
-				icon: data.amsMessageboxIcon || data_options.icon,
-				number: data.amsMessageboxNumber || data_options.number,
-				timeout: data.amsMessageboxTimeout || data_options.timeout
+			var dataOptions = $.extend({}, options, data.amsMessageboxOptions);
+			var settings = $.extend({}, dataOptions, {
+				title: data.amsMessageboxTitle || dataOptions.title || '',
+				content: data.amsMessageboxContent || dataOptions.content || '',
+				icon: data.amsMessageboxIcon || dataOptions.icon,
+				number: data.amsMessageboxNumber || dataOptions.number,
+				timeout: data.amsMessageboxTimeout || dataOptions.timeout
 			});
-			var status = data.amsMessageboxStatus || data_options.status || 'info';
-			var callback = ams.getFunctionByName(data.amsMessageboxCallback || data_options.callback);
+			var status = data.amsMessageboxStatus || dataOptions.status || 'info';
+			var callback = ams.getFunctionByName(data.amsMessageboxCallback || dataOptions.callback);
 			ams.skin.messageBox(status, settings, callback);
 		},
 
@@ -3949,16 +3968,16 @@
 		 */
 		smallBox: function(options) {
 			var data = $(this).data();
-			var data_options = $.extend({}, options, data.amsSmallboxOptions);
-			var settings = $.extend({}, data_options, {
-				title: data.amsSmallboxTitle || data_options.title || '',
-				content: data.amsSmallboxContent || data_options.content || '',
-				icon: data.amsSmallboxIcon || data_options.icon,
-				iconSmall: data.amsSmallboxIconSmall || data_options.iconSmall,
-				timeout: data.amsSmallboxTimeout || data_options.timeout
+			var dataOptions = $.extend({}, options, data.amsSmallboxOptions);
+			var settings = $.extend({}, dataOptions, {
+				title: data.amsSmallboxTitle || dataOptions.title || '',
+				content: data.amsSmallboxContent || dataOptions.content || '',
+				icon: data.amsSmallboxIcon || dataOptions.icon,
+				iconSmall: data.amsSmallboxIconSmall || dataOptions.iconSmall,
+				timeout: data.amsSmallboxTimeout || dataOptions.timeout
 			});
-			var status = data.amsSmallboxStatus || data_options.status || 'info';
-			var callback = ams.getFunctionByName(data.amsSmallboxCallback || data_options.callback);
+			var status = data.amsSmallboxStatus || dataOptions.status || 'info';
+			var callback = ams.getFunctionByName(data.amsSmallboxCallback || dataOptions.callback);
 			ams.skin.smallBox(status, settings, callback);
 		}
 	};
@@ -4029,9 +4048,9 @@
 						var table = link.parents('table');
 						var location = table.data('ams-location') || '';
 						var tr = link.parents('tr');
-						var delete_target = tr.data('ams-delete-target') || table.data('ams-delete-target') || 'delete-element.json';
-						var object_name = tr.data('ams-element-name');
-						MyAMS.ajax.post(location + '/' + delete_target, {'object_name': object_name}, function(result, status) {
+						var deleteTarget = tr.data('ams-delete-target') || table.data('ams-delete-target') || 'delete-element.json';
+						var objectName = tr.data('ams-element-name');
+						MyAMS.ajax.post(location + '/' + deleteTarget, {'object_name': objectName}, function(result, status) {
 							if (result.status === 'success') {
 								if (table.hasClass('datatable')) {
 									table.dataTable().fnDeleteRow(tr[0]);
@@ -4056,15 +4075,15 @@
 		 * Compute navigation page height
 		 */
 		_setPageHeight: function() {
-			var main_height = $('#main').height();
-			var menu_height = ams.left_panel.height();
-			var window_height = $(window).height() - ams.navbar_height;
-			if (main_height > window_height) {
-				ams.left_panel.css('min-height', main_height);
-				ams.root.css('min-height', main_height + ams.navbar_height);
+			var mainHeight = $('#main').height();
+			var menuHeight = ams.leftPanel.height();
+			var windowHeight = $(window).height() - ams.navbarHeight;
+			if (mainHeight > windowHeight) {
+				ams.leftPanel.css('min-height', mainHeight);
+				ams.root.css('min-height', mainHeight + ams.navbarHeight);
 			} else {
-				ams.left_panel.css('min-height', window_height);
-				ams.root.css('min-height', window_height);
+				ams.leftPanel.css('min-height', windowHeight);
+				ams.root.css('min-height', windowHeight);
 			}
 		},
 
@@ -4123,7 +4142,7 @@
 		 * Initialize desktop and mobile widgets
 		 */
 		_initDesktopWidgets: function(element) {
-			if (ams.enable_widgets) {
+			if (ams.enableWidgets) {
 				var widgets = $('.ams-widget', element);
 				if (widgets.length > 0) {
 					ams.ajax.check($.fn.MyAMSWidget,
@@ -4132,11 +4151,11 @@
 									   widgets.each(function () {
 										   var widget = $(this);
 										   var data = widget.data();
-										   var data_options = {
+										   var dataOptions = {
 											   deleteSettingsKey: '#deletesettingskey-options',
 											   deletePositionKey: '#deletepositionkey-options'
 										   };
-										   var settings = $.extend({}, data_options, data.amsWidgetOptions);
+										   var settings = $.extend({}, dataOptions, data.amsWidgetOptions);
 										   settings = ams.executeFunctionByName(data.amsWidgetInitcallback, widget, settings) || settings;
 										   widget.MyAMSWidget(settings);
 									   });
@@ -4147,7 +4166,7 @@
 		},
 
 		_initMobileWidgets: function(element) {
-			if (ams.enable_mobile && ams.enable_widgets) {
+			if (ams.enableMobile && ams.enableWidgets) {
 				ams.skin._initDesktopWidgets(element);
 			}
 		},
@@ -4331,15 +4350,15 @@
 								  menu.attr('title') ||
 								  document.title);
 			} else {
-				var active_url = $('[data-ams-active-menu]').data('ams-active-menu');
-				if (active_url) {
-					menu = $('A[href="' + active_url + '"]', nav);
+				var activeUrl = $('[data-ams-active-menu]').data('ams-active-menu');
+				if (activeUrl) {
+					menu = $('A[href="' + activeUrl + '"]', nav);
 				} else {
 					menu = $('>UL >LI >A[href!="#"]', nav).first();
 				}
 				if (menu.exists()) {
 					updateActiveMenus(menu);
-					if (active_url) {
+					if (activeUrl) {
 						ams.skin._drawBreadCrumb();
 					} else {
 						window.location.hash = menu.attr('href');
@@ -4419,11 +4438,11 @@
 					if (callback) {
 						ams.executeFunctionByName(callback, this, data, status, request, options);
 					} else {
-						var request_data = ams.ajax.getResponse(request);
-						var data_type = request_data.content_type;
-						var result = request_data.data;
+						var response = ams.ajax.getResponse(request);
+						var dataType = response.contentType;
+						var result = response.data;
 						$('.loading', container).remove();
-						switch (data_type) {
+						switch (dataType) {
 							case 'json':
 								ams.ajax.handleJSON(result, container);
 								break;
@@ -4469,8 +4488,8 @@
 		 */
 		setLanguage: function(options) {
 			var lang = options.lang;
-			var handler_type = options.handler_type || 'json';
-			switch (handler_type) {
+			var handlerType = options.handler_type || 'json';
+			switch (handlerType) {
 				case 'json':
 					var method = options.method || 'setUserLanguage';
 					ams.jsonrpc.post(method, {lang: lang}, function() {
@@ -4542,17 +4561,17 @@
 
 		/* Init main components */
 		ams.root = body;
-		ams.left_panel = $('#left-panel');
+		ams.leftPanel = $('#left-panel');
 		ams.shortcuts = $('#shortcut');
 		ams.plugins.initData(body);
 
 		// Init main AJAX events
-		var jquery_xhr = $.ajaxSettings.xhr;
+		var xhr = $.ajaxSettings.xhr;
 		$.ajaxSetup({
 			progress: ams.ajax.progress,
 			progressUpload: ams.ajax.progress,
 			xhr: function() {
-				var request = jquery_xhr();
+				var request = xhr();
 				if (request && (typeof(request.addEventListener) === "function")) {
 					var that = this;
 					request.addEventListener("progress", function(evt) {
@@ -4573,7 +4592,7 @@
 		} else {
 			ams.root.addClass('mobile-detected');
 			ams.device = 'mobile';
-			if (ams.enable_fastclick) {
+			if (ams.enableFastclick) {
 				ams.ajax.check($.fn.noClickDelay,
 							   ams.baseURL + '/ext/jquery-smartclick' + ams.devext + '.js',
 							   function() {
@@ -4648,9 +4667,9 @@
 			if (href) {
 				e.preventDefault();
 				e.stopPropagation();
-				var href_getter = ams.getFunctionByName(href);
-				if (typeof(href_getter) === 'function') {
-					href = href_getter.call(this);
+				var hrefGetter = ams.getFunctionByName(href);
+				if (typeof(hrefGetter) === 'function') {
+					href = hrefGetter.call(this);
 				}
 				if (typeof(href) === 'function') {
 					// Javascript function call
@@ -4686,7 +4705,7 @@
 		var nav = $('nav');
 		$('UL', nav).myams_menu({
 			accordion : nav.data('ams-menu-accordion') !== false,
-			speed : ams.menu_speed
+			speed : ams.menuSpeed
 		});
 
 		// Left navigation collapser
@@ -4735,7 +4754,7 @@
 					   });
 
 		// Init AJAX navigation
-		if (ams.ajax_nav) {
+		if (ams.ajaxNav) {
 			$(document).on('click', 'a[href="#"]', function(e) {
 				e.preventDefault();
 			});
@@ -4751,9 +4770,9 @@
 				}
 				e.preventDefault();
 				e.stopPropagation();
-				var href_getter = ams.getFunctionByName(href);
-				if (typeof(href_getter) === 'function') {
-					href = href_getter.call(link);
+				var hrefGetter = ams.getFunctionByName(href);
+				if (typeof(hrefGetter) === 'function') {
+					href = hrefGetter.call(link);
 				}
 				if (typeof(href) === 'function') {
 					// Javascript function call
@@ -4965,7 +4984,7 @@
 
 		// Init page content
 		ams.initContent(document);
-		if (ams.ajax_nav && nav.exists()) {
+		if (ams.ajaxNav && nav.exists()) {
 			ams.skin.checkURL();
 		}
 		ams.form.setFocus(document);