Project

General

Profile

1
/****************************************************************************
2
* Multiple Assessment download
3
* @param form containing the neceassary input items
4
* @return true/false for form submission
5
*****************************************************************************/
6
function multipleAssessmentSearch(submitFormObj, fieldFormObj) {
7
	
8
	//alert("submitFormObj=" + submitFormObj);
9
	//harvest the metadata fields we want to include
10
	var metadataObjs = new Array();
11
	var index = 0;
12
	for (var i=0; i < fieldFormObj.length; i++) {
13
		var formElement = fieldFormObj.elements[i];
14
		var metadataObj = new Object();
15
		metadataObj.name = formElement.name;
16
		metadataObj.value = formElement.value;
17
		metadataObjs[index] = metadataObj;
18
		index++;
19
	}
20
	
21
	//TODO option for all questions vs. just one
22
	//var questionId = submitFormObj.questionId.value;
23
	//alert("questionId=" + questionId);
24
	
25
	var documentObjects = new Array();
26
	var index = 0;
27
	if (submitFormObj.docid.length > 1) {
28
		for (var i=0; i < submitFormObj.docid.length; i++) {
29
			if (submitFormObj.docid[i].value != "") {
30
				var documentObject = new Object();
31
				documentObject.docid = submitFormObj.docid[i].value;
32
				documentObject.demographicData = submitFormObj[documentObject.docid + "demographicData"].value;
33
				
34
				var questionIds = new Array();
35
				for (var z = 0; z < submitFormObj[documentObject.docid].length; z++) {
36
					questionIds[z] = submitFormObj[documentObject.docid][z].value;
37
				}
38
			
39
				documentObject.questionIds = questionIds;
40
				documentObjects[index] = documentObject;
41
				index++;
42
			}
43
		}
44
	}
45
	else {
46
		//alert("submitFormObj.docid=" + submitFormObj.docid);
47
		if (submitFormObj.docid.value != "") {
48
			var documentObject = new Object();
49
			documentObject.docid = submitFormObj.docid.value;
50
			documentObject.demographicData = submitFormObj[documentObject.docid + "demographicData"].value;
51
				
52
			var questionIds = new Array();
53
			if (submitFormObj[documentObject.docid].length > 1) {
54
				for (var z = 0; z < submitFormObj[documentObject.docid].length; z++) {
55
					questionIds[z] = submitFormObj[documentObject.docid][z].value;
56
				}
57
			}
58
			else {
59
				questionIds[0] = submitFormObj[documentObject.docid].value;
60
			}
61
			
62
			documentObject.questionIds = questionIds;
63
			documentObjects[0] = documentObject;
64
		}
65
	}
66
		
67
	var query = generateQuery(documentObjects, metadataObjs);
68
	
69
	submitFormObj.dataquery.value = query;
70
	
71
	return true;
72
		
73
}
74

    
75
/****************************************************************************
76
* Single Assessment download
77
* @param form containing the neceassary input items
78
* @return true/false for form submission
79
*****************************************************************************/
80
function assessmentSearch(submitFormObj) {
81

    
82
	//harvest the metadata fields we want to include
83
	var metadataObjs = new Array();
84
	var index = 0;
85
	for (var i=0; i < submitFormObj.length; i++) {
86
		var formElement = submitFormObj.elements[i];
87
		if (formElement.type == "checkbox" && formElement.checked) {
88
			//ignore certain other checkboxes, kind of a hack 
89
			if (formElement.name == "includeQuestions") {
90
				continue;
91
			}
92
			var metadataObj = new Object();
93
			metadataObj.name = formElement.name;
94
			metadataObj.value = formElement.value;
95
			metadataObjs[index] = metadataObj;
96
			index++;
97
		}
98
	}
99
	
100
	//var checkBox = document.getElementById("searchAll");
101
	var docId = submitFormObj.docid.value;
102
	//alert("docId=" + docId);
103
	
104
	//do we want question metadata?
105
	var includeQuestions = submitFormObj.includeQuestions.checked;
106
	var questionIds = new Array();
107
	questionIds[0] = "";
108
	
109
	if (includeQuestions) {
110
		if (submitFormObj.assessmentItemId.length > 1) {
111
			for (var i=0; i < submitFormObj.assessmentItemId.length; i++) {
112
				questionIds[i] = submitFormObj.assessmentItemId[i].value;
113
			}
114
		}
115
		else {
116
			questionIds[0] = submitFormObj.assessmentItemId.value;
117
		}
118
	}
119
	
120
	//set up the list of objects to pass to the query assembler, just one document
121
	var documentObjects = new Array();
122
	var documentObject = new Object();
123
	documentObject.docid = docId;
124
	documentObject.questionIds = questionIds;
125
	documentObjects[0] = documentObject;
126
	
127
	var query = generateQuery(documentObjects, metadataObjs);
128
	
129
	submitFormObj.dataquery.value = query;
130
	
131
	return true;
132
		
133
}
134

    
135
/****************************************************************************
136
* Save fields for the attribute maping
137
* @param formId containing the neceassary input items
138
* @return true/false for form submission
139
*****************************************************************************/
140
function saveFields(formId, metacatURL) {
141

    
142
	var submitFormObj = document.getElementById(formId);
143
	
144
	//send the request to clear
145
	var myRequest = new Ajax.Request(
146
	metacatURL,
147
	{	method: 'post',
148
		parameters: { 
149
			action: 'editcart', 
150
			operation: 'clearfields'},
151
		evalScripts: true, 
152
		//onSuccess: function(transport) {alert('success: ' + transport.status);},
153
		onFailure: function(transport) {alert('failure clearing fields');}
154
	 });
155
	
156
	//go through the check boxes and set the ones we want
157
	var count = 0;
158
	for (var i=0; i < submitFormObj.length; i++) {
159
		var formElement = submitFormObj.elements[i];
160
		if (formElement.type == "checkbox" && formElement.checked) {
161
			//ignore certain other checkboxes, kind of a hack, but it's javascript...
162
			if (formElement.name == "includeQuestions") {
163
				continue;
164
			}
165
			if (formElement.name == "docid") {
166
				continue;
167
			}
168
			
169
			//send the request
170
			var myRequest = new Ajax.Request(
171
			metacatURL,
172
			{	method: 'post',
173
				parameters: { 
174
					action: 'editcart', 
175
					operation: 'addfield', 
176
					field: formElement.name, 
177
					path: formElement.value},
178
				evalScripts: true, 
179
				onSuccess: function(transport) {
180
					//alert('Selections saved: ' + operation); 
181
					//refresh after the save
182
					if (document.getElementById("ajaxCartResults")) {
183
						window.location.reload();
184
					}
185
					else {
186
						window.document.getElementById("iframeheaderclass").src=window.document.getElementById("iframeheaderclass").src;
187
					}
188
				}, 
189
				onFailure: function(transport) {alert('failure saving field: ' + formElement.name);}
190
			 });
191
		 	count++;
192
		}
193
	}
194
	
195
	//window.document.getElementById("iframeheaderclass").src = window.document.getElementById("iframeheaderclass").src;
196
	
197
	//alert(count + ' Field selections saved.'); 
198
	
199
	return true;
200
		
201
}
202

    
203
/****************************************************************************
204
* Query Generation function
205
* @param docObjs is an Array of Objects with "docid" (String) and "questionIds" (Array) properties
206
* @param metadataObjs is an Array of Objects with "name" and "value" properties (both String)
207
* @return generated query string
208
*****************************************************************************/
209
function generateQuery(docObjs, metadataObjs) {
210
	//alert("calling method");
211
	
212
	//make parameters at some point
213
	var includeDemographicData = false;
214
	var questionMetadataCount = 2;
215
	var questionChoiceCount = 5;
216
	
217
	//construct the assessment metadata attribute selection snippet
218
	var metadataAttributes = "";
219
	var index = 0;
220
	for (var j=0; j < metadataObjs.length; j++) {
221
		var metadataObj = metadataObjs[j];
222
		
223
		metadataAttributes += "<attribute index=\"";
224
		metadataAttributes += index;
225
		metadataAttributes += "\">";
226
		
227
		metadataAttributes += "<pathexpr label=\"";
228
		metadataAttributes += metadataObj.name;
229
		metadataAttributes += "\">";
230
		metadataAttributes += metadataObj.value;
231
		metadataAttributes += "</pathexpr>";
232
		
233
		metadataAttributes += "</attribute>";
234
		
235
		index++;
236
	}//metadataObjs loop
237
	
238
	
239
	//construct the begining of the query
240
	var tempQuery = 
241
        "<?xml version=\"1.0\"?>"
242
        + "<dataquery>"
243
			+ "<union>";
244
			
245
	for (var i=0; i < docObjs.length; i++) {
246

    
247
		var docId = docObjs[i].docid;
248
		var containsDemographicData = docObjs[i].demographicData;
249
		//alert("containsDemographicData=" + containsDemographicData);
250
		
251
		//get the question ids for this question
252
		var questionIds = docObjs[i].questionIds;
253
	
254
		//alert("questionIds=" + questionIds);
255
		
256
		//assemble the assessment metadata
257
		var metadataAttributeSelection = "";
258
		if (metadataAttributes.length > 0) {
259
			metadataAttributeSelection =
260
				"<datapackage id=\"" + docId + "\">"
261
					+ "<entity id=\"" + docId + "\">"
262
						+ metadataAttributes
263
					+ "</entity>"
264
				+ "</datapackage>";
265
		}
266
				
267
		//loop for each question item
268
		for (var k=0; k < questionIds.length; k++) {
269
			var questionId = questionIds[k];
270
		
271
			tempQuery +=
272
			"<query>"
273
			+ "<selection>";
274
			
275
			//select the data
276
			tempQuery +=
277
				"<datapackage id=\"" + docId + "\">"
278
					+ "<entity index=\"0\">"
279
						+ "<attribute index=\"0\"/>"
280
						+ "<attribute index=\"1\"/>"
281
						//DO NOT omit student id attribute - used for transpose
282
						+ "<attribute index=\"2\"/>"
283
						+ "<attribute index=\"3\"/>"
284
						+ "<attribute index=\"4\"/>"
285
						// the external response file
286
						+ "<attribute index=\"6\"/>"
287
					+ "</entity>"
288
				+ "</datapackage>";
289
				
290
			//select the demographic data
291
			if (includeDemographicData) {
292
				if (containsDemographicData) {
293
					tempQuery +=
294
						"<datapackage id=\"" + docId + "\">"
295
							+ "<entity index=\"1\">"
296
								//omit student id attribute
297
								+ "<attribute index=\"1\"/>"
298
								+ "<attribute index=\"2\"/>"
299
								+ "<attribute index=\"3\"/>"
300
							+ "</entity>"
301
						+ "</datapackage>";	
302
				}
303
				else {
304
					tempQuery +=
305
						"<staticItem name=\"demographic_1\" value=\"\" />"
306
						+ "<staticItem name=\"demographic_2\" value=\"\" />"
307
						+ "<staticItem name=\"demographic_3\" value=\"\" />";
308
				}
309
			}
310
				
311
			//select the metadata
312
			tempQuery += metadataAttributeSelection;
313
	
314
			//select the question metadata						
315
			if (questionId.length > 0) {
316
				tempQuery +=
317
				"<datapackage id=\"" + questionId + "\">"
318
					+ "<entity id=\"" + questionId + "\">"
319
						+ "<attribute name=\"qId\">"
320
							+ "<pathexpr label=\"qId\">//assessment/section/item/@ident</pathexpr>"
321
						+ "</attribute>"
322
						+ "<attribute name=\"qTitle\">"
323
							+ "<pathexpr label=\"qTitle\">//assessment/section/item/@title</pathexpr>"
324
						+ "</attribute>"
325
						+ "<attribute name=\"qLabel\">"
326
							+ "<pathexpr label=\"qLabel\">//assessment/section/item/presentation/@label</pathexpr>"
327
						+ "</attribute>"
328
						+ "<attribute name=\"qPrompt\">"
329
							+ "<pathexpr label=\"qPrompt\">(//assessment/section/item/presentation/flow/response_lid/render_choice/material/mattext)|(//assessment/section/item/presentation/flow/response_str/material/mattext)|(//assessment/section/item/presentation/flow/material/mattext)</pathexpr>"
330
						+ "</attribute>";
331
				//control multiple choices
332
				for (var p = 1; p <= questionChoiceCount; p++) {
333
					tempQuery +=
334
						"<attribute name=\"qChoice_" + p + "\">"
335
							+ "<pathexpr label=\"qChoice\">//assessment/section/item/presentation/flow/response_lid/render_choice/flow_label/response_label/material/mattext</pathexpr>"
336
						+ "</attribute>";
337
				}
338
				//control multiple metadata fields
339
				for (var q = 1; q <= questionMetadataCount; q++) {
340
					tempQuery +=
341
						"<attribute name=\"qMetadataVocabulary_" + q +"\">"
342
							+ "<pathexpr label=\"qMetadataVocabulary_" + q +"\">//assessment/section/item/itemmetadata/qtimetadata/vocabulary</pathexpr>"
343
						+ "</attribute>"
344
						+ "<attribute name=\"qMetadataValue_" + q +"\">"
345
							+ "<pathexpr label=\"qMetadataValue_" + q +"\">//assessment/section/item/itemmetadata/qtimetadata/qtimetadatafield/fieldentry</pathexpr>"
346
						+ "</attribute>";
347
				}
348
				tempQuery +=
349
					"</entity>"
350
				+ "</datapackage>";
351
			}
352
				
353
			tempQuery += "</selection>";
354
			
355
			//join to the question "table"
356
			if (questionId.length > 0) {
357
				tempQuery +=
358
					"<where>"
359
						+ "<condition type=\"join\">"
360
							+ "<left>"
361
								+ "<datapackage id=\"" + docId + "\">"
362
									+ "<entity index=\"0\">"
363
										+ "<attribute index=\"1\"/>"
364
									+ "</entity>"
365
								+ "</datapackage>"
366
							+ "</left>"
367
							+ "<operator>=</operator>"
368
							+ "<right>"
369
								+ "<datapackage id=\"" + questionId + "\">"
370
									+ "<entity id=\"" + questionId + "\">"
371
										+ "<attribute name=\"qId\">"
372
											+ "<pathexpr label=\"qId\">//assessment/section/item/@ident</pathexpr>"
373
										+ "</attribute>"
374
									+ "</entity>"
375
								+ "</datapackage>"
376
							+ "</right>"
377
						+ "</condition>"
378
					+ "</where>";
379
			}
380
			
381
			tempQuery += "</query>";
382
		
383
		} // for questionId loop
384
		
385
	
386
	} //for docObjs loop
387
				 
388
	tempQuery +=
389
		 "</union>"	
390
		 + "</dataquery>";
391
	
392
	//alert(tempQuery);
393
             
394
    return tempQuery;
395
}
396

    
397
/**
398
*	@param searchTerms - and object (hashtable) with, pay attention now:
399
	keys are search values
400
*   values are pathexprs
401
**/
402
function generateSearchString(
403
		searchTerms,
404
		assessmentItemIds,
405
		operator, 
406
		searchAssessments, 
407
		searchAssessmentItems) {
408
	var queryString = 
409
		"<pathquery version=\"1.2\">"
410
			+"<querytitle>Web-Search</querytitle>";
411
		
412
	/** assessments **/
413
	if (searchAssessments) {
414
	
415
		queryString +=
416
			"<returndoctype>edml://ecoinformatics.org/edml</returndoctype>"
417
			
418
			//assessment fields
419
               +"<returnfield>assessment/duration</returnfield>"
420
               +"<returnfield>assessment/title</returnfield>"
421
               +"<returnfield>assessment/@id</returnfield>"
422
               +"<returnfield>dataset/dataTable/entityName</returnfield>"
423
               +"<returnfield>lom/general/title/string</returnfield>"
424
               +"<returnfield>lom/general/keyword/string</returnfield>"
425
               +"<returnfield>individualName/surName</returnfield>"
426
               +"<returnfield>organizationName</returnfield>"
427
               
428
               +"<returnfield>assessmentItems/assessmentItem/assessmentItemId</returnfield>";
429
               
430
	}
431
						
432
	/** questions **/
433
	if (searchAssessmentItems) {
434
		queryString +=
435
			"<returndoctype>http://www.imsglobal.org/xsd/ims_qtiasiv1p2</returndoctype>"
436
			
437
			//question (qti) fields
438
			+"<returnfield>item/@title</returnfield>"
439
			+"<returnfield>item/@ident</returnfield>"
440
               +"<returnfield>qtimetadata/qtimetadatafield/fieldlabel</returnfield>"
441
               +"<returnfield>qtimetadata/qtimetadatafield/fieldentry</returnfield>"
442
			//classification
443
			+"<returnfield>fieldlabel</returnfield>"
444
			+"<returnfield>fieldentry</returnfield>"
445
			+"<returnfield>objectives/material/mattext</returnfield>"
446
			//question content
447
			+"<returnfield>presentation/flow/response_lid/render_choice/material/mattext</returnfield>"
448
			+"<returnfield>response_label/@ident</returnfield>"
449
			+"<returnfield>response_label/material/mattext</returnfield>";
450
	}		
451
    
452
	// a query group for search terms
453
	var termQueryString = "";
454
    termQueryString +=
455
    	"<querygroup operator=\"" + operator + "\">";                    
456
    for (var i in searchTerms) {
457
    	var key = i;
458
    	var value = searchTerms[i];
459
    	//only if we have a value  
460
    	if (value.length > 0) {                   
461
    		termQueryString +=
462
				"<queryterm searchmode=\"contains\" casesensitive=\"false\">";
463
				if (key != "anyValue") {
464
					termQueryString += "<pathexpr>" + key + "</pathexpr>";
465
				}	
466
				termQueryString += "<value>" + value + "</value>";
467
				termQueryString +="</queryterm>";
468
		}
469
    }
470
    termQueryString += "</querygroup>";
471
	
472
	// querygroup for assessmentItemIds
473
	var itemQueryString = "";
474
	if (assessmentItemIds) {
475
		//the pathexpr
476
		var pathexpr = "assessmentItems/assessmentItem/assessmentItemId";
477
		// a query group for search terms
478
		itemQueryString +=
479
	    	"<querygroup operator=\"" + "UNION" + "\">";
480
	    for (var i in assessmentItemIds) {
481
	    	var itemId = assessmentItemIds[i];
482
	    	//only if we have a value  
483
	    	if (itemId.length > 0) {                   
484
	    		itemQueryString +=
485
					"<queryterm searchmode=\"contains\" casesensitive=\"false\">";
486
					if (key != "anyValue") {
487
						itemQueryString += "<pathexpr>" + pathexpr + "</pathexpr>";
488
					}	
489
					itemQueryString += "<value>" + itemId + "</value>";
490
					itemQueryString +="</queryterm>";
491
			}
492
	    }
493
	    itemQueryString += "</querygroup>";
494
	}
495
	
496
	//combine the various conditions
497
	queryString +=
498
    	"<querygroup operator=\"" + "UNION" + "\">";
499
	queryString += termQueryString;
500
	queryString += itemQueryString;
501
	queryString += "</querygroup>";
502
	
503
	//end the pathquery
504
	queryString += "</pathquery>";
505
	
506
	return queryString;
507
				
508
}
509

    
510

    
511
function generateAssessmentSearchString(assessmentItemId) {
512
	var query = 
513
		"<pathquery version='1.2'>"
514
		     +"<querytitle>Containing-Assessment-Search</querytitle>"
515
		     
516
		     +"<returndoctype>edml://ecoinformatics.org/edml</returndoctype>"
517
		                           
518
		     +"<returnfield>assessment/duration</returnfield>"
519
             +"<returnfield>assessment/title</returnfield>"
520
             +"<returnfield>assessment/@id</returnfield>"
521
             +"<returnfield>dataset/dataTable/entityName</returnfield>"
522
             +"<returnfield>lom/general/title/string</returnfield>"
523
             +"<returnfield>lom/general/keyword/string</returnfield>"
524
             +"<returnfield>individualName/surName</returnfield>"
525
             +"<returnfield>organizationName</returnfield>"
526
                      
527
             +"<returnfield>assessmentItems/assessmentItem/assessmentItemId</returnfield>";
528
                      
529
		    if (assessmentItemId.length > 0) {
530
			    query += "<querygroup operator='UNION'>";
531
			    
532
			    //add the assessmentId if included
533
			    query +=
534
			     		"<queryterm searchmode='contains' casesensitive='false'>"
535
			                  +"<value>"
536
			                  + assessmentItemId
537
			                  +"</value>"
538
			                  +"<pathexpr>assessmentItemId</pathexpr>"
539
			          +"</queryterm>";
540
				
541
			    //close the query group      
542
			     query +=
543
			     "</querygroup>";
544
			}
545
			     
546
		query += "</pathquery>";
547
		
548
	return query;	
549
}
550

    
551
function generateAssessmentListString(assessmentIds) {
552
	var query = 
553
		"<pathquery version='1.2'>"
554
		     +"<querytitle>Assessment-List</querytitle>"
555
		     
556
		     +"<returndoctype>edml://ecoinformatics.org/edml</returndoctype>"
557
		                           
558
                      +"<returnfield>assessment/title</returnfield>"
559
                      +"<returnfield>assessment/@id</returnfield>"
560
                      +"<returnfield>assessment/duration</returnfield>"
561
           			  +"<returnfield>dataset/dataTable/entityName</returnfield>"
562
                      +"<returnfield>lom/general/title/string</returnfield>"
563
                      +"<returnfield>lom/general/keyword/string</returnfield>"
564
                      +"<returnfield>individualName/surName</returnfield>"
565
                      +"<returnfield>organizationName</returnfield>"
566
                      
567
                      +"<returnfield>assessmentItems/assessmentItem/assessmentItemId</returnfield>";
568
                      
569
		    if (assessmentIds.length > 0) {
570
			    query += "<querygroup operator='UNION'>";
571
			    
572
			    //add the assessmentId if included
573
			    for (var i=0; i < assessmentIds.length; i++) {
574
				    query +=
575
				     		"<queryterm searchmode='equals' casesensitive='false'>"
576
				                  +"<value>"
577
				                  + assessmentIds[i]
578
				                  +"</value>"
579
				                  +"<pathexpr>@packageId</pathexpr>"
580
				          +"</queryterm>";
581
				}
582
			    //close the query group      
583
			     query +=
584
			     "</querygroup>";
585
			}
586
			     
587
		query += "</pathquery>";
588
		
589
	return query;	
590
}
591

    
592
function callAjax(metacatURL, myQuery, qfmt, divId, callback) {
593
														
594
	//alert("calling ajax: " + metacatURL);
595
	//alert("myQuery: " + myQuery);
596
	
597
	//var myRequest = new Ajax.Request(
598
	var myUpdate = new Ajax.Updater(
599
		divId,
600
		metacatURL,
601
		{	method: 'post',
602
			parameters: { action: 'squery', qformat: qfmt, query: myQuery},
603
			evalScripts: true, 
604
			onComplete: callback,
605
			onFailure: function(transport) {alert('failure making ajax call');}
606
		 });
607
		 
608
	 //alert("done calling ajax");
609
}
610
function getIframeDocument(iframeId) {
611
	//look up the document
612
	var iframe = window.document.getElementById(iframeId);
613
	var doc = null;
614
	if (iframe.contentDocument) {
615
		doc = iframe.contentDocument;
616
	}
617
	else {
618
		doc = iframe.contentWindow.document;
619
	}
620
	return doc;
621
}
(22-22/22)