/**
 * マイジャンル登録ポップアップ＆バナー制御
 * 
 * @requires jQuery
 */

(function($){
    
    var _namespace = '.mygenre_popup';
    
    var myGenrePopup, MyGenrePopup = function () {
        myGenrePopup = this;
        this.init();
    };

    MyGenrePopup.prototype = {
        
        init: function () {
            $(document)
                .ready(function() {
                    myGenrePopup.toggleBanner();
                    
                    $('._show_mygenre_regist').bind('click', myGenrePopup.onShowRegist);
                    $('._show_mygenre_login').bind('click', myGenrePopup.onShowLogin);
                    $('._show_mygenre_about').bind('click', myGenrePopup.onShowAbout);
                    $('._popup_mail').bind('click', myGenrePopup.onMailToggle);
                    $('._popup_submit').bind('click', myGenrePopup.onSubmit);
                    $('._popup_close').bind('click', myGenrePopup.onClose);
                });
        },

        /**
         * ログインチェック（cookie）
         * @returns {boolean}
         */
        isLogin: function () {
            var loginchecked = $.cookie('loginchecked')|0;
            return (loginchecked === 1 || loginchecked === 3);
        },

        /**
         * 「マイジャンルって何？」バナーの切り替え
         */
        toggleBanner: function () {
            $('._show_mygenre_about')
                .each(function(i, o){
                    var banner = $(o);
                    var genrelist = $('#left_favorite_genre');
                    if (myGenrePopup.isLogin()) {
                        // マイジャンル未登録の場合もバナー表示
                        if (genrelist.length >= 0) {
                            (function(){
                                // リスト取得後に表示判定
                                if (genrelist.hasClass('_loaded')) {
                                    if (genrelist.find('li').length <= 0)  {
                                        banner.show();
                                    }
                                } else {
                                    setTimeout(arguments.callee, 500);
                                }
                            })();
                        }
                    } else {
                        // 未ログインならバナー表示
                        banner.show();
                    }
                });
        },

        /**
         * ポップアップ全非表示
         */
        hidePopups: function () {
            $('._popup').removeClass('on');
            myGenrePopup.hideErrors();
            $('body')
                .unbind('click' + _namespace)
                .unbind('keydown' + _namespace);
        },

        /**
         * エラー全非表示
         */
        hideErrors: function(){
            $('input[name=mygenre_name]').removeClass('input_error');
            $('#mygenre_error').closest('td').addClass('non_display');
        },
        
        /**
         * ポップアップ表示
         * @param {jQuery} popup
         */
        show: function (popup) {
            myGenrePopup.hidePopups();
            popup.parent().css({ position: 'relative' });
            popup.addClass('on');
            
            // 閉じる
            $('body')
                .bind('click' + _namespace, function(e) {
                    if (!$.contains(popup.get(0), e.target)) {
                        myGenrePopup.hidePopups();
                    }
                })
                .bind('keydown' + _namespace, function (e) {
                    // esc
                    if (e.keyCode === 27) {
                        myGenrePopup.hidePopups();
                    }
                });
        },
        
        /**
         * 完了メッセージの表示
         * @param {string} msg
         */
        showComplete: function (msg) {
            myGenrePopup.hidePopups();
            $('._popup_complete')
                .addClass('on')
                .find('#mygenre_name')
                    .text(msg);
        },

        /**
         * マイジャンル登録
         * @param {string} registUrl
         * @param {string} searchUrl
         */
        registMygenre: function (registUrl, searchUrl) {
            myGenrePopup.hideErrors();
            
            $.post(registUrl, {
                'name': $('input[name=mygenre_name]').val(),
                'mail': $('._popup_mail').filter('.on').data('receive') === 'on' ? 1 : 0,
                'url': searchUrl
            }, function(data){
                if(data.result){
                    // success
                    myGenrePopup.showComplete(data.name);
                    // cache clear
                    $.mygenre_cache.clear();
                } else {
                    // error
                    $('input[name=mygenre_name]').addClass('input_error');
                    $('#mygenre_error').text(data.msg).closest('td').removeClass('non_display');
                }
            },'json');
        },

        /**
         * ログイン表示または画面遷移イベント
         * @param {Event} e
         */
        onShowLogin: function (e) {
            e.preventDefault();
            e.stopPropagation();
            var btn = $(e.currentTarget),
                url = btn.attr('href');
            
            if (myGenrePopup.isLogin()) {
                if (url) {
                    location.href = url;
                }
            } else {
                $('._popup_mygenre_common')
                    .removeClass('popup_login')
                    .appendTo(btn.parent())
                    .removeAttr('style')
                    .css({
                        right: 0
                    })
                    .addClass('popup_login');

                setTimeout(function(){
                    // ログインのリンク先を本来のURLにする
                    var popup = $('._popup_mygenre_common');
                    popup.find('.my_genre_reg_btm a').attr('href', url);
                    myGenrePopup.show(popup);
                }, 1);
            }
        },

        /**
         * バナークリックイベント
         * @param {Event} e
         */
        onShowAbout: function (e) {
            e.preventDefault();
            e.stopPropagation();
            myGenrePopup.show( $('._popup_mygenre_about') );
        },

        /**
         * 登録またはログインポップアップ表示イベント
         * @param {Event} e
         */
        onShowRegist: function (e) {
            e.preventDefault();
            e.stopPropagation();
            
            if (myGenrePopup.isLogin()) {
                myGenrePopup.show( $('._popup_regist') );
            } else {
                myGenrePopup.show( $('._popup_login') );
            }
        },

        /**
         * ポップアップ非表示イベント
         * @param {Event} e
         */
        onClose: function (e) {
            e.preventDefault();
            myGenrePopup.hidePopups();
        },

        /**
         * お知らせメール切り替えイベント
         * @param {Event} e
         */
        onMailToggle: function (e) {
            e.preventDefault();
            var elm = $(this);
            elm
                .siblings()
                    .removeClass('on')
                    .end()
                .addClass('on')
            ;
        },

        /**
         * 登録送信時イベント
         * @param {Event} e
         */
        onSubmit: function (e) {
            var btn = $(e.currentTarget);
            e.preventDefault();
//            console.log(btn, btn.data('regist-url'), btn.data('search-url'));
            myGenrePopup.registMygenre(btn.data('regist-url'), btn.data('search-url'));
        }
        
    };
    
    new MyGenrePopup();
    
})(jQuery);
