var AdPool = new Class({
  initialize: function(element) {
    this.element = element;
    this.ad_types = this.element.getElements(".ad select[name*=ad_id]").getLast().getElements("option");

    this.ad_type_select = this.element.getElement("select[name*=ad_type_ev]");
    this.ad_type_select.addEvent("change", this.updateAdSelections.bind(this));
    
    this.element.getElements(".ad").each(this.setup.bind(this));
    window.addEvent("duplicatable:add", this.setup.bind(this));
    window.addEvent("duplicatable:remove", this.updatePercentages.bind(this));
    
    this.updateAdSelections();
    this.updatePercentages();
  },
  
  setup: function(ad) {
    if(ad.hasClass("ad")) {
      ad.getElement("select").addEvent("change", this.updatePercentages.bind(this));
      ad.getElement("input").addEvent("change", this.updatePercentages.bind(this));
      ad.getElement(".plus").addEvent("click", this.changePercentage.bind(this, [ad, 1]));
      ad.getElement(".minus").addEvent("click", this.changePercentage.bind(this, [ad, -1]));
    }
  },
  
  changePercentage: function(ad, change) {
    var totalWeight = this.totalWeight();
    var currentWeight = parseFloat(ad.getElement("input").getProperty("value"));
    var currentPercentage = parseFloat(ad.getElement(".percentage .value").innerHTML);
    var othersWeight = totalWeight - currentWeight;
    var newPercentage = (currentPercentage + change) / 100;
    if(newPercentage >= 1) { newPercentage = .9999; }
    var newWeight = newPercentage * othersWeight / (1 - newPercentage);
    var newWeightRounded = newWeight.round() < newWeight ? newWeight.round() + 1 : newWeight.round();
    if(newPercentage <= 0) { newWeightRounded = 0; }
    ad.getElement("input").setProperty("value", newWeightRounded);
    this.updatePercentages();
  },

  totalWeight: function() {
    var totalWeight = 0;
    this.element.getElements(".ad").each(function(ad) {
      var ad_id = ad.getElement("select").getProperty("value");
      var weight = ad.getElement("input").getProperty("value");
      if(ad_id && weight) {
        totalWeight += parseFloat(weight);
      }
    }.bind(this));
    return totalWeight;
  },
  
  percentageFor: function(weight, totalWeight) {
    var percentage = totalWeight == 0 ? 0 : parseFloat(weight) / totalWeight * 100;
    return percentage.round();
  },
  
  // TODO: Consider inputs hidden from duplicatable?
  updatePercentages: function() {
    var totalWeight = this.totalWeight();
    this.element.getElements(".ad").each(function(ad) {
      var ad_id = ad.getElement("select").getProperty("value");
      var weight = ad.getElement("input").getProperty("value");
      if(ad_id && weight) {
        var percentage = this.percentageFor(weight, totalWeight);
        ad.getElement(".percentage .value").innerHTML = percentage + "%";
        ad.getElement(".percentage").style.display = "";
        if(percentage <= 0) {
          ad.getElement(".minus").addClass("disabled");
        } else {
          ad.getElement(".minus").removeClass("disabled");
        }
        if(percentage >= 100) {
          ad.getElement(".plus").addClass("disabled");
        } else {
          ad.getElement(".plus").removeClass("disabled");
        }
      } else {
        ad.getElement(".percentage").style.display = "none";
      }
    }.bind(this));
  },
  
  updateAdSelections: function() {
    this.ad_types.each(function(ad) {
      if(ad.getProperty("type") == null) {
        this.element.getElements(".ad select[name*=ad_id]").each(function(select) {
          if(select.getProperty("value") == "") {
            var option = select.getElement("option");
            if(!option || option.getProperty("value") != "") { ad.clone().inject(select); }
          }
        });
      } else if(ad.getProperty("type") == this.ad_type_select.getValue()) {
        this.element.getElements(".ad select[name*=ad_id]").each(function(select) {
          var option = select.getElement("option[value=" + ad.getProperty("value") + "]");
          if(!option) { ad.clone().inject(select); }
        });
      } else {
        this.element.getElements(".ad select[name*=ad_id]").each(function(select) {
          var option = select.getElement("option[value=" + ad.getProperty("value") + "]");
          if(option) { option.remove(); }
        });
      }
    }.bind(this));
  }
});

window.addEvent("domready", function() {
  $$(".ad_pool").each(function(element) {
    new AdPool(element);
  }); 
});