



jQuery(function () { review.initiate(); });

var review = ( function ($) {
		
	var descriptions = {},
	
	config = {
		
		container : '.review_stars',
		starsContainer : '.review_stars_active',
		stars : '.review_stars_active > div',
		fullstar : 'star_full',
		emptystar : 'star_empty',
		
		description : '.review_description',
		textarea : '.rowcount',
		
		guidelines: '#review_guidelines_tooltip',
		guidelinesTrigger : '#review_guidelines span',
		guidelinesClose : '#review_guidelines_tooltip > span#close'
		
	},
		
    privs = {
    
        getNumberFromId: function (elem) {
            var strArr = elem.id.split('_');
            return strArr[1];
        },
        
        getCategoryFromId: function (elem) {
            var strArr = elem.id.split('_');
            return strArr[0];
        },
        
        getPreviousSiblings: function (elem) {
            var pos = privs.getNumberFromId(elem), 
				cat = privs.getCategoryFromId(elem), 
				sibArr = [];
            
            for (pos; pos > 0; pos--) {
                var sib = document.getElementById(cat +'_'+ pos);
                sibArr.push(sib);
            };
            return sibArr;
        },
		
		setReviewDescription : function (elem, description) {
			$(elem).parents(config.container).find('> '+ config.description).text(description);
		},
        
        setHoverOnStars: function () {
            $(config.stars).hover( function () {
                var prevsibs = privs.getPreviousSiblings(this);
                if (prevsibs) {
                    for (var sib in prevsibs) {
                        prevsibs[sib].className = config.fullstar;
                    };
                };
				privs.setReviewDescription(this, this.title);
				
			}, function () {
                var cat = privs.getCategoryFromId(this), 
					stars = this.parentNode.getElementsByTagName('div'), 
					state = document.getElementById(cat).selectedIndex;
                
                $(stars).each( function () {
                    $(this).removeClass(config.fullstar).addClass(config.emptystar);
                });
				privs.setReviewDescription(this, '');
                
            });
        },
        
        setSelectedRating: function () {
        
            $(config.stars).click( function () {
                var num = privs.getNumberFromId(this), 
					cat = privs.getCategoryFromId(this);
					
                document.getElementById(cat).selectedIndex = num;
				descriptions[cat] = this.title;
            });
            
            $(config.starsContainer).mouseenter( function () {
                var stars = this.getElementsByTagName('div'), cat = privs.getCategoryFromId(stars[0]);
                
                $(stars).each( function () {
                    $(this).removeClass(config.fullstar).addClass(config.emptystar);
                });
				
            }).mouseleave( function () {
                var child = this.getElementsByTagName('div')[0],
					cat = privs.getCategoryFromId(child),
					index = document.getElementById(cat).selectedIndex;
                
                for (index; index > 0; index--) {
                    document.getElementById(cat +'_'+ index).className = config.fullstar;
                };
				
				privs.setReviewDescription(this, descriptions[cat]);
           });
        },
        
        setMaxNumOfRows: function (elem) {
            var text = elem.value,
				nrRows = text.split('\n'),
				max = elem.rows,
				maxlength = text.length - 1;
            
            if (nrRows.length > max) {
                elem.setAttribute('maxlength', maxlength);
                elem.value = text.substring(0, maxlength);
                
            } else {
                elem.setAttribute('maxlength', '');
                
            };
        },
        
        setLineCounterObserver: function () {
			$(config.textarea).each( function () {				
				this.onkeyup = function () {
					privs.setMaxNumOfRows(this);
				};
			});
			
		},
		
		setTexareaEvents : function () {
				
			$(config.textarea).each( function () {
				var defaultValue = this.value;
				
				this.onfocus = function () {
					if ( this.value === defaultValue ) this.value = new String();
				};
				
				this.onblur = function () {
					if ( this.value === '' ) this.value = defaultValue;
				};
				
			});
		},

		setTooltipOpenEvent : function () {
			$(config.guidelinesTrigger).click( function () {
				$(config.guidelines).fadeIn(300);
			});
		},
		
		setTooltipCloseEvent : function () {
			$(config.guidelinesClose).click( function () {
				$(config.guidelines).fadeOut(300);
			})
		}
		
    };
		
	return {
		initiate : function () {
			privs.setSelectedRating();
			privs.setHoverOnStars();
			privs.setTooltipOpenEvent();
			privs.setTooltipCloseEvent();
			privs.setLineCounterObserver();
			privs.setTexareaEvents();
		}
	};
	
} )(jQuery);