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 ()
 *
 * This function emits the popup, ui event that plugins can register for to provide custom
 * positioning for elements.  The handler is passed an object with the values:
 *	popupSelector: The selector used to find the popup
 *	popup:         The popup jQuery element as found by the selector
 *	popper:        The jquery element whose click event initiated a popup.
 *
 * The handler function must return false to tell this function to abort automatic placement.
 *
 * @param {Object} event
 * @return void
 */
elgg.ui.popsUp = function(event) {
	event.preventDefault();
	var target = $(this).toggleClass('elgg-state-active').attr('href');
	var $target = $(target);
	// emit a hook to allow plugins to position and control popups
	var obj = {
		popupSelector: target,
		popup: $target,
		popper: $(this)
	};
	
	if (!elgg.trigger_event('popup', 'ui', obj)) {
		return;
	}
	// hide if already open
	if ($target.is(':visible')) {
		$target.fadeOut();
		return;
	}
	$target.appendTo('body')
		.fadeIn()
		.position({
			'my': 'left top',
			'at': 'right bottom',
			'of': $(this)
		});
}
/**
 * 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();
	}
};
/**
 * Repositions the likes popup.
 */
elgg.ui.likesPopupHandler = function(event, type, object) {
	if (object.popup.hasClass('elgg-likes-list')) {
		if (object.popup.is(':visible')) {
			object.popup.fadeOut();
			return false;
		}
		
		object.popup.appendTo('body')
			.fadeIn()
			.position({
				'my': 'right bottom',
				'at': 'left top',
				'of': object.popper
			});
	}
	return false;
}
elgg.register_event_handler('init', 'system', elgg.ui.init);
elgg.register_event_handler('popup', 'ui', elgg.ui.likesPopupHandler);