
////////////////////////////////////////////////////////////////////////////////////////////////////
// RatingManager construction
////////////////////////////////////////////////////////////////////////////////////////////////////
var RatingManager =
    {
        cookie : 'ratingCM',
        url : '/communities/rating_cm/display.do',
        ratedIds : new Object(),
        lock : false,
        controls : new Object(),

        createControl : function(iId, iArtistId, iRating, iRatingCount)
            {
                var control = new RatingControl(iId, iArtistId);
                var list;
                
                if (isUndefined(this.controls[iArtistId]))
                    list = this.controls[iArtistId] = new Array();
                else
                    list = this.controls[iArtistId];
                list[list.length] = control;
                                
                control.init(iRating, iRatingCount);
                return control;
            },

        loadFromCookies : function()
            {
                var values = Cookies.get(RatingManager.cookie);
                if (isUndefined(values))
                    return;
                values = values.replace(/:$/,'');
                var ids = values.split(':');
                for(var i = 0; i < ids.length; i++)
                {
                    if (ids[i] != '')
                    {
                        var id = parseInt(ids[i], 36);
                        RatingManager.ratedIds[id] = true;
                    }
                }
            },

        saveToCookies : function()
            {
                var today = new Date();
                var expiry = new Date(today.getFullYear() + 1, today.getMonth(), today.getDate());
                var values = '';
                for (var id in RatingManager.ratedIds)
                    values += id + ':';
                Cookies.set(RatingManager.cookie, values, expiry);
            },

        isRated : function(iArtistId)
            {
                return (RatingManager.ratedIds[iArtistId] == true);
            },

        onRatingSubmitted : function(iUrl, iContent) 
            {
                var xm = new XmlManager(iContent);
                var errMsg = xm.getFirstValue('/content/errMsg');
                if (errMsg != null)
                {
                    alert(errMsg);
                    RatingManager.lock = false;
                    return;
                }
                var id = xm.getFirstValue('/content/id');
                //var rating = xm.getFirstValue('/content/average');
                var count = xm.getFirstValue('/content/count');
                
                RatingManager.updateControls(id, null, count);
                
                RatingManager.lock = false;
            },

        updateControls : function(iArtistId, iRating, iCount)
            {
                var list = RatingManager.controls[iArtistId];
                
                if (!isUndefined(list))
                {
                    for (var i = 0; i < list.length; i++)
                    {
                        list[i].setRating(iRating, iCount);
                        list[i].update();
                    }
                }
            },

        submitRating : function(iArtistId, iRate)
            {
                if (RatingManager.lock)
                    return;
                RatingManager.lock = true;

                RatingManager.ratedIds[iArtistId] = true;

                var http = new HttpRequestHandler(true, RatingManager.onRatingSubmitted);
                var data = 'id='+iArtistId+'&rating='+iRate;

                http.post(RatingManager.url, data, 'text/xml');
            },

        isRatingInProgress : function()
            {
                return (RatingManager.lock == true);
            }

    };

RatingManager.loadFromCookies();



////////////////////////////////////////////////////////////////////////////////////////////////////
// RatingControl construction
////////////////////////////////////////////////////////////////////////////////////////////////////
function RatingControl(iId, iArtistId)
{
    var ratingControl = this;

    this._super = Widget;
    this._super(iId);

    this.rateControl = new RateControl(iId+'_rate', iArtistId);
    this.ratedControl = new RatedControl(iId+'_rated', iArtistId);

    this.artistId = iArtistId;


    this.init = function(iRating, iRatingCount)
        {
            ratingControl.rateControl.init(iRating, iRatingCount);
            ratingControl.ratedControl.init(iRating, iRatingCount);
            ratingControl.update();
        }

    this.setRating = function(iRating, iRatingCount)
        { ratingControl.rateControl.setRating(iRating, iRatingCount); ratingControl.ratedControl.setRating(iRating, iRatingCount); }

    this.onRate = function(iRating)
        {
            ratingControl.ratedControl.setRating(iRating, null);
            ratingControl.ratedControl.alreadyRatedEnabled = false;
        }

    this.update = function()
        {
            if (RatingManager.isRated(ratingControl.artistId))
            {
                ratingControl.ratedControl.update();
                ratingControl.rateControl.hide();
                ratingControl.ratedControl.show();
            }
            else
            {
                ratingControl.rateControl.update();
                ratingControl.rateControl.show();
                ratingControl.ratedControl.hide();                
            }
        }
        
    this.rateControl.onRateEventHandlers.add(this.onRate);
        
}


