Need help with a link

T

timmy_dale12

I need help with this one. I have a function that pastes a row. In
each row i am pasting a link which is to call a date picker javascript
function. This is the code that pastes the link :

link = document.createElement('a');
link.href ="javascript:show_calendar('document.form1.date',document.form1.date.value);";
img = document.createElement('img');
img.setAttribute("src","H:Diverse\\cal.gif");

link.appendChild(img);

var td3 = document.createElement("TD")
td3.appendChild (input3)
td3.appendChild(link)

when i run this and press the link i get a error message that says :
document.form1.date.value is null or not an object. The function
show_calendar() has been tested in other contexts and works fine.

Can anybody solve this one ?
 
T

timmy_dale12

Not without knowing the structure of your page.

Okay here it comes.

This is the main script, ive put it in a html page to illustrate how
it works :

-------------------------------------------------------------------------------

<html>
<head>
<script type="text/javascript">
function addRow(id){

var index = document.form1.hidden.value;
var tbody = document.getElementById(id).getElementsByTagName("TBODY")[0];
var row = document.createElement("TR");
row.setAttribute("id","row" + index);


//Clone this node
var targetNode = document.getElementById('SELECT')
input1 = targetNode.cloneNode(true)
input1.setAttribute("name","select" +index)

input2 = document.createElement("input");
input2.setAttribute("name","a" +index)
input2.setAttribute("value","")
input2.setAttribute("type","text")
input2.setAttribute("readOnly","false")
input2.setAttribute("size","32")

input3 = document.createElement("input");
input3.setAttribute("name","x")
input3.setAttribute("value","")
input3.setAttribute("type","text")
input3.setAttribute("readOnly","false")
input3.setAttribute("size","8")
input3.setAttribute("maxlength","10")


link = document.createElement('a');
link.href="javascript:
show_calendar('document.form1.date',document.form1.date.value);"
img = document.createElement('img');
img.setAttribute("border","0");
img.setAttribute("height","16");
img.setAttribute("width","16");
img.setAttribute("src","H:Diverse\\cal.gif");
img.setAttribute("alt","Trykk her for å få opp kalender");

link.appendChild(img);

input4 = document.createElement("input");
input4.setAttribute("name","fra_dato")
input4.setAttribute("value","")
input4.setAttribute("type","text")
input4.setAttribute("readOnly","false")
input4.setAttribute("size","15")
input4.onclick = function(){ alert(input3.name) };

input5 = document.createElement("input");
input5.setAttribute("name","d" +index)
input5.setAttribute("value","")
input5.setAttribute("type","text")
input5.setAttribute("size","8")

var td1 = document.createElement("TD")
td1.appendChild(input1)

var td2 = document.createElement("TD")
td2.appendChild (input2)

var td3 = document.createElement("TD")
td3.appendChild (input3)
td3.appendChild(link)

var td4 = document.createElement("TD")
td4.appendChild (input4)

var td5 = document.createElement("TD")
td5.appendChild (input5)

row.appendChild(td1);
row.appendChild(td2);
row.appendChild(td3);
row.appendChild(td4);
row.appendChild(td5);
tbody.appendChild(row);

//increase index of hidden field
index++
document.form1.hidden.value=index
}
</script>
<script src="H:\Diverse\ts_picker.js"></script>
</head>

<body>
<form name="form1">
<input type="hidden" value="0" name="hidden">
<table id="myTable" cellspacing="0" border="1">
<tr>
<td>&nbsp;<select size="1" name="havnkode" id="select"> <option
value="02">Drop down</option><option value="00">Test1</option>
</td>
<td><input name="fra_dato" size="8" type="text" value=""
maxlength="10" readonly><a
href="javascript:show_calendar('document.form1.fra_dato');">
<img src="H:Diverse\cal.gif" width="16" height="16" border="0"
alt="Trykk her for å få opp kalender"></a></td>
<td>row1_column1</td>
</tr>
</table>
<input type="button" value="new row"
onClick="javascript:addRow('myTable')">
</body>
</form>
</html>

