function PopupCalendar( controlPrefix, date)
{
    this.SetDate = SetDate;
    this.PopulateMonthDropDown = PopulateMonthDropDown;
    this.PopulateYearDropDown = PopulateYearDropDown;
    this.PopulateDayColumnHeaders = PopulateDayColumnHeaders; 
    this.PopulateDayCells = PopulateDayCells;
    this.AddDisabledDates = AddDisabledDates;
    this.PopulateToday = PopulateToday;
    this.UpdateDays = UpdateDays;
    this.SelectDate = SelectDate;
    this.SetCurrentDate = SetCurrentDate;
    this.CloseCalendar = CloseCalendar; 
    
    this._controlPrefix = controlPrefix;
    this._disabledDatesExpression = '';
    this._weekStartDay = 0;
    this._dayHeaders = new Array("S","M","T","W","T","F","S"); 
    this._monthNames = new Array("January","February","March","April","May","June","July","August","September","October","November","December"); 

    this._selectedDate = parseDate(date);
    this._year =this._selectedDate.getFullYear();
    this._month = (this._selectedDate.getMonth() + 1);
    this._day = this._selectedDate.getDay();
            
    this._minYearDropDown = this._year;
    this._maxYearDropDown =  this._year + 3;   
}

function CloseCalendar()
{
    with(this)
    { 
    } 
}

function SetCurrentDate(currentDate)
{
    with(this)
    { 
        SetDate(currentDate);
        PopulateMonthDropDown('Month');
        PopulateYearDropDown('Year');
        PopulateDayColumnHeaders('DayColumnHeader');
        //AddDisabledDates(null, '16/12/2007');
        PopulateDayCells( 'Row', '_Col', '_DayValue');
        PopulateToday('TodayValue');                
    } 
}

function SelectDate(day, month, year)
{
    alert(day + '/' + month + '/' + year);
}


	

function SetDate(date)
{
    with(this)
    { 
        var selectedDate = parseDate(date, true); 
        _year = selectedDate.getFullYear();
        _month = (selectedDate.getMonth() + 1);
        _day = selectedDate.getDay();
    } 
 }

function AddDisabledDates(start, end) 
{
    with(this)
   { 
        _disabledDatesExpression = '';       	
    	if (start==null && end==null) { return; }
	    if (_disabledDatesExpression!="") { _disabledDatesExpression+= "||"; }
	    if (start!=null) { start = parseDate(start); start=""+start.getFullYear()+LZ(start.getMonth()+1)+LZ(start.getDate());}
	    if (end!=null) { end=parseDate(end); end=""+end.getFullYear()+LZ(end.getMonth()+1)+LZ(end.getDate());}
	    if (start==null) { _disabledDatesExpression+="(ds<="+end+")"; }
	    else if (end  ==null) { _disabledDatesExpression+="(ds>="+start+")"; }
	    else { _disabledDatesExpression+="(ds>="+start+"&&ds<="+end+")"; }	
    } 
}

function PopulateToday(todayControlName)
{
    with(this)
    { 
        var now = new Date(); 
        var todayDay = now.getDate();
        var todayMonth = now.getMonth()+1;
        var todayYear = now.getFullYear();  
        var todayControl = document.getElementById(_controlPrefix + "_" + todayControlName);            
        
		var current_weekday = now.getDay() - _weekStartDay;
        if (current_weekday < 0) 
        {
		    current_weekday += 7;
        }
		
	    if (_disabledDatesExpression!="") 
	    {
	        var ds=""+todayYear+LZ(todayMonth)+LZ(todayDay);
			eval("disabled=("+_disabledDatesExpression+")");
        }
        if( todayControl != null)
        { 
		    if (disabled) 		
    		{
	    	    todayControl.innerHTML = '<SPAN CLASS="cpTodayTextDisabled">Today</SPAN>\n';
            }
            else 
	    	{
		        todayControl.innerHTML = '<A CLASS="cpTodayText" HREF="javascript:' + _controlPrefix  + '.SelectDate( ' + todayDay + ', ' + todayMonth + ', ' + todayYear +');' + _controlPrefix + '.CloseCalendar();">Today</A>\n';
            }
        } 
    }
}

