(function(jQuery) {
	jQuery.fn.extend( {
		// plugin name - messages
			messages : function(url, styles) {
				return this.each(function() {
					new jQuery.Messages(this, url, styles)
				});
			}
		});
	jQuery.Messages = function(g, url, styles) {
		var l = {
			infoClass : "info",
			warnClass : "warn",
			errorClass : "error",
			fatalClass : "fatal",
			styleClass : null,
			style : null
		};
		// Add style & styleClass
		styles = jQuery.extend( {}, l, styles);
		var i = jQuery(g), systemMessages = null;
		i.empty();
		
		jQuery.getJSON(url, function(info) {
			jQuery.each(info, function(a, jsonAttribute) {
				if (jsonAttribute.summary != "")
					if (jsonAttribute.clientId != "") {
						createMessage(jsonAttribute)
					} else {
						createSystemMessages(jsonAttribute)
					}
				systemMessages != null && i.append(systemMessages)
			});
		});
		function createMessage(jsonAttribute) {
			// select element to add message
			var element = jQuery("#message_" + jsonAttribute.clientId);
			if (element.length > 0) {
				setElementText(jsonAttribute, element);
				setElementStyle(jsonAttribute, element);
				element.show()
			} else
				console != "undefined"
						&& console.debug("#message_" + jsonAttribute.clientId
								+ " not found")
		}

		function setElementText(jsonAttribute, element) {
			// Set Text content of element
			element.text(jsonAttribute.summary);
			// Set Title of element
			if (jsonAttribute.detail != "") {
				element.attr("title", element.detail)
			}
		}

		function setElementStyle(jsonAttribute, element) {
			switch (jsonAttribute.level) {
			case 0:
				element.addClass(styles.infoClass);
				break;
			case 1:
				element.addClass(styles.warnClass);
				break;
			case 2:
				element.addClass(styles.errorClass);
				break;
			case 3:
				element.addClass(styles.fatalClass);
				break
			}
		}

		function createSystemMessages(jsonAttribute) {
			if (systemMessages == null) {
				systemMessages = jQuery("<ul />");
				styles.styleClass != null
						&& systemMessages.addClass(styles.styleClass);
				styles.style != null
						&& systemMessages.attr("style", styles.style)
			}
			var element = jQuery("<li />");
			setElementText(jsonAttribute, element);
			setElementStyle(jsonAttribute, element);
			systemMessages.append(element)
		}

	}
})(jQuery);
