Can anyhelp me, what does this javascript calendar give error for dates before year 2000?

F

Fendi Baba

The function is called from opencalendar(targetfield). Thanks for any
hints on what could be the problem.


..............................................................




var decimalPointDelimiter = ".";
var defaultEmptyOK = false;

var dayA = new Array();
var monthA = new Array();
var yearA = new Array();
var targetfield;
monthA[0]="January";
monthA[1]="February";
monthA[2]="March";
monthA[3]="April";
monthA[4]="May";
monthA[5]="June";
monthA[6]="July";
monthA[7]="August";
monthA[8]="September";
monthA[9]="October";
monthA[10]="November";
monthA[11]="December";

for(var i=1;i<=31;i++)
{
dayA=i;
}

for(var i=0;i<10;i++)
{
yearA=gy(i);
}
function gm(num) {
var mydate = new Date();
mydate.setDate(1);
mydate.setMonth(num-1);
var datestr = "" + mydate;
return datestr.substring(4,7);
}

function gy(num) {
var mydate = new Date();
return (eval(mydate.getYear()) - 4 + num);
}

function ud(mon) {
var i = mon.selectedIndex;

if(mon.options.value == "2") {
document.forms[0].day.options[30] = null;
document.forms[0].day.options[29] = null;
var j = document.forms[0].year.selectedIndex;
var year = eval(document.forms[0].year.options[j].value);
if ( ((year%400)==0) || (((year%100)!=0) && ((year%4)==0)) ) {
if (document.forms[0].day.options[28] == null) {
document.forms[0].day.options[28] = new Option("29");
document.forms[0].day.options[28].value = "29";
}
} else {
document.forms[0].day.options[28] = null;
}

}

if(mon.options.value == "1" ||
mon.options.value == "3" ||
mon.options.value == "5" ||
mon.options.value == "7" ||
mon.options.value == "8" ||
mon.options.value == "10" ||
mon.options.value == "12")
{
if (document.forms[0].day.options[28] == null) {
document.forms[0].day.options[28] = new Option("29");
document.forms[0].day.options[28].value = "29";
}
if (document.forms[0].day.options[29] == null) {
document.forms[0].day.options[29] = new Option("30");
document.forms[0].day.options[29].value = "30";
}
if (document.forms[0].day.options[30] == null) {
document.forms[0].day.options[30] = new Option("31");
document.forms[0].day.options[30].value = "31";
}
}

if(mon.options.value == "4" ||
mon.options.value == "6" ||
mon.options.value == "9" ||
mon.options.value == "11")
{
if (document.forms[0].day.options[28] == null) {
document.forms[0].day.options[28] = new Option("29");
document.forms[0].day.options[28].value = "29";
}
if (document.forms[0].day.options[29] == null) {
document.forms[0].day.options[29] = new Option("30");
document.forms[0].day.options[29].value = "30";
}
document.forms[0].day.options[30] = null;
}

if (document.forms[0].day.selectedIndex == -1)
document.forms[0].day.selectedIndex = 0;

}


function showdate() {
var i = document.forms[0].month.selectedIndex;
var j = document.forms[0].day.selectedIndex;
var k = document.forms[0].year.selectedIndex;
alert(document.forms[0].day.options[j].value + "/" +
document.forms[0].month.options.value + "/" +
document.forms[0].year.options[k].value)
}


