var Atms = {};
Atms.Dom = {
  addClass: function(el, c){
    el = this.getById(el);
    if(el){
      el.className += c;
    }
  },
  
  addOptions: function(list, endIndex, creator){
    list = this.getById(list);
    if(list && list.options){
      creator = creator || function(i){
        return Atms.Dom.createOption(i.toString());
      };
      for(var i = list.options.length; i < endIndex; ++i){
        list.options.add(creator(i), i);
      }
    }
  },
    
  createOption: function(v, t, selected){
    var o = document.createElement('OPTION');
    o.value = v;
    o.text = (t || o.value);
    o.selected = selected;
    return o;
  },
    
  getById: function(el){
    return typeof el == 'string' ? document.getElementById(el) : el;
  },
  
  removeOptions: function(list, startIndex){
    list = this.getById(list);
    if(list && list.options){
      for(var i = startIndex; i < list.options.length;){
        list.remove(i);
      }
    }
  }
};

Atms.Event = {
  attachEvent: function(el, evType, fn, useCapture){
    el = Atms.Dom.getById(el);
    
    if(el){
      if (el.addEventListener){
        el.addEventListener(evType, fn, useCapture);
        return true;
      } else if (el.attachEvent){
        return el.attachEvent('on' + evType, fn);
      } else {
        el['on' + evType] = fn;
      }
    }
  },
  
  attachLoad : function(fn){
    this.attachEvent(window, 'load', fn);
  },
  
  getTarget: function(evt){
    evt = (evt) ? evt : ((window.event) ? window.event : "")
    return evt ? evt.target || evt.srcElement : null;
  },
  
  detachEvent: function(el, evType, fn, useCapture){
    el = Atms.Dom.getById(el);
    
    if (el.removeEventListener){
      el.removeEventListener(evType, fn, useCapture);
      return true;
    } else if (el.detachEvent){
      return el.detachEvent("on"+evType, fn);
    } else {
        el['on' + evType] = null;
    }
  },
  
  stop: function(evt)
  {
    if (evt && evt.stopPropagation) evt.stopPropagation();
    else if (window.event) window.event.cancelBubble = true;
  }
};

Atms.DateSelector = function(d, m, y){
  d = Atms.Dom.getById(d);
  m = Atms.Dom.getById(m);
  y = Atms.Dom.getById(y);
     
  if(d && m && y){
    var update = function(){
      var days = Atms.DateSelector.daysInMonth(parseInt(m.value) - 1, parseInt(y.value));
      var opts = d.options;
      if(opts.length < days){
        for(var i = opts.length + 1; i <= days; ++i) opts.add(Atms.Dom.createOption(i));
      }
      else{
        d.selectedIndex = parseInt(d.value) > days ? days - 1 : d.selectedIndex;
        opts.length = days;
      }
    }
    update();
    Atms.Event.attachEvent(m, 'change', update);    
    Atms.Event.attachEvent(y, 'change', update);
  }
};

Atms.DateSelector.daysInMonth = function(m, y){
  return 32 - new Date(y,m,32).getDate();
};

Atms.Pricing = {
  maxQuantity:10,
  prices:[],
  
  adjustSelects : function(){
    var items = this.getNumberOfItems();
    
    for (i = 0; i < this.prices.length; ++i){
      var el = Atms.Dom.getById(this.prices[i].el);
            
      // calculate the newQty
      var qty = this.maxQuantity - items + 1 + parseInt(el.value);
      
      // ensure we don't go over the max
      qty = this.prices[i].maxQty ? Math.min(this.prices[i].maxQty + 1, qty) : qty;
      
      Atms.Dom.addOptions(el, qty); 
      Atms.Dom.removeOptions(el, qty);
    }
  },
  
  getNumberOfItems : function(){
    var count = 0;
    
    for(var i = 0; i < this.prices.length; ++i){
      count += parseInt(Atms.Dom.getById(this.prices[i].el).value || '0');
    }
    
    return count;
  },
  
  onQtyChange : function(event){
    Atms.Pricing.adjustSelects();
  },
  
  register: function(el, isGroup, maxQty){
    this.prices.push({el:el, isGroup:isGroup, maxQty:maxQty});
    Atms.Event.attachEvent(el, 'change', this.onQtyChange); 
    this.adjustSelects(); 
  }
};
