function DynamicOptionList(){if(arguments.length < 2){alert("Not enough arguments in DynamicOptionList()");}this.target = arguments[0];this.dependencies = new Array();for(var i=1;i<arguments.length;i++){this.dependencies[this.dependencies.length] = arguments[i];}this.form = null;this.dependentValues = new Object();this.defaultValues = new Object();this.options = new Object();this.delimiter = "|";this.longestString = "";this.numberOfOptions = 0;this.addOptions = DynamicOptionList_addOptions;this.populate = DynamicOptionList_populate;this.setDelimiter = DynamicOptionList_setDelimiter;this.setDefaultOption = DynamicOptionList_setDefaultOption;this.printOptions = DynamicOptionList_printOptions;this.init = DynamicOptionList_init;}
function DynamicOptionList_setDelimiter(val){this.delimiter = val;}
function DynamicOptionList_setDefaultOption(condition, val){if(typeof this.defaultValues[condition] == "undefined" || this.defaultValues[condition]==null){this.defaultValues[condition] = new Object();}for(var i=1;i<arguments.length;i++){this.defaultValues[condition][arguments[i]]=1;}}
function DynamicOptionList_init(theform){this.form = theform;this.populate();}
function DynamicOptionList_addOptions(dependentValue){if(typeof this.options[dependentValue] != "object"){this.options[dependentValue] = new Array();}for(var i=1;i<arguments.length;i+=2){if(arguments[i].length > this.longestString.length){this.longestString = arguments[i];}this.numberOfOptions++;this.options[dependentValue][this.options[dependentValue].length] = arguments[i];this.options[dependentValue][this.options[dependentValue].length] = arguments[i+1];}}
function DynamicOptionList_printOptions(){if((navigator.appName == "Netscape") &&(parseInt(navigator.appVersion) <= 4)){var ret = "";for(var i=0;i<this.numberOfOptions;i++){ret += "<OPTION>";}ret += "<OPTION>"
for(var i=0;i<this.longestString.length;i++){ret += "_";}document.writeln(ret);}}
function DynamicOptionList_populate(){var theform = this.form;var i,j,obj,obj2;this.dependentValues = new Object;var dependentValuesInitialized = false;for(i=0;i<this.dependencies.length;i++){var sel = theform[this.dependencies[i]];var selName = sel.name;if(!dependentValuesInitialized){dependentValuesInitialized = true;for(j=0;j<sel.options.length;j++){if(sel.options[j].selected){this.dependentValues[sel.options[j].value] = true;}}}else{var tmpList = new Object();var newList = new Object();for(j=0;j<sel.options.length;j++){if(sel.options[j].selected){tmpList[sel.options[j].value] = true;}}for(obj in this.dependentValues){for(obj2 in tmpList){newList[obj + this.delimiter + obj2] = true;}}this.dependentValues = newList;}}var targetSel = theform[this.target];var targetSelected = new Object();for(i=0;i<targetSel.options.length;i++){if(targetSel.options[i].selected){targetSelected[targetSel.options[i].value] = true;}}targetSel.options.length = 0;for(i in this.dependentValues){if(typeof this.options[i] == "object"){var o = this.options[i];for(j=0;j<o.length;j+=2){var text = o[j];var val = o[j+1];targetSel.options[targetSel.options.length] = new Option(text, val, false, false);if(typeof this.defaultValues[i] != "undefined" && this.defaultValues[i]!=null){for(def in this.defaultValues[i]){if(def == val){targetSelected[val] = true;}}}}}}targetSel.selectedIndex=-1;for(i=0;i<targetSel.options.length;i++){if(targetSelected[targetSel.options[i].value] != null && targetSelected[targetSel.options[i].value]==true){targetSel.options[i].selected = true;}}}

// List by HOTEL
var listHOTEL = new DynamicOptionList("mstcode","city");
listHOTEL.addOptions("Amsterdam","All Properties","All Properties","Amsterdam Central Bed & Breakfast","AMS2741","Amsterdam Country House","AMS4460","Apartment De Witte Hont","AMS4054","B&B Room Dione","AMS4058","Guesthouse Amsterdam Singel","AMS4057","Guesthouse Johanna","AMS4056","Guesthouse Nel","AMS4055");
listHOTEL.setDefaultOption("Amsterdam","All Properties");

