var calendarWin;
var targetDate;
var numDaysInFutureToDisplay=365;
var displayMonthColumns=3;
var scrollMonths=1;
var styleSheet='http://travel.sbb.ch/css/calendar.css';

/************************************************************\
*
\************************************************************/
function NewCalendar(name, name2, datefield_day, datefield_month, type, departVal, returnVal)
{
    
    var departDateStr = parseDate(departVal);
    var returnDateStr = parseDate(returnVal);
    if (type=="return" || type=="multi") {
        targetDateStr=departDateStr;
    }
    
    else {
        targetDateStr=departDateStr;
    }
    
    if (targetDateStr.length>0) targetDate = new Date(targetDateStr);
    else if (returnDateStr.length>0) targetDate = new Date(returnDateStr);
    else if (departDateStr.length>0) targetDate = new Date(departDateStr);
    else targetDate= new Date();
    month = targetDate.getMonth()+1;
    year = targetDate.getYear();
    if (year<200) year+=1900;
    showCalendar(name, name2, datefield_day, datefield_month, type, month, year, departDateStr, returnDateStr);
    
}


/************************************************************\
*
\************************************************************/
function updateCalendar(name, name2, datefield_day, datefield_month, type, month, year, departVal, returnVal)
{
    
    var departDateStr = parseDateUS(departVal);
    var returnDateStr = parseDateUS(returnVal);
    showCalendar(name, name2, datefield_day, datefield_month, type, month, year, departDateStr, returnDateStr);
    
}


/************************************************************\
*
\************************************************************/
function showCalendar(name, name2, datefield_day, datefield_month, type, month, year, departDateStr, returnDateStr)
{
    
    var browserWidth = screen.availWidth;
    var browserHeight= screen.availHeight;
    var x = 0;
    var y = 0;
    var displayWidth = 137 * displayMonthColumns;
    x = x + (browserWidth / 2 - (displayWidth/2));
    y = y + (browserHeight / 2 - 105);
    var winOptions = "left="+x+",screenX="+x+",top="+y+",screenY="+y;
    winOptions += ",toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0";
    winOptions += ",resizable=1,height=136,width=" + displayWidth + " ,innerHeight=148,innerWidth=" + 135*displayWidth;
    calendarWin = window.open("", "calendar",winOptions);
    calendarWin.focus();
    calendarWin.document.open();
    calendarWin.document.write(CalendarHTML(name, name2, datefield_day, datefield_month, type, month, year, departDateStr, returnDateStr));
    calendarWin.document.close();
    
}


