src/ztfy/myams/resources/js/myams.js
changeset 206 02a40997d8cb
parent 203 108498416bee
child 210 a4497eed4ff7
equal deleted inserted replaced
205:27ed26ca8623 206:02a40997d8cb
    12 
    12 
    13 (function($, globals) {
    13 (function($, globals) {
    14 
    14 
    15 	"use strict";
    15 	"use strict";
    16 
    16 
       
    17 	var console = globals.console;
       
    18 
    17 	/**
    19 	/**
    18 	 * String prototype extensions
    20 	 * String prototype extensions
    19 	 */
    21 	 */
    20 	String.prototype.startsWith = function(str) {
    22 	String.prototype.startsWith = function(str) {
    21 		var slen = this.length,
    23 		var slen = this.length,
    98 	 * JQuery 'scrollbarWidth' function
   100 	 * JQuery 'scrollbarWidth' function
    99 	 * Get width of vertical scrollbar
   101 	 * Get width of vertical scrollbar
   100 	 */
   102 	 */
   101 	if ($.scrollbarWidth === undefined) {
   103 	if ($.scrollbarWidth === undefined) {
   102 		$.scrollbarWidth = function() {
   104 		$.scrollbarWidth = function() {
   103 			var parent = $('<div style="width:50px; height:50px; overflow:auto"><div/></div>').appendTo('body');
   105 			var parent = $('<div style="width: 50px; height: 50px; overflow: auto"><div/></div>').appendTo('body');
   104 			var child = parent.children();
   106 			var child = parent.children();
   105 			var width = child.innerWidth() - child.height(99).innerWidth();
   107 			var width = child.innerWidth() - child.height(99).innerWidth();
   106 			parent.remove();
   108 			parent.remove();
   107 			return width;
   109 			return width;
   108 		};
   110 		};
   442 
   444 
   443 	/**
   445 	/**
   444 	 * Basic logging function which log all arguments to console
   446 	 * Basic logging function which log all arguments to console
   445 	 */
   447 	 */
   446 	MyAMS.log = function() {
   448 	MyAMS.log = function() {
   447 		if (globals.console) {
   449 		if (console) {
   448 			globals.console.log(this, arguments);
   450 			console.debug && console.debug(this, arguments);
   449 		}
   451 		}
   450 	};
   452 	};
   451 
   453 
   452 
   454 
   453 	/**
   455 	/**
   686 				}
   688 				}
   687 			}
   689 			}
   688 			return msg;
   690 			return msg;
   689 		},
   691 		},
   690 
   692 
   691 		copyToClipboard: function() {
   693 
   692 			return function() {
   694 		copyToClipboard: function(text) {
   693 				var source = $(this);
   695 
   694 				source.parents('.btn-group').removeClass('open');
   696 			function doCopy(text) {
   695 				if (globals.prompt) {
   697 				var copied = false;
   696 					globals.prompt(MyAMS.i18n.CLIPBOARD_COPY, source.text());
   698 				if (window.clipboardData && window.clipboardData.setData) {
   697 				}
   699 					// IE specific code
   698 			};
   700 					copied = clipboardData.setData("Text", text);
       
   701 				} else if (document.queryCommandSupported && document.queryCommandSupported("copy")) {
       
   702 					var textarea = $("<textarea>");
       
   703 					textarea.val(text);
       
   704 					textarea.css('position', 'fixed');  // Prevent scrolling to bottom of page in MS Edge.
       
   705 					textarea.appendTo($('body'));
       
   706 					textarea.get(0).select();
       
   707 					try {
       
   708 						document.execCommand("copy");  // Security exception may be thrown by some browsers.
       
   709 						copied = true;
       
   710 					} catch (ex) {
       
   711 						if (console) {
       
   712 							console.warn && console.warn("Copy to clipboard failed.", ex);
       
   713 						}
       
   714 					} finally {
       
   715 						textarea.remove();
       
   716 					}
       
   717 				}
       
   718 				if (copied) {
       
   719 					ams.skin.smallBox('success',
       
   720 									  {
       
   721 										  title: text.length > 1
       
   722 											  ? ams.i18n.CLIPBOARD_TEXT_COPY_OK
       
   723 											  : ams.i18n.CLIPBOARD_CHARACTER_COPY_OK,
       
   724 										  icon: 'fa fa-fw fa-info-circle font-xs align-top margin-top-10',
       
   725 										  timeout: 1000
       
   726 									  });
       
   727 				} else if (globals.prompt) {
       
   728 					globals.prompt(MyAMS.i18n.CLIPBOARD_COPY, text);
       
   729 				}
       
   730 			}
       
   731 
       
   732 			if (text === undefined) {
       
   733 				return function() {
       
   734 					var source = $(this);
       
   735 					var text = source.text();
       
   736 					source.parents('.btn-group').removeClass('open');
       
   737 					doCopy(text);
       
   738 				};
       
   739 			} else {
       
   740 				doCopy(text);
       
   741 			}
   699 		}
   742 		}
   700 	};
   743 	};
   701 
   744 
   702 
   745 
   703 	/**
   746 	/**
   707 
   750 
   708 		/**
   751 		/**
   709 		 * Default JQuery AJAX error handler
   752 		 * Default JQuery AJAX error handler
   710 		 */
   753 		 */
   711 		ajax: function(event, response, request, error) {
   754 		ajax: function(event, response, request, error) {
       
   755 			/* user shouldn't be notified of aborted requests */
       
   756 			if (error === 'abort') {
       
   757 				return;
       
   758 			}
   712 			if (response && response.statusText && response.statusText.toUpperCase() === 'OK') {
   759 			if (response && response.statusText && response.statusText.toUpperCase() === 'OK') {
   713 				return;
   760 				return;
   714 			}
   761 			}
   715 			response = ams.ajax.getResponse(response);
   762 			response = ams.ajax.getResponse(response);
   716 			if (response.contentType === 'json') {
   763 			if (response.contentType === 'json') {
   723 					content: '<h4>' + title + '</h4><p>' + (message || '') + '</p>',
   770 					content: '<h4>' + title + '</h4><p>' + (message || '') + '</p>',
   724 					icon: 'fa fa-warning animated shake',
   771 					icon: 'fa fa-warning animated shake',
   725 					timeout: 10000
   772 					timeout: 10000
   726 				});
   773 				});
   727 			}
   774 			}
   728 			if (globals.console) {
   775 			if (console) {
   729 				globals.console.error(event);
   776 				console.error && console.error(event);
   730 				globals.console.debug(response);
   777 				console.debug && console.debug(response);
   731 			}
   778 			}
   732 		},
   779 		},
   733 
   780 
   734 		/**
   781 		/**
   735 		 * Show AJAX error
   782 		 * Show AJAX error
   747 					content: '<h4>' + status + '</h4><p>' + error + '</p>',
   794 					content: '<h4>' + status + '</h4><p>' + error + '</p>',
   748 					icon: "fa fa-warning animated shake",
   795 					icon: "fa fa-warning animated shake",
   749 					timeout: 10000
   796 					timeout: 10000
   750 				});
   797 				});
   751 			}
   798 			}
   752 			if (globals.console) {
   799 			if (console) {
   753 				globals.console.error(error);
   800 				console.error && console.error(error);
   754 				globals.console.debug(request);
   801 				console.debug && console.debug(request);
   755 			}
   802 			}
   756 		}
   803 		}
   757 	};
   804 	};
   758 
   805 
   759 
   806 
   856 				return;
   903 				return;
   857 			}
   904 			}
   858 			if (event.loaded >= event.total) {
   905 			if (event.loaded >= event.total) {
   859 				return;
   906 				return;
   860 			}
   907 			}
   861 			if (globals.console) {
   908 			if (console) {
   862 				globals.console.log(parseInt((event.loaded / event.total * 100), 10) + "%");
   909 				console.log && console.log(parseInt((event.loaded / event.total * 100), 10) + "%");
   863 			}
   910 			}
   864 		},
   911 		},
   865 
   912 
   866 		/**
   913 		/**
   867 		 * Post data to given URL
   914 		 * Post data to given URL
   983 				case 'error':
  1030 				case 'error':
   984 					ams.form.showErrors(form, result);
  1031 					ams.form.showErrors(form, result);
   985 					break;
  1032 					break;
   986 				case 'info':
  1033 				case 'info':
   987 				case 'success':
  1034 				case 'success':
   988 					ams.form.resetChanged(form);
  1035 					if (form !== undefined) {
   989 					if (result.close_form !== false) {
  1036 						ams.form.resetChanged(form);
   990 						ams.dialog.close(form);
  1037 						if (result.close_form !== false) {
       
  1038 							ams.dialog.close(form);
       
  1039 						}
   991 					}
  1040 					}
   992 					break;
  1041 					break;
   993 				case 'message':
  1042 				case 'message':
   994 				case 'messagebox':
  1043 				case 'messagebox':
   995 					break;
  1044 					break;
   996 				case 'notify':
  1045 				case 'notify':
   997 				case 'callback':
  1046 				case 'callback':
   998 				case 'callbacks':
  1047 				case 'callbacks':
   999 					ams.form.resetChanged(form);
  1048 					if (form !== undefined) {
  1000 					if (result.close_form !== false) {
  1049 						ams.form.resetChanged(form);
  1001 						ams.dialog.close(form);
  1050 						if (result.close_form !== false) {
       
  1051 							ams.dialog.close(form);
       
  1052 						}
  1002 					}
  1053 					}
  1003 					break;
  1054 					break;
  1004 				case 'modal':
  1055 				case 'modal':
  1005 					ams.dialog.open(result.location);
  1056 					ams.dialog.open(result.location);
  1006 					break;
  1057 					break;
  1007 				case 'reload':
  1058 				case 'reload':
  1008 					ams.form.resetChanged(form);
  1059 					if (form !== undefined) {
  1009 					if (result.close_form !== false) {
  1060 						ams.form.resetChanged(form);
  1010 						ams.dialog.close(form);
  1061 						if (result.close_form !== false) {
       
  1062 							ams.dialog.close(form);
       
  1063 						}
  1011 					}
  1064 					}
  1012 					url = result.location || window.location.hash;
  1065 					url = result.location || window.location.hash;
  1013 					if (url.startsWith('#')) {
  1066 					if (url.startsWith('#')) {
  1014 						url = url.substr(1);
  1067 						url = url.substr(1);
  1015 					}
  1068 					}
  1016 					ams.skin.loadURL(url, result.target || target || '#content');
  1069 					var loadTarget = $(result.target || target || '#content');
       
  1070 					ams.skin.loadURL(url, loadTarget, {
       
  1071 						preLoadCallback: ams.getFunctionByName(result.pre_reload) || function() {
       
  1072 							$('[data-ams-pre-reload]', loadTarget).each(function() {
       
  1073 								ams.executeFunctionByName($(this).data('ams-pre-reload'));
       
  1074 							});
       
  1075 						},
       
  1076 						afterLoadCallback: ams.getFunctionByName(result.post_reload) || function () {
       
  1077 							$('[data-ams-post-reload]', loadTarget).each(function () {
       
  1078 								ams.executeFunctionByName($(this).data('ams-post-reload'));
       
  1079 							});
       
  1080 						}
       
  1081 					});
  1017 					break;
  1082 					break;
  1018 				case 'redirect':
  1083 				case 'redirect':
  1019 					ams.form.resetChanged(form);
  1084 					if (form !== undefined) {
  1020 					if (result.close_form === true) {
  1085 						ams.form.resetChanged(form);
  1021 						ams.dialog.close(form);
  1086 						if (result.close_form === true) {
       
  1087 							ams.dialog.close(form);
       
  1088 						}
  1022 					}
  1089 					}
  1023 					url = result.location || window.location.href;
  1090 					url = result.location || window.location.href;
  1024 					if (result.window) {
  1091 					if (result.window) {
  1025 						window.open(url, result.window, result.options);
  1092 						window.open(url, result.window, result.options);
  1026 					} else {
  1093 					} else {
  1030 							window.location.href = url;
  1097 							window.location.href = url;
  1031 						}
  1098 						}
  1032 					}
  1099 					}
  1033 					break;
  1100 					break;
  1034 				default:
  1101 				default:
  1035 					if (globals.console) {
  1102 					if (console) {
  1036 						globals.console.log("Unhandled status: " + status);
  1103 						console.log && console.log("Unhandled status: " + status);
  1037 					}
  1104 					}
  1038 			}
  1105 			}
  1039 
  1106 
  1040 			var index;
  1107 			var index;
  1041 			var content;
  1108 			var content;
  1121 				}
  1188 				}
  1122 			}
  1189 			}
  1123 			if (result.event) {
  1190 			if (result.event) {
  1124 				form.trigger(result.event, result.event_options);
  1191 				form.trigger(result.event, result.event_options);
  1125 			}
  1192 			}
       
  1193 			if (result.events) {
       
  1194 				var event;
       
  1195 				if (form === undefined) {
       
  1196 					form = $(document);
       
  1197 				}
       
  1198 				for (index  =0; index < result.events.length; index++) {
       
  1199 					event = result.events[index];
       
  1200 					if (typeof(event) === 'string') {
       
  1201 						form.trigger(event, result.events_options);
       
  1202 					} else {
       
  1203 						form.trigger(event.event, event.options);
       
  1204 					}
       
  1205 				}
       
  1206 			}
  1126 			if (result.callback) {
  1207 			if (result.callback) {
  1127 				ams.executeFunctionByName(result.callback, form, result.options);
  1208 				ams.executeFunctionByName(result.callback, form, result.options);
  1128 			}
  1209 			}
  1129 			if (result.callbacks) {
  1210 			if (result.callbacks) {
  1130 				var callback;
  1211 				var callback;
  1131 				for (index=0; index < result.callbacks.length; index++) {
  1212 				for (index=0; index < result.callbacks.length; index++) {
  1132 					callback = result.callbacks[index];
  1213 					callback = result.callbacks[index];
  1133 					ams.executeFunctionByName(callback, form, callback.options);
  1214 					if (typeof(callback) === 'function') {
       
  1215 						ams.executeFunctionByName(callback, form, callback.options);
       
  1216 					} else {
       
  1217 						ams.executeFunctionByName(callback.callback, form, callback.options);
       
  1218 					}
  1134 				}
  1219 				}
  1135 			}
  1220 			}
  1136 		}
  1221 		}
  1137 	};
  1222 	};
  1138 
  1223 
  1323 		 * Init forms to activate form change listeners
  1408 		 * Init forms to activate form change listeners
  1324 		 *
  1409 		 *
  1325 		 * @param element: the parent element
  1410 		 * @param element: the parent element
  1326 		 */
  1411 		 */
  1327 		init: function(element) {
  1412 		init: function(element) {
       
  1413 
       
  1414 			$('FORM', element).each(function() {
       
  1415 				var form = $(this);
       
  1416 				// Store value of hidden inputs
       
  1417 				$('INPUT.select2[type="hidden"]', form).each(function() {
       
  1418 					var input = $(this);
       
  1419 					input.data('ams-select2-input-value', input.val());
       
  1420 				});
       
  1421 			});
       
  1422 
  1328 			// Activate form changes if required
  1423 			// Activate form changes if required
  1329 			var forms;
  1424 			var forms;
  1330 			if (ams.warnOnFormChange) {
  1425 			if (ams.warnOnFormChange) {
  1331 				forms = $('FORM[data-ams-warn-on-change!="false"]', element);
  1426 				forms = $('FORM[data-ams-warn-on-change!="false"]', element);
  1332 			} else {
  1427 			} else {
  2016 				if (errors.widgets) {
  2111 				if (errors.widgets) {
  2017 					for (index = 0; index < errors.widgets.length; index++) {
  2112 					for (index = 0; index < errors.widgets.length; index++) {
  2018 						// set widget status message
  2113 						// set widget status message
  2019 						var widgetData = errors.widgets[index];
  2114 						var widgetData = errors.widgets[index];
  2020 						var widget = $('[name="' + widgetData.name + '"]', form);
  2115 						var widget = $('[name="' + widgetData.name + '"]', form);
  2021 						widget.parents('label:first')
  2116 						if (!widget.exists()) {
  2022 								.removeClassPrefix('state-')
  2117 							widget = $('[name="' + widgetData.name + ':list"]', form);
  2023 								.addClass('state-error')
  2118 						}
  2024 								.after('<span for="name" class="state-error">' + widgetData.message + '</span>');
  2119 						if (widget.exists()) {
       
  2120 							widget.parents('label:first')
       
  2121 								  .removeClassPrefix('state-')
       
  2122 								  .addClass('state-error')
       
  2123 								  .after('<span for="name" class="state-error">' + widgetData.message + '</span>');
       
  2124 						}
  2025 						// complete form alert message
  2125 						// complete form alert message
  2026 						if (widgetData.label) {
  2126 						if (widgetData.label) {
  2027 							message.push(widgetData.label + ' : ' + widgetData.message);
  2127 							message.push(widgetData.label + ' : ' + widgetData.message);
  2028 						}
  2128 						}
  2029 						// mark parent tab (if any) with error status
  2129 						// mark parent tab (if any) with error status
  2334 	 * They have been extracted from these extensions management code to reuse them more easily into
  2434 	 * They have been extracted from these extensions management code to reuse them more easily into
  2335 	 * application specific callbacks.
  2435 	 * application specific callbacks.
  2336 	 */
  2436 	 */
  2337 	MyAMS.helpers = {
  2437 	MyAMS.helpers = {
  2338 
  2438 
       
  2439 		/** Sort DOM elements into selected container */
       
  2440 		sort: function(container, attribute) {
       
  2441 			if (!attribute) {
       
  2442 				attribute = 'weight';
       
  2443 			}
       
  2444 			var childs = container.children();
       
  2445 			childs.sort(function(a, b) {
       
  2446 				return +$(a).data(attribute) - +$(b).data(attribute);
       
  2447 			}).each(function() {
       
  2448 				container.append(this);
       
  2449 			});
       
  2450 		},
       
  2451 
  2339 		/** Clear Select2 slection */
  2452 		/** Clear Select2 slection */
  2340 		select2ClearSelection: function() {
  2453 		select2ClearSelection: function() {
  2341 			var source = $(this);
  2454 			var source = $(this);
  2342 			var label = source.parents('label');
  2455 			var label = source.parents('label');
  2343 			var target = source.data('ams-select2-target');
  2456 			var target = source.data('ams-select2-target');
  2359 					container.append(object.text);
  2472 					container.append(object.text);
  2360 				} else {
  2473 				} else {
  2361 					container.append(object);
  2474 					container.append(object);
  2362 				}
  2475 				}
  2363 			}
  2476 			}
       
  2477 		},
       
  2478 
       
  2479 		/** Select2 'select-all' helper */
       
  2480 		select2SelectAllHelper: function() {
       
  2481 			var source = $(this);
       
  2482 			var parent = source.parents('label:first');
       
  2483 			var input = $('.select2', parent);
       
  2484 			input.select2('data', input.data('ams-select2-data'));
  2364 		},
  2485 		},
  2365 
  2486 
  2366 		/** Select2 query results callback */
  2487 		/** Select2 query results callback */
  2367 		select2QueryUrlResultsCallback: function(data, page, context) {
  2488 		select2QueryUrlResultsCallback: function(data, page, context) {
  2368 			switch (data.status) {
  2489 			switch (data.status) {
  2699 				callback = name;
  2820 				callback = name;
  2700 				name = null;
  2821 				name = null;
  2701 			}
  2822 			}
  2702 			name = name || plugin.name;
  2823 			name = name || plugin.name;
  2703 			if (ams.plugins.enabled.indexOf(name) >= 0) {
  2824 			if (ams.plugins.enabled.indexOf(name) >= 0) {
  2704 				if (globals.console) {
  2825 				if (console) {
  2705 					globals.console.warn("Plugin " + name + " is already registered!");
  2826 					console.warn && console.warn("Plugin " + name + " is already registered!");
  2706 				}
  2827 				}
  2707 				return;
  2828 				return;
  2708 			}
  2829 			}
  2709 			if (typeof(plugin) === 'object') {
  2830 			if (typeof(plugin) === 'object') {
  2710 				var src = plugin.src;
  2831 				var src = plugin.src;
  2768 										   var data = hint.data();
  2889 										   var data = hint.data();
  2769 										   var dataOptions = {
  2890 										   var dataOptions = {
  2770 											   html: data.amsHintHtml,
  2891 											   html: data.amsHintHtml,
  2771 											   title: ams.getFunctionByName(data.amsHintTitleGetter) || function () {
  2892 											   title: ams.getFunctionByName(data.amsHintTitleGetter) || function () {
  2772 												   var hint = $(this);
  2893 												   var hint = $(this);
  2773 												   return hint.attr('original-title') ||
  2894 												   var result = hint.attr('original-title') ||
  2774 														   hint.attr(data.amsHintTitleAttr || 'title') ||
  2895 																hint.attr(data.amsHintTitleAttr || 'title') ||
  2775 														   (data.amsHintHtml ? hint.html() : hint.text());
  2896 																(data.amsHintHtml ? hint.html() : hint.text());
       
  2897 												   result = result.replace(/\?_="/, '?_=' + new Date().getTime() + '"');
       
  2898 												   return result;
  2776 											   },
  2899 											   },
  2777 											   opacity: data.amsHintOpacity || 0.95,
  2900 											   opacity: data.amsHintOpacity || 0.95,
  2778 											   gravity: data.amsHintGravity || 'sw',
  2901 											   gravity: data.amsHintGravity || 'sw',
  2779 											   offset: data.amsHintOffset || 0
  2902 											   offset: data.amsHintOffset || 0
  2780 										   };
  2903 										   };
  3009 						var sortable = $(this);
  3132 						var sortable = $(this);
  3010 						var data = sortable.data();
  3133 						var data = sortable.data();
  3011 						var dataOptions = {
  3134 						var dataOptions = {
  3012 							items: data.amsSortableItems,
  3135 							items: data.amsSortableItems,
  3013 							handle: data.amsSortableHandle,
  3136 							handle: data.amsSortableHandle,
       
  3137 							helper: data.amsSortableHelper,
  3014 							connectWith: data.amsSortableConnectwith,
  3138 							connectWith: data.amsSortableConnectwith,
  3015 							start: ams.getFunctionByName(data.amsSortableStart),
  3139 							start: ams.getFunctionByName(data.amsSortableStart),
  3016 							over: ams.getFunctionByName(data.amsSortableOver),
  3140 							over: ams.getFunctionByName(data.amsSortableOver),
  3017 							containment: data.amsSortableContainment,
  3141 							containment: data.amsSortableContainment,
  3018 							placeholder: data.amsSortablePlaceholder,
  3142 							placeholder: data.amsSortablePlaceholder,
  3344 											var dataOptions = {
  3468 											var dataOptions = {
  3345 												lang: data.amsDatetimepickerLang || ams.lang,
  3469 												lang: data.amsDatetimepickerLang || ams.lang,
  3346 												format: data.amsDatetimepickerFormat || 'd/m/y',
  3470 												format: data.amsDatetimepickerFormat || 'd/m/y',
  3347 												datepicker: true,
  3471 												datepicker: true,
  3348 												dayOfWeekStart: 1,
  3472 												dayOfWeekStart: 1,
  3349 												timepicker: false
  3473 												timepicker: false,
       
  3474 												closeOnDateSelect: data.amsDatetimepickerCloseOnSelect === undefined ? true : data.amsDatetimepickerCloseOnSelect,
       
  3475 												weeks: data.amsDatetimepickerWeeks
  3350 											};
  3476 											};
  3351 											var settings = $.extend({}, dataOptions, data.amsDatetimepickerOptions);
  3477 											var settings = $.extend({}, dataOptions, data.amsDatetimepickerOptions);
  3352 											settings = ams.executeFunctionByName(data.amsDatetimepickerInitCallback, input, settings) || settings;
  3478 											settings = ams.executeFunctionByName(data.amsDatetimepickerInitCallback, input, settings) || settings;
  3353 											var plugin = input.datetimepicker(settings);
  3479 											var plugin = input.datetimepicker(settings);
  3354 											ams.executeFunctionByName(data.amsDatetimepickerAfterInitCallback, input, plugin, settings);
  3480 											ams.executeFunctionByName(data.amsDatetimepickerAfterInitCallback, input, plugin, settings);
  3376 											var dataOptions = {
  3502 											var dataOptions = {
  3377 												lang: data.amsDatetimepickerLang || ams.lang,
  3503 												lang: data.amsDatetimepickerLang || ams.lang,
  3378 												format: data.amsDatetimepickerFormat || 'd/m/y H:i',
  3504 												format: data.amsDatetimepickerFormat || 'd/m/y H:i',
  3379 												datepicker: true,
  3505 												datepicker: true,
  3380 												dayOfWeekStart: 1,
  3506 												dayOfWeekStart: 1,
  3381 												timepicker: true
  3507 												timepicker: true,
       
  3508 												closeOnDateSelect: data.amsDatetimepickerCloseOnSelect === undefined ? true : data.amsDatetimepickerCloseOnSelect,
       
  3509 												closeOnTimeSelect: data.amsDatetimepickerCloseOnSelect === undefined ? true : data.amsDatetimepickerCloseOnSelect,
       
  3510 												weeks: data.amsDatetimepickerWeeks
  3382 											};
  3511 											};
  3383 											var settings = $.extend({}, dataOptions, data.amsDatetimepickerOptions);
  3512 											var settings = $.extend({}, dataOptions, data.amsDatetimepickerOptions);
  3384 											settings = ams.executeFunctionByName(data.amsDatetimepickerInitCallback, input, settings) || settings;
  3513 											settings = ams.executeFunctionByName(data.amsDatetimepickerInitCallback, input, settings) || settings;
  3385 											var plugin = input.datetimepicker(settings);
  3514 											var plugin = input.datetimepicker(settings);
  3386 											ams.executeFunctionByName(data.amsDatetimepickerAfterInitCallback, input, plugin, settings);
  3515 											ams.executeFunctionByName(data.amsDatetimepickerAfterInitCallback, input, plugin, settings);
  3407 											var data = input.data();
  3536 											var data = input.data();
  3408 											var dataOptions = {
  3537 											var dataOptions = {
  3409 												lang: data.amsDatetimepickerLang || ams.lang,
  3538 												lang: data.amsDatetimepickerLang || ams.lang,
  3410 												format: data.amsDatetimepickerFormat || 'H:i',
  3539 												format: data.amsDatetimepickerFormat || 'H:i',
  3411 												datepicker: false,
  3540 												datepicker: false,
  3412 												timepicker: true
  3541 												timepicker: true,
       
  3542 												closeOnTimeSelect: data.amsDatetimepickerCloseOnSelect === undefined ? true : data.amsDatetimepickerCloseOnSelect
  3413 											};
  3543 											};
  3414 											var settings = $.extend({}, dataOptions, data.amsDatetimepickerOptions);
  3544 											var settings = $.extend({}, dataOptions, data.amsDatetimepickerOptions);
  3415 											settings = ams.executeFunctionByName(data.amsDatetimepickerInitCallback, input, settings) || settings;
  3545 											settings = ams.executeFunctionByName(data.amsDatetimepickerInitCallback, input, settings) || settings;
  3416 											var plugin = input.datetimepicker(settings);
  3546 											var plugin = input.datetimepicker(settings);
  3417 											ams.executeFunctionByName(data.amsDatetimepickerAfterInitCallback, input, plugin, settings);
  3547 											ams.executeFunctionByName(data.amsDatetimepickerAfterInitCallback, input, plugin, settings);
  3795 								   });
  3925 								   });
  3796 				}
  3926 				}
  3797 			},
  3927 			},
  3798 
  3928 
  3799 			/**
  3929 			/**
  3800 			 * Wizard plug-in
       
  3801 			 */
       
  3802 			wizard: function(element) {
       
  3803 				var wizards = $('.wizard', element);
       
  3804 				if (wizards.length > 0) {
       
  3805 					ams.ajax.check($.fn.bootstrapWizard,
       
  3806 								   ams.baseURL + 'ext/bootstrap-wizard-1.4.2' + ams.devext + '.js',
       
  3807 								   function(first_load) {
       
  3808 										wizards.each(function() {
       
  3809 											var wizard = $(this);
       
  3810 											var data = wizard.data();
       
  3811 											var dataOptions = {
       
  3812 												withVisible: data.amsWizardWithVisible === undefined ? true : data.amsWizardWithVisible,
       
  3813 												tabClass: data.amsWizardTabClass,
       
  3814 												firstSelector: data.amsWizardFirstSelector,
       
  3815 												previousSelector: data.amsWizardPreviousSelector,
       
  3816 												nextSelector: data.amsWizardNextSelector,
       
  3817 												lastSelector: data.amsWizardLastSelector,
       
  3818 												finishSelector: data.amsWizardFinishSelector,
       
  3819 												backSelector: data.amsWizardBackSelector,
       
  3820 												onInit: ams.getFunctionByName(data.amsWizardInit),
       
  3821 												onShow: ams.getFunctionByName(data.amsWizardShow),
       
  3822 												onNext: ams.getFunctionByName(data.amsWizardNext),
       
  3823 												onPrevious: ams.getFunctionByName(data.amsWizardPrevious),
       
  3824 												onFirst: ams.getFunctionByName(data.amsWizardFirst),
       
  3825 												onLast: ams.getFunctionByName(data.amsWizardLast),
       
  3826 												onBack: ams.getFunctionByName(data.amsWizardBack),
       
  3827 												onFinish: ams.getFunctionByName(data.amsWizardFinish),
       
  3828 												onTabChange: ams.getFunctionByName(data.amsWizardTabChange),
       
  3829 												onTabClick: ams.getFunctionByName(data.amsWizardTabClick),
       
  3830 												onTabShow: ams.getFunctionByName(data.amsWizardTabShow)
       
  3831 											};
       
  3832 											var settings = $.extend({}, dataOptions, data.amsWizardOptions);
       
  3833 											settings = ams.executeFunctionByName(data.amsWizardInitCallback, wizard, settings) || settings;
       
  3834 											var plugin = wizard.bootstrapWizard(settings);
       
  3835 											ams.executeFunctionByName(data.amsWizardAfterInitCallback, wizard, plugin, settings);
       
  3836 										});
       
  3837 								   });
       
  3838 				}
       
  3839 			},
       
  3840 
       
  3841 			/**
       
  3842 			 * TableDND plug-in
  3930 			 * TableDND plug-in
  3843 			 */
  3931 			 */
  3844 			tablednd: function(element) {
  3932 			tablednd: function(element) {
  3845 				var tables = $('.table-dnd', element);
  3933 				var tables = $('.table-dnd', element);
  3846 				if (tables.length > 0) {
  3934 				if (tables.length > 0) {
  3879 														});
  3967 														});
  3880 														var localTarget = ams.getFunctionByName(target);
  3968 														var localTarget = ams.getFunctionByName(target);
  3881 														if (typeof(localTarget) === 'function') {
  3969 														if (typeof(localTarget) === 'function') {
  3882 															localTarget.call(table, dnd_table, rows);
  3970 															localTarget.call(table, dnd_table, rows);
  3883 														} else {
  3971 														} else {
       
  3972 															if (!target.startsWith(window.location.protocol)) {
       
  3973 																var location = data.amsLocation;
       
  3974 																if (location) {
       
  3975 																	target = location + '/' + target;
       
  3976 																}
       
  3977 															}
  3884 															ams.ajax.post(target, {names: JSON.stringify(rows)});
  3978 															ams.ajax.post(target, {names: JSON.stringify(rows)});
  3885 														}
  3979 														}
  3886 														// Restore row click handler
  3980 														// Restore row click handler
  3887 														setTimeout(function() {
  3981 														setTimeout(function() {
  3888 															$(row).removeData('ams-disabled-handlers');
  3982 															$(row).removeData('ams-disabled-handlers');
  3894 											var settings = $.extend({}, dataOptions, data.amsTabledndOptions);
  3988 											var settings = $.extend({}, dataOptions, data.amsTabledndOptions);
  3895 											settings = ams.executeFunctionByName(data.amsTabledndInitCallback, table, settings) || settings;
  3989 											settings = ams.executeFunctionByName(data.amsTabledndInitCallback, table, settings) || settings;
  3896 											var plugin = table.tableDnD(settings);
  3990 											var plugin = table.tableDnD(settings);
  3897 											ams.executeFunctionByName(data.amsTabledndAfterInitCallback, table, plugin, settings);
  3991 											ams.executeFunctionByName(data.amsTabledndAfterInitCallback, table, plugin, settings);
  3898 										});
  3992 										});
       
  3993 								   });
       
  3994 				}
       
  3995 			},
       
  3996 
       
  3997 			/**
       
  3998 			 * Wizard plug-in
       
  3999 			 */
       
  4000 			wizard: function(element) {
       
  4001 				var wizards = $('.wizard', element);
       
  4002 				if (wizards.length > 0) {
       
  4003 					ams.ajax.check($.fn.bootstrapWizard,
       
  4004 								   ams.baseURL + 'ext/bootstrap-wizard-1.4.2' + ams.devext + '.js',
       
  4005 								   function(first_load) {
       
  4006 										wizards.each(function() {
       
  4007 											var wizard = $(this);
       
  4008 											var data = wizard.data();
       
  4009 											var dataOptions = {
       
  4010 												withVisible: data.amsWizardWithVisible === undefined ? true : data.amsWizardWithVisible,
       
  4011 												tabClass: data.amsWizardTabClass,
       
  4012 												firstSelector: data.amsWizardFirstSelector,
       
  4013 												previousSelector: data.amsWizardPreviousSelector,
       
  4014 												nextSelector: data.amsWizardNextSelector,
       
  4015 												lastSelector: data.amsWizardLastSelector,
       
  4016 												finishSelector: data.amsWizardFinishSelector,
       
  4017 												backSelector: data.amsWizardBackSelector,
       
  4018 												onInit: ams.getFunctionByName(data.amsWizardInit),
       
  4019 												onShow: ams.getFunctionByName(data.amsWizardShow),
       
  4020 												onNext: ams.getFunctionByName(data.amsWizardNext),
       
  4021 												onPrevious: ams.getFunctionByName(data.amsWizardPrevious),
       
  4022 												onFirst: ams.getFunctionByName(data.amsWizardFirst),
       
  4023 												onLast: ams.getFunctionByName(data.amsWizardLast),
       
  4024 												onBack: ams.getFunctionByName(data.amsWizardBack),
       
  4025 												onFinish: ams.getFunctionByName(data.amsWizardFinish),
       
  4026 												onTabChange: ams.getFunctionByName(data.amsWizardTabChange),
       
  4027 												onTabClick: ams.getFunctionByName(data.amsWizardTabClick),
       
  4028 												onTabShow: ams.getFunctionByName(data.amsWizardTabShow)
       
  4029 											};
       
  4030 											var settings = $.extend({}, dataOptions, data.amsWizardOptions);
       
  4031 											settings = ams.executeFunctionByName(data.amsWizardInitCallback, wizard, settings) || settings;
       
  4032 											var plugin = wizard.bootstrapWizard(settings);
       
  4033 											ams.executeFunctionByName(data.amsWizardAfterInitCallback, wizard, plugin, settings);
       
  4034 										});
       
  4035 								   });
       
  4036 				}
       
  4037 			},
       
  4038 
       
  4039 			/**
       
  4040 			 * TinyMCE plug-in
       
  4041 			 */
       
  4042 			tinymce: function(element) {
       
  4043 
       
  4044 				function cleanEditors() {
       
  4045 					$('.tinymce', $(this)).each(function() {
       
  4046 						var editor = tinymce.get($(this).attr('id'));
       
  4047 						if (editor) {
       
  4048 							editor.remove();
       
  4049 						}
       
  4050 					});
       
  4051 				}
       
  4052 
       
  4053 				var editors = $('.tinymce', element);
       
  4054 				if (editors.length > 0) {
       
  4055 					var baseURL = ams.baseURL + 'ext/tinymce' + (ams.devmode ? '/dev' : '');
       
  4056 					ams.ajax.check(window.tinymce,
       
  4057 								   baseURL + '/tinymce' + ams.devext + '.js',
       
  4058 								   function(first_load) {
       
  4059 
       
  4060 										function initEditors() {
       
  4061 											editors.each(function() {
       
  4062 												var editor = $(this);
       
  4063 												var data = editor.data();
       
  4064 												var dataOptions = {
       
  4065 													theme: data.amsTinymceTheme || "modern",
       
  4066 													language: ams.lang,
       
  4067 													plugins: [
       
  4068 														"advlist autosave autolink lists link image charmap print preview hr anchor pagebreak",
       
  4069 														"searchreplace wordcount visualblocks visualchars code fullscreen",
       
  4070 														"insertdatetime media nonbreaking save table contextmenu directionality",
       
  4071 														"emoticons paste textcolor colorpicker textpattern autoresize"
       
  4072 													],
       
  4073 													toolbar1: data.amsTinymceToolbar1 || "undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent",
       
  4074 													toolbar2: data.amsTinymceToolbar2 || "forecolor backcolor emoticons | charmap link image media | fullscreen preview print | code",
       
  4075 													content_css: data.amsTinymceContentCss,
       
  4076 													formats: data.amsTinymceFormats,
       
  4077 													style_formats: data.amsTinymceStyleFormats,
       
  4078 													block_formats: data.amsTinymceBlockFormats,
       
  4079 													valid_classes: data.amsTinymceValidClasses,
       
  4080 													image_advtab: true,
       
  4081 													image_list: ams.getFunctionByName(data.amsTinymceImageList) || data.amsTinymceImageList,
       
  4082 													image_class_list: data.amsTinymceImageClassList,
       
  4083 													link_list: ams.getFunctionByName(data.amsTinymceLinkList) || data.amsTinymceLinkList,
       
  4084 													link_class_list: data.amsTinymceLinkClassList,
       
  4085 													height: 50,
       
  4086 													min_height: 50,
       
  4087 													autoresize_min_height: 50,
       
  4088 													autoresize_max_height: 500,
       
  4089 													resize: true
       
  4090 												};
       
  4091 												if (data.amsTinymceExternalPlugins) {
       
  4092 													var names = data.amsTinymceExternalPlugins.split(/\s+/);
       
  4093 													for (var index in names) {
       
  4094 														var pluginSrc = editor.data('ams-tinymce-plugin-' + names[index]);
       
  4095 														tinymce.PluginManager.load(names[index], ams.getSource(pluginSrc));
       
  4096 													}
       
  4097 												}
       
  4098 												var settings = $.extend({}, dataOptions, data.amsTinymceOptions);
       
  4099 												settings = ams.executeFunctionByName(data.amsTinymceInitCallback, editor, settings) || settings;
       
  4100 												var plugin = editor.tinymce(settings);
       
  4101 												ams.executeFunctionByName(data.amsTinymceAfterInitCallback, editor, plugin, settings);
       
  4102 											});
       
  4103 										}
       
  4104 
       
  4105 										if (first_load) {
       
  4106 											ams.getScript(baseURL + '/jquery.tinymce' + ams.devext + '.js', function() {
       
  4107 												tinymce.baseURL = baseURL;
       
  4108 												tinymce.suffix = ams.devext;
       
  4109 												ams.skin.registerCleanCallback(cleanEditors);
       
  4110 												initEditors();
       
  4111 											});
       
  4112 										} else {
       
  4113 											initEditors();
       
  4114 										}
  3899 								   });
  4115 								   });
  3900 				}
  4116 				}
  3901 			},
  4117 			},
  3902 
  4118 
  3903 			/**
  4119 			/**
  3963 											ams.getCSS(ams.baseURL + '../css/ext/jquery-fancybox-2.1.5' + ams.devext + '.css');
  4179 											ams.getCSS(ams.baseURL + '../css/ext/jquery-fancybox-2.1.5' + ams.devext + '.css');
  3964 										}
  4180 										}
  3965 										fancyboxes.each(function() {
  4181 										fancyboxes.each(function() {
  3966 											var fancybox = $(this);
  4182 											var fancybox = $(this);
  3967 											var data = fancybox.data();
  4183 											var data = fancybox.data();
       
  4184 											var elements = fancybox;
       
  4185 											if (data.amsFancyboxElements) {
       
  4186 												elements = $(data.amsFancyboxElements, fancybox);
       
  4187 											}
  3968 											var helpers = (data.amsFancyboxHelpers || '').split(/\s+/);
  4188 											var helpers = (data.amsFancyboxHelpers || '').split(/\s+/);
  3969 											if (helpers.length > 0) {
  4189 											if (helpers.length > 0) {
  3970 												for (var index=0; index < helpers.length; index++) {
  4190 												for (var index=0; index < helpers.length; index++) {
  3971 													var helper = helpers[index];
  4191 													var helper = helpers[index];
  3972 													switch (helper) {
  4192 													switch (helper) {
  3989 											}
  4209 											}
  3990 											var dataOptions = {
  4210 											var dataOptions = {
  3991 												type: data.amsFancyboxType,
  4211 												type: data.amsFancyboxType,
  3992 												padding: data.amsFancyboxPadding || 10,
  4212 												padding: data.amsFancyboxPadding || 10,
  3993 												margin: data.amsFancyboxMargin || 10,
  4213 												margin: data.amsFancyboxMargin || 10,
       
  4214 												loop: data.amsFancyboxLoop,
  3994 												beforeLoad: ams.getFunctionByName(data.amsFancyboxBeforeLoad) || function() {
  4215 												beforeLoad: ams.getFunctionByName(data.amsFancyboxBeforeLoad) || function() {
  3995 													this.title = ams.executeFunctionByName(data.amsFancyboxTitleGetter, this) || $(this.element).attr('original-title') || $(this.element).attr('title');
  4216 													var title;
       
  4217 													if (data.amsFancyboxTitleGetter) {
       
  4218 														title = ams.executeFunctionByName(data.amsFancyboxTitleGetter, this);
       
  4219 													}
       
  4220 													if (!title) {
       
  4221 														var content = $('*:first', this.element);
       
  4222 														title = content.attr('original-title') || content.attr('title');
       
  4223 														if (!title) {
       
  4224 															title = $(this.element).attr('original-title') || $(this.element).attr('title');
       
  4225 														}
       
  4226 													}
       
  4227 													this.title = title;
  3996 												},
  4228 												},
       
  4229 												afterLoad: ams.getFunctionByName(data.amsFancyboxAfterLoad),
  3997 												helpers: {
  4230 												helpers: {
  3998 													title: {
  4231 													title: {
  3999 														type: 'inside'
  4232 														type: 'inside'
  4000 													}
  4233 													}
  4001 												}
  4234 												}
  4002 											};
  4235 											};
       
  4236 											if (helpers.length > 0) {
       
  4237 												for (index = 0; index < helpers.length; index++) {
       
  4238 													helper = helpers[index];
       
  4239 													switch (helper) {
       
  4240 														case 'buttons':
       
  4241 															dataOptions.helpers.buttons = {
       
  4242 																position: data.amsFancyboxButtonsPosition || 'top'
       
  4243 															};
       
  4244 															break;
       
  4245 														case 'thumbs':
       
  4246 															dataOptions.helpers.thumbs = {
       
  4247 																width: data.amsFancyboxThumbsWidth || 50,
       
  4248 																height: data.amsFancyboxThumbsHeight || 50
       
  4249 															};
       
  4250 															break;
       
  4251 														case 'media':
       
  4252 															dataOptions.helpers.media = true;
       
  4253 															break;
       
  4254 													}
       
  4255 												}
       
  4256 											}
  4003 											var settings = $.extend({}, dataOptions, data.amsFancyboxOptions);
  4257 											var settings = $.extend({}, dataOptions, data.amsFancyboxOptions);
  4004 											settings = ams.executeFunctionByName(data.amsFancyboxInitCallback, fancybox, settings) || settings;
  4258 											settings = ams.executeFunctionByName(data.amsFancyboxInitCallback, fancybox, settings) || settings;
  4005 											var plugin = fancybox.fancybox(settings);
  4259 											var plugin = elements.fancybox(settings);
  4006 											ams.executeFunctionByName(data.amsFancyboxAfterInitCallback, fancybox, plugin, settings);
  4260 											ams.executeFunctionByName(data.amsFancyboxAfterInitCallback, fancybox, plugin, settings);
  4007 										});
  4261 										});
  4008 								   });
  4262 								   });
  4009 				}
  4263 				}
  4010 			},
  4264 			},
  4084 					if (data.amsCallbackSource) {
  4338 					if (data.amsCallbackSource) {
  4085 						ams.getScript(data.amsCallbackSource,
  4339 						ams.getScript(data.amsCallbackSource,
  4086 									  function() {
  4340 									  function() {
  4087 										ams.executeFunctionByName(data.amsCallback, self, data.amsCallbackOptions);
  4341 										ams.executeFunctionByName(data.amsCallback, self, data.amsCallbackOptions);
  4088 									  });
  4342 									  });
  4089 					} else if (globals.console) {
  4343 					} else if (console) {
  4090 						globals.console.warn("Undefined callback: " + data.amsCallback);
  4344 						console.warn && console.warn("Undefined callback: " + data.amsCallback);
  4091 					}
  4345 					}
  4092 				} else {
  4346 				} else {
  4093 					callback.call(self, data.amsCallbackOptions);
  4347 					callback.call(self, data.amsCallbackOptions);
  4094 				}
  4348 				}
  4095 			});
  4349 			});
  4235 		deleteElement: function(element) {
  4489 		deleteElement: function(element) {
  4236 			return function() {
  4490 			return function() {
  4237 				var link = $(this);
  4491 				var link = $(this);
  4238 				MyAMS.skin.bigBox({
  4492 				MyAMS.skin.bigBox({
  4239 					title: ams.i18n.WARNING,
  4493 					title: ams.i18n.WARNING,
  4240 					content: '<i class="text-danger fa fa-2x fa-bell shake animated"></i>&nbsp; ' + ams.i18n.DELETE_WARNING,
  4494 					content: '<i class="text-danger fa fa-fw fa-bell"></i>&nbsp; ' + ams.i18n.DELETE_WARNING,
       
  4495 					status: 'info',
  4241 					buttons: ams.i18n.BTN_OK_CANCEL
  4496 					buttons: ams.i18n.BTN_OK_CANCEL
  4242 				}, function(button) {
  4497 				}, function(button) {
  4243 					if (button === ams.i18n.BTN_OK) {
  4498 					if (button === ams.i18n.BTN_OK) {
  4244 						var table = link.parents('table');
  4499 						var table = link.parents('table').first();
  4245 						var location = table.data('ams-location') || '';
  4500 						var location = table.data('ams-location') || '';
  4246 						var tr = link.parents('tr');
  4501 						var tr = link.parents('tr').first();
  4247 						var deleteTarget = tr.data('ams-delete-target') || table.data('ams-delete-target') || 'delete-element.json';
  4502 						var deleteTarget = tr.data('ams-delete-target') || table.data('ams-delete-target') || 'delete-element.json';
  4248 						var objectName = tr.data('ams-element-name');
  4503 						var objectName = tr.data('ams-element-name');
  4249 						MyAMS.ajax.post(location + '/' + deleteTarget, {'object_name': objectName}, function(result, status) {
  4504 						MyAMS.ajax.post(location + '/' + deleteTarget, {'object_name': objectName}, function(result, status) {
  4250 							if (result.status === 'success') {
  4505 							if (result.status === 'success') {
  4251 								if (table.hasClass('datatable')) {
  4506 								if (table.hasClass('datatable')) {
  4252 									table.dataTable().fnDeleteRow(tr[0]);
  4507 									table.dataTable().fnDeleteRow(tr[0]);
  4253 								} else {
  4508 								} else {
  4254 									tr.remove();
  4509 									tr.remove();
       
  4510 								}
       
  4511 								if (result.handle_json) {
       
  4512 									MyAMS.ajax.handleJSON(result);
  4255 								}
  4513 								}
  4256 							} else {
  4514 							} else {
  4257 								MyAMS.ajax.handleJSON(result);
  4515 								MyAMS.ajax.handleJSON(result);
  4258 							}
  4516 							}
  4259 						});
  4517 						});
  4381 		 */
  4639 		 */
  4382 		alert: function(parent, status, header, message, subtitle, margin) {
  4640 		alert: function(parent, status, header, message, subtitle, margin) {
  4383 			if (status === 'error') {
  4641 			if (status === 'error') {
  4384 				status = 'danger';
  4642 				status = 'danger';
  4385 			}
  4643 			}
  4386 			$('.alert-' + status, parent).remove();
  4644 			$('.alert-' + status, parent).not('.persistent').remove();
  4387 			var content = '<div class="' + (margin ? 'margin-10' : '') + ' alert alert-block alert-' + status + ' padding-5 fade in">' +
  4645 			var content = '<div class="' + (margin ? 'margin-10' : '') + ' alert alert-block alert-' + status + ' padding-5 fade in">' +
  4388 				'<a class="close" data-dismiss="alert"><i class="fa fa-check"></i></a>' +
  4646 				'<a class="close" data-dismiss="alert"><i class="fa fa-check"></i></a>' +
  4389 				'<h4 class="alert-heading">' +
  4647 				'<h4 class="alert-heading">' +
  4390 				'<i class="fa fa-fw fa-warning"></i> ' + header +
  4648 				'<i class="fa fa-fw fa-warning"></i> ' + header +
  4391 				'</h4>' +
  4649 				'</h4>' +
  4622 				type: 'GET',
  4880 				type: 'GET',
  4623 				url: url,
  4881 				url: url,
  4624 				dataType: 'html',
  4882 				dataType: 'html',
  4625 				cache: false,
  4883 				cache: false,
  4626 				beforeSend: function() {
  4884 				beforeSend: function() {
       
  4885 					if (options && options.preLoadCallback) {
       
  4886 						ams.executeFunctionByName(options.preLoadCallback, this);
       
  4887 					}
  4627 					ams.skin.cleanContainer(container);
  4888 					ams.skin.cleanContainer(container);
  4628 					container.html('<h1 class="loading"><i class="fa fa-cog fa-spin"></i> ' + ams.i18n.LOADING + ' </h1>');
  4889 					container.html('<h1 class="loading"><i class="fa fa-cog fa-spin"></i> ' + ams.i18n.LOADING + ' </h1>');
  4629 					if (container[0] === $('#content')[0]) {
  4890 					if (container[0] === $('#content')[0]) {
  4630 						ams.skin._drawBreadCrumb();
  4891 						ams.skin._drawBreadCrumb();
  4631 						var prefix = $('html head title').data('ams-title-prefix');
  4892 						var prefix = $('html head title').data('ams-title-prefix');
  4773 			progressUpload: ams.ajax.progress,
  5034 			progressUpload: ams.ajax.progress,
  4774 			xhr: function() {
  5035 			xhr: function() {
  4775 				var request = xhr();
  5036 				var request = xhr();
  4776 				if (request && (typeof(request.addEventListener) === "function")) {
  5037 				if (request && (typeof(request.addEventListener) === "function")) {
  4777 					var that = this;
  5038 					var that = this;
  4778 					request.addEventListener("progress", function(evt) {
  5039 					if (that && that.progress) {
  4779 						that.progress(evt);
  5040 						request.addEventListener("progress", function (evt) {
  4780 					}, false);
  5041 							that.progress(evt);
       
  5042 						}, false);
       
  5043 					}
  4781 				}
  5044 				}
  4782 				return request;
  5045 				return request;
  4783 			}
  5046 			}
  4784 		});
  5047 		});
  4785 		$(document).ajaxStart(ams.ajax.start);
  5048 		$(document).ajaxStart(ams.ajax.start);
  4891 			// ask verification
  5154 			// ask verification
  4892 			ams.skin.bigBox({
  5155 			ams.skin.bigBox({
  4893 				title : "<i class='fa fa-sign-out txt-color-orangeDark'></i> " + ams.i18n.LOGOUT +
  5156 				title : "<i class='fa fa-sign-out txt-color-orangeDark'></i> " + ams.i18n.LOGOUT +
  4894 						" <span class='txt-color-orangeDark'><strong>" + $('#show-shortcut').text() + "</strong></span> ?",
  5157 						" <span class='txt-color-orangeDark'><strong>" + $('#show-shortcut').text() + "</strong></span> ?",
  4895 				content : ams.i18n.LOGOUT_COMMENT,
  5158 				content : ams.i18n.LOGOUT_COMMENT,
  4896 				buttons : '['+ams.i18n.BTN_NO+']['+ams.i18n.BTN_YES+']'
  5159 				buttons : ams.i18n.BTN_YES_NO
  4897 			}, function(ButtonPressed) {
  5160 			}, function(ButtonPressed) {
  4898 				if (ButtonPressed === ams.i18n.BTN_YES) {
  5161 				if (ButtonPressed === ams.i18n.BTN_YES) {
  4899 					ams.root.addClass('animated fadeOutUp');
  5162 					ams.root.addClass('animated fadeOutUp');
  4900 					setTimeout(ams.skin.logout, 1000);
  5163 					setTimeout(ams.skin.logout, 1000);
  4901 				}
  5164 				}
  4980 					href.call(link);
  5243 					href.call(link);
  4981 				} else {
  5244 				} else {
  4982 					// Standard AJAX or browser URL call
  5245 					// Standard AJAX or browser URL call
  4983 					// Convert %23 chars to #
  5246 					// Convert %23 chars to #
  4984 					href = href.replace(/\%23/, '#');
  5247 					href = href.replace(/\%23/, '#');
  4985 					var target = link.data('ams-target');
  5248 					if (e.ctrlKey) {
  4986 					if (target) {
  5249 						window.open(href);
  4987 						ams.form.confirmChangedForm(target, function () {
       
  4988 							ams.skin.loadURL(href, target, link.data('ams-link-options'), link.data('ams-link-callback'));
       
  4989 						});
       
  4990 					} else {
  5250 					} else {
  4991 						ams.form.confirmChangedForm(function () {
  5251 						var target = link.data('ams-target');
  4992 							if (href.startsWith('#')) {
  5252 						if (target) {
  4993 								if (href !== location.hash) {
  5253 							ams.form.confirmChangedForm(target, function () {
  4994 									if (ams.root.hasClass('mobile-view-activated')) {
  5254 								ams.skin.loadURL(href, target, link.data('ams-link-options'), link.data('ams-link-callback'));
  4995 										ams.root.removeClass('hidden-menu');
  5255 							});
  4996 										window.setTimeout(function () {
  5256 						} else {
       
  5257 							ams.form.confirmChangedForm(function () {
       
  5258 								if (href.startsWith('#')) {
       
  5259 									if (href !== location.hash) {
       
  5260 										if (ams.root.hasClass('mobile-view-activated')) {
       
  5261 											ams.root.removeClass('hidden-menu');
       
  5262 											window.setTimeout(function () {
       
  5263 												window.location.hash = href;
       
  5264 											}, 50);
       
  5265 										} else {
  4997 											window.location.hash = href;
  5266 											window.location.hash = href;
  4998 										}, 50);
  5267 										}
  4999 									} else {
       
  5000 										window.location.hash = href;
       
  5001 									}
  5268 									}
       
  5269 								} else {
       
  5270 									window.location = href;
  5002 								}
  5271 								}
  5003 							} else {
  5272 							});
  5004 								window.location = href;
  5273 						}
  5005 							}
       
  5006 						});
       
  5007 					}
  5274 					}
  5008 				}
  5275 				}
  5009 			});
  5276 			});
  5010 			$(document).on('click', 'a[target="_blank"]', function(e) {
  5277 			$(document).on('click', 'a[target="_blank"]', function(e) {
  5011 				e.preventDefault();
  5278 				e.preventDefault();
  5106 
  5373 
  5107 		// Notify reset to update Select2 widgets
  5374 		// Notify reset to update Select2 widgets
  5108 		$(document).on('reset', 'form', function(e) {
  5375 		$(document).on('reset', 'form', function(e) {
  5109 			var form = $(this);
  5376 			var form = $(this);
  5110 			setTimeout(function() {
  5377 			setTimeout(function() {
       
  5378 				$('.alert-danger, SPAN.state-error', form).not('.persistent').remove();
       
  5379 				$('LABEL.state-error', form).removeClass('state-error');
       
  5380 				$('INPUT.select2[type="hidden"]', form).each(function() {
       
  5381 					var input = $(this);
       
  5382 					var select = input.data('select2');
       
  5383 					input.select2('val', input.data('ams-select2-input-value').split(select.opts.separator));
       
  5384 				});
  5111 				form.find('.select2').trigger('change');
  5385 				form.find('.select2').trigger('change');
  5112 				$('[data-ams-reset-callback]', form).each(function() {
  5386 				$('[data-ams-reset-callback]', form).each(function() {
  5113 					var element = $(this);
  5387 					var element = $(this);
  5114 					var data = element.data();
  5388 					var data = element.data();
  5115 					var callback = ams.getFunctionByName(data.amsResetCallback);
  5389 					var callback = ams.getFunctionByName(data.amsResetCallback);
  5259 		PROGRESS: "Processing",
  5533 		PROGRESS: "Processing",
  5260 
  5534 
  5261 		WAIT: "Please wait!",
  5535 		WAIT: "Please wait!",
  5262 		FORM_SUBMITTED: "This form was already submitted...",
  5536 		FORM_SUBMITTED: "This form was already submitted...",
  5263 		NO_SERVER_RESPONSE: "No response from server!",
  5537 		NO_SERVER_RESPONSE: "No response from server!",
       
  5538 
  5264 		ERROR_OCCURED: "An error occured!",
  5539 		ERROR_OCCURED: "An error occured!",
  5265 		ERRORS_OCCURED: "Some errors occured!",
  5540 		ERRORS_OCCURED: "Some errors occured!",
  5266 
  5541 
  5267 		BAD_LOGIN_TITLE: "Bad login!",
  5542 		BAD_LOGIN_TITLE: "Bad login!",
  5268 		BAD_LOGIN_MESSAGE: "Your anthentication credentials didn't allow you to open a session; " +
  5543 		BAD_LOGIN_MESSAGE: "Your anthentication credentials didn't allow you to open a session; " +
  5280 		BTN_YES: "Yes",
  5555 		BTN_YES: "Yes",
  5281 		BTN_NO: "No",
  5556 		BTN_NO: "No",
  5282 		BTN_YES_NO: "[Yes][No]",
  5557 		BTN_YES_NO: "[Yes][No]",
  5283 
  5558 
  5284 		CLIPBOARD_COPY: "Copy to clipboard with Ctrl+C, and Enter",
  5559 		CLIPBOARD_COPY: "Copy to clipboard with Ctrl+C, and Enter",
       
  5560 		CLIPBOARD_CHARACTER_COPY_OK: "Character copied to clipboard",
       
  5561 		CLIPBOARD_TEXT_COPY_OK: "Text copied to clipboard",
  5285 
  5562 
  5286 		FORM_CHANGED_WARNING: "Some changes were not saved. These updates will be lost if you leave this page.",
  5563 		FORM_CHANGED_WARNING: "Some changes were not saved. These updates will be lost if you leave this page.",
  5287 		DELETE_WARNING: "This change can't be undone. Are you sure that you want to delete this element?",
  5564 		DELETE_WARNING: "This change can't be undone. Are you sure that you want to delete this element?",
  5288 		NO_UPDATE: "No changes were applied.",
  5565 		NO_UPDATE: "No changes were applied.",
  5289 		DATA_UPDATED: "Data successfully updated.",
  5566 		DATA_UPDATED: "Data successfully updated.",
  5302 		SELECT2_INPUT_TOOLONG: "Please delete {0} character{1}",
  5579 		SELECT2_INPUT_TOOLONG: "Please delete {0} character{1}",
  5303 		SELECT2_SELECTION_TOOBIG: "You can only select {0} item{1}",
  5580 		SELECT2_SELECTION_TOOBIG: "You can only select {0} item{1}",
  5304 		SELECT2_FREETAG_PREFIX: "Free text: ",
  5581 		SELECT2_FREETAG_PREFIX: "Free text: ",
  5305 
  5582 
  5306 		DT_COLUMNS: "Columns"
  5583 		DT_COLUMNS: "Columns"
  5307 
  5584 	}
       
  5585 
       
  5586 	MyAMS.plugins.i18n = {
       
  5587 		widgets: {},
       
  5588 		validate: {},
       
  5589 		datatables: {},
       
  5590 		fancybox: {
       
  5591 			ERROR: "Can't load requested content.",
       
  5592 			RETRY: "Please check URL or try again later.",
       
  5593 			CLOSE: "Close",
       
  5594 			NEXT: "Next",
       
  5595 			PREVIOUS: "Previous"
       
  5596 		}
  5308 	};
  5597 	};
  5309 
  5598 
  5310 
  5599 
  5311 	$(document).ready(function() {
  5600 	$(document).ready(function() {
  5312 		$ = jQuery.noConflict();
  5601 		$ = jQuery.noConflict();