| | 287 | // ogc:FeatureId filter |
|---|
| | 288 | var filter = this.getNodeOrChildrenByTagName(xmlNode, "FeatureId"); |
|---|
| | 289 | if (filter) { |
|---|
| | 290 | var rule = new OpenLayers.Rule.FeatureId(); |
|---|
| | 291 | for (var i=0; i<filter.length; i++) { |
|---|
| | 292 | rule.fids.push(filter[i].getAttribute("fid")); |
|---|
| | 293 | } |
|---|
| | 294 | return rule; |
|---|
| | 295 | } |
|---|
| | 296 | |
|---|
| | 297 | // ogc:And filter |
|---|
| | 298 | filter = this.getNodeOrChildrenByTagName(xmlNode, "And"); |
|---|
| | 299 | if (filter) { |
|---|
| | 300 | var rule = new OpenLayers.Rule.Logical( |
|---|
| | 301 | {type: OpenLayers.Rule.Logical.AND}); |
|---|
| | 302 | var filters = filter[0].childNodes; |
|---|
| | 303 | for (var i=0; i<filters.length; i++) { |
|---|
| | 304 | if (filters[i].nodeType == 1) { |
|---|
| | 305 | rule.children.push(this.parseFilter(filters[i])); |
|---|
| | 306 | } |
|---|
| | 307 | } |
|---|
| | 308 | return rule; |
|---|
| | 309 | } |
|---|
| | 310 | |
|---|
| | 311 | // ogc:Or filter |
|---|
| | 312 | filter = this.getNodeOrChildrenByTagName(xmlNode, "Or"); |
|---|
| | 313 | if (filter) { |
|---|
| | 314 | var rule = new OpenLayers.Rule.Logical( |
|---|
| | 315 | {type: OpenLayers.Rule.Logical.OR}) |
|---|
| | 316 | var filters = filter[0].childNodes; |
|---|
| | 317 | for (var i=0; i<filters.length; i++) { |
|---|
| | 318 | if (filters[i].nodeType == 1) { |
|---|
| | 319 | rule.children.push(this.parseFilter(filters[i])); |
|---|
| | 320 | } |
|---|
| | 321 | } |
|---|
| | 322 | return rule; |
|---|
| | 323 | } |
|---|
| | 324 | |
|---|
| | 325 | // ogc:Not filter |
|---|
| | 326 | filter = this.getNodeOrChildrenByTagName(xmlNode, "Not"); |
|---|
| | 327 | if (filter) { |
|---|
| | 328 | var rule = new OpenLayers.Rule.Logical( |
|---|
| | 329 | {type: OpenLayers.Rule.Logical.NOT}); |
|---|
| | 330 | rule.children.push(this.parseFilter(filter[0])); |
|---|
| | 331 | return rule; |
|---|
| | 332 | } |
|---|
| | 333 | |
|---|
| | 334 | // Comparison filters |
|---|
| | 335 | for (var type in this.TYPES) { |
|---|
| | 336 | var filter = this.getNodeOrChildrenByTagName(xmlNode, type); |
|---|
| | 337 | if (filter) { |
|---|
| | 338 | filter = filter[0]; |
|---|
| | 339 | var rule = new OpenLayers.Rule.Comparison({ |
|---|
| | 340 | type: OpenLayers.Rule.Comparison[this.TYPES[type]], |
|---|
| | 341 | property: this.parseProperty( |
|---|
| | 342 | filter, this.ogcns, "PropertyName")}); |
|---|
| | 343 | // ogc:PropertyIsBetween |
|---|
| | 344 | if (this.TYPES[type] == "BETWEEN") { |
|---|
| | 345 | rule.lowerBoundary = this.parseProperty( |
|---|
| | 346 | filter, this.ogcns, "LowerBoundary"); |
|---|
| | 347 | rule.upperBoudary = this.parseProperty( |
|---|
| | 348 | filter, this.ogcns, "UpperBoundary"); |
|---|
| | 349 | } else { |
|---|
| | 350 | rule.value = this.parseProperty( |
|---|
| | 351 | filter, this.ogcns, "Literal"); |
|---|
| | 352 | // ogc:PropertyIsLike |
|---|
| | 353 | if (this.TYPES[type] == "LIKE") { |
|---|
| | 354 | var wildCard = filter.getAttribute("wildCard"); |
|---|
| | 355 | var singleChar = filter.getAttribute("singleChar"); |
|---|
| | 356 | var escape = filter.getAttribute("escape"); |
|---|
| | 357 | rule.value2regex(wildCard, singleChar, escape); |
|---|
| | 358 | } |
|---|
| | 359 | } |
|---|
| | 360 | return rule; |
|---|
| | 361 | } |
|---|
| | 362 | } |
|---|
| | 363 | |
|---|
| | 364 | // if we get here, the filter was empty |
|---|
| | 365 | return new OpenLayers.Rule(); |
|---|
| | 366 | }, |
|---|
| | 367 | |
|---|
| | 368 | /** |
|---|
| | 369 | * Method: getNodeOrChildrenByTagName |
|---|
| | 370 | * Convenience method to get a node or its child nodes, but only |
|---|
| | 371 | * those matching a tag name. |
|---|
| | 372 | * |
|---|
| | 373 | * Returns: |
|---|
| | 374 | * {Array(<DOMElement>)} or null if no matching content is found |
|---|
| | 375 | */ |
|---|
| | 376 | getNodeOrChildrenByTagName: function(xmlNode, tagName) { |
|---|
| 290 | | // ogc:FeatureId filter |
|---|
| 291 | | var fidFilter = (nodeName == "FeatureId") ? |
|---|
| 292 | | xmlNode : |
|---|
| 293 | | this.getElementsByTagNameNS(xmlNode, this.ogcns, "FeatureId"); |
|---|
| 294 | | if (fidFilter && fidFilter.length > 0) { |
|---|
| 295 | | var rule = new OpenLayers.Rule.FeatureId(); |
|---|
| 296 | | for (var i=0; i<fidFilter.length; i++) { |
|---|
| 297 | | rule.fids.push(fidFilter[i].getAttribute("fid")); |
|---|
| 298 | | } |
|---|
| 299 | | return rule; |
|---|
| 300 | | } |
|---|
| 301 | | |
|---|
| 302 | | // ogc:And filter |
|---|
| 303 | | var andFilter = (nodeName == "And") ? |
|---|
| 304 | | xmlNode : |
|---|
| 305 | | this.getElementsByTagNameNS(xmlNode, this.ogcns, "And"); |
|---|
| 306 | | if (andFilter.length > 0) { |
|---|
| 307 | | andFilter = andFilter[0]; |
|---|
| 308 | | } |
|---|
| 309 | | if (andFilter.childNodes && andFilter.parentNode == xmlNode) { |
|---|
| 310 | | var rule = new OpenLayers.Rule.Logical( |
|---|
| 311 | | {type: OpenLayers.Rule.Logical.type.AND}); |
|---|
| 312 | | var filters = andFilter.childNodes; |
|---|
| 313 | | for (var i=0; i<filters.length; i++) { |
|---|
| 314 | | if (filters[i].nodeType == 1) { |
|---|
| 315 | | rule.children.push(this.parseFilter(filters[i])); |
|---|
| 316 | | } |
|---|
| 317 | | } |
|---|
| 318 | | return rule; |
|---|
| 319 | | } |
|---|
| 320 | | |
|---|
| 321 | | // ogc:Or filter |
|---|
| 322 | | var orFilter = (nodeName == "Or") ? |
|---|
| 323 | | xmlNode : |
|---|
| 324 | | this.getElementsByTagNameNS(xmlNode, this.ogcns, "Or"); |
|---|
| 325 | | if (orFilter.length > 0) { |
|---|
| 326 | | orFilter = orFilter[0]; |
|---|
| 327 | | } |
|---|
| 328 | | if (orFilter.childNodes && orFilter.parentNode == xmlNode) { |
|---|
| 329 | | var rule = new OpenLayers.Rule.Logical( |
|---|
| 330 | | {type: OpenLayers.Rule.Logical.type.OR}) |
|---|
| 331 | | var filters = orFilter.childNodes; |
|---|
| 332 | | for (var i=0; i<filters.length; i++) { |
|---|
| 333 | | if (filters[i].nodeType == 1) { |
|---|
| 334 | | rule.children.push(this.parseFilter(filters[i])); |
|---|
| 335 | | } |
|---|
| 336 | | } |
|---|
| 337 | | return rule; |
|---|
| 338 | | } |
|---|
| 339 | | |
|---|
| 340 | | // ogc:Not filter |
|---|
| 341 | | var notFilter = (nodeName == "Not") ? |
|---|
| 342 | | xmlNode : |
|---|
| 343 | | this.getElementsByTagNameNS(xmlNode, this.ogcns, "Not"); |
|---|
| 344 | | if (notFilter.length > 0) { |
|---|
| 345 | | notFilter = notFilter[0]; |
|---|
| 346 | | } |
|---|
| 347 | | if (notFilter.childNodes && notFilter.parentNode == xmlNode) { |
|---|
| 348 | | var rule = new OpenLayers.Rule.Logical( |
|---|
| 349 | | {type: OpenLayers.Rule.Logical.type.NOT}); |
|---|
| 350 | | rule.children.push(this.parseFilter(notFilter)); |
|---|
| 351 | | return rule; |
|---|
| 352 | | } |
|---|
| 353 | | |
|---|
| 354 | | // Comparison filters |
|---|
| 355 | | for (var i in OpenLayers.Rule.Comparison.type) { |
|---|
| 356 | | // calculate the rule node name |
|---|
| 357 | | var type = OpenLayers.String.camelize("-property-is-"+ |
|---|
| 358 | | i.replace( |
|---|
| 359 | | /_/g, "-").toLowerCase()); |
|---|
| 360 | | var comparisonFilter = (nodeName == type) ? |
|---|
| 361 | | xmlNode : |
|---|
| 362 | | this.getElementsByTagNameNS(xmlNode, this.ogcns, type); |
|---|
| 363 | | if (comparisonFilter.length > 0) { |
|---|
| 364 | | comparisonFilter = comparisonFilter[0]; |
|---|
| 365 | | } |
|---|
| 366 | | if (comparisonFilter.childNodes) { |
|---|
| 367 | | var rule = new OpenLayers.Rule.Comparison({ |
|---|
| 368 | | type: OpenLayers.Rule.Comparison.type[i], |
|---|
| 369 | | property: this.parseProperty( |
|---|
| 370 | | comparisonFilter, this.ogcns, "PropertyName")}); |
|---|
| 371 | | // ogc:PropertyIsBetween |
|---|
| 372 | | if (OpenLayers.Rule.Comparison.type[i] == |
|---|
| 373 | | OpenLayers.Rule.Comparison.type.BETWEEN) { |
|---|
| 374 | | rule.lowerBoundary = this.parseProperty( |
|---|
| 375 | | comparisonFilter, this.ogcns, "LowerBoundary"); |
|---|
| 376 | | rule.upperBoudary = this.parseProperty( |
|---|
| 377 | | comparisonFilter, this.ogcns, "UpperBoundary"); |
|---|
| 378 | | } else { |
|---|
| 379 | | rule.value = this.parseProperty( |
|---|
| 380 | | comparisonFilter, this.ogcns, "Literal"); |
|---|
| 381 | | // ogc:PropertyIsLike |
|---|
| 382 | | if (OpenLayers.Rule.Comparison.type[i] == |
|---|
| 383 | | OpenLayers.Rule.Comparison.type.LIKE) { |
|---|
| 384 | | var wildCard = comparisonFilter.getAttribute("wildCard"); |
|---|
| 385 | | var singleChar = comparisonFilter.getAttribute("singleChar"); |
|---|
| 386 | | var escape = comparisonFilter.getAttribute("escape"); |
|---|
| 387 | | rule.value2regex(wildCard, singleChar, escape); |
|---|
| 388 | | } |
|---|
| 389 | | } |
|---|
| 390 | | return rule; |
|---|
| 391 | | } |
|---|
| 392 | | } |
|---|
| 393 | | |
|---|
| 394 | | // if we get here, the filter was empty |
|---|
| 395 | | return new OpenLayers.Rule(); |
|---|
| | 381 | if (nodeName == tagName) { |
|---|
| | 382 | return [xmlNode]; |
|---|
| | 383 | } else { |
|---|
| | 384 | var nodelist = this.getElementsByTagNameNS( |
|---|
| | 385 | xmlNode, this.ogcns, tagName); |
|---|
| | 386 | } |
|---|
| | 387 | |
|---|
| | 388 | // make a new list which only contains matching child nodes |
|---|
| | 389 | if (nodelist.length > 0) { |
|---|
| | 390 | var node; |
|---|
| | 391 | var list = []; |
|---|
| | 392 | for (var i=0; i<nodelist.length; i++) { |
|---|
| | 393 | node = nodelist[i]; |
|---|
| | 394 | if (node.parentNode == xmlNode) { |
|---|
| | 395 | list.push(node); |
|---|
| | 396 | } |
|---|
| | 397 | } |
|---|
| | 398 | return list.length > 0 ? list : null; |
|---|
| | 399 | } |
|---|
| | 400 | |
|---|
| | 401 | return null; |
|---|