var i18n = {};

$(function() {
    $(document).trigger('init');
});

$.init = function(initFunc) {
    $(document).bind('init', function(data, destination) { 
        initFunc((destination === undefined)? $(document) : $(destination));
    });
}

$.fn.frameLinkClick = function() {
   var $this = $(this);
   var url = $this.attr('href');
   //TODO: Handle other targets than _top and _blank
   if ($this.attr('target') !== undefined) {
       switch($this.attr('target'))
       {
       case '_top':
           document.location = url;
           return false;
       case '_blank':
           window.open(this.href, '', '')
           return false;
       }
   }
   $this.closest('.ajax-frame').loadAndInit(url);
   return false;
}

$.fn.loadAndInit = function(url) {
  return this.each(function()
    {
    t = $(this);
    t.load(url, function() {
        $(document).trigger('init', t);
    });
  });
};

$.fn.postAndInit = function(url, data) {
  return this.each(function()
    {
    t = $(this);
    t.load(url, data, function() {
        $(document).trigger('init', t);
    });
  });
};


$.fn.formSuccess = function(result) {
    frame = this.form.closest('.ajax-frame');
    frame.html(result);
    $(document).trigger('init', frame);
}

$.fn.storeForm = function(formData, jqForm, options){
    this.form = jqForm;
}

$.fn.findAndSelf = function(selector) {
    result = this.find(selector);

    if (this.is(selector)) {
        result = result.add(this);
    }

    return result;
}

$.fn.autoload = function() {
    $this = $(this);
    $this.closest('.ajax-frame').loadAndInit($this.attr('data-url'));
}

$.commonInit = function(context) {
    context.find(".hide-no-js").removeClass("hide-no-js");
    context.find(".validation-error").hide().fadeIn("def");    
    ajaxFrames = context.findAndSelf('.ajax-frame');

    if (ajaxFrames.length > 0) {        
        ajaxFrames.find('a[href]').click($.fn.frameLinkClick);
        ajaxFrames.find('span.autoload').each($.fn.autoload);

        if ($.fn.ajaxForm) {
            var options = {};
            options.beforeSubmit = $.fn.storeForm;
            options.success = $.fn.formSuccess;

            ajaxFrames.find('form').ajaxForm(options);
        }
    }
}

$.init($.commonInit)

$.fn.favoriteOperation = function(operation)
{   
    var gameId = $(this).attr('data-id');
    var url = $(this).closest('[data-url]').attr('data-url');
    $(this).closest('.favorite-game-container').postAndInit(url, {
        model: 'favorite_game',
        operation: operation,
        game_id: gameId
    });
}

function initFavoriteControls(context) {
    context.find('.fav_mini .up').click(function() {
        $(this).favoriteOperation('move_up');
    });

    context.find('.fav_mini .down').click(function() {
        $(this).favoriteOperation('move_down');
    });
    
    context.find('.fav_mini .delete').click(function() {
        $(this).favoriteOperation('delete');
    });
    
}

$.init(initFavoriteControls);

$.fn.talkGetName = function() {
    if (this.hasClass('comments')) return 'comment';
    if (this.hasClass('guestbook')) return 'guestbook';
    if (this.hasClass('forum')) return 'forum';
}

$.talkInit = function(context) {
    context.find('.talk-answer').click(function()
    {
        var talk = $(this).closest('.talk');
        var parentTime = $(this).attr('data-parent-time');
        var destination = $(this).attr('data-answer-url');
        var name = talk.talkGetName();

        adder = talk.find('.talk-form');
        adder.attr('action', destination);
        adder.find('.form-type').text(i18n[name].answer_label);
        adder.find('[name=submit]').val(i18n[name].answer_submit);
        adder.find('[name=parent_time]').val(parentTime);
        adder.find('[name=operation]').val('answer');
        adder.find('[name=text]').val('');
        adder.find('.validation-error').hide();
        $(this).closest('.entry').append(adder);
        adder.show();

        return false;
    });

    context.find('.talk-edit').click(function()
    {
        var talk = $(this).closest('.talk');
        var name = talk.talkGetName();
        var entryId = $(this).attr('data-entry-id');
        var content = $(this).attr('data-content');
        var destination = $(this).attr('data-edit-url');

        adder = talk.find('.talk-form');
        adder.attr('action', destination);

        if (!talk.hasClass('unconfirmed-talk')) {
            //Für Ändern-und-Bestätigen gibt es eigene Texte, die schon gesetzt sind
            adder.find('.form-type').text(i18n[name].edit_label);
            adder.find('[name=submit]').val(i18n[name].edit_submit);
        }

        adder.find('[name=id]').val(entryId);
        adder.find('[name=text]').val(content);
        adder.find('[name=operation]').val('edit_text');
        $(this).closest('.entry').append(adder);
        adder.show();

        return false;
    });

    context.find('.comments').each(function(){
        if ($(this).closest('.ajax-frame').length == 1) {
            $(this).find('.pagination a').click(function() {
                $.scrollTo(context.find('.comments .entry-statistics'));
            });
        }
    });

}

function talkFormSuccess(result) {
    talk = this.form.closest('.talk');

    if (talk.hasClass('unconfirmed-talk')) {
        if (result == '') {
            //Statistik aktualisieren
            statistics = talk.find('.talk-statistics');
            var oldCount = parseInt(statistics.text().match(/\d+/));
            statistics.text(
                i18n[talk.attr('data-name')].unconfirmed_statistics.
                    replace(/\{entry_count\}/, oldCount-1));

            if (talk.find('.entry:visible').length == 1) {
                //Alle Kommentare bearbeitet - Neue holen.
                window.location.reload(true);
            }

            this.form.closest('.entry').fadeOut(200);
        } else {
            this.form.find('.validation-error').remove();
            this.form.prepend(result);
        }
    } else {
        talkReplace(result, t);
    }
}

$.init($.talkInit);