function init_search() { 
  var theform = document.DateSelect;
  listHOTEL.init(theform);
}


 
 /******************************
  * Editable section -- Start --
  ******************************/
  // DATE SETTINGS - EDIT AS REQUIRED
  var daysinAdvance = 1; // Sets default days in advance from current date
  var numberNights = 2;  // Sets default number of nights
  var numberYears = 4; // Sets default number of years to display in year select list
  var numberNightsMin = 1; // Sets minimum number of nights accepted
  var imgDir = "images/"; // Directory for the dynamic calendar script and images. Trailing slash must be included.

  // FLAG SETTINGS ON/OFF - SET TO 1 FOR ON & 0 FOR OFF
  var wdDisplay = 0; //weekday display
  var numberNightsDisplay = 1; //number of nights display
  var departDateDisplay = 1; //departure dates display
  var departDateUpdate = 1; //auto update departure date

  // WEEK DAY AND NUMBER NIGHTS TEXT - EDIT TEXT AS REQUIRED
  var wdArray = new Array("");
  var nightTxt = " Night";
  var nightsTxt = " Nights";

  // ERROR MESSAGE TEXT - EDIT TEXT AS REQUIRED
  var invalidDateTxt = "Invalid Arrival Date. Please check number of days selected";
  var invalidDatePriorTxt = "Arrival Date selected is prior Today's date. Please change...";
  var invalidDepartTxt = "Departure Date is prior to Arrival Date selected. Please change...";
  var invalidNightsTxt = "Sorry, reservations under 1 nights are not accepted.";
  /******************************
  * Editable section -- End --
  ******************************/

  /**************************************************
  * DO NOT CHANGE JAVASCRIPT SETTINGS BELOW THIS LINE
  **************************************************/
  //Days in each month Array
  var aNumDays = new Array (31,0,31,30,31,30,31,31,30,31,30,31);

  //Cancel out if no departure date display
  if(departDateDisplay == 0) {
    numberNightsDisplay = 0;
    departDateUpdate = 0;
  }

  //Sets dates selected from dyncalendar
  function calendarCallback(day, month, year, objName, formName) {
    if(objName == "calendarArrive"){
      document.forms[formName].fd.selectedIndex = day-1;
      document.forms[formName].fm.selectedIndex = month-1;
      document.forms[formName].fy.selectedIndex = year - document.forms[formName].fy.options[0].text;
      updateDates(document.forms[formName]);
      if(wdDisplay == 1 && departDateDisplay == 1) setWkd(formName, 1);
    }else{  //objName == calendarDepart
      document.forms[formName].td.selectedIndex = day-1;
      document.forms[formName].tm.selectedIndex = month-1;
      document.forms[formName].ty.selectedIndex = year - document.forms[formName].ty.options[0].text;
      if(wdDisplay == 1 && departDateDisplay == 1) setWkd(formName, 1);
    }
  }

  //Update form with selected dates
  function updateDates(form, loadDates) {
    //check Leap Year
    if(form.fm.selectedIndex==1)  {
      var leapYear  = new Date (form.fy.options[form.fy.selectedIndex].text,form.fm.selectedIndex+1,1);
      var leapYear  = new Date (leapYear  - (24*60*60*1000));
      var numDaysInMonth = leapYear.getDate();
    }else{
      var numDaysInMonth = aNumDays[form.fm.selectedIndex];
    }
    // Update departure date only when loading the form and/or departDateUpdate is set to 1
    if(loadDates == 1 || departDateUpdate == 1) {
      var selectDate = new Date(form.fy.options[form.fy.selectedIndex].text, form.fm.selectedIndex, form.fd.selectedIndex);
      var setDate = new Date(selectDate.getTime() + ((numberNights+1) * 86400000));
      var setDay = setDate.getDate();
      var setMonth = setDate.getMonth();
      var setYear = setDate.getFullYear() - form.fy.options[0].text;
      var checkinDate = new Date(form.fy.options[form.fy.selectedIndex].text,form.fm.selectedIndex,form.fd.selectedIndex+1);
      var checkoutDate = new Date(form.ty.options[form.ty.selectedIndex].text,form.tm.selectedIndex,form.td.selectedIndex+1);
      if(checkinDate > checkoutDate) {
        if(setYear == form.ty.length) {
          form.td.options[30].selected=1;
          form.tm.options[11].selected=1;
          form.ty.options[form.ty.length-1].selected=1;
        } else {
          form.td.options[setDay-1].selected=1;
          form.tm.options[setMonth].selected=1;
          form.ty.options[setYear].selected=1;
        }
      }
    }
    if(form.fd.selectedIndex+1 > numDaysInMonth) {
      alert(invalidDateTxt);
      form.fd.selectedIndex = numDaysInMonth-1;
    }
  }

  function setWkd(form, calendar) {
    // change form object if returned from calendar
    if(calendar) form = document.forms[form];
    for (var i = 0; i < form.fy.length; i++) {
      if (form.fy.options[i].selected) var fyear = form.fy.options[i].text;
      if (departDateDisplay == 1 && form.ty.options[i].selected) var tyear = form.ty.options[i].text;
    }
    var checkinDate = new Date(fyear,form.fm.selectedIndex,form.fd.selectedIndex+1);
    if (departDateDisplay == 1) var checkoutDate = new Date(tyear,form.tm.selectedIndex,form.td.selectedIndex+1);
    var numNights = Math.round((checkoutDate - checkinDate) / 86400000);
    if (numNights == 1) numNights += nightTxt;
    else numNights += nightsTxt;
    //Set Days of the week display
    if(wdDisplay == 1 && document.getElementById) {
      document.getElementById('inWd').firstChild.nodeValue = '(' + wdArray[checkinDate.getDay()] + ')';
      if (departDateDisplay == 1) document.getElementById('outWd').firstChild.nodeValue = '(' + wdArray[checkoutDate.getDay()] + ')';
    }
    
  }

  //Load current dates on form load
  function LoadDates(form) {
    var curDate = new Date();
    var setDate = new Date(curDate.getTime() + (daysinAdvance * 86400000));
    var setDay = setDate.getDate();
    var setMonth = setDate.getMonth();
    var setYear = setDate.getFullYear() - form.fy.options[0].text;
    // Set Arrival Dates
    form.fd.selectedIndex = setDay-1;
    form.fm.selectedIndex = setMonth;
    form.fy.selectedIndex = setYear;
    // Set the Departure Dates
    updateDates(form, departDateDisplay);
    if(wdDisplay == 1 || numberNightsDisplay == 1) setWkd(form);
  }

  //Load current dates on form load
  function checkDates(form) {
    var curDate = new Date();
    for (var i = 0; i < form.fy.length; i++) {
      if (form.fy.options[i].selected) var fyear = form.fy.options[i].text;
      if (departDateDisplay == 1 && form.ty.options[i].selected) var tyear = form.ty.options[i].text;
    }
    var checkinDate = new Date(fyear,form.fm.selectedIndex,form.fd.selectedIndex+2);
    if (departDateDisplay == 1) {
      var checkoutDate = new Date(tyear,form.tm.selectedIndex,form.td.selectedIndex+2);
      var numNights = Math.round((checkoutDate - checkinDate) / 86400000);
    } else {
      var numNights = form.numnights.selectedIndex+1;
    }
    if(checkinDate.getTime() < curDate.getTime()) {
      alert(invalidDatePriorTxt);
      return false;
    }
    if(numNights < 1) {
      alert(invalidDepartTxt );
      return false;
    }
    if(numNights < numberNightsMin) {
      alert(invalidNightsTxt);
      return false;
    }
  }

  //Generate years options for year select list
  function year_option(form){
    curDate = new Date();
    curYear = curDate.getFullYear();
    for(i = curYear ; i <= curYear+(numberYears-1) ; i++ ){
      document.write('<option value="' + i + '">' + i + '</option>');
    }
  }