/************************************************************\
*
\************************************************************/
function CalendarHTML(name, name2, datefield_day, datefield_month, type, month, year, departDateStr, returnDateStr)
{
    
    var result = "";
    var todaysDate = new Date();
    result += '<html>\n';
    result += '<head>\n';
    result += '<link href="'+ styleSheet +'" rel="stylesheet" type="text/css">'
    result += '<title>';
    result += (type=="return")?"Return":"Depart";
    result += '</title>';
    result += '</head>\n';
    result += '<body topmargin=0 leftmargin=0>\n';
    result += '<TABLE cellspacing="0" cellpadding="0" class="calborder" border="0">\n';
    result += '<tr>'
    var pmonth = month-scrollMonths;
    var pyear = year;
    while(pmonth<1){
        
        pmonth+=12;
        pyear=year-1;
        
    }
    
    var nmonth = month+scrollMonths;
    var nyear = year;
    while(nmonth>12){
        
        nmonth-=12;
        nyear=year+1;
        
    }
    
    for(var monthIdx=0; monthIdx<displayMonthColumns; monthIdx++){
        
        if (monthIdx!=0) {
            result +='<td width=1 class=division><IMG src=../flights/w.gif width=1></td>\n'
        }
        
        result += '<td valign=top>\n';
        result += '<TABLE cellspacing="0" cellpadding="0" border="0">\n';
        result += '<TR>\n';
        var previousDate = new Date(pyear,pmonth);
        if ((previousDate.valueOf()>=todaysDate.valueOf()) && (monthIdx==0))
        {
            
            result += ' <TD width="18" height="18" class="previous">';
            result += '<A HREF="javascript:window.opener.updateCalendar(\'' +
            name + "','" + name2 + "','" +datefield_day +"','"+ datefield_month +"','"+type + "', " + pmonth + ", " + pyear +
            ", '" + departDateStr + "', '" + returnDateStr + '\')">';
            
        }
        
        else
        {
            
            result += ' <TD height="18" width="18" class="cal_monthtitle">';
            
        }
        
        result += '&nbsp;&nbsp;&nbsp;</a></TD>\n';
        var month0 = month-1;
        var monthName = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
        result += " <TD align='center' width='100' class='cal_monthtitle'>" + monthName[month0] + "&nbsp;" + year + "</TD>\n";
        var nextDate = new Date(nyear,nmonth-1);
        if ((nextDate.valueOf() < todaysDate.valueOf()+(numDaysInFutureToDisplay*24*60*60*1000)) && (monthIdx==displayMonthColumns-1))
        {
            
            result += ' <TD width="18" class="future">';
            result += ' <A HREF="javascript:window.opener.updateCalendar(\'' +
            name + "','" + name2 + "','" +datefield_day +"','"+ datefield_month +"','"+ type + "', " + nmonth + ", " + nyear +
            ", '" + departDateStr + "', '" + returnDateStr + '\')">';
            
        }
        
        else
        {
            
            result += ' <TD height="18" width="18" class="cal_monthtitle">';
            
        }
        
        result += '&nbsp;&nbsp;&nbsp;</a></TD>\n';
        result += '</TR>\n';
        result += '<TR>\n';
        result += ' <TD align="center" VALIGN="Top" colspan="3">\n';
        result += CalendarTable(name, name2, datefield_day, datefield_month, type, month, year, departDateStr, returnDateStr);
        result += ' </TD>\n';
        result += '</TR>\n';
        result += '</TABLE>\n';
        result += '</td>';
        month += 1;
        if(month==13){
            
            month=1;
            year+=1;
            
        }
        
        
    }
    
    result += '</tr>\n';
    result += '</TABLE>\n';
    result += '</body>\n';
    result += '<!-- vk -->';
    result += '</html>\n';
    return result;
    
}

/************************************************************\
*
\************************************************************/
function CalendarTable(name, name2, datefield_day, datefield_month, type, month, year, departDateStr, returnDateStr)
{
    
    var result = "";
    var month0 = month-1;
    result += '<TABLE width="135" border="0" cellpadding="1">\n';
    result += " <TR><TD align='center' class='cal_daytitle'>S</TD>\n";
    result += " <TD align='center' class='cal_daytitle'>M</TD>\n";
    result += " <TD align='center' class='cal_daytitle'>T</TD>\n";
    result += " <TD align='center' class='cal_daytitle'>W</TD>\n";
    result += " <TD align='center' class='cal_daytitle' >T</TD>\n";
    result += " <TD align='center' class='cal_daytitle' >F</TD>\n";
    result += " <TD align='center' class='cal_daytitle' >S</TD>\n";
    result += CalendarRows(name, name2, datefield_day, datefield_month, type, month0, year, departDateStr, returnDateStr);
    result += '</TABLE>\n';
    return result;
    
}

