src/ztfy/myams/resources/js/myams-widgets.js
changeset 142 0201f1422bd7
parent 62 2f2dadb6b993
child 206 02a40997d8cb
equal deleted inserted replaced
141:a4200ce41c25 142:0201f1422bd7
     2  * MyAMS extensions for widgets handling
     2  * MyAMS extensions for widgets handling
     3  * Version 0.1.0
     3  * Version 0.1.0
     4  * ©2014 Thierry Florac <tflorac@ulthar.net>
     4  * ©2014 Thierry Florac <tflorac@ulthar.net>
     5  */
     5  */
     6 
     6 
     7 (function($) {
     7 (function($, globals) {
       
     8 
       
     9 	'use strict';
     8 
    10 
     9 	/* Private functions */
    11 	/* Private functions */
    10 	function checkValue(value) {
    12 	function checkValue(value) {
    11 		if (value < 10)
    13 		if (value < 10) {
    12 			value = '0' + value;
    14 			value = '0' + value;
       
    15 		}
    13 		return value;
    16 		return value;
    14 	}
    17 	}
    15 
    18 
    16 	function getPastTimeStamp(value, options) {
    19 	function getPastTimeStamp(value, options) {
    17 		var date = new Date(value);
    20 		var date = new Date(value);
    22 		var minutes = checkValue(date.getMinutes());
    25 		var minutes = checkValue(date.getMinutes());
    23 		var seconds = checkValue(date.getSeconds());
    26 		var seconds = checkValue(date.getSeconds());
    24 		return options.timestampFormat.replace(/%d%/g, day)
    27 		return options.timestampFormat.replace(/%d%/g, day)
    25 									  .replace(/%m%/g, month)
    28 									  .replace(/%m%/g, month)
    26 									  .replace(/%y%/g, year)
    29 									  .replace(/%y%/g, year)
    27 									  .replace(/%h%/g, hour)
    30 									  .replace(/%h%/g, hours)
    28 									  .replace(/%i%/g, minutes)
    31 									  .replace(/%i%/g, minutes)
    29 									  .replace(/%s%/g, seconds);
    32 									  .replace(/%s%/g, seconds);
    30 	}
    33 	}
       
    34 
       
    35 
       
    36 	var MyAMS = globals.MyAMS;
    31 
    37 
    32 
    38 
    33 	function Widget(element, options) {
    39 	function Widget(element, options) {
    34 		this.widget = element;
    40 		this.widget = element;
    35 		this.options = $.extend({}, MyAMSWidget.defaults, options);
    41 		this.options = $.extend({}, MyAMSWidget.defaults, options);
    42 		this.fullscreenClass = this.options.fullscreenClass.split('|');
    48 		this.fullscreenClass = this.options.fullscreenClass.split('|');
    43 		this.customClass = this.options.customClass.split('|');
    49 		this.customClass = this.options.customClass.split('|');
    44 		this.init();
    50 		this.init();
    45 	}
    51 	}
    46 
    52 
    47 
       
    48 	Widget.prototype = {
    53 	Widget.prototype = {
    49 
    54 
    50 		init: function() {
    55 		init: function() {
    51 			var self = this;
    56 			var self = this;
    52 			if (self.options.rtl === true)
    57 			var widget;
       
    58 
       
    59 			if (self.options.rtl === true) {
    53 				$('body').addClass('rtl');
    60 				$('body').addClass('rtl');
       
    61 			}
    54 			self.grid.each(function() {
    62 			self.grid.each(function() {
    55 				$(this).addClass('sortable-grid');
    63 				$(this).addClass('sortable-grid');
    56 			});
    64 			});
    57 			self._getSettings();
    65 			self._getSettings();
    58 			if (self.hasGrid && self.storage) {
    66 			if (self.hasGrid && self.storage) {
       
    67 
       
    68 				var key;
    59 				if (self.position) {
    69 				if (self.position) {
    60 					var position = JSON.parse(self.position);
    70 					var position = JSON.parse(self.position);
    61 					for (var key in position.grid) {
    71 					for (key in position.grid) {
       
    72 						if (!position.grid.hasOwnProperty(key)) {
       
    73 							continue;
       
    74 						}
    62 						var changeOrder = self.grid.find(self.options.subgrid + '.sortable-grid').eq(key);
    75 						var changeOrder = self.grid.find(self.options.subgrid + '.sortable-grid').eq(key);
    63 						for (var key2 in position.grid[key].section)
    76 						for (var key2 in position.grid[key].section) {
       
    77 							if (!position.grid[key].section.hasOwnProperty(key2)) {
       
    78 								continue;
       
    79 							}
    64 							changeOrder.append($('#' + position.grid[key].section[key2].id));
    80 							changeOrder.append($('#' + position.grid[key].section[key2].id));
       
    81 						}
    65 					}
    82 					}
    66 				}
    83 				}
    67 				if (self.settings) {
    84 				if (self.settings) {
    68 					var settings = JSON.parse(self.settings);
    85 					var settings = JSON.parse(self.settings);
    69 					for (var key in settings.widget) {
    86 					for (key in settings.widget) {
    70 						var widget = settings.widget[key];
    87 						if (!settings.widget.hasOwnProperty(key)) {
       
    88 							continue;
       
    89 						}
       
    90 						widget = settings.widget[key];
    71 						var widgetId = $('#' + widget.id);
    91 						var widgetId = $('#' + widget.id);
    72 						if (widget.style)
    92 						if (widget.style) {
    73 							widgetId.removeClassPrefix('ams-widget-color-')
    93 							widgetId.removeClassPrefix('ams-widget-color-')
    74 									.addClass(widget.style)
    94 									.addClass(widget.style)
    75 									.attr('data-widget-attstyle', widget.style);
    95 									.attr('data-widget-attstyle', widget.style);
    76 						if (widget.hidden == 1)
    96 						}
       
    97 						if (widget.hidden === 1) {
    77 							widgetId.hide(1);
    98 							widgetId.hide(1);
    78 						else
    99 						} else {
    79 							widgetId.show(1)
   100 							widgetId.show(1)
    80 									.removeAttr('data-widget-hidden');
   101 									.removeAttr('data-widget-hidden');
    81 						if (widget.collapsed == 1)
   102 						}
       
   103 						if (widget.collapsed === 1) {
    82 							widgetId.addClass('ams-widget-collapsed')
   104 							widgetId.addClass('ams-widget-collapsed')
    83 									.children('div')
   105 									.children('div')
    84 									.hide(1);
   106 									.hide(1);
       
   107 						}
    85 						var title = widgetId.children('header').children('h2');
   108 						var title = widgetId.children('header').children('h2');
    86 						if (title.text() != widget.title)
   109 						if (title.text() !== widget.title) {
    87 							title.text(widget.title);
   110 							title.text(widget.title);
    88 					}
   111 						}
    89 				}
   112 					}
    90 			}
   113 				}
    91 			var widget = self.widget;
   114 			}
       
   115 			widget = self.widget;
    92 			var data = widget.data();
   116 			var data = widget.data();
    93 			var data_options = {
   117 			var data_options = {
    94 				grid: data.amsWidgetGrid,
   118 				grid: data.amsWidgetGrid,
    95 				subgrid: data.amsWudgetSubgrid,
   119 				subgrid: data.amsWudgetSubgrid,
    96 				widgets: data.amsWidgetWidgets,
   120 				widgets: data.amsWidgetWidgets,
   140 				ajax_nav : MyAMS.ajax_nav
   164 				ajax_nav : MyAMS.ajax_nav
   141 			};
   165 			};
   142 			var widgetOptions = $.extend({}, self.options, data_options);
   166 			var widgetOptions = $.extend({}, self.options, data_options);
   143 			var header = widget.children('header');
   167 			var header = widget.children('header');
   144 			if (!header.parent().attr('role')) {
   168 			if (!header.parent().attr('role')) {
   145 				if (data.widgetHidden === true)
   169 
       
   170 				var customBtn,
       
   171 					deleteBtn,
       
   172 					editBtn,
       
   173 					fullscreenBtn,
       
   174 					toggleBtn,
       
   175 					refreshBtn;
       
   176 				if (data.widgetHidden === true) {
   146 					widget.hide();
   177 					widget.hide();
   147 				if (data.widgetCollapsed === true)
   178 				}
       
   179 				if (data.widgetCollapsed === true) {
   148 					widget.addClass('ams-widget-collapsed')
   180 					widget.addClass('ams-widget-collapsed')
   149 						  .children('div').hide();
   181 						  .children('div').hide();
       
   182 				}
   150 				if (widgetOptions.customButton &&
   183 				if (widgetOptions.customButton &&
   151 					(data.widgetCustombutton === undefined) &&
   184 					(data.widgetCustombutton === undefined) &&
   152 					(self.customClass[0].length != 0))
   185 					(self.customClass[0].length !== 0)) {
   153 					var customBtn = '<a href="#" class="button-icon ams-widget-custom-btn"><i class="' + self.customClass[0] + '"></i></a>';
   186 					customBtn = '<a href="#" class="button-icon ams-widget-custom-btn"><i class="' + self.customClass[0] + '"></i></a>';
   154 				else
   187 				} else {
   155 					customBtn = "";
   188 					customBtn = "";
   156 				if (widgetOptions.deleteButton && (data.widgetDeleteButton === undefined))
   189 				}
   157 					var deleteBtn = '<a href="#" class="button-icon ams-widget-delete-btn hint" title="' + MyAMSWidget.i18n.DELETE_BTN + '" data-ams-hint-gravity="se">' +
   190 				if (widgetOptions.deleteButton && (data.widgetDeleteButton === undefined)) {
   158 									'<i class="' + widgetOptions.deleteClass + '"></i></a>';
   191 					deleteBtn = '<a href="#" class="button-icon ams-widget-delete-btn hint" title="' + MyAMSWidget.i18n.DELETE_BTN + '" data-ams-hint-gravity="se">' +
   159 				else
   192 								'<i class="' + widgetOptions.deleteClass + '"></i></a>';
       
   193 				} else {
   160 					deleteBtn = "";
   194 					deleteBtn = "";
       
   195 				}
   161 				if (widgetOptions.editButton && (data.widgetEditButton === undefined)) {
   196 				if (widgetOptions.editButton && (data.widgetEditButton === undefined)) {
   162 					var editClass = widgetOptions.editClass.split('|')[0];
   197 					var editClass = widgetOptions.editClass.split('|')[0];
   163 					var editBtn = '<a href="#" class="button-icon ams-widget-edit-btn hint" title="' + MyAMSWidget.i18n.EDIT_BTN + '" data-ams-hint-gravity="se">' +
   198 					editBtn = '<a href="#" class="button-icon ams-widget-edit-btn hint" title="' + MyAMSWidget.i18n.EDIT_BTN + '" data-ams-hint-gravity="se">' +
   164 								  '<i class="' + editClass + '"></i></a>';
   199 							  '<i class="' + editClass + '"></i></a>';
   165 				} else
   200 				} else {
   166 					editBtn = "";
   201 					editBtn = "";
       
   202 				}
   167 				if (widgetOptions.fullscreenButton && (data.widgetFullscreenButton === undefined)) {
   203 				if (widgetOptions.fullscreenButton && (data.widgetFullscreenButton === undefined)) {
   168 					var fullscreenClass = widgetOptions.fullscreenClass.split('|')[0];
   204 					var fullscreenClass = widgetOptions.fullscreenClass.split('|')[0];
   169 					var fullscreenBtn = '<a href="#" class="button-icon ams-widget-fullscreen-btn hint" title="' + MyAMSWidget.i18n.FULLSCREEN_BTN + '" data-ams-hint-gravity="se">' +
   205 					fullscreenBtn = '<a href="#" class="button-icon ams-widget-fullscreen-btn hint" title="' + MyAMSWidget.i18n.FULLSCREEN_BTN + '" data-ams-hint-gravity="se">' +
   170 										'<i class="' + fullscreenClass + '"></i></a>';
   206 									'<i class="' + fullscreenClass + '"></i></a>';
   171 				} else
   207 				} else {
   172 					fullscreenBtn = "";
   208 					fullscreenBtn = "";
       
   209 				}
   173 				if (widgetOptions.toggleButton && (data.widgetToggleButton === undefined)) {
   210 				if (widgetOptions.toggleButton && (data.widgetToggleButton === undefined)) {
   174 					var toggleClass = widgetOptions.toggleClass.split('|');
   211 					var toggleClass = widgetOptions.toggleClass.split('|');
       
   212 					var toggleSettings;
   175 					if ((widget.dataWidgetCollapsed === true) ||
   213 					if ((widget.dataWidgetCollapsed === true) ||
   176 						widget.hasClass('ams-widget-collapsed'))
   214 						widget.hasClass('ams-widget-collapsed')) {
   177 						var toggleSettings = toggleClass[1];
   215 						toggleSettings = toggleClass[1];
   178 					else
   216 					} else {
   179 						toggleSettings = toggleClass[0];
   217 						toggleSettings = toggleClass[0];
   180 					var toggleBtn = '<a href="#" class="button-icon ams-widget-toggle-btn hint" title="' + MyAMSWidget.i18n.COLLAPSE_BTN + '" data-ams-hint-gravity="se">' +
   218 					}
   181 									'<i class="' + toggleSettings + '"></i></a>';
   219 					toggleBtn = '<a href="#" class="button-icon ams-widget-toggle-btn hint" title="' + MyAMSWidget.i18n.COLLAPSE_BTN + '" data-ams-hint-gravity="se">' +
   182 				} else
   220 								'<i class="' + toggleSettings + '"></i></a>';
       
   221 				} else {
   183 					toggleBtn = "";
   222 					toggleBtn = "";
       
   223 				}
   184 				if (widgetOptions.refreshButton &&
   224 				if (widgetOptions.refreshButton &&
   185 					(data.widgetRefreshButton === undefined) &&
   225 					(data.widgetRefreshButton === undefined) &&
   186 					data.widgetLoad)
   226 					data.widgetLoad) {
   187 					var 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">' +
   227 					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">' +
   188 									 '<i class="' + widgetOptions.refreshClass + '"></i></a>';
   228 								 '<i class="' + widgetOptions.refreshClass + '"></i></a>';
   189 				else
   229 				} else {
   190 					refreshBtn = "";
   230 					refreshBtn = "";
       
   231 				}
   191 				var buttons = widgetOptions.buttonsOrder.replace(/%refresh%/, refreshBtn)
   232 				var buttons = widgetOptions.buttonsOrder.replace(/%refresh%/, refreshBtn)
   192 														 .replace(/%custom%/, customBtn)
   233 														 .replace(/%custom%/, customBtn)
   193 														 .replace(/%edit%/, editBtn)
   234 														 .replace(/%edit%/, editBtn)
   194 														 .replace(/%toggle%/, toggleBtn)
   235 														 .replace(/%toggle%/, toggleBtn)
   195 														 .replace(/%fullscreen%/, fullscreenBtn)
   236 														 .replace(/%fullscreen%/, fullscreenBtn)
   196 														 .replace(/%delete%/, deleteBtn);
   237 														 .replace(/%delete%/, deleteBtn);
   197 				if (refreshBtn || customBtn || editBtn || toggleBtn || fullscreenBtn || deleteBtn)
   238 				if (refreshBtn || customBtn || editBtn || toggleBtn || fullscreenBtn || deleteBtn) {
   198 					header.prepend('<div class="ams-widget-ctrls">' + buttons + '</div>');
   239 					header.prepend('<div class="ams-widget-ctrls">' + buttons + '</div>');
   199 				if (widgetOptions.sortable && (data.widgetSortable === undefined))
   240 				}
       
   241 				if (widgetOptions.sortable && (data.widgetSortable === undefined)) {
   200 					widget.addClass('ams-widget-sortable');
   242 					widget.addClass('ams-widget-sortable');
       
   243 				}
   201 				var placeholder = widget.find(widgetOptions.editPlaceholder);
   244 				var placeholder = widget.find(widgetOptions.editPlaceholder);
   202 				if (placeholder.length > 0)
   245 				if (placeholder.length > 0) {
   203 					placeholder.find('input').val($.trim(header.children('h2').text()));
   246 					placeholder.find('input').val($.trim(header.children('h2').text()));
       
   247 				}
   204 				header.append('<span class="ams-widget-loader"><i class="fa fa-refresh fa-spin"></i></span>');
   248 				header.append('<span class="ams-widget-loader"><i class="fa fa-refresh fa-spin"></i></span>');
   205 				widget.attr('role', 'widget')
   249 				widget.attr('role', 'widget')
   206 					  .children('div').attr('role', 'content')
   250 					  .children('div').attr('role', 'content')
   207 					  .prev('header').attr('role', 'heading')
   251 					  .prev('header').attr('role', 'heading')
   208 					  .children('div').attr('role', 'menu');
   252 					  .children('div').attr('role', 'menu');
   209 				MyAMS.plugins.enabled.hint(header);
   253 				MyAMS.plugins.enabled.hint(header);
   210 			}
   254 			}
   211 			widget.data('widget-options', widgetOptions);
   255 			widget.data('widget-options', widgetOptions);
   212 			if (self.options.hiddenButtons)
   256 			if (self.options.hiddenButtons) {
   213 				$(self.controls).hide();
   257 				$(self.controls).hide();
       
   258 			}
   214 			widget.find("[data-widget-load]").each(function() {
   259 			widget.find("[data-widget-load]").each(function() {
   215 				var item = $(this),
   260 				var item = $(this),
   216 					header = item.children(),
   261 					header = item.children(),
   217 					path = item.data('widget-load'),
   262 					path = item.data('widget-load'),
   218 					reloadTime = item.data('widget-refresh') * 1000,
   263 					reloadTime = item.data('widget-refresh') * 1000,
   222 					if (reloadTime > 0) {
   267 					if (reloadTime > 0) {
   223 						self.loadAjaxFile(item, path, header);
   268 						self.loadAjaxFile(item, path, header);
   224 						setInterval(function() {
   269 						setInterval(function() {
   225 							self._loadAjaxFile(item, path, header);
   270 							self._loadAjaxFile(item, path, header);
   226 						}, reloadTime);
   271 						}, reloadTime);
   227 					} else
   272 					} else {
   228 						self._loadAjaxFile(item, path, header);
   273 						self._loadAjaxFile(item, path, header);
       
   274 					}
   229 				}
   275 				}
   230 			});
   276 			});
   231 			if (self.options.hiddenButtons) {
   277 			if (self.options.hiddenButtons) {
   232 				self.widget.children('header').hover(function() {
   278 				self.widget.children('header').hover(function() {
   233 					$(this).children(self.controls).stop(true, true).fadeTo(100, 1);
   279 					$(this).children(self.controls).stop(true, true).fadeTo(100, 1);
   235 					$(this).children(self.controls).stop(true, true).fadeTo(100, 0);
   281 					$(this).children(self.controls).stop(true, true).fadeTo(100, 0);
   236 				});
   282 				});
   237 			}
   283 			}
   238 			self._setClickEvents();
   284 			self._setClickEvents();
   239 			$(self.options.deleteSettingsKey).on(self.clickEvent, this, function(e) {
   285 			$(self.options.deleteSettingsKey).on(self.clickEvent, this, function(e) {
   240 				if (self.storage) {
   286 				if (self.storage && globals.confirm) {
   241 					var cleared = confirm(self.options.settingsKeyLabel);
   287 					var cleared = globals.confirm(self.options.settingsKeyLabel);
   242 					if (cleared)
   288 					if (cleared) {
   243 						self.storage.removeItem(self.settingsKey);
   289 						self.storage.removeItem(self.settingsKey);
       
   290 					}
   244 				}
   291 				}
   245 				e.preventDefault();
   292 				e.preventDefault();
   246 			});
   293 			});
   247 			$(self.options.deletePositionKey).on(self.clickEvent, this, function(e) {
   294 			$(self.options.deletePositionKey).on(self.clickEvent, this, function(e) {
   248 				if (self.storage) {
   295 				if (self.storage && globals.confirm) {
   249 					var cleared = confirm(self.options.positionKeyLabel);
   296 					var cleared = globals.confirm(self.options.positionKeyLabel);
   250 					if (cleared)
   297 					if (cleared) {
   251 						self.storage.removeItem(self.positionKey);
   298 						self.storage.removeItem(self.positionKey);
       
   299 					}
   252 				}
   300 				}
   253 				e.preventDefault();
   301 				e.preventDefault();
   254 			});
   302 			});
   255 			if (self.storage) {
   303 			if (self.storage) {
   256 				if (self.settingsKey === null || self.settingsKey.length < 1)
   304 				if (self.settingsKey === null || self.settingsKey.length < 1) {
   257 					self._saveWidgetSettings();
   305 					self._saveWidgetSettings();
   258 				if (self.positionKey === null || self.positionKey.length < 1)
   306 				}
       
   307 				if (self.positionKey === null || self.positionKey.length < 1) {
   259 					self._saveWidgetPosition();
   308 					self._saveWidgetPosition();
       
   309 				}
   260 			}
   310 			}
   261 			self.grid.data('ams-widgets-loaded', true);
   311 			self.grid.data('ams-widgets-loaded', true);
   262 		},
   312 		},
   263 
   313 
   264 		destroy: function() {
   314 		destroy: function() {
   267 			self.element.removeData('AMSWidget');
   317 			self.element.removeData('AMSWidget');
   268 		},
   318 		},
   269 
   319 
   270 		_getSettings: function() {
   320 		_getSettings: function() {
   271 			var self = this;
   321 			var self = this;
   272 			if (!self.hasGrid || !self.gridId)
   322 			if (!self.hasGrid || !self.gridId) {
   273 				self.storage = null;
   323 				self.storage = null;
   274 			else {
   324 			} else {
   275 				switch (self.options.storage) {
   325 				switch (self.options.storage) {
   276 					case 'local':
   326 					case 'local':
   277 						self.storage = localStorage;
   327 						self.storage = localStorage;
   278 						break;
   328 						break;
   279 					case 'session':
   329 					case 'session':
   281 						break;
   331 						break;
   282 					default:
   332 					default:
   283 						self.storage = null;
   333 						self.storage = null;
   284 				}
   334 				}
   285 			}
   335 			}
   286 			var use_storage = (self.storage != null) && function() {
   336 			var use_storage = (self.storage !== null) && function() {
   287 				var result,
   337 				var result,
   288 					uid = +new Date;
   338 					uid = +new Date();
   289 				try {
   339 				try {
   290 					self.storage.setItem(uid, uid);
   340 					self.storage.setItem(uid, uid);
   291 					result = self.storage.getItem(uid) == uid;
   341 					result = self.storage.getItem(uid) === uid;
   292 					self.storage.removeItem(uid);
   342 					self.storage.removeItem(uid);
   293 					return result
   343 					return result;
   294 				} catch (e) {}
   344 				} catch (e) {}
   295 			}();
   345 			}();
   296 			if (use_storage) {
   346 			if (use_storage) {
   297 				self.settingsKey = "AMS_settings_" + location.pathname + location.hash + "_" + self.gridId;
   347 				self.settingsKey = "AMS_settings_" + location.pathname + location.hash + "_" + self.gridId;
   298 				self.settings = self.storage.getItem(self.settingsKey);
   348 				self.settings = self.storage.getItem(self.settingsKey);
   299 				self.positionKey = "AMS_position_" + location.pathname + location.hash + "_" + self.gridId;
   349 				self.positionKey = "AMS_position_" + location.pathname + location.hash + "_" + self.gridId;
   300 				self.position = self.storage.getItem(self.positionKey);
   350 				self.position = self.storage.getItem(self.positionKey);
   301 			}
   351 			}
   302 			if (("ontouchstart" in window) || window.DocumentTouch && document instanceof DocumentTouch) {
   352 			if (("ontouchstart" in globals) ||
   303 				self.clickEvent = "touchstart"
   353 				globals.DocumentTouch && globals.document instanceof globals.DocumentTouch) {
       
   354 				self.clickEvent = "touchstart";
   304 			} else {
   355 			} else {
   305 				self.clickEvent = "click"
   356 				self.clickEvent = "click";
   306 			}
   357 			}
   307 		},
   358 		},
   308 
   359 
   309 		_runLoaderWidget: function(widget) {
   360 		_runLoaderWidget: function(widget) {
   310 			var self = this;
   361 			var self = this;
   311 			if (self.options.indicator)
   362 			if (self.options.indicator) {
   312 				widget.find('.ams-widget-loader')
   363 				widget.find('.ams-widget-loader')
   313 					  .stop(true, true)
   364 					  .stop(true, true)
   314 					  .fadeIn(100)
   365 					  .fadeIn(100)
   315 					  .delay(self.options.indicatorTime)
   366 					  .delay(self.options.indicatorTime)
   316 					  .fadeOut(100);
   367 					  .fadeOut(100);
       
   368 			}
   317 		},
   369 		},
   318 
   370 
   319 		_loadAjaxFile: function(url, widget, loader) {
   371 		_loadAjaxFile: function(url, widget, loader) {
   320 			MyAMS.skin.loadURL(url, widget.find('.widget-body'));
   372 			MyAMS.skin.loadURL(url, widget.find('.widget-body'));
   321 		},
   373 		},
   334 					widgetSettings.hidden = widget.is(':hidden') ? 1 : 0;
   386 					widgetSettings.hidden = widget.is(':hidden') ? 1 : 0;
   335 					widgetSettings.collapsed = widget.hasClass('ams-widget-collapsed') ? 1 : 0;
   387 					widgetSettings.collapsed = widget.hasClass('ams-widget-collapsed') ? 1 : 0;
   336 					gridSettings.push(widgetSettings);
   388 					gridSettings.push(widgetSettings);
   337 				});
   389 				});
   338 				var gridSettingsStr = JSON.stringify({widget: gridSettings});
   390 				var gridSettingsStr = JSON.stringify({widget: gridSettings});
   339 				if (self.settings != gridSettingsStr)
   391 				if (self.settings !== gridSettingsStr) {
   340 					self.storage.setItem(self.settingsKey, gridSettingsStr);
   392 					self.storage.setItem(self.settingsKey, gridSettingsStr);
   341 				if (typeof(self.options.onSave) == 'function')
   393 				}
       
   394 				if (typeof(self.options.onSave) === 'function') {
   342 					self.options.onSave.call(this, null, gridSettings);
   395 					self.options.onSave.call(this, null, gridSettings);
       
   396 				}
   343 			}
   397 			}
   344 		},
   398 		},
   345 
   399 
   346 		_saveWidgetPosition: function() {
   400 		_saveWidgetPosition: function() {
   347 			var self = this;
   401 			var self = this;
   351 				self.grid.find(self.options.subgrid + ".sortable-grid").each(function () {
   405 				self.grid.find(self.options.subgrid + ".sortable-grid").each(function () {
   352 					var subgridPosition = [];
   406 					var subgridPosition = [];
   353 					$(this).children(self.options.widgets).each(function () {
   407 					$(this).children(self.options.widgets).each(function () {
   354 						var subObj = {};
   408 						var subObj = {};
   355 						subObj.id = $(this).attr("id");
   409 						subObj.id = $(this).attr("id");
   356 						subgridPosition.push(subObj)
   410 						subgridPosition.push(subObj);
   357 					});
   411 					});
   358 					var out = {section: subgridPosition};
   412 					var out = {section: subgridPosition};
   359 					gridPosition.push(out)
   413 					gridPosition.push(out);
   360 				});
   414 				});
   361 				var gridPositionStr = JSON.stringify({grid: gridPosition});
   415 				var gridPositionStr = JSON.stringify({grid: gridPosition});
   362 				if (self.position != gridPositionStr)
   416 				if (self.position !== gridPositionStr) {
   363 					self.storage.setItem(self.positionKey, gridPositionStr);
   417 					self.storage.setItem(self.positionKey, gridPositionStr);
   364 				if (typeof(self.options.onSave) == 'function')
   418 				}
       
   419 				if (typeof(self.options.onSave) === 'function') {
   365 					self.options.onSave.call(this, null, gridPosition);
   420 					self.options.onSave.call(this, null, gridPosition);
       
   421 				}
   366 			}
   422 			}
   367 		},
   423 		},
   368 
   424 
   369 		_setClickEvents: function() {
   425 		_setClickEvents: function() {
   370 
   426 
   371 			function setFullscreenHeight() {
   427 			function setFullscreenHeight() {
   372 				if ($('#ams-widget-fullscreen-mode').length > 0) {
   428 				var mode = $('#ams-widget-fullscreen-mode');
   373 					var widgets = $('#ams-widget-fullscreen-mode').find(self.options.widgets);
   429 				if (mode.length > 0) {
       
   430 					var widgets = mode.find(self.options.widgets);
   374 					var windowHeight = $(window).height();
   431 					var windowHeight = $(window).height();
   375 					var headerHeight = widgets.children('header')
   432 					var headerHeight = widgets.children('header')
   376 											  .height();
   433 											  .height();
   377 					widgets.children('div')
   434 					widgets.children('div')
   378 						   .height(windowHeight - headerHeight - 15);
   435 						   .height(windowHeight - headerHeight - 15);
   384 
   441 
   385 			// Toggle button
   442 			// Toggle button
   386 			self.widget.on(self.clickEvent, '.ams-widget-toggle-btn', function(e) {
   443 			self.widget.on(self.clickEvent, '.ams-widget-toggle-btn', function(e) {
   387 				e.preventDefault();
   444 				e.preventDefault();
   388 				var button = $(this);
   445 				var button = $(this);
   389 				var widget = button.parents(self.options.widgets);
   446 				var widget = button.parents(self.options.widgets).first();
   390 				var widgetOptions = widget.data('widget-options');
   447 				var widgetOptions = widget.data('widget-options');
   391 				var toggleClass = widgetOptions.toggleClass.split('|');
   448 				var toggleClass = widgetOptions.toggleClass.split('|');
   392 				self._runLoaderWidget(widget);
   449 				self._runLoaderWidget(widget);
   393 				var canToggle = true;
   450 				var canToggle = true;
   394 				if (widget.hasClass('ams-widget-collapsed')) {
   451 				if (widget.hasClass('ams-widget-collapsed')) {
   395 					if (widgetOptions.onToggle)
   452 					if (widgetOptions.onToggle) {
   396 						canToggle = widgetOptions.onToggle.call(this, widget, 'expand');
   453 						canToggle = widgetOptions.onToggle.call(this, widget, 'expand');
       
   454 					}
   397 					if (canToggle !== false) {
   455 					if (canToggle !== false) {
   398 						button.children().removeClass(toggleClass[1])
   456 						button.children().removeClass(toggleClass[1])
   399 										 .addClass(toggleClass[0]);
   457 										 .addClass(toggleClass[0]);
   400 						widget.removeClass('ams-widget-collapsed')
   458 						widget.removeClass('ams-widget-collapsed')
   401 							  .children('[role=content]').slideDown(widgetOptions.toggleSpeed, function() {
   459 							  .children('[role=content]').slideDown(widgetOptions.toggleSpeed, function() {
   402 									self._saveWidgetSettings();
   460 									self._saveWidgetSettings();
   403 							  });
   461 							  });
   404 					}
   462 					}
   405 				} else {
   463 				} else {
   406 					if (widgetOptions.onToggle)
   464 					if (widgetOptions.onToggle) {
   407 						canToggle = widgetOptions.onToggle.call(this, widget, 'collapse');
   465 						canToggle = widgetOptions.onToggle.call(this, widget, 'collapse');
       
   466 					}
   408 					if (canToggle !== false) {
   467 					if (canToggle !== false) {
   409 						button.children().removeClass(toggleClass[0])
   468 						button.children().removeClass(toggleClass[0])
   410 										 .addClass(toggleClass[1]);
   469 										 .addClass(toggleClass[1]);
   411 						widget.addClass('ams-widget-collapsed')
   470 						widget.addClass('ams-widget-collapsed')
   412 							  .children('[role=content]').slideUp(widgetOptions.toggleSpeed, function() {
   471 							  .children('[role=content]').slideUp(widgetOptions.toggleSpeed, function() {
   439 						  .removeClass(fullscreenClass[1])
   498 						  .removeClass(fullscreenClass[1])
   440 						  .addClass(fullscreenClass[0])
   499 						  .addClass(fullscreenClass[0])
   441 						  .parents(self.controls)
   500 						  .parents(self.controls)
   442 						  .children('a')
   501 						  .children('a')
   443 						  .show();
   502 						  .show();
   444 					if (content.hasClass('ams-widget-visible'))
   503 					if (content.hasClass('ams-widget-visible')) {
   445 						content.hide()
   504 						content.hide()
   446 							   .removeClass('ams-widget-visible');
   505 							   .removeClass('ams-widget-visible');
       
   506 					}
   447 				} else {
   507 				} else {
   448 					$('body').addClass('nooverflow');
   508 					$('body').addClass('nooverflow');
   449 					widget.wrap('<div id="ams-widget-fullscreen-mode"></div>')
   509 					widget.wrap('<div id="ams-widget-fullscreen-mode"></div>')
   450 						  .parent()
   510 						  .parent()
   451 						  .find('.ams-widget-fullscreen-btn')
   511 						  .find('.ams-widget-fullscreen-btn')
   453 						  .removeClass(fullscreenClass[0])
   513 						  .removeClass(fullscreenClass[0])
   454 						  .addClass(fullscreenClass[1])
   514 						  .addClass(fullscreenClass[1])
   455 						  .parents(self.controls)
   515 						  .parents(self.controls)
   456 						  .children('a:not(.ams-widget-fullscreen-btn)')
   516 						  .children('a:not(.ams-widget-fullscreen-btn)')
   457 						  .hide();
   517 						  .hide();
   458 					if (content.is(':hidden'))
   518 					if (content.is(':hidden')) {
   459 						content.show()
   519 						content.show()
   460 							   .addClass('ams-widget-visible');
   520 							   .addClass('ams-widget-visible');
       
   521 					}
   461 				}
   522 				}
   462 				setFullscreenHeight();
   523 				setFullscreenHeight();
   463 				if (typeof(widgetOptions.onFullscreen) == 'function')
   524 				if (typeof(widgetOptions.onFullscreen) === 'function') {
   464 					widgetOptions.onFullscreen.call(this, widget);
   525 					widgetOptions.onFullscreen.call(this, widget);
       
   526 				}
   465 			});
   527 			});
   466 			$(window).resize(function() {
   528 			$(window).resize(function() {
   467 				setFullscreenHeight();
   529 				setFullscreenHeight();
   468 			});
   530 			});
   469 
   531 
   487 					button.children()
   549 					button.children()
   488 						  .removeClass(editClass[0])
   550 						  .removeClass(editClass[0])
   489 						  .addClass(editClass[1]);
   551 						  .addClass(editClass[1]);
   490 					placeholder.slideDown(widgetOptions.editSpeed);
   552 					placeholder.slideDown(widgetOptions.editSpeed);
   491 				}
   553 				}
   492 				if (typeof(widgetOptions.onEdit) == 'function')
   554 				if (typeof(widgetOptions.onEdit) === 'function') {
   493 					widgetOptions.onEdit.call(this, widget);
   555 					widgetOptions.onEdit.call(this, widget);
       
   556 				}
   494 			});
   557 			});
   495 			$(self.options.editPlaceholder).find('input').keyup(function() {
   558 			$(self.options.editPlaceholder).find('input').keyup(function() {
   496 				$(this).parents(self.options.widgets)
   559 				$(this).parents(self.options.widgets)
   497 					   .children('header')
   560 					   .children('header')
   498 					   .children('h2')
   561 					   .children('h2')
   509 				self._runLoaderWidget(widget);
   572 				self._runLoaderWidget(widget);
   510 				if (button.children('.' + customClass[0]).length > 0) {
   573 				if (button.children('.' + customClass[0]).length > 0) {
   511 					button.children()
   574 					button.children()
   512 						  .removeClass(customClass[0])
   575 						  .removeClass(customClass[0])
   513 						  .addClass(customClass[1]);
   576 						  .addClass(customClass[1]);
   514 					if (typeof(widgetOptions.customStart) == 'function')
   577 					if (typeof(widgetOptions.customStart) === 'function') {
   515 						widgetOptions.customStart.call(this, widget);
   578 						widgetOptions.customStart.call(this, widget);
       
   579 					}
   516 				} else {
   580 				} else {
   517 					button.children('.' + customClass[1])
   581 					button.children('.' + customClass[1])
   518 						  .addClass(customClass[0]);
   582 							.addClass(customClass[0]);
   519 					if (typeof(widgetOptions.customEnd) == 'function')
   583 					if (typeof(widgetOptions.customEnd) === 'function') {
   520 						widgetOptions.customEnd.call(this, widget);
   584 						widgetOptions.customEnd.call(this, widget);
       
   585 					}
   521 				}
   586 				}
   522 				self._saveWidgetSettings();
   587 				self._saveWidgetSettings();
   523 			});
   588 			});
   524 
   589 
   525 			// Delete button
   590 			// Delete button
   536 										MyAMS.notify.messageBox({
   601 										MyAMS.notify.messageBox({
   537 											title: '<i class="fa fa-times" style="color: #ed1c24;"></i> ' + widgetOptions.deleteLabel + ' "' + title + '"',
   602 											title: '<i class="fa fa-times" style="color: #ed1c24;"></i> ' + widgetOptions.deleteLabel + ' "' + title + '"',
   538 											content: MyAMSWidget.i18n.DELETE_MSG,
   603 											content: MyAMSWidget.i18n.DELETE_MSG,
   539 											buttons: "[" + MyAMS.i18n.BTN_OK + "][" + MyAMS.i18n.BTN_CANCEL + "]"
   604 											buttons: "[" + MyAMS.i18n.BTN_OK + "][" + MyAMS.i18n.BTN_CANCEL + "]"
   540 										}, function(buttonPressed) {
   605 										}, function(buttonPressed) {
   541 											if (buttonPressed == MyAMS.i18n.BTN_OK) {
   606 											if (buttonPressed === MyAMS.i18n.BTN_OK) {
   542 												self._runLoaderWidget(widget);
   607 												self._runLoaderWidget(widget);
   543 												$('#' + wId).fadeOut(widgetOptions.deleteSpeed, function() {
   608 												$('#' + wId).fadeOut(widgetOptions.deleteSpeed, function() {
   544 													button.remove();
   609 													button.remove();
   545 													if (typeof(widgetOptions.onDelete) == 'function')
   610 													if (typeof(widgetOptions.onDelete) === 'function') {
   546 														widgetOptions.onDelete.call(this, widget);
   611 														widgetOptions.onDelete.call(this, widget);
       
   612 													}
   547 												});
   613 												});
   548 											}
   614 											}
   549 										});
   615 										});
   550 								   });
   616 								   });
   551 			});
   617 			});
   564 					loader.removeClass('widget-body-ajax-loading');
   630 					loader.removeClass('widget-body-ajax-loading');
   565 					self._loadAjaxFile(widget, path, loader);
   631 					self._loadAjaxFile(widget, path, loader);
   566 				}, 1000);
   632 				}, 1000);
   567 			});
   633 			});
   568 		}
   634 		}
   569 	}
   635 	};
   570 
   636 
   571 
   637 
   572 	MyAMSWidget = {
   638 	var MyAMSWidget = {
   573 
   639 
   574 		i18n: $.extend({
   640 		i18n: $.extend({
   575 			SETTINGS_KEY_LABEL: "Reset settings?",
   641 			SETTINGS_KEY_LABEL: "Reset settings?",
   576 			POSITION_KEY_LABEL: "Reset position?",
   642 			POSITION_KEY_LABEL: "Reset position?",
   577 			TIMESTAMP_FORMAT: "Last update: %d%/%m%/%y% %h%:%i%:%s",
   643 			TIMESTAMP_FORMAT: "Last update: %d%/%m%/%y% %h%:%i%:%s",
   587 			REFRESH_BTN: "Reload content",
   653 			REFRESH_BTN: "Reload content",
   588 			LOADING_MSG: "Loading..."
   654 			LOADING_MSG: "Loading..."
   589 		}, MyAMS.plugins.i18n.widgets),
   655 		}, MyAMS.plugins.i18n.widgets),
   590 
   656 
   591 		initWidgetsGrid: function(grid) {
   657 		initWidgetsGrid: function(grid) {
   592 			if (!grid.exists())
   658 			if (!grid.exists()) {
   593 				return;
   659 				return;
       
   660 			}
   594 			var options = $('.ams-widget:first', grid).data('AMSWidget').options;
   661 			var options = $('.ams-widget:first', grid).data('AMSWidget').options;
   595 			if (options.sortable && $.ui) {
   662 			if (options.sortable && $.ui) {
   596 				var sortItem = grid.find('.sortable-grid').not("[data-widget-excludegrid]");
   663 				var sortItem = grid.find('.sortable-grid').not("[data-widget-excludegrid]");
   597 				sortItem.sortable({
   664 				sortItem.sortable({
   598 					items: sortItem.find('.ams-widget-sortable'),
   665 					items: sortItem.find('.ams-widget-sortable'),
   609 					forceHelperSize: true,
   676 					forceHelperSize: true,
   610 					update: function(event, ui) {
   677 					update: function(event, ui) {
   611 						var widget = ui.item.data('AMSWidget');
   678 						var widget = ui.item.data('AMSWidget');
   612 						widget._runLoaderWidget(widget.widget);
   679 						widget._runLoaderWidget(widget.widget);
   613 						widget._saveWidgetPosition();
   680 						widget._saveWidgetPosition();
   614 						if (typeof(options.onChange) == 'function')
   681 						if (typeof(options.onChange) === 'function') {
   615 							options.onChange.call(this, ui.item);
   682 							options.onChange.call(this, ui.item);
       
   683 						}
   616 					}
   684 					}
   617 				});
   685 				});
   618 			}
   686 			}
   619 		}
   687 		}
   620 	}
   688 	};
   621 
       
   622 
   689 
   623 	MyAMSWidget.defaults = {
   690 	MyAMSWidget.defaults = {
   624 		grid: '.ams-widget-grid',
   691 		grid: '.ams-widget-grid',
   625 		subgrid: 'section',
   692 		subgrid: 'section',
   626 		widgets: '.ams-widget',
   693 		widgets: '.ams-widget',
   677 		afterLoad : null,
   744 		afterLoad : null,
   678 		rtl : false,
   745 		rtl : false,
   679 		onChange : null,
   746 		onChange : null,
   680 		onSave : null,
   747 		onSave : null,
   681 		ajax_nav : MyAMS.ajax_nav
   748 		ajax_nav : MyAMS.ajax_nav
   682 	}
   749 	};
       
   750 
       
   751 	globals.MyAMSWidget = MyAMSWidget;
   683 
   752 
   684 
   753 
   685 	$.fn.extend({
   754 	$.fn.extend({
   686 
   755 
   687 		MyAMSWidget: function(options) {
   756 		MyAMSWidget: function(options) {
   748 			});
   817 			});
   749 		}
   818 		}
   750 
   819 
   751 	});
   820 	});
   752 
   821 
   753 })(jQuery);
   822 })(jQuery, this);