src/pyams_skin/resources/js/myams-widgets.js
changeset 489 63ea9a94bd47
parent 486 48b7cea0d903
--- a/src/pyams_skin/resources/js/myams-widgets.js	Wed Dec 12 21:16:29 2018 +0100
+++ b/src/pyams_skin/resources/js/myams-widgets.js	Thu Dec 13 14:28:29 2018 +0100
@@ -25,11 +25,11 @@
 		var minutes = checkValue(date.getMinutes());
 		var seconds = checkValue(date.getSeconds());
 		return options.timestampFormat.replace(/%d%/g, day)
-									  .replace(/%m%/g, month)
-									  .replace(/%y%/g, year)
-									  .replace(/%h%/g, hours)
-									  .replace(/%i%/g, minutes)
-									  .replace(/%s%/g, seconds);
+			.replace(/%m%/g, month)
+			.replace(/%y%/g, year)
+			.replace(/%h%/g, hours)
+			.replace(/%i%/g, minutes)
+			.replace(/%s%/g, seconds);
 	}
 
 
@@ -97,19 +97,19 @@
 						}
 						if (widget.style) {
 							mywidget.removeClassPrefix('ams-widget-color-')
-									.addClass(widget.style)
-									.attr('data-widget-attstyle', widget.style);
+								.addClass(widget.style)
+								.attr('data-widget-attstyle', widget.style);
 						}
 						if (widget.hidden === 1) {
 							mywidget.hide(1);
 						} else {
 							mywidget.show(1)
-									.removeAttr('data-widget-hidden');
+								.removeAttr('data-widget-hidden');
 						}
 						if (widget.collapsed === 1) {
 							mywidget.addClass('ams-widget-collapsed')
-									.children('div')
-									.hide(1);
+								.children('div')
+								.hide(1);
 						}
 						var title = mywidget.children('header').children('h2');
 						if (title.text() !== widget.title) {
@@ -155,19 +155,19 @@
 				indicator: data.amsWidgetIndicator,
 				indicatorTime: data.amsWidgetIndicatorTime,
 				ajax: data.amsWidgetAjax,
-				timestampPlaceholder : data.amsWidgetTimestampPlaceholder,
-				timestampFormat : data.amsWidgetTimestampFormat,
-				refreshButton : data.amsWidgetRefreshButton,
-				refreshClass : data.amsWidgetRefreshClass,
-				errorLabel : data.amsWidgetErrorLabel,
-				updatedLabel : data.amsWidgetUpdatedLabel,
-				refreshLabel : data.amsWidgetRefreshLabel,
-				deleteLabel : data.amsWidgetDeleteLabel,
-				afterLoad : ams.getFunctionByName(data.amsWidgetAfterLoadCallback),
-				rtl : data.amsWidgetRtl,
-				onChange : ams.getFunctionByName(data.amsWidgetChangeCallback),
-				onSave : ams.getFunctionByName(data.amsWidgetSaveCallback),
-				ajax_nav : ams.ajax_nav
+				timestampPlaceholder: data.amsWidgetTimestampPlaceholder,
+				timestampFormat: data.amsWidgetTimestampFormat,
+				refreshButton: data.amsWidgetRefreshButton,
+				refreshClass: data.amsWidgetRefreshClass,
+				errorLabel: data.amsWidgetErrorLabel,
+				updatedLabel: data.amsWidgetUpdatedLabel,
+				refreshLabel: data.amsWidgetRefreshLabel,
+				deleteLabel: data.amsWidgetDeleteLabel,
+				afterLoad: ams.getFunctionByName(data.amsWidgetAfterLoadCallback),
+				rtl: data.amsWidgetRtl,
+				onChange: ams.getFunctionByName(data.amsWidgetChangeCallback),
+				onSave: ams.getFunctionByName(data.amsWidgetSaveCallback),
+				ajax_nav: ams.ajax_nav
 			};
 			var widgetOptions = $.extend({}, self.options, data_options);
 			var header = widget.children('header');
