src/pyams_content/zmi/resources/js/pyams_content.js
changeset 1070 ea0c7ac589c4
parent 1004 ca57b160d863
child 1072 82860da48dbb
equal deleted inserted replaced
1069:abd11be23718 1070:ea0c7ac589c4
       
     1 (function($, globals) {
       
     2 
       
     3 	"use strict";
       
     4 
       
     5 	var MyAMS = globals.MyAMS;
       
     6 
       
     7 	var PyAMS_content = {
       
     8 
       
     9 		/**
       
    10 		 * Custom widgets management
       
    11 		 */
       
    12 		widget: {
       
    13 
       
    14 			/** Treeview widget */
       
    15 			treeview: {
       
    16 
       
    17 				selectFolder: function(event, node) {
       
    18 					var target = $(event.target);
       
    19 					target.siblings('input[type="hidden"]').val(node.id);
       
    20 				},
       
    21 
       
    22 				unselectFolder: function(event, node) {
       
    23 					var target = $(event.target);
       
    24 					target.siblings('input[type="hidden"]').val(null);
       
    25 				}
       
    26 			}
       
    27 		},
       
    28 
       
    29 		/**
       
    30 		 * TinyMCE editor configuration
       
    31 		 */
       
    32 		TinyMCE: {
       
    33 
       
    34 			initEditor: function(settings) {
       
    35 
       
    36 				// Update TinyMCE translations
       
    37 				tinyMCE.addI18n('fr', {
       
    38 					"Link list": "Liste de liens",
       
    39 					"Toggle h3 header": "En-tête H3",
       
    40 					"Toggle h4 header": "En-tête H4",
       
    41 					"Insert internal link": "Insérer un lien interne",
       
    42 					"Link title": "Texte à afficher",
       
    43 					"Internal number": "N° interne"
       
    44 				});
       
    45 
       
    46 				// Declare internal link input plug-in
       
    47 				tinymce.PluginManager.add('internal_links', function(editor, url) {
       
    48 					editor.addButton('internal_links', {
       
    49 						icon: 'cloud-check',
       
    50 						tooltip: "Insert internal link",
       
    51 						image: '/--static--/pyams_content/img/internal-link.png',
       
    52 						onclick: function() {
       
    53 							editor.windowManager.open({
       
    54 								title: "Insert internal link",
       
    55 								body: [
       
    56 									{
       
    57 										type: 'textbox',
       
    58 										name: 'oid',
       
    59 										label:'Internal number'
       
    60 									}, {
       
    61 										type: 'textbox',
       
    62 										name: 'title',
       
    63 										label: 'Link title',
       
    64 										value: editor.selection.getContent()
       
    65 									}
       
    66 								],
       
    67 								onsubmit: function(e) {
       
    68 									editor.insertContent('<a href="oid://' + e.data.oid + '">' + e.data.title + '</a>');
       
    69 								}
       
    70 							});
       
    71 						}
       
    72 					})
       
    73 				});
       
    74 
       
    75 				// Declare direct H3 and H4 style formatter
       
    76 				tinyMCE.PluginManager.add('headers', function (editor, url) {
       
    77 					['h3', 'h4'].forEach(function (name) {
       
    78 						editor.addButton("header-" + name, {
       
    79 							tooltip: "Toggle " + name + " header",
       
    80 							text: name.toUpperCase(),
       
    81 							onClick: function () {
       
    82 								editor.execCommand('mceToggleFormat', false, name);
       
    83 							},
       
    84 							onPostRender: function () {
       
    85 								var self = this,
       
    86 									setup = function () {
       
    87 										editor.formatter.formatChanged(name, function (state) {
       
    88 											self.active(state);
       
    89 										});
       
    90 									};
       
    91 								editor.formatter ? setup() : editor.on('init', setup);
       
    92 							}
       
    93 						})
       
    94 					});
       
    95 				});
       
    96 
       
    97 				// Update TinyMCE settings
       
    98 				settings.image_list = PyAMS_content.TinyMCE.getImagesList;
       
    99 				settings.link_list = PyAMS_content.TinyMCE.getLinksList;
       
   100 				settings.style_formats = [
       
   101 					{
       
   102 						title: 'Inline',
       
   103 						items: [
       
   104 							{title: 'Bold', icon: 'bold', format: 'bold'},
       
   105 							{title: 'Italic', icon: 'italic', format: 'italic'},
       
   106 							{title: 'Underline', icon: 'underline', format: 'underline'},
       
   107 							{title: 'Strikethrough', icon: 'strikethrough', format: 'strikethrough'},
       
   108 							{title: 'Superscript', icon: 'superscript', format: 'superscript'},
       
   109 							{title: 'Subscript', icon: 'subscript', format: 'subscript'},
       
   110 							{title: 'Code', icon: 'code', format: 'code'}
       
   111 						]
       
   112 					},
       
   113 					{
       
   114 						title: 'Blocks',
       
   115 						items: [
       
   116 							{title: 'Paragraph', format: 'p'},
       
   117 							{title: 'Blockquote', format: 'blockquote'},
       
   118 							{title: 'Div', format: 'div'},
       
   119 							{title: 'Pre', format: 'pre'}
       
   120 						]
       
   121 					},
       
   122 					{
       
   123 						title: 'Alignment',
       
   124 						items: [
       
   125 							{title: 'Left', icon: 'alignleft', format: 'alignleft'},
       
   126 							{title: 'Center', icon: 'aligncenter', format: 'aligncenter'},
       
   127 							{title: 'Right', icon: 'alignright', format: 'alignright'},
       
   128 							{title: 'Justify', icon: 'alignjustify', format: 'alignjustify'}
       
   129 						]
       
   130 					}
       
   131 				];
       
   132 				settings.plugins += ' internal_links headers';
       
   133 				if (settings.toolbar1) {
       
   134 					settings.toolbar1 = "undo redo | header-h3 header-h4 styleselect | bold italic | " +
       
   135 										"alignleft aligncenter alignright alignjustify | bullist numlist outdent indent";
       
   136 				}
       
   137 				if (settings.toolbar2) {
       
   138 					settings.toolbar2 = "forecolor backcolor | charmap internal_links link | fullscreen preview print | code";
       
   139 				}
       
   140 				return settings;
       
   141 			},
       
   142 
       
   143 			getImagesList: function(callback) {
       
   144 				var form = $(document.activeElement).parents('form');
       
   145 				if (form.exists()) {
       
   146 					var base = form.attr('data-ams-form-handler') || form.attr('action');
       
   147 					var target = base.substr(0, base.lastIndexOf('/') + 1);
       
   148 					return MyAMS.ajax.post(target + 'get-images-list.json', {}, callback);
       
   149 				}
       
   150 			},
       
   151 
       
   152 			getLinksList: function(callback) {
       
   153 				var form = $(document.activeElement).parents('form');
       
   154 				if (form.exists()) {
       
   155 					var base = form.attr('data-ams-form-handler') || form.attr('action');
       
   156 					var target = base.substr(0, base.lastIndexOf('/')+1);
       
   157 					return MyAMS.ajax.post(target + 'get-links-list.json', {}, callback);
       
   158 				}
       
   159 			}
       
   160 		},
       
   161 
       
   162 		/**
       
   163 		 * Galleries management
       
   164 		 */
       
   165 		galleries: {
       
   166 
       
   167 			addMediaCallback: function(options) {
       
   168 				var gallery = $('.gallery', $('[id="' + options.parent + '"]'));
       
   169 				var switcher = gallery.siblings('.switcher');
       
   170 				if (switcher.parents('fieldset:first').hasClass('switched')) {
       
   171 					switcher.click();
       
   172 				}
       
   173 				for (var i=0; i < options.medias.length; i++) {
       
   174 					gallery.append(options.medias[i]);
       
   175 				}
       
   176 				gallery.sortable({
       
   177 					helper: 'clone',
       
   178 					stop: PyAMS_content.galleries.setOrder
       
   179 				})
       
   180 			},
       
   181 
       
   182 			updateMediaTitle: function(options) {
       
   183 				$('img[id="' + options.media_id + '"]').attr('original-title', options.title);
       
   184 			},
       
   185 
       
   186 			switchMediaVisibility: function(element) {
       
   187 				return function() {
       
   188 					var source = $(this);
       
   189 					var media = source.parents('.media');
       
   190 					var gallery = media.parents('.gallery');
       
   191 					$('i', source).attr('class', 'fa fa-fw fa-spinner fa-pulse');
       
   192 					MyAMS.ajax.post(gallery.data('ams-location') + '/set-media-visibility.json',
       
   193 									{object_name: media.data('ams-element-name')},
       
   194 									function(result, status) {
       
   195 										if (result.visible) {
       
   196 											$('i', source).attr('class', 'fa fa-fw fa-eye');
       
   197 											source.parents('.btn-group').siblings('a.fancyimg').removeClass('not-visible');
       
   198 										} else {
       
   199 											$('i', source).attr('class', 'fa fa-fw fa-eye-slash text-danger');
       
   200 											source.parents('.btn-group').siblings('a.fancyimg').addClass('not-visible');
       
   201 										}
       
   202 									});
       
   203 				};
       
   204 			},
       
   205 
       
   206 			setOrder: function(event, ui) {
       
   207 				if (ui && ui.item.hasClass('already-dropped')) {
       
   208 					return;
       
   209 				}
       
   210 				var gallery = ui.item.parents('.gallery');
       
   211 				var ids = $('.media', gallery).listattr('data-ams-element-name');
       
   212 				MyAMS.ajax.post(gallery.data('ams-location') + '/set-medias-order.json',
       
   213 								{medias: JSON.stringify(ids)});
       
   214 			},
       
   215 
       
   216 			removeMedia: function(element) {
       
   217 				return function() {
       
   218 					var link = $(this);
       
   219 					MyAMS.skin.bigBox({
       
   220 						title: MyAMS.i18n.WARNING,
       
   221 						content: '<i class="text-danger fa fa-2x fa-bell shake animated"></i>&nbsp; ' + MyAMS.i18n.DELETE_WARNING,
       
   222 						buttons: MyAMS.i18n.BTN_OK_CANCEL
       
   223 					}, function(button) {
       
   224 						if (button === MyAMS.i18n.BTN_OK) {
       
   225 							var gallery = link.parents('.gallery');
       
   226 							var location = gallery.data('ams-location');
       
   227 							var media = link.parents('.media');
       
   228 							var object_name = media.data('ams-element-name');
       
   229 							MyAMS.ajax.post(location + '/delete-element.json',
       
   230 											{object_name: object_name},
       
   231 											function(result, status) {
       
   232 												media.remove();
       
   233 												if (result.handle_json) {
       
   234 													MyAMS.ajax.handleJSON(result);
       
   235 												}
       
   236 											});
       
   237 						}
       
   238 					});
       
   239 				};
       
   240 			},
       
   241 
       
   242 			afterFancyboxLoad: function(current, previous) {
       
   243 				var element = current.element;
       
   244 				if (element.hasClass('not-visible')) {
       
   245 					current.inner.prepend('<div class="hidden-mask"></div>');
       
   246 				}
       
   247 			}
       
   248 		},
       
   249 
       
   250 		/**
       
   251 		 * Illustrations management
       
   252 		 */
       
   253 		illustration: {
       
   254 
       
   255 			addIllustration: function() {
       
   256 				var source = $(this);
       
   257 				var group = source.parents('.btn-group');
       
   258 				var legend = group.siblings('legend.switcher');
       
   259 				$('i.fa-plus', legend).click();
       
   260 				source.hide();
       
   261 				$('input[type="file"]', legend.siblings('.form-group:first')).click();
       
   262 			}
       
   263 		},
       
   264 
       
   265 		/**
       
   266 		 * Paragraphs management
       
   267 		 */
       
   268 		paragraphs: {
       
   269 
       
   270 			/* Store and restore paragraphs state on reload */
       
   271 			preReload: function() {
       
   272 				PyAMS_content.paragraphs.switched = $('i.switch.fa-minus-square-o', '#paragraphs_list').parents('tr').listattr('id');
       
   273 			},
       
   274 
       
   275 			postReload: function() {
       
   276 				$(PyAMS_content.paragraphs.switched).each(function() {
       
   277 					$('i.switch.fa-plus-square-o', '[id="' + this + '"]').parents('div').first().click();
       
   278 				});
       
   279 				delete PyAMS_content.paragraphs.switched;
       
   280 			},
       
   281 
       
   282 			refreshParagraph: function(changes) {
       
   283 				var para = $('tr[id="' + changes.object_id + '"]');
       
   284 				$('span.title', para).html(changes.title || ' - - - - - - - -');
       
   285 			},
       
   286 
       
   287 			switchEditor: function(element) {
       
   288 				var source = $(this);
       
   289 				var switcher = $('i.switch', source);
       
   290 				var td = source.parents('td');
       
   291 				var editor = $('.editor', td);
       
   292 				var para = source.parents('tr');
       
   293 				if (switcher.hasClass('fa-plus-square-o')) {
       
   294 					var container = para.parents('table');
       
   295 					editor.html('<h1 class="loading"><i class="fa fa-2x fa-gear fa-spin"></i></h1>');
       
   296 					MyAMS.ajax.post(container.data('ams-location') + '/get-paragraph-editor.json',
       
   297 									{object_name: para.data('ams-element-name')},
       
   298 									function(result) {
       
   299 										editor.html(result);
       
   300 										if (result) {
       
   301 											MyAMS.initContent(editor);
       
   302 											switcher.removeClass('fa-plus-square-o')
       
   303 													.addClass('fa-minus-square-o');
       
   304 											para.data('ams-disabled-handlers', true);
       
   305 											MyAMS.skin.scrollTo(editor, {
       
   306 												offset: editor.height() - para.height()
       
   307 											});
       
   308 										}
       
   309 									});
       
   310 				} else {
       
   311 					MyAMS.skin.cleanContainer(editor);
       
   312 					editor.empty();
       
   313 					switcher.removeClass('fa-minus-square-o')
       
   314 							.addClass('fa-plus-square-o');
       
   315 					para.removeData('ams-disabled-handlers');
       
   316 				}
       
   317 			},
       
   318 
       
   319 			switchLastEditor: function(table_id) {
       
   320 				var table = $('table[id="' + table_id + '"]');
       
   321 				var tr = $('tr:last', table);
       
   322 				$('[data-ams-click-handler="PyAMS_content.paragraphs.switchEditor"]', tr).click();
       
   323 			},
       
   324 
       
   325 			switchAllEditors: function(element) {
       
   326 				var source = $(this);
       
   327 				var switcher = $('i', source);
       
   328 				var container = source.parents('table');
       
   329 				if (switcher.hasClass('fa-plus-square-o')) {
       
   330 					switcher.removeClass('fa-plus-square-o')
       
   331 							.addClass('fa-cog fa-spin');
       
   332 					MyAMS.ajax.post(container.data('ams-location') + '/get-paragraphs-editors.json',
       
   333 									{},
       
   334 									function(result) {
       
   335 										for (var para_id in result) {
       
   336 											if (!result.hasOwnProperty(para_id)) {
       
   337 												continue;
       
   338 											}
       
   339 											var para = $('tr[data-ams-element-name="' + para_id + '"]', container);
       
   340 											var editor = $('.editor', para);
       
   341 											if (editor.is(':empty')) {
       
   342 												editor.html(result[para_id]);
       
   343 											}
       
   344 											$('.fa-plus-square-o', para).removeClass('fa-plus-square-o')
       
   345 																		.addClass('fa-minus-square-o');
       
   346 											para.data('ams-disabled-handlers', true);
       
   347 										}
       
   348 										if (!$('i.fa-plus-square-o', $('tbody', container)).exists()) {
       
   349 											switcher.removeClass('fa-cog fa-spin')
       
   350 													.addClass('fa-minus-square-o');
       
   351 										}
       
   352 										MyAMS.initContent(container);
       
   353 									});
       
   354 				} else {
       
   355 					$('.editor', container).each(function() {
       
   356 						MyAMS.skin.cleanContainer($(this));
       
   357 						$(this).empty();
       
   358 					});
       
   359 					$('.fa-minus-square-o', container).removeClass('fa-minus-square-o')
       
   360 													  .addClass('fa-plus-square-o');
       
   361 					$('tr', container).removeData('ams-disabled-handlers');
       
   362 				}
       
   363 			},
       
   364 
       
   365 			updateToolbar: function(settings) {
       
   366 				var para = $('tr[id="' + settings.object_id + '"]');
       
   367 				var toolbar = $('.title-toolbar', para);
       
   368 				toolbar.replaceWith(settings.toolbar_tag);
       
   369 				toolbar = $('.title-toolbar', para);
       
   370 				MyAMS.initContent(toolbar);
       
   371 			},
       
   372 
       
   373 			updateMarkers: function(settings) {
       
   374 				var para = $('tr[id="' + settings.object_id + '"]');
       
   375 				var toolbar = $('.title-toolbar', para);
       
   376 				var marker = $('DIV.action.' + settings.marker_type, toolbar);
       
   377 				if (marker.exists()) {
       
   378 					marker.replaceWith(settings.marker_tag);
       
   379 				} else {
       
   380 					$(settings.marker_tag).appendTo(toolbar);
       
   381 				}
       
   382 				if (settings.marker_tag) {
       
   383 					marker = $('DIV.action.' + settings.marker_type, toolbar);
       
   384 					MyAMS.initContent(marker);
       
   385 				}
       
   386 				MyAMS.helpers.sort(toolbar, 'weight');
       
   387 			}
       
   388 		},
       
   389 
       
   390 		/**
       
   391 		 * Pictograms management
       
   392 		 */
       
   393 		pictograms: {
       
   394 
       
   395 			initManagerSelection: function() {
       
   396 				var form = $(this);
       
   397 				var selected = $('input[type="hidden"]', $('.selected-pictograms', form)).listattr('value');
       
   398 				return {
       
   399 					selected: JSON.stringify(selected)
       
   400 				};
       
   401 			},
       
   402 
       
   403 			switchPictogram: function() {
       
   404 				var pictogram = $(this);
       
   405 				var parent = pictogram.parents('.pictograms');
       
   406 				var manager = parent.parents('.pictograms-manager');
       
   407 				if (parent.hasClass('available-pictograms')) {
       
   408 					$('.selected-pictograms', manager).append(pictogram);
       
   409 				} else {
       
   410 					$('.available-pictograms', manager).append(pictogram);
       
   411 				}
       
   412 			}
       
   413 		},
       
   414 
       
   415 		/**
       
   416 		 * Themes management
       
   417 		 */
       
   418 		themes: {
       
   419 
       
   420 			initExtracts: function(element) {
       
   421 				var thesaurus = $('select[name="manager_themes.widgets.thesaurus_name:list"]', element);
       
   422 				var thesaurus_name = thesaurus.val();
       
   423 				var extract = $('select[name="manager_themes.widgets.extract_name:list"]', element);
       
   424 				var extract_name = extract.val();
       
   425 				if (thesaurus_name) {
       
   426 					MyAMS.jsonrpc.post('getExtracts',
       
   427 									   {thesaurus_name: thesaurus_name},
       
   428 									   {url: '/api/thesaurus/json'},
       
   429 									   function(data) {
       
   430 											extract.empty();
       
   431 											$(data.result).each(function() {
       
   432 												$('<option></option>').attr('value', this.id)
       
   433 																	  .attr('selected', this.id === extract_name)
       
   434 																	  .text(this.text)
       
   435 																	  .appendTo(extract);
       
   436 											});
       
   437 									   });
       
   438 				}
       
   439 			},
       
   440 
       
   441 			getExtracts: function(event) {
       
   442 				var select = $(event.currentTarget);
       
   443 				var form = select.parents('form');
       
   444 				var thesaurus_name = $('select[name="manager_themes.widgets.thesaurus_name:list"]', form).val();
       
   445 				var extract = $('select[name="manager_themes.widgets.extract_name:list"]', form);
       
   446 				var plugin = extract.data('select2');
       
   447 				if (thesaurus_name && (thesaurus_name !== '--NOVALUE--')) {
       
   448 					MyAMS.jsonrpc.post('getExtracts',
       
   449 									   {thesaurus_name: thesaurus_name},
       
   450 									   {url: '/api/thesaurus/json'},
       
   451 									   function(data) {
       
   452 											plugin.results.empty();
       
   453 											plugin.opts.populateResults.call(plugin, plugin.results, data.result,
       
   454 																			 {term: ''});
       
   455 									   });
       
   456 				} else {
       
   457 					extract.select2('data', null);
       
   458 					plugin.results.empty();
       
   459 					plugin.opts.populateResults.call(plugin, plugin.results, [], {term: ''});
       
   460 				}
       
   461 			}
       
   462 		},
       
   463 
       
   464 		/**
       
   465 		 * Form fields management
       
   466 		 */
       
   467 		fields: {
       
   468 
       
   469 			refreshField: function(changes) {
       
   470 				var container = $('table[id="form_fields_list"]');
       
   471 				var para = $('tr[data-ams-element-name="' + changes.object_name + '"]', container);
       
   472 				$('td:nth-child(4)', para).html(changes.title);
       
   473 			}
       
   474 		},
       
   475 
       
   476 		/**
       
   477 		 * Image map management
       
   478 		 */
       
   479 		imgmap: {
       
   480 
       
   481 			init: function() {
       
   482 				var image = $(this);
       
   483 				MyAMS.ajax.check($.fn.canvasAreaDraw,
       
   484 								 '/--static--/pyams_content/js/jquery-canvasAreaDraw' + MyAMS.devext + '.js',
       
   485 								 function() {
       
   486 									image.canvasAreaDraw({imageUrl: image.data('ams-image-url')});
       
   487 								 });
       
   488 			},
       
   489 
       
   490 			initPreview: function() {
       
   491 				var image = $(this);
       
   492 				MyAMS.ajax.check($.fn.mapster,
       
   493 								 '/--static--/pyams_content/js/jquery-imagemapster-1.2.10' + MyAMS.devext + '.js',
       
   494 								 function() {
       
   495 									image.mapster({
       
   496 										fillColor: 'ff0000',
       
   497 										fillOpacity: 0.35,
       
   498 										selected: true,
       
   499 										highlight: true,
       
   500 										staticState: true
       
   501 									});
       
   502 								 });
       
   503 			}
       
   504 		},
       
   505 
       
   506 		/**
       
   507 		 * Site management
       
   508 		 */
       
   509 		site: {
       
   510 
       
   511 			switchVisibility: function() {
       
   512 				return function() {
       
   513 					var source = $(this);
       
   514 					var content = source.parents('tr').first();
       
   515 					MyAMS.ajax.post(content.data('ams-location') + '/switch-content-visibility.json',
       
   516 									{object_name: content.data('ams-element-name')},
       
   517 									function(result, status) {
       
   518 										var klass = 'fa-eye';
       
   519 										if (!result.visible) {
       
   520 											klass += '-slash';
       
   521 										}
       
   522 										if (!result.published) {
       
   523 											klass += ' text-danger';
       
   524 										}
       
   525 										$('i', source).attr('class', 'fa fa-fw ' + klass);
       
   526 									});
       
   527 				};
       
   528 			}
       
   529 		},
       
   530 
       
   531 		/**
       
   532 		 * Review comments management
       
   533 		 */
       
   534 		review: {
       
   535 
       
   536 			timer: null,
       
   537 			timer_duration: {
       
   538 				general: 30000,
       
   539 				chat: 5000
       
   540 			},
       
   541 
       
   542 			initComments: function(element) {
       
   543 				var chat = $('.chat-body', element);
       
   544 				chat.animate({scrollTop: chat[0].scrollHeight}, 1000);
       
   545 				clearInterval(PyAMS_content.review.timer);
       
   546 				PyAMS_content.review.timer = setInterval(PyAMS_content.review.updateComments,
       
   547 														 PyAMS_content.review.timer_duration.chat);
       
   548 				MyAMS.skin.registerCleanCallback(PyAMS_content.review.cleanCommentsCallback);
       
   549 			},
       
   550 
       
   551 			cleanCommentsCallback: function() {
       
   552 				clearInterval(PyAMS_content.review.timer);
       
   553 				PyAMS_content.review.timer = setInterval(PyAMS_content.review.updateComments,
       
   554 														 PyAMS_content.review.timer_duration.general);
       
   555 			},
       
   556 
       
   557 			updateComments: function() {
       
   558 				var badge = $('.badge', 'nav a[href="#review-comments.html"]'),
       
   559 					count;
       
   560 				var chat = $('.chat-body', '.widget-body');
       
   561 				if (chat.exists()) {
       
   562 					count = $('.message', chat).length;
       
   563 				} else {
       
   564 					count = parseInt(badge.text());
       
   565 				}
       
   566 				MyAMS.ajax.post('get-last-review-comments.json', {count: count}, function(result) {
       
   567 					if (chat.exists()) {
       
   568 						badge.removeClass('bg-color-danger')
       
   569 							 .addClass('bg-color-info');
       
   570 					}
       
   571 					if (count !== result.count) {
       
   572 						badge.text(result.count).removeClass('hidden');
       
   573 						if (chat.exists()) {
       
   574 							$('.messages', chat).append(result.content);
       
   575 							chat.animate({scrollTop: chat[0].scrollHeight}, 1000);
       
   576 						}
       
   577 						if (!chat.exists()) {
       
   578 							badge.removeClass('bg-color-info')
       
   579 								 .addClass('bg-color-danger')
       
   580 								 .animate({'padding': '3px 12px 2px',
       
   581 										   'margin-right': '9px'}, 'slow', function() {
       
   582 									$(this).animate({'padding': '3px 6px 2px',
       
   583 													 'margin-right': '15px'}, 'slow');
       
   584 								 });
       
   585 						}
       
   586 					}
       
   587 				});
       
   588 			},
       
   589 
       
   590 			initCommentData: function(veto) {
       
   591 				var chat = $('.chat-body', '.widget-body');
       
   592 				return {count: $('.message', chat).length};
       
   593 			},
       
   594 
       
   595 			addCommentAction: function() {
       
   596 				return function() {
       
   597 					$('textarea[name="comment"]').focus();
       
   598 				};
       
   599 			},
       
   600 
       
   601 			addCommentCallback: function(options) {
       
   602 				var form = $(this);
       
   603 				var widget = form.parents('.widget-body');
       
   604 				$('.messages', widget).append(options.content);
       
   605 				$('textarea[name="comment"]', form).val('');
       
   606 				var chat = $('.chat-body', widget);
       
   607 				chat.animate({scrollTop: chat[0].scrollHeight}, 1000);
       
   608 				$('.badge', 'nav a[href="#review-comments.html"]').text(options.count).removeClass('hidden');
       
   609 			}
       
   610 		},
       
   611 
       
   612 		/**
       
   613 		 * Header management
       
   614 		 */
       
   615 		header: {
       
   616 
       
   617 			submitEditForm: function() {
       
   618 				var form = $(this).parents('form').first();
       
   619 				MyAMS.form.submit(form, {form_data: {'autosubmit': true}});
       
   620 			}
       
   621 		},
       
   622 
       
   623 		/**
       
   624 		 * Footer management
       
   625 		 */
       
   626 		footer: {
       
   627 
       
   628 			submitEditForm: function() {
       
   629 				var form = $(this).parents('form').first();
       
   630 				MyAMS.form.submit(form, {form_data: {'autosubmit': true}});
       
   631 			}
       
   632 		},
       
   633 
       
   634 		/**
       
   635 		 * User profile management
       
   636 		 */
       
   637 		profile: {
       
   638 
       
   639 			switchFavorite: function() {
       
   640 				var star = $(this);
       
   641 				var oid = star.data('sequence-oid');
       
   642 				MyAMS.ajax.post('switch-user-favorite.json',
       
   643 								{oid: oid},
       
   644 								function(result, status) {
       
   645 									if (result.favorite) {
       
   646 										star.removeClass('fa-star-o')
       
   647 											.addClass('fa-star');
       
   648 									} else {
       
   649 										star.removeClass('fa-star')
       
   650 											.addClass('fa-star-o');
       
   651 									}
       
   652 								});
       
   653 			}
       
   654 		}
       
   655 	};
       
   656 
       
   657 	var badge = $('.badge', 'nav a[href="#review-comments.html"]');
       
   658 	if (badge.exists()) {
       
   659 		PyAMS_content.review.timer = setInterval(PyAMS_content.review.updateComments,
       
   660 												 PyAMS_content.review.timer_duration.general);
       
   661 	}
       
   662 
       
   663 	globals.PyAMS_content = PyAMS_content;
       
   664 
       
   665 })(jQuery, this);