469,313 Members | 2,254 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,313 developers. It's quick & easy.

Dynamic table with dropdown and textboxes

Hi
I am using HTML and JS only.
When i click on Button(say Add) a new row will be added in to the table with dropdown's and textboxes.I want to know how to access the data entered in the textboxes and dropdowns
Please help me out as i am a beginner
Feb 18 '08 #1
20 3627
gits
5,390 Expert Mod 4TB
hi ...

please post the code you already have. basicly you may retrieve the values with:

Expand|Select|Wrap|Line Numbers
  1. // noderef is a reference to your node
  2. var val = noderef.value;
kind regards
Feb 18 '08 #2
hi ...

please post the code you already have. basicly you may retrieve the values with:

Expand|Select|Wrap|Line Numbers
  1. // noderef is a reference to your node
  2. var val = noderef.value;
kind regards
Hi ,
This is the code i m using

Expand|Select|Wrap|Line Numbers
  1. function addRowToTable()
  2. {
  3.   var tbl = document.getElementById('t1head');
  4.   var lastRow = tbl.rows.length;
  5.   // if there's no header row in the table, then iteration = lastRow + 1
  6.   var iteration = lastRow;
  7.   var row = tbl.insertRow(lastRow);
  8.  
  9.   // left cell
  10.   var cell1 = row.insertCell(0);
  11.   var textNode = document.createElement('input');
  12.   textNode.setAttribute('type','text','name','text'+iteration,'id','txt'+iteration);
  13.   cell1.appendChild(textNode);
  14.  
  15.   // right cell
  16.   var cell2 = row.insertCell(1);
  17.   var el = document.createElement('input');
  18.   el.type = 'text';
  19.   el.name = 'text' + (iteration+1);
  20.   el.id = 'txt' + (iteration+1);
  21.   cell2.appendChild(el);
  22.  
  23.   // select cell
  24.   var cell3 = row.insertCell(2);
  25.   var sel3 = document.createElement('select');
  26.   sel3.name = 'request_access';
  27.   sel3.id='RA'+iteration;
  28.   sel3.options[0] = new Option('Y', '0');
  29.   sel3.options[1] = new Option('N', '1');
  30.   cell3.appendChild(sel3);
  31. }
  32.  
How can i save the values typed in textbox and dropdowns.
Thanks & Rgeards
daitasri
Feb 19 '08 #3
gits
5,390 Expert Mod 4TB
when do you want to save them? on a specific action like a button-click or submit? you just posted the code to append a line but that only creates the nodes ... later on the user types in something and then you may save the data. do you need to save it in a database? explain the requirement a bit more detailed please.

kind regards
Feb 19 '08 #4
when do you want to save them? on a specific action like a button-click or submit? you just posted the code to append a line but that only creates the nodes ... later on the user types in something and then you may save the data. do you need to save it in a database? explain the requirement a bit more detailed please.

kind regards
Hi
The user types something in those textboxes and then clicks on "save" button then i need to save them into variables and also in database.I am using SQL Server as database.

Regards
Feb 19 '08 #5
gits
5,390 Expert Mod 4TB
you have some possibilities for that purpose:

1. submit the form and create a serverside save logic ... that would result in a page-reload ... which is the 'classical' way ...

2. use an XMLHttpRequest (AJAX-call) to send the request in the background and let the serverside code save the data to the database ... 'the modern up-to-date-way' ... that involves some clientside code in addition to the serverside one

kind regards
Feb 19 '08 #6
Can u please send some examples of how to access the textboxes and data entered in textbox? I m not using AJAX. I need to do in javascript only. Please help me on this.
Feb 19 '08 #7
I tried using textboxname.value also but it shows error. I named the textboxes as "text"+i where 'i' is getting incremented in a loop. I want to access the data entered in that textbox, using a javascript function and i want to store those values in some variables but not able to do.Request you to help on this.

Thanks
Feb 19 '08 #8
gits
5,390 Expert Mod 4TB
hi ...

assuming you have the following row:

[HTML]<table>
<tr>
<td><input type="text" value="test"/></td>
<td><input type="text" value="test1"/></td>
<td><input type="text" value="test2"/></td>
</tr>
</table>
[/HTML]
you may use something like the following simple function to retrieve the values of all the textboxes of that row:

