// 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.
//


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 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);
}


var btnBack = 0;
var btnNext = 0;

function validate(theForm,PckgConf,Today,NitesBefore,MustUsePackage)
{
  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;

  if ((btnBack == 1) && (btnNext == 0)) {
    history.go(-1);
    return false;
    }
  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("|");
    	j = theForm.Package.selectedIndex;


	    if (j != 0) { // package selected

      		if (PckgArr[j].length != 0) {

				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;
				}


				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);
					}

        			return false;
				}





			}
		}
	}
	else {

		if (MustUsePackage=="True") {
      		alert("You must select a package in order to make a web booking.");
      		return false;
      	}
    }
	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);
    }
  }
}



