src/pyams_skin/resources/js/myams-callbacks.js
changeset 557 bca7a7e058a3
equal deleted inserted replaced
-1:000000000000 557:bca7a7e058a3
       
     1 /**
       
     2  * MyAMS callbacks management
       
     3  */
       
     4 (function($, globals) {
       
     5 
       
     6 	var ams = globals.MyAMS;
       
     7 
       
     8 	ams.callbacks = {
       
     9 
       
    10 		/**
       
    11 		 * Initialize list of callbacks
       
    12 		 *
       
    13 		 * Callbacks are initialized each time a page content is loaded and integrated into page's DOM.
       
    14 		 * Unlike plug-ins, callbacks are called once in current's content context but are not kept into
       
    15 		 * browser's memory for future use.
       
    16 		 * Callbacks are defined via several data attributes:
       
    17 		 * - data-ams-callback: name of function callback
       
    18 		 * - data-ams-callback-source: source URL of file containing callback's function; can contain variables names
       
    19 		 *   if enclosed between braces
       
    20 		 * - data-ams-callback-options: JSON object containing callback options
       
    21 		 */
       
    22 		init: function(element) {
       
    23 			$('[data-ams-callback]', element).each(function() {
       
    24 				var self = this;
       
    25 				var data = $(self).data();
       
    26 				try {
       
    27 					var callbacks = JSON.parse(data.amsCallback);
       
    28 					if (!Array.isArray(callbacks)) {
       
    29 						callbacks = [callbacks];
       
    30 					}
       
    31 				} catch (e) {
       
    32 					callbacks = data.amsCallback.split(/\s+/);
       
    33 				}
       
    34 				for (var index=0; index < callbacks.length; index++) {
       
    35 					var callback = callbacks[index];
       
    36 					if (typeof(callback) === 'string') {
       
    37 						var callback_func = ams.getFunctionByName(callback);
       
    38 						var callback_options = data.amsCallbackOptions;
       
    39 						if (typeof(callback_options) === 'string') {
       
    40 							callback_options = callback_options.unserialize();
       
    41 						}
       
    42 						if (callback_func === undefined) {
       
    43 							if (data.amsCallbackSource) {
       
    44 								ams.getScript(data.amsCallbackSource,
       
    45 									(function (cb) {
       
    46 										ams.executeFunctionByName(cb, self, callback_options);
       
    47 									})(callback), {
       
    48 										async: data.amsCallbackAsync === undefined ? true : data.amsCallbackAsync
       
    49 									});
       
    50 							} else if (console) {
       
    51 								console.warn && console.warn("Undefined callback: " + data.amsCallback);
       
    52 							}
       
    53 						} else {
       
    54 							callback_func.call(self, callback_options);
       
    55 						}
       
    56 					} else {  // JSON object
       
    57 						callback_func = ams.getFunctionByName(callback.callback);
       
    58 						callback_options = callback.options;
       
    59 						if (typeof(callback_options) === 'string') {
       
    60 							callback_options = callback_options.unserialize();
       
    61 						}
       
    62 						if (callback_func === undefined) {
       
    63 							if (callback.source) {
       
    64 								ams.getScript(callback.source,
       
    65 									(function (cb) {
       
    66 										ams.executeFunctionByName(cb.callback, self, cb.options);
       
    67 									})(callback), {
       
    68 										async: callback.async === undefined ? true : callback.async
       
    69 									});
       
    70 							} else if (console) {
       
    71 								console.warn && console.warn("Undefined callback: " + callback.callback);
       
    72 							}
       
    73 						} else {
       
    74 							callback_func.call(self, callback.options);
       
    75 						}
       
    76 					}
       
    77 				}
       
    78 			});
       
    79 		},
       
    80 
       
    81 		/**
       
    82 		 * Standard alert message callback
       
    83 		 *
       
    84 		 * An alert is an HTML div included on top of a "parent's" body
       
    85 		 * Alert options include:
       
    86 		 * - a status: 'info', 'warning', 'error' or 'success'
       
    87 		 * - a parent: jQuery selector of parent's element
       
    88 		 * - a header: alert's title
       
    89 		 * - a subtitle
       
    90 		 * - a message body
       
    91 		 * - a boolean margin marker; if true, a 10 pixels margin will be added to alert's body
       
    92 		 */
       
    93 		alert: function(options) {
       
    94 			var data = $(this).data();
       
    95 			var settings = $.extend({}, options, data.amsAlertOptions);
       
    96 			var parent = $(data.amsAlertParent || settings.parent || this);
       
    97 			var status = data.amsAlertStatus || settings.status || 'info';
       
    98 			var header = data.amsAlertHeader || settings.header;
       
    99 			var message = data.amsAlertMessage || settings.message;
       
   100 			var subtitle = data.amsAlertSubtitle || settings.subtitle;
       
   101 			var margin = data.amsAlertMargin === undefined ? (settings.margin === undefined ? false : settings.margin) : data.amsAlertMargin;
       
   102 			ams.skin && ams.skin.alert(parent, status, header, message, subtitle, margin);
       
   103 		},
       
   104 
       
   105 		/**
       
   106 		 * Standard message box callback
       
   107 		 *
       
   108 		 * Message boxes are small informations messages displayed on bottom right page's corner
       
   109 		 * Message box options include:
       
   110 		 * - data-ams-messagebox-status: determines message box color; given as 'info', 'warning', 'error' or 'success'
       
   111 		 * - data-ams-messagebox-title: message's title
       
   112 		 * - data-ams-messagebox-content: message's HTML content
       
   113 		 * - data-ams-messagebox-icon: if given, CSS class of message's icon
       
   114 		 * - data-ams-messagebox-number: if given, a small error/message number displayed below message
       
   115 		 * - data-ams-messagebox-timeout: if given, the message box will be automatically hidden passed this number
       
   116 		 *   of milliseconds
       
   117 		 * - data-ams-messagebox-callback: a callback's name, which will be called when message box is closed
       
   118 		 */
       
   119 		messageBox: function(options) {
       
   120 			var data = $(this).data();
       
   121 			var dataOptions = $.extend({}, options, data.amsMessageboxOptions);
       
   122 			var settings = $.extend({}, dataOptions, {
       
   123 				title: data.amsMessageboxTitle || dataOptions.title || '',
       
   124 				content: data.amsMessageboxContent || dataOptions.content || '',
       
   125 				icon: data.amsMessageboxIcon || dataOptions.icon,
       
   126 				number: data.amsMessageboxNumber || dataOptions.number,
       
   127 				timeout: data.amsMessageboxTimeout || dataOptions.timeout
       
   128 			});
       
   129 			var status = data.amsMessageboxStatus || dataOptions.status || 'info';
       
   130 			var callback = ams.getFunctionByName(data.amsMessageboxCallback || dataOptions.callback);
       
   131 			ams.skin && ams.skin.messageBox(status, settings, callback);
       
   132 		},
       
   133 
       
   134 		/**
       
   135 		 * Standard small box callback
       
   136 		 *
       
   137 		 * Small boxes are notification messages displayed on top right page's corner.
       
   138 		 * Small box options include:
       
   139 		 * - data-ams-smallbox-status: determines message box color; given as 'info', 'warning', 'error' or 'success'
       
   140 		 * - data-ams-smallbox-title: message's title
       
   141 		 * - data-ams-smallbox-content: message's HTML content
       
   142 		 * - data-ams-smallbox-icon: if given, CSS class of message's icon
       
   143 		 * - data-ams-smallbox-icon-small: if given, CSS class of small message's icon
       
   144 		 * - data-ams-smallbox-timeout: if given, the message box will be automatically hidden passed this number
       
   145 		 *   of milliseconds
       
   146 		 * - data-ams-smallbox-callback: a callback's name, which will be called when message box is closed
       
   147 		 */
       
   148 		smallBox: function(options) {
       
   149 			var data = $(this).data();
       
   150 			var dataOptions = $.extend({}, options, data.amsSmallboxOptions);
       
   151 			var settings = $.extend({}, dataOptions, {
       
   152 				title: data.amsSmallboxTitle || dataOptions.title || '',
       
   153 				content: data.amsSmallboxContent || dataOptions.content || '',
       
   154 				icon: data.amsSmallboxIcon || dataOptions.icon,
       
   155 				iconSmall: data.amsSmallboxIconSmall || dataOptions.iconSmall,
       
   156 				timeout: data.amsSmallboxTimeout || dataOptions.timeout
       
   157 			});
       
   158 			var status = data.amsSmallboxStatus || dataOptions.status || 'info';
       
   159 			var callback = ams.getFunctionByName(data.amsSmallboxCallback || dataOptions.callback);
       
   160 			ams.skin && ams.skin.smallBox(status, settings, callback);
       
   161 		}
       
   162 	};
       
   163 
       
   164 })(jQuery, this);