Expand|Select|Wrap|Line Numbers
  1. function get_row_values(row) {
  2.     var record = {};
  3.     var fields = row.getElementsByTagName('input');
  4.  
  5.     for (var i = 0, node; node = fields[i]; i++) {
  6.         record['field' + i] = node.value;
  7.     }
  8.  
  9.     return record;
  10. }
  11.  
  12. var row = document.getElementsByTagName('tr')[0];
  13. var rec = get_row_values(row);
  14.  
  15. alert(rec.field0 + ' - ' + rec.field1 + ' - ' + rec.field2);
  16.  
that retrieves the values of all inputnodes found in a <tr>-element and stores it in an javascript object called 'record' ...

kind regards
Feb 19 '08 #9
Hi
Thanks for your help.I tried that but it shows as 'undefined'. I m sending u the whole code which i am using.Please tell me wat is wrong in that or how can i modify to achieve my requirement.

[HTML]<html>
<head>
<script language="javascript">
function createTable(id,ctr)
{
var tbody = document.getElementById(id).getElementsByTagName(" TBODY")[0];
var i;
for(i=1;i<=ctr;i++)
{
var row1=document.createElement('TR');

var row1td1=document.createElement('TD');
var row1td1_n=document.createElement('INPUT');
row1td1.appendChild(row1td1_n);
row1td1_n.setAttribute('TYPE','text');
// row1td1_n.setAttribute('ID','uid'+i);
row1td1_n.setAttribute('NAME','UID'+i);
row1td1_n.setAttribute('ID','UID'+i);



var row1td2=document.createElement('TD');
var row1td2_n=document.createElement('INPUT');
row1td2.appendChild(row1td2_n);
row1td2_n.setAttribute('TYPE','text');
row1td2_n.setAttribute('NAME','CID'+i);
row1td2_n.setAttribute('ID','CID'+i);


//row1td2.appendChild(document.createElement('INPUT' ));
//row1td2.setAttribute('TYPE','text','NAME','CN'+i);



var row1td3=document.createElement('TD');
var row1td3sel=document.createElement('select' );
row1td3sel.setAttribute('id','RA'+i,'NAME','reques t_access');
row1td3.appendChild(row1td3sel);

var subrow3_y=document.createElement('option');
subrow3_y.innerHTML='Y';
subrow3_y.value=1;

var subrow3_n=document.createElement('option');
subrow3_n.innerHTML='N';
subrow3_n.value=2;
row1td3sel.appendChild(subrow3_y);
row1td3sel.appendChild(subrow3_n);


var row1td4=document.createElement('TD');
var row1td4sel=document.createElement('select' );
row1td4sel.setAttribute('id','PA'+i,'NAME','prefer ence_access');
row1td4.appendChild(row1td4sel);

var subrow4_y=document.createElement('option');
subrow4_y.innerHTML='Y';
subrow4_y.value=1;

var subrow4_n=document.createElement('option');
subrow4_n.innerHTML='N';
subrow4_n.value=2;

row1td4sel.appendChild(subrow4_y);
row1td4sel.appendChild(subrow4_n);


var row1td5=document.createElement('TD');
var row1td5sel=document.createElement('select' );
row1td5sel.setAttribute('id','AA'+i,'NAME','activi ty_access');
row1td5.appendChild(row1td5sel);

var subrow5_y=document.createElement('option');
subrow5_y.innerHTML='Y';
subrow5_y.value=1;

var subrow5_n=document.createElement('option');
subrow5_n.innerHTML='N';
subrow5_n.value=2;

row1td5sel.appendChild(subrow5_y);
row1td5sel.appendChild(subrow5_n);

var row1td6=document.createElement('TD');
var row1td6sel=document.createElement('select' );
row1td6sel.setAttribute('id','UR'+i,'NAME','user_r ights');
row1td6.appendChild(row1td6sel);

var subrow6_y=document.createElement('option');
subrow6_y.innerHTML='Y';
subrow6_y.value=1;

var subrow6_n=document.createElement('option');
subrow6_n.innerHTML='N';
subrow6_n.value=2;

row1td6sel.appendChild(subrow6_y);
row1td6sel.appendChild(subrow6_n);

var row1td7=document.createElement('TD');
var row1td7btn=document.createElement('input');
row1td7btn.setAttribute('type','button','name','De l'+i);
row1td7btn.value='Delete';
row1td7btn.id='Del'+i;
row1td7btn.onclick=function remove(){ removeRowFromTable(row1td7btn.id);};
row1td7.appendChild(row1td7btn);



row1.appendChild(row1td1);
row1.appendChild(row1td2);
row1.appendChild(row1td3);
row1.appendChild(row1td4);
row1.appendChild(row1td5);
row1.appendChild(row1td6);
row1.appendChild(row1td7);


tbody.appendChild(row1);
}

}

