src/ztfy/myams/resources/js/myams.js
changeset 203 108498416bee
parent 196 bbeb090d73e9
child 206 02a40997d8cb
--- a/src/ztfy/myams/resources/js/myams.js	Fri May 12 13:42:04 2017 +0200
+++ b/src/ztfy/myams/resources/js/myams.js	Fri May 12 13:42:21 2017 +0200
@@ -506,6 +506,28 @@
 
 
 	/**
+	 * Get an object given by name
+	 */
+	MyAMS.getObject = function(objectName, context) {
+		if (!objectName) {
+			return undefined;
+		}
+		if (typeof(objectName) !== 'string') {
+			return objectName;
+		}
+		var namespaces = objectName.split(".");
+		context = (context === undefined || context === null) ? window : context;
+		for (var i=0; i < namespaces.length; i++) {
+			try {
+				context = context[namespaces[i]];
+			} catch (e) {
+				return undefined;
+			}
+		}
+		return context;
+	};
+
+	/**
 	 * Get and execute a function given by name
 	 * Small piece of code by Jason Bunting
 	 */
@@ -687,10 +709,10 @@
 		 * Default JQuery AJAX error handler
 		 */
 		ajax: function(event, response, request, error) {
-			if (response.statusText === 'OK') {
+			if (response && response.statusText && response.statusText.toUpperCase() === 'OK') {
 				return;
 			}
-			var response = ams.ajax.getResponse(response);
+			response = ams.ajax.getResponse(response);
 			if (response.contentType === 'json') {
 				ams.ajax.handleJSON(response.data);
 			} else {
@@ -698,7 +720,7 @@
 				var message = response.responseText;
 				ams.skin.messageBox('error', {
 					title: ams.i18n.ERROR_OCCURED,
-					content: '<h4>' + title + '</h4><p>' + message + '</p>',
+					content: '<h4>' + title + '</h4><p>' + (message || '') + '</p>',
 					icon: 'fa fa-warning animated shake',
 					timeout: 10000
 				});
@@ -751,9 +773,27 @@
 		 * @options: callback options
 		 */
 		check: function(checker, source, callback, options) {
-			if (typeof(callback) === 'object') {
-				options = callback;
-				callback = undefined;
+
+			function callCallbacks(firstLoad, options) {
+				if (callback === undefined) {
+					return;
+				}
+				if (!(callback instanceof Array)) {
+					callback = [callback];
+				}
+				for (var index=0; index < callback.length; index++) {
+					var cb = ams.getFunctionByName(callback[index]);
+					if (typeof(cb) === 'function') {
+						cb(firstLoad, options);
+					}
+				}
+			}
+
+			if (!(callback instanceof Array)) {
+				if (typeof(callback) === 'object') {
+					options = callback;
+					callback = undefined;
+				}
 			}
 			var defaults = {
 				async: typeof(callback) === 'function'
@@ -768,25 +808,19 @@
 				}
 				if (deferred.length > 0) {
 					$.when.apply($, deferred).then(function () {
-						if (typeof(callback) === 'function') {
-							callback(true, options);
-						}
+						callCallbacks(true, options);
 					});
-				} else if (typeof(callback) === 'function') {
-					callback(false, options);
+				} else {
+					callCallbacks(false, options);
 				}
 			} else if (checker === undefined) {
 				if (typeof(source) === 'string') {
 					ams.getScript(source, function () {
-						if (typeof(callback) === 'function') {
-							callback(true, options);
-						}
+						callCallbacks(true, options);
 					}, settings);
 				}
 			} else {
-				if (typeof(callback) === 'function') {
-					callback(false, options);
-				}
+				callCallbacks(false, options);
 			}
 		},
 
@@ -3517,230 +3551,288 @@
 					ams.ajax.check($.fn.dataTable,
 								   ams.baseURL + 'ext/jquery-dataTables-1.9.4' + ams.devext + '.js',
 								   function(first_load) {
-										$(tables).each(function() {
-											ams.ajax.check($.fn.dataTableExt.oPagination.bootstrap_full,
-														   ams.baseURL + 'myams-dataTables' + ams.devext + '.js');
-											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 = sortable;
-													columns[index] = column;
-												}
-											}
-											// 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;
-												}
-											}
-											// Set options
+										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 = sortable;
+																	   columns[index] = column;
+																   }
+															   }
+															   // 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;
+																   }
+															   }
+															   // Set options
+															   var dataOptions = {
+																   bJQueryUI: false,
+																   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);
+														   });
+													   });
+								   });
+				}
+			},
+
+			/**
+			 * Wizard plug-in
+			 */
+			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(first_load) {
+										wizards.each(function() {
+											var wizard = $(this);
+											var data = wizard.data();
 											var dataOptions = {
-												bJQueryUI: false,
-												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>');
-												}
+												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.amsDatatableOptions);
-											if (extensions.length > 0) {
-												for (index=0; index < extensions.length; index++) {
-													switch (extensions[index]) {
-														case 'autofill':
-															ams.ajax.check($.fn.dataTable.AutoFill,
-																		   ams.baseURL + 'ext/jquery-dataTables-autoFill' + ams.devext + '.js');
-															break;
-														case 'columnfilter':
-															ams.ajax.check($.fn.columnFilter,
-																		   ams.baseURL + 'ext/jquery-dataTables-columnFilter' + ams.devext + '.js');
-															break;
-														case 'colreorder':
-															ams.ajax.check($.fn.dataTable.ColReorder,
-																		   ams.baseURL + 'ext/jquery-dataTables-colReorder' + ams.devext + '.js');
-															break;
-														case 'colreorderwithresize':
-															ams.ajax.check($.fn.dataTable.ColReorder,
-																		   ams.baseURL + 'ext/jquery-dataTables-colReorderWithResize' + ams.devext + '.js');
-															break;
-														case 'colvis':
-															ams.ajax.check($.fn.dataTable.ColVis,
-																		   ams.baseURL + 'ext/jquery-dataTables-colVis' + ams.devext + '.js');
-															var cvDefault = {
-																activate: 'click',
-																sAlign: 'right'
-															};
-															settings.oColVis = $.extend({}, cvDefault, data.amsDatatableColvisOptions);
-															break;
-														case 'editable':
-															ams.ajax.check($.fn.editable,
-																		   ams.baseURL + 'ext/jquery-jeditable' + ams.devext + '.js');
-															ams.ajax.check($.fn.makeEditable,
-																		   ams.baseURL + 'ext/jquery-dataTables-editable' + ams.devext + '.js');
-															break;
-														case 'fixedcolumns':
-															ams.ajax.check($.fn.dataTable.FixedColumns,
-																		   ams.baseURL + 'ext/jquery-dataTables-fixedColumns' + ams.devext + '.js');
-															break;
-														case 'fixedheader':
-															ams.ajax.check($.fn.dataTable.FixedHeader,
-																		   ams.baseURL + 'ext/jquery-dataTables-fixedHeader' + ams.devext + '.js');
-															break;
-														case 'keytable':
-															ams.ajax.check(window.KeyTable,
-																		   ams.baseURL + 'ext/jquery-dataTables-keyTable' + ams.devext + '.js');
-															break;
-														case 'rowgrouping':
-															ams.ajax.check($.fn.rowGrouping,
-																		   ams.baseURL + 'ext/jquery-dataTables-rowGrouping' + ams.devext + '.js');
-															break;
-														case 'rowreordering':
-															ams.ajax.check($.fn.rowReordering,
-																		   ams.baseURL + 'ext/jquery-dataTables-rowReordering' + ams.devext + '.js');
-															break;
-														case 'scroller':
-															ams.ajax.check($.fn.dataTable.Scroller,
-																		   ams.baseURL + 'ext/jquery-dataTables-scroller' + ams.devext + '.js');
-															break;
-														default:
-															break;
-													}
-												}
-											}
-											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;
-														}
-													}
-												}
-												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) {}
+											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);
 										});
 								   });
 				}
@@ -5017,6 +5109,14 @@
 			var form = $(this);
 			setTimeout(function() {
 				form.find('.select2').trigger('change');
+				$('[data-ams-reset-callback]', form).each(function() {
+					var element = $(this);
+					var data = element.data();
+					var callback = ams.getFunctionByName(data.amsResetCallback);
+					if (callback !== undefined) {
+						callback.call(form, element, data.amsResetCallbackOptions);
+					}
+				});
 			}, 10);
 			ams.form.setFocus(form);
 		});