var starWrappers = new Array();
var starTextAliasList = new Array();
var starsBlock;
/**
 * Dependent on jQuery
 */
StarsWrapper = newClass(null, {

    constructor: function(options) {//containerId, defaultRating, blockChanges, jsCommonData, childStarsId) {
        /*div id*/
        this.container = $('#' + options.container);
        /*rating*/
        this.rating = (options.defaultRating + '').substr(0, 1);
        /*blocks mouseover and out*/
        this.blockChanges = options.blockChanges;
        /*popup to raise onclick*/
        this.childStarsId = options.childStarsId;
        /*rating is set onmouseout*/
        this.defaultRating = options.defaultRating;

        this.jsCommonData = options.jsCommonData;

        /*used by dialog to reset data*/
        this.jsCommonData["container"]=options.container;

        this.enableTextAlias = options.enableTextAlias;

        this.parentStars = options.parentStars;

        this.parentStarsId = options.parentStarsId;
        if (this.parentStarsId != 'undefined' && this.parentStarsId != "") {
            this.parentStars = starWrappers[this.parentStarsId];
        }

        if(options.rateLinkId != undefined && options.rateLinkId != ""){
            this.rateLink = $('#' + options.rateLinkId);
            this.rateLink.bind('mousedown', {env: this}, this.clickOnRateLink);
        }

        this.rateLinkClass = options.rateLinkClass;

        this.container.bind('mouseover', {env: this}, this.mouseover);
        this.container.bind('mouseout', {env: this}, this.mouseout);
        this.container.bind('mousedown', {env: this}, this.click);

        starsBlock =  this;

        thisStars=this;
        if (this.rateLinkClass){
        $('.'+this.rateLinkClass).each( function() {
			$(this).bind('click', {env: thisStars}, thisStars.clickOnRateLink);
		});
        }

        this.updateRating(this, this.defaultRating);
        /*log("inited " + this.container);*/
        if (ratingDialog && ratingDialog.needOpenDialog){
        	this.clickOnRateLink({data:{env:this}});
        }
    },
    mouseover : function(e) {

        var env = e.data.env;
        if (!env.blockChanges) {
            var element = e.target;
            var liClass = $(element.parentNode).attr('class');

            var regExpSt = new RegExp('star');
            if (element.tagName === 'A') {
                env.rating = liClass.replace(regExpSt, '');
                env.updateRating(env, env.rating + '0');
            }
            if (typeof env.parentStars != "undefined"){
                var wasBlocked = env.parentStars.blockChanges;
                env.parentStars.update(env.rating, env.parentStars);
                env.parentStars.blockChanges = wasBlocked;
            }
        }
    },
    mouseout:function(e) {
        var env = e.data.env;

        if (!env.blockChanges) {
            var element = e.target;

            if (element.tagName === 'A') {
                env.rating = (env.defaultRating + '').substr(0, 1);
                env.updateRating(env, env.defaultRating);
            }
        }
    },

    click:function(e) {
        var env = e.data.env;
        if (e.target.tagName === 'A') {
            env.blockChanges = false;
            env.mouseover(e);
            env.blockChanges = true;
            $('#review-rating').val(env.rating);

            if (env.childStarsId.length > 0) {
/*
            	starWrappers[env.childStarsId].setOptions({
                    rating: env.rating,
                    blockChanges:true,
                    jsCommonData: env.jsCommonData,
                    parentStars:env});
*/
            	ratingDialog.jsCommonData = env.jsCommonData;
                ratingDialog.openRateDialog();
            }
        }
        e.preventDefault();
    },

    resetToDefault:function() {
        this.rating = (this.defaultRating + '').substr(0, 1);
        this.blockChanges = false;
        this.updateRating(this, this.defaultRating);
    },

    update:function(rating, env) {
        var container = env.container;
        container.find('.star' + rating).click();
        env.rating = rating;
        this.updateRating(env, rating + '0');
    },

    setOptions:function(options) {
        /*rating*/
        this.rating = options.rating;
        /*blocks mouseover and out*/
        this.blockChanges = options.blockChanges;
        /*todo remove hack, find out why options.jsCommonData is empty for some cases!*/
        this.jsCommonData = options.parentStars.jsCommonData;

        this.parentStars = options.parentStars;

        this.updateRating(this, options.rating + '0');
    },

    updateRating:function(env, className) {
        env.jsCommonData['rating'] = env.rating;

        if (env.enableTextAlias === true) {
            $('#' + 'text-' + env.container.attr('id')).html(starTextAliasList[env.rating]);
        }

        var classes = env.container.attr('class');
        var oldValue = classes.substr(classes.search(/stars/), 7);
        env.container.removeClass(oldValue);
        env.container.addClass('stars' + className);
    },

    clickOnRateLink:function (e) {
        var env = e.data.env;
        
        env.blockChanges = false;
        ratingDialog.jsCommonData = env.jsCommonData;
        ratingDialog.openRateDialog();
    }
});



