var aYears  = new Array();
var aMonths = new Array();
var aDays   = new Array();
var goDateStart;

/*  Object Creator representing form date boxes */
function CDate(oDay, oMonth, oYear)
    {
    this.m_oDay            = oDay;
    this.m_oDay.parent     = this;
    this.m_oMonth          = oMonth;
    this.m_oMonth.parent   = this;
    this.m_oMonth.onchange = PopulateDays;
    this.m_oYear           = oYear;
    this.m_oYear.parent    = this;
    this.m_oYear.onchange  = PopulateDays;
    this.m_oDay.onchange   = UpdateSelDay;
    this.m_nSelDay         = 1;
    this.m_oBaseDate       = null;
    this.m_oEndDate        = null;
    this.m_fRendering      = false;
    }

function RenderDate(nYear, nMonth, nDay, oDate)
    {
    if (!oDate.m_fRendering)
        {
        oDate.m_fRendering = true;
        oDate.m_nSelDay = nDay;
        // alert("RenderDate(" + nYear + ", " + nDay + ", " + nMonth + ")");
        PopulateYears(aYears, nYear, oDate);
        PopulateMonths(aMonths, nMonth, oDate);
        PopulateDays(nDay, oDate);
        oDate.m_fRendering = false;
        // alert("RenderDate End: " + nYear + " " + nDay + " " + nMonth);
        }

    }


function AddDays (oJSDate, nDays)
    {
    var nTime;
    
    nTime = oJSDate.getTime();
    nTime += 60 * 60 * 24 * 1000 * nDays;

	oJSDate.setTime(nTime);	
	}
	

function InitDates(nFrom, nTo, nYear, nMonth, nDay, oDate, oDateEnd)
    {
    var oToday;
	var nTime;

    InitYears(nFrom, nTo);
    InitMonths();
    InitDays();

    goDateStart = new Date(nYear, nMonth-1, nDay, 0, 0, 0, 0);

    oToday = new Date();
    
	AddDays(oToday, 7);
    
    if (oToday > goDateStart)
        {
		nTime = oToday.getTime();
		goDateStart.setTime(nTime);
		
		// alert("Start Date is obsolete");
	    }
	else
		{
		nTime  = goDateStart.getTime();
		}
		
	oToday.setTime(nTime);	
	nYear  = oToday.getFullYear();
	nDay   = oToday.getDate();
	nMonth = oToday.getMonth()+1;
    RenderDate(nYear, nMonth, nDay, oDate);
   
    AddDays(oToday, 1);
    
    nYear  = oToday.getFullYear();
	nDay   = oToday.getDate();
	nMonth = oToday.getMonth()+1;
   
    RenderDate(nYear, nMonth, nDay, oDateEnd);

    oDateEnd.m_oBaseDate = oDate;
    oDate.m_oEndDate     = oDateEnd;
	
	delete oToday;
    }


function IsLeapYear(nYear)
    {
    var cTemp = (nYear / 4).toString();
    
    if ( cTemp.indexOf('.') == -1 )
    	{
        return true;
        }
    else
    	{
    	return false;
    	}
    }
    

function InitYears(nFrom, nTo)
    {
    var n = 0;
    var i;

    for(i = nFrom; i < (nTo+1); i++, n++)
        {
        aYears[n] = i;
        }
    }

function InitMonths()
    {
    aMonths[0] = 'Januar';
    aMonths[1] = 'Febuar';
    aMonths[2] = 'März';
    aMonths[3] = 'April';
    aMonths[4] = 'Mai';
    aMonths[5] = 'Juni';
    aMonths[6] = 'Juli';
    aMonths[7] = 'August';
    aMonths[8] = 'September';
    aMonths[9] = 'Oktober';
    aMonths[10] = 'November';
    aMonths[11] = 'Dezember';
    }

function InitDays()
    {
    aDays[0] = 31;
    aDays[1] = 28;
    aDays[2] = 31;
    aDays[3] = 30;
    aDays[4] = 31;
    aDays[5] = 30;
    aDays[6] = 31;
    aDays[7] = 31;
    aDays[8] = 30;
    aDays[9] = 31;
    aDays[10] = 30;
    aDays[11] = 31;
    }

function PopulateYears(arrIn, selYear, dObj)
    {
    var i;

    dObj.m_oYear.options.length = 0;

    for (i = 0; i < arrIn.length; i++)
        {
        dObj.m_oYear.options.length += 1;
        dObj.m_oYear.options[i].value = aYears[i];
        dObj.m_oYear.options[i].text = aYears[i];
        if(aYears[i] == selYear)
            {
            dObj.m_oYear.options[i].selected = true;
            }
        }
    }