@@ -184,7 +184,7 @@
 				}
 				if (data.widgetCollapsed === true) {
 					widget.addClass('ams-widget-collapsed')
-						  .children('div').hide();
+						.children('div').hide();
 				}
 				if (widgetOptions.customButton &&
 					(data.widgetCustombutton === undefined) &&
@@ -195,21 +195,21 @@
 				}
 				if (widgetOptions.deleteButton && (data.widgetDeleteButton === undefined)) {
 					deleteBtn = '<a href="#" class="button-icon ams-widget-delete-btn hint" title="' + MyAMSWidget.i18n.DELETE_BTN + '" data-ams-hint-gravity="se">' +
-								'<i class="' + widgetOptions.deleteClass + '"></i></a>';
+						'<i class="' + widgetOptions.deleteClass + '"></i></a>';
 				} else {
 					deleteBtn = "";
 				}
 				if (widgetOptions.editButton && (data.widgetEditButton === undefined)) {
 					var editClass = widgetOptions.editClass.split('|')[0];
 					editBtn = '<a href="#" class="button-icon ams-widget-edit-btn hint" title="' + MyAMSWidget.i18n.EDIT_BTN + '" data-ams-hint-gravity="se">' +
-							  '<i class="' + editClass + '"></i></a>';
+						'<i class="' + editClass + '"></i></a>';
 				} else {
 					editBtn = "";
 				}
 				if (widgetOptions.fullscreenButton && (data.widgetFullscreenButton === undefined)) {
 					var fullscreenClass = widgetOptions.fullscreenClass.split('|')[0];
 					fullscreenBtn = '<a href="#" class="button-icon ams-widget-fullscreen-btn hint" title="' + MyAMSWidget.i18n.FULLSCREEN_BTN + '" data-ams-hint-gravity="se">' +
-									'<i class="' + fullscreenClass + '"></i></a>';
+						'<i class="' + fullscreenClass + '"></i></a>';
 				} else {
 					fullscreenBtn = "";
 				}
@@ -223,7 +223,7 @@
 						toggleSettings = toggleClass[0];
 					}
 					toggleBtn = '<a href="#" class="button-icon ams-widget-toggle-btn hint" title="' + MyAMSWidget.i18n.COLLAPSE_BTN + '" data-ams-hint-gravity="se">' +
-								'<i class="' + toggleSettings + '"></i></a>';
+						'<i class="' + toggleSettings + '"></i></a>';
 				} else {
 					toggleBtn = "";
 				}
@@ -231,16 +231,16 @@
 					(data.widgetRefreshButton === undefined) &&
 					data.widgetLoad) {
 					refreshBtn = '<a href="#" class="button-icon ams-widget-refresh-btn hint" title="' + MyAMSWidget.i18n.REFRESH_BTN + '" data-loading-text="&nbsp;&nbsp;' + MyAMSWidget.i18n.LOADING_MSG + '&nbsp;" data-ams-hint-gravity="se">' +
-								 '<i class="' + widgetOptions.refreshClass + '"></i></a>';
+						'<i class="' + widgetOptions.refreshClass + '"></i></a>';
 				} else {
 					refreshBtn = "";
 				}
 				var buttons = widgetOptions.buttonsOrder.replace(/%refresh%/, refreshBtn)
-														 .replace(/%custom%/, customBtn)
-														 .replace(/%edit%/, editBtn)
-														 .replace(/%toggle%/, toggleBtn)
-														 .replace(/%fullscreen%/, fullscreenBtn)
-														 .replace(/%delete%/, deleteBtn);
+					.replace(/%custom%/, customBtn)
+					.replace(/%edit%/, editBtn)
+					.replace(/%toggle%/, toggleBtn)
+					.replace(/%fullscreen%/, fullscreenBtn)
+					.replace(/%delete%/, deleteBtn);
 				if (refreshBtn || customBtn || editBtn || toggleBtn || fullscreenBtn || deleteBtn) {
 					header.prepend('<div class="ams-widget-ctrls">' + buttons + '</div>');
 				}
@@ -253,10 +253,10 @@
 				}
 				header.append('<span class="ams-widget-loader"><i class="fa fa-refresh fa-spin"></i></span>');
 				widget.attr('role', 'widget')
