var arrMonths;
var arrMonthsDays;
var arrWeekdays;

var intDepDay;
var intDepMonth;
var intDepYear;

var intRetDay;
var intRetMonth;
var intRetYear;

var intTodayDay;
var intTodayMonth;
var intTodayYear;

var dateFirstDayInDepMonth;
var dateFirstDayInRetMonth;

var intDepStartPos;
var intRetStartPos;

var intDisplayDepMonth;
var intDisplayRetMonth;

var intDisplayDepYear;
var intDisplayRetYear;

var refDepDay;
var refRetDay;

var refDepMonthAndYear;
var refRetMonthAndYear;

var refDepDayLabel;
var refRetDayLabel;

var intDepMonthAdded;
var intRetMonthAdded;

var intMaxMonthAdd;

var objDepCalFrame;
var objRetCalFrame;

var objDepCal;
var objRetCal;


function loadCalendar(intD, intM, intY, refDD, refDMAY, refDL, refRD, refRMAY, refRL, strMonday, strTuesday, strWednesday, strThursday, strFriday, strSaturday, strSunday, strJanuary, strFebruary, strMarch, strApril, strMay, strJune, strJuly, strAugust, strSeptember, strOctober, strNovember, strDecember, strExit, strCSSPath) {

    intMaxMonthAdd = 11;

    refDepDay = refDD;
    refRetDay = refRD;

    refDepMonthAndYear = refDMAY;
    refRetMonthAndYear = refRMAY;

    refDepDayLabel = refDL;
    refRetDayLabel = refRL;

    arrWeekdays = [strSunday, strMonday, strTuesday, strWednesday, strThursday, strFriday, strSaturday];

    arrMonths = [strJanuary, strFebruary, strMarch, strApril, strMay, strJune, strJuly, strAugust, strSeptember, strOctober, strNovember, strDecember];

    arrMonthsDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

    intTodayDay = intD;
    intTodayMonth = intM;
    intTodayYear = intY;

    intDepDay = document.getElementById(refDepDay).value;
    var dep_MonthYear = document.getElementById(refDepMonthAndYear).value.split('/');
    intDepMonth = dep_MonthYear[0];
    intDepYear = dep_MonthYear[1];

    intRetDay = document.getElementById(refRetDay).value;
    var ret_MonthYear = document.getElementById(refRetMonthAndYear).value.split('/');
    intRetMonth = ret_MonthYear[0];
    intRetYear = ret_MonthYear[1];

    intDisplayDepMonth = parseInt(intDepMonth);
    intDisplayRetMonth = parseInt(intRetMonth);

    intDisplayDepYear = parseInt(intDepYear);
    intDisplayRetYear = parseInt(intRetYear);

    intDepMonthAdded = intDisplayDepMonth - intTodayMonth;
    intRetMonthAdded = intDisplayRetMonth - intTodayMonth;

    objDepCalFrame = frames['depCalIframeNew'];
    objRetCalFrame = frames['retCalIframeNew'];

    //updateCalendar();

    firstDaysinMonth();


}

function firstDaysinMonth() {

    // skapar två datumobjekt för respektive månad
    dateFirstDayInDepMonth = new Date(intDisplayDepYear, intDisplayDepMonth - 1, 1);
    dateFirstDayInRetMonth = new Date(intDisplayRetYear, intDisplayRetMonth - 1, 1);
    
    // kollar vilken veckodag den första i respektive månad har
    if (dateFirstDayInDepMonth.getDay() == 0) {
        intDepStartPos = 7;
    }
    else {
        intDepStartPos = dateFirstDayInDepMonth.getDay();
    }
    if (dateFirstDayInRetMonth.getDay() == 0) {
        intRetStartPos = 7;
    }
    else {
        intRetStartPos = dateFirstDayInRetMonth.getDay();
    }
}