function PopulateDayCells( rowPrefix, colPrefix, suffix) 
{
    with(this)
    { 
        var daysinmonth= new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
		if ( ( (_year % 4 == 0)&&(_year % 100 != 0) ) || (_year % 400 == 0) ) 
		{
		    daysinmonth[2] = 29;
        }
                
        var current_month = new Date(_year, (_month-1), 1);
		var display_year = _year;
		var display_month = _month;
		var display_date = 1;
		var weekday= current_month.getDay();
		var disabledWeekDays = new Object();
		var offset = (weekday >= _weekStartDay) ? weekday-_weekStartDay : 7-_weekStartDay+weekday ;
		
		if (offset > 0) 
		{
			display_month--;
			if (display_month < 1) 
			{ 
			    display_month = 12; 
			    display_year--; 
            }
            
			display_date = daysinmonth[display_month]-offset+1;
		}
		
		var next_month = _month + 1;
		var next_month_year = _year;
		if (next_month > 12) 
		{ 
		    next_month=1; 
		    next_month_year++; 
        }
        
		var last_month = _month-1;
		var last_month_year = _year;
		if (last_month < 1) 
		{ 
		    last_month=12; 
		    last_month_year--; 
        }    
		
        for(var rows=1; rows<=6; rows++)
        {
            for(var cols=1; cols<=7; cols++)
            {
                var disabled=false;
                if (_disabledDatesExpression!="") 
				{
    			    var ds=""+display_year+LZ(display_month)+LZ(display_date);
					eval("disabled=("+_disabledDatesExpression+")");					
                }
            
                var dateClass = "";
				if ((display_month == _selectedDate.getMonth()+1) && (display_date==_selectedDate.getDate()) && (display_year==_selectedDate.getFullYear()))
				{
				    dateClass = "cpCurrentDate";
                }
				else if (display_month == _month) 
				{
				    dateClass = "cpCurrentMonthDate";
                }
				else 
				{
				    dateClass = "cpOtherMonthDate";
                }
                var control = document.getElementById(_controlPrefix + "_" + rowPrefix + rows + colPrefix + cols + suffix); 
                if(control != null)
                { 
                    if(disabled) 
                    {                     
                        control.innerHTML = "<DIV class=\'" + dateClass + "Disabled\'>" + display_date + "</DIV>";                   
                    } 
                    else 
                    {
                        control.innerHTML = "<a class=\'" + dateClass + "\' HREF=\'" +
                                                        "javascript:"+ _controlPrefix + ".SelectDate( " + display_date + ", " + display_month + ", " + display_year +");" + _controlPrefix + ".CloseCalendar();\'" +
                                                        ">" + display_date + "</a>";                   
                    } 
                }                     
				display_date++;
				if (display_date > daysinmonth[display_month]) {
					display_date=1;
					display_month++;
					}
				if (display_month > 12) {
					display_month=1;
					display_year++;
					}
                    
            } 
        }
    } 
}

function PopulateDayColumnHeaders(controlName)
{
    with(this)
    { 
        for (var j=0; j<7; j++) 
    	{
    	    var control = document.getElementById(_controlPrefix + "_" + controlName + (j + 1));     	    
    	    if( control != null)
	            control.innerHTML = _dayHeaders[(_weekStartDay+j)%7];
        }        
    }    
}

function PopulateMonthDropDown(monthSelectControlName)
{
    with(this) 
   { 
        var list = document.getElementById( _controlPrefix + "_" + monthSelectControlName); 
       
        if(list != null)
        { 
            list.length=0;
            for( var monthCounter=1; monthCounter<=12; monthCounter++ ) 
            {
                var newOpt = new Option(_monthNames[monthCounter-1], _monthNames[monthCounter-1]);
                var selLength = list.length;
                list.options[selLength] = newOpt;
                if(_month == monthCounter)  
                    list.selectedIndex = selLength; 
            } 
        }            
    }
}

function PopulateYearDropDown(yearSelectControlName)
{
    with(this) 
    { 
        var list = document.getElementById(_controlPrefix + "_" + yearSelectControlName); 

        if(list != null)
        { 
            list.length=0;
            for( var yearCounter=_minYearDropDown; yearCounter<=_maxYearDropDown; yearCounter++ ) 
            {
                var newOpt = new Option(yearCounter, yearCounter);
                var selLength = list.length;                                
                list.options[selLength] = newOpt;
                if(_year == yearCounter) 
                    list.selectedIndex = selLength;
            }
        } 
    } 
 }

function UpdateDays()
{
    with(this)
    { 
        var monthList = document.getElementById(_controlPrefix + "_Month");
        var yearList = document.getElementById(_controlPrefix + "_Year"); 
        if((monthList != null) && (yearList != null))
        { 
            SetDate('01/' + CalendarPadValue(monthList.selectedIndex + 1) + '/' + yearList.value);
            PopulateDayCells( 'Row', '_Col', '_DayValue');
        } 
    } 
    
}

function CalendarPadValue(value)
{
    var newValue = '0' + value;
    return newValue.substr(newValue.length - 2);
}

