if(typeof Stickam=="undefined"||!Stickam){var Stickam={};}

Stickam.requesttag = {
    _user_tags: [],
    _latest_update: {'tag'   : undefined,
                     'time'  : 0,
                     'action': undefined},
    isAdded: function(tag_name){
        return jQuery.inArray(tag_name, Stickam.requesttag._user_tags) !== -1;
    },
    init: function() {
        jQuery('ul.request li').each(function(i, tag){
            // タグの取得
            var tag_name = jQuery(tag).children('a').children('span.tag').html();

            // すでに登録してあるタグの場合
            if (Stickam.requesttag.isAdded(tag_name)) {
                Stickam.requesttag.changeAdded({'tag_name' : tag_name,
                                                'tag'      : tag });
            }

            // (追加|更新)ボタンにupdate処理を追加
            jQuery(jQuery(tag).children('button:first')).click(function(){
                Stickam.requesttag.update({'tag_name' : tag_name,
                                           'tag'      : tag,
                                           'action'   : 'add'});

                return false;
            });
        });
    },
    changeAdded: function(param){
        var tag_name = param.tag_name || '';
        var tag      = param.tag      || false;

        if (!tag_name || !tag) {
            return false;
        }

        // classを追加
        jQuery(tag).addClass('added');

        // 追加ボタンを更新ボタンに変更
        jQuery(tag).children('button:first')
            .addClass('update')
                .removeClass('add')
                    .attr({'title': '「' + tag_name + '」を更新'})
                        .html('更新');

        // 削除ボタンの追加
        if (!jQuery(tag).children('button:last').hasClass('remove')) {
            // 削除ボタンの追加
            // update処理の追加
            jQuery('<button class="remove" title="「' + tag_name + '」を削除">削除</button>').appendTo(tag)
                .click(function(){
                    Stickam.requesttag.update({'tag_name' : tag_name,
                                               'tag'      : tag,
                                               'action'   : 'remove'});

                    return false;
                });
        };
    },
    update: function(param){
        var tag_name = param.tag_name || '';
        var tag      = param.tag      || false;
        var action   = param.action && param.action.match(/^(?:add|remove)$/) ? param.action : undefined;

        if (!tag_name || !tag || !action) {
            return false;
        } else if (!Stickam.requesttag._user_id) {
            // user idが取得できていない場合
            // ログインフォームの表示
            jQuery('embed, object, #openchatSwitch').css('visibility', 'hidden');
            jQuery('#loginbox').dialog('open');
        } else if (   Stickam.requesttag._latest_update.tag_name === tag_name
                   && new Date().getTime() < Stickam.requesttag._latest_update.time + 10 * 1000
                   && Stickam.requesttag._latest_update.action === action) {
            // 同一のタグに対して同一の処理を一定時間内に行なった場合
            return false;
        } else {
            Stickam.requesttag._latest_update = {'tag_name': tag_name,
                                                 'time'    : new Date().getTime(),
                                                 'action'  : action}

            jQuery.post('/requesttag/update',
                        {'action': action,
                         'tags'  : tag_name,
                         'mime'  : 'json',
                         'token' : jQuery.cookie('token')},
                         function(result){
                           var tag_name = result.tag_name;

                           if (result.result === 'error' && result.status.length) {
                               // エラー表示
                               alert(result.status.join('\n'));
                           } else if (result.result === 'add complete') {
                               // 追加|更新完了
                               // tagの更新
                               Stickam.requesttag._user_tags.push(tag_name);

                               Stickam.requesttag.changeAdded({'tag_name' : tag_name,
                                                               'tag'      : tag });
                           } else if (result.result === 'remove complete') {
                               // 削除完了
                               // tagの更新
                               Stickam.requesttag._user_tags = (function(){
                                   var result = [];
                                   jQuery.each(Stickam.requesttag._user_tags, function(i, val){
                                       if (val !== tag_name) {
                                           result.push(val)
                                       };
                                   });
                                   return result;
                               })();

                               // 更新ボタンを追加ボタンに変更
                               jQuery(tag).removeClass('added')
                                   .children('button:first')
                                       .addClass('add')
                                           .removeClass('update')
                                               .attr({'title': '「' + tag_name + '」を追加'})
                                                   .html('追加');

                               // 削除ボタンを削除
                               jQuery(tag).children('button:last')
                                   .remove();
                           };
                       },
                       'json');
        };
    }
};

jQuery(function($){
    // リクエストタグのリストがない場合は実行しない
    if (!$('ul.request').size()) {
        return;
    }

    // user idをcookieのtokenから取得
    Stickam.requesttag._user_id = (($.cookie('token')||'').match(/^[a-z0-9_]+\:(\d+)\:/)||[])[1];

    // user idが取得できた場合
    // 該当ユーザのリクエストタグ一覧を取得
    if (Stickam.requesttag._user_id) {
        $.getJSON('/requesttag/tags/' + Stickam.requesttag._user_id,
                  null,
                  function(result){
                      if (result && result.list) {
                       Stickam.requesttag._user_tags = result.list;
                      }
                      // イニシャライズ
                      Stickam.requesttag.init();
                  }
        );
    } else {
        // イニシャライズ
        Stickam.requesttag.init();
    }
});