function updateCalendar() {

    firstDaysinMonth();

    // sätter veckonumren
    document.getElementById('depWeekNumber1').innerHTML = "v" + getWeekNumber(dateFirstDayInDepMonth);
    document.getElementById('depWeekNumber2').innerHTML = "v" + getWeekNumber(DateAdd(dateFirstDayInDepMonth, 7, 0, 0));
    document.getElementById('depWeekNumber3').innerHTML = "v" + getWeekNumber(DateAdd(dateFirstDayInDepMonth, 14, 0, 0));
    document.getElementById('depWeekNumber4').innerHTML = "v" + getWeekNumber(DateAdd(dateFirstDayInDepMonth, 21, 0, 0));
    document.getElementById('depWeekNumber5').innerHTML = "v" + getWeekNumber(DateAdd(dateFirstDayInDepMonth, 28, 0, 0));
    document.getElementById('depWeekNumber6').innerHTML = "v" + getWeekNumber(DateAdd(dateFirstDayInDepMonth, 35, 0, 0));

    document.getElementById('retWeekNumber1').innerHTML = "v" + getWeekNumber(dateFirstDayInRetMonth);
    document.getElementById('retWeekNumber2').innerHTML = "v" + getWeekNumber(DateAdd(dateFirstDayInRetMonth, 7, 0, 0));
    document.getElementById('retWeekNumber3').innerHTML = "v" + getWeekNumber(DateAdd(dateFirstDayInRetMonth, 14, 0, 0));
    document.getElementById('retWeekNumber4').innerHTML = "v" + getWeekNumber(DateAdd(dateFirstDayInRetMonth, 21, 0, 0));
    document.getElementById('retWeekNumber5').innerHTML = "v" + getWeekNumber(DateAdd(dateFirstDayInRetMonth, 28, 0, 0));
    document.getElementById('retWeekNumber6').innerHTML = "v" + getWeekNumber(DateAdd(dateFirstDayInRetMonth, 35, 0, 0)); 

    // uppdaterar rutmönstret
    for (i = 1; i <= 42; i++) {
        // om det e valt datum
        var depField = document.getElementById('depField' + i);

        if (i - intDepStartPos + 1 == intDepDay && intDisplayDepMonth == intDepMonth && intDisplayDepYear == intDepYear) {
            depField.className = 'Calendar_DaySelected';
            depField.innerHTML = i - intDepStartPos + 1;

        }
        // numrerar de fält som ska numreras
        else if (i >= intDepStartPos && i <= arrMonthsDays[intDisplayDepMonth - 1] + intDepStartPos - 1) {
            depField.className = 'Calendar_DayUnselected';
            depField.innerHTML = i - intDepStartPos + 1;
            // om datumet har varit
            if (intTodayDay > i - intDepStartPos + 1 && intDisplayDepMonth == intTodayMonth && intDisplayDepYear == intTodayYear) {
                depField.className = 'Calendar_Disabled';
            }
            else {
                depField.className = 'Calendar_DayUnselected';
            }
        }
        // fält som ska vara tomma
        else {
            depField.className = 'Calendar_Disabled';
            depField.innerHTML = '';
        }
    }

    // uppdaterar rutmönstret
    for (i = 1; i <= 42; i++) {
        // om det e valt datum
        var retField = document.getElementById('retField' + i);

        if (i - intRetStartPos + 1 == intRetDay && intDisplayRetMonth == intRetMonth && intDisplayRetYear == intRetYear) {
            retField.className = 'Calendar_DaySelected';
            retField.innerHTML = i - intRetStartPos + 1;
        }
        // numrerar de fält som ska numreras
        else if (i >= intRetStartPos && i <= arrMonthsDays[intDisplayRetMonth - 1] + intRetStartPos - 1) {
            retField.className = 'Calendar_DayUnselected';
            retField.innerHTML = i - intRetStartPos + 1;
            // om datumet har varit

            if ((intDepDay > i - intRetStartPos + 1 && intDisplayRetMonth == intDepMonth && intDisplayRetYear == intDepYear) || (intDisplayRetMonth < intDepMonth && intDisplayRetYear <= intDepYear) || (intDepMonth < intDisplayRetMonth && intDepYear > intDisplayRetYear)) {
                retField.className = 'Calendar_Disabled';
            }
            else {
                retField.className = 'Calendar_DayUnselected';
            }
        }
        // fält som ska vara tomma
        else {
            retField.className = 'Calendar_Disabled';
            retField.innerHTML = '';
        }
    }

    var date1 = intDepYear + '/' + intDepMonth + '/' + intDepDay;
    var date2 = intRetYear + '/' + intRetMonth + '/' + intRetDay;
    //updateDateValidators(date1, date2);
}