/************************************************************\
*
\************************************************************/
function CalendarRows(name, name2, datefield_day, datefield_month, type, month0, year, departDateStr, returnDateStr)
{
    
    var result= "";
    var milliDay = 1000*24*60*60; // milliseconds per day
    var today = new Date();
    var firstValidMilli = today.getTime()
    var lastValidMilli = today.getTime() + (numDaysInFutureToDisplay * milliDay);
    var DayOne = new Date(year, month0, 1, 12, 0, 0, 0);  // Set to the middle of the day. Margin for error.
    var dayOfWeek = DayOne.getDay(); // 0 - Sunday, 1 - Monday, ...
    var currentMilli = DayOne.getTime() - (milliDay*dayOfWeek); // first day of week
    var currentDate = new Date(currentMilli);
    var currentDay = currentDate.getDate();
    var currentMonth = currentDate.getMonth();
    var currentYear = currentDate.getFullYear();
    
    
    
    if (departDateStr.length==0)
    {
        departMonth=0;departDay=0;
    }
    
    else {
        
        departDate = new Date(departDateStr);
        departMonth = departDate.getMonth();
        departDay  = departDate.getDate();
        if (type=="return" || type=="multi"){
            
            // make first valid date the depart date...
            departMilli = departDate.getTime();
            if(departMilli>firstValidMilli) firstValidMilli = departMilli;
            
        }
        
        
    }
    
    if (returnDateStr.length==0) {
        returnMonth=0;returnDay=0;
    }
    
    else {
        
        returnDate = new Date(returnDateStr);
        returnMonth = returnDate.getMonth();
        returnDay  = returnDate.getDate();
        
    }
    
    var weeks=0;
    while ((month0 >= currentMonth && year==currentYear) || (year>currentYear))
    {
        
        weeks++;
        result += "<TR>\n"; for (d=0; d<7; d++) {
            
            var isToday = today.getMonth()==currentDate.getMonth()
            && today.getDate()==currentDate.getDate()
            && today.getYear()==currentDate.getYear();
            var notValid = currentMilli< firstValidMilli || currentMilli>lastValidMilli;
            var bold = isToday;
            var dayColor = "#000000";
            if (notValid) dayColor = "#999999";
            if (currentDay==departDay && currentMonth==departMonth) {
                bold=true;dayColor="#cc0000";
            }
            
            if (currentDay==returnDay && currentMonth==returnMonth) {
                bold=true;dayColor="#cc0000";
            }
            
            result += "<TD valign='top' align='center' ";
            if (month0 == currentMonth) result += "class='thismonth'";
            else result += "class='num'";
            result += ">";
            if (notValid) result += "";
            else
            {
                
                currentMonth+=1
                if (currentMonth<10)
                {
                    currentMonth= '0' + currentMonth
                }
                
                ;
                result += "<A HREF=\"javascript:window.opener.SetDate('"+ datefield_day+"','"+ datefield_month+"','" +
                currentDay + "','" + (currentMonth) + "','" + (currentYear) + "' , '" + name + "' , '" + name2 + "')\" class=num>";
                
            }
            
            result += "<span style='color:" + dayColor +"'>";
            if (bold) result += "<B>";
            result += currentDay;
            if (bold) result += "</B>";
            result += "</span>";
            if (notValid) result += "";
            else result += "</A>";
            result += "</TD>\n";
            currentMilli += milliDay;
            currentDate.setTime(currentMilli);
            currentDay = currentDate.getDate();
            currentMonth = currentDate.getMonth();
            currentYear = currentDate.getFullYear();
            
        }
        
        result += "</TR>\n";
        
    }
    
    if (weeks<6){
        
        
    }
    
    return result;
    
}


/************************************************************\
*
\************************************************************/
function SetDate(datefield_day, datefield_month, day, month, year, textBoxName, textBoxName2)
{
    
    var docLength = document.forms.length;
    var trriger_date = day+"/"+ month +"/" + year;
    var year_and_month = year + "-" + month;
    
    for(var formIdx = 0; formIdx < docLength; formIdx++)
    {
        
        var form = document.forms[formIdx];
        
        var formLength = form.length;
        
        for(var i = 0; i < formLength; i++)
        {
            
            
            if( form.elements[i].name == textBoxName )
            {
                
                form.elements[i].value = month;
                
            }
            
            
            if( form.elements[i].name == textBoxName2 )
            {
                
                form.elements[i].value = year;
                
            }
            
            
            if(form.elements[i].id == datefield_day )
            {
                
                // (form.elements[i].value > 0) ? day=day-1 : day=day;
                form.elements[i].selectedIndex=day;
                
            }
            
            
            if(form.elements[i].id == datefield_month )
            {
                
                var select_length = form.elements[i].name.length;
                for ( var idx = 0 ; idx < select_length ; idx ++)
                {
                    
                     // alert (form.elements[i].options[idx].value + ' NE '+ year_and_month);
                    if(form.elements[i].options[idx].value == year_and_month)
                    {
                        
                        form.elements[i].selectedIndex = idx;
                        break;
                        
                    }
                    
                    
                }
                
                
            }
            
            
        }
        
        calendarWin.close()
        
    }
    
    
}


