1 /** 2 * Javascript functions related to adding content to a page. 3 * 4 * @created June 23, 2007 5 * @author Steve Hannah <shannah@sfu.ca> 6 */ 7 function df_getElementsWithAttribute(parent,tagname,attname){ 8 var els = parent.getElementsByTagName(tagname); 9 var out = []; 10 for (var i=0, max=els.length; i<max; i++){ 11 if ( els[i].getAttribute(attname) ) out.push(els[i]); 12 } 13 return out; 14 15 } 16 17 var df_addNew_target_element; 18 var df_addNew_form_element; 19 20 /** 21 * Adds a new record (or related record) to the target element. 22 * The second argument stores the element where the form should be 23 * placed. 24 */ 25 function df_addNew(target,formel){ 26 if ( typeof target == 'string' ){ 27 target = document.getElementById(target); 28 } 29 if ( typeof formel == 'string' ){ 30 31 formel = document.getElementById(formel); 32 } 33 34 if ( !target ){ 35 throw new Exception("Cannot add new item when no target is specified"); 36 } 37 38 if ( !formel ){ 39 // The form element was not provided or could not be found, so we will 40 // add it immediately after the target element. 41 alert(target.tagName); 42 if ( target.tagName.toLowerCase() == 'tr' ){ 43 alert("we have a tr tag"); 44 // We can't just place another child in a table row, so we will 45 // create another row just after this row. 46 var numcols=0; 47 for ( var i=0, max=target.childNodes.length; i<max; i++){ 48 if ( target.childNodes[i].tagName.toLowerCase() == 'td' || target.childNodes[i].tagName.toLowerCase() == 'th' ){ 49 var colspan = target.childNodes[i].getAttribute('colspan'); 50 if ( colspan ){ 51 numcols += parseInt(colspan); 52 } else { 53 numcols++; 54 } 55 } 56 } 57 58 var formtr = document.createElement('tr'); 59 60 var random = Math.round(Math.random()*100); 61 formtr.setAttribute('id', 'form-'+random); 62 63 var formtd = document.createElement('td'); 64 if ( numcols > 6 ){ 65 formtd.setAttribute('colspan', 6); 66 var formtd2 = document.createElement('td'); 67 formtd2.setAttribute('colspan', numcols-6); 68 formtr.appendChild(formtd); 69 formtr.appendChild(formtd2); 70 } else { 71 formtd.setAttribute('colspan', numcols-6); 72 formtr.appendChild(formtd); 73 } 74 75 76 if ( target.nextSibling ){ 77 target.parentNode.insertBefore(formtr, target.nextSibling); 78 } else { 79 target.parentNode.appendChild(formtr); 80 } 81 82 formel = formtr; // So we store the row as the form element. 83 84 85 } else { 86 //We can just add an element after the target 87 formel = document.createElement('div'); 88 var random = Math.round(Math.random()*100); 89 formel.setAttribute('id', 'form-'+random); 90 91 if ( target.nextSibling ){ 92 target.parentNode.insertBefore(formel, target.nextSibling); 93 } else { 94 target.parentNode.appendChild(formel); 95 } 96 } 97 98 } 99 100 var editableFields = df_getElementsWithAttribute(target, 'span', 'df:field'); 101 var fieldnames = []; 102 for (var i=0, max=editableFields.length; i<max; i++){ 103 fieldnames.push(editableFields[i].getAttribute('df:field')); 104 } 105 fieldnames = fieldnames.join(','); 106 var relationship = target.getAttribute('df:relationship'); 107 var formUrl = null; 108 if ( relationship ){ 109 // we are adding a related record. 110 var id = target.getAttribute('df:id'); 111 formUrl = '?-action=ajax_form&-record='+escape(id)+'&-relationship='+escape(relationship)+'&-form-type=new_related_record&-fields='+escape(fieldnames); 112 } 113 else { 114 var table = target.getAttribute('df:table'); 115 // The name of the table that is being added. 116 var targetid = target.getAttribute('id'); 117 formUrl = '?-action=ajax_form&-form-type=new&-fields='+escape(fieldnames)+'&-table='+escape(table)+'&-target-id='+escape(targetid); 118 } 119 120 target.http = getHTTPObject(); 121 target.http.onreadystatechange = df_addNew_handle; 122 123 target.http.open('GET',formUrl); 124 target.http.send(null); 125 126 target.handleResponse = df_addNew_handleResponse; 127 df_addNew_target_element = target; 128 df_addNew_form_element = formel; 129 target.edit_form = formel; 130 131 } 132 133 function df_addNew_handle(){ 134 var target = df_addNew_target_element; 135 var formel = df_addNew_form_element; 136 if ( !target ) return; 137 var http = target.http; 138 if ( http.readyState == 4 ){ 139 if (formel.tagName.toLowerCase() == 'tr'){ 140 formel.firstChild.innerHTML = http.responseText; 141 } else { 142 formel.innerHTML = http.responseText; 143 } 144 145 } 146 } 147 148 function df_addNew_handleResponse(targetid, values){ 149 var targetel = document.getElementById(targetid); 150 if ( !targetel ){ 151 throw new Exception("Could not find target element "+targetid); 152 } 153 154 var newrow = targetel.cloneNode(true); 155 var fieldEls = df_getElementsWithAttribute(newrow, 'span', 'df:field'); 156 for ( var i=0, max=fieldEls.length; i<max; i++ ){ 157 var fieldname = fieldEls[i].getAttribute('df:field'); 158 if ( values[fieldname] ){ 159 fieldEls[i].innerHTML = values[fieldname]; 160 } 161 } 162 163 targetel.parentNode.insertBefore(newrow, targetel); 164 if ( df_add_editable_awareness ){ 165 alert("We have awareness"); 166 df_add_editable_awareness(newrow); 167 } 168 }