<!-- DateDiff Script: Berekent aantal dagen tussen twee data -->
function isValidDate(dateStr) 
{
	// Checks for the following valid date formats:
	// MM/DD/YY   MM/DD/YYYY   MM-DD-YY   MM-DD-YYYY

	var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/; // requires 4 digit year

	var matchArray = dateStr.match(datePat); // is the format ok?
	if (matchArray == null) 
	{
		alert(dateStr + " Date is not in a valid format.")
		return false;
	}
	
	month = matchArray[1]; // parse date into variables
	day = matchArray[3];
	year = matchArray[4];
	if (month < 1 || month > 12) 
	{ // check month range
		alert("Month must be between 1 and 12.");
		return false;
	}

	if (day < 1 || day > 31) 
	{
		alert("Day must be between 1 and 31.");
		return false;
	}
	
	if ((month==4 || month==6 || month==9 || month==11) && day==31) 
	{
		alert("Month "+month+" doesn't have 31 days!")
		return false;
	}
	if (month == 2) 
	{ // check for february 29th
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day>29 || (day==29 && !isleap)) 
		{
			alert("February " + year + " doesn't have " + day + " days!");
			return false;
	  	}
	}
	
	return true;
}

<!-- Stuurt de data-option veldjes aan en slaat waarden op -->
var _now = new Date();
var _availDate = new Date(_now.getTime());
var _departDate = new Date(_now.getTime() + 1*24*60*60*1000);
var arrmonth = _availDate.getMonth()+1; 
var depmonth = _departDate.getMonth()+1;
var arrday = _availDate.getDate();	
var depday = _departDate.getDate();	



