Subversion-Projekte lars-tiefland.prado

Revision

Blame | Letzte Änderung | Log anzeigen | RSS feed

Prado.WebUI.TRatingList = Base.extend(
{
        selectedIndex : -1,
        rating: -1,
        readOnly : false,

        constructor : function(options)
        {
                var cap = $(options.CaptionID);
                this.options = Object.extend(
                {
                        caption : cap ? cap.innerHTML : ''
                }, options || {});

                Prado.WebUI.TRatingList.register(this);
                this._init();
                this.selectedIndex = options.SelectedIndex;
                this.rating = options.Rating;
                this.readOnly = options.ReadOnly
                if(options.Rating <= 0 && options.SelectedIndex >= 0)
                        this.rating = options.SelectedIndex+1;
                this.setReadOnly(this.readOnly);
        },

        _init: function(options)
        {
                Element.addClassName($(this.options.ListID),this.options.Style);
                this.radios = new Array();
                this._mouseOvers = new Array();
                this._mouseOuts = new Array();
                this._clicks = new Array();
                var index=0;
                for(var i = 0; i<this.options.ItemCount; i++)
                {
                        var radio = $(this.options.ListID+'_c'+i);
                        var td = radio.parentNode.parentNode;
                        if(radio && td.tagName.toLowerCase()=='td')
                        {
                                this.radios.push(radio);
                                this._mouseOvers.push(this.hover.bindEvent(this,index));
                                this._mouseOuts.push(this.recover.bindEvent(this,index));
                                this._clicks.push(this.click.bindEvent(this,index));
                                index++;
                                Element.addClassName(td,"rating");
                        }
                }
        },

        hover : function(ev,index)
        {
                if(this.readOnly==true) return;
                for(var i = 0; i<this.radios.length; i++)
                {
                        var node = this.radios[i].parentNode.parentNode;
                        var action = i <= index ? 'addClassName' : 'removeClassName'
                        Element[action](node,"rating_hover");
                        Element.removeClassName(node,"rating_selected");
                        Element.removeClassName(node,"rating_half");
                }
                this.showCaption(this.getIndexCaption(index));
        },

        recover : function(ev,index)
        {
                if(this.readOnly==true) return;
                this.showRating(this.rating);
                this.showCaption(this.options.caption);
        },

        click : function(ev, index)
        {
                if(this.readOnly==true) return;
                for(var i = 0; i<this.radios.length; i++)
                        this.radios[i].checked = (i == index);
                this.selectedIndex = index;
                this.setRating(index+1);

                if(this.options['AutoPostBack']==true){
                        this.dispatchRequest(ev);
                }
        },

        dispatchRequest : function(ev)
        {
                var requestOptions = Object.extend(
                {
                        ID : this.options.ListID+"_c"+this.selectedIndex,
                        EventTarget : this.options.ListName+"$c"+this.selectedIndex
                },this.options);
                Prado.PostBack(ev, requestOptions);
        },

        setRating : function(value)
        {
                this.rating = value;
                var base = Math.floor(value-1);
                var remainder = value - base-1;
                var halfMax = this.options.HalfRating["1"];
                var index = remainder > halfMax ? base+1 : base;
                for(var i = 0; i<this.radios.length; i++)
                        this.radios[i].checked = (i == index);

                var caption = this.getIndexCaption(index);
                this.setCaption(caption);
                this.showCaption(caption);

                this.showRating(this.rating);
        },

        showRating: function(value)
        {
                var base = Math.floor(value-1);
                var remainder = value - base-1;
                var halfMin = this.options.HalfRating["0"];
                var halfMax = this.options.HalfRating["1"];
                var index = remainder > halfMax ? base+1 : base;
                var hasHalf = remainder >= halfMin && remainder <= halfMax;
                for(var i = 0; i<this.radios.length; i++)
                {
                        var node = this.radios[i].parentNode.parentNode;
                        var action = i > index ? 'removeClassName' : 'addClassName';
                        Element[action](node, "rating_selected");
                        if(i==index+1 && hasHalf)
                                Element.addClassName(node, "rating_half");
                        else
                                Element.removeClassName(node, "rating_half");
                        Element.removeClassName(node,"rating_hover");
                }
        },
        
        getIndexCaption : function(index)
        {
                return index > -1 ? this.radios[index].value : this.options.caption;
        },

        showCaption : function(value)
        {
                var caption = $(this.options.CaptionID);
                if(caption) caption.innerHTML = value;
                $(this.options.ListID).title = value;
        },

        setCaption : function(value)
        {
                this.options.caption = value;
                this.showCaption(value);
        },

        setReadOnly : function(value)
        {
                this.readOnly = value;
                for(var i = 0; i<this.radios.length; i++)
                {
                        
                        var action = value ? 'addClassName' : 'removeClassName';
                        Element[action](this.radios[i].parentNode.parentNode, "rating_disabled");
                        
                        var action = value ? 'stopObserving' : 'observe';
                        var td = this.radios[i].parentNode.parentNode;
                        Event[action](td, "mouseover", this._mouseOvers[i]);
                        Event[action](td, "mouseout", this._mouseOuts[i]);
                        Event[action](td, "click", this._clicks[i]);
                }

                this.showRating(this.rating);
        }
},
{
ratings : {},
register : function(rating)
{
        Prado.WebUI.TRatingList.ratings[rating.options.ListID] = rating;
},

setReadOnly : function(id,value)
{
        Prado.WebUI.TRatingList.ratings[id].setReadOnly(value);
},

setRating : function(id,value)
{
        Prado.WebUI.TRatingList.ratings[id].setRating(value);
},

setCaption : function(id,value)
{
        Prado.WebUI.TRatingList.ratings[id].setCaption(value);
}
});

Prado.WebUI.TActiveRatingList = Prado.WebUI.TRatingList.extend( 
{       
        dispatchRequest : function(ev)
        {
                var requestOptions = Object.extend(
                {
                        ID : this.options.ListID+"_c"+this.selectedIndex,
                        EventTarget : this.options.ListName+"$c"+this.selectedIndex
                },this.options);
                var request = new Prado.CallbackRequest(requestOptions.EventTarget, requestOptions);
                if(request.dispatch()==false)
                        Event.stop(ev);
        }
        
});