Elgg  Version 1.12
ui.js
Go to the documentation of this file.
1 elgg.provide('elgg.ui');
2 
3 elgg.ui.init = function () {
4  // @todo we need better documentation for this hack
5  // iOS Hover Event Class Fix
6  $('.elgg-page').attr("onclick", "return true");
7 
8  // add user hover menus
9  elgg.ui.initHoverMenu();
10 
11  // if the user clicks a system message (not a link inside one), make it disappear
12  $('.elgg-system-messages li').live('click', function(e) {
13  if (!$(e.target).is('a')) {
14  $(this).stop().fadeOut('fast');
15  }
16  });
17 
18  $('.elgg-system-messages li').animate({opacity: 0.9}, 6000);
19  $('.elgg-system-messages li.elgg-state-success').fadeOut('slow');
20 
21  $('[rel=toggle]').live('click', elgg.ui.toggles);
22 
23  $('[rel=popup]').live('click', elgg.ui.popupOpen);
24 
25  $('.elgg-menu-page .elgg-menu-parent').live('click', elgg.ui.toggleMenu);
26 
27  $('*[data-confirm], .elgg-requires-confirmation').live('click', elgg.ui.requiresConfirmation);
28  if ($('.elgg-requires-confirmation').length > 0) {
29  elgg.deprecated_notice('Use of .elgg-requires-confirmation is deprecated by data-confirm', '1.10');
30  }
31 
32  $('.elgg-autofocus').focus();
33  if ($('.elgg-autofocus').length > 0) {
34  elgg.deprecated_notice('Use of .elgg-autofocus is deprecated by html5 autofocus', 1.9);
35  }
36 
37  elgg.ui.initAccessInputs();
38 
39  // Allow element to be highlighted using CSS if its id is found from the URL
40  var elementId = elgg.getSelectorFromUrlFragment(document.URL);
41  $(elementId).addClass('elgg-state-highlight');
42 };
43 
57 elgg.ui.toggles = function(event) {
58  event.preventDefault();
59  var $this = $(this),
60  target = $this.data().toggleSelector;
61 
62  if (!target) {
63  // @todo we can switch to elgg.getSelectorFromUrlFragment() in 1.x if
64  // we also extend it to support href=".some-class"
65  target = $this.attr('href');
66  }
67 
68  $this.toggleClass('elgg-state-active');
69 
70  $(target).each(function(index, elem) {
71  var $elem = $(elem);
72  if ($elem.data().toggleSlide != false) {
73  $elem.slideToggle('medium');
74  } else {
75  $elem.toggle();
76  }
77  });
78 };
79 
98 elgg.ui.popupOpen = function(event) {
99  event.preventDefault();
100  event.stopPropagation();
101 
102  var target = elgg.getSelectorFromUrlFragment($(this).toggleClass('elgg-state-active').attr('href'));
103  var $target = $(target);
104 
105  // emit a hook to allow plugins to position and control popups
106  var params = {
107  targetSelector: target,
108  target: $target,
109  source: $(this)
110  };
111 
112  var options = {
113  my: 'center top',
114  at: 'center bottom',
115  of: $(this),
116  collision: 'fit fit'
117  };
118 
119  options = elgg.trigger_hook('getOptions', 'ui.popup', params, options);
120 
121  // allow plugins to cancel event
122  if (!options) {
123  return;
124  }
125 
126  // hide if already open
127  if ($target.is(':visible')) {
128  $target.fadeOut();
129  $('body').die('click', elgg.ui.popupClose);
130  return;
131  }
132 
133  $target.appendTo('body')
134  .fadeIn()
135  .position(options);
136 
137  $('body')
138  .die('click', elgg.ui.popupClose)
139  .live('click', elgg.ui.popupClose);
140 };
141 
145 elgg.ui.popupClose = function(event) {
146  $eventTarget = $(event.target);
147  var inTarget = false;
148  var $popups = $('[rel=popup]');
149 
150  // if the click event target isn't in a popup target, fade all of them out.
151  $popups.each(function(i, e) {
152  var target = elgg.getSelectorFromUrlFragment($(e).attr('href')) + ':visible';
153  var $target = $(target);
154 
155  if (!$target.is(':visible')) {
156  return;
157  }
158 
159  // didn't click inside the target
160  if ($eventTarget.closest(target).length > 0) {
161  inTarget = true;
162  return false;
163  }
164  });
165 
166  if (!inTarget) {
167  $popups.each(function(i, e) {
168  var $e = $(e);
169  var $target = $(elgg.getSelectorFromUrlFragment($e.attr('href')) + ':visible');
170  if ($target.length > 0) {
171  $target.fadeOut();
172  $e.removeClass('elgg-state-active');
173  }
174  });
175 
176  $('body').die('click', elgg.ui.popClose);
177  }
178 };
179 
186 elgg.ui.toggleMenu = function(event) {
187  $(this).siblings().slideToggle('medium');
188  $(this).toggleClass('elgg-menu-closed elgg-menu-opened');
189  event.preventDefault();
190 };
191 
198 elgg.ui.initHoverMenu = function(parent) {
199 
205  function loadMenu(mac) {
206  var $all_placeholders = $(".elgg-menu-hover[rel='" + mac + "']");
207 
208  // find the <ul> that contains data for this menu
209  var $ul = $all_placeholders.filter('[data-elgg-menu-data]');
210 
211  if (!$ul.length) {
212  return;
213  }
214 
215  elgg.get('ajax/view/navigation/menu/user_hover/contents', {
216  data: $ul.data('elggMenuData'),
217  success: function(data) {
218  if (data) {
219  // replace all existing placeholders with new menu
220  $all_placeholders.removeClass('elgg-ajax-loader')
221  .html($(data).children());
222  }
223  }
224  });
225  }
226 
227  if (!parent) {
228  parent = document;
229  }
230 
231  // avatar image menu link
232  $(parent).find(".elgg-avatar").live('mouseover', function() {
233  $(this).children(".elgg-icon-hover-menu").show();
234  })
235  .live('mouseout', function() {
236  $(this).children(".elgg-icon-hover-menu").hide();
237  });
238 
239 
240  // avatar contextual menu
241  $(".elgg-avatar > .elgg-icon-hover-menu").live('click', function(e) {
242  var $placeholder = $(this).parent().find(".elgg-menu-hover.elgg-ajax-loader");
243 
244  if ($placeholder.length) {
245  loadMenu($placeholder.attr("rel"));
246  }
247 
248  // check if we've attached the menu to this element already
249  var $hovermenu = $(this).data('hovermenu') || null;
250 
251  if (!$hovermenu) {
252  $hovermenu = $(this).parent().find(".elgg-menu-hover");
253  $(this).data('hovermenu', $hovermenu);
254  }
255 
256  // close hovermenu if arrow is clicked & menu already open
257  if ($hovermenu.css('display') == "block") {
258  $hovermenu.fadeOut();
259  } else {
260  $avatar = $(this).closest(".elgg-avatar");
261 
262  // @todo Use jQuery-ui position library instead -- much simpler
263  var offset = $avatar.offset();
264  var top = $avatar.height() + offset.top + 'px';
265  var left = $avatar.width() - 15 + offset.left + 'px';
266 
267  $hovermenu.appendTo('body')
268  .css('position', 'absolute')
269  .css("top", top)
270  .css("left", left)
271  .fadeIn('normal');
272  }
273 
274  // hide any other open hover menus
275  $(".elgg-menu-hover:visible").not($hovermenu).fadeOut();
276  });
277 
278  // hide avatar menu when user clicks elsewhere
279  $(document).click(function(event) {
280  if ($(event.target).parents(".elgg-avatar").length === 0) {
281  $(".elgg-menu-hover").fadeOut();
282  }
283  });
284 };
285 
292 elgg.ui.requiresConfirmation = function(e) {
293  var confirmText = $(this).data('confirm') || elgg.echo('question:areyousure');
294  if (!confirm(confirmText)) {
295  e.preventDefault();
296  }
297 };
298 
309 elgg.ui.loginHandler = function(hook, type, params, options) {
310  if (params.target.attr('id') == 'login-dropdown-box') {
311  options.my = 'right top';
312  options.at = 'right bottom';
313  return options;
314  }
315  return null;
316 };
317 
330 elgg.ui.initDatePicker = function() {
331  function loadDatePicker() {
332  $('.elgg-input-date').datepicker({
333  // ISO-8601
334  dateFormat: 'yy-mm-dd',
335  onSelect: function(dateText) {
336  if ($(this).is('.elgg-input-timestamp')) {
337  // convert to unix timestamp
338  var dateParts = dateText.split("-");
339  var timestamp = Date.UTC(dateParts[0], dateParts[1] - 1, dateParts[2]);
340  timestamp = timestamp / 1000;
341 
342  var id = $(this).attr('id');
343  $('input[name="' + id + '"]').val(timestamp);
344  }
345  },
346  nextText: '&#xBB;',
347  prevText: '&#xAB;',
348  changeMonth: true,
349  changeYear: true
350  });
351  }
352 
353  if (!$('.elgg-input-date').length) {
354  return;
355  }
356 
357  if (elgg.get_language() == 'en') {
358  loadDatePicker();
359  } else {
360  // load language first
361  elgg.get({
362  url: elgg.config.wwwroot + 'vendors/jquery/i18n/jquery.ui.datepicker-'+ elgg.get_language() +'.js',
363  dataType: "script",
364  cache: true,
365  success: loadDatePicker,
366  error: loadDatePicker // english language is already loaded.
367  });
368  }
369 };
370 
378 elgg.ui.registerTogglableMenuItems = function(menuItemNameA, menuItemNameB) {
379  // Handles clicking the first button.
380  $('.elgg-menu-item-' + menuItemNameA + ' a').live('click', function() {
381  var $menu = $(this).closest('.elgg-menu');
382 
383  // Be optimistic about success
384  elgg.ui.toggleMenuItems($menu, menuItemNameB, menuItemNameA);
385 
386  // Send the ajax request
387  elgg.action($(this).attr('href'), {
388  success: function(json) {
389  if (json.system_messages.error.length) {
390  // Something went wrong, so undo the optimistic changes
391  elgg.ui.toggleMenuItems($menu, menuItemNameA, menuItemNameB);
392  }
393  },
394  error: function() {
395  // Something went wrong, so undo the optimistic changes
396  elgg.ui.toggleMenuItems($menu, menuItemNameA, menuItemNameB);
397  }
398  });
399 
400  // Don't want to actually click the link
401  return false;
402  });
403 
404  // Handles clicking the second button
405  $('.elgg-menu-item-' + menuItemNameB + ' a').live('click', function() {
406  var $menu = $(this).closest('.elgg-menu');
407 
408  // Be optimistic about success
409  elgg.ui.toggleMenuItems($menu, menuItemNameA, menuItemNameB);
410 
411  // Send the ajax request
412  elgg.action($(this).attr('href'), {
413  success: function(json) {
414  if (json.system_messages.error.length) {
415  // Something went wrong, so undo the optimistic changes
416  elgg.ui.toggleMenuItems($menu, menuItemNameB, menuItemNameA);
417  }
418  },
419  error: function() {
420  // Something went wrong, so undo the optimistic changes
421  elgg.ui.toggleMenuItems($menu, menuItemNameB, menuItemNameA);
422  }
423  });
424 
425  // Don't want to actually click the link
426  return false;
427  });
428 };
429 
430 elgg.ui.toggleMenuItems = function($menu, nameOfItemToShow, nameOfItemToHide) {
431  $menu.find('.elgg-menu-item-' + nameOfItemToShow).removeClass('hidden').find('a').focus();
432  $menu.find('.elgg-menu-item-' + nameOfItemToHide).addClass('hidden');
433 };
434 
444 elgg.ui.initAccessInputs = function () {
445  $('.elgg-input-access').each(function () {
446  function updateMembersonlyNote() {
447  var val = $select.val();
448  if (val != acl && val !== 0) {
449  // .show() failed in Chrome. Maybe a float/jQuery bug
450  $note.css('visibility', 'visible');
451  } else {
452  $note.css('visibility', 'hidden');
453  }
454  }
455  var $select = $(this),
456  acl = $select.data('group-acl'),
457  $note = $('.elgg-input-access-membersonly', this.parentNode),
458  commentCount = $select.data('comment-count'),
459  originalValue = $select.data('original-value');
460  if ($note) {
461  updateMembersonlyNote();
462  $select.change(updateMembersonlyNote);
463  }
464 
465  if (commentCount) {
466  $select.change(function(e) {
467  if ($(this).val() != originalValue) {
468  if (!confirm(elgg.echo('access:comments:change', [commentCount]))) {
469  $(this).val(originalValue);
470  }
471  }
472  });
473  }
474  });
475 };
476 
477 elgg.register_hook_handler('init', 'system', elgg.ui.init);
478 elgg.register_hook_handler('init', 'system', elgg.ui.initDatePicker);
479 elgg.register_hook_handler('getOptions', 'ui.popup', elgg.ui.loginHandler);
480 elgg.ui.registerTogglableMenuItems('add-friend', 'remove-friend');
elgg message elgg state success
Definition: admin.php:252
elgg
Definition: install.js:23
i
Definition: admin.php:47
$e
Definition: metadata.php:12
z index
Definition: admin.php:358
border top
Definition: admin.php:390
elgg message elgg state error
Definition: admin.php:247
$target
Definition: create.php:11
function elgg combo checkbox click(function(){if($(this).is(':checked')){$(this).prev().attr('disabled', true);$(this).prev().val('');}else{$(this).prev().attr('disabled', false);}})
if(!$site) if(!($site instanceof ElggSite)) $site url
$menu
Definition: default.php:19
list style type
Definition: admin.php:753
ui datepicker
Definition: admin.php:598
margin left
Definition: admin.php:294