function Init ()
{
	_availDate = new Date(_now.getTime());
	_departDate = new Date(_now.getTime() + 1*24*60*60*1000);
}
	
function isBrowserSupp() 
{
	    // Get the version of the browser
	    version =  parseFloat( navigator.appVersion );
	
	    if ( ( version >= 2.0 ) && ( version < 2.1 ) && ( navigator.appName.indexOf( "Netscape" ) != -1 ) ) 
	    {
	        return false;
	    }
	    else 
	    {
	    	return true;
	    }
	
	return true;
}

function isLeapYear(yrStr)
{
	var leapYear=false;
	var year = parseInt(yrStr, 10);
	// every fourth year is a leap year
	if (year%4 == 0)
	{
	    leapYear=true;
	    // unless it's a multiple of 100
	    if (year%100 == 0)
	    {
	        leapYear=false;
	        // unless it's a multiple of 400
	        if (year%400 == 0)
	        {
	            leapYear=true;
	        }
	    }
	}
	return leapYear;
}


function getDaysInMonth(mthIdx, YrStr)
{
	// all the rest have 31
	var maxDays=31
	// expect Feb. (of course)
	if (mthIdx==1)
	{
	    if (isLeapYear(YrStr))
	    {
	        maxDays=29;
	    }
	    else
	    {
	        maxDays=28;
	    }
	}
	// thirty days hath...
	if (mthIdx==3 || mthIdx==5 || mthIdx==8 || mthIdx==10)
	{
	    maxDays=30;
	}
	return maxDays;
}


//the function which does some magic to the date fields
// return non-zero if it is the last day of the month
function adjustDate(mthIdx, Dt)
{
	var value=0;

	var today = new Date()
	var theYear = parseInt(today.getYear(),10)

	if (mthIdx < today.getMonth()) 
	{
    		theYear = (parseInt(today.getYear(), 10) + 1)
	}
	if(theYear<100)
	{
    		theYear = "19" + theYear
	}
	else
	{
    		if((theYear-100) < 10)
    		{
        		theYear = "0" + (theYear-100)
    		}
    		else
    		{
        		theYear = (theYear-100)+""
         	}
    		theYear = "20" + theYear
	}


	var numDays=getDaysInMonth(mthIdx, theYear);

	if (mthIdx==1)
	{
	    if (Dt.options.selectedIndex + 1 < numDays)
	    {
	        return 0;
	    }
	    else
	    {
	        Dt.options.selectedIndex=numDays - 1;
	        //check for leap year
	        if (numDays==29)
	        {
	            return 99;
	        }
	        else
	        {
	            return 1;
	        }
	     }
	}
	if (Dt.options.selectedIndex + 1 < numDays)
	{
	    value=0;
	}
	else
	{
	    if (Dt.options.selectedIndex + 1 > numDays)
	    {
	        Dt.options.selectedIndex--;
	        value=3;
	    }
	    else
	    {
	        //index is 31 or 30
	        value=2;
	    }
	}
	return value;
}

//changes departure month when arrival month is changed
function amadChange(inM,inD,outM,outD)
{
	if (!isBrowserSupp())
	{
	    return;
	}
	
	var res = adjustDate(inM.options.selectedIndex, inD);
	if (res != 0)
	{
	           outD.options.selectedIndex=0;
	           if (outM.options.selectedIndex==11)
	           {
	            outM.options.selectedIndex=0
	           }
	           else
	           {
	            outM.options.selectedIndex=inM.options.selectedIndex + 1;
	           }
	}
	else
	{
	    outM.options.selectedIndex = inM.options.selectedIndex;
	    outD.options.selectedIndex = inD.options.selectedIndex+1;
	}

}

function dmddChange(outM,outD)
{
	if (!isBrowserSupp())
	{
	    return;
	}
	
	adjustDate(outM.options.selectedIndex,outD);

	return;
}
