
if (!Kwo) var Kwo = {};

Kwo.Rating = {

  "container": {},
  "isBinded": false,
  "registry": {},

  "bind": function() {
    if (Kwo.Rating.isBinded === true) return false;
    Kwo.Rating.isBinded = true;
    $$(".kwo-rate-box").each(function (element) {
      Event.observe(element, "click", Kwo.Rating.onClick, true);
    });
    $$(".kwo-rate-box IMG").each(function (element) {
      Event.observe(element, "mouseout", Kwo.Rating.onMove, true);
      Event.observe(element, "mouseover", Kwo.Rating.onMove, true);
    });
  },

  onThumb: function(elt) {
    elt = $(elt);
    var args = {};
    args["item_key"] = elt.readAttribute("data");
    args["direction"] = elt.down("IMG").src.match("-up-") ? "up" : "down";
    Kwo.exec("/rating/thumb", args,
             {callback: Kwo.Rating.onThumbCallback.bind(elt)})
  },

  onThumbCallback: function(res) {
    if (Kwo.hasError(res)) return Kwo.error(res);
    this.up("SPAN").update(res["result"]["callback_msg"]);
  },

  onClick: function(event) {
    event = event || window.event;
    Kwo.Rating.container = Event.element(event);
    var arr = Kwo.Rating.container.id.split("-");
    if (Kwo.Rating.registry[arr[0] + "-" + arr[1] + "-" + arr[2] + "-" + arr[3]] == true) return ;
    Kwo.Rating.registry[arr[0] + "-" + arr[1] + "-" + arr[2] + "-" + arr[3]] = true;
    Kwo.exec("/rating/ping", 
             {"model_id": arr[2], "record_id": arr[3], "note": arr[4]}, 
             {"callback": Kwo.Rating.onClickCallback});
  },

  onClickCallback: function(res) {
    if (res["error"] >= 1) {
      Kwo.error(res["result"]["msg"]); 
    }
    else {
      Kwo.Rating.container.up("div")
                          .update(res["result"]["callback_msg"])
                          .stopObserving("click", Kwo.Rating.onClick, true);
    }
  },

  onMove: function(event) {
    event = event || window.event;
    var arr = Event.element(event).id.split("-");
    if (Kwo.Rating.registry[arr[0] + "-" + arr[1] + "-" + arr[2] + "-" + arr[3]] == true) return ;
    var sig = arr[0] + "-" + arr[1] + "-" + arr[2] + "-" + arr[3] + "-";
    var i = 1;
    if (event.type.endsWith("out")) {
      while (i < 6) {
        if (!$(sig + i)) break;
        var s = $(sig + i).src.match("off") ? "off" : "on";
        $(sig + i).src = $(sig + i).src.sub(s, $(sig + i).className); 
        i++;
      }
    }
    else {
      var num = parseInt(arr[4]);      
      for (i = 1; i <= num; i++) {
        $(sig + i).src = $(sig + i).src.sub("-off", "-on");
      }
      while (i < 6) {
        if (!$(sig + i)) break;
        $(sig + i).src = $(sig + i).src.sub("-on", "-off"); 
        i++;
      }
    }
  }

};

