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 }