var objDivMain;
var objIframeShim;
var objTxtTarget;

/*
var calendar_strMonths = new Array('Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December');
var calendar_strDays = new Array('ma', 'di', 'wo', 'do', 'vr', 'za', 'zo');
*/

var calendar_divMonthYear;
var calendar_divDays;

var calendar_currentDay;
var calendar_currentMonth;
var calendar_currentYear;

/* These variables are for keeping the selected day in the calendar */
var calendar_currentSelectedMonth;
var calendar_currentSelectedYear;

function initDatePick()
{
	objDivMain = document.getElementById('DivMainDatePick');
	objIframeShim = document.getElementById('DivShimDatePick');
	calendar_divMonthYear = document.getElementById('divMonthYear');
	calendar_divDays = document.getElementById('divDays');
	document.onclick = hideDatePick;
}

function showDatePick(objTarget, evt, pintStartYear, pintEndYear)
{
	/*trick to cancel the event:
		"window.event.cancelBubble = true" works for IE
		"event.cancelBubble = true" works for Firefox
		but you will have to call the function with the "event":
			showDatePick('targetTextBox', event); */
	calendar_cancelEvent(evt);
	
	objTxtTarget = document.getElementById(objTarget);
	
	setCurrentSelectedDate();
	
	calendar_divMonthYear.innerHTML = getMonthYearHtml(pintStartYear, pintEndYear);	
	calendar_divDays.innerHTML = getDayHTML();	
	
	SetPosition();
	SetDivShim();
	
	objDivMain.style.visibility = 'visible';
	objIframeShim.style.visibility = 'visible';
}

function hideDatePick()
{
		if (objDivMain != null) {
			objDivMain.style.visibility = 'hidden';
		}
		if (objIframeShim != null) {
			objIframeShim.style.visibility = 'hidden';
		}
}

function setCurrentSelectedDate()
{
	if (objTxtTarget != null)
	{
		var d;
		var df = objTxtTarget.df;
		d = getDateFromString(objTxtTarget.value, df);
		
		if (isNaN(d) || d == null) {
			d = new Date();
		}
		
		calendar_currentDay = d.getDate() ;
		calendar_currentMonth = d.getMonth() ;
		calendar_currentYear = d.getFullYear() ;	
		
		calendar_currentSelectedMonth = calendar_currentMonth;
		calendar_currentSelectedYear = calendar_currentYear;
	}
}

// Set the position of the datepicker
function SetPosition()
{
   var intLeft = 0;
   var intTop  = 0;
   var tmpObj = objTxtTarget;

	 // telt 2 bij de top op (tussenrandje)
   intTop  += tmpObj.offsetHeight + 2;
	
	 // Doorloopt alle bovenliggende objecten om de totale absolute left en top
	 // te krijgen.
   while(tmpObj != null)
   {
      intLeft += tmpObj.offsetLeft;
      intTop  += tmpObj.offsetTop;
      tmpObj   = tmpObj.offsetParent;
   }
   
   // Als het iframe van het scherm afvalt aan de rechterkant naar links verplaatsen.
   if(document.body.clientWidth < (intLeft+objDivMain.clientWidth))
      intLeft = intLeft-objDivMain.clientWidth+(objTxtTarget.offsetWidth);
   // als het iframe van het scherm afvalt aan de onderkant naar boven verplaatsen.
   if(document.body.clientHeight < (intTop+objDivMain.clientHeight))
      intTop = intTop-objDivMain.clientHeight-(objTxtTarget.offsetHeight+4);
	
   objDivMain.style.left = intLeft + 'px';
   objDivMain.style.top  = intTop + 'px';
}

function SetDivShim()
{
		/* Main div must be block already else it doesn't work */
		objDivMain.style.display = 'block';
    objIframeShim.style.width = objDivMain.offsetWidth + 'px';
    objIframeShim.style.height = objDivMain.offsetHeight + 'px';
    objIframeShim.style.top = objDivMain.style.top;
    objIframeShim.style.left = objDivMain.style.left;
    objIframeShim.style.zIndex = objDivMain.style.zIndex - 1;
    objIframeShim.style.display = 'block';
}

