/**
 * Rating
 *
 * @author Boz
 * @classDescription MDP Ratings handler.
 **/

mdp.app.Rating = function(){
    /* ---[ CLASS VARIABLES ]--- */
    var locked = false;

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

        /* initialization code */
        setupEventListeners();

    }

    /* ---[ PRIVATE METHODS ]--- */
    function displayObj(obj){
        /* iterate obj */
        var name;
        for(name in obj){
            if(obj.hasOwnProperty(name)){
                var el = $("rating" + name + "display");
                if(el != null){
                    el.setHTML(obj[name]);
                }else{
                    el = $$(".rating" + name + "display");
                    if(el != null && el.length > 0){
                        el.setHTML(obj[name]);
                    }
                }
            }
        }
    }

    function getClassName(num){
        switch(num){
            case "1":
                return "one";
            case "2":
                return "two";
            case "3":
                return "three";
            case "4":
                return "four";
            case "5":
                return "five";
        }
    }

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

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

        /* get all rating elements */
        var ratings = $$(".rating");

        /* iterate through elements */
        for(var i=0; i<ratings.length; i++){
            if(ratings[i].hasClass("capture")){
                /* store parameters and strip non-standard element attributes */
                var el = ratings[i];
                var sitebrand = el.getProperty("sitebrand");
                el.removeProperty("sitebrand");
                var contentType = el.getProperty("contenttype");
                el.removeProperty("contenttype");
                var contentId = el.getProperty("contentid");
                el.removeProperty("contentid");
                var childId = el.getProperty("childid");
                el.removeProperty("childid");
                var channel = el.getProperty("channel");
                el.removeProperty("channel");
                var subChannel = el.getProperty("subchannel");
                el.removeProperty("subchannel");
                var userId = el.getProperty("userid");
                el.removeProperty("userid");

                /* attach DWR method as a handler to rating link's click event */
                $ES("a",el).addEvent("click",function(){
                    if(!locked){
                        locked = true;
                        var link = $(this);
                        var rating = link.getText();
                        SocialMediaService.submitNewRating(sitebrand, contentType, contentId, childId, channel, subChannel, userId, rating, function(remoteResult){
                            locked = false;
                            if(remoteResult.statusCode == 0){
                                /* display results */
                                $$(".ratingcountdisplay").each(function(el){
                                    if(remoteResult.result.count > 1){
                                        el.setHTML("&nbsp;by&nbsp;" + remoteResult.result.count + "&nbsp;people");
                                    }
                                    else{
                                        el.setHTML("&nbsp;by&nbsp;" + remoteResult.result.count + "&nbsp;person");
                                    }
                                });

                                /* update averages */
                                $$(".rating").each(function(el){
                                    if(!el.hasClass("capture")){
                                        el.setProperty("class","rating "+remoteResult.result.averageString);
                                    }
                                });

                                /* get rater */
                                rater = findParent(link,"rating");

                                /* build clone */
                                var clone = rater.clone();
                                clone.removeClass("capture").removeEvents("click").addClass(remoteResult.result.averageString);

                                /* update unrated text with rating */
                                $$(".ratingnone").each(function(el){
                                    var ratingaverage = el.getParent();
                                    el.replaceWith(clone);
                                    var unit = "";
                                    if(remoteResult.result.count > 1){
                                        unit = "people";
                                    }
                                    else{
                                        unit = "person";
                                    }
                                    new Element("span",{"class":"ratingcountdisplay"}).setHTML("&nbsp;by&nbsp;" + remoteResult.result.count + "&nbsp;" + unit).injectInside(ratingaverage);
                                });

                                /* update rating elements */
                                $$(".capture").each(function(el){
                                    el.addClass(getClassName(rating)).removeClass("capture").removeEvents("click");
                                });

                            }
                            else{
                                alert(remoteResult.statusMessage);
                            }
                        });
                    }
                });
            }
        }
    }

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

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