-------------------------------------------------------------------------------

This is the calendar function , ive saved it as ts_picker.js :

-------------------------------------------------------------------------------

function show_calendar(str_target, str_datetime) {

var arr_months = ["January", "February", "March", "April", "May",
"June",
"July", "August", "September", "October", "November", "December"];
var week_days = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
var n_weekstart = 1; // day week starts from (normally 0 or 1)

var dt_datetime = (str_datetime == null || str_datetime =="" ? new
Date() : str2dt(str_datetime));
var dt_prev_month = new Date(dt_datetime);
dt_prev_month.setMonth(dt_datetime.getMonth()-1);
var dt_next_month = new Date(dt_datetime);
dt_next_month.setMonth(dt_datetime.getMonth()+1);
var dt_firstday = new Date(dt_datetime);
dt_firstday.setDate(1);
dt_firstday.setDate(1-(7+dt_firstday.getDay()-n_weekstart)%7);
var dt_lastday = new Date(dt_next_month);
dt_lastday.setDate(0);

// html generation (feel free to tune it for your particular
application)
// print calendar header
var str_buffer = new String (
"<html>\n"+
"<head>\n"+
" <title>Kalender</title>\n"+
"</head>\n"+
"<body bgcolor=\"White\">\n"+
"<table class=\"clsOTable\" cellspacing=\"0\" border=\"0\"
width=\"100%\">\n"+
"<tr><td bgcolor=\"#4682B4\">\n"+
"<table cellspacing=\"1\" cellpadding=\"3\" border=\"0\"
width=\"100%\">\n"+
"<tr>\n <td bgcolor=\"#4682B4\"><a
href=\"javascript:window.opener.show_calendar('"+
str_target+"', '"+
dt2dtstr(dt_prev_month)+"'+document.cal.time.value);\">"+
"<img src=\"prev.gif\" width=\"16\" height=\"16\" border=\"0\""+
" alt=\"previous month\"></a></td>\n"+
" <td bgcolor=\"#4682B4\" colspan=\"5\">"+
"<font color=\"white\" face=\"tahoma, verdana\" size=\"2\">"
+arr_months[dt_datetime.getMonth()]+"
"+dt_datetime.getFullYear()+"</font></td>\n"+
" <td bgcolor=\"#4682B4\" align=\"right\"><a
href=\"javascript:window.opener.show_calendar('"
+str_target+"', '"+dt2dtstr(dt_next_month)+"'+document.cal.time.value);\">"+
"<img src=\"next.gif\" width=\"16\" height=\"16\" border=\"0\""+ "
alt=\"next month\"></a></td>\n</tr>\n"
);