function submitCalendar() {

    document.getElementById(refDepDay).value = intDepDay;
    document.getElementById(refDepMonthAndYear).value = intDepMonth + "/" + intDepYear;

    document.getElementById(refRetDay).value = intRetDay;
    document.getElementById(refRetMonthAndYear).value = intRetMonth + "/" + intRetYear;

    changeDay(refDepDay, refDepMonthAndYear, refDepDayLabel);
    changeDay(refRetDay, refRetMonthAndYear, refRetDayLabel);
}

function getWeekNumber(date) {

    var d = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
    var DoW = d.getDay();
    d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu
    var ms = d.valueOf(); // GMT
    d.setMonth(0);
    d.setDate(4); // Thu in Week 1
    return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;

}

function ModifiedJulianDay(Year, Month, Day) {
    var today, d, Y_m, M_m, K, MJD, JD, decimal_time
    d = 367 * Year - Div((7 * (Year + (Div((Month + 9), 12)))), 4) + Div((275 * Month), 9) + Day - 730530;
    MJD = d + 51543.0; // OK
    return (MJD)
}

function Div(a, b) {
    return ((a - a % b) / b)
}

function DateAdd(startDate, numDays, numMonths, numYears) {
    var returnDate = new Date(startDate.getTime());
    var yearsToAdd = numYears;

    var month = returnDate.getMonth() + numMonths;
    if (month > 11) {
        yearsToAdd = Math.floor((month + 1) / 12);
        month -= 12 * yearsToAdd;
        yearsToAdd += numYears;
    }
    returnDate.setMonth(month);
    returnDate.setFullYear(returnDate.getFullYear() + yearsToAdd);

    returnDate.setTime(returnDate.getTime() + 60000 * 60 * 24 * numDays);

    return returnDate;

}

function YearAdd(startDate, numYears) {
    return DateAdd(startDate, 0, 0, numYears);
}

function MonthAdd(startDate, numMonths) {
    return DateAdd(startDate, 0, numMonths, 0);
}

function DayAdd(startDate, numDays) {
    return DateAdd(startDate, numDays, 0, 0);
}

var refObjDay;
var refObjMonthAndYear;



function changeDays(objDay1, objDay2, objMonthAndYear1, objMonthAndYear2, objDayName1, objDayName2, intDateWhichTriggerd) {

    var dateDepDay = parseInt(document.getElementById(objDay1).value);
    var dep_MonthYear = document.getElementById(objMonthAndYear1).value.split('/');
    var dateDepMonth = parseInt(dep_MonthYear[0]);
    var dateDepYear = parseInt(dep_MonthYear[1]);

    intDepDay = dateDepDay;
    intDepMonth = dateDepMonth;
    intDepYear = dateDepYear;

    var dateRetDay = parseInt(document.getElementById(objDay2).value);
    var ret_MonthYear = document.getElementById(objMonthAndYear2).value.split('/');
    var dateRetMonth = parseInt(ret_MonthYear[0]);
    var dateRetYear = parseInt(ret_MonthYear[1]);

    intRetDay = dateRetDay;
    intRetMonth = dateRetMonth;
    intRetYear = dateRetYear;

    if ((dateDepDay > dateRetDay && dateDepMonth >= dateRetMonth && dateDepYear >= dateRetYear) || (dateDepMonth > dateRetMonth && dateDepYear >= dateRetYear) || dateDepYear > dateRetYear) {
        //alert((dateDepMonth + "-" + dateRetMonth));
        if (intDateWhichTriggerd == 1) {
            document.getElementById(objDay2).value = document.getElementById(objDay1).value;
            document.getElementById(objMonthAndYear2).value = document.getElementById(objMonthAndYear1).value;
        }
        else if (intDateWhichTriggerd == 2) {
            document.getElementById(objDay1).value = document.getElementById(objDay2).value;
            document.getElementById(objMonthAndYear1).value = document.getElementById(objMonthAndYear2).value;
        }
    }

    submitCalendar();

    // kalender 1
    toggleCalendar('dep', 'none');
    // kalender 2
    toggleCalendar('ret', 'none');


}