// Functie om een datum te kiezen.
function ChooseDate(pintDay) {
    var df = objTxtTarget.df;
    
    if (df == null)    
    	objTxtTarget.value = pintDay + '-' + (calendar_currentMonth + 1) + '-' + calendar_currentYear;
    else
    {
        df = replaceDatePart("d",df,pintDay);
        df = replaceDatePart("m",df,calendar_currentMonth + 1);
        df = replaceYear(df,calendar_currentYear);
        objTxtTarget.value = df;
    }
    	
	hideDatePick();
}

function replaceDatePart(dp, df, value)
{
    var s = df.toLowerCase();
    var count = 0;
    var found = "";
    var t = "";
    
    var i = s.indexOf(dp);
    while(i >= 0)
    {
        found += dp;
        count++;
        i = s.indexOf(dp,i+1);
    }
    
    if (count == 1)
        t = value;
    else
        t = Pad(value,"0",count);

    s = s.replace(found,t);       
    return s;
    
}

function replaceYear(df, value)
{
    var dp = "y";
    var s = df.toLowerCase();
    var count = 0;
    var found = "";
    var t = "";
    
    var i = s.indexOf(dp);
    while(i >= 0)
    {
        found += dp;
        count++;
        i = s.indexOf(dp,i+1);
    }
    
    if (count <= 2)
        t = value.substr(1,2);
    else
        t = value;

    s = s.replace(found,t);       
    return s;
    
}

function Pad(sText, sPadChar, iLen)
{
	var sResult = "";
	var iStringLen;

	for (var i = 0; i < iLen; i++)
	{
		sResult += sPadChar;
	}	
	
	sResult += sText;
	
	iStringLen = sResult.length;
	
	return sResult.substr(iStringLen-iLen,iLen);
}

// Functie om de maand te kiezen.
function ChooseMonth(pintMonth, evt)
{	
	calendar_cancelEvent(evt);

	calendar_currentMonth = parseInt(pintMonth);
	calendar_divDays.innerHTML = getDayHTML();
}

// Functie om het jaar te kiezen.
function ChooseYear(pintYear, evt)
{
	calendar_cancelEvent(evt);

	calendar_currentYear = parseInt(pintYear);
	calendar_divDays.innerHTML = getDayHTML();
}

function getMonthYearHtml(startYear, endYear)
{
	var MonthHTML = '';
	
	MonthHTML += '<select class=\"ddlMonth\" onchange=\"ChooseMonth(this.value, event);\">';
	for(i = 0; i < 12; i++)
	{
		MonthHTML += '<option value=' + i;
		if( i == calendar_currentMonth)
		{ MonthHTML += ' selected';}
		MonthHTML += ' >';
		MonthHTML += calendar_strMonths[i];
		MonthHTML += '</option>';	
	}	
	MonthHTML += '</select><select class=\"ddlYear\" onchange=\"ChooseYear(this.value, event);\">';
	for(j = startYear; j < (endYear + 1); j++)
	{
		MonthHTML += '<option value=' + j;
		if( j == calendar_currentYear)
		{ MonthHTML += ' selected';}
		MonthHTML += ' >';
		MonthHTML += j;
		MonthHTML += '</option>';	
	}	
	MonthHTML += '</select>';

	return MonthHTML;
}

