// File Name:
// Author: B. Lavery
//
// Modifications :
//  ??-??-??  Added package validate to Validate
//  13-01-05  Perform package start date validation.
//  21-12-05  Perform check that package has started and hasn't ended.
//  19-04-06  Perform NitesBefore check using new javascript and server Todays date.
//  19-11-08  Package end date was not a permitted date for booking.
//


function fmtDate(y,m,d)
{   // m=0 to 11
    // This routine can cope with DAY over into the next month ie > 31 or whatever
    var ystr;
    var len;
    var dt, dy, daycount;
    DayCount = 31
    if(m==8 || m==3 || m==5 || m==10)
        DayCount = 30;
    if (m==1)
        {
        DayCount = 28;
        if (y==2000 || y==2004 ||y==2008 ||y==2012 ||y==2016 ||y==2020 ||y==2024)
            DayCount = 29;
        }
    if(d > DayCount)
        {
        d = d - DayCount;
        m++;
        }
    if(m>11)
        {
        y++;
        m = 0;
        }
    //alert(y);
    dt = new Date(y,m,d);
    //alert(dt);
    dy = dt.getDay();
    //alert(dy.toString());
    dt = 'SunMonTueWedThuFriSat'.substr(dy*3, 3) + " " + d + " ";
    y = y % 100;
    ystr = "000" + y.toString();
    len = ystr.length - 2;
    dt = dt + "JanFebMarAprMayJunJulAugSepOctNovDec".substr(m*3,3) + " " + ystr.substring(len,99);
    return dt;
}

function fmtDate2(y,m,d) {
	var mths = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
	var days = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");

	if (m==8 || m==3 || m==5 || m==10) {
    	DayCount = 30;
	}
    if (m==1) {
    	DayCount = 28;
        if (y==2000 || y==2004 || y==2008 || y==2012 || y==2016 || y==2020 || y==2024) {
            DayCount = 29;
        }
    }
    if(d > DayCount) {
    	d = d - DayCount;
        m++;
	}
    if(m>11) {
        y++;
        m = 0;
    }
    dt = new Date();
	dt.setDate(d);
	dt.setMonth(m);
	dt.setFullYear(y);
	dt.setHours(0,0,0,0);

	return days[dt.getDay()] + " " + dt.getDate() + " " + mths[dt.getMonth()] + " " + dt.getFullYear();

}

function fmtDepdate (theForm)
{   // mm 1 to 12
    var ddd, j, idxn, idxy, idxm, idxd;
    // Netscape compatible.
    idxn = theForm.Nites.selectedIndex;
    idxy = theForm.YearFrom.selectedIndex;
    idxm = theForm.MonthFrom.selectedIndex;
    idxd = theForm.Day.selectedIndex;
    ddd = theForm.Nites.options[idxn].value;
    for (j=0;j<theForm.Day.options[idxd].value;j++)
        ddd++; // Workaround for JavaScript difficulty with simple math! (eval(), maybe?)
    theForm.LeaveDate.value = fmtDate(theForm.YearFrom.options[idxy].value,theForm.MonthFrom.options[idxm].value-1, ddd);
    return true;
}

var yr,mth,day;

function ConvDate(DatStr)
{
  var DatArr;

  if (DatStr.substr(0,1) == ' ')
    DatStr = DatStr.substr(1,99);
  DatArr = DatStr.split(" ");
  day = DatArr[0];
  for (j = 0; j < 12; j++)
    if ("JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC".substr(j*3,3) == DatArr[1]) {
      mth = j;
      break;
      }
  yr = 2000 + parseInt(DatArr[2],10);
}