function opencalendar(temptargetfield) {
var field= eval("document.forms[0]." + temptargetfield);
targetfield = "opener.document.forms[0]." + temptargetfield +
".value";
var mydate;
if(field.value == "" || field.value.length < 10 || field.value.length
{
mydate = new Date();
}
else
{
var tempday = field.value.charAt(0).toString() +
field.value.charAt(1).toString();
var tempmonth = (parseInt((parsemonth(field.value.charAt(3).toString(),
field.value.charAt(4).toString())))-1).toString();
var tempyear = (parseInt(field.value.charAt(6).toString() +
field.value.charAt(7).toString() + field.value.charAt(8).toString() +
field.value.charAt(9).toString())).toString();
mydate = new Date(tempyear, tempmonth, tempday );
window.alert(mydate)
}
for(var i=0;i<=monthA.length;i++)
{
if (mydate.getMonth() == i)
{
month = i+1;
}
}
year = mydate.getYear();
//yearA[4].toString();

calwin = window.open("","calwin","resizable,status,height=250,width=210");
calccal(calwin,month,year,targetfield);
}
function parsemonth(tmpm1, tmpm2)
{
var m1;
var m2;
var m3;
if (tmpm1 == "0")
{
m1 = "";
}
else
{
m1 = "1";
}
m2 = tmpm2;
m3 = m1.toString() + m2.toString();
return m3;
}


function calccal(targetwin,month,year,targetfield) {
var monthname = new Array(12);
monthname[0] = "January";
monthname[1] = "February";
monthname[2] = "March";
monthname[3] = "April";
monthname[4] = "May";
monthname[5] = "June";
monthname[6] = "July";
monthname[7] = "August";
monthname[8] = "September";
monthname[9] = "October";
monthname[10] = "November";
monthname[11] = "December";

var endday = calclastday(eval(month),eval(year));

mystr = month + "/01/" + year;
mydate = new Date(mystr);
firstday = mydate.getDay();

var cnt = 0;

var day = new Array(6);
for (var i=0; i<6; i++)
day = new Array(7);

for (var r=0; r<6; r++)
{
for (var c=0; c<7; c++)
{
if ((cnt==0) && (c!=firstday))
continue;
cnt++;
day[r][c] = cnt;
if (cnt==endday)
break;
}
if (cnt==endday)
break;
}

targetwin.document.write("<TABLE><TR VALIGN=TOP><FORM>");

var prevyear = eval(year) - 1;
targetwin.document.write("<TD><INPUT TYPE=BUTTON NAME=prevyearbutton
VALUE='<<'"+
" onclick='document.close();opener.calccal(opener.calwin,"+month+","+prevyear+",\""+targetfield+"\")'></TD>");

var prevmonth = calcprevmonth(month);
var prevmonthyear = calcprevyear(month,year);
targetwin.document.write("<TD><INPUT TYPE=BUTTON
NAME=prevmonthbutton VALUE='&nbsp;<&nbsp;'"+
" onclick='document.close();opener.calccal(opener.calwin,"+prevmonth+","+prevmonthyear+",\""+targetfield+"\")'></TD>");

targetwin.document.write("<TD COLSPAN=3 ALIGN=CENTER>");
var index = eval(month) - 1;
targetwin.document.write("<B>" + monthname[index] + " " + year +
"</B></TD>");

var nextmonth = calcnextmonth(month);
var nextmonthyear = calcnextyear(month,year);
targetwin.document.write("<TD><INPUT TYPE=BUTTON
NAME=nextmonthbutton VALUE='&nbsp;>&nbsp;'"+
" onclick='document.close();opener.calccal(opener.calwin,"+nextmonth+","+nextmonthyear+",\""+targetfield+"\")'></TD>");

var nextyear = eval(year) + 1;
targetwin.document.write("<TD><INPUT TYPE=BUTTON NAME=nextyearbutton
VALUE='>>'"+
" onclick='document.close();opener.calccal(opener.calwin,"+month+","+nextyear+",\""+targetfield+"\")'></TD>");

targetwin.document.write("</TR><TR>");
targetwin.document.write("<TD>Su</TD>");
targetwin.document.write("<TD>Mo</TD>");
targetwin.document.write("<TD>Tu</TD>");
targetwin.document.write("<TD>We</TD>");
targetwin.document.write("<TD>Th</TD>");
targetwin.document.write("<TD>Fr</TD>");
targetwin.document.write("<TD>Sa</TD>");
targetwin.document.write("</TR>");

targetwin.document.write("<TR><TD COLSPAN=7><HR
NOSHADE></TD></TR>");

var selectedmonth = eval(month) - 1;
var today = new Date();
var thisyear = today.getYear();
var selectedyear = eval(year) - thisyear + 4;

var conditionalpadder = "";

for(r=0; r<6; r++)
{
targetwin.document.write("<TR>");
for(c=0; c<7; c++)
{
targetwin.document.write("<TD>");
if(day[r][c] != null) {
if (day[r][c] < 10)
conditionalpadder = "&nbsp;"
else
conditionalpadder = "";
targetwin.document.write("<INPUT TYPE=BUTTON NAME="+day[r][c]+
" VALUE=" + conditionalpadder + day[r][c] + conditionalpadder +
" onClick=\"window.close();"
+targetfield+"='"+(day[r][c]).toString()+ "/"+
(selectedmonth+1).toString() + "/" + yearA[selectedyear.toString()]
+"';\";>"); }
targetwin.document.write("</TD>");
}
targetwin.document.write("</TR>");
}
targetwin.document.write("</FORM></TABLE>");

}

function calclastday(month,year) {
if ((month==2) && ((year%4)==0))
return 29;

if ((month==2) && ((year%4)!=0))
return 28;

if ((month==1) || (month == 3) || (month == 5) || (month == 7) ||
(month==8) || (month == 10) || (month ==12))
return 31;

return 30;
}

function calcnextmonth(month) {
if (month=="12")
return "1";
else
return (eval(month)+1);
}

function calcnextyear(month,year) {
if (month=="12")
return (eval(year)+1);
else
return (year);
}

function calcprevmonth(month) {
if (month=="1")
return "12";
else
return (eval(month)-1);
}

function calcprevyear(month,year) {
if (month=="1")
return (eval(year)-1);
else
return (year);
}
 
E

Evertjan.

Fendi Baba wrote on 04 apr 2004 in comp.lang.javascript:
The function is called from opencalendar(targetfield). Thanks for any
hints on what could be the problem.

What error?
On what line?

Even better show us a working example URL.

btw: eval() is evil.
 
L

Lasse Reichstein Nielsen

(e-mail address removed) (Fendi Baba) writes:

Please don't make your post unreadable without the subject. The body
should be self contained.

[Can anyhelp me, what does this javascript calendar give error for
dates before year 2000?]
The function is called from opencalendar(targetfield). Thanks for any
hints on what could be the problem.

I have a pretty good idea, but the code is generally so lousy that I
would consider scrapping it and starting over. I am sure whatever it
is doing can be done shorter, smarter, and less error prone (taking
the numerous occurences of "eval" as a clear sign of an programmer
that doesn't know the language very well).


Anyway:
var yearA = new Array(); ....
for(var i=0;i<10;i++)
{
yearA=gy(i);
}


This fills an array with ten years.
function gy(num) {
var mydate = new Date();
return (eval(mydate.getYear()) - 4 + num);
}

For arguments between 0 and 9 (as it is called above), this function
returns values between 2000 and 2009 (generally, current year - 4 and
forward).
As a side note, the call to eval does nothing here, except transform
a number to a string and parse it as an expression to get the number
back ... huge overhead for nothing.

So, your table only contains years between 2000 and 2009. I guess you'll
get errors for dates after 2009 too.
function gm(num) {
var mydate = new Date();
mydate.setDate(1);
mydate.setMonth(num-1);
var datestr = "" + mydate;
return datestr.substring(4,7);

This line stood out as particulary fragile. You can not assume anything
about the format of the string representation of a date.
In my browser, the above function gives:
gm(4) == " 01"
That is the date set to 1, not the month.

Consider using another script. It'll be easier than patching up this one.

/L
 
D

Dr John Stockton

JRS: In article <[email protected]>, seen
The function is called from opencalendar(targetfield). Thanks for any
hints on what could be the problem.

Pretty well all of it needs rewrite, to be correct and efficient.

Do not let your news system wrap code that you post; it is your duty to
ensure that posted code is runnable code.

If you *must* define a table of months, do it ONCE, globally; and,
rather than
var monthA = new Array();
monthA[0]="January";
monthA[1]="February"; ...
use
var monthA = ["January", "February", ... ]

If the data is well enough controlled to use parseInt with only one
parameter, you should be able to use unary + instead.

In one place, you have the full Gregorian leap year rule; in another,
you use the Julian.

function calclastday(month,year) {
if (month==2) return 28 + (year%4)==0) // 1901-2099
return [,31,0,31,30,31,30, 31,31,30,31,30,31][month] }

beats what you have; but using a Date Object is more direct.

Typing could be saved by

var df0 = document.forms[0]

and using that thereafter; and likewise elsewhere.


Read the newsgroup FAQ; see below.
 
F

Fendi Baba

Lasse

You're right. The problem with this code is the fact that it returns
year as undefined if the year is before 2000. You're probably right
that it could return error beyond 2009 as well.

This wasn't my code and I didn't realise this until a user pointed out
the problem.

I saw a few other javascript calendar and it was neat but I'm not need
to get his fixed by tomorrow.





Lasse Reichstein Nielsen said:
(e-mail address removed) (Fendi Baba) writes:

Please don't make your post unreadable without the subject. The body
should be self contained.

[Can anyhelp me, what does this javascript calendar give error for
dates before year 2000?]
The function is called from opencalendar(targetfield). Thanks for any
hints on what could be the problem.

I have a pretty good idea, but the code is generally so lousy that I
would consider scrapping it and starting over. I am sure whatever it
is doing can be done shorter, smarter, and less error prone (taking
the numerous occurences of "eval" as a clear sign of an programmer
that doesn't know the language very well).


Anyway:
var yearA = new Array(); ...
for(var i=0;i<10;i++)
{
yearA=gy(i);
}


This fills an array with ten years.
function gy(num) {
var mydate = new Date();
return (eval(mydate.getYear()) - 4 + num);
}

For arguments between 0 and 9 (as it is called above), this function
returns values between 2000 and 2009 (generally, current year - 4 and
forward).
As a side note, the call to eval does nothing here, except transform
a number to a string and parse it as an expression to get the number
back ... huge overhead for nothing.

So, your table only contains years between 2000 and 2009. I guess you'll
get errors for dates after 2009 too.
function gm(num) {
var mydate = new Date();
mydate.setDate(1);
mydate.setMonth(num-1);
var datestr = "" + mydate;
return datestr.substring(4,7);

This line stood out as particulary fragile. You can not assume anything
about the format of the string representation of a date.
In my browser, the above function gives:
gm(4) == " 01"
That is the date set to 1, not the month.

Consider using another script. It'll be easier than patching up this one.

/L
 
F

Fendi Baba

Lasse, Evertjan

Thank you for responding.

In particular Lasse's note has been pretty helpful. I recognise the
fact that the code left a lot to be desired. As I need to get it
working by tomorrow, I hv decided to stick with it first.

For the moment, I have increased the year array to 105 value thus
allowing the year to move back and forth 50 years. Tested and it
worked fine. I'll look through Lasse comment about the string format
and will try to rework this entire code. As it wasn''t something I
wrote initial, I am thankful that you've help me sort of figure out
some of the logics.

Thanks


Lasse Reichstein Nielsen said:
(e-mail address removed) (Fendi Baba) writes:

Please don't make your post unreadable without the subject. The body
should be self contained.

[Can anyhelp me, what does this javascript calendar give error for
dates before year 2000?]
The function is called from opencalendar(targetfield). Thanks for any
hints on what could be the problem.

I have a pretty good idea, but the code is generally so lousy that I
would consider scrapping it and starting over. I am sure whatever it
is doing can be done shorter, smarter, and less error prone (taking
the numerous occurences of "eval" as a clear sign of an programmer
that doesn't know the language very well).


Anyway:
var yearA = new Array(); ...
for(var i=0;i<10;i++)
{
yearA=gy(i);
}


This fills an array with ten years.
function gy(num) {
var mydate = new Date();
return (eval(mydate.getYear()) - 4 + num);
}

For arguments between 0 and 9 (as it is called above), this function
returns values between 2000 and 2009 (generally, current year - 4 and
forward).
As a side note, the call to eval does nothing here, except transform
a number to a string and parse it as an expression to get the number
back ... huge overhead for nothing.

So, your table only contains years between 2000 and 2009. I guess you'll
get errors for dates after 2009 too.
function gm(num) {
var mydate = new Date();
mydate.setDate(1);
mydate.setMonth(num-1);
var datestr = "" + mydate;
return datestr.substring(4,7);

This line stood out as particulary fragile. You can not assume anything
about the format of the string representation of a date.
In my browser, the above function gives:
gm(4) == " 01"
That is the date set to 1, not the month.

Consider using another script. It'll be easier than patching up this one.

/L
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,566
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top