src/ztfy/myams/resources/js/myams.js
changeset 213 48092a18c2c0
parent 210 a4497eed4ff7
child 216 c390a4b8ca80
equal deleted inserted replaced
212:e293b7ceaadd 213:48092a18c2c0
    35 			return false;
    35 			return false;
    36 		}
    36 		}
    37 		return (this.substr(slen-dlen) === str);
    37 		return (this.substr(slen-dlen) === str);
    38 	};
    38 	};
    39 
    39 
       
    40 	String.prototype.unserialize = function(str) {
       
    41 		var str = decodeURIComponent(this);
       
    42 		var chunks = str.split('&'),
       
    43 			obj = {};
       
    44 		for (var c = 0; c < chunks.length; c++) {
       
    45 			var split = chunks[c].split('=', 2);
       
    46 			obj[split[0]] = split[1];
       
    47 		}
       
    48 		return obj;
       
    49 	};
    40 
    50 
    41 	/**
    51 	/**
    42 	 * Array prototype extensions
    52 	 * Array prototype extensions
    43 	 */
    53 	 */
    44 	if (!Array.prototype.indexOf) {
    54 	if (!Array.prototype.indexOf) {
   820 			}
   830 			}
   821 			response = ams.ajax.getResponse(response);
   831 			response = ams.ajax.getResponse(response);
   822 			if (response.contentType === 'json') {
   832 			if (response.contentType === 'json') {
   823 				ams.ajax.handleJSON(response.data);
   833 				ams.ajax.handleJSON(response.data);
   824 			} else {
   834 			} else {
   825 				var title = event.statusText || event.type;
   835 				var title = error || event.statusText || event.type;
   826 				var message = response.responseText;
   836 				var message = response.responseText;
   827 				ams.skin.messageBox('error', {
   837 				ams.skin.messageBox('error', {
   828 					title: ams.i18n.ERROR_OCCURED,
   838 					title: ams.i18n.ERROR_OCCURED,
   829 					content: '<h4>' + title + '</h4><p>' + (message || '') + '</p>',
   839 					content: '<h4>' + title + '</h4><p>' + (message || '') + '</p>',
   830 					icon: 'fa fa-warning animated shake',
   840 					icon: 'fa fa-warning animated shake',
   964 			if (event.loaded >= event.total) {
   974 			if (event.loaded >= event.total) {
   965 				return;
   975 				return;
   966 			}
   976 			}
   967 			if (console) {
   977 			if (console) {
   968 				console.log && console.log(parseInt((event.loaded / event.total * 100), 10) + "%");
   978 				console.log && console.log(parseInt((event.loaded / event.total * 100), 10) + "%");
       
   979 			}
       
   980 		},
       
   981 
       
   982 		/**
       
   983 		 * Post data to given URL and handle result as JSON
       
   984 		 */
       
   985 		getJSON: function() {
       
   986 			return function(options) {
       
   987 				var url = options.url;
       
   988 				delete options.url;
       
   989 				ams.ajax.post(url, options, function(result, status, request) {
       
   990 					ams.ajax.handleJSON(result);
       
   991 				});
   969 			}
   992 			}
   970 		},
   993 		},
   971 
   994 
   972 		/**
   995 		/**
   973 		 * Post data to given URL
   996 		 * Post data to given URL
  2622 								target.html(result);
  2645 								target.html(result);
  2623 								ams.initContent(target);
  2646 								ams.initContent(target);
  2624 							} else {
  2647 							} else {
  2625 								target.empty();
  2648 								target.empty();
  2626 							}
  2649 							}
  2627 						});
  2650 						})
       
  2651 					.fail(function() {
       
  2652 						target.empty();
       
  2653 					});
  2628 					break;
  2654 					break;
  2629 				case 'json-rpc':
  2655 				case 'json-rpc':
  2630 					target.html('<div class="text-center"><i class="fa fa-2x fa-gear fa-spin"></i></div>');
  2656 					target.html('<div class="text-center"><i class="fa fa-2x fa-gear fa-spin"></i></div>');
  2631 					ams.jsonrpc.post(data.amsSelect2HelperMethod,
  2657 					ams.jsonrpc.post(data.amsSelect2HelperMethod,
  2632 									 {value: source.val()},
  2658 									 {value: source.val()},
  2700 		/** Datetimepicker dialog cleaner callback */
  2726 		/** Datetimepicker dialog cleaner callback */
  2701 		datetimepickerDialogHiddenCallback: function() {
  2727 		datetimepickerDialogHiddenCallback: function() {
  2702 			$('.datepicker, .timepicker, .datetimepicker', this).datetimepicker('destroy');
  2728 			$('.datepicker, .timepicker, .datetimepicker', this).datetimepicker('destroy');
  2703 		},
  2729 		},
  2704 
  2730 
       
  2731 		/** Clear search form target when query is empty */
       
  2732 		clearSearchTarget: function() {
       
  2733 			var input = $(this);
       
  2734 			if (!input.val()) {
       
  2735 				var form = $(input).parents('form').first();
       
  2736 				$(form.data('ams-form-submit-target')).empty();
       
  2737 			}
       
  2738 		},
       
  2739 
  2705 		/** Set SEO status */
  2740 		/** Set SEO status */
  2706 		setSEOStatus: function() {
  2741 		setSEOStatus: function() {
  2707 			var input = $(this);
  2742 			var input = $(this);
  2708 			var progress = input.siblings('.progress').children('.progress-bar');
  2743 			var progress = input.siblings('.progress').children('.progress-bar');
  2709 			var length = Math.min(input.val().length, 100);
  2744 			var length = Math.min(input.val().length, 100);
  2997 		 * Another callback can also be provided to be called after plug-in initialization.
  3032 		 * Another callback can also be provided to be called after plug-in initialization.
  2998 		 *
  3033 		 *
  2999 		 * You can also register plug-ins using the 'register' function
  3034 		 * You can also register plug-ins using the 'register' function
  3000 		 */
  3035 		 */
  3001 		enabled: {
  3036 		enabled: {
       
  3037 
       
  3038 			/**
       
  3039 			 * SVG containers
       
  3040 			 */
       
  3041 			svg: function(element) {
       
  3042 				var svgs = $('.svg-container', element);
       
  3043 				if (svgs.length > 0) {
       
  3044 					svgs.each(function() {
       
  3045 						var container = $(this);
       
  3046 						var svg = $('svg', container);
       
  3047 						svg.get(0).setAttribute('viewBox', '0 0 ' + Math.round(svg.attr('width')) + ' ' + Math.round(svg.attr('height')));
       
  3048 						svg.attr('width', '100%')
       
  3049 						   .attr('height', 'auto');
       
  3050 					})
       
  3051 				}
       
  3052 			},
  3002 
  3053 
  3003 			/**
  3054 			/**
  3004 			 * Label hints
  3055 			 * Label hints
  3005 			 */
  3056 			 */
  3006 			hint: function(element) {
  3057 			hint: function(element) {
  5257 				cell.html(changes.cell);
  5308 				cell.html(changes.cell);
  5258 				MyAMS.initContent(cell);
  5309 				MyAMS.initContent(cell);
  5259 			}
  5310 			}
  5260 		},
  5311 		},
  5261 
  5312 
       
  5313 		switchCellContent: function(element) {
       
  5314 			var source = $(this);
       
  5315 			var switcher = $('i.switch', source);
       
  5316 			var td = source.parents('td');
       
  5317 			var innerdiv = $(source.data('ams-switch-target') || '.inner-table-form', td);
       
  5318 			var datatype = source.parents('tr');
       
  5319 			if (switcher.hasClass('fa-plus-square-o')) {
       
  5320 				var container = datatype.parents('table');
       
  5321 				innerdiv.html('<h1 class="loading"><i class="fa fa-gear fa-spin"></i></h1>');
       
  5322 				MyAMS.ajax.post(container.data('ams-location') + '/' + source.data('ams-switch-handler'),
       
  5323 								{object_name: datatype.data('ams-element-name')},
       
  5324 								function(result) {
       
  5325 									innerdiv.html(result);
       
  5326 									if (result) {
       
  5327 										MyAMS.initContent(innerdiv);
       
  5328 										switcher.removeClass('fa-plus-square-o')
       
  5329 												.addClass('fa-minus-square-o');
       
  5330 									}
       
  5331 								});
       
  5332 			} else {
       
  5333 				MyAMS.skin.cleanContainer(innerdiv);
       
  5334 				innerdiv.empty();
       
  5335 				switcher.removeClass('fa-minus-square-o')
       
  5336 						.addClass('fa-plus-square-o');
       
  5337 			}
       
  5338 		},
       
  5339 
  5262 		/**
  5340 		/**
  5263 		 * Initialize desktop and mobile widgets
  5341 		 * Initialize desktop and mobile widgets
  5264 		 */
  5342 		 */
  5265 		_initDesktopWidgets: function(element) {
  5343 		_initDesktopWidgets: function(element) {
  5266 			if (ams.enableWidgets) {
  5344 			if (ams.enableWidgets) {
  5919 				if (!href || href.startsWith('javascript') || link.attr('target') || (link.data('ams-context-menu') === true)) {
  5997 				if (!href || href.startsWith('javascript') || link.attr('target') || (link.data('ams-context-menu') === true)) {
  5920 					return;
  5998 					return;
  5921 				}
  5999 				}
  5922 				e.preventDefault();
  6000 				e.preventDefault();
  5923 				e.stopPropagation();
  6001 				e.stopPropagation();
  5924 				var hrefGetter = ams.getFunctionByName(href);
  6002 
       
  6003 				var url,
       
  6004 					target,
       
  6005 					params;
       
  6006 				if (href.indexOf('?') >= 0) {
       
  6007 					url = href.split('?');
       
  6008 					target = url[0];
       
  6009 					params = url[1].unserialize();
       
  6010 				} else {
       
  6011 					target = href;
       
  6012 					params = undefined;
       
  6013 				}
       
  6014 				var hrefGetter = ams.getFunctionByName(target);
  5925 				if (typeof(hrefGetter) === 'function') {
  6015 				if (typeof(hrefGetter) === 'function') {
  5926 					href = hrefGetter.call(link);
  6016 					href = hrefGetter.call(link, params);
  5927 				}
  6017 				}
  5928 				if (typeof(href) === 'function') {
  6018 				if (typeof(href) === 'function') {
  5929 					// Javascript function call
  6019 					// Javascript function call
  5930 					href.call(link);
  6020 					href.call(link, params);
  5931 				} else {
  6021 				} else {
  5932 					// Standard AJAX or browser URL call
  6022 					// Standard AJAX or browser URL call
  5933 					// Convert %23 chars to #
  6023 					// Convert %23 chars to #
  5934 					href = href.replace(/\%23/, '#');
  6024 					href = href.replace(/\%23/, '#');
  5935 					if (e.ctrlKey) {
  6025 					if (e.ctrlKey) {
  6025 					event.stopPropagation();
  6115 					event.stopPropagation();
  6026 				}
  6116 				}
  6027 				if (data.amsClickKeepDefault !== true) {
  6117 				if (data.amsClickKeepDefault !== true) {
  6028 					event.preventDefault();
  6118 					event.preventDefault();
  6029 				}
  6119 				}
  6030 				var callback = ams.getFunctionByName(data.amsClickHandler);
  6120 				var clickHandlers = data.amsClickHandler.split(/\s+/);
  6031 				if (callback !== undefined) {
  6121 				for (var index=0; index < clickHandlers.length; index++) {
  6032 					callback.call(source, event, data.amsClickHandlerOptions);
  6122 					var callback = ams.getFunctionByName(clickHandlers[index]);
       
  6123 					if (callback !== undefined) {
       
  6124 						callback.call(source, event, data.amsClickHandlerOptions);
       
  6125 					}
  6033 				}
  6126 				}
  6034 			}
  6127 			}
  6035 		});
  6128 		});
  6036 
  6129 
  6037 		// Initialize custom change handlers
  6130 		// Initialize custom change handlers
  6052 					event.stopPropagation();
  6145 					event.stopPropagation();
  6053 				}
  6146 				}
  6054 				if (data.amsChangeKeepDefault !== true) {
  6147 				if (data.amsChangeKeepDefault !== true) {
  6055 					event.preventDefault();
  6148 					event.preventDefault();
  6056 				}
  6149 				}
  6057 				var callback = ams.getFunctionByName(data.amsChangeHandler);
  6150 				var changeHandlers = data.amsChangeHandler.split(/\s+/);
  6058 				if (callback !== undefined) {
  6151 				for (var index=0; index < changeHandlers.length; index++) {
  6059 					callback.call(source, event, data.amsChangeHandlerOptions);
  6152 					var callback = ams.getFunctionByName(changeHandlers[index]);
       
  6153 					if (callback !== undefined) {
       
  6154 						callback.call(source, event, data.amsChangeHandlerOptions);
       
  6155 					}
  6060 				}
  6156 				}
  6061 			}
  6157 			}
  6062 		});
  6158 		});
  6063 
  6159 
  6064 		// Submit form when CTRL+Enter key is pressed in textarea
  6160 		// Submit form when CTRL+Enter key is pressed in textarea
  6167 			var link = $(e.target);
  6263 			var link = $(e.target);
  6168 			if (link.exists() && (link.get(0).tagName !== 'A')) {
  6264 			if (link.exists() && (link.get(0).tagName !== 'A')) {
  6169 				link = $('a[href]', link);
  6265 				link = $('a[href]', link);
  6170 			}
  6266 			}
  6171 			var data = link.data();
  6267 			var data = link.data();
  6172 			if (data.amsUrl) {
  6268 			if (data && data.amsUrl) {
  6173 				if (data.amsTabLoaded) {
  6269 				if (data.amsTabLoaded) {
  6174 					return;
  6270 					return;
  6175 				}
  6271 				}
  6176 				link.append('<i class="fa fa-spin fa-cog margin-left-5"></i>');
  6272 				link.append('<i class="fa fa-spin fa-cog margin-left-5"></i>');
  6177 				ams.skin.loadURL(data.amsUrl, link.attr('href'), {
  6273 				ams.skin.loadURL(data.amsUrl, link.attr('href'), {