function validate(theForm,PckgConf,Today,NitesBefore,MustUsePackage,ForceThisPack)
{

	//alert(document.forms.Charts_.PckgName.value);

	var j, idx, dt;
	var PckgArr;
	var PckgArrj;
	var PckgStart,PckgEnd;
	var PckgStartstr,PckgEndstr;
	var PckgValDay;
	var PckgMinDay,PckgMaxDay;
	var PckgCatg;
	var actpckg;
	var datvar,datvarvalue;
	var daynum;
	var DayCount;
	var days;
	var TodayDate;
	var TodayDay;
	var StartDay;
	var dv;
	var nights;
	var firstdate;
	var firstdatestr;
	var errnum;
	var yrstr;
	var StartDate,EndDate,LastDate;
	var idxd,idxy,idxm,idxd;


	theForm.JStest.value = 1;     // tests that Javascript is running
	TodayDate = new Date();
	TodayDay = Math.floor(TodayDate.valueOf() / 100000000);
	idxn = theForm.Nites.selectedIndex;
	idxy = theForm.YearFrom.selectedIndex;
	idxm = theForm.MonthFrom.selectedIndex;
	idxd = theForm.Day.selectedIndex;
	nights = theForm.Nites.options[idxn].value;
	StartDate = new Date(theForm.YearFrom.options[idxy].value,theForm.MonthFrom.options[idxm].value-1,theForm.Day.options[idxd].value);
	StartDay = Math.floor(StartDate.valueOf() / 100000000);
	ArrivalDateTest = new Date();
	ArrivalDateTest.setHours(0,0,0,0);

  	if (StartDate < ArrivalDateTest) {
    	alert("Your arrival date has passed");
    	theForm.Day.focus();
    	return false;
   	}

  	DaysBeforeDate = new Date();
  	DaysBeforeDate.setDate(DaysBeforeDate.getDate() + NitesBefore);
  	DaysBeforeDate.setHours(0,0,0,0);  // comparing date not time
  	if (StartDate < DaysBeforeDate) {
		alert("Your arrival date must be " + NitesBefore + " days in advance of todays date");
  		theForm.Day.focus();
  		return false;
  	}


	if ((theForm.MonthFrom.value == 4) ||
  		(theForm.MonthFrom.value == 6) ||
  		(theForm.MonthFrom.value == 9) ||
  		(theForm.MonthFrom.value == 11)) {

    	if ( theForm.Day.value > 30 ) {
    		alert("You have selected an invalid number of days for that month.");
    		theForm.Day.focus();
    		return false;
    	}
	}

  	if ( theForm.MonthFrom.value == 2 ) {
		DayCount = 28;
  		if ((theForm.YearFrom.value == 2000) ||
  		    (theForm.YearFrom.value == 2004) ||
  		    (theForm.YearFrom.value == 2008) ||
  		    (theForm.YearFrom.value == 2012) ||
  		    (theForm.YearFrom.value == 2016) ||
  		    (theForm.YearFrom.value == 2020) ||
  		    (theForm.YearFrom.value == 2024)) {
			DayCount = 29;
		}
		if ( theForm.Day.value > DayCount ) {
      		alert("You have selected an invalid number of days for that month.");
      		theForm.Day.focus();
      		return false;
      	}
	}



	if (PckgConf.length > 2) {

	    PckgArr = PckgConf.split("|");

	    // cannot rely on selected index
	    //j = theForm.Package.selectedIndex;

        /*
         * set j = 1 if a package has been selected
         */
	    for ( var k=0; k < theForm.Package.length; k++ ) {
			if ( theForm.Package[k].checked ) {
				j = k;
			}
		}

		// if no package is selected, but ForceThisPack is selected,
		// set j to the correct package index.
		if (j == 0) {
			if (ForceThisPack != "") {
				PckgCodeArr = theForm.packagecode.value.split("|");
				PckgNameArr = theForm.packagename.value.split("|");
				for ( var m=0; m < PckgCodeArr.length; m++ ) {
					if ( PckgCodeArr[m] == ForceThisPack ) {
						j = m;
						//theForm.PckgName.value = PckgNameArr[m];
						theForm.Package[m].checked = true; //value = PckgCodeArr[m];
						document.forms.Charts_.PckgName.value = PckgNameArr[m];
						var pcode = PckgCodeArr[m];
					}
				}
			}
		}

		// store current package code in use
		PckgCodeArr = theForm.packagecode.value.split("|");
		var pcode = PckgCodeArr[j];


		// Is it required that the user select a package ?
		// fail at this point if no package selected
		if (j == 0) {

			if (MustUsePackage=="True") {
				alert("You must select a package in order to make a web booking.");
				return false;
			}
		}
	    else { // package selected

      		if (PckgArr[j].length != 0) {

				//alert(PckgArr[j]);
				//alert(pcode);

				PckgArrj = PckgArr[j].split(",");
        		ConvDate(PckgArrj[0]);
        		PckgStart = new Date(yr,mth,day);
		        ConvDate(PckgArrj[1]);
		        PckgEnd = new Date(yr,mth,day);

		        PckgValDay = PckgArrj[2];
		        PckgMinDay = PckgArrj[3];
		        PckgMaxDay = PckgArrj[4];
		        PckgCatg = PckgArrj[5];

		        idxn = theForm.Nites.selectedIndex;
		        idxy = theForm.YearFrom.selectedIndex;
		        idxm = theForm.MonthFrom.selectedIndex;
		        idxd = theForm.Day.selectedIndex;

		        nights = theForm.Nites.options[idxn].value;
		        StartDate = new Date(theForm.YearFrom.options[idxy].value,theForm.MonthFrom.options[idxm].value-1,theForm.Day.options[idxd].value);

		        for (j = 0; j < theForm.Day.options[idxd].value; j++) {
					nights++;
				}

				EndDate = new Date(theForm.YearFrom.options[idxy].value,theForm.MonthFrom.options[idxm].value-1,nights);
        		LastDate = new Date(theForm.YearFrom.options[idxy].value,theForm.MonthFrom.options[idxm].value-1,nights-1);
        		errnum = 0;

        		if (PckgValDay.indexOf('S') >= 0) {

          			errnum = 5;

          			for (j = 0; j < PckgValDay.length; j++) {
            			if (PckgValDay.charAt(j) == 'S') {
            				if (StartDate.getDay() == j) {
            				    errnum = 0;
            				    break;
                			}
              			}
            		}
          		}


        		if ((StartDate < PckgStart) || (StartDate > PckgEnd)) {
          			errnum = 4;
				}

 				// check for any stop dates for the package
				if (theForm.packageextra.value != "") {
					var pInfo = new Array();
					var eArr = new Array();
					eArr = theForm.packageextra.value.split(";");
					for (var n=0; n<eArr.length; n++) {
						pInfo = eArr[n].split(",");
						var stopPackStart = new Date();
						stopPackStart.setDate(pInfo[1].substring(0,2));
						stopPackStart.setMonth(pInfo[1].substring(2,4)-1);
						stopPackStart.setFullYear(pInfo[1].substring(4,8));
						stopPackStart.setHours(0,0,0,0);
						var stopPackEnd = new Date();
						stopPackEnd.setDate(pInfo[2].substring(0,2));
						stopPackEnd.setMonth(pInfo[2].substring(2,4)-1);
						stopPackEnd.setFullYear(pInfo[2].substring(4,8));
						stopPackEnd.setHours(0,0,0,0);
						if (pInfo[0] == pcode) {
							//alert(StartDate + " <= " + stopPackEnd);
							if( StartDate <= stopPackEnd ) {
								//alert("true");
								//alert(LastDate + " >= " + stopPackStart);
								if ( LastDate >= stopPackStart) {
									//alert("true");
									errnum = 6;
									dat1str = fmtDate2(stopPackStart.getFullYear(),stopPackStart.getMonth(),stopPackStart.getDate());
									dat2str = fmtDate2(stopPackEnd.getFullYear(),stopPackEnd.getMonth(),stopPackEnd.getDate());
									var xpmess = "The package that has been selected has been closed out for stay dates\n between ";
									xpmess +=  dat1str + " and " + dat2str + ", due to a special event.\n\n";
									xpmess += "Please try using another package, or not using a package at all.";
									break;
								}
							}
						}
					}
				}

				if (errnum == 0) {

          			actpckg = false;
          			days = 0;
          			datvar = StartDate;


          			while (datvar < EndDate.valueOf()) {

            			if ((datvar.valueOf() >= PckgStart.valueOf()) && (datvar.valueOf() <= PckgEnd.valueOf())) {

              				daynum = datvar.getDay();

              				if ((PckgValDay.substr(daynum,1) == 'Y') || (PckgValDay.substr(daynum,1) == 'S')) {
                				actpckg = true;

                				if (days == 0) {
                  					firstdate = datvar;
								}
                				days++;

                				if (datvar.valueOf() == LastDate.valueOf()) {

                  					if ((PckgMinDay != 0) && (days < PckgMinDay)) {
                   			 			errnum = 2;
                   			 			break;
                   			 		}

                   			 		if ((PckgMaxDay != 0) && (days > PckgMaxDay)) {
                   			 			errnum = 3;
                   			 			break;
                   			 		}
                  				}
                			}
                			else {
                   			 	errnum = 1;
                   			 	break;
                   			}
						}
                		else {

							if (days > 0) {

								if ((PckgMinDay != 0) && (days < PckgMinDay)) {
                    				errnum = 2;
                    				break;
                    			}
                    			else if ((PckgMaxDay != 0) && (days > PckgMaxDay)) {
                    				errnum = 3;
                    				break;
                    			}
                  			}
                			days = 0;
                		}

                		dv = datvar.valueOf();
            			datvar = new Date(dv + 86400000);

					}

					if (!actpckg) {
						errnum = 1;
					}

				}




				if (errnum != 0) {

        			if (errnum == 1) {

						var errorStr = "Package must commence on a particular day of the week, and is only valid on certain days.\n\n"
						var daysStr = '';
						var valDays = '';
        				if (PckgValDay.indexOf('S') >= 0) {
          					for (var m = 0; m < PckgValDay.length; m++) {
            					if (PckgValDay.charAt(m) == 'S') {
									if (daysStr.length > 0) daysStr = daysStr + ", ";
									daysStr = daysStr + 'SunMonTueWedThuFriSat'.substr(m*3, 3);
              					}
							}
							errorStr = errorStr + "Package must commence on one of the following days: " + daysStr + ".\n\n";
            			}
        				if (PckgValDay.indexOf('-') >= 0) {       // one or more days are not allowed
          					for (var m = 0; m < PckgValDay.length; m++) {
            					if ( (PckgValDay.charAt(m) == 'S') || (PckgValDay.charAt(m) == 'Y') ) {
									if (valDays.length > 0) valDays = valDays + ", ";
									valDays = valDays + 'SunMonTueWedThuFriSat'.substr(m*3, 3);
              					}
							}
							errorStr = errorStr + "Package is only valid on the following days: " + valDays + ".\n\n";
						}

						errorStr = errorStr + "Either remove the package or change the stay dates.";
						alert(errorStr);

					}
					else if (errnum == 2) {
						firstdatestr = fmtDate(firstdate.getFullYear(),firstdate.getMonth(),firstdate.getDate());
             	     	alert("Stay does not satisfy the minimum number of package days\ncommencing on " + firstdatestr + ".\n\nThere is a minimum stay of " + PckgMinDay + " days with this package.\n\nEither remove the package or change the stay dates.");
					}
					else if (errnum == 3) {
						firstdatestr = fmtDate(firstdate.getFullYear(),firstdate.getMonth(),firstdate.getDate());
						alert("Stay exceeds the maximum number of package days\ncommencing on " + firstdatestr + ".\n\nThere is a maximum stay of " + PckgMaxDay + " days with this package.\n\nEither remove the package or change the stay dates.");
					}
        			else if (errnum == 4) {

             			PckgStartstr = fmtDate(PckgStart.getFullYear(),PckgStart.getMonth(),PckgStart.getDate());
              			PckgEndstr = fmtDate(PckgEnd.getFullYear(),PckgEnd.getMonth(),PckgEnd.getDate());
             			alert("Package is only available between " + PckgStartstr + " and " + PckgEndstr + ".\n\nEither remove the package or change the stay dates.");
             		}
             		else if (errnum == 5) {

						var errorStr = "Package must commence on a particular day of the week, and is only valid on certain days.\n\n"
						var daysStr = '';
						var valDays = '';
        				if (PckgValDay.indexOf('S') >= 0) {
          					for (var m = 0; m < PckgValDay.length; m++) {
            					if (PckgValDay.charAt(m) == 'S') {
									if (daysStr.length > 0) daysStr = daysStr + ", ";
									daysStr = daysStr + 'SunMonTueWedThuFriSat'.substr(m*3, 3);
              					}
							}
							errorStr = errorStr + "Package must commence on one of the following days: " + daysStr + ".\n\n";
            			}
        				if (PckgValDay.indexOf('-') >= 0) {       // one or more days are not allowed
          					for (var m = 0; m < PckgValDay.length; m++) {
            					if ( (PckgValDay.charAt(m) == 'S') || (PckgValDay.charAt(m) == 'Y') ) {
									if (valDays.length > 0) valDays = valDays + ", ";
									valDays = valDays + 'SunMonTueWedThuFriSat'.substr(m*3, 3);
              					}
							}
							errorStr = errorStr + "Package is only valid on the following days: " + valDays + ".\n\n";
						}

						errorStr = errorStr + "Either remove the package or change the stay dates.";
						alert(errorStr);
					}
					else if (errnum == 6) {
						alert(xpmess);
					}

        			return false;
				}// if (errnum != 0)
			} // if (PckgArr[j].length != 0) {
		} // if (j != 0) { // package selected
	}//if (PckgConf.length > 2) {
	return true;
}








function pckginfo(theForm,pckgstr,packagename)
{
  var j,DescARR;

  DescARR = pckgstr.split("|");
  j = theForm.Package.selectedIndex;
  theForm.PckgName.value = packagename[j];
  if (j != 0) {
    if (DescARR[j].length != 0) {
      text = "Package Details :" + "\n\n" + DescARR[j];
      alert(text);
    }
  }
}



