var AtvComments = new Class({
    Implements : [ Options, Events ],

    target_id: null,
    comments_json: null,
    comments_array: [],
    owner: false,

    show_all_url: null,
    read_url: null,
    create_url: null,
    delete_url: null,
    report_url: null,

    options: {
        page: 1,
        entries_per_page: null,
        praktikant_name: '',
        comments_show_all_url: '',
        comments_read_url: '',
        comments_create_url: '',
        comments_delete_url: '',
        comments_report_url: '',
        is_teaser: true,
        is_pinnwand: false
    },

    initialize: function(options)
    {
        this.setOptions(options);
    },

    triggerChangedCommentTarget: function(target_id)
    {
        this.target_id = target_id;

        this.show_all_url = this.options.comments_show_all_url.replace(/TARGETID/g, target_id);
        this.read_url = this.options.comments_read_url.replace(/TARGETID/g, target_id);
        this.create_url = this.options.comments_create_url.replace(/TARGETID/g, target_id);
        this.delete_url = this.options.comments_delete_url.replace(/TARGETID/g, target_id);
        this.report_url = this.options.comments_report_url.replace(/TARGETID/g, target_id);

        this.resetOnTrigger();
        this.loadComments();
    },

    triggerChangedPage: function(page)
    {
        this.options.page = page;

        this.resetOnTrigger();
        this.loadComments();
    },

    resetOnTrigger: function()
    {
        this.comments_array = [];
        $('create_root_comment').removeEvents('click');
        $('comment_box_loading').show();
        $('comment-entries').empty();
        if (!this.options.is_teaser)
        {
            $('comment-entries-right').empty();
            $('comment-entries-right').getParent().hide();
        }
        $('comment_footer').empty();
    },

    loadComments: function()
    {
        var self = this;
        try
        {
            var jsonRequest = new Request.JSON({
                url: self.read_url,
                onSuccess: function(data) {
                    self.comments_json = data;
                    self.build();
                }}).get({
                    'page':self.options.page,
                    'entries_per_page':self.options.entries_per_page
                });
        }
        catch (e)
        {
            self.logger(e);
        }
    },

    build: function()
    {
        var self = this;

        $('comment_box_loading').hide();

        if (ATV.isAuthenticated())
        {
            $('comments_box_input').show();
        }
        else
        {
            $('comments_box_login').show();
        }

        $('create_root_comment').addEvent('click', function(event)
        {
            event.stop();

            var answer = $('comment_post_text').value.trim();

            if ('' != answer)
            {
                self.createCommentMessage(0, answer);
                $('comments_box_input').hide();
                $('comment_box_loading').show();
            }
        });

        var comments = self.comments_json.comments;
        $each(comments, function(comment)
        {
            child_comments = [];

            var children_count = 0;
            $each(comment.children, function(child_comment)
            {
                child_comments.push(child_comment);
                children_count++;
            },this);

            child_comments.sort(self.sortById);

            self.comments_array.push({
                'comment_id': comment.id,
                'comment': comment,
                'has_children': comment.has_children,
                'children_count': children_count,
                'children': child_comments
            });
        },this);

        // correct order for new browsers (chrome, opera)
        self.comments_array.sort(self.sortByCommentId);


        self.renderHeadline();

        if (self.options.is_teaser)
        {
            self.renderCommentList();
            self.renderShowAllLink();
        }
        else
        {
            self.renderCommentList();
            self.renderPagination();
        }

        self.redrawElementForIe7($('comment_footer'));
    },

    renderCommentList: function()
    {
        var self = this;
        var comments_count = self.comments_array.length;
        var comments_ul_left = new Element('ul');

        if (!self.options.is_teaser)
        {
            var comments_middle = (self.options.entries_per_page / 2).floor();
            var comments_ul_right = new Element('ul');
        }

        for (var i = 0; i < comments_count; i++)
        {
            var comment = self.comments_array[i];
            var comment_li = self.renderComment(comment.comment, true, true);

            if (self.options.is_teaser || i < comments_middle)
            {
                comment_li.inject(comments_ul_left);
            }
            else
            {
                comment_li.inject(comments_ul_right);
            }

            if (comment.has_children)
            {
                var children_comments_ul = new Element('ul', {
                    'id': 'ul_' + comment.comment.id
                });

                for (var j = 0; j < comment.children_count; j++)
                {
                    var child_comment = comment.children[j];
                    var visibility = false;
                    if (j >= comment.children_count - 2)
                    {
                        visibility = true;
                    }

                    var children_comment_li = self.renderComment(child_comment, false, visibility);
                    children_comment_li.inject(children_comments_ul);
                }

                children_comments_ul.inject(comment_li);

                if (comment.children_count > 2)
                {
                    var more_link = new Element('li', {
                        'class': 'more',
                        'text': 'Weitere Kommentare anzeigen (' + (comment.children_count - 2) + ')',
                        'events': {
                            'click': function() {

                                this.getParent().getElements('.hide').each(function(li)
                                {
                                    li.removeClass('hide');
                                })

                                this.addClass('hide');
                            }
                        }
                    });

                    more_link.inject(children_comments_ul, 'top');
                }

                if (null !== ATV.getLoggedInUser())
                {
                    var btn_reply = new Element('li', {
                    }).grab(new Element('a', {
                        'class': 'btn_reply',
                        'href': '#',
                        'text': 'Kommentieren'
                    })).inject(children_comments_ul);

                    btn_reply.addEvent('click', (function()
                    {
                        var c = comment.comment;
                        return function(event)
                        {
                            event.stop();
                            self.replyComment(c);
                            self.redrawElementForIe7($('comment_footer'));
                        }
                    })());
                }
            }
        }

        comments_ul_left.inject($('comment-entries'));

        if (!self.options.is_teaser && i >= comments_middle)
        {
            comments_ul_right.inject($('comment-entries-right'));
            $('comment-entries-right').getParent().show();
        }
    },

    renderHeadline: function()
    {
        $('comment_headline').getElement('span').set('text', '(' + this.comments_json.total + ')');
    },

    renderShowAllLink: function()
    {
        var self = this;

        if(self.comments_json.total > self.options.entries_per_page && null != self.read_url)
        {
            var all_comments_link = new Element('a', {
                'id':'all_comments_link',
                'class':'arrow_link',
                'href':self.show_all_url
            }).set('html', 'Alle anzeigen<span>&nbsp;</span>');

            $('comment_footer').grab(all_comments_link).show();
        }
    },

    renderPagination: function()
    {
        var self = this;
        var current_page = self.options.page;
        var total_pages = self.comments_json.total_pages;

        if (1 >= total_pages)
        {
            return;
        }

        var pagination_ul = new Element('ul', {
            'id': 'comment_pagination',
            'class': 'pager'
        });

        /*
         * prev link
         */
        var page_prev_element_inner = new Element('span', {
            'text': 'eine Seite zurück',
            'title': 'eine Seite zurück'
        });

        if (current_page > 1)
        {
            page_prev_element_inner.addEvent('click', function()
            {
                self.triggerChangedPage(current_page - 1);
            });
        }
        else
        {
            page_prev_element_inner.addClass('deactive');
        }

        var page_prev_element = new Element('li', {
                'class': 'prev'
        }).grab(page_prev_element_inner);

        page_prev_element.inject(pagination_ul);

        /*
         * page list
         */
        var draw_dots = true;

        for (var p = 1; p <= total_pages; p++)
        {
            if (
                (p >= (current_page - 2) && p <= (current_page + 2))
                || p == 1
                || p == total_pages
                || total_pages < 10
            )
            {
                var page_element = new Element('li').grab(new Element('a', {
                    'text': p,
                    'href': '#',
                    'events': {
                        'click': (function()
                        {
                            var page = p;
                            return function(event)
                            {
                                event.stop();
                                self.triggerChangedPage(page);
                            }
                        })()
                    }
                }));

                if (p == self.options.page)
                {
                    page_element.addClass('active');
                }

                page_element.inject(pagination_ul);

                draw_dots = true;
            }
            else if (draw_dots)
            {
                var page_element = new Element('li').set('text', '...');
                page_element.inject(pagination_ul);

                draw_dots = false;
            }
        }

        /*
         * next link
         */
        var page_next_element_inner = new Element('span', {
            'text': 'eine Seite weiter',
            'title': 'eine Seite weiter'
        });

        if (current_page < total_pages)
        {
            page_next_element_inner.addEvent('click', function()
            {
                self.triggerChangedPage(current_page + 1);
            });
        }
        else
        {
            page_next_element_inner.addClass('deactive');
        }

        var page_next_element = new Element('li', {
                'class': 'next'
        }).grab(page_next_element_inner);

        page_next_element.inject(pagination_ul);

        $('comment_footer').grab(pagination_ul);
    },

    renderComment: function(comment, show_reply, visibility)
    {
        var self = this;
        var logged_in_user = ATV.getLoggedInUser();

        if (0 != comment.user.id)
		{
            var avatar = new Element('a', {
                'href': comment.user.link
            }).grab(new Element('img', {
                'src': comment.user.avatar,
                'class':'avatar'
            }));
        }

        var btn_wrapper = new Element('div', {
            'class':'btn_wrapper'
        });

        if (true === show_reply)
        {
            var btn_reply = new Element('a', {
                'class':'btn_reply',
                'href': '#',
                'text':'Kommentieren'
            }).inject(btn_wrapper);

            btn_reply.addEvent('click', function(event)
            {
                event.stop();

                if (null != logged_in_user)
                {
                    self.replyComment(comment);
                    self.redrawElementForIe7($('all_comments_link'));
                }
                else
                {
                    atvAlert('Bitte logge Dich ein, um Videos zu kommentieren','Bitte Einloggen');
                }
            });
        }

        if ('' != self.report_url && ((null === logged_in_user || logged_in_user.userId != comment.user.id) && !self.owner))
        {
            var btn_report = new Element('a', {
                'class':'btn_report',
                'text':'Melden',
                'events': {
                    'click': function() {
                        $('report_comment_commentid').set('value',comment.id);
                        $('report_comment_overlay_submit').removeEvents('click');

                        $('report_comment_overlay_submit').addEvent('click', function(event)
                        {
                            event.stop();
                            self.reportComment(comment);
                        });

                        $('report_comment_overlay_cancel').addEvent('click', function(event)
                        {
                            event.stop();
                            reportCommentBox.hide();
                        });

                        reportCommentBox.show();
                    }
                }
            }).inject(btn_wrapper);
        }

        var is_praktikant = (null !== logged_in_user && self.options.praktikant_name == logged_in_user.userName);
        var is_owner = (self.owner || (null !== logged_in_user && logged_in_user.cmsUserId == self.comments_json.owner_id));
        var is_creator = (null !== logged_in_user && logged_in_user.userId == comment.user.id);

        if (is_owner || is_creator || is_praktikant)
        {
            var btn_remove = new Element('a', {
                'class':'btn_remove',
                'text':'Löschen',
                'events': {
                    'click': function() {
                        self.removeComment(comment.id);
                    }
                }
            }).inject(btn_wrapper);
        }

        var comment_body = new Element('div', {
           'id':'c_'+comment.id,
            'class':'comment'
        }).adopt([
            new Element('span', {
                'class':'user'
            }).set('html', (comment.user.id != 0) ? 'von <a id="u_'+comment.id+'" href="'+comment.user.link+'">'+comment.user.username+'</a>' : 'von: User exitiert nicht mehr!'),
            new Element('em', {
                'text': comment.create_date
            }),
            new Element('p', {
                'html':comment.message
            }),
            btn_wrapper
        ]);

        var comment_li = new Element('li', {
            'id': 'li_' + comment.id,
            'class': (true === visibility) ? 'show' : 'hide'
        }).adopt([
            avatar,
            comment_body
        ]);

        return comment_li;
    },

    replyComment: function(comment)
    {
        var self = this;

        if($('reply_wrapper'))
        {
           $('reply_wrapper').dispose();
        }

        var commentsReplyParent = comment.id
        var parent = $('li_'+commentsReplyParent);

        var wrapper = new Element('div', {
           'id':'reply_wrapper'
        });

        var headline = new Element('h3',{
            'text': (!self.options.is_pinnwand) ? 'Auf Kommentar antworten:' : 'Auf Eintrag antworten:'
        });
        var input = new Element('input', {
            'type':'hidden',
            'value':commentsReplyParent
        });
        var textarea = new Element('textarea');
        var submit = new Element('a', {
            'class':'arrow_link',
            'href':'#'
        }).set('html', 'Antwort abschicken<span>&nbsp;</span>');

        submit.addEvent('click', function(event)
        {
            event.stop();
            self.redrawElementForIe7($('all_comments_link'));

            var answer = textarea.value.trim();

            if('' != answer)
            {
                self.createCommentMessage(commentsReplyParent, answer);
                wrapper.set('html', '<p class="loading"></p>');
            }
        });

        wrapper.adopt([
            headline,
            input,
            textarea,
            submit
        ]);
        parent.grab(wrapper);
    },

    createCommentMessage: function(parent_id, comment_text)
    {
        var self = this;
        self.owner = true;

        var jsonRequest = new Request.JSON({
            url: self.create_url,
            onComplete: function(retval)
            {
                if (retval.status)
                {
                    self.comments_json.total++;
                    if (!self.options.is_teaser && 1  != self.options.page && 0 == parent_id)
                    {
                        self.options.page = 1;
                        self.triggerChangedCommentTarget(self.target_id);
                    }
                    else
                    {
                        self.renderHeadline();
                    }

                    if (0 != parent_id)
                    {
                        var comment_li = self.renderComment(retval.data, false, true);

                        $('reply_wrapper').dispose();
                        var target_ul = $('ul_' + parent_id);

                        if(!target_ul)
                        {
                            target_ul = new Element('ul', {
                                'id': 'ul_' + parent_id
                            });

                            comment_li.inject(target_ul);
                            target_ul.inject($('li_' + parent_id));
                        }
                        else
                        {
                            var last_element = target_ul.getLast();
                            if(last_element.hasClass('more'))
                            {
                                comment_li.inject(last_element, 'before');
                            }
                            else
                            {
                                comment_li.inject(target_ul);
                            }
                        }
                    }
                    else
                    {
                        $('comment_post_text').set('value','');
                        $('comments_box_input').show();
                        $('comment_box_loading').hide();

                        var comment_li = self.renderComment(retval.data, true, true);

                        var comments_ul = $('comment-entries').getFirst();
                        comment_li.inject(comments_ul, 'top');
                    }
                }
                else
                {
                    atvAlert('Eintrag konnte nicht erstellt werden!','Eingaben überprüfen');
                }
            }
        }).post({
            'message':comment_text,
            'parent_id':parent_id
        });
    },

    removeComment: function(comment_id)
    {
        var self = this;

        atvConfirm('Möchtest du diesen Eintrag wirklich entfernen?',"Entfernen", false, function ()
        {
            var jsonRequest = new Request.JSON({
                url: self.delete_url.replace(/COMMENTID/g, comment_id),
                onComplete: function(retval)
                {
                    if (retval.status)
                    {
                        $('li_' + comment_id).destroy();
                        atvAlert('Eintrag entfernt!');

                        var children_count = 0;
                        for (var i = 0; i < self.comments_array.length; i++)
                        {
                            var comment_temp = self.comments_array[i];
                            if (comment_temp['comment_id'] === comment_id)
                            {
                                children_count = comment_temp.children_count;
                            }
                        }

                        self.comments_json.total = self.comments_json.total - children_count - 1;
                        self.renderHeadline();
                        self.trackPageAndReloadAds();
                    }
                    else
                    {
                        atvAlert('Der Eintrag konnte nicht entfernt werden.','Entfernen fehlgeschlagen');
                    }
                }
            }).post({});
        });
    },

    reportComment: function(comment)
    {
        var self = this;
        var params = {};

        if ($('report_comment_username'))
        {
            // this user is a guest, so we'll accept this info
            params.reporter_name = $('report_comment_username').get('value');
            params.reporter_email = $('report_comment_email').get('value');
        }
        params.reporter_message = $('report_comment_message').get('value');

        var jsonRequest = new Request.JSON({
            url: self.report_url.replace(/COMMENTID/g, comment.id),
            onComplete: function(retval)
            {
                if (retval.status)
                {
                    $('report_comment_message').set('value','');
                    reportCommentBox.hide();
                    atvAlert('Vielen Dank für Dein Feedback!','Danke');
                    self.trackPageAndReloadAds();
                }
                else
                {
                    reportCommentBox.hide();
                    atvAlert('Deine Meldung konnte nicht abgeschickt werden!','Abschicken fehlgeschlagen');
                }
            }
        }).post(params);
    },

    redrawElementForIe7: function(element)
    {
        /*
         * fixes ie7 browser bug - no chance to fix with css
         */
        if (true === Browser.Engine.trident && Browser.Engine.version == 5)
        {
			if(element)
			{
                var width = element.getStyle('width');
                element.setStyle('width', 'auto');

                if ('0px' != width)
                {
                    element.setStyle('width', width);
                }
			}

        }
    },

    sortById: function (a,b)
    {
        return a.id - b.id;
    },

    sortByCommentId: function (a,b)
    {
        return b.comment_id - a.comment_id;
    },

    trackPageAndReloadAds: function()
    {
        googleAnalyticsPageTrackStatic();
        oewaAnalyticsPageTrackStatic();
        adreload('HOME');
    }
});

