if (typeof util === "undefined") {
    var util = {};
}

if (!util.message) {
    util.message = (function() {
        // public interface
        return {
            clearDisplayedMessages: function() {
                $(".messages-box > div.displayed-messages > ul").each(function() {
                    $(this).remove();
                });
                return $(".messages-box > div").first();
            },

            displayInfo: function(text) {
                this.displayMessages(createMessage("info", text));
            },

            displayQuestion: function(text) {
                this.displayMessages(createMessage("question", text));
            },

            displayWarning: function(text) {
                this.displayMessages(createMessage("warning", text));
            },

            displayError: function(text) {
                this.displayMessages(createMessage("error", text));
            },

            // display json messages in the format {messages:[{"type":type, "text":text}]}
            displayMessages: function(objectWithMessages) {
                if (!objectWithMessages ||
                    !objectWithMessages.hasOwnProperty("messages") ||
                    !Array.isArray(objectWithMessages.messages)) {
                    return;
                }
                var messagesDiv = this.clearDisplayedMessages();
                messagesDiv.addClass("displayed-messages");
                var html = "<ul class='testIdGlobalMessageBox'>";
                objectWithMessages.messages.forEach(function(message) {
                    html += "<li class='" + getMessageStyle(message.type) + "'>" + message.text + "</li>";
                });
                html += "</ul>";
                messagesDiv.html(html);
            },

            get: function(key, language) {
                try {
                    var msg = JSON.stringify(messages);
                    var parsedMsg = JSON.parse(msg);

                    var lang = language ? language : "en";
                    var msgNode = parsedMsg[key];
                    if (msgNode) {
                        return msgNode[lang];
                    }
                } catch(e){
                      console.log(e);
                      return key;
                }
                return key;
            }
        };

        // private methods
        function createMessage(type, text) {
            if (!!type && !!text) {
                return {"messages":[{"type":type, "text":text}]};
            }
            return undefined;
        }

        function getMessageStyle(type) {
            if (!!type) {
                switch (type.toLowerCase()) {
                case "question":
                    return "portlet-msg-help";
                case "warning":
                    return "portlet-msg-alert";
                case "error":
                    return "portlet-msg-error";
                }
            }
            return "portlet-msg-info";
        }
    })();
}

// initialization on DOM ready
jQuery(function() {
    $(document).off("click", ".messages-box");
    $(document).on("click", ".messages-box", function() {
        // toggle only messages to be able showing the box again
        $(this).find("ul li").slideToggle();
    });
});