function addRowToTable()
{
var tbl = document.getElementById('t1head');
var lastRow = tbl.rows.length;
// if there's no header row in the table, then iteration = lastRow + 1
var iteration = lastRow;
var row = tbl.insertRow(lastRow);

// left cell
var cell1 = row.insertCell(0);
var textNode = document.createElement('input');
textNode.setAttribute('type','text','name','text'+ iteration,'id','txt'+iteration);
cell1.appendChild(textNode);

// right cell
var cell2 = row.insertCell(1);
var el = document.createElement('input');
el.type = 'text';
el.name = 'text' + (iteration+1);
el.id = 'txt' + (iteration+1);
cell2.appendChild(el);

// select cell
var cell3 = row.insertCell(2);
var sel3 = document.createElement('select');
sel3.name = 'request_access';
sel3.id='RA'+iteration;
sel3.options[0] = new Option('Y', '0');
sel3.options[1] = new Option('N', '1');
cell3.appendChild(sel3);

// select cell
var cell4 = row.insertCell(3);
var sel4 = document.createElement('select');
sel4.name = 'preferences_access';
sel4.id='PA'+iteration;
sel4.options[0] = new Option('Y', '0');
sel4.options[1] = new Option('N', '1');
cell4.appendChild(sel4);

// select cell

var cell5 = row.insertCell(4);
var sel5 = document.createElement('select');
sel5.name = 'activity_access';
sel5.id='AA'+iteration;
sel5.options[0] = new Option('Y', '0');
sel5.options[1] = new Option('N', '1');
cell5.appendChild(sel5);

// select cell

var cell6 = row.insertCell(5);
var sel6 = document.createElement('select');
sel6.name = 'user_rights';
sel6.id='UR'+iteration;
sel6.options[0] = new Option('Y', '0');
sel6.options[1] = new Option('N', '1');
cell6.appendChild(sel6);

//button cell

var cell7 = row.insertCell(6);
var el = document.createElement('input');
el.type = 'button';
el.name = 'Del' + (iteration);
el.id = 'Del' + (iteration);
el.value='Delete';
el.onclick=function remove(){ removeRowFromTable(el.id);};
cell7.appendChild(el);

}

</script>
<body bgcolor="#fffcd0" onLoad=createTable('t1head',5)>
<form id=frm1 name=form1>
<table class="layout" border="4" align="center" width="100%" id=t1head>
<tr>
<td align="center"><b> USER ID </b></td>
<td align="center"><b> CLIENT </b></td>
<td align="center"><b> REQUEST_ACCESS </b></td>
<td align="center"><b> PREFERENCES_ACCESS</b></td>
<td align="center"><b> ACTIVITY_ACCESS </b></td>
<td align="center"><b> USER_RIGHTS </b></td>

</tr>

</table>
<table>
<tr><td></td></tr><tr><td></td></tr>
<tr><td></td></tr></tr><tr><td></td></tr>
</tr><tr><td></td></tr><tr><td></td></tr>
<tr><td></td></tr></tr><tr><td></td></tr>
</table>
<table class="layout" border="0" align="center" id=tabBtn>
<tr>
<td align="center" colspan="2">
<input type="button" value="ADD" name="add" onClick=addRowToTable()>
</td>

<td align="center" colspan="2">
<input type="button" value="SAVE" name="save" onClick=save1()>
</td>

<td align="center" colspan="2">
<input type="button" value="CANCEL" name="cancel" onClick="history.go(0)">
</td>
</tr>
</table>
</form>
</body>
</html>[/HTML]
Feb 19 '08 #10
gits
5,390 Expert Mod 4TB
put that to your script-section:

