
/*************** BookPattern Object Class Defn ********************************/
function BookPattern(startDate, duration, validator, onSel) {
  this.startDate = startDate;
  this.duration = duration;
  if (validator != null) this.validator = validator;
  if (onSel != null) this.onSelect = onSel;
}

BookPattern.prototype.validator= new Function("form", "return \"\";");
BookPattern.prototype.onSelect = new Function("form", "return;");

/*************** OverridePeriod Object Class Defn *****************************/
function OverridePeriod(name, startDate, endDate, bookPatterns) { 
  this.name = name;
  this.closeOutStart = startDate;
  this.closeOutEnd = endDate;
  this.bookPatterns = bookPatterns;
  bookPatterns = new Array();  
}

function XP_add(bookPattern) {
  if (this.bookPatterns == null) this.bookPatterns = new Array(bookPattern);
  else this.bookPatterns[this.bookPatterns.length] = bookPattern;  
}

function XP_optionString(index) {
  var theDate = this.bookPatterns[index].startDate;
  var duration = this.bookPatterns[index].duration;
  var optText = theDate.getDate() + " " + theDate.toString().substr(0,3) + " (" + duration + " nights)";
  return new Option(optText, theDate.getDate());    
}

function XP_permit(date) {
  if (date.getTime() <= this.closeOutStart.getTime() || date.getTime() >= this.closeOutEnd.getTime()) return null;
  for (var i = 0 ; i < this.bookPatterns.length; i++) {  
    if (this.bookPatterns[i].startDate.getTime() == date.getTime()) {
      return true;
    }
  }
  return false;
}

function XP_getDate(dateId, format) {
  var theDate = null;
  if ((dateId+"").toLowerCase() == "start") theDate = this.closeOutStart;
  else if ((dateId+"").toLowerCase() == "end") theDate = this.closeOutEnd;
  else theDate = this.bookPatterns[dateId].startDate;
  if (theDate == null) return;
  
  if (format == null || format.toLowerCase() == "date") return theDate; 
  else if (format.toLowerCase() == "fss") return formatFSSDate(theDate);
  else if (format.toLowerCase() == "cal") {
    return theDate.getFullYear() + "-" + (theDate.getMonth()+1) + "-"+ theDate.getDate();  
  }
}

OverridePeriod.prototype.getOption = XP_optionString;
OverridePeriod.prototype.permitDate = XP_permit;
OverridePeriod.prototype.getDate = XP_getDate;
OverridePeriod.prototype.add = XP_add;

/*************** overrideDates Singleton Object *******************************/
function XD_WhinfellOnlyValidator(form) {
  if ((getDropDownValue(form.accCode) != "OF") && (getDropDownValue(form.accCode) != " ")) return "Sorry, the date/duration you have selected is only available at Whinfell Forest.\n";  
  else return "";
}

function XD_SpecificParkValidator(form) {
  var dur = getDropDownValue(form.durationSelect);
  var park = dur.substring(dur.length-2);
  if (getDropDownValue(form.accCode) != park) {
    return "Sorry, the date/duration you have selected is only available at " + findOptionWithValue(form.accCode, park).text;
  } else {
    return "";  
  }    
}

function XD_SpecificParkSelect(form) {
  var dur = getDropDownValue(form.durationSelect);
  var park = dur.substring(dur.length-2);
  setDropDown(form.accCode, park);
}

function XD_checkDate(date) {
  var result = null;
  for (var period in this) {
    if (typeof this[period] == "object") { 
      var test = this[period].permitDate(date);
      if (test != null) {
        result = test;
        break;
      } 
    }
  }
  return result;
}

function XD_getOption(periodname, date) {
  var result = new Array(); 
  for (var j = 0; j < this[periodname].bookPatterns.length; j++) {
    if (this[periodname].bookPatterns[j].startDate.getTime() == date.getTime()) {
      result[result.length] = this[periodname].getOption(j);  
    }
  }
  return result;
}

function XD_findBookPattern(periodname, optText) {
  if (typeof this[periodname] == "object") {  
    for (var j = 0; j < this[periodname].bookPatterns.length; j++) {
      if (this[periodname].getOption(j).text == optText) return this[periodname].bookPatterns[j];
    }
  }
  return null;
}

function XD_blackoutDates(calendar) {
  calendar.clearDisabledDates();
  for (var period in this) {
    if (typeof this[period] == "object") {
      calendar.addDisabledDates(this[period].getDate("start", "cal"), this[period].getDate("end", "cal")); 
    }
  }
}

var overrideDates = new Object();

overrideDates.isChristmas = XD_checkDate;
overrideDates.getOptions = XD_getOption;
overrideDates.findBookPattern = XD_findBookPattern;
overrideDates.blackoutDates = XD_blackoutDates;
