src/ztfy/myams/resources/js/myams.js
changeset 19 dc18d0700e39
parent 17 847adb5d49b1
child 39 2c6d47b76a7b
--- a/src/ztfy/myams/resources/js/myams.js	Wed May 14 15:46:05 2014 +0200
+++ b/src/ztfy/myams/resources/js/myams.js	Wed May 14 15:47:14 2014 +0200
@@ -88,15 +88,10 @@
 	 */
 	if ($.scrollbarWidth === undefined) {
 		$.scrollbarWidth = function() {
-			var parent,
-				child,
-				width;
-			if (width === undefined) {
-				parent = $('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body');
-				child = parent.children();
-				width = child.innerWidth() - child.height(99).innerWidth();
-				parent.remove();
-			}
+			var parent = $('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body');
+			var child = parent.children();
+			var width = child.innerWidth() - child.height(99).innerWidth();
+			parent.remove();
 			return width;
 		};
 	}
@@ -530,12 +525,19 @@
 		ajax: function(event, request /*, settings*/) {
 			if (request.statusText == 'OK')
 				return;
-			ams.skin.messageBox('error', {
-				title: ams.i18n.ERROR_OCCURED,
-				content: '<h4>' + event.type + '</h4><p>' + request.statusText + '</p>',
-				icon: 'fa fa-warning animated shake',
-				timeout: 10000
-			});
+			var response = ams.ajax.getResponse(request);
+			if (response.content_type == 'json') {
+				ams.ajax.handleJSON(response.data);
+			} else {
+				var title = event.statusText || event.type;
+				var message = request.responseText;
+				ams.skin.messageBox('error', {
+					title: ams.i18n.ERROR_OCCURED,
+					content: '<h4>' + title + '</h4><p>' + message + '</p>',
+					icon: 'fa fa-warning animated shake',
+					timeout: 10000
+				});
+			}
 			if (window.console) {
 				console.error(event);
 				console.debug(request);
@@ -548,12 +550,17 @@
 		show: function(request, status, error) {
 			if (!error)
 				return;
-			ams.skin.messageBox('error', {
-				title: ams.i18n.ERRORS_OCCURED,
-				content: '<h4>' + status + '</h4><p>' + error + '</p>',
-				icon: "fa fa-warning animated shake",
-				timeout: 10000
-			});
+			var response = ams.ajax.getResponse(request);
+			if (response.content_type == 'json') {
+				ams.ajax.handleJSON(response.data);
+			} else {
+				ams.skin.messageBox('error', {
+					title: ams.i18n.ERRORS_OCCURED,
+					content: '<h4>' + status + '</h4><p>' + error + '</p>',
+					icon: "fa fa-warning animated shake",
+					timeout: 10000
+				});
+			}
 			if (window.console) {
 				console.error(error);
 				console.debug(request);
@@ -650,28 +657,41 @@
 			var content_type = request.getResponseHeader('content-type'),
 				data_type,
 				result;
-			if (content_type.startsWith('application/javascript')) {
-				data_type = 'script';
-				result = request.responseText;
-			} else if (content_type.startsWith('text/html')) {
-				data_type = 'html';
-				result = request.responseText;
-			} else if (content_type.startsWith('text/xml')) {
-				data_type = 'xml';
-				result = request.responseText;
-			} else {
-				result = request.responseJSON;
-				if (result)
-					data_type = 'json';
-				else {
-					try {
-						result = JSON.parse(request.responseText);
+			if (content_type) {
+				// Got server response
+				if (content_type.startsWith('application/javascript')) {
+					data_type = 'script';
+					result = request.responseText;
+				} else if (content_type.startsWith('text/html')) {
+					data_type = 'html';
+					result = request.responseText;
+				} else if (content_type.startsWith('text/xml')) {
+					data_type = 'xml';
+					result = request.responseText;
+				} else {
+					result = request.responseJSON;
+					if (result)
 						data_type = 'json';
-					} catch (e) {
-						result = request.responseText;
-						data_type = 'text';
+					else {
+						try {
+							result = JSON.parse(request.responseText);
+							data_type = 'json';
+						} catch (e) {
+							result = request.responseText;
+							data_type = 'text';
+						}
 					}
 				}
+			} else {
+				// Probably no response from server...
+				data_type = 'json';
+				result = {
+					status: 'alert',
+					alert: {
+						title: ams.i18n.ERROR_OCCURED,
+						content: ams.i18n.NO_SERVER_RESPONSE
+					}
+				};
 			}
 			return {content_type: data_type,
 					data: result};
@@ -697,10 +717,13 @@
 		 *
 		 * For errors data structure, please see MyAMS.form.showErrors function
 		 */
-		handleJSON: function(result, form) {
+		handleJSON: function(result, form, target) {
 			var status = result.status;
 			var url;
 			switch (status) {
+				case 'alert':
+					alert(result.alert.title + '\n\n' + result.alert.content);
+					break;
 				case 'error':
 					ams.form.showErrors(form, result);
 					break;
@@ -724,9 +747,8 @@
 						ams.dialog.close(form);
 					url = result.location;
 					if (url.startsWith('#'))
-						ams.skin.loadURL(url.substr(1), result.target || '#content');
-					else
-						ams.skin.loadURL(url, result.target || '#content');
+						url = url.substr(1);
+					ams.skin.loadURL(url, result.target || target || '#content');
 					break;
 				case 'redirect':
 					url = result.location;
@@ -765,13 +787,17 @@
 										{title: ams.i18n.ERROR_OCCURED,
 										 content: message,
 										 timeout: 10000});
-				else
-					ams.skin.messageBox(message.status || 'info',
+				else {
+					var message_status = message.status || 'info';
+					if (message_status == 'error' && form && target)
+						ams.executeFunctionByName(form.data('ams-form-submit-error') || 'MyAMS.form.finalizeSubmitOnError', form, target);
+					ams.skin.messageBox(message_status,
 										{title: message.title || ams.i18n.ERROR_OCCURED,
 										 content: message.content,
 										 icon: message.icon,
 										 number: message.number,
 										 timeout: message.timeout || 10000});
+				}
 			}
 			if (result.callback)
 				ams.executeFunctionByName(result.callback, form, result.options);
@@ -842,7 +868,7 @@
 									method: method,
 									params: params,
 									async: typeof(callback) == 'function',
-									success: callback || function(data, status) {
+									success: callback || function(data /*, status*/) {
 										result = data.result;
 									},
 									error: ams.error.show
@@ -972,8 +998,9 @@
 										url = ams.ajax.getAddr() + action;
 									url += handler || buttonHandler || data.amsFormHandler || '';
 
+									var target = null;
 									if (data.amsFormInitSubmitTarget) {
-										var target = $(buttonTarget || data.amsFormSubmitTarget || '#content');
+										target = $(buttonTarget || data.amsFormSubmitTarget || '#content');
 										ams.executeFunctionByName(data.amsFormInitSubmit || 'MyAMS.form.initSubmit', form, target);
 									} else if (!data.amsFormHideSubmitFooter)
 										ams.executeFunctionByName(data.amsFormInitSubmit || 'MyAMS.form.initSubmitFooter', form);
@@ -998,8 +1025,9 @@
 										beforeSubmit: function(data, form /*, options*/) {
 											form.data('submitted', true);
 										},
-										error: function(request, status, error) {
-											ams.error.show(request, status, error);
+										error: function(request, status, error, form) {
+											if (target)
+												ams.executeFunctionByName(data.amsFormSubmitError || 'MyAMS.form.finalizeSubmitOnError', form, target);
 											if (form.is(':visible')) {
 												var button = form.data('ams-submit-button');
 												if (button)
@@ -1065,6 +1093,17 @@
 		},
 
 		/**
+		 * Finalize AJAX submit call
+		 *
+		 * @param target: the form submit container target
+		 */
+		finalizeSubmitOnError: function(target) {
+			$('i', target).removeClass('fa-spin')
+						  .removeClass('fa-gear')
+						  .addClass('fa-ambulance');
+		},
+
+		/**
 		 * Initialize AJAX submit call in form footer
 		 *
 		 * @param this: the submitted form
@@ -1088,7 +1127,7 @@
 		 * @param this: the submitted form
 		 * @param target: the form submit container target
 		 */
-		finalizeSubmitFooter: function(target) {
+		finalizeSubmitFooter: function(/*target*/) {
 			var form = $(this);
 			var footer = $('footer', form);
 			if (footer) {
@@ -1130,9 +1169,15 @@
 				data_type = request_data.content_type;
 				result = request_data.data;
 			}
+
+			if (button)
+				var target = $(button.amsFormSubmitTarget || data.amsFormSubmitTarget || '#content');
+			else
+				target = $(data.amsFormSubmitTarget || '#content');
+
 			switch (data_type) {
 				case 'json':
-					ams.ajax.handleJSON(result, form);
+					ams.ajax.handleJSON(result, form, target);
 					break;
 				case 'script':
 					break;
@@ -1143,10 +1188,6 @@
 				default:
 					if (button && (button.data('ams-keep-modal') !== true))
 						ams.dialog.close(form);
-					if (button)
-						var target = $(button.amsFormSubmitTarget || data.amsFormSubmitTarget || '#content');
-					else
-						target = $(data.amsFormSubmitTarget || '#content');
 					if (!target.exists())
 						target = $('body');
 					target.parents('.hidden').removeClass('hidden');
@@ -1437,6 +1478,10 @@
 						timeout: 10000
 					});
 					break;
+				case 'modal':
+					$(this).data('select2').dropdown.hide();
+					ams.dialog.open(result.location);
+					break;
 				default:
 					return {
 						results: data.results || data,
@@ -1449,6 +1494,11 @@
 		/** Select2 JSON-RPC success callback */
 		select2QueryMethodSuccessCallback: function(data, status, options) {
 			var result = data.result;
+			if (typeof(result) == 'string') {
+				try {
+					result = JSON.parse(result);
+				} catch (e) {}
+			}
 			switch (result.status) {
 				case 'error':
 					ams.skin.messageBox('error', {
@@ -1458,6 +1508,10 @@
 						timeout: 10000
 					});
 					break;
+				case 'modal':
+					$(this).data('select2').dropdown.hide();
+					ams.dialog.open(result.location);
+					break;
 				default:
 					options.callback({
 						results: result.results || result,
@@ -1670,9 +1724,16 @@
 					var data = legend.data();
 					if (!data.amsChecker) {
 						var checker = $('<label class="checkbox"></label>');
-						var input = $('<input type="checkbox">').attr('name', data.amsCheckerFieldname)
-																.attr('id', (data.amsCheckerFieldname ||
-																			 ('checker_'+ams.generateId())).replace(/\./, '_'))
+						var fieldname = data.amsCheckerFieldname || ('checker_'+ams.generateId());
+						var prefix = data.amsCheckerHiddenPrefix;
+						if (prefix) {
+							$('<input type="hidden">').attr('name', prefix + fieldname)
+													  .val(true)
+													  .appendTo(checker);
+						}
+						var input = $('<input type="checkbox">').attr('name', fieldname)
+																.attr('id', fieldname.replace(/\./, '_'))
+																.data('ams-checker-init', true)
 																.val(data.amsCheckerState == 'on')
 																.on('change', function(e) {
 																	e.preventDefault();
@@ -1700,8 +1761,12 @@
 							   .prependTo(legend);
 						if (data.amsCheckerState == 'on')
 							input.attr('checked', true);
-						else
-							fieldset.addClass('switched');
+						else {
+							if (data.amsCheckerMode == 'disable')
+								fieldset.attr('disabled', 'disabled');
+							else
+								fieldset.addClass('switched');
+						}
 						legend.data('ams-checker', 'on');
 					}
 				});
@@ -1849,7 +1914,7 @@
 														method: data.amsSelect2QueryMethod,
 														params: data.amsSelect2QueryParams || {},
 														success: function(data, status) {
-															return ams.helpers.select2QueryMethodSuccessCallback(data, status, options);
+															return ams.helpers.select2QueryMethodSuccessCallback.call(select, data, status, options);
 														},
 														error: ams.error.show
 													};
@@ -1875,7 +1940,8 @@
 
 											if (data.amsSelect2EnableFreeTags) {
 												data_options.createSearchChoice = function(term) {
-													return {id: term, text: term};
+													return {id: term,
+															text: (data.amsSelect2FreeTagsPrefix || ams.i18n.SELECT2_FREETAG_PREFIX) + term};
 												};
 											}
 
@@ -3099,6 +3165,7 @@
 
 		WAIT: "Please wait!",
 		FORM_SUBMITTED: "This form was already submitted...",
+		NO_SERVER_RESPONSE: "No response from server!",
 		ERROR_OCCURED: "An error occured!",
 		ERRORS_OCCURED: "Some errors occured!",
 
@@ -3131,6 +3198,7 @@
 		SELECT2_INPUT_TOOSHORT: "Please enter {0} more character{1}",
 		SELECT2_INPUT_TOOLONG: "Please delete {0} character{1}",
 		SELECT2_SELECTION_TOOBIG: "You can only select {0} item{1}",
+		SELECT2_FREETAG_PREFIX: "Free text: ",
 
 		DT_COLUMNS: "Columns"