Expand|Select|Wrap|Line Numbers
  1. var data = [];
  2.  
  3. function save1() {
  4.     var table = document.getElementById('t1head');
  5.     var rows  = table.getElementsByTagName('tr');
  6.  
  7.     for (var i = 0, r; r = rows[i]; i++) {
  8.         data[i] = get_row_values(r);
  9.     }
  10. }
  11.  
  12. function get_row_values(row) {
  13.     var record = {};
  14.     var fields = row.getElementsByTagName('input');
  15.  
  16.     for (var i = 0, node; node = fields[i]; i++) {
  17.         record[node.name] = node.value;
  18.     }
  19.  
  20.     return record;
  21. }
  22.  
please fix the error in your onload where the js-statement has to be enclosed in quotes. the above code stores all row-data in an array called data ...

kind regards

PS: you have to adapt it for the select-nodes :)
Feb 19 '08 #11
vee10
141 100+
Hi ,

this may help ur problem
Expand|Select|Wrap|Line Numbers
  1. var tbl = document.getElementById('t1head');
  2. alert(tbl.rows.length);
  3. for(i=0;i<tbl.rows.length;i++)
  4. {
  5. for(j=0;j<tbl.rows[i].cells.length;j++)
  6. alert(tbl.rows[i].cells[j].childNodes[0].value);
  7. }
  8.  
  9.  
Hi
Thanks for your help.I tried that but it shows as 'undefined'. I m sending u the whole code which i am using.Please tell me wat is wrong in that or how can i modify to achieve my requirement.
Feb 19 '08 #12
put that to your script-section:

Expand|Select|Wrap|Line Numbers
  1. var data = [];
  2.  
  3. function save1() {
  4.     var table = document.getElementById('t1head');
  5.     var rows  = table.getElementsByTagName('tr');
  6.  
  7.     for (var i = 0, r; r = rows[i]; i++) {
  8.         data[i] = get_row_values(r);
  9.     }
  10. }
  11.  
  12. function get_row_values(row) {
  13.     var record = {};
  14.     var fields = row.getElementsByTagName('input');
  15.  
  16.     for (var i = 0, node; node = fields[i]; i++) {
  17.         record[node.name] = node.value;
  18.     }
  19.  
  20.     return record;
  21. }
  22.  
please fix the error in your onload where the js-statement has to be enclosed in quotes. the above code stores all row-data in an array called data ...

kind regards

PS: you have to adapt it for the select-nodes :)
Thank You very much .Its working fine. I am able to store all the values. :)
Feb 20 '08 #13
Hi ,

this may help ur problem
Expand|Select|Wrap|Line Numbers
  1. var tbl = document.getElementById('t1head');
  2. alert(tbl.rows.length);
  3. for(i=0;i<tbl.rows.length;i++)
  4. {
  5. for(j=0;j<tbl.rows[i].cells.length;j++)
  6. alert(tbl.rows[i].cells[j].childNodes[0].value);
  7. }
  8.  
  9.  
Thanks a lot. This is able to get all the values of both textboxes and dropdowns. And now i am able to store all the values .
Feb 20 '08 #14
Sriku
6
Hi
Thanks for your help.I tried that but it shows as 'undefined'. I m sending u the whole code which i am using.Please tell me wat is wrong in that or how can i modify to achieve my requirement.
Dosth i am not able to delete any row can u help me please?

am new to this scripts.
Mar 19 '08 #15
acoder
16,027 Expert Mod 8TB
Dosth i am not able to delete any row can u help me please?

am new to this scripts.
Post your code. Is this in any way related to the original question?
Mar 19 '08 #16
Sriku
6
my requirements is same as above(post ID 10, posted by "daitasri ") that's why i thought of pickup this code. but delete button is not working properly.

Thanks for reply
Srikanth
Mar 20 '08 #17
acoder
16,027 Expert Mod 8TB
There's no delete row code. Can I see your attempt at deleting a row.

To delete a row, use the deleteRow() method and pass the rowIndex of the row that you want to delete.
Mar 20 '08 #18
RamananKalirajan
607 512MB
my requirements is same as above(post ID 10, posted by "daitasri ") that's why i thought of pickup this code. but delete button is not working properly.

Thanks for reply
Srikanth
Hello Mr. Srikanth I think the following code will be useful for you. I had did some modification in the diatsri code, that matches your requirement. Keep in doing with your work. Any doubts means post me

