By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,635 Members | 2,060 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,635 IT Pros & Developers. It's quick & easy.

Need help with a link

P: n/a
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',d ocument.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 ?
Jul 20 '05 #1
Share this Question
Share on Google+
8 Replies


P: n/a
> 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.va lue);\">"+
"<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.ca l.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.ca l.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()));
}

--------------------------------------------------------------------------------
Jul 20 '05 #2

P: n/a
JRS: In article <5b**************************@posting.google.com >, seen
in news:comp.lang.javascript, ti**********@hotmail.com posted at Tue, 2
Sep 2003 01:04:17 :-
var dt_next_month = new Date(dt_datetime);
dt_next_month.setMonth(dt_datetime.getMonth()+1);


If dt_datetime is new Date(2003, 7, 31), Aug 31, then dt_next_month will
become October 1st.

And, of course, according to Fred Hoyle, "October the First is Too Late"
(a book title).

If, in incrementing/decrementing the Month, the Date needs to be set to
1<=D<=28, then do the latter first.

--
John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 MIME.
Web <URL:http://www.merlyn.demon.co.uk/> - w. FAQish topics, links, acronyms
PAS EXE etc : <URL:http://www.merlyn.demon.co.uk/programs/> - see 00index.htm
Dates - miscdate.htm moredate.htm js-dates.htm pas-time.htm critdate.htm etc.
Jul 20 '05 #3

P: n/a
Dr John Stockton <sp**@merlyn.demon.co.uk> writes:
If, in incrementing/decrementing the Month, the Date needs to be set to
1<=D<=28, then do the latter first.


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
--
Lasse Reichstein Nielsen - lr*@hotpop.com
Art D'HTML: <URL:http://www.infimum.dk/HTML/randomArtSplit.html>
'Faith without judgement merely degrades the spirit divine.'
Jul 20 '05 #4

P: n/a
Lasse Reichstein Nielsen <lr*@hotpop.com> wrote in message news:<ek**********@hotpop.com>...
Dr John Stockton <sp**@merlyn.demon.co.uk> writes:
If, in incrementing/decrementing the Month, the Date needs to be set to
1<=D<=28, then do the latter first.


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
Jul 20 '05 #5

P: n/a
ti**********@hotmail.com wrote:
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 :


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 <gw*****@agricoreunited.com>

* Client-side Javascript and Netscape 4 DOM Reference available at:
* http://devedge.netscape.com/library/...ce/frames.html
* Internet Explorer DOM Reference available at:
* http://msdn.microsoft.com/workshop/a...ence_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-deve...upgrade_2.html
Jul 20 '05 #6

P: n/a
JRS: In article <ek**********@hotpop.com>, seen in
news:comp.lang.javascript, Lasse Reichstein Nielsen <lr*@hotpop.com>
posted at Wed, 3 Sep 2003 01:10:38 :-
Dr John Stockton <sp**@merlyn.demon.co.uk> writes:
If, in incrementing/decrementing the Month, the Date needs to be set to
1<=D<=28, then do the latter first.
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>.

--
John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 IE 4
<URL:http://jibbering.com/faq/> Jim Ley's FAQ for news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> JS maths, dates, sources.
<URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/JS/&c., FAQ topics, links.
Jul 20 '05 #7

P: n/a
Dr John Stockton <sp**@merlyn.demon.co.uk> writes:
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
--
Lasse Reichstein Nielsen - lr*@hotpop.com
Art D'HTML: <URL:http://www.infimum.dk/HTML/randomArtSplit.html>
'Faith without judgement merely degrades the spirit divine.'
Jul 20 '05 #8

P: n/a
JRS: In article <r8**********@hotpop.com>, seen in
news:comp.lang.javascript, Lasse Reichstein Nielsen <lr*@hotpop.com>
posted at Wed, 3 Sep 2003 22:23:39 :-

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

--
John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 IE 4
<URL:http://jibbering.com/faq/> Jim Ley's FAQ for news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> JS maths, dates, sources.
<URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/JS/&c., FAQ topics, links.
Jul 20 '05 #9

This discussion thread is closed

Replies have been disabled for this discussion.