var ResortSwitchMonth = Class.create({
  
  // Properties----
  // resortDetailURLTemplateString
  // resortId
  // monthsObj : {"11/2011": HTMLDivElement}
  
	// Elements---
	// availabilityListingDisplay
	
  initialize: function(initData) {
    
    this.resortId                      = initData.resortId;
    this.mlId                          = initData.mlId;
    this.resortDetailURLTemplateString = initData.resortDetailURLTemplateString;
    this.monthsObj                     = new Hash();
    
    var mainContainer = $(initData.containerId);    
    this.availabilityListingDisplay = $(initData.availabilityListingDisplayId);
		
    var date = new Date();
    var currMonthIndex = date.getMonth();
    
    function pad(number, length) {
      var str = String(number);
      while (str.length < length) {
        str = '0' + str;
      }
      return str;
    }
    
    var monthButtonsContainer = new Element("div", {id: "resortSwitchMonthButtonsContainer"});
    
    var viewAvailabilityByMonthDiv = new Element("div").update(initData.labelViewAvailabilityByMonth || "View availability by month:").addClassName("resortSwitchMonthLabel");
    monthButtonsContainer.insert(viewAvailabilityByMonthDiv);
    
    var prevMonthIndex = 0;
    var yearTurned = false;
    for (var i=0; i < 12; i++) {
      
      var thisMonthIndex = (currMonthIndex + i) % 12;
      if (thisMonthIndex < prevMonthIndex) yearTurned = true;
      var thisYearValue = (yearTurned) ? date.getFullYear() + 1 : date.getFullYear();
      
      var monthDiv = new Element("div").addClassName("searchWidgetMonth").update( initData.monthLabels[thisMonthIndex] );
      
      if (i == 5 || i == 11) monthDiv.addClassName("col6");
      if (i > 5) monthDiv.addClassName("row2");
      
      monthButtonsContainer.insert( monthDiv );
      
      var thisMonthKey = pad((thisMonthIndex + 1), 2) + "/" + thisYearValue;
      
      if (thisMonthKey == initData.currMonthYear) {
        
        monthDiv.addClassName("current");
        
      } else {
        
        if (initData.avail.indexOf(thisMonthKey) == -1) {
          monthDiv.addClassName("disabled");
        } else {
          monthDiv.on("click", "div.searchWidgetMonth", this.doMonthClick.bind(this));
          this.monthsObj.set(thisMonthKey, monthDiv);
        }
        
      }
      
      prevMonthIndex = thisMonthIndex;
    };
    
    var viewingForArr = initData.currMonthYear.split("/");
    
    mainContainer.insert( new Element("div").addClassName("resortSwitchMonthLabel").update( initData.labelAvailabilityFor || "Availability for:" ) );
    mainContainer.insert( new Element("div", {id: "resortSwitchMonthCurrMonthYear"}).update( initData.fullMonthNames[parseInt(viewingForArr[0], 10) - 1] + " " + viewingForArr[1]) );
    
    
    mainContainer.insert( monthButtonsContainer );
    
  },
  
  doMonthClick: function(event, element) {
    
    var monthYearArr = this.monthsObj.detect(function(pair) { return pair.value == element; }).key.split("/");
    this.month = monthYearArr[0];
    this.year = monthYearArr[1];
    
    var templateRegEx = /(^|.|\r|\n)(\[(\w+)])/; // Custom template regexp matches on '[variable]', not '#{variable}'
    var targetURL = new Template(this.resortDetailURLTemplateString, templateRegEx).evaluate({month: this.month, year: this.year, resortid: this.resortId, mlid: this.mlId, pricepoint: ResortSwitchMonth.pricepoint});
    window.location.href = targetURL;

  }
  
});
