ActiveWidgets custom-Calendar ... Experiment-3......
This sample demostrates that a grid can be used for anything your imagination invent. Sometimes takes more time, but...that's the AW real Magic.
It is not even in Alpha version, and is just a simple Date-picker, but is ready for developing a popup/Validation/movable/closable and even date-conversion authentic Calendar.
It is not even in Alpha version, and is just a simple Date-picker, but is ready for developing a popup/Validation/movable/closable and even date-conversion authentic Calendar.
<html>
<head>
<script src="../../runtime/lib/aw.js"></script>
<link href="../../runtime/styles/xp/aw.css" rel="stylesheet"></link>
</head>
<body>
<script>
//************************************************//
////// CUSTOM --grid.subclass-- CALENDAR
//************************************************//
var AWCalendar=AW.UI.Grid.subclass();AWCalendar.create=function(){var obj=this.prototype;var monthArray=new Array(7);for (var f=0;f<7;f++){monthArray[f]=new Array();}monthArray[0]=["Su","M","Tu","W","Th","F","Sa"];var datemarker=false;var rowDay=0;var columnDay=0;var callastCol=-1;var callastRow=-1;obj.defineModel("_");obj.define_Property("typedDate",'');obj.define_Property("dateseparator",'');obj.define_Property("format",'');obj.define_Property("separator",'');obj.setStyle('background', '#f5f5e5');obj.define_Property("selectedDate",'');obj.define_Property("selectedvalueDate",'');obj.define_Property("dateorder",'');obj.define_Property("datemarker", false );obj.on_DatemarkerChanged=function(val){datemarker=val;};obj.on_FormatChanged=function(val){obj.set_Dateorder(val);};obj.on_SeparatorChanged=function(val){obj.set_Dateseparator(val)};var monthnames=new Array("January","February","March","April","May","June","July","August","September","October","November","December");var monthdays=[[31],[28],[31],[30],[31],[30],[31],[31],[30],[31],[30],[31]];var givenDate=new Array(4);;var displayDate=null;var todayDate=new Date() ;displayDate=todayDate;givenDate[0]=todayDate.getFullYear();givenDate[1]=todayDate.getDate();givenDate[2]=todayDate.getMonth();givenDate[3]='';var monthlastday;obj.makeMonth=function(TheDate, ArrName){var weekDay=TheDate.getDay();var monthNum=TheDate.getMonth();var monthDay=TheDate.getDate();var YearNum=TheDate.getFullYear();ArrName[0]=["Su","M","Tu","W","Th","F","Sa"];for (var f=1;f<7;f++){ArrName[f]=new Array();}var mydays=new Array();monthlastday=parseInt(monthdays[parseInt(monthNum)]);if ( monthNum == '1' && ((YearNum % 4 == 0) && !(YearNum % 100 == 0)) || monthNum == '1' && ((YearNum % 4 == 0) && (YearNum % 400 == 0)) ){monthlastday++;}var spaces=monthDay;while (spaces > 7) spaces-=7;spaces=weekDay - spaces + 1;if (spaces < 0) spaces+=7;var weekNum=1;for (var s=0;s<spaces;s++){ArrName[weekNum].push("");}var count=1;while (count <= monthlastday){for (var b=spaces;b<7;b++){if (count==monthDay ){rowDay=weekNum;columnDay=ArrName[weekNum].length;}if (count <= monthlastday){ArrName[weekNum].push(count)}if (count > monthlastday){ArrName[weekNum].push("")}if(ArrName[weekNum].length > 6){weekNum++}count++;}spaces=0;}if(ArrName[6].length == 0){ArrName[6]=["","","","","","",""]}return ArrName};
obj.makeDate=function(MyDate){MyDate[3]=' 01:00PM';MD_Time=MyDate[3];MD_M=parseInt(MyDate[2]);MD_D=parseInt(MyDate[1]);MD_Y=parseInt(MyDate[0]);MD_i4=MD_Time.indexOf(':');MD_H=parseInt(MD_Time.substring(0,MD_i4));MD_N=parseInt(MD_Time.substring(MD_i4+1));MD_S=0;if (MD_Time.toLowerCase().indexOf('pm') > -1) {if (MD_H != 12) {MD_H=MD_H*1+12;}}else {if (MD_H==12) {MD_H=0;}}DObj=new Date(MD_Y, MD_M, MD_D, MD_H, MD_N, MD_S);displayDate=DObj;this.makeMonth(DObj, monthArray)};function DateSeachMonth(Cmonth){for(var k=0;k<12;k++){if (monthnames[k]==Cmonth){return k;}}}; obj.on_TypedDateChanged=function(DateText) { var sep= DateText.split( this.get_Dateseparator() );if( this.get_Dateorder().substr(0, 1)=='y' || this.get_Dateorder().substr(0, 1)=='Y'){givenDate[0]=parseInt(sep[0]);};if( this.get_Dateorder().substr(2, 1)=='y' || this.get_Dateorder().substr(2, 1)=='Y' ){givenDate[0]=parseInt(sep[2]);};if( this.get_Dateorder().substr(0, 1)=='d' ){givenDate[1]=parseInt(sep[0]);};if( this.get_Dateorder().substr(1, 1)=='d' ){givenDate[1]=parseInt(sep[1]);};if( this.get_Dateorder().substr(2, 1)=='d' ){givenDate[1]=parseInt(sep[2]);};if( this.get_Dateorder().substr(0, 1)=='m' ){givenDate[2]=parseInt(sep[0]);};if( this.get_Dateorder().substr(1, 1) == 'm' ){ givenDate[2] = parseInt(sep[1]);};if( this.get_Dateorder().substr(2, 1) == 'm' ){ givenDate[2] = parseInt(sep[2]);};if( this.get_Dateorder().substr(0, 1) == 'M' ){ givenDate[2] = DateSeachMonth(sep[0]) };if( this.get_Dateorder().substr(1, 1) == 'M' ){ givenDate[2] = DateSeachMonth(sep[1]) };if( this.get_Dateorder().substr(2, 1) == 'M' ){ givenDate[2] = DateSeachMonth(sep[2]) }; this.makeDate(givenDate);DateLabel.setControlText( ' ' + displayDate.getFullYear() + ' ' + monthnames[displayDate.getMonth()] );this.getLayoutTemplate().refresh();if( datemarker == true ){ this.setSelectedRows([rowDay]);this.setSelectedColumns([columnDay] );} else{ this.setSelectedColumns([-1]);this.setSelectedRows([-1]);} };obj.isCurrentMonth = function(){ if(givenDate[0] == todayDate.getFullYear() && givenDate[2] == todayDate.getMonth() ){ this.setSelectedRows([rowDay]);this.setSelectedColumns([columnDay] );} else{ callastCol = -1;callastRow = -1;this.setSelectedColumns([callastCol]);this.setSelectedRows([callastRow]);} };obj.makeDate(givenDate);
obj.onCellClicked=function(event,col,row){if(col+row>-1&&!isNaN(this.getCellText(col,row))&&this.getCellText(col,row)!=''){callastCol=col;callastRow=row;var datesepa=obj.get_Dateseparator();var realmonth=(parseInt(givenDate[2])+1)<13 ? parseInt(givenDate[2])+1:'1';if(obj.get_Dateorder().substr(0,2)=='dm'){obj.set_SelectedDate(this.getCellText(col,row)+datesepa+realmonth+datesepa+givenDate[0]);}if(obj.get_Dateorder().substr(1,2)=='dm'){obj.set_SelectedDate(givenDate[0]+datesepa+this.getCellText(col,row)+datesepa+realmonth);}if(obj.get_Dateorder().substr(0,2)=='dM'){obj.set_SelectedDate(this.getCellText(col,row)+datesepa+monthnames[parseInt(givenDate[2])]+datesepa+givenDate[0]);}if(obj.get_Dateorder().substr(1,2)=='dM'){obj.set_SelectedDate(givenDate[0]+datesepa+this.getCellText(col,row)+datesepa+monthnames[parseInt(givenDate[2])])};if(obj.get_Dateorder().substr(0,2)=='md'){ obj.set_SelectedDate(realmonth+datesepa+this.getCellText(col,row)+datesepa+givenDate[0])};if(obj.get_Dateorder().substr(1,2)=='md'){obj.set_SelectedDate(givenDate[0]+datesepa+realmonth+datesepa+this.getCellText(col,row))};if(obj.get_Dateorder().substr(0,2)=='Md'){obj.set_SelectedDate(monthnames[parseInt(givenDate[2])]+datesepa+this.getCellText(col,row)+datesepa+givenDate[0])};if(obj.get_Dateorder().substr(1,2)=='Md'){obj.set_SelectedDate(givenDate[0]+datesepa+monthnames[parseInt(givenDate[2])]+datesepa+this.getCellText(col,row))};vardia0='0',mes0='0';if(realmonth<10){mes0+=''+(parseInt(givenDate[2])+1)}else{mes0=''+(parseInt(givenDate[2])+1)};if(this.getCellText(col,row)<'10'){dia0+=''+this.getCellText(col,row)}else{dia0=this.getCellText(col,row)};obj.set_SelectedvalueDate(givenDate[0]+datesepa+mes0+datesepa+dia0);}else{if(row<1||this.getCellText(col,row)==''){this.setSelectedRows([callastRow]);this.setSelectedColumns([callastCol]);}}};
obj.onControlClicked=function(){var col=this.getSelectedColumns();var row=this.getSelectedRows();if(col+row>-1&&!isNaN(this.getCellText(col,row))&&this.getCellText(col,row)!=''){}};
obj.setCellText(monthArray);obj.setHeaderText(["-Y","Y+"," ","-M","M+"," ","TD"]);obj.setColumnCount(monthArray[0].length);obj.setRowCount(7);obj.setSelectorVisible(false);obj.setControlSize(152,180);obj.setScrollBars("none");obj.onScrollBarsChanging=function(){return 1};obj.onScrollLeftChanging=function(){return 1};obj.onScrollTopChanging=function(){return 1};for(var co=0;co<obj.getColumnCount();co++){obj.getCellTemplate(co).setStyle('text-align','right');obj.getCellTemplate(co).setStyle('width',21);obj.getCellTemplate(co).setStyle('border-right','1pxsolid#ccc');obj.getHeaderTemplate(co).setStyle('width',21);obj.getSeparatorTemplate(co).setStyle('visibility','hidden');}
obj.getRowTemplate(0).setStyle('color','brown');for(var ro=0;ro<obj.getRowCount();ro++){obj.getRowTemplate(ro).setStyle('border-bottom','1pxsolid#ccc');};obj.setSelectedRows([-1]);obj.setSelectedRows([rowDay]);obj.setSelectedColumns([columnDay]);var DateLabel=new AW.UI.Label;DateLabel.setStyle('width',obj.getStyle('width'));DateLabel.setStyle('height',16);DateLabel.setStyle('font-weight','bold');DateLabel.setStyle('font-size','10pt');DateLabel.setControlText(' '+displayDate.getFullYear()+' '+monthnames[parseInt(displayDate.getMonth())]);var TopDiv=new AW.HTML.DIV;TopDiv.setStyle('width',obj.getStyle('width'));TopDiv.setStyle('height',obj.getStyle('height'));TopDiv.setStyle('background','lightyellow');TopDiv.setContent('html',DateLabel.toString());obj.defineTemplate("bottomLine",function(){return TopDiv.toString()});obj.setLayoutTemplate(new AW.Panels.Horizontal);obj.setPanelTemplate(function(i){switch(i){case 0:return this.getBottomLineTemplate();case 1:return this.getScrollTemplate();}});obj.setPanelHeight(17,0);var HeaderTtip=["PrevYear","NextYear"," ","PrevMonth","NextMonth"," ","ToDay"];obj.setHeaderTooltip(HeaderTtip);
obj.onHeaderClicked=function(event,index){if(index==0){if(givenDate[0]<'1901'){alert('previousyearsnotallowed')}else{givenDate[0]--;}}if(index==1){givenDate[0]++;}if(index==3){if(givenDate[2]=='0'){if(givenDate[0]<'1901'){alert('previousyearsnotallowed')}else{givenDate[2]='11';givenDate[0]--;}}else{givenDate[2]--;}}if(index==4){givenDate[2]++;if(givenDate[2]=='12'){givenDate[2]='0';givenDate[0]++;}}if(index==6){displayDate=todayDate;givenDate[0]=todayDate.getFullYear();givenDate[1]=todayDate.getDate();givenDate[2]=todayDate.getMonth();}this.makeDate(givenDate);DateLabel.setControlText(' '+displayDate.getFullYear()+' '+monthnames[displayDate.getMonth()]);this.getScrollTemplate().refresh();this.isCurrentMonth();return true;};obj.setScrollTop(0);};
var objCal = new AWCalendar;
objCal.setId("myGridCal");
objCal.set_Datemarker(true); //needed in alpha ver. (for future validation use)
/*
set_Format('par') usage:
please note 'y' or 'Y' can be used either, but for now both are a [4 digits] year.(number)
'd' is the daay in 1 or 2 digits (number)
'm' is the month in 1 or 2 digits (number)
`M' is the month in text format (beguining with Capital)
valid parameters combination are:
ymd -- 2007 - 11 - 30
ydm -- 2007 - 30 - 11
yMd -- 2007 - November - 30
ydM -- 2007 - 30 - November
mdy -- 11 - 30 - 2007
dmy -- 30 - 11 - 2007
Mdy -- November - 30 - 2007
dMy -- 30 - November - 2007
*/
objCal.set_Format('dmy');
objCal.set_Separator('/'); // any char()
objCal.onRowClicked = function(){
Inp.setControlText( this.get_SelectedDate() );
}
document.write(objCal);
document.write('<br/>');
var Inp = new AW.UI.Input;
Inp.setId('Inp_01');
Inp.setStyle('width', 120);
document.write(Inp);
</script>
</body>
</html>
Carlos
September 7,