function getDayHTML()
{
	var dayHTML = '';
	dayHTML += '<table id=\"tbDays\" cellspacing=0 cellpadding=0 >'
	
	var d = new Date(calendar_currentYear,calendar_currentMonth ,1);
	if (d.getDay() == 0) {
		d.setDate( d.getDate() - 6);
	}
	else
	{
	 d.setDate( d.getDate() - (d.getDay() - 1) ); // geeft de eerste maandag van de calender aan.
	}
	
	
	var x = 7;
	var dteTmp = new Date(d.getFullYear(), d.getMonth(), d.getDate());
	dteTmp.setDate( dteTmp.getDate() + 35);
	
	for(i = 0; i < x; i++)
	{
		dayHTML += '<tr>';
		for(j = 0; j < 7; j++)
		{
			if (i==0)
			{
				dayHTML += '<td class=\"DaysHeader\">' + calendar_strDays[j] + '</td>';
			}
			else
			{
				dayHTML += '<td ';
				if (d.getMonth() == calendar_currentMonth)
				{
					if (d.getDate() == calendar_currentDay && d.getMonth() == calendar_currentSelectedMonth && d.getFullYear() == calendar_currentSelectedYear)
					{
					dayHTML += 'class=\"DaySelected\" onclick=\"ChooseDate(' + d.getDate() + ');\" ';
					dayHTML += 'onmouseover=\"this.className=\'DayHighlighted\'\" ';
					dayHTML += 'onmouseout=\"this.className=\'DaySelected\'\" ';
					}
					else
					{
					dayHTML += 'class=\"Day\" onclick=\"ChooseDate(' + d.getDate() + ');\" ';
					dayHTML += 'onmouseover=\"this.className=\'DayHighlighted\'\" ';
					dayHTML += 'onmouseout=\"this.className=\'Day\'\" ';
					}
				}
				else
				{
					dayHTML += 'class=\"DayOtherMonth\" ';
				}
				dayHTML += '>' + d.getDate() + '</td>';
				d.setDate(d.getDate() + 1);		
			}
		}
		dayHTML += '</tr>';	
	}
	dayHTML += '</table>';

	return dayHTML;
}

function calendar_cancelEvent(evt)
{
	var e = (window.event) ? window.event: evt;
	if (e){ e.cancelBubble = true;}
}

function isLeapYear( year ){
  // is it leap year ? returns a boolean
  return ( (0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))); 
  // ie, if the year divides by 4, but not by 100 except when it divides by
  // 400, it is leap year
}

/* This function turns an String expression to a date */
function getDateFromString(strDate,df) {
	var Day;
	var Month;
	var Year;
	var test;
	var reDate;
	var Valid  = false;
    df = df.toLowerCase();

	if ((strDate.length != 0) || (strDate != null))
	{
	
	    // base regular expression on date format
	    var d = df.indexOf("d");
        var m = df.indexOf("m");
        var y = df.indexOf("y");
        
        //d-m-y
        if (d < m && m < y)
            reDate = /^(\d{1,2})[-|/](\d{1,2})[-|/](\d{2,4})$/;
        
        //d-y-m
        if (d < m && y < m)
            reDate = /^(\d{1,2})[-|/](\d{2,4})[-|/](\d{1,2})$/;
        
        //m-d-y
        if (m < d && m < y)
            reDate = /^(\d{1,2})[-|/](\d{1,2})[-|/](\d{2,4})$/;
        
        //m-y-d
        if (m < y && y < d)
            reDate = /^(\d{1,2})[-|/](\d{2,4})[-|/](\d{1,2})$/;
        
        //y-d-m
        if (y < d && d < m)
            reDate = /^(\d{2,4})[-|/](\d{1,2})[-|/](\d{1,2})$/;
        
        //y-m-d
        if (y < m && m < d)
            reDate = /^(\d{2,4})[-|/](\d{1,2})[-|/](\d{2,4})$/;

		Valid = (reDate.test(strDate));
		if (Valid)
		{
		
			var v1 = Number(RegExp.$1);
			var v2 = Number(RegExp.$2);
			var v3 = Number(RegExp.$3);
		
		
            //d-m-y
            if (d < m && m < y)
            {
                Day = v1; Month = v2; Year = v3;                
            }
            
            //d-y-m
            if (d < m && y < m)
            {
                Day = v1; Year = v2; Month = v3;
            }
            
            //m-d-y
            if (m < d && m < y)
            {
                Month = v1; Day = v2; Year = v3;
            }
            
            //m-y-d
            if (m < y && y < d)
            {
                Month = v1; Year = v2; Day = v3;
            }
            
            //y-d-m
            if (y < d && d < m)
            {
                Year = v1, Day = v2, Month=v3;
            }
            
            //y-m-d
            if (y < m && m < d)
                Year = v1, Month = v2, Day = v3;
		
		    // Month starts at 0
		    Month--;
		
			test = new Date(Year,Month,Day);
			
			if (!( (Year  == (test.getFullYear()<1000?test.getFullYear()+1900:test.getFullYear())) &&
				(Month == test.getMonth()) &&
				(Day   == test.getDate())))
				{
					return null;
				}
				return test;
		}
		else
		{
			return null;
		} 
	}
	return null;
}
