Project

General

Profile

1
/*
2
License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
3
$Id: $
4
*/
5

    
6
// Ensure this object's dependencies are loaded.
7
mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
8

    
9
// For customised searching/loading indication
10
httpStatusMsg = ['uninitialized','searching','loaded','building results list','completed'];
11

    
12
/**
13
 * Display a Catalog Search form.
14
 * @constructor
15
 * @base WidgetBaseXSL
16
 * @param widgetNode  The widget's XML object node from the configuration document.
17
 * @param model       The model object that this widget belongs to.
18
 */
19
function CatalogSearchForm(widgetNode, model) {
20
  WidgetBaseXSL.apply(this,new Array(widgetNode, model));
21

    
22
  this.targetContext         = this.getProperty("mb:targetContext");
23
  this.wrsUrl                = this.getProperty("mb:wrsUrl");
24
  this.wrsServiceAssociation = this.getProperty("mb:wrsServiceAssociation");
25
  this.convert2ContextXsl    = this.getProperty("mb:convert2ContextXsl");
26
  this.queryXsl              = this.getProperty("mb:queryXsl");
27

    
28
  this.httpPayload = new Object();
29
  this.httpPayload.url = this.wrsUrl;
30
  this.httpPayload.method = "post";
31
  
32
  this.mapModel = this.getProperty("mb:mapModel") || model.id;
33

    
34
  /**
35
   * Refreshes the form onblur handlers when this widget is painted.
36
   * @param objRef Pointer to this CurorTrack object.
37
   */
38
  this.postPaint = function() {
39
    //config.objects[this.mapModel].addListener('aoi', this.displayAoiCoords, this);
40

    
41
    this.searchForm = document.getElementById(this.formName);
42
    this.searchForm.parentWidget = this;
43
    //this.searchForm.westCoord.model = this.model;
44
    //this.searchForm.northCoord.model = this.model;
45
    //this.searchForm.eastCoord.model = this.model;
46
    //this.searchForm.southCoord.model = this.model;
47
    this.searchForm.onkeypress = this.handleKeyPress;
48

    
49
  }
50

    
51
  /**
52
   * Output the AOI coordinates to the associated form input elements.  This
53
   * method is registered as an AOI listener on the context doc.
54
   * @param objRef Pointer to this searchForm object.
55
   */
56
  //CatalogSearchForm.prototype.displayAoiCoords = function(objRef) {
57
    //var aoi = config.objects[objRef.mapModel].getParam("aoi");
58
    //objRef.searchForm.westCoord.value = aoi[0][0];
59
    //objRef.searchForm.northCoord.value = aoi[0][1];
60
    //objRef.searchForm.eastCoord.value = aoi[1][0];
61
    //objRef.searchForm.southCoord.value = aoi[1][1];
62

    
63
  //}
64

    
65
  /**
66
   * Handles user input from the form element.  This is an onblur handler for 
67
   * the input elements.
68
   */
69
  CatalogSearchForm.prototype.setAoi = function() {
70
//    var aoi = config.objects[this.mapModel].getParam("aoi");
71
//    if (aoi) {
72
//      var ul = aoi[0];
73
//      var lr = aoi[1];
74
//      switch(this.name) {
75
//        case 'westCoord':
76
//          ul[0] = this.value;
77
//          break;
78
//        case 'northCoord':
79
//          ul[1] = this.value;
80
//          break;
81
//        case 'eastCoord':
82
//          lr[0] = this.value;
83
//          break;
84
//        case 'southCoord':
85
//          lr[1] = this.value;
86
//          break;
87
//      }
88
//      config.objects[this.mapModel].setParam("aoi",new Array(ul,lr) );
89
//    }
90
  }
91

    
92
/**
93
 * Change the AOI coordinates from select box choice of prefined locations
94
 * @param bbox the bbox value of the location keyword chosen
95
 */
96
  CatalogSearchForm.prototype.setLocation = function(bbox) {
97
    var bboxArray = new Array();
98
    bboxArray     = bbox.split(",");
99
    var ul = new Array(parseFloat(bboxArray[0]),parseFloat(bboxArray[2]));
100
    var lr = new Array(parseFloat(bboxArray[1]),parseFloat(bboxArray[3]));
101
    config.objects[this.mapModel].setParam("aoi",new Array(ul,lr));
102

    
103
  }
104

    
105

    
106
  /**
107
   * Build and send a catalog query. The results will be inserted into the
108
   * targetModel which will trigger an event to handleResponse().
109
   * 
110
   * @return none 
111
   */
112
  CatalogSearchForm.prototype.doSelect = function() {
113
    // Register for an event sent after the catalog query has finished
114

    
115
    if(!this.initialized){
116
      this.targetModel.addListener("loadModel",this.handleResponse,this);
117
      this.xslProcessor = new XslProcessor(this.convert2ContextXsl);
118
      this.initialized=1;
119
    }
120
    
121
    // call buildQuery method to read form values, put them into the model
122
    // and perform an XSL translation to get the WRS Query
123
    var wrsQueryXML = this.buildQuery();
124
    
125
    // POST the query to the WRS Service configured in config.xml (wrsUrl)
126
    this.httpPayload.postData= wrsQueryXML;
127
    this.targetModel.transactionType="insert";
128
    this.targetModel.newRequest(this.targetModel,this.httpPayload);
129
    
130
    // Load the new model
131
    // Disabled, otherwise the loading indicator doesn't work
132
    //this.targetModel.callListeners("loadModel");
133
    
134
    // Activate the loading indicator
135
    this.targetModel.callListeners("refresh");
136

    
137
  }
138

    
139
  /**
140
   * Builds WRS Catalog query 
141
   * returns: WRS Query XML (string)
142
   * 
143
   * @return wrsQueryXML A textual representation of the WRS Query XML
144
   */
145
  CatalogSearchForm.prototype.buildQuery = function() {
146
    // Get the reference to the form
147
    this.searchForm = document.getElementById(this.formName);
148
         
149
    // Fill the model with the values needed for building the query
150
    // TBD: This is not a correct way to address the model, since the form values will disappear when
151
    //      the model changes. View needs to correspond to the model.
152

    
153
    // added empty string '' to prevent IE from crashing on empty/null values
154
    this.model.setXpathValue(this.model, "/filter/keywords", this.searchForm.keywords.value + '', false);
155
    this.model.setXpathValue(this.model, "/filter/servicetype", this.searchForm.serviceType.value + '', false);
156
    this.model.setXpathValue(this.model, "/filter/serviceassociation", this.wrsServiceAssociation + '', false);
157

    
158
	  // determine the BBox
159
    var aoi = config.objects[this.mapModel].getParam("aoi");
160
    var bboxStr = "";
161
    if (aoi) {
162
      // a bbox was set in the map pane
163
      bboxStr = aoi[0][0]+","+aoi[1][1]+" "+aoi[1][0]+","+aoi[0][1];
164
    } else {
165
      // no bbox was set, use the bbox of the map model
166
      var bbox = config.objects[this.mapModel].getBoundingBox();
167
      bboxStr = bbox[0]+","+bbox[1]+" "+bbox[2]+","+bbox[3];
168
    }
169

    
170
    // Add location based filter (BBOX)
171
    // TBD: uncomment this line below when WRS filtering works OK
172
    //this.model.setXpathValue(this.model, "/filter/location", bboxStr, false);
173

    
174
    // Load the XSL to generate the WRS Query
175
    //this.wrsQuery=new XslProcessor(baseDir+"/tool/xsl/wrs_Query.xsl");
176
    var queryProcessor = new XslProcessor(this.queryXsl);
177
    
178
    // Add filter to XSL as a parameter
179
    queryProcessor.setParameter("filter", this.model.doc);
180

    
181
    // Do the actual XSL translation to generate the WRS Query
182
    var wrsQueryXML = queryProcessor.transformNodeToString(this.model.doc);
183
    return wrsQueryXML;
184

    
185
  }
186

    
187
  /**
188
   * Convert the response of a Catalog Query into an OWSContext document
189
   * so that it can be processed.
190
   * Called after the response from a Catalog query has been received and 
191
   * populated in the targetModel.
192
   * @param objRef Pointer to widget object.
193
   */
194
  CatalogSearchForm.prototype.handleResponse = function(objRef) {
195

    
196
    var newContext=objRef.xslProcessor.transformNodeToObject(objRef.targetModel.doc);
197

    
198
    window.config.objects[objRef.targetContext].setModel(
199
      window.config.objects[objRef.targetContext],
200
      newContext);
201
  }
202

    
203
  //set some properties for the form output
204
  this.formName = "WebServiceForm_" + mbIds.getId();
205
  this.stylesheet.setParameter("formName", this.formName);
206
}
(1-1/19)