function Rating(obj){
	 if(!obj) return;
	 var self = this;
	self.parentElement = obj;
	self.stardiv = document.createElement('div');
	self.notifytext = document.createElement('div');
	self.average = obj.innerHTML.split(/:\s*/)[1].split(".");
	if (!self.average[1]) {
		self.average[1] = 0;
	}
	self.submitted = false;

    self.make_stardiv = function() {
        /* Replaces original form with the star images */

		YAHOO.util.Dom.addClass(self.stardiv, 'rating');

        // make the stars
        for (var i=1; i<=5; i++) {
            // first, make a div and then an a-element in it
            var star = document.createElement('div');
            star.className = 'star' + i;
            var a = document.createElement('a');
            a.href = 'javascript:void(0);';
            a.name = 'rate#' + i;
            a.innerHTML = i;
            YAHOO.util.Dom.addClass(star, 'star');
            star.appendChild(a);
            self.stardiv.appendChild(star);

			if (!YAHOO.util.Dom.hasClass(self.parentElement, 'not')) {
				// add needed listeners to every star
				YAHOO.util.Event.addListener(star, 'mouseover', self.hover_star, i, this);
				YAHOO.util.Event.addListener(star, 'mouseout', self.reset_stars);
				YAHOO.util.Event.addListener(star, 'click', self.submit_rating, i);
			} else {
				YAHOO.util.Event.addListener(star, 'click', cancelEvent);
			}
        }

		self.parentElement.innerHTML ="";
		self.parentElement.appendChild(self.stardiv);
        // show the average

        self.reset_stars();
        // add the statustext div and hide it
        YAHOO.util.Dom.addClass(self.notifytext, 'notifytext');
        YAHOO.util.Dom.setStyle(self.notifytext, 'opacity', 0);
		YAHOO.util.Dom.setStyle(self.notifytext, 'display', 'none');
        self.parentElement.appendChild(self.notifytext);
    }

    self.hover_star = function(e, which_star, selfElement) {
        /* hovers the selected star plus every star before it */
        for (var i=1; i<= which_star; i++) {
            var star = YAHOO.util.Dom.getElementsByClassName('star' + i, 'div', self.parentElement)[0];
            var a = star.childNodes[0];
            YAHOO.util.Dom.addClass(star, 'hover');
            YAHOO.util.Dom.setStyle(a, 'width', '100%');
        }
    }

    self.reset_stars = function() {
        /* Resets the status of each star */
        var stars_on;
        var last_star_width;
        // if form is not submitted, the number of stars on depends on the
        // given average value
        if (self.submitted == false) {
            stars_on = self.average[0];
            if (self.average[1] > 0) {
                stars_on = parseInt(self.average[0]) + 1;
			}
			// half stars are not supported on backend currently, removing this which is
			// returning zero and setting last star to not appear
                        last_star_width = '100%';
			//last_star_width = self.average[1] + '0%';
			last_star_width = '100%';
        } else {
            // if the form is submitted, then submitted number stays on
            stars_on = self.submitted;
            last_star_width = '100%';
        }

        // cycle trought 1..5 stars
        for (var i=1; i<= 5; i++) {
            var star = YAHOO.util.Dom.getElementsByClassName('star' + i, "div", self.parentElement);
            var a = star[0].firstChild;

            // first, reset all stars
            YAHOO.util.Dom.removeClass(star[0], 'hover');
            YAHOO.util.Dom.removeClass(star[0], 'on');
            // for every star that should be on, turn them on
            if (i<=stars_on && !YAHOO.util.Dom.hasClass(star[0], 'on')) {
                YAHOO.util.Dom.addClass(star, 'on');
			}
            // and for the last one, set width if needed
            if (i == stars_on) {
                YAHOO.util.Dom.setStyle(a, 'width', last_star_width);
			}
        }
    }

    self.submit_rating = function(e, num) {
        // If the form has not been submitted yet
        // and submission is not in progress
        if (self.submitted == false) {
            self.submitted = num;
            // After the form is submitted, instead of old average, show
            // submitted number of stars selected
            self.average = [num, 0];

            // change the rating-value for the form and submit the form
			var rate_video_form = getParentWithClassOf (self.parentElement , "rate_video_form");
            var post_to = rate_video_form.getAttribute("action");
			var queryString="";
			for(i=0; i<rate_video_form.elements.length; i++) {
				var formElementName = rate_video_form.elements[i].name;
				var formElementValue = rate_video_form.elements[i].value;
				if (formElementName=="rating_num") {
					rate_video_form.elements[i].value = num;
					break;
				}
//				queryString = queryString + formElementName + "=" + formElementValue;
//				if (i < (rate_video_form.elements.length-1)) {
//					queryString = queryString + "&";
//				}
			}

			rate_video_form.elements[0].value = num;
			YAHOO.util.Connect.setForm(rate_video_form);
			var c = YAHOO.util.Connect.asyncRequest('POST', post_to, self.ajax_callback);
			self.uninit();

            // change the statustext div and show it
            self.notifytext.innerHTML = 'Rating saved';
			YAHOO.util.Dom.setStyle(self.notifytext, 'display', 'block');
            var notify_display = new YAHOO.util.Anim(self.notifytext, { opacity: { to: 1 } }, 0.25, YAHOO.util.Easing.easeIn);
            notify_display.animate();

//			UPDATE RATINGS COUNT
			var rating_element = self.parentElement;
			var ratings = rating_element.nextSibling;
			if (ratings.className != "ratings") { // IF WEADD ANOTHER CLASS TO RATINGS, THIS WILL BREAK
				ratings = ratings.nextSibling;
			}
			if (YAHOO.util.Dom.hasClass(ratings, "ratings")) {
				var ratingsText = ratings.innerHTML.replace(/^\s+|\s+$/g, '');
				var aRatingsText = ratingsText.split(" ");
				var ratingsNumber = parseInt(aRatingsText[0]);
				ratingsNumber++;
				var newRatingsText = " " + ratingsNumber + " " + aRatingsText[1];
				ratings.innerHTML = newRatingsText;
			}
        }

		cancelEvent(e);
    }

	self.uninit = function(){
		YAHOO.util.Dom.addClass(self.parentElement, 'not');
		var stars = YAHOO.util.Dom.getElementsByClassName('star', "div", self.parentElement);

        for (var i=1; i<=stars.length; i++) {
			YAHOO.util.Event.removeListener(stars[i], 'click', self.submit_rating);
			YAHOO.util.Event.removeListener(stars[i], 'mouseover', self.hover_star);
			YAHOO.util.Event.removeListener(stars[i], 'mouseout', self.reset_stars);
			YAHOO.util.Event.addListener(stars[i], 'click', cancelEvent);
        }

		self.reset_stars ();
	}

   self.ajax_callback = function(){

//       this.success = function(o) {
            // release the form to normal status and change the statustext
//           self.submitted = false;
//           self.notifytext.innerHTML = 'Rating saved.';
//        }
//        this.failure = function(o) { // we shouldn't ever go down this path.
//            alert('Error: ' + o.status + " " + o.statusText );
//        }
    }

	self.make_stardiv();
}

var init_rating = function(){
	 var aRateable_elements = YAHOO.util.Dom.getElementsByClassName('rateable','div');
	 for (var i = 0; i < aRateable_elements.length; i++) {
		new Rating(aRateable_elements[i]);
	 }
}

function getParentWithClassOf (childElement, classWeWant) {
	if (YAHOO.util.Dom.hasClass(childElement, classWeWant)) {
		return childElement;
	}

	var objectFound;
	var parentObject = childElement.parentNode;
	if (YAHOO.util.Dom.hasClass(parentObject, classWeWant)) {
		objectFound = parentObject;
	} else {
		objectFound = getParentWithClassOf (parentObject, classWeWant)
	}

	return objectFound;
}

function cancelEvent(e) {
	if (document.all) {
		event.returnValue = false;
		event.cancelBubble = true;
	} else {
		e.preventDefault();
	}
}

YAHOO.util.Event.addListener(window, 'load', init_rating);