////////////////////////////////////////////////////////////////////////////////////////////////////
// RateControl
////////////////////////////////////////////////////////////////////////////////////////////////////
function RateControl(iId, iArtistId)
{
    var rateControl = this;

    this._super = Widget;
    this._super(iId);

    this.chart = new Widget(iId+'_chart');

    this.artistId = iArtistId;
    this.rating = 0;
    this.ratingCount = 0;
    this.mouseOver = false;
    this.enabled = true;

    this.onRateEventHandlers = new EventHandler();


    this.init = function(iRating, iRatingCount)
        {
            rateControl.rating = iRating;
            rateControl.ratingCount = iRatingCount;

            // events generators
            function onClickEvent(iRating)
            { return function() { rateControl.rate(iRating); } }
            function onMouseOverEvent(iRating)
            { return function() { rateControl.onMouseOver(iRating); } }

            // set events on components
            for (var i = 0; i < 5; i++)
            {
                var star = document.getElementById(iId+'-'+i);
                star.onclick = onClickEvent(i+1);
                star.onmouseover = onMouseOverEvent(i+1);
                star.onmouseout = rateControl.onMouseOut;
            }
        }

    this.setRating = function(iRating, iRatingCount)
        {
            if (iRating != null)
                rateControl.rating = iRating;
            if (iRatingCount != null)
                rateControl.ratingCount = iRatingCount;
        }

    this.rate = function(iRating)
        {
            if (rateControl.enabled)
            {
                rateControl.enabled = false;
                rateControl.rating = iRating;
                rateControl.onRateEventHandlers.invoke(iRating);
                RatingManager.submitRating(rateControl.artistId, iRating);
            }
        }

    this.onMouseOver = function(iRating)
        {
            if (rateControl.enabled)
            {
                rateControl.mouseOver = true;
                rateControl.update(iRating);
            }
        }

    this.onMouseOut = function()
        {
            if (rateControl.enabled)
            {
                rateControl.mouseOver = false;
                window.setTimeout(rateControl.onMouseOutTimeout, 300);
            }
        }

    this.onMouseOutTimeout = function()
        {
            if (rateControl.enabled && !rateControl.mouseOver)
                rateControl.update();
        }

    this.update = function(iRating)
        {
            var rateChartElement = rateControl.chart.getElement();
            var classBaseName = rateChartElement.className;
            var rating = (iRating) ? iRating : rateControl.rating;

            for (var i = 0; i < 5; i++)
            {
                var star = document.getElementById(iId+'-'+i);
                var className = (i < rating) ? classBaseName+'-on' : classBaseName+'-off';
                star.className = className;
            }
        }

}


////////////////////////////////////////////////////////////////////////////////////////////////////
// RatedControl
////////////////////////////////////////////////////////////////////////////////////////////////////
function RatedControl(iId, iArtistId)
{
    var ratedControl = this;
    
    this._super = Widget;
    this._super(iId);
    
    this.alreadyRated = new Widget(iId+'_alreadyrated');
    this.ratings = new Widget(iId+'_ratings');
    this.ratingsCount = new Widget(iId+'_ratingscount');
    this.ratingsMsg = new Widget(iId+'_ratingsmsg');
    this.chart = new Widget(iId+'_chart');
    
    this.alreadyRatedEnabled = true;
    this.artistId = iArtistId;
    this.rating = 0;
    this.ratingCount = 0;
    
    this.init = function(iRating, iRatingCount)
        {
            ratedControl.rating = iRating;
            ratedControl.ratingCount = iRatingCount;        
            
            ratedControl.chart.getElement().onmouseover = ratedControl.onMouseOver;
            ratedControl.chart.getElement().onmouseout = ratedControl.onMouseOut;
        }

    this.setRating = function(iRating, iRatingCount)
        {
            if (iRating != null)
                ratedControl.rating = iRating;
            if (iRatingCount != null)
                ratedControl.ratingCount = iRatingCount;
        }
            
    this.onMouseOver = function()
        {
            if (ratedControl.alreadyRatedEnabled)
            {
                ratedControl.ratings.hide();
                ratedControl.alreadyRated.show();
            }
        }
    
    this.onMouseOut = function()
        {
            if (ratedControl.alreadyRatedEnabled)
            {
                ratedControl.alreadyRated.hide();
                ratedControl.ratings.show();
            }
        }
    
    this.update = function()
        {
            var ratedChartElement = ratedControl.chart.getElement();
            var classBaseName = ratedChartElement.className;

            // chart
            for (var i = 0; i < 5; i++)
            {
                var star = document.getElementById(iId+'-'+i);
                var className = (i < ratedControl.rating) ? classBaseName+'-on' : classBaseName+'-off';
                star.className = className;
            }
            
            // count & msg
            ratedControl.ratingsCount.getElement().innerHTML = ratedControl.ratingCount;
            if (ratedControl.ratingCount > 1)
                ratedControl.ratingsMsg.getElement().innerHTML = Language.getEntry('ratings');
            else
                ratedControl.ratingsMsg.getElement().innerHTML = Language.getEntry('rating');
        }    
    
}
