Project

General

Profile

1
<%@ page language="java"%>
2
<%
3
/**
4
 * 
5
 * '$RCSfile$'
6
 * Copyright: 2008 Regents of the University of California and the
7
 *             National Center for Ecological Analysis and Synthesis
8
 *    '$Author: leinfelder $'
9
 *      '$Date: 2010-12-02 16:16:22 -0800 (Thu, 02 Dec 2010) $'
10
 * '$Revision: 5687 $'
11
 * 
12
 * This program is free software; you can redistribute it and/or modify
13
 * it under the terms of the GNU General Public License as published by
14
 * the Free Software Foundation; either version 2 of the License, or
15
 * (at your option) any later version.
16
 * 
17
 * This program is distributed in the hope that it will be useful,
18
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20
 * GNU General Public License for more details.
21
     
22
 * You should have received a copy of the GNU General Public License
23
 * along with this program; if not, write to the Free Software
24
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
25
 */  
26
%>
27

    
28
<%@ include file="../../common/common-settings.jsp"%>
29
<%@ include file="../../common/configure-check.jsp"%>
30

    
31
<html>
32
<head>
33
<title>Semantic search</title>
34
<link rel="stylesheet" type="text/css" href="<%=STYLE_SKINS_URL%>/semtools/semtools.css">
35
<link rel="stylesheet" type="text/css" href="<%=STYLE_SKINS_URL%>/semtools/jqueryui/css/smoothness/jquery-ui-1.8.6.custom.css">
36
<script type="text/javascript"
37
	src="<%=STYLE_SKINS_URL%>/semtools/search.js"></script>
38

    
39
<script type="text/javascript">
40
                    	    // Set defaults for this installation
41
                    	    //var BP_SEARCH_SERVER = "http://oor-01.cim3.net";
42
                    	    //var BP_SITE = "Sandbox";
43
                    	    //var BP_ORG = "OOR";
44
                    	  </script>
