Elgg  Version 1.10
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, make it disappear
12  $('.elgg-system-messages li').live('click', function() {
13  $(this).stop().fadeOut('fast');
14  });
15 
16  $('.elgg-system-messages li').animate({opacity: 0.9}, 6000);
17  $('.elgg-system-messages li.elgg-state-success').fadeOut('slow');
18 
19  $('[rel=toggle]').live('click', elgg.ui.toggles);
20 
21  $('[rel=popup]').live('click', elgg.ui.popupOpen);
22 
23  $('.elgg-menu-page .elgg-menu-parent').live('click', elgg.ui.toggleMenu);
24 
25  $('*[data-confirm], .elgg-requires-confirmation').live('click', elgg.ui.requiresConfirmation);
26  if ($('.elgg-requires-confirmation').length > 0) {
27  elgg.deprecated_notice('Use of .elgg-requires-confirmation is deprecated by data-confirm', '1.10');
28  }
29 
30  $('.elgg-autofocus').focus();
31  if ($('.elgg-autofocus').length > 0) {
32  elgg.deprecated_notice('Use of .elgg-autofocus is deprecated by html5 autofocus', 1.9);
33  }
34 
35  elgg.ui.initAccessInputs();
36 };
37 
51 elgg.ui.toggles = function(event) {
52  event.preventDefault();
53  var $this = $(this),
54  target = $this.data().toggleSelector;
55 
56  if (!target) {
57  // @todo we can switch to elgg.getSelectorFromUrlFragment() in 1.x if
58  // we also extend it to support href=".some-class"
59  target = $this.attr('href');
60  }
61 
62  $this.toggleClass('elgg-state-active');
63 
64  $(target).each(function(index, elem) {
65  var $elem = $(elem);
66  if ($elem.data().toggleSlide != false) {
67  $elem.slideToggle('medium');
68  } else {
69  $elem.toggle();
70  }
71  });
72 };
73 
92 elgg.ui.popupOpen = function(event) {
93  event.preventDefault();
94  event.stopPropagation();
95 
96  var target = elgg.getSelectorFromUrlFragment($(this).toggleClass('elgg-state-active').attr('href'));
97  var $target = $(target);
98 
99  // emit a hook to allow plugins to position and control popups
100  var params = {
101  targetSelector: target,
102  target: $target,
103  source: $(this)
104  };
105 
106  var options = {
107  my: 'center top',
108  at: 'center bottom',
109  of: $(this),
110  collision: 'fit fit'
111  };
112 
113  options = elgg.trigger_hook('getOptions', 'ui.popup', params, options);
114 
115  // allow plugins to cancel event
116  if (!options) {
117  return;
118  }
119 
120  // hide if already open
121  if ($target.is(':visible')) {
122  $target.fadeOut();
123  $('body').die('click', elgg.ui.popupClose);
124  return;
125  }
126 
127  $target.appendTo('body')
128  .fadeIn()
129  .position(options);
130 
131  $('body')
132  .die('click', elgg.ui.popupClose)
133  .live('click', elgg.ui.popupClose);
134 };
135 
139 elgg.ui.popupClose = function(event) {
140  $eventTarget = $(event.target);
141  var inTarget = false;
142  var $popups = $('[rel=popup]');
143 
144  // if the click event target isn't in a popup target, fade all of them out.
145  $popups.each(function(i, e) {
146  var target = elgg.getSelectorFromUrlFragment($(e).attr('href')) + ':visible';
147  var $target = $(target);
148 
149  if (!$target.is(':visible')) {
150  return;
151  }
152 
153  // didn't click inside the target
154  if ($eventTarget.closest(target).length > 0) {
155  inTarget = true;
156  return false;
157  }
158  });
159 
160  if (!inTarget) {
161  $popups.each(function(i, e) {
162  var $e = $(e);
163  var $target = $(elgg.getSelectorFromUrlFragment($e.attr('href')) + ':visible');
164  if ($target.length > 0) {
165  $target.fadeOut();
166  $e.removeClass('elgg-state-active');
167  }
168  });
169 
170  $('body').die('click', elgg.ui.popClose);
171  }
172 };
173 
180 elgg.ui.toggleMenu = function(event) {
181  $(this).siblings().slideToggle('medium');
182  $(this).toggleClass('elgg-menu-closed elgg-menu-opened');
183  event.preventDefault();
184 };
185 
192 elgg.ui.initHoverMenu = function(parent) {
193  if (!parent) {
194  parent = document;
195  }
196 
197  // avatar image menu link
198  $(parent).find(".elgg-avatar").live('mouseover', function() {
199  $(this).children(".elgg-icon-hover-menu").show();
200  })
201  .live('mouseout', function() {
202  $(this).children(".elgg-icon-hover-menu").hide();
203  });
204 
205 
206  // avatar contextual menu
207  $(".elgg-avatar > .elgg-icon-hover-menu").live('click', function(e) {
208  // check if we've attached the menu to this element already
209  var $hovermenu = $(this).data('hovermenu') || null;
210 
211  if (!$hovermenu) {
212  $hovermenu = $(this).parent().find(".elgg-menu-hover");
213  $(this).data('hovermenu', $hovermenu);
214  }
215 
216  // close hovermenu if arrow is clicked & menu already open
217  if ($hovermenu.css('display') == "block") {
218  $hovermenu.fadeOut();
219  } else {
220  $avatar = $(this).closest(".elgg-avatar");
221 
222  // @todo Use jQuery-ui position library instead -- much simpler
223  var offset = $avatar.offset();
224  var top = $avatar.height() + offset.top + 'px';
225  var left = $avatar.width() - 15 + offset.left + 'px';
226 
227  $hovermenu.appendTo('body')
228  .css('position', 'absolute')
229  .css("top", top)
230  .css("left", left)
231  .fadeIn('normal');
232  }
233 
234  // hide any other open hover menus
235  $(".elgg-menu-hover:visible").not($hovermenu).fadeOut();
236  });
237 
238  // hide avatar menu when user clicks elsewhere
239  $(document).click(function(event) {
240  if ($(event.target).parents(".elgg-avatar").length === 0) {
241  $(".elgg-menu-hover").fadeOut();
242  }
243  });
244 };
245 
252 elgg.ui.requiresConfirmation = function(e) {
253  var confirmText = $(this).data('confirm') || elgg.echo('question:areyousure');
254  if (!confirm(confirmText)) {
255  e.preventDefault();
256  }
257 };
258 
269 elgg.ui.loginHandler = function(hook, type, params, options) {
270  if (params.target.attr('id') == 'login-dropdown-box') {
271  options.my = 'right top';
272  options.at = 'right bottom';
273  return options;
274  }
275  return null;
276 };
277 
290 elgg.ui.initDatePicker = function() {
291  function loadDatePicker() {
292  $('.elgg-input-date').datepicker({
293  // ISO-8601
294  dateFormat: 'yy-mm-dd',
295  onSelect: function(dateText) {
296  if ($(this).is('.elgg-input-timestamp')) {
297  // convert to unix timestamp
298  var dateParts = dateText.split("-");
299  var timestamp = Date.UTC(dateParts[0], dateParts[1] - 1, dateParts[2]);
300  timestamp = timestamp / 1000;
301 
302  var id = $(this).attr('id');
303  $('input[name="' + id + '"]').val(timestamp);
304  }
305  },
306  nextText: '»',
307  prevText: '«'
308  });
309  }
310 
311  if (!$('.elgg-input-date').length) {
312  return;
313  }
314 
315  if (elgg.get_language() == 'en') {
316  loadDatePicker();
317  } else {
318  // load language first
319  elgg.get({
320  url: elgg.config.wwwroot + 'vendors/jquery/i18n/jquery.ui.datepicker-'+ elgg.get_language() +'.js',
321  dataType: "script",
322  cache: true,
323  success: loadDatePicker,
324  error: loadDatePicker // english language is already loaded.
325  });
326  }
327 };
328 
336 elgg.ui.registerTogglableMenuItems = function(menuItemNameA, menuItemNameB) {
337  // Handles clicking the first button.
338  $('.elgg-menu-item-' + menuItemNameA + ' a').live('click', function() {
339  var $menu = $(this).closest('.elgg-menu');
340 
341  // Be optimistic about success
342  elgg.ui.toggleMenuItems($menu, menuItemNameB, menuItemNameA);
343 
344  // Send the ajax request
345  elgg.action($(this).attr('href'), {
346  success: function(json) {
347  if (json.system_messages.error.length) {
348  // Something went wrong, so undo the optimistic changes
349  elgg.ui.toggleMenuItems($menu, menuItemNameA, menuItemNameB);
350  }
351  },
352  error: function() {
353  // Something went wrong, so undo the optimistic changes
354  elgg.ui.toggleMenuItems($menu, menuItemNameA, menuItemNameB);
355  }
356  });
357 
358  // Don't want to actually click the link
359  return false;
360  });
361 
362  // Handles clicking the second button
363  $('.elgg-menu-item-' + menuItemNameB + ' a').live('click', function() {
364  var $menu = $(this).closest('.elgg-menu');
365 
366  // Be optimistic about success
367  elgg.ui.toggleMenuItems($menu, menuItemNameA, menuItemNameB);
368 
369  // Send the ajax request
370  elgg.action($(this).attr('href'), {
371  success: function(json) {
372  if (json.system_messages.error.length) {
373  // Something went wrong, so undo the optimistic changes
374  elgg.ui.toggleMenuItems($menu, menuItemNameB, menuItemNameA);
375  }
376  },
377  error: function() {
378  // Something went wrong, so undo the optimistic changes
379  elgg.ui.toggleMenuItems($menu, menuItemNameB, menuItemNameA);
380  }
381  });
382 
383  // Don't want to actually click the link
384  return false;
385  });
386 };
387 
388 elgg.ui.toggleMenuItems = function($menu, nameOfItemToShow, nameOfItemToHide) {
389  $menu.find('.elgg-menu-item-' + nameOfItemToShow).removeClass('hidden').find('a').focus();
390  $menu.find('.elgg-menu-item-' + nameOfItemToHide).addClass('hidden');
391 };
392 
402 elgg.ui.initAccessInputs = function () {
403  $('.elgg-input-access').each(function () {
404  function updateMembersonlyNote() {
405  var val = $select.val();
406  if (val != acl && val !== 0) {
407  // .show() failed in Chrome. Maybe a float/jQuery bug
408  $note.css('visibility', 'visible');
409  } else {
410  $note.css('visibility', 'hidden');
411  }
412  }
413  var $select = $(this),
414  acl = $select.data('group-acl'),
415  $note = $('.elgg-input-access-membersonly', this.parentNode);
416  if ($note) {
417  updateMembersonlyNote();
418  $select.change(updateMembersonlyNote);
419  }
420  });
421 };
422 
423 elgg.register_hook_handler('init', 'system', elgg.ui.init);
424 elgg.register_hook_handler('init', 'system', elgg.ui.initDatePicker);
425 elgg.register_hook_handler('getOptions', 'ui.popup', elgg.ui.loginHandler);
426 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:354
border top
Definition: admin.php:386
elgg message elgg state error
Definition: admin.php:247
GNU GENERAL PUBLIC LICENSE June Free Software Franklin Fifth MA USA Everyone is permitted to copy and distribute verbatim copies of this license document
Definition: LICENSE.txt:4
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
$target
Definition: responses.php:19
list style type
Definition: admin.php:747
ui datepicker
Definition: admin.php:592
margin left
Definition: admin.php:290