var dt_current_day = new Date(dt_firstday);
// print weekdays titles
str_buffer += "<tr>\n";
for (var n=0; n<7; n++)
str_buffer += " <td bgcolor=\"#87CEFA\">"+
"<font color=\"white\" face=\"tahoma, verdana\" size=\"2\">"+
week_days[(n_weekstart+n)%7]+"</font></td>\n";
// print calendar table
str_buffer += "</tr>\n";
while (dt_current_day.getMonth() == dt_datetime.getMonth() ||
dt_current_day.getMonth() == dt_firstday.getMonth()) {
// print row heder
str_buffer += "<tr>\n";
for (var n_current_wday=0; n_current_wday<7; n_current_wday++) {
if (dt_current_day.getDate() == dt_datetime.getDate() &&
dt_current_day.getMonth() == dt_datetime.getMonth())
// print current date
str_buffer += " <td bgcolor=\"#FFB6C1\" align=\"right\">";
else if (dt_current_day.getDay() == 0 || dt_current_day.getDay()
== 6)
// weekend days
str_buffer += " <td bgcolor=\"#DBEAF5\" align=\"right\">";
else
// print working days of current month
str_buffer += " <td bgcolor=\"white\" align=\"right\">";

if (dt_current_day.getMonth() == dt_datetime.getMonth())
// print days of current month
str_buffer += "<a href=\"javascript:window.opener."+str_target+
".value='"+dt2dtstr(dt_current_day)+"'+document.cal.time.value;
window.close();\">"+
"<font color=\"black\" face=\"tahoma, verdana\" size=\"2\">";
else
// print days of other months
str_buffer += "<a href=\"javascript:window.opener."+str_target+
".value='"+dt2dtstr(dt_current_day)+"'+document.cal.time.value;
window.close();\">"+
"<font color=\"gray\" face=\"tahoma, verdana\" size=\"2\">";
str_buffer += dt_current_day.getDate()+"</font></a></td>\n";
dt_current_day.setDate(dt_current_day.getDate()+1);
}
// print row footer
str_buffer += "</tr>\n";
}
// print calendar footer
str_buffer +=
"<form name=\"cal\">\n<tr><td colspan=\"7\" bgcolor=\"#87CEFA\">"+
"<font color=\"White\" face=\"tahoma, verdana\" size=\"2\">"+
"<input type=\"hidden\" name=\"time\"
value=\""+dt2tmstr(dt_datetime)+
"\" size=\"8\" maxlength=\"8\"></font></td></tr>\n</form>\n" +
"</table>\n" +
"</tr>\n</td>\n</table>\n" +
"</body>\n" +
"</html>\n";

var vWinCal = window.open("", "Calendar",
"width=200,height=210,status=no,resizable=yes,top=200,left=350");
vWinCal.opener = self;
var calc_doc = vWinCal.document;
calc_doc.write (str_buffer);
calc_doc.close();
}

function str2dt (str_datetime) {
var re_date = /^(\d+)\.(\d+)\.(\d+)\s+(\d+)\:(\d+)\:(\d+)$/;
if (!re_date.exec(str_datetime))
return alert("Invalid Datetime format: "+ str_datetime);
return (new Date (RegExp.$3, RegExp.$2-1, RegExp.$1, RegExp.$4,
RegExp.$5, RegExp.$6));
}
function dt2dtstr (dt_datetime) {
return (new String (
dt_datetime.getDate()+"."+(dt_datetime.getMonth()+1)+"."+dt_datetime.getFullYear()+"
"));
}
function dt2tmstr (dt_datetime) {
return (new String ("\t\t"
+dt_datetime.getHours()+":"+dt_datetime.getMinutes()+":"+dt_datetime.getSeconds()));
}

--------------------------------------------------------------------------------
 
T

timmy_dale12

Lasse Reichstein Nielsen said:
Then you have to test for that, which requires knowing the lengths of
months. I believe the Date object knows those better than me. :)

You can set the month first, check if it worked, and if not, set the
date back.

// "date" is the date we want to add a month to

var mth = date.getMonth();
date.setMonth(mth+1);
if (date.getMonth() != mth+1) { //overflow
date.setDate(0); // day before 1st
}

With this code, the 28th through 31th of January this year are all
sent to the 28th of February.

/L


Well first i have to get this link to work for each pasted row. This
is my real problem. Has anyone got a solution to this ?

Tim
 
D

Dr John Stockton

JRS: In article <[email protected]>, seen in
news:comp.lang.javascript said:
Then you have to test for that, which requires knowing the lengths of
months. I believe the Date object knows those better than me. :)

I believe that you have misunderstood what I wrote.

To go from a random date to the 1st..28th of next month, one can always
go first to the 1st..28th of the current month, and incrementing the
month then cannot affect the date.

You can set the month first, check if it worked, and if not, set the
date back.

// "date" is the date we want to add a month to

var mth = date.getMonth();
date.setMonth(mth+1);
if (date.getMonth() != mth+1) { //overflow
date.setDate(0); // day before 1st
}

With this code, the 28th through 31th of January this year are all
sent to the 28th of February.

