elgg.provide('elgg.ui'); elgg.ui.init = function () { // @todo we need better documentation for this hack // iOS Hover Event Class Fix $('.elgg-page').attr("onclick", "return true"); // add user hover menus 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.elgg-state-success').fadeOut('slow'); $('[rel=toggle]').live('click', elgg.ui.toggles); $('[rel=popup]').live('click', elgg.ui.popupOpen); $('.elgg-menu-page .elgg-menu-parent').live('click', elgg.ui.toggleMenu); $('*[data-confirm], .elgg-requires-confirmation').live('click', elgg.ui.requiresConfirmation); if ($('.elgg-requires-confirmation').length > 0) { elgg.deprecated_notice('Use of .elgg-requires-confirmation is deprecated by data-confirm', '1.10'); } $('.elgg-autofocus').focus(); if ($('.elgg-autofocus').length > 0) { elgg.deprecated_notice('Use of .elgg-autofocus is deprecated by html5 autofocus', 1.9); } elgg.ui.initAccessInputs(); // Allow element to be highlighted using CSS if its id is found from the URL var elementId = elgg.getSelectorFromUrlFragment(document.URL); $(elementId).addClass('elgg-state-highlight'); }; /** * Toggles an element based on clicking a separate element * * Use rel="toggle" on the toggler element * Set the href to target the item you want to toggle () * or use data-toggle-selector="your_jquery_selector" to have an advanced selection method * * By default elements perform a slideToggle. * If you want a normal toggle (hide/show) you can add data-toggle-slide="0" on the elements to prevent a slide. * * @param {Object} event * @return void */ elgg.ui.toggles = function(event) { event.preventDefault(); var $this = $(this), target = $this.data().toggleSelector; if (!target) { // @todo we can switch to elgg.getSelectorFromUrlFragment() in 1.x if // we also extend it to support href=".some-class" target = $this.attr('href'); } $this.toggleClass('elgg-state-active'); $(target).each(function(index, elem) { var $elem = $(elem); if ($elem.data().toggleSlide != false) { $elem.slideToggle('medium'); } else { $elem.toggle(); } }); }; /** * 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 () * * This function emits the getOptions, ui.popup hook that plugins can register for to provide custom * positioning for elements. The handler is passed the following params: * targetSelector: The selector used to find the popup * target: The popup jQuery element as found by the selector * source: The jquery element whose click event initiated a popup. * * The return value of the function is used as the options object to .position(). * Handles can also return false to abort the default behvior and override it with their own. * * @param {Object} event * @return void */ elgg.ui.popupOpen = function(event) { event.preventDefault(); event.stopPropagation(); var target = elgg.getSelectorFromUrlFragment($(this).toggleClass('elgg-state-active').attr('href')); var $target = $(target); // emit a hook to allow plugins to position and control popups var params = { targetSelector: target, target: $target, source: $(this) }; var options = { my: 'center top', at: 'center bottom', of: $(this), collision: 'fit fit' }; options = elgg.trigger_hook('getOptions', 'ui.popup', params, options); // allow plugins to cancel event if (!options) { return; } // hide if already open if ($target.is(':visible')) { $target.fadeOut(); $('body').die('click', elgg.ui.popupClose); return; } $target.appendTo('body') .fadeIn() .position(options); $('body') .die('click', elgg.ui.popupClose) .live('click', elgg.ui.popupClose); }; /** * Catches clicks that aren't in a popup and closes all popups. */ elgg.ui.popupClose = function(event) { $eventTarget = $(event.target); var inTarget = false; var $popups = $('[rel=popup]'); // if the click event target isn't in a popup target, fade all of them out. $popups.each(function(i, e) { var target = elgg.getSelectorFromUrlFragment($(e).attr('href')) + ':visible'; var $target = $(target); if (!$target.is(':visible')) { return; } // didn't click inside the target if ($eventTarget.closest(target).length > 0) { inTarget = true; return false; } }); if (!inTarget) { $popups.each(function(i, e) { var $e = $(e); var $target = $(elgg.getSelectorFromUrlFragment($e.attr('href')) + ':visible'); if ($target.length > 0) { $target.fadeOut(); $e.removeClass('elgg-state-active'); } }); $('body').die('click', elgg.ui.popClose); } }; /** * 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) { /** * For a menu clicked, load the menu into all matching placeholders * * @param {String} mac Machine authorization code for the menu clicked */ function loadMenu(mac) { var $all_placeholders = $(".elgg-menu-hover[rel='" + mac + "']"); // find the