function updateDateDropDowns(objDayDropDown, objMonthAndYearDropDown, dateSelected) {
    var intDay;
    var intMonth;
    var intYear;

    intDay = dateSelected.getDate();
    intMonth = dateSelected.getMonth() + 1;
    intYear = dateSelected.getFullYear();

    objDayDropDown.value = intDay;
    objMonthAndYearDropDown.value = intMonth + "/" + intYear;
}

function changeDay(objDay, objMonthAndYear, objDayName) {

    var intDay = document.getElementById(objDay).value;
    var int_MonthYear = document.getElementById(objMonthAndYear).value.split('/');
    var intMonth = int_MonthYear[0];
    var intYear = int_MonthYear[1];

    if (intMonth == 2 && intDay > 28) {
        if ((intYear % 400 == 0) || ((intYear % 4 == 0) && (intYear % 100 != 0))) {
            intDay = 29;
        }
        else {
            intDay = 28;
        }
    }
    else if (intMonth == 4 && intDay > 30) {
        intDay = 30;
    }
    else if (intMonth == 6 && intDay > 30) {
        intDay = 30;
    }
    else if (intMonth == 9 && intDay > 30) {
        intDay = 30;
    }
    else if (intMonth == 11 && intDay > 30) {
        intDay = 30;
    }

    var dateSelected = new Date(intYear, intMonth - 1, intDay);
    var dateToday = new Date(intTodayYear, intTodayMonth - 1, intTodayDay);

    //alert(dateSelected.getMonth()); 

    // Här kan felet ligga 

    if (dateToday > dateSelected) {

        if (intDisplayDepMonth == (dateSelected.getMonth() + 1)) {
            intDay = dateSelected.getDate();
            intMonth = dateSelected.getMonth() + 1;
            intYear = dateSelected.getFullYear();
            dateSelected = new Date(intYear, intMonth, intDay);

        } else {
            dateSelected = dateToday;
            intDay = dateSelected.getDate();
            //intMonth = dateSelected.getMonth() + 1;
            intMonth = dateSelected.getMonth();
            intYear = dateSelected.getFullYear();
        }
    }

    updateDateDropDowns(document.getElementById(objDay), document.getElementById(objMonthAndYear), dateSelected);


    if (objDayName.length > 0) {
        document.getElementById(objDayName).innerHTML = arrWeekdays[new Date(intYear, intMonth - 1, intDay).getDay()];
    }

}

function disableElement(strElementID) {
    if (strElementID == 'calret' && document.getElementById(strElementID) != null) {
        document.getElementById(strElementID).disabled = true;
    } else {
        if (strElementID.length > 0 && document.getElementById(strElementID) != null) {
            document.getElementById(strElementID).disabled = true;
        }
    }
}
function enableElement(strElementID) {
    if (strElementID == 'calret' && document.getElementById(strElementID) != null) {
        document.getElementById(strElementID).disabled = false;
    } else {
        if (strElementID.length > 0 && document.getElementById(strElementID) != null) {
            document.getElementById(strElementID).disabled = false;
        }
    }
}

function KeepDropDownConsistency(strDropDown1ClientID, strDropDown2ClientID) {

    dropMonth1 = parseInt(document.getElementById(strDropDown1ClientID).value.split('/')[0]);
    dropMonth2 = parseInt(document.getElementById(strDropDown2ClientID).value.split('/')[0]);
    dropYear1 = parseInt(document.getElementById(strDropDown1ClientID).value.split('/')[1]);
    dropYear2 = parseInt(document.getElementById(strDropDown2ClientID).value.split('/')[1]);

    if (document.getElementById(strDropDown1ClientID) != null && document.getElementById(strDropDown2ClientID) != null) {
        if ((dropMonth1 >= dropMonth2 && dropYear1 == dropYear2) | (dropMonth1 >= dropMonth2 && dropYear1 >= dropYear2) | (dropMonth1 < dropMonth2 && dropYear1 > dropYear2)) {
            document.getElementById(strDropDown2ClientID).value = document.getElementById(strDropDown1ClientID).value;
        }
    }
}