That is, of course, good for getting to the last of a month. Except at
the end of the year, when the != is false. One should check instead to
see whether the getDate() gives what it gave before or use (mth+1)%12.

<URL:http://www.merlyn.demon.co.uk/js-date1.htm#MC>
<URL:http://www.merlyn.demon.co.uk/js-date2.htm#incr>

IIRC, setDate(0) may fail to give the last of the previous month in
Macintosh Netscape 4 - does anyone know? See, using Mac NS4, the second
in Bug Tests under <URL:http://www.merlyn.demon.co.uk/js-dates.htm#SDT>.
 
G

Grant Wagner

Okay here it comes.

This is the main script, ive put it in a html page to illustrate how
it works :

In Internet Explorer NAMEd form elements are not part of the document.forms[].elements[] collection. This can be
demonstrated very simply with:

<body onload="createInput();alert(document.forms['myForm'].elements['abc'].value);">
<form name="myForm">
</form>
<script type="text/javascript">
function createInput() {
var input2 = document.createElement("input");
// input2.setAttribute("id", "abc");
input2.setAttribute("name","abc");
input2.setAttribute("value","");
input2.setAttribute("type","text");
input2.setAttribute("readOnly","false");
input2.setAttribute("size","32");

document.forms['myForm'].appendChild(input2);
}
</script>
</body>

If you uncomment "input2.setAttribute("id", "abc")" then you can access the form element via either
document.forms[].elements['abc'] or document.getElementById('abc') in IE 5.5+, Mozilla and Opera 7.

--
| Grant Wagner <[email protected]>

* Client-side Javascript and Netscape 4 DOM Reference available at:
* http://devedge.netscape.com/library/manuals/2000/javascript/1.3/reference/frames.html
* Internet Explorer DOM Reference available at:
* http://msdn.microsoft.com/workshop/author/dhtml/reference/dhtml_reference_entry.asp
* Netscape 6/7 DOM Reference available at:
* http://www.mozilla.org/docs/dom/domref/
* Tips for upgrading JavaScript for Netscape 7 / Mozilla
* http://www.mozilla.org/docs/web-developer/upgrade_2.html
 
L

Lasse Reichstein Nielsen

Dr John Stockton said:
I believe that you have misunderstood what I wrote.

It seems I did. What I was trying to hit, was the same date in the
next month, or the last day of the next month if that date doesn't
exist.
To go from a random date to the 1st..28th of next month, one can always
go first to the 1st..28th of the current month, and incrementing the
month then cannot affect the date.

That will work.

What makes Date objects so much fun is, that when changing it from
one arbitrary date to another, using setMonth and setDate, then there
is no order that always work.

date first mth first
Feb 2nd => Jan 31th Jan 3rd Jan 31th
Jan 31th => Feb 2nd Feb 2nd Mar 2nd

It is safest to set either date or month to a safe value (e.g., 1 for
day or 0 for month) and then set the desired month and date in any
order.
That is, of course, good for getting to the last of a month. Except at
the end of the year, when the != is false.

DOH! There is always something :)

/L
 
D

Dr John Stockton

JRS: In article <[email protected]>, seen in
news:comp.lang.javascript said:
It is safest to set either date or month to a safe value (e.g., 1 for
day or 0 for month) and then set the desired month and date in any
order.

FAQ readers should know that trick, indirectly. It is a pity that the
routines which set Y M & D cannot have, as those which set h m & s have,
additional parameters to set lesser fields. Or rather, on checking the
old NS JS documentation and ECMA, it is a pity that it is not better
known that they do. Requires JS 1.3, which probably everyone has by
now?

Watch out also for the non-existence, within the EU, of one hour of
civil time on the last Sunday of March, at 01:00 GMT (possibly UTC in
some countries).

// 'cannot' != 'can not' // for long > -30
 

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
474,083
Messages
2,570,591
Members
47,212
Latest member
RobynWiley

Latest Threads

Top