[HTML]<html>
<head>
<script language="javascript">
function createTable(id,ctr)
{
var tbody = document.getElementById(id).getElementsByTagName(" TBODY")[0];
var i;
for(i=1;i<=ctr;i++)
{
var row1=document.createElement('TR');

var row1td1=document.createElement('TD');
var row1td1_n=document.createElement('INPUT');
row1td1.appendChild(row1td1_n);
row1td1_n.setAttribute('TYPE','text');
// row1td1_n.setAttribute('ID','uid'+i);
row1td1_n.setAttribute('NAME','UID'+i);
row1td1_n.setAttribute('ID','UID'+i);



var row1td2=document.createElement('TD');
var row1td2_n=document.createElement('INPUT');
row1td2.appendChild(row1td2_n);
row1td2_n.setAttribute('TYPE','text');
row1td2_n.setAttribute('NAME','CID'+i);
row1td2_n.setAttribute('ID','CID'+i);


//row1td2.appendChild(document.createElement('INPUT' ));
//row1td2.setAttribute('TYPE','text','NAME','CN'+i);



var row1td3=document.createElement('TD');
var row1td3sel=document.createElement('select' );
row1td3sel.setAttribute('id','RA'+i,'NAME','reques t_access');
row1td3.appendChild(row1td3sel);

var subrow3_y=document.createElement('option');
subrow3_y.innerHTML='Y';
subrow3_y.value=1;

var subrow3_n=document.createElement('option');
subrow3_n.innerHTML='N';
subrow3_n.value=2;
row1td3sel.appendChild(subrow3_y);
row1td3sel.appendChild(subrow3_n);


var row1td4=document.createElement('TD');
var row1td4sel=document.createElement('select' );
row1td4sel.setAttribute('id','PA'+i,'NAME','prefer ence_access');
row1td4.appendChild(row1td4sel);

var subrow4_y=document.createElement('option');
subrow4_y.innerHTML='Y';
subrow4_y.value=1;

var subrow4_n=document.createElement('option');
subrow4_n.innerHTML='N';
subrow4_n.value=2;

row1td4sel.appendChild(subrow4_y);
row1td4sel.appendChild(subrow4_n);


var row1td5=document.createElement('TD');
var row1td5sel=document.createElement('select' );
row1td5sel.setAttribute('id','AA'+i,'NAME','activi ty_access');
row1td5.appendChild(row1td5sel);

var subrow5_y=document.createElement('option');
subrow5_y.innerHTML='Y';
subrow5_y.value=1;

var subrow5_n=document.createElement('option');
subrow5_n.innerHTML='N';
subrow5_n.value=2;

row1td5sel.appendChild(subrow5_y);
row1td5sel.appendChild(subrow5_n);

var row1td6=document.createElement('TD');
var row1td6sel=document.createElement('select' );
row1td6sel.setAttribute('id','UR'+i,'NAME','user_r ights');
row1td6.appendChild(row1td6sel);

var subrow6_y=document.createElement('option');
subrow6_y.innerHTML='Y';
subrow6_y.value=1;

var subrow6_n=document.createElement('option');
subrow6_n.innerHTML='N';
subrow6_n.value=2;

row1td6sel.appendChild(subrow6_y);
row1td6sel.appendChild(subrow6_n);

var row1td7=document.createElement('TD');
var row1td7btn=document.createElement('input');
row1td7btn.setAttribute('type','button','name','De l'+i);
row1td7btn.value='Delete';
row1td7btn.id='Del'+i;
row1td7btn.onclick="removeThis(this)";
row1td7.appendChild(row1td7btn);
row1td7.innerHTML= row1td7.innerHTML;


row1.appendChild(row1td1);
row1.appendChild(row1td2);
row1.appendChild(row1td3);
row1.appendChild(row1td4);
row1.appendChild(row1td5);
row1.appendChild(row1td6);
row1.appendChild(row1td7);


tbody.appendChild(row1);
}

}