function LayerFrame(id) {
    this.id = id;
}

function setDay(strType, intDay, cssClass) {
    if (cssClass == 'Calendar_DayUnselected') {
        if (strType == 'dep' && intDay - intDepStartPos + 1 >= 1 && intDay - intDepStartPos + 1 <= arrMonthsDays[intDisplayDepMonth - 1]) {
            intDepDay = intDay - intDepStartPos + 1;
            intDepMonth = intDisplayDepMonth;
            intDepYear = intDisplayDepYear;
            if ((intDepDay > intRetDay && intDepMonth >= intRetMonth && intDepYear >= intRetYear) || intDepMonth > intRetMonth || intDepYear > intRetYear) {
                intRetDay = intDepDay;
                intRetMonth = intDepMonth;
                intRetYear = intDepYear;
            }
        } else if (strType == 'ret' && intDay - intRetStartPos + 1 >= 1 && intDay - intRetStartPos + 1 <= arrMonthsDays[intDisplayRetMonth - 1]) {
            intRetDay = intDay - intRetStartPos + 1;
            intRetMonth = intDisplayRetMonth;
            intRetYear = intDisplayRetYear;
        }
        
        submitCalendar();
        toggleCalendar(strType, 'none');
    }
}

function setMonth(strType, intTemp) {
    if (strType == 'dep' && (intDepMonthAdded < intMaxMonthAdd || intTemp == -1)) {
        if (intDisplayDepMonth == 12 && intTemp == 1) {
            intDisplayDepMonth = 1;
            intDisplayDepYear = intDisplayDepYear + 1;
            intDepMonthAdded = intDepMonthAdded + intTemp;
        } else if (intDisplayDepMonth == 1 && intTemp == -1) {
            intDisplayDepMonth = 12;
            intDisplayDepYear = intDisplayDepYear - 1;
            intDepMonthAdded = intDepMonthAdded + intTemp;
        } else if ((intDisplayDepMonth != intTodayMonth || intDisplayDepYear != intTodayYear) || intTemp == 1) {
            intDisplayDepMonth = intDisplayDepMonth + intTemp;
            intDepMonthAdded = intDepMonthAdded + intTemp;
        }
    } else if (strType == 'ret' && (intRetMonthAdded < intMaxMonthAdd || intTemp == -1)) {
        if (intDisplayRetMonth == 12 && intTemp == 1) {
            intDisplayRetMonth = 1;
            intDisplayRetYear = intDisplayRetYear + 1;
            intRetMonthAdded = intRetMonthAdded + intTemp;
        } else if (intDisplayRetMonth == 1 && intTemp == -1) {
            intDisplayRetMonth = 12;
            intDisplayRetYear = intDisplayRetYear - 1;
            intRetMonthAdded = intRetMonthAdded + intTemp;
        } else if ((intDisplayRetMonth != intTodayMonth || intDisplayRetYear != intTodayYear) || intTemp == 1) {
            intDisplayRetMonth = intDisplayRetMonth + intTemp;
            intRetMonthAdded = intRetMonthAdded + intTemp;
        }
    }
    //updateCalendar();
}
function toggleCalendar(strType, e, strAlign) {

    intDepDay = document.getElementById(refDepDay).value;
    var dep_MonthYear = document.getElementById(refDepMonthAndYear).value.split('/');
    intDepMonth = dep_MonthYear[0]; 
    intDepYear = dep_MonthYear[1];

    intRetDay = document.getElementById(refRetDay).value;
    var ret_MonthYear = document.getElementById(refRetMonthAndYear).value.split('/');
    intRetMonth = ret_MonthYear[0];
    intRetYear = ret_MonthYear[1];

    intDisplayDepMonth = parseInt(intDepMonth);
    intDisplayRetMonth = parseInt(intRetMonth);

    intDisplayDepYear = parseInt(intDepYear);
    intDisplayRetYear = parseInt(intRetYear);

    updateCalendar();

}