45
<!--  
46
<script language="Javascript" type="text/JavaScript" src="<%=STYLE_SKINS_URL%>/semtools/bioportal/form_complete.js"></script>
47
-->
48
<script language="javascript" type="text/javascript" src="<%=STYLE_SKINS_URL%>/semtools/jsTree/_lib/jquery.js"></script>
49
<script language="javascript" type="text/javascript" src="<%=STYLE_SKINS_URL%>/semtools/jsTree/_lib/jquery.cookie.js"></script>
50
<script language="javascript" type="text/javascript" src="<%=STYLE_SKINS_URL%>/semtools/jsTree/jquery.jstree.js"></script>
51
<!-- jquery ui -->
52
<script language="javascript" type="text/javascript" src="<%=STYLE_SKINS_URL%>/semtools/jqueryui/js/jquery-ui-1.8.6.custom.min.js"></script>
53

    
54
<script language="javascript" type="text/javascript" src="<%=STYLE_SKINS_URL%>/semtools/jquery/jquery.busy.js"></script>
55

    
56
<script language="javascript" type="text/javascript" src="<%=STYLE_SKINS_URL%>/semtools/semtools.js"></script>
57
<script language="javascript" type="text/javascript" src="<%=STYLE_COMMON_URL%>/branding.js"></script>
58

    
59
<script language="Javascript" type="text/JavaScript"><!--
60
function populateActiveDomain(divId, class) {
61
	// collect the filtering values we have so far
62
	// these are hidden input fields in the form for holding the selected values
63
	var entity = $("#activeEntitiesValue").val() ? $("#activeEntitiesValue").val() : "";
64
	var characteristic = $("#activeCharacteristicsValue").val() ? $("#activeCharacteristicsValue").val() : "";
65
	var protocol = $("#activeProtocolsValue").val() ? $("#activeProtocolsValue").val() : "";
66
	var measurement = $("#activeMeasurementsValue").val() ? $("#activeMeasurementsValue").val() : "";
67
	
68
	// TODO: remember the selected value for this when filtering by active domain
69
	var selectedNode = $("#" + divId).jstree("get_selected", $("#" + divId));
70
	var selectedNodeId = $(selectedNode).attr("id");
71
	//alert(divId + " selected node: " + selectedNodeId);
72
	
73
	// load the tree for the given div, passing in the other filtered values
74
	$("#" + divId).load(
75
		"<%=SERVLET_URL%>", 
76
		{
77
			'action': "getactivedomain",
78
			'class': class,
79
			'entity': entity,
80
			'characteristic': characteristic,
81
			'protocol': protocol,
82
			'measurement': measurement
83
		},
84
		// call back function when loading finishes
85
		function(response, status, xhr) {
86
			//alert("callback for: " + divId + " selected node: " + selectedNodeId);
87
			// error
88
			if (status == "error") {
89
				var msg = "Sorry but there was an error: ";
90
				$("#error").html(msg + xhr.status + " " + xhr.statusText);
91
			}
92
 
93
			// make it a js tree
94
			$(function () {
95
				$("#" + divId)
96
					//bind calls here
97
					.jstree({
98
						"ui" : {
99
							"select_limit" : 1,
100
							"select_multiple_modifier" : "alt",
101
							"selected_parent_close" : "select_parent"//,
102
							//"initially_select" : [ selectedNodeId ]
103
						},
104
						"themes" : {
105
							"theme" : "default",
106
							"dots" : true,
107
							"icons" : false
108
						},
109
						//"core" : { "initially_open" : [ selectedNodeId ] },
110
						"search" : { "case_insensitive" : true },
111
						//"cookies" : { 
112
						//		"save_opened" : "jstree_open_" + divId,
113
						//		"save_selected" : "jstree_select_" + divId,
114
						//},
115
						"plugins" : [ 
116
							"themes", 
117
							"html_data", 
118
							"ui", 
119
							//"cookies", 
120
							"search" ]
121
					});
122
			});
123

    
124
			// enable searching on it
125
			$("#" + divId + "Search").keyup(
126
				function () {
127
					if ($("#" + divId + "Search").val().length >= 3) {
128
						// search
129
						$("#" + divId).jstree("search", $("#" + divId + "Search").val());
130
						// now prune
131
						prune(divId, "jstree-search");
132
					}
133
				});
134
			
135
			// toggle the active domain prune
136
			$("#" + divId + "Only").click(function() {
137
				doActiveDomain(divId);
138
			});	
139

    
140
			// actually prune if we should
141
			doActiveDomain(divId);
142

    
143
			// open first node always
144
			$("#" + divId).jstree("open_node", $("#" + divId).children("ul").first().children("li").first());
145
			
146
			// open to the node to last selected
147
			var nodePath = $("#" + divId).jstree("get_path", $(selectedNode));
148
			if (nodePath) {
149
				for (var index = 0; index < nodePath.length; index++) {
150
					$("#" + divId).jstree("open_node", $("#" + nodePath[index]));
151
				}
152
				// select the original node
153
				$("#" + divId).jstree("select_node", $(selectedNode), false);
154
				$("#" + divId).jstree("refresh", $(selectedNode));
155
				// TODO: scroll to selected node. 
156
				// This is supposed to be part of jsTree 1.0-rc2 but appears to be broken
157
			}
158
			
159
		});
160
}
161
/**
162
* Prunes the given tree to inlcude the given matched class 
163
**/
164
function prune(divId, matchClass) {
165

    
166
	// show all nodes (reset)
167
	$("#" + divId).find("li").show();
168
	
169
	// done if we don't have any thing to prune
170
	if (!matchClass) {
171
		return;
172
	}
173
	
174
	// get all non-matched anchor tags
175
	var nonmatches = $("#" + divId).find("a").not("." + matchClass);
176
	
177
	// get their parent nodes
178
	nonmatches = $(nonmatches).parents("li");
179

    
180
	// are there any matches under each parent node?
181
	$(nonmatches).each(
182
		function(index) {
183
			// do any chidren match?
184
			var childMatches = $(this).find("a." + matchClass);
185
			if (childMatches && childMatches.length > 0) {
186
				return true;
187
			}
188
			// parent matches?
189
			var parentMatches = $(this).parents("li").children("a." + matchClass);
190
			if (parentMatches && parentMatches.length > 0) {
191
				return true;
192
			}
193
			// hide this node if no matches under it
194
			$(this).hide();
195
		});
196
}
197
function doActiveDomain(divId) {
198
	if ($("#" + divId + "Only").is(":checked")) {
199
		// prune to active
200
		prune(divId, "bold");
201
	} else {
202
		// reset
203
		prune(divId, null);
204
	}
205
}
206
function initialize(source) {
207
	// we don't want to reload the source of the filtering request
208
	// but we do want to reload the other trees for active domains
209
	// we reload all of them if no source is given - first time the page loads
210
	if (source) {
211
		source = $(source).attr("id");
212
	}
213
	if (!source) {
214
		source = "";
215
	}
216
	if (source != 'activeEntities') {
217
		populateActiveDomain('activeEntities', 'org.ecoinformatics.sms.annotation.Entity');
218
	}
219
	if (source != 'activeCharacteristics') {
220
		populateActiveDomain('activeCharacteristics', 'org.ecoinformatics.sms.annotation.Characteristic');
221
	}
222
	if (source != 'activeProtocols') {
223
		populateActiveDomain('activeProtocols', 'org.ecoinformatics.sms.annotation.Protocol');
224
	}
225
	if (source != 'activeMeasurements') {
226
		populateActiveDomain('activeMeasurements', 'org.ecoinformatics.sms.annotation.Measurement');
227
	}
228
}
229
function select(item) {
230

    
231
	// get the selected value, stored in the title attribute of the item <a> tag
232
	var value = $(item).attr("title");
233
	//alert("value: " + value);
234
	
235
	// get the parent div so we know what kind of class it is meant to filter
236
	// this is "the first parent of the class 'select'"
237
	var parent = $(item).parents("div.select:first");
238
	//alert("parent: " + parent);
239
	
240
	// set the value for the hidden input value
241
	// the input field of class "value" will hold it, this way we don't need to know the id
242
	var input = $(parent).children("input.value");
243
	$(input).val(value);
244
	//alert("input: " + input);
245
	
246
	// set it in the search field
247
	var treeInstance = $(item).parents("div.jstree:first");
248
	var shortName = $(item).parent().attr("id");
249
	$("#" + $(treeInstance).attr("id") + "Search").val(shortName)
250

    
251
	// refresh the search results
252
	doSearch($("#searchForm").get(0));
253
	
254
	// refresh the other trees for active domain after this filtering action
255
	initialize($(parent).children("div"));
256
}
257
function doSearch(formObj) {
258
	// set the hidden parameters based on the current state of the form
259
	checkSearch(formObj);
260
	
261
	// start the busy indicator
262
	$("#searchResults").busy(
263
			{
264
				position	: 'left', 
265
				offset		: -30, 
266
				hide		: true, 
267
				img			: "<%=STYLE_SKINS_URL%>/semtools/images/busy.gif" 
268
			});
269
	
270
	//load the results
271
	$("#searchResults").load(
272
		"<%=SERVLET_URL%>" + " #content_wrapper",
273
		$(formObj).serialize(),
274
		// call back function when loading finishes
275
		function(response, status, xhr) {
276
			if (status == "error") {
277
				var msg = "Sorry but there was an error performing the search: ";
278
				$("#error").html(msg + xhr.status + " " + xhr.statusText);
279
			}
280
			// collapsible search results?
281
			$(function() {
282
				$('.accordian').click(function() {
283
					$(this).next().slideToggle("slow");
284
					return false;
285
				}).next().hide();
286
			});
287
			
288
			// stop the busy indicator
289
			$("#searchResults").busy("hide");
290
		});
291
		
292
	return false;
293
	
294
}
295
function clearForm() {
296
	// clear the form values
297
	$('#searchForm').get(0).reset();
298
	// clear each of the tree selections
299
	$(".jstree").each(function(index) {
300
		$(this).jstree("deselect_all");
301
	});
302
	$("input.value").each(function(index) {
303
		$(this).val("");
304
	});
305
	// reload the trees
306
	initialize();
307
	// reload the search results
308
	//alert($('#searchForm').get(0));
309
	doSearch($('#searchForm').get(0));
310
}
311
/**
312
 * Perform this when the page first loads
313
 */
