src/ztfy/myams/resources/js/myams.js
changeset 213 48092a18c2c0
parent 210 a4497eed4ff7
child 216 c390a4b8ca80
--- a/src/ztfy/myams/resources/js/myams.js	Mon Jun 04 12:33:03 2018 +0200
+++ b/src/ztfy/myams/resources/js/myams.js	Fri Jun 29 15:09:46 2018 +0200
@@ -37,6 +37,16 @@
 		return (this.substr(slen-dlen) === str);
 	};
 
+	String.prototype.unserialize = function(str) {
+		var str = decodeURIComponent(this);
+		var chunks = str.split('&'),
+			obj = {};
+		for (var c = 0; c < chunks.length; c++) {
+			var split = chunks[c].split('=', 2);
+			obj[split[0]] = split[1];
+		}
+		return obj;
+	};
 
 	/**
 	 * Array prototype extensions
@@ -822,7 +832,7 @@
 			if (response.contentType === 'json') {
 				ams.ajax.handleJSON(response.data);
 			} else {
-				var title = event.statusText || event.type;
+				var title = error || event.statusText || event.type;
 				var message = response.responseText;
 				ams.skin.messageBox('error', {
 					title: ams.i18n.ERROR_OCCURED,
@@ -970,6 +980,19 @@
 		},
 
 		/**
+		 * Post data to given URL and handle result as JSON
+		 */
+		getJSON: function() {
+			return function(options) {
+				var url = options.url;
+				delete options.url;
+				ams.ajax.post(url, options, function(result, status, request) {
+					ams.ajax.handleJSON(result);
+				});
+			}
+		},
+
+		/**
 		 * Post data to given URL
 		 */
 		post: function(url, data, options, callback) {
@@ -2624,7 +2647,10 @@
 							} else {
 								target.empty();
 							}
-						});
+						})
+					.fail(function() {
+						target.empty();
+					});
 					break;
 				case 'json-rpc':
 					target.html('<div class="text-center"><i class="fa fa-2x fa-gear fa-spin"></i></div>');
@@ -2702,6 +2728,15 @@
 			$('.datepicker, .timepicker, .datetimepicker', this).datetimepicker('destroy');
 		},
 
+		/** Clear search form target when query is empty */
+		clearSearchTarget: function() {
+			var input = $(this);
+			if (!input.val()) {
+				var form = $(input).parents('form').first();
+				$(form.data('ams-form-submit-target')).empty();
+			}
+		},
+
 		/** Set SEO status */
 		setSEOStatus: function() {
 			var input = $(this);
@@ -3001,6 +3036,22 @@
 		enabled: {
 
 			/**
+			 * SVG containers
+			 */
+			svg: function(element) {
+				var svgs = $('.svg-container', element);
+				if (svgs.length > 0) {
+					svgs.each(function() {
+						var container = $(this);
+						var svg = $('svg', container);
+						svg.get(0).setAttribute('viewBox', '0 0 ' + Math.round(svg.attr('width')) + ' ' + Math.round(svg.attr('height')));
+						svg.attr('width', '100%')
+						   .attr('height', 'auto');
+					})
+				}
+			},
+
+			/**
 			 * Label hints
 			 */
 			hint: function(element) {
@@ -5259,6 +5310,33 @@
 			}
 		},
 
+		switchCellContent: function(element) {
+			var source = $(this);
+			var switcher = $('i.switch', source);
+			var td = source.parents('td');
+			var innerdiv = $(source.data('ams-switch-target') || '.inner-table-form', td);
+			var datatype = source.parents('tr');
+			if (switcher.hasClass('fa-plus-square-o')) {
+				var container = datatype.parents('table');
+				innerdiv.html('<h1 class="loading"><i class="fa fa-gear fa-spin"></i></h1>');
+				MyAMS.ajax.post(container.data('ams-location') + '/' + source.data('ams-switch-handler'),
+								{object_name: datatype.data('ams-element-name')},
+								function(result) {
+									innerdiv.html(result);
+									if (result) {
+										MyAMS.initContent(innerdiv);
+										switcher.removeClass('fa-plus-square-o')
+												.addClass('fa-minus-square-o');
+									}
+								});
+			} else {
+				MyAMS.skin.cleanContainer(innerdiv);
+				innerdiv.empty();
+				switcher.removeClass('fa-minus-square-o')
+						.addClass('fa-plus-square-o');
+			}
+		},
+
 		/**
 		 * Initialize desktop and mobile widgets
 		 */
@@ -5921,13 +5999,25 @@
 				}
 				e.preventDefault();
 				e.stopPropagation();
-				var hrefGetter = ams.getFunctionByName(href);
+
+				var url,
+					target,
+					params;
+				if (href.indexOf('?') >= 0) {
+					url = href.split('?');
+					target = url[0];
+					params = url[1].unserialize();
+				} else {
+					target = href;
+					params = undefined;
+				}
+				var hrefGetter = ams.getFunctionByName(target);
 				if (typeof(hrefGetter) === 'function') {
-					href = hrefGetter.call(link);
+					href = hrefGetter.call(link, params);
 				}
 				if (typeof(href) === 'function') {
 					// Javascript function call
-					href.call(link);
+					href.call(link, params);
 				} else {
 					// Standard AJAX or browser URL call
 					// Convert %23 chars to #
@@ -6027,9 +6117,12 @@
 				if (data.amsClickKeepDefault !== true) {
 					event.preventDefault();
 				}
-				var callback = ams.getFunctionByName(data.amsClickHandler);
-				if (callback !== undefined) {
-					callback.call(source, event, data.amsClickHandlerOptions);
+				var clickHandlers = data.amsClickHandler.split(/\s+/);
+				for (var index=0; index < clickHandlers.length; index++) {
+					var callback = ams.getFunctionByName(clickHandlers[index]);
+					if (callback !== undefined) {
+						callback.call(source, event, data.amsClickHandlerOptions);
+					}
 				}
 			}
 		});
@@ -6054,9 +6147,12 @@
 				if (data.amsChangeKeepDefault !== true) {
 					event.preventDefault();
 				}
-				var callback = ams.getFunctionByName(data.amsChangeHandler);
-				if (callback !== undefined) {
-					callback.call(source, event, data.amsChangeHandlerOptions);
+				var changeHandlers = data.amsChangeHandler.split(/\s+/);
+				for (var index=0; index < changeHandlers.length; index++) {
+					var callback = ams.getFunctionByName(changeHandlers[index]);
+					if (callback !== undefined) {
+						callback.call(source, event, data.amsChangeHandlerOptions);
+					}
 				}
 			}
 		});
@@ -6169,7 +6265,7 @@
 				link = $('a[href]', link);
 			}
 			var data = link.data();
-			if (data.amsUrl) {
+			if (data && data.amsUrl) {
 				if (data.amsTabLoaded) {
 					return;
 				}