var bGColor="white";
var linkColor="black";
var textColor="black";
cMo = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];

dOW= [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
var wC = "#e0e0e0";
DOM=[31,28,31,30,31,30,31,31,30,31,30,31];
lDOM=[31,29,31,30,31,30,31,31,30,31,30,31];
var cDa = new Date();
var cD;
var cM;
var bD;
var bM;
var bY;

dF = new Object();
dF = document.thisForm;

var sD;
var sDset;
var sM;
var sY;

var date;
var day;

var minDate;
var maxDate;
var dFDM = new Object();
var dFDD = new Object;
var dG = new Object();
var H;

var changeFlag = false;

function initDropDownCalendars()
{
    dF = document.thisForm;

    sD = pI( minAllowedDate.substring( 6, 8));
    //sDset must never be changed!
    sDset=sD;
// Include yr + mth
    sM = pI( minAllowedDate.substring( 0, 6)) - 1;
//  sM = pI( minAllowedDate.substring( 4, 6)) - 1;
    sY = pI( minAllowedDate.substring( 0, 4));

    createMonths( minAllowedDate, maxAllowedDate, dF.obDM, dF.obDD);
    createMonths( minAllowedDate, maxAllowedDate, dF.rtDM, dF.rtDD);
  // Set Default Values
    dF.outboundDate.value=minAllowedDate;
    dF.returnDate.value=minAllowedDate;
}


function obDMChange()
{
    if( !changeFlag)
    {

        if ((dF.obDM.options[ dF.obDM.selectedIndex].value-1)==sM)
        {
            // If start date is set back to server Month, restrict day to todays date
            sD=sDset;
        }
        else {
            sD=dF.obDD.options[ dF.obDD.selectedIndex].value;
        }

        if( dF.returnDate.value == '')
        {
            loadDropDowns( minAllowedDate, maxAllowedDate, dF.outboundDate, dF.obDM, dF.obDD,1);
            // Modify Rtn drop down
            loadDropDowns( minAllowedDate, maxAllowedDate, dF.returnDate, dF.obDM, dF.obDD,1);
            // Modify new Min date
            dF.outboundDate.value = dF.obDM.options[ dF.obDM.selectedIndex].value +  dF.obDD.options[ dF.obDD.selectedIndex].value;
            createMonths( dF.outboundDate.value, maxAllowedDate, dF.rtDM, dF.rtDD);
            var dateValue = dF.rtDM.options[ dF.rtDM.selectedIndex].value;
            createDays( pI( dateValue.substring( 4,6)) - 1, dateValue.substring( 0, 4), 1, dF.rtDD, dF.rtDM);
        }
        else
        {
            // Called when Rtn date has been previously set - i.e. User changing start date
    //      var offsetDay = dF.obDD.options[ dF.obDD.selectedIndex].value;
            loadDropDowns( minAllowedDate, dF.returnDate.value, dF.outboundDate, dF.obDM, dF.obDD,1);
            // Modify Rtn drop down if Outbound Month > Rtn Month
            if (dF.obDM.options[ dF.obDM.selectedIndex].value > dF.rtDM.options[ dF.rtDM.selectedIndex].value )
            {
                var offsetDay = dF.rtDD.options[ dF.rtDD.selectedIndex].value;
                loadDropDowns( minAllowedDate, maxAllowedDate, dF.returnDate, dF.rtDM, dF.rtDD,offsetDay);
                dF.outboundDate.value = dF.obDM.options[ dF.obDM.selectedIndex].value +  dF.obDD.options[ dF.obDD.selectedIndex].value;
                createMonths( dF.outboundDate.value, maxAllowedDate, dF.rtDM, dF.rtDD);
                var dateValue = dF.rtDM.options[ dF.rtDM.selectedIndex].value;
                createDays( pI( dateValue.substring( 4,6)) - 1, dateValue.substring( 0, 4), 1, dF.rtDD, dF.rtDM);
                dF.returnDate.value = dF.outboundDate.value;
            }
            else{
                // This is the scenario where users have set the Out Month to an earlier month
                // Change the Rtn day menu to keep the original focus but include every day for that month
                // Month range has to change Also!!! Note diff across end of yr...
                var dateValue = dF.rtDM.options[ dF.rtDM.selectedIndex].value;
                var monthOffset=pI(dF.obDM.options[dF.obDM.selectedIndex].value);
                var dayOffset2=pI(dF.rtDD.options[dF.rtDD.selectedIndex].value);
                // Modify the Rtn days if they are less than Out days when the same month is selected
                createMonths( dF.outboundDate.value, maxAllowedDate, dF.rtDM, dF.rtDD);
                if (dateValue-monthOffset > 88)
                {
                    dateValue-=88;
                }
                dF.rtDM.selectedIndex=dateValue-monthOffset;

                // Now adjust the days
                // Only do this when the outbound month is greater than the Rtn month
    /*          if ((monthOffset-1)==sM)
                {
                    createDays( pI( dateValue.substring( 4,6)) - 1, dateValue.substring( 0, 4), 1, dF.rtDD, dF.rtDM);
                }
                else {
    alert("Dates ");
    */
                    createDays( pI( dateValue.substring( 4,6)) - 1, dateValue.substring( 0, 4), 1, dF.rtDD, dF.rtDM);
    //          }
                dF.rtDD.selectedIndex=dayOffset2-1;
            }
        }
    }
//  A/C for One-Way
    if (dF.direction[ 0].checked)
    {
        dF.returnDate.value = '';
    }
}


function loadDropDowns( minAllowedDate, maxAllowedDate, dateField, dateMonth, dateDay, offsetDay)
{
    var dateValue = dateMonth.options[ dateMonth.selectedIndex].value;
    //reload day dropdown with correct number of days
    // Preserve Start day if set
//  createDays( pI( dateValue.substring( 4,6)) - 1, dateValue.substring( 0, 4), 1, dateDay, dateMonth);
    createDays( pI( dateValue.substring( 4,6)) - 1, dateValue.substring( 0, 4), offsetDay, dateDay, dateMonth);

    dateField.value = dateMonth.options[ dateMonth.selectedIndex].value +  dateDay.options[ dateDay.selectedIndex].value;

}


function obDDChange()
{
    //alert("obDDChange called");  // PP
    dF.outboundDate.value = dF.obDM.options[ dF.obDM.selectedIndex].value +  dF.obDD.options[ dF.obDD.selectedIndex].value;
    //Set base date to new start date
    if ((dF.obDM.options[ dF.obDM.selectedIndex].value-1)==sM)
    {
        // If start date is set back to server Month, restrict day to todays date
        sD=sDset;
    }
    else {
        sD=dF.obDD.options[ dF.obDD.selectedIndex].value;
    }
    var dateValue = dF.obDM.options[ dF.obDM.selectedIndex].value;
//Update Return Date
//test same month - to be completed
    if (dF.obDM.options[ dF.obDM.selectedIndex].value == dF.rtDM.options[ dF.rtDM.selectedIndex].value)
    {
        if ( pI(dF.obDD.options[ dF.obDD.selectedIndex].value) > pI(dF.rtDD.options[ dF.rtDD.selectedIndex].value) )
        {
            dF.returnDate.value = dF.rtDM.options[ dF.rtDM.selectedIndex].value +  dF.obDD.options[ dF.obDD.selectedIndex].value;
            // Same Month - Outbound Date > Return Date => Set Rtn day to Out day
            createDays( pI( dateValue.substring( 4,6)) - 1, dateValue.substring( 0, 4), dF.obDD.options[ dF.obDD.selectedIndex].value, dF.rtDD,dF.rtDM);
        }
        else{
            // Same Month - Outbound Date < Return Date => Leave Rtn day as is but re-set MinAllowedDate
            var dayOffset1=pI(dF.obDD.options[dF.obDD.selectedIndex].value);
            var dayOffset2=pI(dF.rtDD.options[dF.rtDD.selectedIndex].value);
            createDays( pI( dateValue.substring( 4,6)) - 1, dateValue.substring( 0, 4), pI(dF.obDD.options[ dF.obDD.selectedIndex].value), dF.rtDD,dF.rtDM);
            dF.rtDD.selectedIndex=dayOffset2-dayOffset1;
            dF.returnDate.value = dF.rtDM.options[ dF.rtDM.selectedIndex].value +  dF.rtDD.options[ dF.rtDD.selectedIndex].value;
        }
    }
    else{
        // Case - Different Out & Rtn Months
            //Set base date to new start date
        // PP: the following lines are commented out
        //sD=dF.obDD.options[ dF.obDD.selectedIndex].value;
        //createDays( pI( dateValue.substring( 4,6)) - 1, dateValue.substring( 0, 4), 1, dF.rtDD,dF.rtDM);
    }
//  A/C for One-Way
    if (dF.direction[ 0].checked)
    {
        dF.returnDate.value = '';
    }

}


function rtDMChange()
{
    if( !changeFlag)
    {
    if( dF.direction[ 1].checked)
    {
        if( dF.outboundDate.value == '')
        {
            loadDropDowns( minAllowedDate, maxAllowedDate, dF.returnDate, dF.rtDM, dF.rtDD,1);
            createMonths( minAllowedDate, dF.returnDate.value, dF.obDM, dF.obDD);
        }
        else
        {
            if (dF.obDM.options[dF.obDM.selectedIndex].value==dF.rtDM.options[dF.rtDM.selectedIndex].value)
            {
            // If rtn month == out month => re-synch out dat and rtn day
                loadDropDowns( dF.outboundDate.value, maxAllowedDate, dF.returnDate, dF.rtDM, dF.rtDD,dF.obDD.options[dF.obDD.selectedIndex].value);
            }
            else {
                loadDropDowns( dF.outboundDate.value, maxAllowedDate, dF.returnDate, dF.rtDM, dF.rtDD,1);
    //          createMonths( minAllowedDate, dF.returnDate.value, dF.obDM, dF.obDD);
    //          dF.outboundDate.value = dF.obDM.options[ dF.obDM.selectedIndex+6].value +  dF.obDD.options[ dF.obDD.selectedIndex].value;
    //set index
                var monthOffset1=dF.obDM.options[dF.obDM.selectedIndex].value;
                var yrOffset1=monthOffset1.substring( 0,4);
                monthOffset1=pI(monthOffset1.substring( 4,6)) - 1;
                var monthOffset2=dF.rtDM.options[dF.rtDM.selectedIndex].value;
                var yrOffset2=monthOffset2.substring( 0,4);
                monthOffset2=pI( monthOffset2.substring( 4,6)) - 1;
                if (yrOffset2-yrOffset1==1)
                {
                    monthOffset2+=12;
                }
                if (monthOffset2-monthOffset1 >88)
                {
                    // Cross year i.e. 2003 - 2004, then subtract 100 and add 12
                    monthOffset2-=88;
                }

                dF.rtDM.selectedIndex=monthOffset2-monthOffset1;
                dF.returnDate.value = dF.rtDM.options[ dF.rtDM.selectedIndex].value +  dF.rtDD.options[ dF.rtDD.selectedIndex].value;
/*              createMonths( minAllowedDate, dF.returnDate.value, dF.obDM, dF.obDD);
                var yrOffset=minAllowedDate.substring( 0,4);
//              monthOffset1=pI( minAllowedDate.substring( 4,6)) - 1;
                if (yrOffset2 > yrOffset)
                {
                    monthOffset2+=12
                }
alert("monthOffset1: "+monthOffset1+" monthOffset2: "+monthOffset2+" Offset: "+(monthOffset2-monthOffset1));
                dF.obDM.selectedIndex=monthOffset2-monthOffset1;
*/
            }
        }
    }
    }
}


function rtDDChange()
{
    dF.returnDate.value = dF.rtDM.options[ dF.rtDM.selectedIndex].value +  dF.rtDD.options[ dF.rtDD.selectedIndex].value;
}

function createMonths( minAllowedDate, maxAllowedDate, M, D)
{
    var i;
    var j;
//  var oM = sM + 1;
    var oM = (sM-(sY*100)) + 1;
    var oY = sY;
    var value;
    var minYM = minAllowedDate.substring( 0, 6);
    var maxYM = maxAllowedDate.substring( 0, 6);
    changeFlag = true;
    M.options.length = 0;

    j = 0;
    for( i = 0; i <11; i++)
    {
        value = '' + oY + (( oM.toString().length < 2) ? "0" + oM : oM);

        if( value >= minYM && value <= maxYM)
        {
            M.options[ j] = new Option( cMo[ oM - 1].substring( 0, 3) + ' ' + oY);
            M.options[ j++].value = value;
        }

        oM++;

        if( oM == 13)
        {
            oM = 1;
            oY++;
        }
    }

    M.selectedIndex = 0;

    createDays( sM-(sY*100), sY, minAllowedDate.substring( 6, 8), D, M);
//  createDays( sM, sY, minAllowedDate.substring( 6, 8), D, M);
    changeFlag = false;
}


function createDays( m, y, d, D, M)
{
    loadDays( m, y, d, D);
/*
    if( D.length == 1)
    {
        //Only one day left in month
        M.selectedIndex = M.selectedIndex + 1;
        loadDays( m, y, d, D)
//      loadDays( m + 1, y, d, D)
        D.selectedIndex = 0;
    }
    else
    {
        // No offset in days
        D.selectedIndex = 0;
    }
*/
}


function loadDays( m, y, d, D)
{
    var i;
    var j;
    var k;
    var daysInMonth = gDOM( m, y);
    var baseDay = d;

    D.options.length = 0;
    var displayDate = new Date(y,m,d);

/*
    var displayDate = new Date();
// Set Min day
    displayDate.setDate( d);

    displayDate.setMonth( m);
    displayDate.setFullYear( y);

// A/c for re-selecting base month
    if( m == (sM-200300))
    {
*/
// MUST account for sM=m


    if( m == (sM-200300))
    {
        if ( baseDay<sD)
            {
                baseDay = sD;
                displayDate.setDate( baseDay);
            }
    }

    j = 0;

    k = displayDate.getDay(); // Day of Week i.e. Wed=3
    for( i = baseDay; i <= daysInMonth; i++)
    {
        D.options[ j] = new Option( dOW[ k++] + '  ' + i);
//      D.options[ j++].value =  i;
        D.options[ j++].value =  (( i.toString().length < 2) ? "0" + i : i);

        if( k == 7)
        {
            k = 0;
        }
    }
}


function pI( F)
{
    //Convert to a string in case it's a number
    var f = F.toString();

    if( f.substring( 0,1) == '0' && f.length == 2)
    {
        return parseInt( f.substring( 1));
    }
    else
    {
        return parseInt( f);
    }
}

function showCalendar( minAllowedDate, maxAllowedDate, dHObj, dMObj, dDObj)
{
    dG = dHObj;
    dFDM = dMObj;
    dFDD = dDObj;

    minDate = minAllowedDate;
    maxDate = maxAllowedDate;

    return sC( minAllowedDate.substring( 4, 6), minAllowedDate.substring( 0, 4));
}

function sC( m, y)
{
    var mI;

    mI = pI( m);

    H = '<BODY ONBLUR=\"window.focus();\" link="'+linkColor+'" vlink="'+linkColor+'" alink="'+linkColor+'" text="'+textColor+'">';
    H+='<TABLE ALIGN="CENTER" BORDER="1" STYLE="font-family:Verdana;font-size:10px;font-weight:bold;background-color:white;text-align:center" width="120">';

    oMRows( m, y);

    H+='<TR><TD COLSPAN="6" ALIGN="CENTER"><font size="1" face="verdana"><A HREF="javascript:parent.opener.cC()">Clear</A></font></TD></TR>';
    H+='</TABLE>';
    H+='<B><FONT SIZE="1" face="verdana"><BR><FONT SIZE="1" COLOR=#292074 BGCOLOR="yellow" face="verdana"><B>' + cMo[ mI - 1]+ ' ' + y + '</B><BR>';
    H+='<TABLE BORDER=1 STYLE="font-family:Verdana;font-size:10px;background-color:white;text-align:center">' + gH() + gD( mI, parseInt( y)) + '</TABLE>';
    H+='</TD></TR></TABLE></BODY>';

    return H;
}

function cC()
{
/*
????????????
    if( dFD.name == 'obD')
    {
        dFD.value = 'Departing On';
    }
    else
    {
        dFD.value = 'Returning On';
    }
*/

    dG.value = "";
    hC();
}

function oMRows( m, y)
{
    var i, j;
    var oM = sM + 1;
    var oY = sY;
    var oMS;
    var yM;

    for( i = 0; i < 2; i++)
    {
        H+='<TR>';

        for( j = 0; j < 6; j++)
        {
            oMS = ( oM.toString().length < 2) ? "0" + oM : oM;
            yM = '' + oY + oMS;

            H+='<TD WIDTH="17"';

            if( oM == m && oY == y)
            {
                H+=' BGCOLOR="yellow"';
            }

            H+='><B><font size="1" face="verdana">';

            if( yM >= minDate.substring( 0, 6) && yM <= maxDate.substring( 0, 6))
            {
                H+='<A HREF="javascript:parent.opener.sC(\'' + oMS + '\',\'' + oY +'\')">';
            }
            H+=cMo[ oM - 1].substring( 0, 3)+'</font>';
            H+='</B></TD>';
            oM++;

            if( oM == 13)
            {
                oM = 1;
                oY++;
            }
        }
    H+='</TR>';
    }
}

function gH()
{
    var H='<TR>';
    H+='<TD><font size="1" face="verdana" width="17">Mon</font></TD>';
    H+='<TD><font size="1" face="verdana" width="17">Tue</font></TD>';
    H+='<TD><font size="1" face="verdana" width="17">Wed</font></TD>';
    H+='<TD><font size="1" face="verdana" width="17">Thu</font></TD>';
    H+='<TD><font size="1" face="verdana" width="17">&nbsp;Fri&nbsp;</font></TD>';
    H+='<TD><font size="1" face="verdana" width="17">Sat</font></TD>';
    H+='<TD><font size="1" face="verdana" width="17">Sun</font></TD>';
    H+='</TR>';
    return H;
}

function gD( m, y)
{
    var oD;
    var oM;
    var oDS;
    var op;

    oM = ( m.toString().length < 2) ? "0" + m : m;
    m--;

    var displayDate = new Date();
    displayDate.setDate( 1);
    displayDate.setMonth( m);
    displayDate.setFullYear( y);
    var firstDay = displayDate.getDay();

    if( firstDay == 0)
    {
        firstDay = 7;
    }
    var d = 1;
    var lastDay = gDOM( m, y);
    var vOnLastDay = 0;
    var H = "";
    H+='<TR>';
    for( i = 1; i < firstDay; i++)
    {
        H+='<TD></TD>';
    }
    for( j = firstDay; j < 8; j++)
    {
        oD = ( d.toString().length < 2) ? "0" + d : d;
        oDS = '' + y + oM + oD;

        op = false;
        if( oDS >= minDate && oDS <= maxDate)
        {
            op = true;
        }

        H+='<TD WIDTH="17"' + wWS(j+1, d, m, y)+'>';

        if( op)
        {
            H+= '<B>';
        }

        H+= '<font size="1" face="verdana">';

        if( op)
        {
            H+='<A HREF="javascript:parent.opener.rD(\'' + d + '\',\'' + m + '\',\'' + y + '\')">';
        }
        H+= d + '</A></TD>';

        if( op)
        {
            H+= '</B>';
        }

        H+= '</font>';

        d++;
    }
    H+='</TR>';
    for( k = 2; k < 7; k++)
    {
        H+='<TR>';
        for( j = 0; j < 7; j++)
        {
            oD = ( d.toString().length < 2) ? "0" + d : d;
            oDS = '' + y + oM + oD;

            op = false;
            if( oDS >= minDate && oDS <= maxDate)
            {
                op = true;
            }

            H+='<TD WIDTH="17"' + wWS(j, d, m, y) + '>';

            if( op)
            {
                H+= '<B>';
            }

            H+= '<font size="1" face="verdana">';

            if( op)
            {
                H+='<A HREF="javascript:parent.opener.rD(\'' + d + '\',\'' + m + '\',\'' + y + '\')">';
            }
            H+= d + '</A></TD>';

            if( op)
            {
                H+= '</B>';
            }

            H+= '</font>';
            d++;
            if( d > lastDay)
            {
                vOnLastDay = 1;
                break;
            }
        }
        if( j == 6)
        {
            H+='</TR>';
        }
        if( vOnLastDay == 1)
        {
            break;
        }
    }
    for( m = 1; m < ( 7 - j); m++)
    {
        H+='<TD WIDTH="17"'+wWS(j+m, d, m, y)+'><FONT COLOR="gray" face="verdana" size="1">'+m+'</FONT></TD>';
    }
    return H;
}

function wWS( col, d, m , y)
{
    if( d == sD && m == sM && y ==sY)
    {
        return(' BGCOLOR="yellow"');
    }
    else
    {
        if( col % 2 == 0)
        {
            return(' BGCOLOR="' +wC +'"');
        }
    }
    return '';
}

function gDOM( M, Y)
{
    //Ensure month and year are numbers
    var m = pI( M);

    var y = pI( Y);

    if(( y % 4) == 0)
    {
        if(( y % 100) == 0 && ( y % 400)!= 0)
        {
            return DOM[ m];
        }
        else
        {
            return lDOM[ m];
        }
    }
    else
    {
        return DOM[ m];
    }
}

function rD( d, m, y)
{
    var i;
    var displayDate = new Date( y, m, d);
    var day = displayDate.getDay();

    m++;
    var yearMonth = '' + y + (( m.toString().length < 2) ? "0" + m : m);

    for( i = 0; i < dFDM.length; i++)
    {
        if( yearMonth == dFDM[ i].value)
        {
            dFDM.selectedIndex = i;
            createDays( --m, y, d, dFDD);
            break;
        }
    }

    dG.value = yearMonth + (( d.toString().length < 2) ? "0" + d : d);

    hC();
}

function hC()
{
    //Close calendar window
    W.close();
}
