/*
   usage: create the html in the context of the thing being rated
          then use the following function to create the
          rating object.
          
   new ratingObj('artistRating', 3, 'self');
          arg 1: this is the string that prefix the ids of the html
                 elements
          arg 2: the initial rating;
          arg 3: values = 'self', 'public'.
                 Is the initial display for public ratings or self rating.
                 This prefixes css classes. 
          arg 4: This is the url for the rating action. 
          arg 5: url for login in action
                 
   Size: is determined by the class name in the wrapper div
        classname = "starRatingSm", "starRatingMd", "starRatingLg"
    .star.selfHighlightRight 
    
  Events:
    onRatingComplete - fires when after successful rating has been finished
*/
//var onRatingComplete = new YAHOO.util.CustomEvent("onRatingComplete"); 

function ratingObj(elPrefix, curRating, initRating, afterAuthRedirect, loginUrl) {
  this.onRatingComplete = new YAHOO.util.CustomEvent("onRatingComplete"); 
  this.scale =  Dom.getElementsByClassName('star', 'div', elPrefix).length;
  this.prefix = elPrefix;
  this.curRating = curRating;
  this.initRating = initRating;
  this.afterAuthRedirect = afterAuthRedirect;
  this.loginUrl = loginUrl;
  this.deActivate = deActivate;
  this.reset = reset;
  
  //this.deActivate();
  for (var i = 1; i <= this.scale; i++){
    var star = Dom.get(this.prefix + "_" + i);
    if (i <=  this.curRating){
      if (i % 2 == 0){
        star.className = 'star ' + this.initRating + 'HighlightRight';
      } else {
        star.className = 'star ' + this.initRating + 'HighlightLeft';
      }
    } else {
      if (i % 2 == 0){
        star.className = 'star starRight';
      } else {
        star.className = 'star';
      }
    }
    YAHOO.util.Event.addListener(star, 'mouseover', update, i, this);
    YAHOO.util.Event.addListener(star, 'click', submitRating, i, this);
    YAHOO.util.Event.addListener(star, 'mouseout', reset, i, this);
  }
}

function ratingObjFormField(elPrefix, input, initRating) {
  this.scale =  Dom.getElementsByClassName('star', 'div', elPrefix).length;
  this.prefix = elPrefix;
  this.input = Dom.get(input);
  this.curRating = this.input.value;
  this.initRating = initRating;
  for (var i = 1; i <= this.scale; i++){
    var star = Dom.get(this.prefix + "_" + i);
    if (i <=  this.curRating){
      if (i % 2 == 0){
        star.className = 'star ' + this.initRating + 'HighlightRight';
      } else {
        star.className = 'star ' + this.initRating + 'HighlightLeft';
      }
    }
    YAHOO.util.Event.addListener(star, 'mouseover', update, i, this);
    YAHOO.util.Event.addListener(star, 'click', updateRatingInput, i, this);
    YAHOO.util.Event.addListener(star, 'mouseout', reset, i, this);
  }
}

function ratingObjStatic(elPrefix, curRating, initRating) {
  this.scale =  Dom.getElementsByClassName('star', 'div', elPrefix).length;
  this.prefix = elPrefix;
  this.curRating = curRating;
  this.initRating = initRating;
  for (var i = 1; i <= this.scale; i++){
    var star = Dom.get(this.prefix + "_" + i);
    star.title = '';
    if (i <=  this.curRating){
      if (i % 2 == 0){
        star.className = 'star ' + this.initRating + 'HighlightRight';
      } else {
        star.className = 'star ' + this.initRating + 'HighlightLeft';
      }
    }
    star.style.cursor = 'auto';
  }
}

function update(e, rating){
  for (var i = 1; i <= this.scale; i++){
    var star = Dom.get(this.prefix + "_" + i);
    if (i <= rating){
      if (i % 2 == 0){
        star.className = 'star selfHighlightRight';
      } else {
        star.className = 'star selfHighlightLeft';
      }
    } else {
      if (i % 2 == 0){
        star.className = 'star starRight';
      } else {
        star.className = 'star';
      }
    }
  }
}

function reset(){
  for (var i = 1; i <= this.scale; i++){
    var star = Dom.get(this.prefix + "_" + i);
    if (i <=  this.curRating){
      if (i % 2 == 0){
        star.className = 'star ' + this.initRating + 'HighlightRight';
      } else {
        star.className = 'star ' + this.initRating + 'HighlightLeft';
      }
    } else {
      if (i % 2 == 0){
        star.className = 'star starRight';
      } else {
        star.className = 'star';
      }
    }
  }
}

function submitRating(e, rating){
  var url = this.afterAuthRedirect + rating + "&flagType=other";
  if (isAuth){
    this.deActivate();
	  YAHOO.util.Connect.asyncRequest('GET', url, {
	    success: function(o){
	      var response = YAHOO.lang.JSON.parse(o.responseText);
	      if (response.success){
          // updating the avg rating copy
          if (Dom.get('avgStarRating')){
            showEl('avgStarRating');
            Dom.get('avgStarRating').innerHTML = response.avgRate;
            Dom.get('starRatingCount').innerHTML = response.numRating;
          }
          o.argument.ratingObj.initRating = 'self';
          o.argument.ratingObj.curRating = rating;
				  for (var i = 1; i <= o.argument.ratingObj.scale; i++){
				    var star = Dom.get(o.argument.ratingObj.prefix + "_" + i);
				    YAHOO.util.Event.addListener(star, 'mouseover', update, i, o.argument.ratingObj);
				    YAHOO.util.Event.addListener(star, 'click', submitRating, i, o.argument.ratingObj);
				    YAHOO.util.Event.addListener(star, 'mouseout', reset, i, o.argument.ratingObj);
				  }
			    o.argument.ratingObj.onRatingComplete.fire({ratingObj:o.argument.ratingObj});
			  } else {
	        for (var i = 1; i <= o.argument.ratingObj.scale; i++){
	          var star = Dom.get(o.argument.ratingObj.prefix + "_" + i);
	          YAHOO.util.Event.addListener(star, 'mouseover', update, i, o.argument.ratingObj);
	          YAHOO.util.Event.addListener(star, 'click', submitRating, i, o.argument.ratingObj);
	          YAHOO.util.Event.addListener(star, 'mouseout', reset, i, o.argument.ratingObj);
	        }
			  }
	    },
      failure: function(o){
        for (var i = 1; i <= o.argument.ratingObj.scale; i++){
          var star = Dom.get(o.argument.ratingObj.prefix + "_" + i);
          YAHOO.util.Event.addListener(star, 'mouseover', update, i, o.argument.ratingObj);
          YAHOO.util.Event.addListener(star, 'click', submitRating, i, o.argument.ratingObj);
          YAHOO.util.Event.addListener(star, 'mouseout', reset, i, o.argument.ratingObj);
        }
      },
	    argument: {ratingObj: this}
	  });
  } else {
    document.loginForm.afterAuthRedirect.value = url;
    showSignInMessage("You'll need to sign in to do that.");
  }
}

function updateRatingInput(e, rating){
  this.input.value = rating;
  this.curRating = this.input.value;
}

function deActivate(){
  for (var i = 1; i <= this.scale; i++){
    var star = Dom.get(this.prefix + "_" + i);
    YAHOO.util.Event.removeListener(star, 'mouseover', update);
    YAHOO.util.Event.removeListener(star, 'click', submitRating);
    YAHOO.util.Event.removeListener(star, 'mouseout', reset);
    Dom.get(star).style.cursor = 'auto';
  }
}