314
function pageLoad() {
315
	initialize();
316
	doSearch($('#searchForm').get(0));
317
}
318
function donothing() {}
319
--></script>
320

    
321
</head>
322
<body onload="pageLoad()">
323
<script language="javascript">
324
	insertTemplateOpening("<%=CONTEXT_URL%>");
325
</script>
326

    
327
<div id="content_wrapper">
328
 
329
<h2>Annotation-based search</h2>
330

    
331
<div id="error">
332
	<!-- error messages here -->
333
</div>
334

    
335
<!-- set up the tabs -->
336
<script>
337
	$(function() {
338
		$("#searchTabs").tabs();
339
		$("#searchTabs").tabs("add", "#ecpTab", "Entity, Characteristic, Protocol");
340
		$("#searchTabs").tabs("add", "#measurementTab", "Measurement");
341
		$("#searchTabs").tabs("add", "#optionsTab", "Options");
342
	});
343
</script>
344

    
345
<form method="POST" 
346
		action="<%=SERVLET_URL%>" 
347
		target="_top" 
348
		id="searchForm" 
349
		name="searchForm" 
350
		onSubmit="return doSearch(this)">
351
	<input name="query" type="hidden" />
352
	<input name="qformat" value="semtools" type="hidden" />
353
	<input name="includeHeader" value="false" type="hidden" />