-					  .children('div').attr('role', 'content')
-					  .prev('header').attr('role', 'heading')
-					  .children('div').attr('role', 'menu');
-				ams.plugins.enabled.hint(header);
+					.children('div').attr('role', 'content')
+					.prev('header').attr('role', 'heading')
+					.children('div').attr('role', 'menu');
+				ams.plugins && ams.plugins.enabled.hint && ams.plugins.enabled.hint(header);
 			}
 			widget.data('widget-options', widgetOptions);
 			if (self.options.hiddenButtons) {
@@ -347,7 +347,8 @@
 					result = parseInt(self.storage.getItem(uid)) === uid;
 					self.storage.removeItem(uid);
 					return result;
-				} catch (e) {}
+				} catch (e) {
+				}
 			}();
 			if (use_storage) {
 				self.settingsKey = "AMS_settings_" + location.pathname + location.hash + "_" + self.gridId;
@@ -367,15 +368,15 @@
 			var self = this;
 			if (self.options.indicator) {
 				widget.find('.ams-widget-loader')
-					  .stop(true, true)
-					  .fadeIn(100)
-					  .delay(self.options.indicatorTime)
-					  .fadeOut(100);
+					.stop(true, true)
+					.fadeIn(100)
+					.delay(self.options.indicatorTime)
+					.fadeOut(100);
 			}
 		},
 
 		_loadAjaxFile: function(url, widget, loader) {
-			ams.skin.loadURL(url, widget.find('.widget-body'));
+			ams.skin && ams.skin.loadURL(url, widget.find('.widget-body'));
 		},
 
 		_saveWidgetSettings: function() {
@@ -397,7 +398,7 @@
 				if (self.settings !== gridSettingsStr) {
 					self.storage.setItem(self.settingsKey, gridSettingsStr);
 				}
-				if (typeof(self.options.onSave) === 'function') {
+				if (typeof (self.options.onSave) === 'function') {
 					self.options.onSave.call(this, null, gridSettings);
 				}
 			}
@@ -408,9 +409,9 @@
 			self._getSettings();
 			if (self.storage) {
 				var gridPosition = [];
-				self.grid.find(self.options.subgrid + ".sortable-grid").each(function () {
+				self.grid.find(self.options.subgrid + ".sortable-grid").each(function() {
 					var subgridPosition = [];
-					$(this).children(self.options.widgets).each(function () {
+					$(this).children(self.options.widgets).each(function() {
 						var subObj = {};
 						subObj.id = $(this).attr("id");
 						subgridPosition.push(subObj);
@@ -422,7 +423,7 @@
 				if (self.position !== gridPositionStr) {
 					self.storage.setItem(self.positionKey, gridPositionStr);
 				}
-				if (typeof(self.options.onSave) === 'function') {
+				if (typeof (self.options.onSave) === 'function') {
 					self.options.onSave.call(this, null, gridPosition);
 				}
 			}
@@ -436,9 +437,9 @@
 					var widgets = mode.find(self.options.widgets);
 					var windowHeight = $(window).height();
 					var headerHeight = widgets.children('header')
-											  .height();
+						.height();
 					widgets.children('div')
-						   .height(windowHeight - headerHeight - 15);
+						.height(windowHeight - headerHeight - 15);
 				}
 			}
 
@@ -460,11 +461,11 @@
 					}
 					if (canToggle !== false) {
 						button.children().removeClass(toggleClass[1])
-										 .addClass(toggleClass[0]);
+							.addClass(toggleClass[0]);
 						widget.removeClass('ams-widget-collapsed')
-							  .children('[role=content]').slideDown(widgetOptions.toggleSpeed, function() {
-									self._saveWidgetSettings();
-							  });
+							.children('[role=content]').slideDown(widgetOptions.toggleSpeed, function() {
+							self._saveWidgetSettings();
+						});
 					}
 				} else {
 					if (widgetOptions.onToggle) {
@@ -472,11 +473,11 @@
 					}
 					if (canToggle !== false) {
 						button.children().removeClass(toggleClass[0])
-										 .addClass(toggleClass[1]);
+							.addClass(toggleClass[1]);
 						widget.addClass('ams-widget-collapsed')
-							  .children('[role=content]').slideUp(widgetOptions.toggleSpeed, function() {
-								self._saveWidgetSettings();
-							  });
+							.children('[role=content]').slideUp(widgetOptions.toggleSpeed, function() {
+							self._saveWidgetSettings();
+						});
 					}
 				}
 			});
@@ -496,38 +497,38 @@
 				if ($('#ams-widget-fullscreen-mode').length > 0) {
 					$('.nooverflow').removeClass('nooverflow');
 					widget.unwrap('<div>')
-						  .children('div')
-						  .removeAttr('style')
-						  .end()
-						  .find('.ams-widget-fullscreen-btn')
-						  .children()
-						  .removeClass(fullscreenClass[1])
-						  .addClass(fullscreenClass[0])
-						  .parents(self.controls)
-						  .children('a')
-						  .show();
+						.children('div')
+						.removeAttr('style')
+						.end()
+						.find('.ams-widget-fullscreen-btn')
+						.children()
+						.removeClass(fullscreenClass[1])
+						.addClass(fullscreenClass[0])
+						.parents(self.controls)
+						.children('a')
+						.show();
 					if (content.hasClass('ams-widget-visible')) {
 						content.hide()
-							   .removeClass('ams-widget-visible');
+							.removeClass('ams-widget-visible');
 					}
 				} else {
 					$('body').addClass('nooverflow');
 					widget.wrap('<div id="ams-widget-fullscreen-mode"></div>')
-						  .parent()
-						  .find('.ams-widget-fullscreen-btn')
-						  .children()
-						  .removeClass(fullscreenClass[0])
-						  .addClass(fullscreenClass[1])
-						  .parents(self.controls)
-						  .children('a:not(.ams-widget-fullscreen-btn)')
-						  .hide();
+						.parent()
+						.find('.ams-widget-fullscreen-btn')
+						.children()
+						.removeClass(fullscreenClass[0])
+						.addClass(fullscreenClass[1])
+						.parents(self.controls)
+						.children('a:not(.ams-widget-fullscreen-btn)')
+						.hide();
 					if (content.is(':hidden')) {
 						content.show()
-							   .addClass('ams-widget-visible');
+							.addClass('ams-widget-visible');
 					}
 				}
 				setFullscreenHeight();
-				if (typeof(widgetOptions.onFullscreen) === 'function') {
+				if (typeof (widgetOptions.onFullscreen) === 'function') {
 					widgetOptions.onFullscreen.call(this, widget);
 				}
 			});
@@ -546,26 +547,26 @@
 				var placeholder = widget.find(widgetOptions.editPlaceholder);
 				if (placeholder.is(':visible')) {
 					button.children()
-						  .removeClass(editClass[1])
-						  .addClass(editClass[0]);
+						.removeClass(editClass[1])
+						.addClass(editClass[0]);
 					placeholder.slideUp(widgetOptions.editSpeed, function() {
 						self._saveWidgetSettings();
 					});
 				} else {
 					button.children()
-						  .removeClass(editClass[0])
-						  .addClass(editClass[1]);
+						.removeClass(editClass[0])
+						.addClass(editClass[1]);
 					placeholder.slideDown(widgetOptions.editSpeed);
 				}
-				if (typeof(widgetOptions.onEdit) === 'function') {
+				if (typeof (widgetOptions.onEdit) === 'function') {
 					widgetOptions.onEdit.call(this, widget);
 				}
 			});
 			$(self.options.editPlaceholder).find('input').keyup(function() {
 				$(this).parents(self.options.widgets)
-					   .children('header')
-					   .children('h2')
-					   .text($(this).val());
+					.children('header')
+					.children('h2')
+					.text($(this).val());
 			});
 
 			// Custom button
@@ -578,15 +579,15 @@
 				self._runLoaderWidget(widget);
 				if (button.children('.' + customClass[0]).length > 0) {
 					button.children()
-						  .removeClass(customClass[0])
-						  .addClass(customClass[1]);
-					if (typeof(widgetOptions.customStart) === 'function') {
+						.removeClass(customClass[0])
+						.addClass(customClass[1]);
+					if (typeof (widgetOptions.customStart) === 'function') {
 						widgetOptions.customStart.call(this, widget);
 					}
 				} else {
 					button.children('.' + customClass[1])
-							.addClass(customClass[0]);
-					if (typeof(widgetOptions.customEnd) === 'function') {
+						.addClass(customClass[0]);
+					if (typeof (widgetOptions.customEnd) === 'function') {
 						widgetOptions.customEnd.call(this, widget);
 					}
 				}
@@ -601,25 +602,25 @@
 				var widgetOptions = widget.data('widget-options');
 				var wId = widget.attr('id');
 				var title = widget.children('header').children('h2').text();
-				ams.ajax.check(MyAMS.notify,
-								   ams.baseURL + 'myams-notify' + (ams.devmode ? '.js' : '.min.js'),
-								   function() {
-										ams.notify.messageBox({
-											title: '<i class="fa fa-times" style="color: #ed1c24;"></i> ' + widgetOptions.deleteLabel + ' "' + title + '"',
-											content: MyAMSWidget.i18n.DELETE_MSG,
-											buttons: "[" + ams.i18n.BTN_OK + "][" + ams.i18n.BTN_CANCEL + "]"
-										}, function(buttonPressed) {
-											if (buttonPressed === ams.i18n.BTN_OK) {
-												self._runLoaderWidget(widget);
-												$('#' + wId).fadeOut(widgetOptions.deleteSpeed, function() {
-													button.remove();
-													if (typeof(widgetOptions.onDelete) === 'function') {
-														widgetOptions.onDelete.call(this, widget);
-													}
-												});
-											}
-										});
-								   });
+				ams.ajax && ams.ajax.check(MyAMS.notify,
+										   ams.baseURL + 'myams-notify' + (ams.devmode ? '.js' : '.min.js'),
+										   function() {
+											   ams.notify.messageBox({
+																		 title: '<i class="fa fa-times" style="color: #ed1c24;"></i> ' + widgetOptions.deleteLabel + ' "' + title + '"',
+																		 content: MyAMSWidget.i18n.DELETE_MSG,
+																		 buttons: "[" + ams.i18n.BTN_OK + "][" + ams.i18n.BTN_CANCEL + "]"
+																	 }, function(buttonPressed) {
+												   if (buttonPressed === ams.i18n.BTN_OK) {
+													   self._runLoaderWidget(widget);
+													   $('#' + wId).fadeOut(widgetOptions.deleteSpeed, function() {
+														   button.remove();
+														   if (typeof (widgetOptions.onDelete) === 'function') {
+															   widgetOptions.onDelete.call(this, widget);
+														   }
+													   });
+												   }
+											   });
+										   });
 			});
 
 			// Refresh button
@@ -644,21 +645,21 @@
 	var MyAMSWidget = {
 
 		i18n: $.extend({
-			SETTINGS_KEY_LABEL: "Reset settings?",
-			POSITION_KEY_LABEL: "Reset position?",
-			TIMESTAMP_FORMAT: "Last update: %d%/%m%/%y% %h%:%i%:%s",
-			ERROR_LABEL: "An error occured: ",
-			UPDATED_LABEL: "Last update: ",
-			REFRESH_LABEL: "Refresh",
-			EDIT_BTN: "Edit title",
-			DELETE_BTN: "Delete",
-			DELETE_LABEL: "Remove component: ",
-			DELETE_MSG: "WARNING: this action can't be undone!",
-			FULLSCREEN_BTN: "Fullscreen",
-			COLLAPSE_BTN: "Collapse",
-			REFRESH_BTN: "Reload content",
-			LOADING_MSG: "Loading..."
-		}, ams.plugins.i18n.widgets),
+						   SETTINGS_KEY_LABEL: "Reset settings?",
+						   POSITION_KEY_LABEL: "Reset position?",
+						   TIMESTAMP_FORMAT: "Last update: %d%/%m%/%y% %h%:%i%:%s",
+						   ERROR_LABEL: "An error occured: ",
+						   UPDATED_LABEL: "Last update: ",
+						   REFRESH_LABEL: "Refresh",
+						   EDIT_BTN: "Edit title",
+						   DELETE_BTN: "Delete",
+						   DELETE_LABEL: "Remove component: ",
+						   DELETE_MSG: "WARNING: this action can't be undone!",
+						   FULLSCREEN_BTN: "Fullscreen",
+						   COLLAPSE_BTN: "Collapse",
+						   REFRESH_BTN: "Reload content",
+						   LOADING_MSG: "Loading..."
+					   }, ams.plugins.i18n.widgets),
 
 		initWidgetsGrid: function(grid) {
 			if (!grid.exists()) {
@@ -668,27 +669,27 @@
 			if (options.sortable && $.ui) {
 				var sortItem = grid.find('.sortable-grid').not("[data-widget-excludegrid]");
 				sortItem.sortable({
-					items: sortItem.find('.ams-widget-sortable'),
-					connectWith: sortItem,
-					placeholder: options.placeholderClass,
-					cursor: 'move',
-					revert: true,
-					opacity: options.opacity,
-					delay: 200,
-					cancel: '.button-icon, #ams-widget-fullscreen-mode >div',
-					zIndex: 10000,
-					handle: options.dragHandle,
-					forcePlaceholderSize: true,
-					forceHelperSize: true,
-					update: function(event, ui) {
-						var widget = ui.item.data('AMSWidget');
-						widget._runLoaderWidget(widget.widget);
-						widget._saveWidgetPosition();
-						if (typeof(options.onChange) === 'function') {
-							options.onChange.call(this, ui.item);
-						}
-					}
-				});
+									  items: sortItem.find('.ams-widget-sortable'),
+									  connectWith: sortItem,
+									  placeholder: options.placeholderClass,
+									  cursor: 'move',
+									  revert: true,
+									  opacity: options.opacity,
+									  delay: 200,
+									  cancel: '.button-icon, #ams-widget-fullscreen-mode >div',
+									  zIndex: 10000,
+									  handle: options.dragHandle,
+									  forcePlaceholderSize: true,
+									  forceHelperSize: true,
+									  update: function(event, ui) {
+										  var widget = ui.item.data('AMSWidget');
+										  widget._runLoaderWidget(widget.widget);
+										  widget._saveWidgetPosition();
+										  if (typeof (options.onChange) === 'function') {
+											  options.onChange.call(this, ui.item);
+										  }
+									  }
+								  });
 			}
 		}
 	};
