/*
 * Kurze Benachrichtigungs-Popups als jQuery plugin.
 * 
 */

// Statische Funktionen für interne Verwendung
jQuery.status = {

	/**
	 * Signalisiert, das die Aktion gestartet wurde und das Popup erscheinen
	 * soll.
	 * 
	 * @param obj
	 *            Das jQuery-Objekt auf dem das Popup erscheinen soll
	 * @param message
	 *            Die anzuzeigende Nachricht
	 * @param align
	 *            An welcher Kante soll das Popup ausgerichtet werden
	 */
	started: function(obj, message, align) {
		var popup = jQuery.status.getPopup(obj, align);
		
		popup.addClass('loading');
		popup.children('span:first').text(message);
	},

	/**
	 * Signalisiert, das die Aktion abgeschlossen wurde und das Popup wieder
	 * ausgeblendet werden kann. Ist autoClose auf true gesetzt, verschwindet
	 * die Nachricht automatisch nach einigen Sekunden.
	 * 
	 * @param obj
	 *            Das jQuery-Objekt auf dem das Popup erscheinen soll
	 * @param message
	 *            Die anzuzeigende Nachricht
	 * @param autoClose
	 *            Bestimmt, ob die Nachricht automatisch geschlossen wird
	 * @param align
	 *            An welcher Kante soll das Popup ausgerichtet werden
	 */
	completed: function(obj, message, autoClose, align) {
		var popup = jQuery.status.getPopup(obj, align);
		
		popup.removeClass('loading');
		popup.children('span:first').text(message);
			
		if (autoClose) {
			popup.addClass('autoclose');
			popup.animate({opacity: 1.0}, 2000, 'linear', jQuery.status.closeHandler);
		}
	},
	
	/**
	 * Liefert das Popup zu einem Element. Existiert noch keins, wird ein neues
	 * Popup angelegt, anderfalls wird das bestehende Popup zurückgegeben.
	 * 
	 * @private
	 */
	getPopup: function(forElement, align) {
		var popup = forElement.next('div.popup_message');
		if (popup.length == 0) {
			forElement.after('<div class="popup_message"><span></span> <a href="#" title="Schließen" class="close">&#xd7;</a></div>');
			popup = forElement.next();
			popup.children('a.close').click(jQuery.status.closeHandler);
			
			var top = 0;
			var left = 0;
			
			if (align == 'right') {
				top = forElement.position().top + (forElement.outerHeight() - popup.outerHeight()) / 2;
				left = forElement.position().left + forElement.outerWidth();
			} else {
				top = forElement.position().top + (forElement.outerHeight() - popup.outerHeight()) / 2;
				left = forElement.position().left;
			}
			
			popup
				.css({
					top: top,
					left: left
				})
				.fadeOut(0)
				.fadeIn('fast');
		}
		
		return popup;
	},
	
	/**
	 * Event-Handler zum Schließen der Nachricht
	 * 
	 * @private
	 */
	closeHandler: function(e) {
		var popup = jQuery(this).closest('div.popup_message');
		popup.fadeOut('slow', function() {
			popup.remove();
		});
		
		return false;
	}
};

/**
 * Die Pluginmethode, die ein Popup auf beliebigen Elementen verwaltet. Mit dem
 * ersten Parameter wird gesteuert, in welcher Phase sich das Popup befinden
 * soll. Die übergebene Nachricht wird innerhalb des Popups angezeigt.
 * 
 * @param state
 *            Die Phase des Popups, entweder 'started' oder 'completed'
 * @param message
 *            Die anzuzeigende Nachricht
 * @param autoClose
 *            (optional) Bestimmt, ob die Nachricht automatisch geschlossen wird
 * @param align
 *            (optional) An welcher Kante soll das Popup ausgerichtet werden,
 *            entweder 'left' oder 'right'
 * @returns Das jQuery-Objekt
 */
jQuery.fn.status = function(state, message, autoClose, align) {
	if (autoClose == undefined) {
		autoClose = true;
	}
	if (align == undefined) {
		align = 'left';
	}
	
	return this.each(function() {
		if (state == 'started') {
			jQuery.status.started(jQuery(this), message, align);
		} else if (state == 'completed') {
			jQuery.status.completed(jQuery(this), message, autoClose, align);
		}
	});
};
