/**
 * Comments
 *
 * @author Boz
 * @classDescription UI functionality needed by comments.
 * @css
 *   .comment_preview
 *   .comment_teaser
 *   .comment_full
 *   .comment_seemore
 *   #commentform
 *   #commentscountdisplay
 *
 **/

mdp.app.Comments = function(){
    /* ---[ CLASS VARIABLES ]--- */
    var self = this;
    this.pages;
    this.totalResults;
    this.page = 1;
    this.resultsPerPage = 5;
    this.pagesPerPage = 4;
    this.args;
    this.startIndex;
    this.startPage;
    this.endPage;
    var locked = false;

    /* public */

    /* private */

    /* ---[ CONSTRUCTOR ]--- */
    function init(){

        var commentscountdisplay = $E(".commentscountdisplay");
        if(commentscountdisplay != null){
            var text = commentscountdisplay.getText();
            self.totalResults = parseInt(text,10);
            updatePagination();
            $$(".commentscountdisplay").setHTML(self.totalResults);
        }

        /* initialization code */
        setupEventListeners();

        /* setup facebook */
        var fbenabled = $("fbenabled");
        if(fbenabled != null){
            if(fbenabled.getProperty("data-apikey") == null){ alert("You Forget To Pass FBApiKey to the Comments Form Frag!"); }
            else{
                var apikey = fbenabled.getProperty("data-apikey");
                FB.init(apikey,"/common/common/facebook/xd_receiver.jsp");
            }
        }

    }

    /* ---[ PUBLIC METHODS ]--- */
    this.nextPage = function(){
        this.getPage(this.page + 1);
    };

    this.prevPage = function(){
        this.getPage(this.page - 1);
    };

    this.getPage = function(page){
        if(typeof(this.params) == 'undefined'){
            this.args = getParams();
        }
        this.args.page = page;
        this.page = page;
        getComments();
        updatePagination();
    };

    this.postToFacebook = function(template_id,comment ){
        if(comment!= null && template_id != null){            
            var template_data = $("fbenabled").getProperty("data-templatedata");            
            if(template_data != null){
                template_data = Json.evaluate(template_data);
                template_data["comment-body"] = comment;
                FB.Connect.showFeedDialog(template_id,template_data, null, null, null, FB.RequireConnect.promptConnect);
            }
        }
    };

    /* ---[ PRIVATE METHODS ]--- */
    function previewComment(){
        var link = this;

        /* get comment preview divs */
        var comment_preview = findParent(link,"comment_preview");
        var comment_teaser = $E(".comment_teaser",comment_preview);
        var comment_full = $E(".comment_full",comment_preview);

        /* animate and show full text */
        comment_teaser.setHTML(comment_full.getText());
        link.remove();
    }

    function findParent(el,_class){
        if(el.hasClass(_class)){
            return el;
        }
        else{
            return findParent(el.getParent(),_class);
        }
    }

    function updatePagination(){
        /* calculate pages */
        if(self.totalResults > 0){
            self.pages = Math.ceil(self.totalResults/self.resultsPerPage);
            self.startIndex = self.page * self.resultsPerPage;
            self.startPage = Math.ceil(self.page/self.pagesPerPage);
            if(self.page == self.pages){
                self.endPage = self.page;
            }else{
                self.endPage = self.pages<self.pagesPerPage?self.startPage+self.pages-1:self.startPage+self.pagesPerPage-1;
            }
            var pagination;
            var div;
            var pagesdiv;

            /* build pagination */
            div = new Element("div",{"class":"commentpagination"});

            if(self.page == 1){
                new Element("a",{"class":"pre disable"}).setHTML("Prev").injectInside(div);
            }
            else{
                new Element("a",{"class":"pre"}).setHTML("Prev").injectInside(div);
            }

            pagesdiv = new Element("span",{"class":"pages"}).injectInside(div);
            for(var j=self.startPage; j<=self.endPage; j++){
                if(j == self.page){
                    new Element("a",{"class":"unlink"}).setHTML(j).injectInside(pagesdiv);
                }
                else{
                    new Element("a").setHTML(j).injectInside(pagesdiv);
                }
                if(j<self.endPage){
                    pagesdiv.appendText(" | ");
                }
            }

            new Element("span").setHTML(" of " + self.pages + " ").injectInside(pagesdiv);

            if(self.page==self.pages){
                new Element("a",{"class":"nxt disable"}).setHTML("Next").injectInside(div);
            }else{
                new Element("a",{"class":"nxt"}).setHTML("Next").injectInside(div);
            }

            /* replace old pagination */
            pagination = $$(".commentpagination");
            for(var i=0; i<pagination.length; i++){
                pagination[i].replaceWith(div.clone());
            }

            if(self.page > 1){
                $$(".pre").addEvent("click",function(){
                    mdp.comments.prevPage();
                });
            }

            if(self.page < self.pages){
                $$(".nxt").addEvent("click",function(){
                    mdp.comments.nextPage();
                });
            }

            $$(".pages a").addEvent("click",function(){
                mdp.comments.getPage(parseInt($(this).getText(),10));
            });
        }
    }

    function getComments(updatePreview){
        new Ajax("/common/socialmedia/commentsListFrag.jsp",{update:$("comments"),data:self.args,onComplete:function(){
            updatePagination();
            if(updatePreview){
                /* update the comment preview */
                updateCommentPreview();
            }

            updateReportAbuseLinks();
        }}).request();
    }

    function getParams(){
        return {
            commenttext:$("commenttext").getValue(),
            sitebrand:$("commentsitebrand").getValue(),
            contentType: $("commentcontenttype").getValue(),
            contentId : $("commentcontentid").getValue(),
            childId : $("commentchildid").getValue(),
            channel : $("commentchannel").getValue(),
            subchannel : $("commentsubchannel").getValue(),
            userId : $("commentuserid").getValue()
        };
    }

    function updateCommentPreview(){
        /* Get the first comment
        var comment = $E(".commentdetail p").getText();
        $$(".comment_teaser").setHTML(comment.length > 100?comment.substr(0,100) + "...":comment);
        $$(".comment_full").setHTML(comment);
        $$(".comment_teaser").removeProperty("height");
        */
    }

    function updateReportAbuseLinks(){
        /* detect reportAbuse instance */
        if(typeof(mdp.reportAbuse) == 'object'){
            mdp.reportAbuse.reAttachEvents($("comments"));
        }
    }

    /* ---[ EVENT LISTENERS ]--- */
    function setupEventListeners(){

        /* enable submit button */
        var commentsubmit = $("commentsubmit");
        if(commentsubmit != null){
            commentsubmit.removeProperty("disabled");
        }

        /* Comment preview event handler */
        $$(".comment_seemore").addEvent("click",previewComment);

        /* Comment Form */
        var commentform = $("commentform");
        if(commentform != null){
            $("commentform").addEvent("submit",function(e){
                new Event(e).preventDefault();
                    /* get form values */
                    self.args=getParams();
                    self.args.commenttext = $("commenttext").getValue();

                    /* send to facebook */
                    var fbenabled = $("fbenabled");
                    if(fbenabled != null && fbenabled.getValue() == "on"){
                        self.postToFacebook(parseInt(fbenabled.getProperty("data-templateid"),10),self.args.commenttext);
                    }

                    /* submit comment */
                    if(!locked){
                        locked = true;
                        SocialMediaService.submitNewComment(self.args.sitebrand, self.args.contentType, self.args.contentId, self.args.childId, self.args.channel, self.args.subchannel, self.args.userId, self.args.commenttext, function(remoteResult){
                            locked = false;
                            if(remoteResult.statusCode == 0){
                                /* Update total results */
                                self.totalResults = remoteResult.result.count;

                                /* reset pagination */
                                self.page = 1;

                                /* refresh comments and rebuild pagination */
                                getComments(true);

                                /* clear comment form */
                                $("commenttext").value = "";

                                /* update comment count displays */
                                $$(".commentscountdisplay").setHTML(self.totalResults);
                            }
                            else{
                                alert(remoteResult.statusMessage);
                            }
                        });
                    }
            });
        }

    }

    /* ---[ RUN ]--- */
    init();
};

window.addEvent('domready', function(){
    mdp.comments = new mdp.app.Comments();
});
