Solved

Help with nodes

Posted on 2012-03-24
6
479 Views
Last Modified: 2012-03-25
I am trying to find away to add items from an array to a table, then to add new item to the array and add those as well.  On this project, the contributor and total boxes do what they are supposed to, but entries are not added to the contributor list.  I assume the problem is with my addRow() function, but I can't pinpoint it.  The program contains three files; clist.htm, newdata2.js (functions), and data.js(arrays):

html>
<head>

   Filename:         clist.htm
   Supporting files: data.js, lhouse.css, logo.jpg, newdata2.js

-->
<title>The Lighthouse</title>
<link href="lhouse.css" rel="stylesheet" type="text/css" />

<script src="data.js" type="text/javascript"></script>
<script src="newdata2.js" type="text/javascript"></script>

</head>

<body onload = "makeTable()">
<form name="donations" id="donations" action="">
<div id="title">
   <img src="logo.jpg" alt="The Lighthouse" />
   The Lighthouse<br />
   543 Oak Street<br />
   Delphi, KY &nbsp;&nbsp;89011<br/>
   (542) 555-7511
</div>

<div id="data_entry">
   <table>
   <tr>
      <td>Contributors</td>
      <td id="totalContr"></td>
   </tr>
   <tr>
      <td>Total</td>
      <td id="totalAmt"></td>
   </tr>
   </table>

   <table>
   <tr><td colspan="2"><h3>Enter a New Contributor</h3></td></tr>
   <tr>
      <td>First Name</td><td><input name="fname" id="fname" /></td>
   </tr>
   <tr>
      <td>Last Name</td><td><input name="lname" id="lname" /></td>
   </tr>
   <tr>
      <td>Street</td><td><input name="street" id="street" /></td>
   </tr>
   <tr>
      <td>City</td><td><input name="city" id="city" /></td>
   </tr>
   <tr>
      <td>State</td>
      <td><select name="state" id="state">
      <option>AL</option><option>AK</option><option>AZ</option><option>AR</option>
      <option>CA</option><option>CO</option><option>CT</option><option>DE</option>
      <option>DC</option><option>FL</option><option>GA</option><option>HI</option>
      <option>ID</option><option>IL</option><option>IN</option><option>IA</option>
      <option>KS</option><option>KY</option><option>LA</option><option>ME</option>
      <option>MD</option><option>MA</option><option>MI</option><option>MN</option>
      <option>MS</option><option>MO</option><option>MT</option><option>NE</option>
      <option>NV</option><option>NH</option><option>NJ</option><option>NM</option>
      <option>NY</option><option>NC</option><option>ND</option><option>OH</option>
      <option>OK</option><option>OR</option><option>PA</option><option>RI</option>
      <option>SC</option><option>SD</option><option>TN</option><option>TX</option>
      <option>UT</option><option>VT</option><option>VA</option><option>WA</option>
      <option>WV</option><option>WI</option><option>WY</option>
      </select>
      </td>
   </tr>
   <tr>
      <td>Zip</td><td><input name="zip" id="zip" /></td>
   </tr>
   <tr>
      <td>Amount</td><td><input name="amount" id="amount" /></td>
   </tr>
   <tr>
      <td>Date</td><td><input name="date" id="date" /></td>
   </tr>
   <tr>
      <td colspan="2" id="buttoncell1">
         <input type="button" onclick="addRecord()" value="Add Contributor" />
      </td>
   </tr>
   </table>
</div>

<div id="report">
   <p><input value="Remove Checked Items" type="button" onclick="removeRecords()"/></p>

   <table id="ctable">
   <tr><th colspan="5">Contributor List</th>
   </tr>
   <tr id="titleRow">
      <th>Remove</th>
      <th>Date</th>
      <th>Name</th>
      <th>Address</th>
      <th>Amount</th>
   </tr><tr id="emptyRow"><td class="rc"><input type="checkbox" /></td><td></td><td></td><td></td><td class="ac"></td></tr>
   </table>
</div>

</form>

</body>
</html>

Open in new window


function updateTotals() {
	var totalContr = document.getElementById("totalContr");
	totalContr.innerHTML = amount.length;
	var totalContributions = 0;
	for (var i=0; i <amount.length; i++) {
	    totalContributions += parseInt(amount[i]);	
	}
	document.getElementById("totalAmt").innerHTML = totalContributions;
}


function makeTable() {
   	var headingRow = document.getElementById("titleRow");
	var blankRow = document.getElementById("emptyRow");
	dataRow = blankRow.cloneNode(true);
	for (i=0; i<amount.length; i++) {
	    addRow(i);	
	} 
	updateTotals();
}



function addRow(index) {
    var newRow = dataRow.cloneNode(true);
    newRow.childNodes[1].innerHTML = date[index];
    newRow.childNodes[2].innerHTML = lastName[index] + ", " + firstName[index];
    newRow.childNodes[3].innerHTML = street[index] + "<br>" + city[index] + ", " + state[index] + zip[index];
    newRow.childNodes[4].innerHTML = amount[index];
	if (index = 0) { 
		blankRow.parentNode.replaceChild(newRow, blankRow)
	 }
		if (index != 0) { 
		headingRow.parentNode.insertBefore(newRow, headingRow.nextSibling)
		}
}

