
Type.registerNamespace('RealityDigital.OpusWeb.Scripts');

RealityDigital.OpusWeb.Scripts.Rating = function(associatedElement) {
    RealityDigital.OpusWeb.Scripts.Rating.initializeBase(this, [ associatedElement ]);
    
    var _starCssClass;
    var _filledStarCssClass;
    var _emptyStarCssClass;
    
    var _readOnly = false;
    var _rating = 0;
    var _currentRating = 0;

    var _stars;
    
    var _starClickHandler;
    var _starMouseMoveHandler;
    var _mouseOutHandler;
    
    var _timer;
    var _tickHandler;
    var _blinkInterval = 250;
    var _blinkFlag = false;
    var _blinking = false;
    
    this.get_emptyStarCssClass = function() {
        return _emptyStarCssClass;
    }
    this.set_emptyStarCssClass = function(value) {
        _emptyStarCssClass = value;
    }
    
    this.get_filledStarCssClass = function() {
        return _filledStarCssClass;
    }
    this.set_filledStarCssClass = function(value) {
        _filledStarCssClass = value;
    }
    
    this.get_currentRating = function() {
        return _currentRating;
    }
    
    this.get_rating = function() {
        return _rating;
    }
    this.set_rating = function(value) {
        if (_rating != value) {
            _rating = value;
            _currentRating = value;
            
            if (this.get_isInitialized()) {
                this._update();
                this.raisePropertyChanged('rating');
            }
        }
    }
    
    this.get_readOnly = function() {
        return _readOnly;
    }
    this.set_readOnly = function(value) {
        if(value != _readOnly) {
            _readOnly = value;
            this.raisePropertyChanged('readOnly');
        }
    }
    
    this.get_starCssClass = function() {
        return _starCssClass;
    }
    this.set_starCssClass = function(value) {
        _starCssClass = value;
    }
    
    this.get_blinkInterval = function() {
        return _blinkInterval;
    }
    this.set_blinkInterval = function(value) {
        _blinkInterval = value;
    }
    
    this.rated = this.createEvent();
    
    this.dispose = function() {
        if (_stars) {
            for (var i = 1; i <= 5; i++) {
                var starElement = _stars[i - 1];
                
                starElement.detachEvent('onclick', _starClickHandler);
                starElement.detachEvent('onmouseover', _starMouseOverHandler);
            }
            
            this.element.detachEvent('onmouseout', _mouseOutHandler);
        
            _mouseOutHandler = null;
            _starClickHandler = null;
            _starMouseOverHandler = null;
            
            _tickHandler = null;
            
            _stars = null;
        }
        
        _timer.dispose();
        
        RealityDigital.OpusWeb.Scripts.Rating.callBaseMethod(this, 'dispose');
    }
    
    this.getDescriptor = function() {
        var td = RealityDigital.OpusWeb.Scripts.Rating.callBaseMethod(this, 'getDescriptor');
        
        td.addProperty('emptyStarCssClass', String);
        td.addProperty('filledStarCssClass', String);
        td.addProperty('rating', Number);
        td.addProperty('currentRating', Number);
        td.addProperty('readOnly', Boolean);
        td.addProperty('starCssClass', String);
        td.addProperty('blinkInterval', Number);
        td.addEvent('rated', true);
        td.addMethod('startBlinking');
        td.addMethod('stopBlinking');
        
        return td;
    }
    
    this.initialize = function() {
        RealityDigital.OpusWeb.Scripts.Rating.callBaseMethod(this, 'initialize');
        
        _mouseOutHandler = Function.createDelegate(this, mouseOutHandler);
        _starClickHandler = Function.createDelegate(this, starClickHandler);
        _starMouseOverHandler = Function.createDelegate(this, starMouseoverHandler);
        
        _tickHandler = Function.createDelegate(this, tickHandler);
        
        _timer = new Sys.Timer();
        _timer.set_interval(_blinkInterval);
        _timer.tick.add(tickHandler);
        
        if(this.element.innerHTML) {
            this.element.innerHTML = '';
        }
                               
        _stars = [];
        for (var i = 1; i <= 5; i++) {
            var starElement = document.createElement('SPAN');
            starElement.className = _starCssClass;
            starElement.value = i;
            starElement.innerHTML = '&nbsp;'
            
            this.element.appendChild(starElement);
            _stars.add(starElement);
            
            starElement.attachEvent('onclick', _starClickHandler);
            starElement.attachEvent('onmouseover', _starMouseOverHandler);
        }
        
        this.element.attachEvent('onmouseout', _mouseOutHandler);
        this._update();
    }
    
    function mouseOutHandler() {
        if (_readOnly) {
            return;
        }
        _currentRating = _rating;
        this.raisePropertyChanged('currentRating');
        this._update();
    }
    
    function starClickHandler() {
        if (_readOnly) {
            return;
        }
        if (_rating != _currentRating) {
            this.set_rating(_currentRating);
            
            this.rated.invoke(this, Sys.EventArgs.Empty);
        }
    }
    
    function starMouseoverHandler() {
        if (_readOnly) {
            return;
        }
        _currentRating = window.event.srcElement.value;
        this.raisePropertyChanged('currentRating');
        this._update();
    }
    
    this._update = function() {
        for (var i = 1; i <= 5; i++) {
            var starElement = _stars[i - 1];

            if (_currentRating >= i) {
                Sys.UI.Control.removeCssClass(starElement, _emptyStarCssClass);
                Sys.UI.Control.addCssClass(starElement, _filledStarCssClass);
            }
            else {
                Sys.UI.Control.removeCssClass(starElement, _filledStarCssClass);
                Sys.UI.Control.addCssClass(starElement, _emptyStarCssClass);
            }
        }
    }
    
    this.startBlinking = function() {
        _blinking = true;
        _timer.set_enabled(true);
    }
    this.stopBlinking = function() {
        _blinking = _blinkFlag = false;
    }
    
    function tickHandler() {
        if(!_blinking && (_blinkFlag == true)) {
            _timer.set_enabled(false);
        }
        
        for (var i = 1; i <= 5; i++) {
            var starElement = _stars[i - 1];
            
            if ((_blinkFlag == true) && (_currentRating >= i)) {
                Sys.UI.Control.removeCssClass(starElement, _emptyStarCssClass);
                Sys.UI.Control.addCssClass(starElement, _filledStarCssClass);
            }
            else {
                Sys.UI.Control.removeCssClass(starElement, _filledStarCssClass);
                Sys.UI.Control.addCssClass(starElement, _emptyStarCssClass);
            }
        }
        _blinkFlag = !_blinkFlag;
    }
}
RealityDigital.OpusWeb.Scripts.Rating.registerClass('RealityDigital.OpusWeb.Scripts.Rating', Sys.UI.Control);
Sys.TypeDescriptor.addType('dns', 'rating', RealityDigital.OpusWeb.Scripts.Rating);    



