src/pyams_skin/resources/js/myams.js
changeset 69 a361355b55c7
parent 64 3fe1d315747c
child 72 13f5fdd06484
equal deleted inserted replaced
68:fd8fb93e1b6a 69:a361355b55c7
   398 	/**
   398 	/**
   399 	 * Get MyAMS base URL
   399 	 * Get MyAMS base URL
   400 	 * Copyright Andrew Davy: https://forrst.com/posts/Get_the_URL_of_the_current_javascript_file-Dst
   400 	 * Copyright Andrew Davy: https://forrst.com/posts/Get_the_URL_of_the_current_javascript_file-Dst
   401 	 */
   401 	 */
   402 	MyAMS.baseURL = (function () {
   402 	MyAMS.baseURL = (function () {
   403 		var script = $('script[src$="/myams.js"], script[src$="/myams.min.js"]');
   403 		var script = $('script[src*="/myams.js"], script[src*="/myams.min.js"]');
   404 		var src = script.attr("src");
   404 		var src = script.attr("src");
   405 		ams.devmode = !src.endsWith('.min.js');
   405 		ams.devmode = src.indexOf('.min.js') < 0;
   406 		ams.devext = ams.devmode ? '' : '.min';
   406 		ams.devext = ams.devmode ? '' : '.min';
   407 		return src.substring(0, src.lastIndexOf('/') + 1);
   407 		return src.substring(0, src.lastIndexOf('/') + 1);
   408 	})();
   408 	})();
   409 
   409 
   410 
   410 
   978 		 *  - @options: additional JSON-RPC procedure parameters
   978 		 *  - @options: additional JSON-RPC procedure parameters
   979 		 *  - @callback: name of a callback which will be called on server response
   979 		 *  - @callback: name of a callback which will be called on server response
   980 		 */
   980 		 */
   981 		query: function(query, method, options, callback) {
   981 		query: function(query, method, options, callback) {
   982 			ams.ajax.check($.jsonRpc,
   982 			ams.ajax.check($.jsonRpc,
   983 						   ams.baseURL + 'ext/jquery-jsonrpc' + (ams.devmode ? '.js' : '.min.js'),
   983 						   ams.baseURL + 'ext/jquery-jsonrpc' + ams.devext + '.js',
   984 						   function() {
   984 						   function() {
   985 								var result;
   985 								var result;
   986 								if (typeof(options) == 'function') {
   986 								if (typeof(options) == 'function') {
   987 									callback = options;
   987 									callback = options;
   988 									options = {};
   988 									options = {};
  1027 		 *  - @options: additional JSON-RPC method call parameters
  1027 		 *  - @options: additional JSON-RPC method call parameters
  1028 		 *  - @callback: name of a callback which will be called on server response
  1028 		 *  - @callback: name of a callback which will be called on server response
  1029 		 */
  1029 		 */
  1030 		post: function(method, data, options, callback) {
  1030 		post: function(method, data, options, callback) {
  1031 			ams.ajax.check($.jsonRPC,
  1031 			ams.ajax.check($.jsonRPC,
  1032 						   ams.baseURL + 'ext/jquery-jsonrpc' + (ams.devmode ? '.js' : '.min.js'),
  1032 						   ams.baseURL + 'ext/jquery-jsonrpc' + ams.devext + '.js',
  1033 						   function() {
  1033 						   function() {
  1034 								var result;
  1034 								var result;
  1035 								if (typeof(options) == 'function') {
  1035 								if (typeof(options) == 'function') {
  1036 									callback = options;
  1036 									callback = options;
  1037 									options = {};
  1037 									options = {};
  1090 		 *  - @options: additional JSON-RPC procedure parameters
  1090 		 *  - @options: additional JSON-RPC procedure parameters
  1091 		 *  - @callback: name of a callback which will be called on server response
  1091 		 *  - @callback: name of a callback which will be called on server response
  1092 		 */
  1092 		 */
  1093 		post: function(url, method, data, options, callback) {
  1093 		post: function(url, method, data, options, callback) {
  1094 			ams.ajax.check($.xmlrpc,
  1094 			ams.ajax.check($.xmlrpc,
  1095 						   ams.baseURL + 'ext/jquery-xmlrpc' + (ams.devmode ? '.js' : '.min.js'),
  1095 						   ams.baseURL + 'ext/jquery-xmlrpc' + ams.devext + '.js',
  1096 						   function() {
  1096 						   function() {
  1097 								var result;
  1097 								var result;
  1098 								if (typeof(options) == 'function') {
  1098 								if (typeof(options) == 'function') {
  1099 									callback = options;
  1099 									callback = options;
  1100 									options = {};
  1100 									options = {};
  1225 			// Remove remaining status messages
  1225 			// Remove remaining status messages
  1226 			$('.alert, SPAN.state-error', form).remove();
  1226 			$('.alert, SPAN.state-error', form).remove();
  1227 			$('.state-error', form).removeClassPrefix('state-');
  1227 			$('.state-error', form).removeClassPrefix('state-');
  1228 			// Check submit button
  1228 			// Check submit button
  1229 			var button = $(form.data('ams-submit-button'));
  1229 			var button = $(form.data('ams-submit-button'));
  1230 			if (button)
  1230 			if (button && !button.data('ams-form-hide-loading'))
  1231 				button.button('loading');
  1231 				button.button('loading');
  1232 			ams.ajax.check($.fn.ajaxSubmit,
  1232 			ams.ajax.check($.fn.ajaxSubmit,
  1233 						   ams.baseURL + 'ext/jquery-form-3.49' + (ams.devmode ? '.js' : '.min.js'),
  1233 						   ams.baseURL + 'ext/jquery-form-3.49' + ams.devext + '.js',
  1234 						   function() {
  1234 						   function() {
  1235 
  1235 
  1236 								function _submitAjaxForm(form, options) {
  1236 								function _submitAjaxForm(form, options) {
  1237 
  1237 
  1238 									var button;
  1238 									var button;
  1407 									// JQuery-progressbar plug-in must be loaded synchronously!!
  1407 									// JQuery-progressbar plug-in must be loaded synchronously!!
  1408 									// Otherwise, hidden input fields created by jquery-validate plug-in
  1408 									// Otherwise, hidden input fields created by jquery-validate plug-in
  1409 									// and matching named buttons will be deleted (on first form submit)
  1409 									// and matching named buttons will be deleted (on first form submit)
  1410 									// before JQuery-form plug-in can get them when submitting the form...
  1410 									// before JQuery-form plug-in can get them when submitting the form...
  1411 									ams.ajax.check($.progressBar,
  1411 									ams.ajax.check($.progressBar,
  1412 												   ams.baseURL + 'ext/jquery-progressbar' + (ams.devmode ? '.js' : '.min.js'));
  1412 												   ams.baseURL + 'ext/jquery-progressbar' + ams.devext + '.js');
  1413 									var settings = $.extend({}, {
  1413 									var settings = $.extend({}, {
  1414 										uuid: $.progressBar.submit(form)
  1414 										uuid: $.progressBar.submit(form)
  1415 									});
  1415 									});
  1416 									_submitAjaxForm(form, settings);
  1416 									_submitAjaxForm(form, settings);
  1417 								} else
  1417 								} else
  1622 			} else if (errors instanceof Array) {
  1622 			} else if (errors instanceof Array) {
  1623 				var header = errors.length == 1 ? ams.i18n.ERROR_OCCURED : ams.i18n.ERRORS_OCCURED;
  1623 				var header = errors.length == 1 ? ams.i18n.ERROR_OCCURED : ams.i18n.ERRORS_OCCURED;
  1624 				ams.skin.alert(form, 'error', header, errors);
  1624 				ams.skin.alert(form, 'error', header, errors);
  1625 			} else {
  1625 			} else {
  1626 				$('.state-error', form).removeClass('state-error');
  1626 				$('.state-error', form).removeClass('state-error');
  1627 				header = errors.widgets && (errors.widgets.length > 1) ? ams.i18n.ERRORS_OCCURED : ams.i18n.ERROR_OCCURED;
  1627 				header = errors.error_header ||
       
  1628 						 (errors.widgets && (errors.widgets.length > 1) ? ams.i18n.ERRORS_OCCURED : ams.i18n.ERROR_OCCURED);
  1628 				var message = new Array();
  1629 				var message = new Array();
  1629 				var index;
  1630 				var index;
  1630 				for (index in errors.messages) {
  1631 				for (index in errors.messages) {
  1631 					if (!$.isNumeric(index))
  1632 					if (!$.isNumeric(index))
  1632 						continue;
  1633 						continue;
  1633 					message.push(errors.messages[index].message || errors.messages[index]);
  1634 					if (errors.messages[index].header) {
       
  1635 						message.push('<strong>' + errors.messages[index].header + '</strong><br />' + errors.messages[index].message);
       
  1636 					} else {
       
  1637 						message.push(errors.messages[index].message || errors.messages[index]);
       
  1638 					}
  1634 				}
  1639 				}
  1635 				for (index in errors.widgets) {
  1640 				for (index in errors.widgets) {
  1636 					if (!$.isNumeric(index))
  1641 					if (!$.isNumeric(index))
  1637 						continue;
  1642 						continue;
  1638 					// set widget status message
  1643 					// set widget status message
  1653 						$('li:nth-child(' + tab_index + ')', nav_tabs).removeClassPrefix('state-')
  1658 						$('li:nth-child(' + tab_index + ')', nav_tabs).removeClassPrefix('state-')
  1654 																	  .addClass('state-error');
  1659 																	  .addClass('state-error');
  1655 						$('li.state-error:first a', form).click();
  1660 						$('li.state-error:first a', form).click();
  1656 					}
  1661 					}
  1657 				}
  1662 				}
  1658 				ams.skin.alert(form, 'error', header, message, errors.error_message);
  1663 				ams.skin.alert(form, errors.error_level || 'error', header, message, errors.error_message);
  1659 			}
  1664 			}
  1660 		}
  1665 		}
  1661 	};
  1666 	};
  1662 
  1667 
  1663 
  1668 
  1683 		/**
  1688 		/**
  1684 		 * Modal dialog opener
  1689 		 * Modal dialog opener
  1685 		 */
  1690 		 */
  1686 		open: function(source, options) {
  1691 		open: function(source, options) {
  1687 			ams.ajax.check($.fn.modalmanager,
  1692 			ams.ajax.check($.fn.modalmanager,
  1688 						   ams.baseURL + 'ext/bootstrap-modalmanager' + (ams.devmode ? '.js' : '.min.js'),
  1693 						   ams.baseURL + 'ext/bootstrap-modalmanager' + ams.devext + '.js',
  1689 						   function() {
  1694 						   function() {
  1690 								ams.ajax.check($.fn.modal.defaults,
  1695 								ams.ajax.check($.fn.modal.defaults,
  1691 											   ams.baseURL + 'ext/bootstrap-modal' + (ams.devmode ? '.js' : '.min.js'),
  1696 											   ams.baseURL + 'ext/bootstrap-modal' + ams.devext + '.js',
  1692 								function(first_load) {
  1697 								function(first_load) {
  1693 									if (first_load) {
  1698 									if (first_load) {
  1694 										$(document).off('click.modal');
  1699 										$(document).off('click.modal');
  1695 										$.fn.modal.defaults.spinner = $.fn.modalmanager.defaults.spinner =
  1700 										$.fn.modal.defaults.spinner = $.fn.modalmanager.defaults.spinner =
  1696 											'<div class="loading-spinner" style="width: 200px; margin-left: -100px;">' +
  1701 											'<div class="loading-spinner" style="width: 200px; margin-left: -100px;">' +
  1830 		 * Modals hidden callback
  1835 		 * Modals hidden callback
  1831 		 * This callback can be used to clean contents added by plug-ins
  1836 		 * This callback can be used to clean contents added by plug-ins
  1832 		 */
  1837 		 */
  1833 		hidden: function(e) {
  1838 		hidden: function(e) {
  1834 			var modal = e.target;
  1839 			var modal = e.target;
       
  1840 			// Call registered cleaning callbacks
       
  1841 			ams.skin.cleanContainer(modal);
       
  1842 			// Call registered hide callbacks
  1835 			var callbacks = ams.dialog._hide_callbacks;
  1843 			var callbacks = ams.dialog._hide_callbacks;
  1836 			for (var index in callbacks) {
  1844 			for (var index in callbacks) {
  1837 				callbacks[index].call(modal);
  1845 				callbacks[index].call(modal);
  1838 			}
  1846 			}
  1839 		}
  1847 		}
  2011 				for (var name in plugins) {
  2019 				for (var name in plugins) {
  2012 					disabled.push(plugins[name]);
  2020 					disabled.push(plugins[name]);
  2013 				}
  2021 				}
  2014 			});
  2022 			});
  2015 
  2023 
  2016 			// Run already enabled plug-ins
  2024 			// Load and register new plug-ins
  2017 			for (var index in ams.plugins.enabled) {
       
  2018 				if (disabled.indexOf(index) >= 0)
       
  2019 					continue;
       
  2020 				var plugin = ams.plugins.enabled[index];
       
  2021 				if (typeof(plugin) == 'function')
       
  2022 					plugin(element);
       
  2023 			}
       
  2024 
       
  2025 			// Load, run and register new plug-ins
       
  2026 			var name;
  2025 			var name;
  2027 			$('[data-ams-plugins]', element).each(function() {
  2026 			$('[data-ams-plugins]', element).each(function() {
  2028 				var source = $(this);
  2027 				var source = $(this);
  2029 				var plugins = {}
  2028 				var plugins = {}
  2030 				if (typeof(source.data('ams-plugins')) === 'string') {
  2029 				if (typeof(source.data('ams-plugins')) === 'string') {
  2048 						var plugin = plugins[name];
  2047 						var plugin = plugins[name];
  2049 						ams.getScript(plugin.src, function() {
  2048 						ams.getScript(plugin.src, function() {
  2050 							var callback = plugin.callback;
  2049 							var callback = plugin.callback;
  2051 							if (callback) {
  2050 							if (callback) {
  2052 								var called = ams.getFunctionByName(callback);
  2051 								var called = ams.getFunctionByName(callback);
  2053 								if (typeof(called) == 'function')
       
  2054 									called.apply(source);
       
  2055 								if (plugin.register !== false)
  2052 								if (plugin.register !== false)
  2056 									ams.plugins.enabled[name] = called;
  2053 									ams.plugins.enabled[name] = called;
  2057 							} else {
  2054 							} else {
  2058 								if (plugin.register !== false)
  2055 								if (plugin.register !== false)
  2059 									ams.plugins.enabled[name] = null;
  2056 									ams.plugins.enabled[name] = null;
  2066 							async: plugin.async === undefined ? true : plugin.async
  2063 							async: plugin.async === undefined ? true : plugin.async
  2067 						});
  2064 						});
  2068 					}
  2065 					}
  2069 				}
  2066 				}
  2070 			});
  2067 			});
       
  2068 
       
  2069 			// Run all enabled plug-ins
       
  2070 			for (var index in ams.plugins.enabled) {
       
  2071 				if (disabled.indexOf(index) >= 0)
       
  2072 					continue;
       
  2073 				var plugin = ams.plugins.enabled[index];
       
  2074 				if (typeof(plugin) == 'function')
       
  2075 					plugin(element);
       
  2076 			}
  2071 		},
  2077 		},
  2072 
  2078 
  2073 		/**
  2079 		/**
  2074 		 * Data initializer
  2080 		 * Data initializer
  2075 		 * This plug-in converts a single JSON "data-ams-data" attribute into a set of several equivalent "data-" attributes.
  2081 		 * This plug-in converts a single JSON "data-ams-data" attribute into a set of several equivalent "data-" attributes.
  2155 			 */
  2161 			 */
  2156 			hint: function(element) {
  2162 			hint: function(element) {
  2157 				var hints = $('.hint:not(:parents(.nohints))', element);
  2163 				var hints = $('.hint:not(:parents(.nohints))', element);
  2158 				if (hints.length > 0)
  2164 				if (hints.length > 0)
  2159 					ams.ajax.check($.fn.tipsy,
  2165 					ams.ajax.check($.fn.tipsy,
  2160 								   ams.baseURL + 'ext/jquery-tipsy' + (ams.devmode ? '.js' : '.min.js'),
  2166 								   ams.baseURL + 'ext/jquery-tipsy' + ams.devext + '.js',
  2161 								   function() {
  2167 								   function() {
  2162 										ams.getCSS(ams.baseURL + '../css/ext/jquery-tipsy' + (ams.devmode ? '.css' : '.min.css'),
  2168 										ams.getCSS(ams.baseURL + '../css/ext/jquery-tipsy' + ams.devext + '.css',
  2163 												  'jquery-tipsy');
  2169 												  'jquery-tipsy');
  2164 										hints.each(function() {
  2170 										hints.each(function() {
  2165 											var hint = $(this);
  2171 											var hint = $(this);
  2166 											var data = hint.data();
  2172 											var data = hint.data();
  2167 											var data_options = {
  2173 											var data_options = {
  2170 													var hint = $(this);
  2176 													var hint = $(this);
  2171 													return hint.attr('original-title') ||
  2177 													return hint.attr('original-title') ||
  2172 														   hint.attr(data.amsHintTitleAttr || 'title') ||
  2178 														   hint.attr(data.amsHintTitleAttr || 'title') ||
  2173 														   (data.amsHintHtml ? hint.html() : hint.text());
  2179 														   (data.amsHintHtml ? hint.html() : hint.text());
  2174 												},
  2180 												},
  2175 												opacity: data.amsHintOpacity,
  2181 												opacity: data.amsHintOpacity || 0.95,
  2176 												gravity: data.amsHintGravity || 'sw',
  2182 												gravity: data.amsHintGravity || 'sw',
  2177 												offset: data.amsHintOffset || 0
  2183 												offset: data.amsHintOffset || 0
  2178 											};
  2184 											};
  2179 											var settings = $.extend({}, data_options, data.amsHintOptions);
  2185 											var settings = $.extend({}, data_options, data.amsHintOptions);
  2180 											settings = ams.executeFunctionByName(data.amsHintInitCallback, hint, settings) || settings;
  2186 											settings = ams.executeFunctionByName(data.amsHintInitCallback, hint, settings) || settings;
  2181 											var plugin = hint.tipsy(settings);
  2187 											var plugin = hint.tipsy(settings);
  2182 											ams.executeFunctionByName(data.amsHintAfterInitCallback, hint, plugin, settings);
  2188 											ams.executeFunctionByName(data.amsHintAfterInitCallback, hint, plugin, settings);
  2183 										});
  2189 										});
  2184 								   });
  2190 								   });
       
  2191 			},
       
  2192 
       
  2193 			/**
       
  2194 			 * Context menu plug-in
       
  2195 			 */
       
  2196 			contextMenu: function(element) {
       
  2197 				var menus = $('.context-menu', element);
       
  2198 				if (menus.length > 0) {
       
  2199 					menus.each(function() {
       
  2200 						var menu = $(this);
       
  2201 						var data = menu.data();
       
  2202 						var data_options = {
       
  2203 							menuSelector: data.amsContextmenuSelector,
       
  2204 							menuSelected: ams.helpers.contextMenuHandler
       
  2205 						};
       
  2206 						var settings = $.extend({}, data_options, data.amsContextmenuOptions);
       
  2207 						settings = ams.executeFunctionByName(data.amsContextmenuInitCallback, menu, settings) || settings;
       
  2208 						var plugin = menu.contextMenu(settings);
       
  2209 						ams.executeFunctionByName(data.amsContextmenuAfterInitCallback, menu, plugin, settings);
       
  2210 					});
       
  2211 				}
  2185 			},
  2212 			},
  2186 
  2213 
  2187 			/**
  2214 			/**
  2188 			 * Fieldset legend switcher
  2215 			 * Fieldset legend switcher
  2189 			 */
  2216 			 */
  2267 							input.attr('disabled', 'disabled');
  2294 							input.attr('disabled', 'disabled');
  2268 						} else {
  2295 						} else {
  2269 							input.on('change', function(e) {
  2296 							input.on('change', function(e) {
  2270 								e.preventDefault();
  2297 								e.preventDefault();
  2271 								var veto = {};
  2298 								var veto = {};
       
  2299 								var isChecked = $(this).is(':checked');
  2272 								legend.trigger('ams.checker.before-switch', [legend, veto]);
  2300 								legend.trigger('ams.checker.before-switch', [legend, veto]);
  2273 								if (veto.veto)
  2301 								if (veto.veto) {
       
  2302 									// reset checked status because event is fired after change...
       
  2303 									$(this).prop('checked', !isChecked);
  2274 									return;
  2304 									return;
  2275 								var isChecked = $(this).is(':checked');
  2305 								}
  2276 								ams.executeFunctionByName(data.amsCheckerChangeHandler, legend, isChecked);
  2306 								ams.executeFunctionByName(data.amsCheckerChangeHandler, legend, isChecked);
  2277 								if (!data.amsCheckerCancelDefault) {
  2307 								if (!data.amsCheckerCancelDefault) {
  2278 									var hidden = input.data('ams-checker-hidden-input');
  2308 									var hidden = input.data('ams-checker-hidden-input');
  2279 									if (isChecked) {
  2309 									if (isChecked) {
  2280 										if (data.amsCheckerMode == 'disable')
  2310 										if (data.amsCheckerMode == 'disable')
  2285 											hidden.val(checkedValue);
  2315 											hidden.val(checkedValue);
  2286 										$('[data-required]', fieldset).attr('required', 'required');
  2316 										$('[data-required]', fieldset).attr('required', 'required');
  2287 										legend.trigger('ams.checker.opened', [legend]);
  2317 										legend.trigger('ams.checker.opened', [legend]);
  2288 									} else {
  2318 									} else {
  2289 										if (data.amsCheckerMode == 'disable')
  2319 										if (data.amsCheckerMode == 'disable')
  2290 											fieldset.attr('disabled', 'disabled');
  2320 											fieldset.prop('disabled', 'disabled');
  2291 										else
  2321 										else
  2292 											fieldset.addClass('switched');
  2322 											fieldset.addClass('switched');
  2293 										if (hidden)
  2323 										if (hidden)
  2294 											hidden.val(uncheckedValue);
  2324 											hidden.val(uncheckedValue);
  2295 										$('[data-required]', fieldset).removeAttr('required');
  2325 										$('[data-required]', fieldset).removeAttr('required');
  2417 					});
  2447 					});
  2418 				}
  2448 				}
  2419 			},
  2449 			},
  2420 
  2450 
  2421 			/**
  2451 			/**
  2422 			 * Context menu plug-in
  2452 			 * JQuery typeahead plug-in
  2423 			 */
  2453 			 */
  2424 			contextMenu: function(element) {
  2454 			typeahead: function(element) {
  2425 				var menus = $('.context-menu', element);
  2455 				var typeaheads = $('.typeahead', element);
  2426 				if (menus.length > 0) {
  2456 				if (typeaheads.length > 0) {
  2427 					menus.each(function() {
  2457 					ams.ajax.check($.fn.typeahead,
  2428 						var menu = $(this);
  2458 								   ams.baseURL + 'ext/jquery-typeahead' + ams.devext + '.js',
  2429 						var data = menu.data();
  2459 								   function() {
  2430 						var data_options = {
  2460 										typeaheads.each(function() {
  2431 							menuSelector: data.amsContextmenuSelector,
  2461 											var input = $(this);
  2432 							menuSelected: ams.helpers.contextMenuHandler
  2462 											var data = input.data();
  2433 						};
  2463 											var data_options = {};
  2434 						var settings = $.extend({}, data_options, data.amsContextmenuOptions);
  2464 											var settings = $.extend({}, data_options, data.amsTypeaheadOptions);
  2435 						settings = ams.executeFunctionByName(data.amsContextmenuInitCallback, menu, settings) || settings;
  2465 											settings = ams.executeFunctionByName(data.amsTypeaheadInitCallback, input, settings) || settings;
  2436 						var plugin = menu.contextMenu(settings);
  2466 											var plugin = input.typeahead(settings);
  2437 						ams.executeFunctionByName(data.amsContextmenuAfterInitCallback, menu, plugin, settings);
  2467 											ams.executeFunctionByName(data.amsTypeaheadAfterInitCallback, input, plugin, settings);
  2438 					});
  2468 										});
       
  2469 								   });
  2439 				}
  2470 				}
  2440 			},
  2471 			},
  2441 
  2472 
  2442 			/**
  2473 			/**
  2443 			 * Select2 plug-in
  2474 			 * Select2 plug-in
  2444 			 */
  2475 			 */
  2445 			select2: function(element) {
  2476 			select2: function(element) {
  2446 				var selects = $('.select2', element);
  2477 				var selects = $('.select2', element);
  2447 				if (selects.length > 0) {
  2478 				if (selects.length > 0) {
  2448 					ams.ajax.check($.fn.select2,
  2479 					ams.ajax.check($.fn.select2,
  2449 								   ams.baseURL + 'ext/jquery-select2-3.5.2' + (ams.devmode ? '.js' : '.min.js'),
  2480 								   ams.baseURL + 'ext/jquery-select2-3.5.2' + ams.devext + '.js',
  2450 								   function() {
  2481 								   function() {
  2451 										selects.each(function() {
  2482 										selects.each(function() {
  2452 											var select = $(this);
  2483 											var select = $(this);
  2453 											var data = select.data();
  2484 											var data = select.data();
  2454 											var data_options = {
  2485 											var data_options = {
  2535 												default:
  2566 												default:
  2536 													break;
  2567 													break;
  2537 											}
  2568 											}
  2538 
  2569 
  2539 											if (select.attr('readonly')) {
  2570 											if (select.attr('readonly')) {
  2540 												data_options.query = function() {
  2571 												if (select.attr('type') == 'hidden') {
  2541 													return [];
  2572 													data_options.query = function () {
  2542 												};
  2573 														return [];
       
  2574 													};
       
  2575 												}
  2543 											} else if (data.amsSelect2Query) {
  2576 											} else if (data.amsSelect2Query) {
  2544 												// Custom query method
  2577 												// Custom query method
  2545 												data_options.query = ams.getFunctionByName(data.amsSelect2Query);
  2578 												data_options.query = ams.getFunctionByName(data.amsSelect2Query);
  2546 												data_options.minimumInputLength = data.amsSelect2MinimumInputLength || 1;
  2579 												data_options.minimumInputLength = data.amsSelect2MinimumInputLength || 1;
  2547 											} else if (data.amsSelect2QueryUrl) {
  2580 											} else if (data.amsSelect2QueryUrl) {
  2576 													settings.params[data.amsSelect2PageParamName || 'page'] = options.page;
  2609 													settings.params[data.amsSelect2PageParamName || 'page'] = options.page;
  2577 													settings.params[data.amsSelect2ContextParamName || 'context'] = options.context;
  2610 													settings.params[data.amsSelect2ContextParamName || 'context'] = options.context;
  2578 													settings = $.extend({}, settings, data.amsSelect2QueryOptions);
  2611 													settings = $.extend({}, settings, data.amsSelect2QueryOptions);
  2579 													settings = ams.executeFunctionByName(data.amsSelect2QueryInitCallback, select, settings) || settings;
  2612 													settings = ams.executeFunctionByName(data.amsSelect2QueryInitCallback, select, settings) || settings;
  2580 													ams.ajax.check($.jsonRPC,
  2613 													ams.ajax.check($.jsonRPC,
  2581 																   ams.baseURL + 'ext/jquery-jsonrpc' + (ams.devmode ? '.js' : '.min.js'),
  2614 																   ams.baseURL + 'ext/jquery-jsonrpc' + ams.devext + '.js',
  2582 																   function() {
  2615 																   function() {
  2583 																		$.jsonRPC.withOptions({
  2616 																		$.jsonRPC.withOptions({
  2584 																			endPoint: data.amsSelect2MethodTarget || ams.jsonrpc.getAddr(),
  2617 																			endPoint: data.amsSelect2MethodTarget || ams.jsonrpc.getAddr(),
  2585 																			namespace: data.amsSelect2MethodNamespace,
  2618 																			namespace: data.amsSelect2MethodNamespace,
  2586 																			cache: false
  2619 																			cache: false
  2608 											var settings = $.extend({}, data_options, data.amsSelect2Options);
  2641 											var settings = $.extend({}, data_options, data.amsSelect2Options);
  2609 											settings = ams.executeFunctionByName(data.amsSelect2InitCallback, select, settings) || settings;
  2642 											settings = ams.executeFunctionByName(data.amsSelect2InitCallback, select, settings) || settings;
  2610 											var plugin = select.select2(settings);
  2643 											var plugin = select.select2(settings);
  2611 											ams.executeFunctionByName(data.amsSelect2AfterInitCallback, select, plugin, settings);
  2644 											ams.executeFunctionByName(data.amsSelect2AfterInitCallback, select, plugin, settings);
  2612 											if (select.hasClass('ordered')) {
  2645 											if (select.hasClass('ordered')) {
  2613 												select.addClass('nofloat');
       
  2614 												ams.ajax.check($.fn.select2Sortable,
  2646 												ams.ajax.check($.fn.select2Sortable,
  2615 															   ams.baseURL + 'ext/jquery-select2-sortable' + (ams.devmode ? '.js' : '.min.js'),
  2647 															   ams.baseURL + 'ext/jquery-select2-sortable' + ams.devext + '.js',
  2616 															   function() {
  2648 															   function() {
  2617 																	select.select2Sortable({
  2649 																	select.select2Sortable({
  2618 																		bindOrder: 'sortableStop'
  2650 																		bindOrder: 'sortableStop'
  2619 																	});
  2651 																	});
  2620 															   });
  2652 															   });
  2659 			 */
  2691 			 */
  2660 			datepicker: function(element) {
  2692 			datepicker: function(element) {
  2661 				var datepickers = $('.datepicker', element);
  2693 				var datepickers = $('.datepicker', element);
  2662 				if (datepickers.length > 0) {
  2694 				if (datepickers.length > 0) {
  2663 					ams.ajax.check($.fn.datetimepicker,
  2695 					ams.ajax.check($.fn.datetimepicker,
  2664 								   ams.baseURL + 'ext/jquery-datetimepicker' + (ams.devmode ? '.js': '.min.js'),
  2696 								   ams.baseURL + 'ext/jquery-datetimepicker' + ams.devext + '.js',
  2665 								   function(first_load) {
  2697 								   function(first_load) {
  2666 										if (first_load) {
  2698 										if (first_load) {
  2667 											ams.getCSS(ams.baseURL + '../css/ext/jquery-datetimepicker' + (ams.devmode ? '.css' : '.min.css'), 'jquery-datetimepicker');
  2699 											ams.getCSS(ams.baseURL + '../css/ext/jquery-datetimepicker' + ams.devext + '.css', 'jquery-datetimepicker');
  2668 											ams.dialog.registerHideCallback(ams.helpers.datetimepickerDialogHiddenCallback);
  2700 											ams.dialog.registerHideCallback(ams.helpers.datetimepickerDialogHiddenCallback);
  2669 										}
  2701 										}
  2670 										datepickers.each(function() {
  2702 										datepickers.each(function() {
  2671 											var input = $(this);
  2703 											var input = $(this);
  2672 											var data = input.data();
  2704 											var data = input.data();
  2691 			 */
  2723 			 */
  2692 			datetimepicker: function(element) {
  2724 			datetimepicker: function(element) {
  2693 				var datetimepickers = $('.datetimepicker', element);
  2725 				var datetimepickers = $('.datetimepicker', element);
  2694 				if (datetimepickers.length > 0) {
  2726 				if (datetimepickers.length > 0) {
  2695 					ams.ajax.check($.fn.datetimepicker,
  2727 					ams.ajax.check($.fn.datetimepicker,
  2696 								   ams.baseURL + 'ext/jquery-datetimepicker' + (ams.devmode ? '.js': '.min.js'),
  2728 								   ams.baseURL + 'ext/jquery-datetimepicker' + ams.devext + '.js',
  2697 								   function(first_load) {
  2729 								   function(first_load) {
  2698 										if (first_load) {
  2730 										if (first_load) {
  2699 											ams.getCSS(ams.baseURL + '../css/ext/jquery-datetimepicker' + (ams.devmode ? '.css' : '.min.css'), 'jquery-datetimepicker');
  2731 											ams.getCSS(ams.baseURL + '../css/ext/jquery-datetimepicker' + ams.devext + '.css', 'jquery-datetimepicker');
  2700 											ams.dialog.registerHideCallback(ams.helpers.datetimepickerDialogHiddenCallback);
  2732 											ams.dialog.registerHideCallback(ams.helpers.datetimepickerDialogHiddenCallback);
  2701 										}
  2733 										}
  2702 										datetimepickers.each(function() {
  2734 										datetimepickers.each(function() {
  2703 											var input = $(this);
  2735 											var input = $(this);
  2704 											var data = input.data();
  2736 											var data = input.data();
  2723 			 */
  2755 			 */
  2724 			timepicker: function(element) {
  2756 			timepicker: function(element) {
  2725 				var timepickers = $('.timepicker', element);
  2757 				var timepickers = $('.timepicker', element);
  2726 				if (timepickers.length > 0) {
  2758 				if (timepickers.length > 0) {
  2727 					ams.ajax.check($.fn.datetimepicker,
  2759 					ams.ajax.check($.fn.datetimepicker,
  2728 								   ams.baseURL + 'ext/jquery-datetimepicker' + (ams.devmode ? '.js': '.min.js'),
  2760 								   ams.baseURL + 'ext/jquery-datetimepicker' + ams.devext + '.js',
  2729 								   function(first_load) {
  2761 								   function(first_load) {
  2730 										if (first_load) {
  2762 										if (first_load) {
  2731 											ams.getCSS(ams.baseURL + '../css/ext/jquery-datetimepicker' + (ams.devmode ? '.css' : '.min.css'), 'jquery-datetimepicker');
  2763 											ams.getCSS(ams.baseURL + '../css/ext/jquery-datetimepicker' + ams.devext + '.css', 'jquery-datetimepicker');
  2732 											ams.dialog.registerHideCallback(ams.helpers.datetimepickerDialogHiddenCallback);
  2764 											ams.dialog.registerHideCallback(ams.helpers.datetimepickerDialogHiddenCallback);
  2733 										}
  2765 										}
  2734 										timepickers.each(function() {
  2766 										timepickers.each(function() {
  2735 											var input = $(this);
  2767 											var input = $(this);
  2736 											var data = input.data();
  2768 											var data = input.data();
  2754 			 */
  2786 			 */
  2755 			colorpicker: function(element) {
  2787 			colorpicker: function(element) {
  2756 				var colorpickers = $('.colorpicker', element);
  2788 				var colorpickers = $('.colorpicker', element);
  2757 				if (colorpickers.length > 0) {
  2789 				if (colorpickers.length > 0) {
  2758 					ams.ajax.check($.fn.minicolors,
  2790 					ams.ajax.check($.fn.minicolors,
  2759 								   ams.baseURL + 'ext/jquery-minicolors' + (ams.devmode ? '.js' : '.min.js'),
  2791 								   ams.baseURL + 'ext/jquery-minicolors' + ams.devext + '.js',
  2760 								   function(first_load) {
  2792 								   function(first_load) {
  2761 										if (first_load) {
  2793 										if (first_load) {
  2762 											ams.getCSS(ams.baseURL + '../css/ext/jquery-minicolors' + (ams.devmode ? '.css' : '.min.css'), 'jquery-minicolors');
  2794 											ams.getCSS(ams.baseURL + '../css/ext/jquery-minicolors' + ams.devext + '.css', 'jquery-minicolors');
  2763 										}
  2795 										}
  2764 										colorpickers.each(function() {
  2796 										colorpickers.each(function() {
  2765 											var input = $(this);
  2797 											var input = $(this);
  2766 											var data = input.data();
  2798 											var data = input.data();
  2767 											var data_options = {
  2799 											var data_options = {
  2775 								   });
  2807 								   });
  2776 				}
  2808 				}
  2777 			},
  2809 			},
  2778 
  2810 
  2779 			/**
  2811 			/**
  2780 			 * JQuery typeahead plug-in
       
  2781 			 */
       
  2782 			typeahead: function(element) {
       
  2783 				var typeaheads = $('.typeahead', element);
       
  2784 				if (typeaheads.length > 0) {
       
  2785 					ams.ajax.check($.fn.typeahead,
       
  2786 								   ams.baseURL + 'ext/jquery-typeahead' + (ams.devmode ? '.js' : '.min.js'),
       
  2787 								   function() {
       
  2788 										typeaheads.each(function() {
       
  2789 											var input = $(this);
       
  2790 											var data = input.data();
       
  2791 											var data_options = {};
       
  2792 											var settings = $.extend({}, data_options, data.amsTypeaheadOptions);
       
  2793 											settings = ams.executeFunctionByName(data.amsTypeaheadInitCallback, input, settings) || settings;
       
  2794 											var plugin = input.typeahead(settings);
       
  2795 											ams.executeFunctionByName(data.amsTypeaheadAfterInitCallback, input, plugin, settings);
       
  2796 										});
       
  2797 								   });
       
  2798 				}
       
  2799 			},
       
  2800 
       
  2801 			/**
       
  2802 			 * JQuery validation plug-in
  2812 			 * JQuery validation plug-in
  2803 			 */
  2813 			 */
  2804 			validate: function(element) {
  2814 			validate: function(element) {
  2805 				var forms = $('FORM:not([novalidate])', element);
  2815 				var forms = $('FORM:not([novalidate])', element);
  2806 				if (forms.length > 0) {
  2816 				if (forms.length > 0) {
  2807 					ams.ajax.check($.fn.validate,
  2817 					ams.ajax.check($.fn.validate,
  2808 								   ams.baseURL + 'ext/jquery-validate-1.11.1' + (ams.devmode ? '.js' : '.min.js'),
  2818 								   ams.baseURL + 'ext/jquery-validate-1.11.1' + ams.devext + '.js',
  2809 								   function(first_load) {
  2819 								   function(first_load) {
  2810 										if (first_load) {
  2820 										if (first_load) {
  2811 											$.validator.setDefaults({
  2821 											$.validator.setDefaults({
  2812 												highlight: function(element) {
  2822 												highlight: function(element) {
  2813 													$(element).closest('.form-group, label:not(:parents(.form-group))').addClass('state-error');
  2823 													$(element).closest('.form-group, label:not(:parents(.form-group))').addClass('state-error');
  2847 																		// Otherwise, hidden input fields created by jquery-validate plug-in
  2857 																		// Otherwise, hidden input fields created by jquery-validate plug-in
  2848 																		// and matching named buttons will be deleted (on first form submit)
  2858 																		// and matching named buttons will be deleted (on first form submit)
  2849 																		// before JQuery-form plug-in can get them when submitting the form...
  2859 																		// before JQuery-form plug-in can get them when submitting the form...
  2850 																		$('.state-error', form).removeClass('state-error');
  2860 																		$('.state-error', form).removeClass('state-error');
  2851 																		ams.ajax.check($.fn.ajaxSubmit,
  2861 																		ams.ajax.check($.fn.ajaxSubmit,
  2852 																					   ams.baseURL + 'ext/jquery-form-3.49' + (ams.devmode ? '.js' : '.min.js'));
  2862 																					   ams.baseURL + 'ext/jquery-form-3.49' + ams.devext + '.js');
  2853 																		return ams.form.submit(form);
  2863 																		return ams.form.submit(form);
  2854 																	}
  2864 																	}
  2855 																	: ams.getFunctionByName(data.amsFormSubmitHandler)
  2865 																	: ams.getFunctionByName(data.amsFormSubmitHandler)
  2856 															   : undefined,
  2866 															   : undefined,
  2857 												invalidHandler: form.attr('data-async') !== undefined
  2867 												invalidHandler: form.attr('data-async') !== undefined
  2887 			 */
  2897 			 */
  2888 			datatable: function(element) {
  2898 			datatable: function(element) {
  2889 				var tables = $('.datatable', element);
  2899 				var tables = $('.datatable', element);
  2890 				if (tables.length > 0) {
  2900 				if (tables.length > 0) {
  2891 					ams.ajax.check($.fn.dataTable,
  2901 					ams.ajax.check($.fn.dataTable,
  2892 								   ams.baseURL + 'ext/jquery-dataTables-1.9.4' + (ams.devmode ? '.js' : '.min.js'),
  2902 								   ams.baseURL + 'ext/jquery-dataTables-1.9.4' + ams.devext + '.js',
  2893 								   function(first_load) {
  2903 								   function(first_load) {
  2894 										if (first_load) {
  2904 										if (first_load) {
  2895 											$.fn.dataTableExt.oSort['numeric-comma-asc']  = function(a, b) {
  2905 											$.fn.dataTableExt.oSort['numeric-comma-asc']  = function(a, b) {
  2896 												var x = a.replace(/,/, ".").replace(/ /g, '');
  2906 												var x = a.replace(/,/, ".").replace(/ /g, '');
  2897 												var y = b.replace(/,/, ".").replace(/ /g, '');
  2907 												var y = b.replace(/,/, ".").replace(/ /g, '');
  2907 												return ((x < y) ?  1 : ((x > y) ? -1 : 0));
  2917 												return ((x < y) ?  1 : ((x > y) ? -1 : 0));
  2908 											};
  2918 											};
  2909 										}
  2919 										}
  2910 										$(tables).each(function() {
  2920 										$(tables).each(function() {
  2911 											ams.ajax.check($.fn.dataTableExt.oPagination['bootstrap_full'],
  2921 											ams.ajax.check($.fn.dataTableExt.oPagination['bootstrap_full'],
  2912 														   ams.baseURL + 'myams-dataTables' + (ams.devmode ? '.js' : '.min.js'));
  2922 														   ams.baseURL + 'myams-dataTables' + ams.devext + '.js');
  2913 											var table = $(this);
  2923 											var table = $(this);
  2914 											var data = table.data();
  2924 											var data = table.data();
  2915 											var extensions = (data.amsDatatableExtensions || '').split(/\s+/);
  2925 											var extensions = (data.amsDatatableExtensions || '').split(/\s+/);
  2916 											var sDom = data.amsDatatableSdom ||
  2926 											var sDom = data.amsDatatableSdom ||
  2917 												"W" +
  2927 												"W" +
  2931 												bJQueryUI: false,
  2941 												bJQueryUI: false,
  2932 												bFilter: data.amsDatatableGlobalFilter !== false,
  2942 												bFilter: data.amsDatatableGlobalFilter !== false,
  2933 												bPaginate: data.amsDatatablePagination !== false,
  2943 												bPaginate: data.amsDatatablePagination !== false,
  2934 												bInfo: data.amsDatatableInfo !== false,
  2944 												bInfo: data.amsDatatableInfo !== false,
  2935 												bSort: data.amsDatatableSort !== false,
  2945 												bSort: data.amsDatatableSort !== false,
       
  2946 												aaSorting: data.amsDatatableSorting,
  2936 												bDeferRender: true,
  2947 												bDeferRender: true,
  2937 												bAutoWidth: false,
  2948 												bAutoWidth: false,
  2938 												iDisplayLength: data.amsDatatableDisplayLength || 25,
  2949 												iDisplayLength: data.amsDatatableDisplayLength || 25,
  2939 												sPaginationType: data.amsDatatablePaginationType || 'bootstrap_full',
  2950 												sPaginationType: data.amsDatatablePaginationType || 'bootstrap_full',
  2940 												sDom: sDom,
  2951 												sDom: sDom,
  2949 											if (extensions.length > 0) {
  2960 											if (extensions.length > 0) {
  2950 												for (index in extensions) {
  2961 												for (index in extensions) {
  2951 													switch (extensions[index]) {
  2962 													switch (extensions[index]) {
  2952 														case 'autofill':
  2963 														case 'autofill':
  2953 															ams.ajax.check($.fn.dataTable.AutoFill,
  2964 															ams.ajax.check($.fn.dataTable.AutoFill,
  2954 																		   ams.baseURL + 'ext/jquery-dataTables-autoFill' + (ams.devmode ? '.js' : '.min.js'));
  2965 																		   ams.baseURL + 'ext/jquery-dataTables-autoFill' + ams.devext + '.js');
  2955 															break;
  2966 															break;
  2956 														case 'columnfilter':
  2967 														case 'columnfilter':
  2957 															ams.ajax.check($.fn.columnFilter,
  2968 															ams.ajax.check($.fn.columnFilter,
  2958 																		   ams.baseURL + 'ext/jquery-dataTables-columnFilter' + (ams.devmode ? '.js' : '.min.js'));
  2969 																		   ams.baseURL + 'ext/jquery-dataTables-columnFilter' + ams.devext + '.js');
  2959 															break;
  2970 															break;
  2960 														case 'colreorder':
  2971 														case 'colreorder':
  2961 															ams.ajax.check($.fn.dataTable.ColReorder,
  2972 															ams.ajax.check($.fn.dataTable.ColReorder,
  2962 																		   ams.baseURL + 'ext/jquery-dataTables-colReorder' + (ams.devmode ? '.js' : '.min.js'));
  2973 																		   ams.baseURL + 'ext/jquery-dataTables-colReorder' + ams.devext + '.js');
  2963 															break;
  2974 															break;
  2964 														case 'colreorderwithresize':
  2975 														case 'colreorderwithresize':
  2965 															ams.ajax.check($.fn.dataTable.ColReorder,
  2976 															ams.ajax.check($.fn.dataTable.ColReorder,
  2966 																		   ams.baseURL + 'ext/jquery-dataTables-colReorderWithResize' + (ams.devmode ? '.js' : '.min.js'));
  2977 																		   ams.baseURL + 'ext/jquery-dataTables-colReorderWithResize' + ams.devext + '.js');
  2967 															break;
  2978 															break;
  2968 														case 'colvis':
  2979 														case 'colvis':
  2969 															ams.ajax.check($.fn.dataTable.ColVis,
  2980 															ams.ajax.check($.fn.dataTable.ColVis,
  2970 																		   ams.baseURL + 'ext/jquery-dataTables-colVis' + (ams.devmode ? '.js' : '.min.js'));
  2981 																		   ams.baseURL + 'ext/jquery-dataTables-colVis' + ams.devext + '.js');
  2971 															var cv_default = {
  2982 															var cv_default = {
  2972 																activate: 'click',
  2983 																activate: 'click',
  2973 																sAlign: 'right'
  2984 																sAlign: 'right'
  2974 															};
  2985 															};
  2975 															settings.oColVis = $.extend({}, cv_default, data.amsDatatableColvisOptions);
  2986 															settings.oColVis = $.extend({}, cv_default, data.amsDatatableColvisOptions);
  2976 															break;
  2987 															break;
  2977 														case 'editable':
  2988 														case 'editable':
  2978 															ams.ajax.check($.fn.editable,
  2989 															ams.ajax.check($.fn.editable,
  2979 																		   ams.baseURL + 'ext/jquery-jeditable' + (ams.devmode ? '.js' : '.min.js'));
  2990 																		   ams.baseURL + 'ext/jquery-jeditable' + ams.devext + '.js');
  2980 															ams.ajax.check($.fn.makeEditable,
  2991 															ams.ajax.check($.fn.makeEditable,
  2981 																		   ams.baseURL + 'ext/jquery-dataTables-editable' + (ams.devmode ? '.js' : '.min.js'));
  2992 																		   ams.baseURL + 'ext/jquery-dataTables-editable' + ams.devext + '.js');
  2982 															break;
  2993 															break;
  2983 														case 'fixedcolumns':
  2994 														case 'fixedcolumns':
  2984 															ams.ajax.check($.fn.dataTable.FixedColumns,
  2995 															ams.ajax.check($.fn.dataTable.FixedColumns,
  2985 																		   ams.baseURL + 'ext/jquery-dataTables-fixedColumns' + (ams.devmode ? '.js' : '.min.js'));
  2996 																		   ams.baseURL + 'ext/jquery-dataTables-fixedColumns' + ams.devext + '.js');
  2986 															break;
  2997 															break;
  2987 														case 'fixedheader':
  2998 														case 'fixedheader':
  2988 															ams.ajax.check($.fn.dataTable.FixedHeader,
  2999 															ams.ajax.check($.fn.dataTable.FixedHeader,
  2989 																		   ams.baseURL + 'ext/jquery-dataTables-fixedHeader' + (ams.devmode ? '.js' : '.min.js'));
  3000 																		   ams.baseURL + 'ext/jquery-dataTables-fixedHeader' + ams.devext + '.js');
  2990 															break;
  3001 															break;
  2991 														case 'keytable':
  3002 														case 'keytable':
  2992 															ams.ajax.check(window.KeyTable,
  3003 															ams.ajax.check(window.KeyTable,
  2993 																		   ams.baseURL + 'ext/jquery-dataTables-keyTable' + (ams.devmode ? '.js' : '.min.js'));
  3004 																		   ams.baseURL + 'ext/jquery-dataTables-keyTable' + ams.devext + '.js');
  2994 															break;
  3005 															break;
  2995 														case 'rowgrouping':
  3006 														case 'rowgrouping':
  2996 															ams.ajax.check($.fn.rowGrouping,
  3007 															ams.ajax.check($.fn.rowGrouping,
  2997 																		   ams.baseURL + 'ext/jquery-dataTables-rowGrouping' + (ams.devmode ? '.js' : '.min.js'));
  3008 																		   ams.baseURL + 'ext/jquery-dataTables-rowGrouping' + ams.devext + '.js');
  2998 															break;
  3009 															break;
  2999 														case 'rowreordering':
  3010 														case 'rowreordering':
  3000 															ams.ajax.check($.fn.rowReordering,
  3011 															ams.ajax.check($.fn.rowReordering,
  3001 																		   ams.baseURL + 'ext/jquery-dataTables-rowReordering' + (ams.devmode ? '.js' : '.min.js'));
  3012 																		   ams.baseURL + 'ext/jquery-dataTables-rowReordering' + ams.devext + '.js');
  3002 															break;
  3013 															break;
  3003 														case 'scroller':
  3014 														case 'scroller':
  3004 															ams.ajax.check($.fn.dataTable.Scroller,
  3015 															ams.ajax.check($.fn.dataTable.Scroller,
  3005 																		   ams.baseURL + 'ext/jquery-dataTables-scroller' + (ams.devmode ? '.js' : '.min.js'));
  3016 																		   ams.baseURL + 'ext/jquery-dataTables-scroller' + ams.devext + '.js');
  3006 															break;
  3017 															break;
  3007 														default:
  3018 														default:
  3008 															break;
  3019 															break;
  3009 													}
  3020 													}
  3010 												}
  3021 												}
  3099 			 */
  3110 			 */
  3100 			tablednd: function(element) {
  3111 			tablednd: function(element) {
  3101 				var tables = $('.table-dnd', element);
  3112 				var tables = $('.table-dnd', element);
  3102 				if (tables.length > 0) {
  3113 				if (tables.length > 0) {
  3103 					ams.ajax.check($.fn.tableDnD,
  3114 					ams.ajax.check($.fn.tableDnD,
  3104 								   ams.baseURL + 'ext/jquery-tablednd' + (ams.devmode ? '.js' : '.min.js'),
  3115 								   ams.baseURL + 'ext/jquery-tablednd' + ams.devext + '.js',
  3105 								   function(first_load) {
  3116 								   function(first_load) {
  3106 										tables.each(function() {
  3117 										tables.each(function() {
  3107 											var table = $(this);
  3118 											var table = $(this);
  3108 											$(table).on('mouseover', 'tr', function() {
  3119 											$(table).on('mouseover', 'tr', function() {
  3109 												$(this.cells[0]).addClass('drag-handle');
  3120 												$(this.cells[0]).addClass('drag-handle');
  3128 														});
  3139 														});
  3129 														var local_target = ams.getFunctionByName(target);
  3140 														var local_target = ams.getFunctionByName(target);
  3130 														if (typeof(local_target) == 'function') {
  3141 														if (typeof(local_target) == 'function') {
  3131 															local_target.call(table, dnd_table, rows);
  3142 															local_target.call(table, dnd_table, rows);
  3132 														} else {
  3143 														} else {
  3133 															ams.ajax.post(target, {names: rows});
  3144 															ams.ajax.post(target, {names: JSON.stringify(rows)});
  3134 														}
  3145 														}
  3135 													}
  3146 													}
       
  3147 													return false;
  3136 												}
  3148 												}
  3137 											};
  3149 											};
  3138 											var settings = $.extend({}, data_options, data.amsTabledndOptions);
  3150 											var settings = $.extend({}, data_options, data.amsTabledndOptions);
  3139 											settings = ams.executeFunctionByName(data.amsTabledndInitCallback, table, settings) || settings;
  3151 											settings = ams.executeFunctionByName(data.amsTabledndInitCallback, table, settings) || settings;
  3140 											var plugin = table.tableDnD(settings);
  3152 											var plugin = table.tableDnD(settings);
  3143 								   });
  3155 								   });
  3144 				}
  3156 				}
  3145 			},
  3157 			},
  3146 
  3158 
  3147 			/**
  3159 			/**
       
  3160 			 * TinyMCE plug-in
       
  3161 			 */
       
  3162 			tinymce: function(element) {
       
  3163 
       
  3164 				function cleanEditors() {
       
  3165 					$('.tinymce', $(this)).each(function() {
       
  3166 						var editor = tinymce.get($(this).attr('id'));
       
  3167 						if (editor) {
       
  3168 							editor.remove();
       
  3169 						}
       
  3170 					});
       
  3171 				}
       
  3172 
       
  3173 				var editors = $('.tinymce', element);
       
  3174 				if (editors.length > 0) {
       
  3175 					var baseURL = ams.baseURL + 'ext/tinymce' + (ams.devmode ? '/dev' : '');
       
  3176 					ams.ajax.check(window.tinymce,
       
  3177 								   baseURL + '/tinymce' + ams.devext + '.js',
       
  3178 								   function(first_load) {
       
  3179 										if (first_load) {
       
  3180 											ams.getScript(baseURL + '/jquery.tinymce' + ams.devext + '.js');
       
  3181 											tinymce.baseURL = baseURL;
       
  3182 											tinymce.suffix = ams.devext;
       
  3183 											ams.skin.registerCleanCallback(cleanEditors);
       
  3184 										}
       
  3185 										editors.each(function() {
       
  3186 											var editor = $(this);
       
  3187 											var data = editor.data();
       
  3188 											var data_options = {
       
  3189 												theme: "modern",
       
  3190 												language: ams.lang,
       
  3191 												plugins: [
       
  3192 													"advlist autosave autolink lists link image charmap print preview hr anchor pagebreak",
       
  3193 													"searchreplace wordcount visualblocks visualchars code fullscreen",
       
  3194 													"insertdatetime media nonbreaking save table contextmenu directionality",
       
  3195 													"emoticons paste textcolor colorpicker textpattern"
       
  3196 												],
       
  3197 												toolbar1: "newdocument undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image",
       
  3198 												toolbar2: "print preview media | forecolor backcolor emoticons | code fullscreen",
       
  3199 												content_css: data.amsTinymceContentCss,
       
  3200 												formats: data.amsTinymceFormats,
       
  3201 												style_formats: data.amsTinymceStyleFormats,
       
  3202 												block_formats: data.amsTinymceBlockFormats,
       
  3203 												valid_classes: data.amsTinymceValidClasses,
       
  3204 												image_advtab: true,
       
  3205 												image_list: ams.getFunctionByName(data.amsTinymceImageList) || data.amsTinymceImageList,
       
  3206 												image_class_list: data.amsTinymceImageClassList,
       
  3207 												link_list: ams.getFunctionByName(data.amsTinymceLinkList) || data.amsTinymceLinkList,
       
  3208 												link_class_list: data.amsTinymceLinkClassList,
       
  3209 												resize: true
       
  3210 											};
       
  3211 											if (data.amsTinymceExternalPlugins) {
       
  3212 												var names = data.amsTinymceExternalPlugins.split(/\s+/);
       
  3213 												for (var index in names) {
       
  3214 													var plugin_src = editor.data('ams-tinymce-plugin-' + names[index]);
       
  3215 													tinymce.PluginManager.load(names[index], ams.getSource(plugin_src));
       
  3216 												}
       
  3217 											}
       
  3218 											var settings = $.extend({}, data_options, data.amsTinymceOptions);
       
  3219 											settings = ams.executeFunctionByName(data.amsTinymceInitCallback, editor, settings) || settings;
       
  3220 											var plugin = editor.tinymce(settings);
       
  3221 											ams.executeFunctionByName(data.amsTinymceAfterInitCallback, editor, plugin, settings);
       
  3222 										});
       
  3223 								   });
       
  3224 				}
       
  3225 			},
       
  3226 
       
  3227 			/**
       
  3228 			 * Image area select plug-in
       
  3229 			 */
       
  3230 			imgareaselect: function(element) {
       
  3231 				var images = $('.imgareaselect', element);
       
  3232 				if (images.length > 0) {
       
  3233 					ams.ajax.check($.fn.imgAreaSelect,
       
  3234 								   ams.baseURL + 'ext/jquery-imgareaselect-0.9.10' + ams.devext + '.js',
       
  3235 								   function(first_load) {
       
  3236 									   if (first_load)
       
  3237 										   ams.getCSS(ams.baseURL + '../css/ext/jquery-imgareaselect' + ams.devext + '.css');
       
  3238 									   images.each(function() {
       
  3239 										   var image = $(this);
       
  3240 										   var data = image.data();
       
  3241 										   var parent = data.amsImgareaselectParent ? image.parents(data.amsImgareaselectParent) : 'body';
       
  3242 										   var data_options = {
       
  3243 											   instance: true,
       
  3244 											   handles: true,
       
  3245 											   parent: parent,
       
  3246 											   x1: data.amsImgareaselectX1 || 0,
       
  3247 											   y1: data.amsImgareaselectY1 || 0,
       
  3248 											   x2: data.amsImgareaselectX2 || data.amsImgareaselectImageWidth,
       
  3249 											   y2: data.amsImgareaselectY2 || data.amsImgareaselectImageHeight,
       
  3250 											   imageWidth: data.amsImgareaselectImageWidth,
       
  3251 											   imageHeight: data.amsImgareaselectImageHeight,
       
  3252 											   minWidth: 128,
       
  3253 											   minHeight: 128,
       
  3254 											   aspectRatio: data.amsImgareaselectRatio,
       
  3255 											   onSelectEnd: ams.getFunctionByName(data.amsImgareaselectSelectEnd) || function(img, selection) {
       
  3256 												   var target = data.amsImgareaselectTargetField || 'image_';
       
  3257 												   $('input[name="' + target + 'x1"]', parent).val(selection.x1);
       
  3258 												   $('input[name="' + target + 'y1"]', parent).val(selection.y1);
       
  3259 												   $('input[name="' + target + 'x2"]', parent).val(selection.x2);
       
  3260 												   $('input[name="' + target + 'y2"]', parent).val(selection.y2);
       
  3261 											   }
       
  3262 										   };
       
  3263 										   var settings = $.extend({}, data_options, data.amsImgareaselectOptions);
       
  3264 										   settings = ams.executeFunctionByName(data.amsImgareaselectInitCallback, image, settings) || settings;
       
  3265 										   var plugin = image.imgAreaSelect(settings);
       
  3266 										   ams.executeFunctionByName(data.amsImgareaselectAfterInitCallback, image, plugin, settings);
       
  3267 										   // Add update timeout when plug-in is displayed into a modal dialog
       
  3268 										   setTimeout(function() {
       
  3269 											   plugin.update();
       
  3270 										   }, 250);
       
  3271 									   });
       
  3272 								   })
       
  3273 				}
       
  3274 			},
       
  3275 
       
  3276 			/**
  3148 			 * FancyBox plug-in
  3277 			 * FancyBox plug-in
  3149 			 */
  3278 			 */
  3150 			fancybox: function(element) {
  3279 			fancybox: function(element) {
  3151 				var fancyboxes = $('.fancybox', element);
  3280 				var fancyboxes = $('.fancybox', element);
  3152 				if (fancyboxes.length > 0) {
  3281 				if (fancyboxes.length > 0) {
  3153 					ams.ajax.check($.fn.fancybox,
  3282 					ams.ajax.check($.fn.fancybox,
  3154 								   ams.baseURL + 'ext/jquery-fancybox-2.1.5' + (ams.devmode ? '.js' : '.min.js'),
  3283 								   ams.baseURL + 'ext/jquery-fancybox-2.1.5' + ams.devext + '.js',
  3155 								   function(first_load) {
  3284 								   function(first_load) {
  3156 										if (first_load)
  3285 										if (first_load)
  3157 											ams.getCSS(ams.baseURL + '../css/ext/jquery-fancybox-2.1.5' + (ams.devmode ? '.css' : '.min.css'));
  3286 											ams.getCSS(ams.baseURL + '../css/ext/jquery-fancybox-2.1.5' + ams.devext + '.css');
  3158 										fancyboxes.each(function() {
  3287 										fancyboxes.each(function() {
  3159 											var fancybox = $(this);
  3288 											var fancybox = $(this);
  3160 											var data = fancybox.data();
  3289 											var data = fancybox.data();
  3161 											var helpers = (data.amsFancyboxHelpers || '').split(/\s+/);
  3290 											var helpers = (data.amsFancyboxHelpers || '').split(/\s+/);
  3162 											if (helpers.length > 0) {
  3291 											if (helpers.length > 0) {
  3163 												for (var index in helpers) {
  3292 												for (var index in helpers) {
  3164 													var helper = helpers[index];
  3293 													var helper = helpers[index];
  3165 													switch (helper) {
  3294 													switch (helper) {
  3166 														case 'buttons':
  3295 														case 'buttons':
  3167 															ams.ajax.check($.fancybox.helpers.buttons,
  3296 															ams.ajax.check($.fancybox.helpers.buttons,
  3168 																		   ams.baseURL + 'ext/fancybox-helpers/fancybox-buttons.js' + (ams.devmode ? '.js' : '.min.js'));
  3297 																		   ams.baseURL + 'ext/fancybox-helpers/fancybox-buttons' + ams.devext + '.js');
  3169 															break;
  3298 															break;
  3170 														case 'thumbs':
  3299 														case 'thumbs':
  3171 															ams.ajax.check($.fancybox.helpers.thumbs,
  3300 															ams.ajax.check($.fancybox.helpers.thumbs,
  3172 																		   ams.baseURL + 'ext/fancybox-helpers/fancybox-thumbs.js' + (ams.devmode ? '.js' : '.min.js'));
  3301 																		   ams.baseURL + 'ext/fancybox-helpers/fancybox-thumbs' + ams.devext + '.js');
  3173 															break;
  3302 															break;
  3174 														case 'media':
  3303 														case 'media':
  3175 															ams.ajax.check($.fancybox.helpers.media,
  3304 															ams.ajax.check($.fancybox.helpers.media,
  3176 																		   ams.baseURL + 'ext/fancybox-helpers/fancybox-media.js' + (ams.devmode ? '.js' : '.min.js'));
  3305 																		   ams.baseURL + 'ext/fancybox-helpers/fancybox-media' + ams.devext + '.js');
  3177 															break;
  3306 															break;
  3178 														default:
  3307 														default:
  3179 															break;
  3308 															break;
  3180 													}
  3309 													}
  3181 												}
  3310 												}
  3201 								   });
  3330 								   });
  3202 				}
  3331 				}
  3203 			},
  3332 			},
  3204 
  3333 
  3205 			/**
  3334 			/**
  3206 			 * Image area select plug-in
       
  3207 			 */
       
  3208 			imgareaselect: function(element) {
       
  3209 				var images = $('.imgareaselect', element);
       
  3210 				if (images.length > 0) {
       
  3211 					ams.ajax.check($.fn.imgAreaSelect,
       
  3212 								   ams.baseURL + 'ext/jquery-imgareaselect-0.9.10' + (ams.devmode ? '.js' : '.min.js'),
       
  3213 								   function(first_load) {
       
  3214 										if (first_load)
       
  3215 											ams.getCSS(ams.baseURL + '../css/ext/jquery-imgareaselect' + (ams.devmode ? '.css' : '.min.css'));
       
  3216 										images.each(function() {
       
  3217 											var image = $(this);
       
  3218 											var data = image.data();
       
  3219 											var parent = data.amsImgareaselectParent ? image.parents(data.amsImgareaselectParent) : 'body';
       
  3220 											var data_options = {
       
  3221 												instance: true,
       
  3222 												handles: true,
       
  3223 												parent: parent,
       
  3224 												x1: data.amsImgareaselectX1 || 0,
       
  3225 												y1: data.amsImgareaselectY1 || 0,
       
  3226 												x2: data.amsImgareaselectX2 || data.amsImgareaselectImageWidth,
       
  3227 												y2: data.amsImgareaselectY2 || data.amsImgareaselectImageHeight,
       
  3228 												imageWidth: data.amsImgareaselectImageWidth,
       
  3229 												imageHeight: data.amsImgareaselectImageHeight,
       
  3230 												minWidth: 128,
       
  3231 												minHeight: 128,
       
  3232 												aspectRatio: data.amsImgareaselectRatio,
       
  3233 												onSelectEnd: ams.getFunctionByName(data.amsImgareaselectSelectEnd) || function(img, selection) {
       
  3234 													var target = data.amsImgareaselectTargetField || 'image_';
       
  3235 													$('input[name="' + target + 'x1"]', parent).val(selection.x1);
       
  3236 													$('input[name="' + target + 'y1"]', parent).val(selection.y1);
       
  3237 													$('input[name="' + target + 'x2"]', parent).val(selection.x2);
       
  3238 													$('input[name="' + target + 'y2"]', parent).val(selection.y2);
       
  3239 												}
       
  3240 											};
       
  3241 											var settings = $.extend({}, data_options, data.amsImgareaselectOptions);
       
  3242 											settings = ams.executeFunctionByName(data.amsImgareaselectInitCallback, image, settings) || settings;
       
  3243 											var plugin = image.imgAreaSelect(settings);
       
  3244 											ams.executeFunctionByName(data.amsImgareaselectAfterInitCallback, image, plugin, settings);
       
  3245 											// Add update timeout when plug-in is displayed into a modal dialog
       
  3246 											setTimeout(function() {
       
  3247 												plugin.update();
       
  3248 											}, 250);
       
  3249 										});
       
  3250 								   })
       
  3251 				}
       
  3252 			},
       
  3253 
       
  3254 			/**
       
  3255 			 * Sparkline graphs
  3335 			 * Sparkline graphs
  3256 			 */
  3336 			 */
  3257 			graphs: function(element) {
  3337 			graphs: function(element) {
  3258 				var graphs = $('.sparkline', element);
  3338 				var graphs = $('.sparkline', element);
  3259 				if (graphs.length > 0) {
  3339 				if (graphs.length > 0) {
  3260 					ams.ajax.check(ams.graphs,
  3340 					ams.ajax.check(ams.graphs,
  3261 								   ams.baseURL + 'myams-graphs' + (ams.devmode ? '.js' : '.min.js'),
  3341 								   ams.baseURL + 'myams-graphs' + ams.devext + '.js',
  3262 								   function() {
  3342 								   function() {
  3263 										ams.graphs.init(graphs);
  3343 										ams.graphs.init(graphs);
  3264 								   });
  3344 								   });
  3265 				}
  3345 				}
  3266 			},
  3346 			},
  3273 				if (scrollbars.length > 0) {
  3353 				if (scrollbars.length > 0) {
  3274 					ams.ajax.check($.event.special.mousewheel,
  3354 					ams.ajax.check($.event.special.mousewheel,
  3275 								   ams.baseURL + 'ext/jquery-mousewheel.min.js',
  3355 								   ams.baseURL + 'ext/jquery-mousewheel.min.js',
  3276 								   function() {
  3356 								   function() {
  3277 										ams.ajax.check($.fn.mCustomScrollbar,
  3357 										ams.ajax.check($.fn.mCustomScrollbar,
  3278 													   ams.baseURL + 'ext/jquery-mCustomScrollbar' + (ams.devmode ? '.js' : '.min.js'),
  3358 													   ams.baseURL + 'ext/jquery-mCustomScrollbar' + ams.devext + '.js',
  3279 													   function(first_load) {
  3359 													   function(first_load) {
  3280 															if (first_load)
  3360 															if (first_load)
  3281 																ams.getCSS(ams.baseURL + '../css/ext/jquery-mCustomScrollbar.css',
  3361 																ams.getCSS(ams.baseURL + '../css/ext/jquery-mCustomScrollbar.css',
  3282 																		  'jquery-mCustomScrollbar');
  3362 																		  'jquery-mCustomScrollbar');
  3283 															scrollbars.each(function() {
  3363 															scrollbars.each(function() {
  3566 		_initDesktopWidgets: function(element) {
  3646 		_initDesktopWidgets: function(element) {
  3567 			if (ams.enable_widgets) {
  3647 			if (ams.enable_widgets) {
  3568 				var widgets = $('.ams-widget', element);
  3648 				var widgets = $('.ams-widget', element);
  3569 				if (widgets.length > 0)
  3649 				if (widgets.length > 0)
  3570 					ams.ajax.check($.fn.MyAMSWidget,
  3650 					ams.ajax.check($.fn.MyAMSWidget,
  3571 								   ams.baseURL + 'myams-widgets' + (ams.devmode ? '.js' : '.min.js'),
  3651 								   ams.baseURL + 'myams-widgets' + ams.devext + '.js',
  3572 								   function() {
  3652 								   function() {
  3573 										widgets.each(function() {
  3653 										widgets.each(function() {
  3574 											var widget = $(this);
  3654 											var widget = $(this);
  3575 											var data = widget.data();
  3655 											var data = widget.data();
  3576 											var data_options = {
  3656 											var data_options = {
  3636 		/**
  3716 		/**
  3637 		 * Big message box
  3717 		 * Big message box
  3638 		 */
  3718 		 */
  3639 		bigBox: function(options, callback) {
  3719 		bigBox: function(options, callback) {
  3640 			ams.ajax.check(ams.notify,
  3720 			ams.ajax.check(ams.notify,
  3641 						   ams.baseURL + 'myams-notify' + (ams.devmode ? '.js' : '.min.js'),
  3721 						   ams.baseURL + 'myams-notify' + ams.devext + '.js',
  3642 						   function() {
  3722 						   function() {
  3643 								ams.notify.messageBox(options, callback);
  3723 								ams.notify.messageBox(options, callback);
  3644 						   });
  3724 						   });
  3645 		},
  3725 		},
  3646 
  3726 
  3652 				callback = options;
  3732 				callback = options;
  3653 				options = status || {};
  3733 				options = status || {};
  3654 				status = 'info';
  3734 				status = 'info';
  3655 			}
  3735 			}
  3656 			ams.ajax.check(ams.notify,
  3736 			ams.ajax.check(ams.notify,
  3657 						   ams.baseURL + 'myams-notify' + (ams.devmode ? '.js' : '.min.js'),
  3737 						   ams.baseURL + 'myams-notify' + ams.devext + '.js',
  3658 						   function() {
  3738 						   function() {
  3659 								switch (status) {
  3739 								switch (status) {
  3660 									case 'error':
  3740 									case 'error':
  3661 									case 'danger':
  3741 									case 'danger':
  3662 										options.color = '#C46A69';
  3742 										options.color = '#C46A69';
  3683 				callback = options;
  3763 				callback = options;
  3684 				options = status || {};
  3764 				options = status || {};
  3685 				status = 'info';
  3765 				status = 'info';
  3686 			}
  3766 			}
  3687 			ams.ajax.check(ams.notify,
  3767 			ams.ajax.check(ams.notify,
  3688 						   ams.baseURL + 'myams-notify' + (ams.devmode ? '.js' : '.min.js'),
  3768 						   ams.baseURL + 'myams-notify' + ams.devext + '.js',
  3689 						   function() {
  3769 						   function() {
  3690 								switch (status) {
  3770 								switch (status) {
  3691 									case 'error':
  3771 									case 'error':
  3692 									case 'danger':
  3772 									case 'danger':
  3693 										options.color = '#C46A69';
  3773 										options.color = '#C46A69';
  3775 				}
  3855 				}
  3776 			}
  3856 			}
  3777 		},
  3857 		},
  3778 
  3858 
  3779 		/**
  3859 		/**
       
  3860 		 * List of registered 'cleaning' callbacks
       
  3861 		 * These callbacks are called before loading a new URL into a given container
       
  3862 		 * to clean required elements from memory before the DOM elements are removed
       
  3863 		 */
       
  3864 		_clean_callbacks: [],
       
  3865 
       
  3866 		/**
       
  3867 		 * Register a callback which should be called before a container is replaced
       
  3868 		 */
       
  3869 		registerCleanCallback: function(callback) {
       
  3870 			var callbacks = ams.skin._clean_callbacks;
       
  3871 			if (callbacks.indexOf(callback) < 0)
       
  3872 				callbacks.push(callback);
       
  3873 		},
       
  3874 
       
  3875 		/**
       
  3876 		 * Call registered cleaning callbacks on given container
       
  3877 		 */
       
  3878 		cleanContainer: function(container) {
       
  3879 			var callbacks = ams.skin._clean_callbacks;
       
  3880 			for (var index in callbacks) {
       
  3881 				callbacks[index].call(container);
       
  3882 			}
       
  3883 		},
       
  3884 
       
  3885 		/**
  3780 		 * Load given URL into container
  3886 		 * Load given URL into container
  3781 		 */
  3887 		 */
  3782 		loadURL: function(url, container, options, callback) {
  3888 		loadURL: function(url, container, options, callback) {
  3783 			if (url.startsWith('#')) {
  3889 			if (url.startsWith('#')) {
  3784 				url = url.substr(1);
  3890 				url = url.substr(1);
  3792 				type: 'GET',
  3898 				type: 'GET',
  3793 				url: url,
  3899 				url: url,
  3794 				dataType: 'html',
  3900 				dataType: 'html',
  3795 				cache: false,
  3901 				cache: false,
  3796 				beforeSend: function() {
  3902 				beforeSend: function() {
  3797 					container.html('<h1><i class="fa fa-cog fa-spin"></i> Loading... </h1>');
  3903 					ams.skin.cleanContainer(container);
       
  3904 					container.html('<h1 class="loading"><i class="fa fa-cog fa-spin"></i> Loading... </h1>');
  3798 					if (container[0] == $('#content')[0]) {
  3905 					if (container[0] == $('#content')[0]) {
  3799 						ams.skin._drawBreadCrumb();
  3906 						ams.skin._drawBreadCrumb();
  3800 						document.title = $('.breadcrumb LI:last-child').text();
  3907 						document.title = $('.breadcrumb LI:last-child').text();
  3801 						$('html, body').animate({scrollTop: 0}, 'fast');
  3908 						$('html, body').animate({scrollTop: 0}, 'fast');
  3802 					} else {
  3909 					} else {
  3808 						ams.executeFunctionByName(callback, this, data, status, request, options);
  3915 						ams.executeFunctionByName(callback, this, data, status, request, options);
  3809 					else {
  3916 					else {
  3810 						var request_data = ams.ajax.getResponse(request);
  3917 						var request_data = ams.ajax.getResponse(request);
  3811 						var data_type = request_data.content_type;
  3918 						var data_type = request_data.content_type;
  3812 						var result = request_data.data;
  3919 						var result = request_data.data;
       
  3920 						$('.loading', container).remove();
  3813 						switch (data_type) {
  3921 						switch (data_type) {
  3814 							case 'json':
  3922 							case 'json':
  3815 								ams.ajax.handleJSON(result, container);
  3923 								ams.ajax.handleJSON(result, container);
  3816 								break;
  3924 								break;
  3817 							case 'script':
  3925 							case 'script':
  3918 		} else {
  4026 		} else {
  3919 			ams.root.addClass('mobile-detected');
  4027 			ams.root.addClass('mobile-detected');
  3920 			ams.device = 'mobile';
  4028 			ams.device = 'mobile';
  3921 			if (ams.enable_fastclick) {
  4029 			if (ams.enable_fastclick) {
  3922 				ams.ajax.check($.fn.noClickDelay,
  4030 				ams.ajax.check($.fn.noClickDelay,
  3923 							   ams.baseURL + '/ext/jquery-smartclick' + (ams.devmode ? '.js' : '.min.js'),
  4031 							   ams.baseURL + '/ext/jquery-smartclick' + ams.devext + '.js',
  3924 							   function() {
  4032 							   function() {
  3925 								   $('NAV UL A').noClickDelay();
  4033 								   $('NAV UL A').noClickDelay();
  3926 								   $('#hide-menu A').noClickDelay();
  4034 								   $('#hide-menu A').noClickDelay();
  3927 							   });
  4035 							   });
  3928 			}
  4036 			}
  4048 				element.popover('hide');
  4156 				element.popover('hide');
  4049 		});
  4157 		});
  4050 
  4158 
  4051 		// Resize events
  4159 		// Resize events
  4052 		ams.ajax.check($.resize,
  4160 		ams.ajax.check($.resize,
  4053 					   ams.baseURL + 'ext/jquery-resize' + (ams.devmode ? '.js' : '.min.js'),
  4161 					   ams.baseURL + 'ext/jquery-resize' + ams.devext + '.js',
  4054 					   function() {
  4162 					   function() {
  4055 						   $('#main').resize(function() {
  4163 						   $('#main').resize(function() {
  4056 							   ams.skin._setPageHeight();
  4164 							   ams.skin._setPageHeight();
  4057 							   ams.skin._checkMobileWidth();
  4165 							   ams.skin._checkMobileWidth();
  4058 						   });
  4166 						   });
  4061 						   });
  4169 						   });
  4062 					   });
  4170 					   });
  4063 
  4171 
  4064 		// Init AJAX navigation
  4172 		// Init AJAX navigation
  4065 		if (ams.ajax_nav) {
  4173 		if (ams.ajax_nav) {
  4066 			if ($('nav').length > 0)
       
  4067 				ams.skin.checkURL();
       
  4068 			$(document).on('click', 'a[href="#"]', function(e) {
  4174 			$(document).on('click', 'a[href="#"]', function(e) {
  4069 				e.preventDefault();
  4175 				e.preventDefault();
  4070 			});
  4176 			});
  4071 			$(document).on('click', 'a[href!="#"]:not([data-toggle]), [data-ams-url]:not([data-toggle])', function(e) {
  4177 			$(document).on('click', 'a[href!="#"]:not([data-toggle]), [data-ams-url]:not([data-toggle])', function(e) {
  4072 				var link = $(e.currentTarget);
  4178 				var link = $(e.currentTarget);
  4194 			if (button.exists() && button.parent().hasClass('input-file')) {
  4300 			if (button.exists() && button.parent().hasClass('input-file')) {
  4195 				button.next('input[type="text"]').val(input.val());
  4301 				button.next('input[type="text"]').val(input.val());
  4196 			}
  4302 			}
  4197 		});
  4303 		});
  4198 
  4304 
       
  4305 		// Prevent bootstrap dialog from blocking TinyMCE focus
       
  4306 		$(document).on('focusin', function(e) {
       
  4307 			if ($(e.target).closest('.mce-window').length) {
       
  4308 				e.stopImmediatePropagation();
       
  4309 			}
       
  4310 		});
       
  4311 
  4199 		// Disable clicks on disabled tabs
  4312 		// Disable clicks on disabled tabs
  4200 		$("a[data-toggle=tab]", ".nav-tabs").on("click", function(e) {
  4313 		$("a[data-toggle=tab]", ".nav-tabs").on("click", function(e) {
  4201 			if ($(this).parent('li').hasClass("disabled")) {
  4314 			if ($(this).parent('li').hasClass("disabled")) {
  4202 				e.preventDefault();
  4315 				e.preventDefault();
  4203 				return false;
  4316 				return false;
  4215 				if (data.amsTabLoadOnce)
  4328 				if (data.amsTabLoadOnce)
  4216 					link.data('ams-tab-loaded', true);
  4329 					link.data('ams-tab-loaded', true);
  4217 			}
  4330 			}
  4218 		});
  4331 		});
  4219 
  4332 
  4220 		// Init plug-ins required by main layout
  4333 		// Init page content
  4221 		ams.plugins.enabled.hint(document);
  4334 		ams.initContent(document);
  4222 
  4335 		if (ams.ajax_nav && ($('nav').length > 0))
  4223 		// Init content when not loaded by AJAX request
  4336 			ams.skin.checkURL();
  4224 		// or when redirecting to authentication page...
       
  4225 		if ((window.location.hash == '') || (ams.getQueryVar(window.location.href, 'came_from') != false))
       
  4226 			ams.initContent(document);
       
  4227 
  4337 
  4228 		// Add unload event listener to check for modified forms
  4338 		// Add unload event listener to check for modified forms
  4229 		$(window).on('beforeunload', ams.form.checkBeforeUnload);
  4339 		$(window).on('beforeunload', ams.form.checkBeforeUnload);
  4230 
  4340 
  4231 	};
  4341 	};