src/pyams_skin/resources/js/myams.js
changeset 99 c628592aa86e
parent 83 e7386933c184
child 118 391ad752903e
equal deleted inserted replaced
98:89a28618a327 99:c628592aa86e
   111 
   111 
   112 		/*
   112 		/*
   113 		 * Get object if it supports given CSS class,
   113 		 * Get object if it supports given CSS class,
   114 		 * otherwise looks for parents
   114 		 * otherwise looks for parents
   115 		 */
   115 		 */
   116 		objectWithClass: function(klass) {
   116 		objectOrParentWithClass: function(klass) {
   117 			if (this.hasClass(klass))
   117 			if (this.hasClass(klass))
   118 				return this;
   118 				return this;
   119 			else
   119 			else
   120 				return this.parents('.' + klass);
   120 				return this.parents('.' + klass);
   121 		},
   121 		},
   593 					msg = 0;
   593 					msg = 0;
   594 				else
   594 				else
   595 					msg = 1;
   595 					msg = 1;
   596 			}
   596 			}
   597 			return msg;
   597 			return msg;
       
   598 		},
       
   599 
       
   600 		copyToClipboard: function() {
       
   601 			return function() {
       
   602 				var source = $(this);
       
   603 				source.parents('.btn-group').removeClass('open');
       
   604 				window.prompt(MyAMS.i18n.CLIPBOARD_COPY, source.text());
       
   605 			}
   598 		}
   606 		}
   599 	};
   607 	};
   600 
   608 
   601 
   609 
   602 	/**
   610 	/**
  1235 			}
  1243 			}
  1236 			// Check submit validators
  1244 			// Check submit validators
  1237 			if (!ams.form._checkSubmitValidators(form))
  1245 			if (!ams.form._checkSubmitValidators(form))
  1238 				return false;
  1246 				return false;
  1239 			// Remove remaining status messages
  1247 			// Remove remaining status messages
  1240 			$('.alert, SPAN.state-error', form).remove();
  1248 			$('.alert-danger, SPAN.state-error', form).remove();
  1241 			$('.state-error', form).removeClassPrefix('state-');
  1249 			$('.state-error', form).removeClassPrefix('state-');
  1242 			// Check submit button
  1250 			// Check submit button
  1243 			var button = $(form.data('ams-submit-button'));
  1251 			var button = $(form.data('ams-submit-button'));
  1244 			if (button && !button.data('ams-form-hide-loading'))
  1252 			if (button && !button.data('ams-form-hide-loading'))
  1245 				button.button('loading');
  1253 				button.button('loading');
  1692 
  1700 
  1693 		/**
  1701 		/**
  1694 		 * Register a callback which should be called when a dialog is shown
  1702 		 * Register a callback which should be called when a dialog is shown
  1695 		 */
  1703 		 */
  1696 		registerShownCallback: function(callback, element) {
  1704 		registerShownCallback: function(callback, element) {
  1697 			var dialog = element.objectWithClass('modal-dialog');
  1705 			var dialog;
  1698 			if (dialog.exists()) {
  1706 			if (element) {
       
  1707 				dialog = element.objectOrParentWithClass('modal-dialog');
       
  1708 			}
       
  1709 			if (dialog && dialog.exists()) {
  1699 				var callbacks = dialog.data('shown-callbacks');
  1710 				var callbacks = dialog.data('shown-callbacks');
  1700 				if (callbacks === undefined) {
  1711 				if (callbacks === undefined) {
  1701 					callbacks = [];
  1712 					callbacks = [];
  1702 					dialog.data('shown-callbacks', callbacks);
  1713 					dialog.data('shown-callbacks', callbacks);
  1703 				}
  1714 				}
  1715 
  1726 
  1716 		/**
  1727 		/**
  1717 		 * Register a callback which should be called when a dialog is closed
  1728 		 * Register a callback which should be called when a dialog is closed
  1718 		 */
  1729 		 */
  1719 		registerHideCallback: function(callback, element) {
  1730 		registerHideCallback: function(callback, element) {
  1720 			var dialog = element.objectWithClass('modal-dialog');
  1731 			var dialog;
  1721 			if (dialog.exists()) {
  1732 			if (element) {
       
  1733 				dialog = element.objectOrParentWithClass('modal-dialog');
       
  1734 			}
       
  1735 			if (dialog && dialog.exists()) {
  1722 				var callbacks = dialog.data('hide-callbacks');
  1736 				var callbacks = dialog.data('hide-callbacks');
  1723 				if (callbacks === undefined) {
  1737 				if (callbacks === undefined) {
  1724 					callbacks = [];
  1738 					callbacks = [];
  1725 					dialog.data('hide-callbacks', callbacks);
  1739 					dialog.data('hide-callbacks', callbacks);
  1726 				}
  1740 				}
  1839 					bottom.show();
  1853 					bottom.show();
  1840 			}
  1854 			}
  1841 
  1855 
  1842 			var modal = e.target;
  1856 			var modal = e.target;
  1843 			var viewport = $('.modal-viewport', modal);
  1857 			var viewport = $('.modal-viewport', modal);
  1844 			if (viewport.length == 0)
  1858 			if (viewport.exists()) {
  1845 				return;
  1859 				var maxHeight = parseInt(viewport.css('max-height'));
  1846 			var maxHeight = parseInt(viewport.css('max-height'));
  1860 				var barWidth = $.scrollbarWidth();
  1847 			var barWidth = $.scrollbarWidth();
  1861 				if (viewport.height() == maxHeight) {
  1848 			if (viewport.height() == maxHeight) {
  1862 					$('<div></div>').addClass('scrollmarker')
  1849 				$('<div></div>').addClass('scrollmarker')
  1863 						.addClass('top')
  1850 								.addClass('top')
  1864 						.css('top', 0)
  1851 								.css('top', 0)
  1865 						.css('width', viewport.width() - barWidth)
  1852 								.css('width', viewport.width() - barWidth)
  1866 						.hide()
  1853 								.hide()
  1867 						.appendTo(viewport);
  1854 								.appendTo(viewport);
  1868 					$('<div></div>').addClass('scrollmarker')
  1855 				$('<div></div>').addClass('scrollmarker')
  1869 						.addClass('bottom')
  1856 								.addClass('bottom')
  1870 						.css('top', maxHeight - 20)
  1857 								.css('top', maxHeight - 20)
  1871 						.css('width', viewport.width() - barWidth)
  1858 								.css('width', viewport.width() - barWidth)
  1872 						.appendTo(viewport);
  1859 								.appendTo(viewport);
  1873 					viewport.scroll(resetViewport);
  1860 				viewport.scroll(resetViewport);
  1874 					viewport.off('resize')
  1861 				viewport.off('resize')
       
  1862 						.on('resize', resetViewport);
  1875 						.on('resize', resetViewport);
  1863 			} else {
  1876 				} else {
  1864 				$('.scrollmarker', viewport).remove();
  1877 					$('.scrollmarker', viewport).remove();
       
  1878 				}
  1865 			}
  1879 			}
  1866 
  1880 
  1867 			// Call shown callbacks registered for this dialog
  1881 			// Call shown callbacks registered for this dialog
  1868 			var callbacks = $('.modal-dialog', modal).data('shown-callbacks');
  1882 			var callbacks = $('.modal-dialog', modal).data('shown-callbacks');
  1869 			if (callbacks) {
  1883 			if (callbacks) {
  2965 				var tables = $('.datatable', element);
  2979 				var tables = $('.datatable', element);
  2966 				if (tables.length > 0) {
  2980 				if (tables.length > 0) {
  2967 					ams.ajax.check($.fn.dataTable,
  2981 					ams.ajax.check($.fn.dataTable,
  2968 								   ams.baseURL + 'ext/jquery-dataTables-1.9.4' + ams.devext + '.js',
  2982 								   ams.baseURL + 'ext/jquery-dataTables-1.9.4' + ams.devext + '.js',
  2969 								   function(first_load) {
  2983 								   function(first_load) {
  2970 										if (first_load) {
       
  2971 											$.fn.dataTableExt.oSort['numeric-comma-asc']  = function(a, b) {
       
  2972 												var x = a.replace(/,/, ".").replace(/ /g, '');
       
  2973 												var y = b.replace(/,/, ".").replace(/ /g, '');
       
  2974 												x = parseFloat(x);
       
  2975 												y = parseFloat(y);
       
  2976 												return ((x < y) ? -1 : ((x > y) ?  1 : 0));
       
  2977 											};
       
  2978 											$.fn.dataTableExt.oSort['numeric-comma-desc'] = function(a, b) {
       
  2979 												var x = a.replace(/,/, ".").replace(/ /g, '');
       
  2980 												var y = b.replace(/,/, ".").replace(/ /g, '');
       
  2981 												x = parseFloat(x);
       
  2982 												y = parseFloat(y);
       
  2983 												return ((x < y) ?  1 : ((x > y) ? -1 : 0));
       
  2984 											};
       
  2985 										}
       
  2986 										$(tables).each(function() {
  2984 										$(tables).each(function() {
  2987 											ams.ajax.check($.fn.dataTableExt.oPagination['bootstrap_full'],
  2985 											ams.ajax.check($.fn.dataTableExt.oPagination['bootstrap_full'],
  2988 														   ams.baseURL + 'myams-dataTables' + ams.devext + '.js');
  2986 														   ams.baseURL + 'myams-dataTables' + ams.devext + '.js');
  2989 											var table = $(this);
  2987 											var table = $(this);
  2990 											var data = table.data();
  2988 											var data = table.data();
  2991 											var extensions = (data.amsDatatableExtensions || '').split(/\s+/);
  2989 											var extensions = (data.amsDatatableExtensions || '').split(/\s+/);
       
  2990 											// Check DOM elements
  2992 											var sDom = data.amsDatatableSdom ||
  2991 											var sDom = data.amsDatatableSdom ||
  2993 												"W" +
  2992 												"W" +
  2994 												((extensions.indexOf('colreorder') >= 0 ||
  2993 												((extensions.indexOf('colreorder') >= 0 ||
  2995 												  extensions.indexOf('colreorderwithresize') >= 0) ? 'R' : '') +
  2994 												  extensions.indexOf('colreorderwithresize') >= 0) ? 'R' : '') +
  2996 												"<'dt-top-row'" +
  2995 												"<'dt-top-row'" +
  3001 												">r<'dt-wrapper't" +
  3000 												">r<'dt-wrapper't" +
  3002 												(extensions.indexOf('scroller') >= 0 ? 'S' : '') +
  3001 												(extensions.indexOf('scroller') >= 0 ? 'S' : '') +
  3003 												"><'dt-row dt-bottom-row'<'row'<'col-sm-6'" +
  3002 												"><'dt-row dt-bottom-row'<'row'<'col-sm-6'" +
  3004 												(data.amsDatatableInformation === false ? '': 'i') +
  3003 												(data.amsDatatableInformation === false ? '': 'i') +
  3005 												"><'col-sm-6 text-right'p>>";
  3004 												"><'col-sm-6 text-right'p>>";
       
  3005 											var index;
       
  3006 											// Check initial sorting
       
  3007 											var sorting = data.amsDatatableSorting;
       
  3008 											if (typeof(sorting) === 'string') {
       
  3009 												var sortings = sorting.split(';');
       
  3010 												sorting = [];
       
  3011 												for (index in sortings) {
       
  3012 													var col_sorting = sortings[index].split(',');
       
  3013 													col_sorting[0] = parseInt(col_sorting[0]);
       
  3014 													sorting.push(col_sorting);
       
  3015 												}
       
  3016 											}
       
  3017 											// Check columns types
       
  3018 											var columns = [];
       
  3019 											var sort_types = $('th', table).listattr('data-ams-datatable-stype');
       
  3020 											for (index in sort_types) {
       
  3021 												var sort_type = sort_types[index];
       
  3022 												if (sort_type) {
       
  3023 													var column = columns[index] || {};
       
  3024 													column.sType = sort_type;
       
  3025 													columns[index] = column;
       
  3026 												}
       
  3027 											}
       
  3028 											// Set options
  3006 											var data_options = {
  3029 											var data_options = {
  3007 												bJQueryUI: false,
  3030 												bJQueryUI: false,
  3008 												bFilter: data.amsDatatableGlobalFilter !== false,
  3031 												bFilter: data.amsDatatableGlobalFilter !== false,
  3009 												bPaginate: data.amsDatatablePagination !== false,
  3032 												bPaginate: data.amsDatatablePagination !== false,
  3010 												bInfo: data.amsDatatableInfo !== false,
  3033 												bInfo: data.amsDatatableInfo !== false,
  3011 												bSort: data.amsDatatableSort !== false,
  3034 												bSort: data.amsDatatableSort !== false,
  3012 												aaSorting: data.amsDatatableSorting,
  3035 												aaSorting: sorting,
       
  3036 												aoColumns: columns.length > 0 ? columns : undefined,
  3013 												bDeferRender: true,
  3037 												bDeferRender: true,
  3014 												bAutoWidth: false,
  3038 												bAutoWidth: false,
  3015 												iDisplayLength: data.amsDatatableDisplayLength || 25,
  3039 												iDisplayLength: data.amsDatatableDisplayLength || 25,
  3016 												sPaginationType: data.amsDatatablePaginationType || 'bootstrap_full',
  3040 												sPaginationType: data.amsDatatablePaginationType || 'bootstrap_full',
  3017 												sDom: sDom,
  3041 												sDom: sDom,
  3020 													$('.ColVis_Button').addClass('btn btn-default btn-sm')
  3044 													$('.ColVis_Button').addClass('btn btn-default btn-sm')
  3021 																	   .html((ams.plugins.i18n.datatables.sColumns || "Columns") + ' <i class="fa fa-fw fa-caret-down"></i>');
  3045 																	   .html((ams.plugins.i18n.datatables.sColumns || "Columns") + ' <i class="fa fa-fw fa-caret-down"></i>');
  3022 												}
  3046 												}
  3023 											};
  3047 											};
  3024 											var settings = $.extend({}, data_options, data.amsDatatableOptions);
  3048 											var settings = $.extend({}, data_options, data.amsDatatableOptions);
  3025 											var index;
       
  3026 											if (extensions.length > 0) {
  3049 											if (extensions.length > 0) {
  3027 												for (index in extensions) {
  3050 												for (index in extensions) {
  3028 													switch (extensions[index]) {
  3051 													switch (extensions[index]) {
  3029 														case 'autofill':
  3052 														case 'autofill':
  3030 															ams.ajax.check($.fn.dataTable.AutoFill,
  3053 															ams.ajax.check($.fn.dataTable.AutoFill,
  3085 															break;
  3108 															break;
  3086 													}
  3109 													}
  3087 												}
  3110 												}
  3088 											}
  3111 											}
  3089 											settings = ams.executeFunctionByName(data.amsDatatableInitCallback, table, settings) || settings;
  3112 											settings = ams.executeFunctionByName(data.amsDatatableInitCallback, table, settings) || settings;
  3090 											var plugin = table.dataTable(settings);
  3113 											try {  // Some settings can easilly generate DataTables exceptions...
  3091 											ams.executeFunctionByName(data.amsDatatableAfterInitCallback, table, plugin, settings);
  3114 												var plugin = table.dataTable(settings);
  3092 											if (extensions.length > 0) {
  3115 												ams.executeFunctionByName(data.amsDatatableAfterInitCallback, table, plugin, settings);
  3093 												for (index in extensions) {
  3116 												if (extensions.length > 0) {
  3094 													switch (extensions[index]) {
  3117 													for (index in extensions) {
  3095 														case 'autofill':
  3118 														switch (extensions[index]) {
  3096 															var af_settings = $.extend({}, data.amsDatatableAutofillOptions, settings.autofill);
  3119 															case 'autofill':
  3097 															af_settings = ams.executeFunctionByName(data.amsDatatableAutofillInitCallback, table, af_settings) || af_settings;
  3120 																var af_settings = $.extend({}, data.amsDatatableAutofillOptions, settings.autofill);
  3098 															table.data('ams-autofill', data.amsDatatableAutofillConstructor === undefined
  3121 																af_settings = ams.executeFunctionByName(data.amsDatatableAutofillInitCallback, table, af_settings) || af_settings;
  3099 																						? new $.fn.dataTable.AutoFill(table, af_settings)
  3122 																table.data('ams-autofill', data.amsDatatableAutofillConstructor === undefined
  3100 																						: ams.executeFunctionByName(data.amsDatatableAutofillConstructor, table, plugin, af_settings));
  3123 																							? new $.fn.dataTable.AutoFill(table, af_settings)
  3101 															break;
  3124 																							: ams.executeFunctionByName(data.amsDatatableAutofillConstructor, table, plugin, af_settings));
  3102 														case 'columnfilter':
  3125 																break;
  3103 															var cf_default = {
  3126 															case 'columnfilter':
  3104 																sPlaceHolder: 'head:after'
  3127 																var cf_default = {
  3105 															};
  3128 																	sPlaceHolder: 'head:after'
  3106 															var cf_settings = $.extend({}, cf_default, data.amsDatatableColumnfilterOptions, settings.columnfilter);
  3129 																};
  3107 															cf_settings = ams.executeFunctionByName(data.amsDatatableColumnfilterInitCallback, table, cf_settings) || cf_settings;
  3130 																var cf_settings = $.extend({}, cf_default, data.amsDatatableColumnfilterOptions, settings.columnfilter);
  3108 															table.data('ams-columnfilter', data.amsDatatableColumnfilterConstructor === undefined
  3131 																cf_settings = ams.executeFunctionByName(data.amsDatatableColumnfilterInitCallback, table, cf_settings) || cf_settings;
  3109 																						? plugin.columnFilter(cf_settings)
  3132 																table.data('ams-columnfilter', data.amsDatatableColumnfilterConstructor === undefined
  3110 																						: ams.executeFunctionByName(data.amsDatatableColumnfilterConstructor, table, plugin, cf_settings));
  3133 																							? plugin.columnFilter(cf_settings)
  3111 															break;
  3134 																							: ams.executeFunctionByName(data.amsDatatableColumnfilterConstructor, table, plugin, cf_settings));
  3112 														case 'editable':
  3135 																break;
  3113 															var ed_settings = $.extend({}, data.amsDatatableEditableOptions, settings.editable);
  3136 															case 'editable':
  3114 															ed_settings = ams.executeFunctionByName(data.amsDatatableEditableInitCallback, table, ed_settings) || ed_settings;
  3137 																var ed_settings = $.extend({}, data.amsDatatableEditableOptions, settings.editable);
  3115 															table.data('ams-editable', data.amsDatatableEditableConstructor === undefined
  3138 																ed_settings = ams.executeFunctionByName(data.amsDatatableEditableInitCallback, table, ed_settings) || ed_settings;
  3116 																						? table.makeEditable(ed_settings)
  3139 																table.data('ams-editable', data.amsDatatableEditableConstructor === undefined
  3117 																						: ams.executeFunctionByName(data.amsDatatableEditableConstructor, table, plugin, ed_settings));
  3140 																							? table.makeEditable(ed_settings)
  3118 															break;
  3141 																							: ams.executeFunctionByName(data.amsDatatableEditableConstructor, table, plugin, ed_settings));
  3119 														case 'fixedcolumns':
  3142 																break;
  3120 															var fc_settings = $.extend({}, data.amsDatatableFixedcolumnsOptions, settings.fixedcolumns);
  3143 															case 'fixedcolumns':
  3121 															fc_settings = ams.executeFunctionByName(data.amsDatatableFixedcolumnsInitCallback, table, fc_settings) || fc_settings;
  3144 																var fc_settings = $.extend({}, data.amsDatatableFixedcolumnsOptions, settings.fixedcolumns);
  3122 															table.data('ams-fixedcolumns', data.amsDatatableFixedcolumnsConstructor === undefined
  3145 																fc_settings = ams.executeFunctionByName(data.amsDatatableFixedcolumnsInitCallback, table, fc_settings) || fc_settings;
  3123 																						? new $.fn.dataTable.FixedColumns(table, fc_settings)
  3146 																table.data('ams-fixedcolumns', data.amsDatatableFixedcolumnsConstructor === undefined
  3124 																						: ams.executeFunctionByName(data.amsDatatableFixedcolumnsConstructor, table, plugin, fc_settings));
  3147 																							? new $.fn.dataTable.FixedColumns(table, fc_settings)
  3125 															break;
  3148 																							: ams.executeFunctionByName(data.amsDatatableFixedcolumnsConstructor, table, plugin, fc_settings));
  3126 														case 'fixedheader':
  3149 																break;
  3127 															var fh_settings = $.extend({}, data.amsDatatableFixedheaderOptions, settings.fixedheader);
  3150 															case 'fixedheader':
  3128 															fh_settings = ams.executeFunctionByName(data.amsDatatableFixedheadeInitCallback, table, fh_settings) || fh_settings;
  3151 																var fh_settings = $.extend({}, data.amsDatatableFixedheaderOptions, settings.fixedheader);
  3129 															table.data('ams-fixedheader', data.amsDatatableFixedheaderConstructor === undefined
  3152 																fh_settings = ams.executeFunctionByName(data.amsDatatableFixedheadeInitCallback, table, fh_settings) || fh_settings;
  3130 																						? new $.fn.dataTable.FixedHeader(table, fh_settings)
  3153 																table.data('ams-fixedheader', data.amsDatatableFixedheaderConstructor === undefined
  3131 																						: ams.executeFunctionByName(data.amsDatatableFixedheaderConstructor, table, plugin, fh_settings));
  3154 																							? new $.fn.dataTable.FixedHeader(table, fh_settings)
  3132 															break;
  3155 																							: ams.executeFunctionByName(data.amsDatatableFixedheaderConstructor, table, plugin, fh_settings));
  3133 														case 'keytable':
  3156 																break;
  3134 															var kt_default = {
  3157 															case 'keytable':
  3135 																table: table.get(0),
  3158 																var kt_default = {
  3136 																datatable: plugin
  3159 																	table: table.get(0),
  3137 															};
  3160 																	datatable: plugin
  3138 															var kt_settings = $.extend({}, kt_default, data.amsDatatableKeytableOptions, settings.keytable);
  3161 																};
  3139 															kt_settings = ams.executeFunctionByName(data.amsDatatableKeytableInitCallback, table, kt_settings) || kt_settings;
  3162 																var kt_settings = $.extend({}, kt_default, data.amsDatatableKeytableOptions, settings.keytable);
  3140 															table.data('ams-keytable', data.amsDatatableKeytableConstructor === undefined
  3163 																kt_settings = ams.executeFunctionByName(data.amsDatatableKeytableInitCallback, table, kt_settings) || kt_settings;
  3141 																						? new KeyTable(kt_settings)
  3164 																table.data('ams-keytable', data.amsDatatableKeytableConstructor === undefined
  3142 																						: ams.executeFunctionByName(data.amsDatatableKeytableConstructor, table, plugin, kt_settings));
  3165 																							? new KeyTable(kt_settings)
  3143 															break;
  3166 																							: ams.executeFunctionByName(data.amsDatatableKeytableConstructor, table, plugin, kt_settings));
  3144 														case 'rowgrouping':
  3167 																break;
  3145 															var rg_settings = $.extend({}, data.amsDatatableRowgroupingOptions, settings.rowgrouping);
  3168 															case 'rowgrouping':
  3146 															rg_settings = ams.executeFunctionByName(data.amsDatatableRowgroupingInitCallback, table, rg_settings) || rg_settings;
  3169 																var rg_settings = $.extend({}, data.amsDatatableRowgroupingOptions, settings.rowgrouping);
  3147 															table.data('ams-rowgrouping', data.amsDatatableRowgroupingConstructor === undefined
  3170 																rg_settings = ams.executeFunctionByName(data.amsDatatableRowgroupingInitCallback, table, rg_settings) || rg_settings;
  3148 																						? table.rowGrouping(rg_settings)
  3171 																table.data('ams-rowgrouping', data.amsDatatableRowgroupingConstructor === undefined
  3149 																						: ams.executeFunctionByName(data.amsDatatableRowgroupingConstructor, table, plugin, rg_settings));
  3172 																							? table.rowGrouping(rg_settings)
  3150 															break;
  3173 																							: ams.executeFunctionByName(data.amsDatatableRowgroupingConstructor, table, plugin, rg_settings));
  3151 														case 'rowreordering':
  3174 																break;
  3152 															var rr_settings = $.extend({}, data.amsDatatableRowreorderingOptions, settings.rowreordering);
  3175 															case 'rowreordering':
  3153 															rr_settings = ams.executeFunctionByName(data.amsDatatableRowreorderingInitCallback, table, rr_settings) || rr_settings;
  3176 																var rr_settings = $.extend({}, data.amsDatatableRowreorderingOptions, settings.rowreordering);
  3154 															table.data('ams-rowreordering', data.amsDatatableRowreorderingConstructor === undefined
  3177 																rr_settings = ams.executeFunctionByName(data.amsDatatableRowreorderingInitCallback, table, rr_settings) || rr_settings;
  3155 																						? table.rowReordering(rr_settings)
  3178 																table.data('ams-rowreordering', data.amsDatatableRowreorderingConstructor === undefined
  3156 																						: ams.executeFunctionByName(data.amsDatatableRowreorderingConstructor, table, plugin, rr_settings));
  3179 																							? table.rowReordering(rr_settings)
  3157 															break;
  3180 																							: ams.executeFunctionByName(data.amsDatatableRowreorderingConstructor, table, plugin, rr_settings));
  3158 														default:
  3181 																break;
  3159 															break;
  3182 															default:
       
  3183 																break;
       
  3184 														}
       
  3185 													}
       
  3186 												}
       
  3187 												var finalizers = (data.amsDatatableFinalizeCallback || '').split(/\s+/);
       
  3188 												if (finalizers.length > 0) {
       
  3189 													for (index in finalizers) {
       
  3190 														ams.executeFunctionByName(finalizers[index], table, plugin, settings);
  3160 													}
  3191 													}
  3161 												}
  3192 												}
  3162 											}
  3193 											}
  3163 											var finalizers = (data.amsDatatableFinalizeCallback || '').split(/\s+/);
  3194 											catch (e) {}
  3164 											if (finalizers.length > 0) {
       
  3165 												for (index in finalizers) {
       
  3166 													ams.executeFunctionByName(finalizers[index], table, plugin, settings);
       
  3167 												}
       
  3168 											}
       
  3169 										});
  3195 										});
  3170 								   });
  3196 								   });
  3171 				}
  3197 				}
  3172 			},
  3198 			},
  3173 
  3199 
  3391 											var settings = $.extend({}, data_options, data.amsFancyboxOptions);
  3417 											var settings = $.extend({}, data_options, data.amsFancyboxOptions);
  3392 											settings = ams.executeFunctionByName(data.amsFancyboxInitCallback, fancybox, settings) || settings;
  3418 											settings = ams.executeFunctionByName(data.amsFancyboxInitCallback, fancybox, settings) || settings;
  3393 											var plugin = fancybox.fancybox(settings);
  3419 											var plugin = fancybox.fancybox(settings);
  3394 											ams.executeFunctionByName(data.amsFancyboxAfterInitCallback, fancybox, plugin, settings);
  3420 											ams.executeFunctionByName(data.amsFancyboxAfterInitCallback, fancybox, plugin, settings);
  3395 										});
  3421 										});
       
  3422 								   });
       
  3423 				}
       
  3424 			},
       
  3425 
       
  3426 			/**
       
  3427 			 * Flot charts
       
  3428 			 */
       
  3429 			chart: function(element) {
       
  3430 				var charts = $('.chart', element);
       
  3431 				if (charts.length > 0) {
       
  3432 					ams.ajax.check($.fn.plot,
       
  3433 								   ams.baseURL + 'flot/jquery.flot' + ams.devext + '.js',
       
  3434 								   function() {
       
  3435 										charts.each(function() {
       
  3436 
       
  3437 											function checkPlugin(plugin) {
       
  3438 												for (var index in $.plot.plugins) {
       
  3439 													var plugin_info = $.plot.plugins[index];
       
  3440 													if (plugin_info.name == plugin) {
       
  3441 														return plugin_info;
       
  3442 													}
       
  3443 												}
       
  3444 												return null;
       
  3445 											}
       
  3446 
       
  3447 											var chart = $(this);
       
  3448 											var data = chart.data();
       
  3449 											var data_options = {};
       
  3450 											var plugins = (data.amsChartPlugins || '').split(/\s+/);
       
  3451 											if (plugins.length > 0) {
       
  3452 												for (var index in plugins) {
       
  3453 													var plugin_name = plugins[index];
       
  3454 													if (!checkPlugin(plugin_name)) {
       
  3455 														ams.getScript(ams.baseURL + 'flot/jquery.flot.' + plugin_name + ams.devext + '.js');
       
  3456 													}
       
  3457 												}
       
  3458 											}
       
  3459 											var settings = $.extend({}, data_options, data.amsChartOptions);
       
  3460 											settings = ams.executeFunctionByName(data.amsChartInitCallback, chart, settings) || settings;
       
  3461 											var chart_data = data.amsChartData;
       
  3462 											chart_data = ams.executeFunctionByName(data.amsChartInitData, chart, chart_data) || chart_data;
       
  3463 											var plugin = chart.plot(chart_data, settings);
       
  3464 											ams.executeFunctionByName(data.amsChartAfterInitCallback, chart, plugin, settings);
       
  3465 										})
  3396 								   });
  3466 								   });
  3397 				}
  3467 				}
  3398 			},
  3468 			},
  3399 
  3469 
  3400 			/**
  3470 			/**
  4263 					href = href.replace(/\%23/, '#');
  4333 					href = href.replace(/\%23/, '#');
  4264 					var target = link.data('ams-target');
  4334 					var target = link.data('ams-target');
  4265 					if (target) {
  4335 					if (target) {
  4266 						ams.form.confirmChangedForm(target, function () {
  4336 						ams.form.confirmChangedForm(target, function () {
  4267 							ams.skin.loadURL(href, target, link.data('ams-link-options'), link.data('ams-link-callback'));
  4337 							ams.skin.loadURL(href, target, link.data('ams-link-options'), link.data('ams-link-callback'));
  4268 							e.stopPropagation();
       
  4269 						});
  4338 						});
  4270 					} else {
  4339 					} else {
  4271 						ams.form.confirmChangedForm(function () {
  4340 						ams.form.confirmChangedForm(function () {
  4272 							if (href.startsWith('#')) {
  4341 							if (href.startsWith('#')) {
  4273 								if (href != location.hash) {
  4342 								if (href != location.hash) {
  4399 			var link = $(e.target);
  4468 			var link = $(e.target);
  4400 			var data = link.data();
  4469 			var data = link.data();
  4401 			if (data.amsUrl) {
  4470 			if (data.amsUrl) {
  4402 				if (data.amsTabLoaded)
  4471 				if (data.amsTabLoaded)
  4403 					return;
  4472 					return;
  4404 				ams.skin.loadURL(data.amsUrl, link.attr('href'));
  4473 				try {
  4405 				if (data.amsTabLoadOnce)
  4474 					link.append('<i class="fa fa-spin fa-cog margin-left-5"></i>');
  4406 					link.data('ams-tab-loaded', true);
  4475 					ams.skin.loadURL(data.amsUrl, link.attr('href'));
       
  4476 					if (data.amsTabLoadOnce)
       
  4477 						link.data('ams-tab-loaded', true);
       
  4478 				}
       
  4479 				finally {
       
  4480 					$('i', link).remove();
       
  4481 				}
  4407 			}
  4482 			}
  4408 		});
  4483 		});
  4409 
  4484 
  4410 		// Init page content
  4485 		// Init page content
  4411 		ams.initContent(document);
  4486 		ams.initContent(document);
  4412 		if (ams.ajax_nav && ($('nav').length > 0))
  4487 		if (ams.ajax_nav && $('nav').exists())
  4413 			ams.skin.checkURL();
  4488 			ams.skin.checkURL();
  4414 
  4489 
  4415 		// Add unload event listener to check for modified forms
  4490 		// Add unload event listener to check for modified forms
  4416 		$(window).on('beforeunload', ams.form.checkBeforeUnload);
  4491 		$(window).on('beforeunload', ams.form.checkBeforeUnload);
  4417 
  4492 
  4482 		BTN_CANCEL: "Cancel",
  4557 		BTN_CANCEL: "Cancel",
  4483 		BTN_OK_CANCEL: "[OK][Cancel]",
  4558 		BTN_OK_CANCEL: "[OK][Cancel]",
  4484 		BTN_YES: "Yes",
  4559 		BTN_YES: "Yes",
  4485 		BTN_NO: "No",
  4560 		BTN_NO: "No",
  4486 		BTN_YES_NO: "[Yes][No]",
  4561 		BTN_YES_NO: "[Yes][No]",
       
  4562 
       
  4563 		CLIPBOARD_COPY: "Copy to clipboard with Ctrl+C, and Enter",
  4487 
  4564 
  4488 		FORM_CHANGED_WARNING: "Some changes were not saved. These updates will be lost if you leave this page.",
  4565 		FORM_CHANGED_WARNING: "Some changes were not saved. These updates will be lost if you leave this page.",
  4489 		DELETE_WARNING: "This change can't be undone. Are you sure that you want to delete this element?",
  4566 		DELETE_WARNING: "This change can't be undone. Are you sure that you want to delete this element?",
  4490 		NO_UPDATE: "No changes were applied.",
  4567 		NO_UPDATE: "No changes were applied.",
  4491 		DATA_UPDATED: "Data successfully updated.",
  4568 		DATA_UPDATED: "Data successfully updated.",