/************************************************************\
*
\************************************************************/
function parseDate(inDate)
{
    
    var sDate = new String(inDate)
    var sep="/";
    var index1 = sDate.indexOf(sep);
    if (index1==-1){
        sep=".";index1 = sDate.indexOf(sep);
    }
    
    if (index1==-1){
        sep="-";index1 = sDate.indexOf(sep);
    }
    
    if (index1==-1){
        sep="\\";index1 = sDate.indexOf(sep);
    }
    
    if (index1==-1) return "";
    var index2 = sDate.lastIndexOf(sep);
    if (index1>=index2) return "";
    var sDay = sDate.substring(0,index1);
    if (!isDigits(sDay)) return "";
    var sMonth = sDate.substring(index1+1, index2);
    if (!isDigits(sMonth)) return "";
    var sYear = sDate.substring(index2+1);
    if (!isDigits(sYear)) return "";
    month=sMonth-0;day=sDay-0;year=sYear-0;
    if (month<1 || month>12) return "";
    if (year<100) year += 2000;
    if (year<1900 || year>2100) return "";
    var daysPerMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    if (year%100==0) {
        if(year%400==0)daysPerMonth[1]=29;
    }
    
    else {
        if(year%4==0)daysPerMonth[1]=29;
    }
    
    if(day<1 || day>daysPerMonth[month-1]) return "";
    return month + "/" + day + "/" + year;
    
}


/************************************************************\
*
\************************************************************/
function parseDateUS(inDate)
{
    
    var sDate = new String(inDate)
    var sep="/";
    var index1 = sDate.indexOf(sep);
    if (index1==-1){
        sep=".";index1 = sDate.indexOf(sep);
    }
    
    if (index1==-1){
        sep="-";index1 = sDate.indexOf(sep);
    }
    
    if (index1==-1){
        sep="\\";index1 = sDate.indexOf(sep);
    }
    
    if (index1==-1) return "";
    var index2 = sDate.lastIndexOf(sep);
    if (index1>=index2) return "";
    var sMonth = sDate.substring(0,index1);
    if (!isDigits(sMonth)) return "";
    var sDay = sDate.substring(index1+1, index2);
    if (!isDigits(sDay)) return "";
    var sYear = sDate.substring(index2+1);
    if (!isDigits(sYear)) return "";
    month=sMonth-0;day=sDay-0;year=sYear-0;
    if (month<1 || month>12) return "";
    if (year<100) year += 2000;
    if (year<1900 || year>2100) return "";
    var daysPerMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    if (year%100==0) {
        if(year%400==0)daysPerMonth[1]=29;
    }
    
    else {
        if(year%4==0)daysPerMonth[1]=29;
    }
    
    if(day<1 || day>daysPerMonth[month-1]) return "";
    return month + "/" + day + "/" + year;
    
}


/************************************************************\
*
\************************************************************/
function isDigits(ch)
{
    
    if (ch.length<=0) return false;
    for (d=0; d<ch.length; d++) {
        if (ch.charAt(d) < "0" || ch.charAt(d) > "9") return false;
    }
    
    return true;
    
}

/************************************************************\
*
\************************************************************/
function truncateYear(yr)
{
    
    var yrStr = new String(yr);
    return yrStr.slice(2,4);
    
}