@@ -739,19 +740,19 @@
 		indicator: true,
 		indicatorTime: 600,
 		ajax: true,
-		timestampPlaceholder : '.ams-widget-timestamp',
-		timestampFormat : MyAMSWidget.i18n.TIMESTAMP_FORMAT,
-		refreshButton : true,
-		refreshButtonClass : 'fa fa-refresh',
-		errorLabel : MyAMSWidget.i18n.ERROR_LABEL,
-		updatedLabel : MyAMSWidget.i18n.UPDATED_LABEL,
-		refreshLabel : MyAMSWidget.i18n.REFRESH_LABEL,
-		deleteLabel : MyAMSWidget.i18n.DELETE_LABEL,
-		afterLoad : null,
-		rtl : false,
-		onChange : null,
-		onSave : null,
-		ajax_nav : ams.ajax_nav
+		timestampPlaceholder: '.ams-widget-timestamp',
+		timestampFormat: MyAMSWidget.i18n.TIMESTAMP_FORMAT,
+		refreshButton: true,
+		refreshButtonClass: 'fa fa-refresh',
+		errorLabel: MyAMSWidget.i18n.ERROR_LABEL,
+		updatedLabel: MyAMSWidget.i18n.UPDATED_LABEL,
+		refreshLabel: MyAMSWidget.i18n.REFRESH_LABEL,
+		deleteLabel: MyAMSWidget.i18n.DELETE_LABEL,
+		afterLoad: null,
+		rtl: false,
+		onChange: null,
+		onSave: null,
+		ajax_nav: ams.ajax_nav
 	};
 
 	globals.MyAMSWidget = MyAMSWidget;