function addRecord() {
	recordNum = amount.length; 
	firstName[recordNum] = document.getElementById("fname").value; 
	lastName[recordNum] = document.getElementById("lname").value;
	street[recordNum] = document.getElementById("street").value;
	city[recordNum] = document.getElementById("city").value;
	state[recordNum] = document.getElementById("state").value;
	zip[recordNum] = document.getElementById("zip").value;
	amount[recordNum] = document.getElementById("amount").value;	
	date[recordNum] = document.getElementById("date").value;
	addRow[recordNum];  
	updateTotals();
	
}

function removeRecord(index) {
	firstName.splice(index,1);
	lastName.splice(index,1);
	street.splice(index,1);
	city.splice(index,1);
	state.splice(index,1);
	zip.splice(index,1);
	amount.splice(index,1);
	date.splice(index,1);
}
 
function removeNode(node) {
	var prevNode = node.previousSibling;
	prevNode.parentNode.removeChild(prevNode);     
	return prevNode;
}
 
var headerRow;  
var recordNum;
function removeRecords() {
	document.getElementById("titleRow") = headerRow;
	recordNum = amount.length;
	for ( n = 0; n < headerRow.childNodes.length; n++) {
	recordNum = recordNum - 1;
	if (headerRow.childNodes[n].name = "TR") {
  	if (n.firstChild.firstChild != "") {
    removeRecord(recordNum);
	n = removeNode(n)};
	};
	updateTotals(); 
	}
}

Open in new window

/*

   Filename: data.js

   Variable List:

   firstName: Contains the first name of the contributors.
   lastName:  Contains the last name of the contributors.
   street:    Contains the contributor's street address
   city:      Contains the contributor's city of residence
   state:     Contains the contributor's state of residence
   zip:       Contains the contributor's zip code.
   amount:    Contains the amount of the contribution.
   date:      Contains the date of the contribution.

*/


firstName = new Array();
lastName = new Array();
street = new Array();
city = new Array();
state= new Array();
zip = new Array();
amount = new Array();
date = new Array()


firstName[0]="Steve";
lastName[0]="Bones";
street[0]="900 Lawton Street";
city[0]="Wheaton";
state[0]="KY";
zip[0]="89211";
amount[0]=50;
date[0]="2007-08-25";


firstName[1]="Jeri";
lastName[1]="White";
street[1]="Hawkes Lane";
city[1]="Delphi";
state[1]="KY";
zip[1]="89211";
amount[1]=150;
date[1]="2007-08-25";


firstName[2]="Tom";
lastName[2]="Thomas";
street[2]="Rigel Avenue";
city[2]="Drake";
state[2]="KY";
zip[2]="89411";
amount[2]=100;
date[2]="2007-08-27";


firstName[3]="Hugh";
lastName[3]="Warren";
street[3]="585 Lindon Court";
city[3]="Wheaton";
state[3]="KY";
zip[3]="88877";
amount[3]=50;
date[3]="2007-08-28";


firstName[4]="Lynwood";
lastName[4]="Ingersoll";
street[4]="723 Jackson Avenue";
city[4]="Delphi";
state[4]="KY";
zip[4]="88802";
amount[4]=500;
date[4]="2007-08-30";


firstName[5]="Petronila";
lastName[5]="Damico";
street[5]="44 Stewart Street";
city[5]="Drake";
state[5]="KY";
zip[5]="88604";
amount[5]=250;
date[5]="2007-08-30";


firstName[6]="Livia";
lastName[6]="Mckinnon";
street[6]="557 Ivy Avenue";
city[6]="Jasper";
state[6]="KY";
zip[6]="88960";
amount[6]=50;
date[6]="2007-08-31";


firstName[7]="Kris";
lastName[7]="Levesque";
street[7]="542 Upton Avenue";
city[7]="Delphi";
state[7]="KY";
zip[7]="88793";
amount[7]=100;
date[7]="2007-08-31";


firstName[8]="Basilia";
lastName[8]="Lu";
street[8]="851 Flad Court";
city[8]="Jasper";
state[8]="KY";
zip[8]="88633";
amount[8]=500;
date[8]="2007-09-02";


firstName[9]="Ginny";
lastName[9]="Rainey";
street[9]="657 Dawson Lane";
city[9]="Youngston";
state[9]="KY";
zip[9]="88873";
amount[9]=50;
date[9]="2007-09-03";

Open in new window

Any help is appreciated.
clist.htm
data.js
newdata2.js
0
Comment
Question by:Shakyjake1333
  • 3
  • 3
6 Comments
 

Author Comment

by:Shakyjake1333
ID: 37762978
Can anyone help please
0
 
LVL 7

Expert Comment

by:designatedinitializer
ID: 37763039
You've got some big flaws around there.
Gimme a couple of minutes and I'll clean up your code...
0
 
LVL 7

Expert Comment

