elgg.provide('elgg.ui');
elgg.ui.init = function () {
elgg.ui.initHoverMenu();
//if the user clicks a system message, make it disappear
$('.elgg-system-messages li').live('click', function() {
$(this).stop().fadeOut('fast');
});
$('.elgg-system-messages li').animate({opacity: 0.9}, 6000);
$('.elgg-system-messages li').fadeOut('slow');
$('.elgg-toggler').live('click', elgg.ui.toggles);
$('[rel=popup]').live('click', elgg.ui.popsUp);
$('.elgg-menu-page .elgg-menu-parent').live('click', elgg.ui.toggleMenu);
$('.elgg-requires-confirmation').live('click', elgg.ui.requiresConfirmation);
$('.elgg-input-date').datepicker();
}
/**
* Toggles an element based on clicking a separate element
*
* Use .elgg-toggler on the toggler element
* Set the href to target the item you want to toggle ()
*
* @param {Object} event
* @return void
*/
elgg.ui.toggles = function(event) {
event.preventDefault();
var target = $(this).toggleClass('elgg-state-active').attr('href');
$(target).slideToggle('medium');
}
/**
* Pops up an element based on clicking a separate element
*
* Set the rel="popup" on the popper and set the href to target the
* item you want to toggle ()
*
* You can set the position of the popup by putting a certain class on the popper. Use
* elgg-popup--at- where each section is one of the short hands
* below:
* Horizontal:
* l: left
* c: center
* r: right
*
* Vertical:
* t: top
* c: center
* b: bottom
*
* Example:
* elgg-popup-lt-at-rb Puts the popup window's left top corner at the popper's right bottom
* corner.
*
* You can set the position of the X and Y offsets by putting the class elgg-popup-offset-XXxYY
* on the popper where XX and YY are the offsets:
* elgg-popup-offset-15x35
*
* Offsets can be negative:
* elgg-popup-offset--5x-35
*
* @param {Object} event
* @return void
*/
elgg.ui.popsUp = function(event) {
event.preventDefault();
var target = $(this).toggleClass('elgg-state-active').attr('href');
var $target = $(target);
// hide if already open
if ($target.is(':visible')) {
$target.fadeOut();
return;
}
var posMap = {
l: 'left',
c: 'center',
r: 'right',
t: 'top',
b: 'bottom'
};
var my = 'left top';
var at = 'right bottom';
var offsetX = 0;
var offsetY = 0;
// check for location classes on the popper upper
var posRegexp = new RegExp('elgg-popup-([lcr])([tcb])-at-([lcr])([tcb])$', 'i');
var offsetRegexp = new RegExp('elgg-popup-offset-(-?[0-9]+x-?[0-9]+)$', 'i');
var classes = $(this).attr('class').split(' ');
$(classes).each(function (i, el) {
if (posRegexp.test(el)) {
var pos = el.replace(posRegexp, '$1$2$3$4');
var myH = pos.substr(0, 1);
var myV = pos.substr(1, 1);
var toH = pos.substr(2, 1);
var toV = pos.substr(3, 1);
my = posMap[myH] + ' ' + posMap[myV];
at = posMap[toH] + ' ' + posMap[toV];
} else if (offsetRegexp.test(el)) {
var offsets = el.replace(offsetRegexp, '$1').split('x');
offsetX = offsets[0];
offsetY = offsets[1];
}
});
$target.appendTo('body')
.fadeIn()
.css('position', 'absolute')
.position({
'my': my,
'at': at,
'of': $(this),
'offset': offsetX + ' ' + offsetY
});
}
/**
* Toggles a child menu when the parent is clicked
*
* @param {Object} event
* @return void
*/
elgg.ui.toggleMenu = function(event) {
$(this).siblings().slideToggle('medium');
$(this).toggleClass('elgg-menu-closed elgg-menu-opened');
event.preventDefault();
}
/**
* Initialize the hover menu
*
* @param {Object} parent
* @return void
*/
elgg.ui.initHoverMenu = function(parent) {
if (!parent) {
parent = document;
}
// avatar image menu link
$(parent).find(".elgg-avatar").live('mouseover', function() {
$(this).children(".elgg-icon-hover-menu").show();
})
.live('mouseout', function() {
$(this).children(".elgg-icon-hover-menu").hide();
});
// avatar contextual menu
$(".elgg-avatar > .elgg-icon-hover-menu").live('click', function(e) {
// check if we've attached the menu to this element already
var $hovermenu = $(this).data('hovermenu') || null;
if (!$hovermenu) {
var $hovermenu = $(this).parent().find(".elgg-menu-hover");
$(this).data('hovermenu', $hovermenu);
}
// close hovermenu if arrow is clicked & menu already open
if ($hovermenu.css('display') == "block") {
$hovermenu.fadeOut();
} else {
$avatar = $(this).closest(".elgg-avatar");
// @todo Use jQuery-ui position library instead -- much simpler
var offset = $avatar.offset();
var top = $avatar.height() + offset.top + 'px';
var left = $avatar.width() - 15 + offset.left + 'px';
$hovermenu.appendTo('body')
.css('position', 'absolute')
.css("top", top)
.css("left", left)
.fadeIn('normal');
}
// hide any other open hover menus
$(".elgg-menu-hover:visible").not($hovermenu).fadeOut();
});
// hide avatar menu when user clicks elsewhere
$(document).click(function(event) {
if ($(event.target).parents(".elgg-avatar").length == 0) {
$(".elgg-menu-hover").fadeOut();
}
});
}
/**
* Calls a confirm() and prevents default if denied.
*
* @param {Object} event
* @return void
*/
elgg.ui.requiresConfirmation = function(e) {
var confirmText = $(this).attr('title') || elgg.echo('question:areyousure');
if (!confirm(confirmText)) {
e.preventDefault();
}
};
elgg.register_event_handler('init', 'system', elgg.ui.init);