@@ -759,70 +760,70 @@
 
 	$.fn.extend({
 
-		MyAMSWidget: function(options) {
-			return this.each(function() {
-				var widget = $(this);
-				var data = widget.data('AMSWidget');
-				if (!data) {
-					var grid = widget.parents(options.grid || MyAMSWidget.defaults.grid);
-					var grid_options = {};
-					if (grid.exists()) {
-						var grid_data = grid.data();
-						grid_options = {
-							grid: grid_data.amsWidgetGrid,
-							subgrid: grid_data.amsWidgetSubgrid,
-							controls: grid_data.amsWidgetControls,
-							storage: grid_data.amsWidgetStorage,
-							deleteSettingsKey: grid_data.amsWidgetDeleteSettingsKey,
-							deletePositionKey: grid_data.amsWidgetDeletePositionKey,
-							sortable: grid_data.amsWidgetSortable,
-							hiddenButtons: grid_data.amsWidgetHiddenButtons,
-							toggleButton: grid_data.amsWidgetToggleButton,
-							toggleClass: grid_data.amsWidgetToggleClass,
-							onToggle: ams.getFunctionByName(grid_data.amsWidgetToggleCallback),
-							deleteButton: grid_data.amsWidgetDeleteButton,
-							deleteClass: grid_data.amsWidgetDeleteClass,
-							onDelete: ams.getFunctionByName(grid_data.amsWidgetDeleteCallback),
-							editButton: grid_data.amsWidgetEditButton,
-							editPlaceholder: grid_data.amsWidgetEditPlaceholder,
-							editClass: grid_data.amsWidgetEditClass,
-							onEdit: ams.getFunctionByName(grid_data.amsWidgetEditCallback),
-							fullscreenButton: grid_data.amsWidgetFullscreenButton,
-							fullscreenClass: grid_data.amsWidgetFullscreenClass,
-							fullscreenDiff: grid_data.amsWidgetFullscreenDiff,
-							onFullscreen: ams.getFunctionByName(grid_data.amsWidgetFullscreenCallback),
-							customButton: grid_data.amsWidgetCustomButton,
-							customClass: grid_data.amsWidgetCustomClass,
-							customStart: ams.getFunctionByName(grid_data.amsWidgetCustomStartCallback),
-							customEnd: ams.getFunctionByName(grid_data.amsWidgetCustomStartCallback),
-							buttonsOrder: grid_data.amsWidgetButtonsOrder,
-							opacity: grid_data.amsWidgetOpacity,
-							dragHandle: grid_data.amsWidgetDragHandle,
-							placeholderClass: grid_data.amsWidgetPlaceholderClass,
-							indicator: grid_data.amsWidgetIndicator,
-							indicatorTime: grid_data.amsWidgetIndicatorTime,
-							ajax: grid_data.amsWidgetAjax,
-							timestampPlaceholder : grid_data.amsWidgetTimestampPlaceholder,
-							timestampFormat : grid_data.amsWidgetTimestampFormat,
-							refreshButton : grid_data.amsWidgetRefreshButton,
-							refreshClass : grid_data.amsWidgetRefreshClass,
-							errorLabel : grid_data.amsWidgetErrorLabel,
-							updatedLabel : grid_data.amsWidgetUpdatedLabel,
-							refreshLabel : grid_data.amsWidgetRefreshLabel,
-							deleteLabel : grid_data.amsWidgetDeleteLabel,
-							afterLoad : ams.getFunctionByName(grid_data.amsWidgetAfterLoadCallback),
-							rtl : grid_data.amsWidgetRtl,
-							onChange : ams.getFunctionByName(grid_data.amsWidgetChangeCallback),
-							onSave : ams.getFunctionByName(grid_data.amsWidgetSaveCallback),
-							ajax_nav : ams.ajax_nav
-						};
+					MyAMSWidget: function(options) {
+						return this.each(function() {
+							var widget = $(this);
+							var data = widget.data('AMSWidget');
+							if (!data) {
+								var grid = widget.parents(options.grid || MyAMSWidget.defaults.grid);
+								var grid_options = {};
+								if (grid.exists()) {
+									var grid_data = grid.data();
+									grid_options = {
+										grid: grid_data.amsWidgetGrid,
+										subgrid: grid_data.amsWidgetSubgrid,
+										controls: grid_data.amsWidgetControls,
+										storage: grid_data.amsWidgetStorage,
+										deleteSettingsKey: grid_data.amsWidgetDeleteSettingsKey,
+										deletePositionKey: grid_data.amsWidgetDeletePositionKey,
+										sortable: grid_data.amsWidgetSortable,
+										hiddenButtons: grid_data.amsWidgetHiddenButtons,
+										toggleButton: grid_data.amsWidgetToggleButton,
+										toggleClass: grid_data.amsWidgetToggleClass,
+										onToggle: ams.getFunctionByName(grid_data.amsWidgetToggleCallback),
+										deleteButton: grid_data.amsWidgetDeleteButton,
+										deleteClass: grid_data.amsWidgetDeleteClass,
+										onDelete: ams.getFunctionByName(grid_data.amsWidgetDeleteCallback),
+										editButton: grid_data.amsWidgetEditButton,
+										editPlaceholder: grid_data.amsWidgetEditPlaceholder,
+										editClass: grid_data.amsWidgetEditClass,
+										onEdit: ams.getFunctionByName(grid_data.amsWidgetEditCallback),
+										fullscreenButton: grid_data.amsWidgetFullscreenButton,
+										fullscreenClass: grid_data.amsWidgetFullscreenClass,
+										fullscreenDiff: grid_data.amsWidgetFullscreenDiff,
+										onFullscreen: ams.getFunctionByName(grid_data.amsWidgetFullscreenCallback),
+										customButton: grid_data.amsWidgetCustomButton,
+										customClass: grid_data.amsWidgetCustomClass,
+										customStart: ams.getFunctionByName(grid_data.amsWidgetCustomStartCallback),
+										customEnd: ams.getFunctionByName(grid_data.amsWidgetCustomStartCallback),
+										buttonsOrder: grid_data.amsWidgetButtonsOrder,
+										opacity: grid_data.amsWidgetOpacity,
+										dragHandle: grid_data.amsWidgetDragHandle,
+										placeholderClass: grid_data.amsWidgetPlaceholderClass,
+										indicator: grid_data.amsWidgetIndicator,
+										indicatorTime: grid_data.amsWidgetIndicatorTime,
+										ajax: grid_data.amsWidgetAjax,
+										timestampPlaceholder: grid_data.amsWidgetTimestampPlaceholder,
+										timestampFormat: grid_data.amsWidgetTimestampFormat,
+										refreshButton: grid_data.amsWidgetRefreshButton,
+										refreshClass: grid_data.amsWidgetRefreshClass,
+										errorLabel: grid_data.amsWidgetErrorLabel,
+										updatedLabel: grid_data.amsWidgetUpdatedLabel,
+										refreshLabel: grid_data.amsWidgetRefreshLabel,
+										deleteLabel: grid_data.amsWidgetDeleteLabel,
+										afterLoad: ams.getFunctionByName(grid_data.amsWidgetAfterLoadCallback),
+										rtl: grid_data.amsWidgetRtl,
+										onChange: ams.getFunctionByName(grid_data.amsWidgetChangeCallback),
+										onSave: ams.getFunctionByName(grid_data.amsWidgetSaveCallback),
+										ajax_nav: ams.ajax_nav
+									};
+								}
+								var settings = $.fn.extend({}, grid_options, widget.data('ams-widget-options') || {}, options);
+								widget.data('AMSWidget', new Widget(widget, settings));
+							}
+						});
 					}
-					var settings = $.fn.extend({}, grid_options, widget.data('ams-widget-options') || {}, options);
-					widget.data('AMSWidget', new Widget(widget, settings));
-				}
-			});
-		}
 
-	});
+				});
 
 })(jQuery, this);