by:designatedinitializer
ID: 37763098
There you go.
This is you newdata2.js file revised and working.
Check the comments within the code.
Fundamental points to keep in mind:
1--ALWAYS initialize your data
2--Be careful to declare global variables OUTSIDE the functions
3--Don't mix apples with oranges (for instance, an index is not a node)
4--Do check your syntax/semantics. Semantic errors are "silent" errors, like the one you have on line 28: addRow[index] , which is NOT the same as addRow(index), but it's valid syntax.

// Globals, define them all in one place, at the top
var headingRow;
var blankRow;
var dataRow;
var headerRow;  
var recordNum;

function updateTotals() {
	var totalContr = document.getElementById("totalContr");
	totalContr.innerHTML = amount.length;
	var totalContributions = 0;
	for (var i=0; i <amount.length; i++) {
		// Check that you don't add NaN to a number!
		// It will result in NaN as well...
		num = parseInt(amount[i]);
		totalContributions += (isNaN(num)?0:num);	
	}
	document.getElementById("totalAmt").innerHTML = totalContributions;
}

// This function should not mess with any other data
// It just serves the purpose of populating the table
// with the initial data
function makeTable() {
	for (i=0; i<amount.length; i++) {
	    addRow(i);	
	} 
	updateTotals();
}

// Tow different scenarios: either this is the first row,
// in which case we should UPDATE the values in blankRow,
// or not, in which case we appendChild
function addRow(index) {
    if(i==0){
    	blankRow = document.getElementById("emptyRow");
		blankRow.childNodes[1].innerHTML = date[index];
		blankRow.childNodes[2].innerHTML = lastName[index] + ", " + firstName[index];
		blankRow.childNodes[3].innerHTML = street[index] + "<br>" + city[index] + ", " + state[index] + zip[index];
		blankRow.childNodes[4].innerHTML = amount[index];   	
    }else{
		var tableBody = document.getElementById("ctable").tBodies[1];
		var newRow = tableBody.rows[1].cloneNode(true);
		newRow.childNodes[1].innerHTML = date[index];
		newRow.childNodes[2].innerHTML = lastName[index] + ", " + firstName[index];
		newRow.childNodes[3].innerHTML = street[index] + "<br>" + city[index] + ", " + state[index] + zip[index];
		newRow.childNodes[4].innerHTML = amount[index];
		tableBody.appendChild(newRow);
	}
}

function addRecord() {
	recordNum = amount.length; 
	firstName[recordNum] = document.getElementById("fname").value; 
	lastName[recordNum] = document.getElementById("lname").value;
	street[recordNum] = document.getElementById("street").value;
	city[recordNum] = document.getElementById("city").value;
	state[recordNum] = document.getElementById("state").value;
	zip[recordNum] = document.getElementById("zip").value;
	amount[recordNum] = document.getElementById("amount").value;	
	date[recordNum] = document.getElementById("date").value;
	addRow(recordNum);  // <-- You had a silent error here (a semantic error)
	updateTotals();
}

function removeRecord(index) {
	firstName.splice(index,1);
	lastName.splice(index,1);
	street.splice(index,1);
	city.splice(index,1);
	state.splice(index,1);
	zip.splice(index,1);
	amount.splice(index,1);
	date.splice(index,1);
}


// Around here you were also making some mistakes...
function removeNode(node) {
	node.parentNode.removeChild(node);     
}
 
function removeRecords() {
	var tableBody = document.getElementById("ctable").tBodies[1];
	for ( n = 1; n < tableBody.rows.length; n++) {
		if (tableBody.rows[n].name = "TR") {
			if (tableBody.rows[n].firstChild.firstChild.value != "") {
				removeRecord(n-1);
				removeNode(tableBody.rows[n]); // <-- You were confusing indexes with nodes
			};
		};
		updateTotals(); 
	}
}

Open in new window

0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:Shakyjake1333
ID: 37763287
Thank you for the help.
I entered your revisions, but all I get is a single entry in my contributor list, instead of the 8 from my data.js arrays.  Also it no longer updates my contributors or totals, and I still cannot add contributors to the list.

ANy suggestions?
0
 
LVL 7

Accepted Solution

by:
designatedinitializer earned 500 total points
ID: 37763364
I tested it before posting and it works just fine.
Maybe you missed something.
Here are the files.
clist.html
data.js
newdata2.js
0
 

Author Closing Comment

by:Shakyjake1333
ID: 37763414
Working perfect, thank you
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Having worked on larger scale sites, we found out that you are bound to look at more scalable solutions to integrating widgets, code snippets or complete applications and mesh them into functional sites, in any given composition. To share some of…
This article demonstrates how to create a simple responsive confirmation dialog with Ok and Cancel buttons using HTML, CSS, jQuery and Promises
The viewer will learn the basics of jQuery, including how to invoke it on a web page. Reference your jQuery libraries: (CODE) Include your new external js/jQuery file: (CODE) Write your first lines of code to setup your site for jQuery.: (CODE)
The viewer will learn the basics of jQuery including how to code hide show and toggles. Reference your jQuery libraries: (CODE) Include your new external js/jQuery file: (CODE) Write your first lines of code to setup your site for jQuery…

919 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now