wcWidget = {};

wcWidget.inlineWidget = Class.create({
									 	initialize: function()
										{
											this.widgetNodes = null;	
										},
									 	getNodes: function()
										{
											return this.widgetNodes;	
										}
									 });

wcWidget.calendar = Class.create(wcWidget.inlineWidget,{
								 
								 	initialize: function($super,a_callback,a_allowPrev)
									{
										$super();
										this.DAYSPERMONTH = [31,28,31,30,31,30,31,31,30,31,30,31];
										this.LEAPDAYSPERMONTH = [31,29,31,30,31,30,31,31,30,31,30,31];
										this.MONTHS = ["January","February","March","April","May","June","July","August","September","October","November","December"];
										
										this.allowPrevious = (a_allowPrev)?true:false;
										this.callback = a_callback;
										this.createDate(0,2009);
										this.selected = null;
									},
									setSelected: function(a_date)
									{
										this.selected = a_date;
										
										this.createDate(a_date.getMonth(),a_date.getFullYear());
									},
									getSelected: function()
									{
										return this.selected;	
									},
									createDate: function(a_month,a_year)
									{
										var thisRef = this;
										var callbackRef = this.callback;
										var today = new Date();
										var year = a_year;
										var month = a_month;
										
										while(month>=12)
										{
											month = month-12;
											year++;
										}
										while(month < 0)
										{
											month = month + 12;
											year--;
										}
										var prevMonth = (month>0)?month-1:11;
										
										var isLeapYear = (((year%4==0)&&(year%100!=0))||(year%400==0));
										var prevNumberOfDays = (isLeapYear)?this.LEAPDAYSPERMONTH[prevMonth]:this.DAYSPERMONTH[prevMonth];
										var numberOfDays = (isLeapYear)?this.LEAPDAYSPERMONTH[month]:this.DAYSPERMONTH[month];
										var firstDayOfMonth = new Date(year,month,1).getDay();
										var dayNumber = 1;
										var prevMonthDayNumber = prevNumberOfDays - firstDayOfMonth+1;
										var nextMonthDayNumber = 1;
										
										var calendarHead = wcDOM.createFromObject({element:'thead', children:[
																						{element:'tr', children:[
																							{element:'th', children:[{element:'a', text:'<', attributes:{href:'#', onclick:function(){thisRef.createDate(month-1,year); return false;}}}]},
																							{element:'th', text:this.MONTHS[month] + ' ' + year, attributes:{colSpan:5}},
																							{element:'th', children:[{element:'a', text:'>', attributes:{href:'#', onclick:function(){thisRef.createDate(month+1,year); return false;}}}]}
																							]},
																						{element:'tr', children:[{element:'th', text:'S'},
																												 {element:'th', text:'M'},
																												 {element:'th', text:'T'},
																												 {element:'th', text:'W'},
																												 {element:'th', text:'T'},
																												 {element:'th', text:'F'},
																												 {element:'th', text:'S'},
																												 ]}
																						]});
										var calendarBody = wcDOM.createFromObject({element:'tbody'});
										var hasStarted = false;
										
										while(dayNumber <= numberOfDays)
										{
											var row = calendarBody.appendChild(wcDOM.createFromObject({element:'tr'}));

											for(var i=0; i<7; i++)
											{
												var isToday = (year==today.getFullYear() && month==today.getMonth() && dayNumber==today.getDate()); 
												var isSelected = (this.selected)?(year==this.selected.getFullYear() && month==this.selected.getMonth() && dayNumber==this.selected.getDate()):false;
												var isBeforeToday = false;
												
												if(year<today.getFullYear())isBeforeToday = true;
													else if(year==today.getFullYear() && month<today.getMonth())isBeforeToday = true;
														else if(year==today.getFullYear() && month==today.getMonth() && dayNumber<today.getDate())isBeforeToday = true;
												
												if(firstDayOfMonth==i)hasStarted = true;
												if(hasStarted && dayNumber<=numberOfDays)
												{	
													if(isSelected)
													{
														row.appendChild(wcDOM.createFromObject({element:'td', text:dayNumber, attributes:{className:'wcWidget_calendar_selected'}}));
													}
													else
													{
														if(!isToday)
														{
															if(!isBeforeToday||this.allowPrevious)row.appendChild(wcDOM.createFromObject({element:'td', attributes:{className:'wcWidget_calendar_onDay'}, children:[{element:'a', text:dayNumber, attributes:{href:'#', onclick:function(){var t = new Date(year,month,this.firstChild.nodeValue); thisRef.setSelected(t); callbackRef(t); return false;}}}]}));
																else row.appendChild(wcDOM.createFromObject({element:'td', text:dayNumber, attributes:{className:'wcWidget_calendar_onDay'}}));
														}
														else row.appendChild(wcDOM.createFromObject({element:'td', attributes:{className:'wcWidget_calendar_today'}, children:[{element:'a', text:dayNumber, attributes:{href:'#', onclick:function(){var t = new Date(year,month,this.firstChild.nodeValue); thisRef.setSelected(t); callbackRef(t); return false;}}}]}));
													}
													dayNumber++;
												}
												else 
												{
													if(!hasStarted)row.appendChild(wcDOM.createFromObject({element:'td', text:prevMonthDayNumber++, attributes:{className:'wcWidget_calendar_offDay'}}));
														else row.appendChild(wcDOM.createFromObject({element:'td', text:nextMonthDayNumber++, attributes:{className:'wcWidget_calendar_offDay'}}));
												}
											}
										
										}
										
										var table = wcDOM.createFromObject({element:'table', attributes:{className:'wcWidget_calendar'}, children:[{node:calendarHead},{node:calendarBody}]});
										if(this.widgetNodes && this.widgetNodes.parentNode)
										{
											this.widgetNodes.parentNode.replaceChild(table,this.widgetNodes);
										}
										
										this.widgetNodes = table;
									}
								 
								 });

wcWidget.tableLayout = Class.create(wcWidget.inlineWidget,{
									initialize: function($super, a_columns, a_attributes)
									{
										$super();

										this.currentRow = wcDOM.createFromObject({element:'tr'});;
										this.numberCol = (a_columns>0)?a_columns:1;
										this.currentCol = this.numberCol;
										
										this.fill = document.createTextNode('');
										this.tbody = wcDOM.createFromObject({element:'tbody'});
										this.widgetNodes = wcDOM.createFromObject((a_attributes)?{element:'table', attributes:a_attributes, children:[{node:this.tbody}]}:{element:'table', children:[{node:this.tbody}]});	
									},
									add: function(a_node)
									{	
										this.currentCol--;
										this.currentRow.appendChild(wcDOM.createFromObject({element:'td', children:[{node:a_node}]}));
									
										if(this.currentCol<=0)
										{
											this.currentCol = this.numberCol;
											this.tbody.appendChild(this.currentRow);
											this.currentRow = wcDOM.createFromObject({element:'tr'});
										}
									},
									setFill: function(a_node)
									{
										this.fill = a_node;
									},
									flush: function()
									{
										if(this.currentCol!=this.numberCol)
										{
											for(var i = this.currentCol; i>=0; i--)
											{
												this.add(this.fill.cloneNode(true));	
											}
										}
									}
									
									});