function PopulateMonths(arrIn, selMonth, dObj)
    {
    dObj.m_oMonth.options.length = 0;

    for(var i = 0; i < arrIn.length; i++)
        {
        dObj.m_oMonth.options.length += 1;
        dObj.m_oMonth.options[i].value = (i+1);
        dObj.m_oMonth.options[i].text = aMonths[i];
        if(i == selMonth - 1)
            {
            dObj.m_oMonth.options[i].selected = true;
            }
        }
    }

function PopulateDays(nSelDay, dObj)
    {
    var nMonth;
    var nDays;

    if( dObj == null )
        {
        dObj = this.parent;
        }

    nMonth = dObj.m_oMonth.selectedIndex;
    nDays  = aDays[nMonth];

    if(nSelDay == null)
        {
        nSelDay = dObj.m_nSelDay;

        /* if selected day is larger then number of days */
        /* in new months the set it to the last day of the month */
        if(nSelDay > nDays)
            {
            nSelDay = nDays;
            dObj.m_nSelDay = nSelDay;
            }
        }

    dObj.m_oDay.options.length = 0;

    /* check to see if we are dealing with febuary */
    if(nMonth == 1)
        {
        /*  
        *   if the year divided by 4 does not contain a 
        *   decimal place then it is a leapyear 
        */
        if( IsLeapYear(dObj.m_oYear.options[dObj.m_oYear.selectedIndex].value) )
            {
            nDays = aDays[nMonth] + 1;
            }
        }

    /* loop through the days for each month */
    for(var i = 1; i < nDays + 1; i++)
        {
        dObj.m_oDay.options.length += 1;
        dObj.m_oDay.options[i-1].value = i;
        dObj.m_oDay.options[i-1].text = i;
        if(i == nSelDay)
            {
            dObj.m_oDay.options[i-1].selected = true;
            }
        }

    CompDate(dObj);
    }


function GetDateObj	(oDate)
    {
    var  nDay;
    var  nYear;
    var  nMonth;
    var  oRet;

    nDay   = oDate.m_oDay.selectedIndex + 1;
    nMonth = oDate.m_oMonth.selectedIndex + 1;
    nYear  = oDate.m_oYear.selectedIndex;
    nYear  = aYears[nYear];

    oRet = new Date(nYear, nMonth-1, nDay, 0, 0, 0, 0);

    return oRet;
    }


function SyncDates  (oBase, oEnd)
    {
    var  fSync = false;
    var  oDateBase;
    var  oDateEnd;
    var  nYear;
    var  nDay;
    var  nMonth;
    var  nTime;

    if (!oEnd.m_fRendering)
        {
        oDateBase = GetDateObj(oBase);

	    if (oDateBase < goDateStart)
            {
            oDateBase = goDateStart;
		    nYear  = oDateBase.getFullYear();
            nDay   = oDateBase.getDate();
            nMonth = oDateBase.getMonth()+1;

            RenderDate(nYear, nMonth, nDay, oBase);
            }

        oDateEnd  = GetDateObj(oEnd);

        if (oDateBase < oDateEnd)
            {
            /* ok */
            }
        else
            {
            fSync  = true;
		
		    AddDays(oDateBase, 1);
		    
		    nYear  = oDateBase.getFullYear();
            nDay   = oDateBase.getDate();
            nMonth = oDateBase.getMonth()+1;
            }
     
        if (fSync)
            {
            RenderDate(nYear, nMonth, nDay, oEnd);
            }
			
        delete oDateBase;
        delete oDateEnd;
        }
    }




/* Test dates against each other */
function CompDate   (oDate)
    {
    var  oBase;
    var  oEnd;
    var  nDay;
    var  nYear;
    var  nMonth;

    if ( oDate.m_oBaseDate == null )
        {
        // No base Date, must be first
        oEnd = oDate.m_oEndDate;
        if (oEnd)
            {
            oBase = oDate;
            SyncDates(oBase, oEnd);
            }
        }
    else
        {
        oBase = oDate.m_oBaseDate;
        if (oBase)
            {
            oEnd  = oDate;
            SyncDates(oBase, oEnd);
            }
        }
    }


/* update the currently selected day */
function UpdateSelDay(x)
    {
    var oDate = this.parent;

    oDate.m_nSelDay = oDate.m_oDay.selectedIndex + 1;

    CompDate(oDate);
    }