354
	<input name="action" value="semquery" type="hidden" />
355

    
356
	<!-- tabs for the search interface -->		
357
	<div id="searchTabs">
358
		<!-- place holder for ui tabs -->
359
		<ul></ul>
360
	
361
		<!-- other criteria tabs -->
362
		<div id="ecpTab">
363
			<table>
364
				<tr>
365
					<td>
366
						<table class="subGroup subGroup_border">
367
							
368
							<tr>
369
								<th><p>Find observations of</p></th>
370
							</tr>
371
							<tr>
372
								<td>
373
									<input type="text" id="activeEntitiesSearch" />
374
									<input type="checkbox" id="activeEntitiesOnly" title="Show only active concepts" />
375
									<div class="select">
376
										<div id="activeEntities" class="activeTree">
377
											<p>loading...</p>
378
										</div>
379
										<input type="hidden" class="value" name="activeEntitiesValue" id="activeEntitiesValue"/>
380
										<input type="hidden" name="activeEntitiesClass" id="activeEntitiesClass" value="http://ecoinformatics.org/oboe/oboe.1.0/oboe-core.owl#Entity"/>
381
									</div>
382
								</td>
383
							</tr>
384
						</table>
385
					</td>
386
					<td>
387
						<table class="subGroup subGroup_border">
388
							<tr>
389
								<th><p>with measurements of</p></th>
390
							</tr>
391
							<tr>
392
								<td>
393
									<input type="text" id="activeCharacteristicsSearch" />
394
									<input type="checkbox" id="activeCharacteristicsOnly" title="Show only active concepts" />
395
									<div class="select">
396
										<div id="activeCharacteristics" class="activeTree">
397
											<p>loading...</p>
398
										</div>
399
										<input type="hidden" class="value" name="activeCharacteristicsValue" id="activeCharacteristicsValue"/>
400
										<input type="hidden" name="activeCharacteristicsClass" id="activeCharacteristicsClass" value="http://ecoinformatics.org/oboe/oboe.1.0/oboe-core.owl#Characteristic"/>
401
									</div>
402
								</td>
403
							</tr>
