/**
 * GlobalMessageManager (JS)
 *
 * Copyright: Alike Co.,Ltd.
 */

(function($){

    var self = window.GlobalMessageManager = {};

    // 定数

    /// アクセスキー メッセージ本文
    self.KEY_MESSAGE    = 'message';

    /// アクセスキー スタイル
    self.KEY_STYLE      = 'style';

    /// アクセスキー アイコン種別
    self.KEY_ICON_TYPE  = 'iconType';

    /// アクセスキー 消えるまでの時間
    self.KEY_EXPIRES    = 'expires';

    /// アクセスキー リンク文字列
    self.KEY_LINK_TEXT  = 'linkText';

    /// アクセスキー リンクURL
    self.KEY_LINK_URL   = 'linkUrl';

    /// アクセスキー アイコンURL
    self.KEY_ICON_URL   = 'iconUrl';

    /// アクセスキー アイコン幅
    self.KEY_ICON_WIDTH = 'iconWidth';

    /// アクセスキー アイコン高さ
    self.KEY_ICON_HEIGHT = 'iconHeight';


    /// メッセージスタイル スライド式
    self.STYLE_SLIDE    = 1;

    /// メッセージスタイル ポップアップ
    self.STYLE_POPUP    = 2;


    /// メッセージアイコン種別 なし
    self.ICON_TYPE_NONE     = 0;

    /// メッセージアイコン種別 Info
    self.ICON_TYPE_INFO     = 1;

    /// メッセージアイコン種別 Warning
    self.ICON_TYPE_WARNING  = 2;

    /// メッセージアイコン種別 Error
    self.ICON_TYPE_ERROR    = 3;

    /// メッセージアイコン種別 Complete
    self.ICON_TYPE_COMPLETE = 4;

    /// メッセージアイコン種別 Custom
    self.ICON_TYPE_CUSTOM   = 5;


    // フィールド

    /// メッセージプール
    self.messages = null;

    /// アイコン
    self.icons = {};
    self.icons[GlobalMessageManager.ICON_TYPE_INFO]      = "/images/icon/global_message/info__001.gif";
    self.icons[GlobalMessageManager.ICON_TYPE_WARNING]   = "/images/icon/global_message/alert__001.gif";
    self.icons[GlobalMessageManager.ICON_TYPE_ERROR]     = "/images/icon/global_message/error__001.gif";
    self.icons[GlobalMessageManager.ICON_TYPE_COMPLETE]  = "/images/icon/global_message/checked__001.gif";

    self.IE6 = (navigator.userAgent.indexOf("MSIE 6")>=0) ? true : false;

    // デフォルト設定
    self.defaultOpts = {};
    self.defaultOpts[GlobalMessageManager.KEY_ICON_TYPE] = GlobalMessageManager.ICON_TYPE_INFO;
    self.defaultOpts[GlobalMessageManager.KEY_EXPIRES]   = 3000;
    self.defaultOpts[GlobalMessageManager.KEY_STYLE]     = GlobalMessageManager.STYLE_SLIDE;

    /**
     * メッセージをプールに追加します.
     *
     * message_ 以外は全てオプション
     */
    self.append = function(message_,
                           opts_)
    {
        if (!opts_)
        {
            opts_ = {};
        }
        opts_[GlobalMessageManager.KEY_MESSAGE] = message_;
        var msg = $.extend({}, self.defaultOpts, opts_);
        self.messages.push(msg);
    };

    /**
     * 与えられたメッセージを表示します.
     * プールに別のメッセージもあった場合は合わせて表示されます
     */
    self.appendAndShow = function(message_,
                                  opts_)
    {
        self.append(message_,
                    opts_);
        self.show();
    };

    /**
     * プールのメッセージを全て表示します
     */
    self.show = function()
    {
        if (typeof self.messages !== "object" || !self.messages.length)
        {
            return;
        }

        // 追加対象になるコンテナ
        var targetContainer = null;

        // 表示の短い順にソート
        self.messages.sort(self.messageComparator);

        //
        // 各メッセージ表示処理
        //
        $.each(self.messages, function()
        {
            var messageElement = null;
            var expireTimer = null;
            var expire = null;

            //
            // ベース部分
            //
            if (this[self.KEY_STYLE] == self.STYLE_POPUP)
            {
                messageElement = $('<div class="global_message_popup"></div>');
                messageElement.append($('<div class="global_message_popup_bg"></div>'));
                targetContainer = $("body");
                var expire = function(){
                    messageElement.fadeOut(200, function(){messageElement.remove();});
                };
            }
            else
            {
                var mouseover = false;
                messageElement = $('<li class="global_message_slide"></li>');
                messageElement.append($('<div class="global_message_slide_bg"></div>'));
                targetContainer = $("#global_messages");

                messageElement.hover(function(){ mouseover = true; }, function(){ mouseover = false; });
                var removeElement = function () {
                    messageElement.animate({height: '0'}, 200, undefined, function(){messageElement.remove();});
                };
                var expire = function(e_){
                    if (expireTimer)
                    {
                        // マウスオーバー中だったら粘る
                        if (mouseover && (typeof e_ !== "object" || e_.type !== "click"))
                        {
                            expireTimer = window.setTimeout(expire, 500);
                            return;
                        }
                        // else
                        window.clearTimeout(expireTimer);
                    }
                    removeElement();
                };
            }

            //
            // テーブルレイアウト
            //
            var tbody = $('<tbody></tbody>');
            var tr = $('<tr></tr>').appendTo(tbody);

            //
            // アイコン設定
            //
            if (this[self.KEY_ICON_TYPE] == self.ICON_TYPE_CUSTOM)
            {
                // カスタムアイコン
                tr.append('<td class="global_message_body_icon"><img src="' + this[self.KEY_ICON_URL]
                                        + '" style="vertical-align:middle;" width="' + this[self.KEY_ICON_WIDTH]
                                        + '" height="' + this[self.KEY_ICON_HEIGHT]
                                        + '" alt="" /></td>');
            }
            else if (this[self.KEY_ICON_TYPE] != self.ICON_TYPE_NONE)
            {
                // 規定のアイコン
                tr.append('<td class="global_message_body_icon"><img src="' + self.icons[this[self.KEY_ICON_TYPE]] + '" style="vertical-align:middle;" width="36" height="34" alt="" /></td>');
            }
            // else アイコンなし


            //
            // メッセージ設定
            //
            var messageTd = $('<td class="global_message_body_message">' + this[self.KEY_MESSAGE] + '</td>');
            if (this[self.KEY_ICON_TYPE] == self.ICON_TYPE_ERROR ||
                this[self.KEY_ICON_TYPE] == self.ICON_TYPE_WARNING)
            {
                messageTd.addClass('font_yellow');
            }
            tr.append(messageTd);

            //
            // リンク設定
            //
            if (this[self.KEY_LINK_TEXT] && this[self.KEY_LINK_URL])
            {
                var url = this[self.KEY_LINK_URL];
                if (!url.match(new RegExp("https?://")))
                {
                    // プロトコル補完
                    url = "http://" + window.location.hostname + url;
                }
                var messageTd = $('<td class="global_message_body_link"><a href="' + url + '" target="_blank">'
                                  + this[self.KEY_LINK_TEXT]
                                  + '</a></td>');
                tr.append(messageTd);
            }

            //
            // Expire Timeによる表示・処理切り替え
            //
            if (this[self.KEY_EXPIRES] <= 0)
            {
                //
                // 閉じるボタン設定
                //
                var button = $('<img src="/images/icon/global_message/close__001.gif" height="15" width="15" alt="×" class="global_message_close" />')
                                    .click(expire);
                tr.append($('<td class="global_message_body_close_button"></td>').append(button));
            }
            else
            {
                //
                // 自動クローズ設定
                //
                expireTimer = window.setTimeout(expire, this[self.KEY_EXPIRES]);
                // ついでにどこをクリックしても閉じるようにしておく
                messageElement.click(expire);
            }

            messageElement.append($('<table class="global_message_body"></table>').append(tbody));
            targetContainer.prepend(messageElement);

            if (this[self.KEY_STYLE] == self.STYLE_POPUP)
            {
                messageElement.fadeIn(200);
            }
            else
            {
                messageElement
                    .animate({
                        height: messageElement.css('line-height') || '50px'
                    }, 200);
            }
        });

        // fixedが効かない子対策
        if (self.IE6)
        {
            document.documentElement.scrollTop = 0;
        }
        self.messages = [];
    };

    // メッセージの優先度比較器
    self.messageComparator = function(a_, b_)
    {
        if (a_.style == self.STYLE_POPUP) return -1;
        if (b_.style == self.STYLE_POPUP) return 1;
        if (a_.expires == 0) return 1;
        if (b_.expires == 0) return -1;
        return a_.expires - b_.expires;
    }

    // 初期メッセージの表示
    $(function($) {
        self.messages = window.initMessages || [];
        self.show();
    });

})(jQuery);