function addRowToTable()
{
var tbl = document.getElementById('t1head');
var lastRow = tbl.rows.length;
// if there's no header row in the table, then iteration = lastRow + 1
var iteration = lastRow;
var row = tbl.insertRow(lastRow);

// left cell
var cell1 = row.insertCell(0);
var textNode = document.createElement('input');
textNode.setAttribute('type','text','name','text'+ iteration,'id','txt'+iteration);
cell1.appendChild(textNode);

// right cell
var cell2 = row.insertCell(1);
var el = document.createElement('input');
el.type = 'text';
el.name = 'text' + (iteration+1);
el.id = 'txt' + (iteration+1);
cell2.appendChild(el);

// select cell
var cell3 = row.insertCell(2);
var sel3 = document.createElement('select');
sel3.name = 'request_access';
sel3.id='RA'+iteration;
sel3.options[0] = new Option('Y', '0');
sel3.options[1] = new Option('N', '1');
cell3.appendChild(sel3);

// select cell
var cell4 = row.insertCell(3);
var sel4 = document.createElement('select');
sel4.name = 'preferences_access';
sel4.id='PA'+iteration;
sel4.options[0] = new Option('Y', '0');
sel4.options[1] = new Option('N', '1');
cell4.appendChild(sel4);

// select cell

var cell5 = row.insertCell(4);
var sel5 = document.createElement('select');
sel5.name = 'activity_access';
sel5.id='AA'+iteration;
sel5.options[0] = new Option('Y', '0');
sel5.options[1] = new Option('N', '1');
cell5.appendChild(sel5);

// select cell

var cell6 = row.insertCell(5);
var sel6 = document.createElement('select');
sel6.name = 'user_rights';
sel6.id='UR'+iteration;
sel6.options[0] = new Option('Y', '0');
sel6.options[1] = new Option('N', '1');
cell6.appendChild(sel6);

//button cell

var cell7 = row.insertCell(6);
var el = document.createElement('input');
el.type = 'button';
el.name = 'Del' + (iteration);
el.id = 'Del' + (iteration);
el.value='Delete';
el.onclick="removeThis(this)";
cell7.appendChild(el);
cell7.innerHTML=cell7.innerHTML;

}

function removeThis(row)
{
var rIndex = row.parentNode.parentNode.rowIndex;
document.getElementById('t1head').deleteRow(rIndex );
}

</script>
<body bgcolor="#fffcd0" onLoad=createTable('t1head',5)>
<form id=frm1 name=form1>
<table class="layout" border="4" align="center" width="100%" id=t1head>
<tr>
<td align="center"><b> USER ID </b></td>
<td align="center"><b> CLIENT </b></td>
<td align="center"><b> REQUEST_ACCESS </b></td>
<td align="center"><b> PREFERENCES_ACCESS</b></td>
<td align="center"><b> ACTIVITY_ACCESS </b></td>
<td align="center"><b> USER_RIGHTS </b></td>

</tr>

</table>
<table>
<tr><td></td></tr><tr><td></td></tr>
<tr><td></td></tr></tr><tr><td></td></tr>
</tr><tr><td></td></tr><tr><td></td></tr>
<tr><td></td></tr></tr><tr><td></td></tr>
</table>
<table class="layout" border="0" align="center" id=tabBtn>
<tr>
<td align="center" colspan="2">
<input type="button" value="ADD" name="add" onClick=addRowToTable()>
</td>

<td align="center" colspan="2">
<input type="button" value="SAVE" name="save" onClick=save1()>
</td>

<td align="center" colspan="2">
<input type="button" value="CANCEL" name="cancel" onClick="history.go(0)">
</td>
</tr>
</table>
</form>
</body>
</html>[/HTML]

Regards
Ramanan Kalirajan
Mar 20 '08 #19
Sriku
6
Thanks Ramanan Kalirajan





Regards
Srikanth
Mar 23 '08 #20
RamananKalirajan
607 512MB
Thanks Ramanan Kalirajan





Regards
Srikanth
You are always Welcome

Regards
Ramanan Kalirajan
Mar 24 '08 #21

Post your reply

Sign in to post your reply or Sign up for a free account.

Similar topics

1 post views Thread by Sachi | last post: by
1 post views Thread by russ | last post: by
7 posts views Thread by Jeff Uchtman | last post: by
1 post views Thread by Elliot Rodriguez | last post: by
1 post views Thread by theresa | last post: by
reply views Thread by Eniac | last post: by
reply views Thread by zhoujie | last post: by
reply views Thread by suresh191 | last post: by
1 post views Thread by Geralt96 | last post: by
reply views Thread by harlem98 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.