404
						</table>
405
					</td>
406
					<td>
407
						<table class="subGroup subGroup_border">
408
							<tr>
409
								<th><p>using procedures outlined by</p></th>
410
							</tr>
411
							<tr>
412
								<td>
413
									<input type="text" id="activeProtocolsSearch" />
414
									<input type="checkbox" id="activeProtocolsOnly" title="Show only active concepts" />
415
									<div class="select">
416
										<div id="activeProtocols" class="activeTree">
417
											<p>loading...</p>
418
										</div>
419
										<input type="hidden" class="value" name="activeProtocolsValue" id="activeProtocolsValue" />
420
										<input type="hidden" name="activeProtocolsClass" id="activeProtocolsClass" value="http://ecoinformatics.org/oboe/oboe.1.0/oboe-core.owl#Protocol"/>
421
									</div>
422
								</td>
423
							</tr>
424
						</table>
425
					</td>
426
				</tr>
427
			</table>
428
		</div>
429
		
430
		<!-- measurement -->
431
		<div id="measurementTab">
432
			<table class="subGroup subGroup_border onehundred_percent">
433
				
434
				<tr>
435
					<th><p>a template that defines Entity, Characteristic, Standard, and/or Protocol</p></th>
436
				</tr>
437
				
438
				<tr>
439
					<td>
440
						<input type="text" id="activeMeasurementsSearch" />
441
						Only active? <input type="checkbox" id="activeMeasurementsOnly" title="Show only active concepts"/>
442
						<div class="select">
443
							<div id="activeMeasurements" class="activeTree" style="width: 100%">
444
								<p>loading...</p>
445
							</div>
446
							<input type="hidden" class="value" name="activeMeasurementsValue" id="activeMeasurementsValue"/>
447
							<input type="hidden" name="activeMeasurementsClass" id="activeMeasurementsClass" value="http://ecoinformatics.org/oboe/oboe.1.0/oboe-core.owl#Measurement"/>
448
						</div>
449
					</td>
450
				</tr>
451
			</table>
452
		</div>
453
		
454
		<!-- query options -->
455
		<div id="optionsTab">
456
			<table class="group group_border">
457
				<tr>
458
					<th colspan="2">
459
						<p>
460
							Locate <b>data packages</b> that have been semantically annotated within the observation model by
461
							selecting concepts from OBOE extension ontologies
462
						</p>
463
					</th>
464
				</tr>
465
				
466
				<tr>
467
					
468
					<td colspan="1">Match All? <input type="checkbox" name="matchAll" checked="checked"/></td>
469
				
470
					<td colspan="1">From same Observation? <input type="checkbox" name="strict"/></td>
471
				</tr>
472
				
473
			</table>
474
		</div>	
475
					
476
	</div>
477
	
478
	<br/>
479
	
480
	<!-- search results here -->	
481
	<table class="subGroup subGroup_border onehundred_percent">
482
		<tr>
483
			<th>
484
				Search Results
485
				<input type="reset" value="Clear" onclick="clearForm()"/>
486
			</th>
487
		</tr>
488
		<tr>
489
			<td>
490
				<div id="searchResults">
491
				No query has been specified	
492
				</div>
493
			</td>
494
		</tr>
495
	</table>	
496

    
497
</form>
498

    
499

    
500

    
501
<!-- Included default search/login -->
502
<% if ( PropertyService.getProperty("spatial.runSpatialOption").equals("true") ) { %>
503
<script language="javascript">
504
	insertMap("<%=CONTEXT_URL%>");
505
</script>
506
<br/>
507
<% } %>
508
  
509
<script language="javascript">
510
	insertSearchBox("<%=CONTEXT_URL%>");
511
	insertLoginBox("<%=CONTEXT_URL%>");	
512
</script>
513

    
514
</div>
515

    
516
<script language="javascript">
517
	insertTemplateClosing("<%=CONTEXT_URL%>");
518
</script>
519

    
520
</body>
521
</html>
(5-5/14)