// $Id: FeatureInfo.Control.js,v 1.1.2.6 2008/07/03 07:07:28 openwereld Exp $

MappingKit.Control.FeatureInfo = OpenLayers.Class(OpenLayers.Control, {
  
  initialize: function(options) {
    options.type = OpenLayers.Control.TYPE_TOGGLE;
    
    OpenLayers.Control.prototype.initialize.apply(this, [options]);
  },
  
  activate: function() {
    //alert('activate');
    if (this.map) {
      this.map.events.register('click', this.map, this.request_info);
    }
    
    return OpenLayers.Control.prototype.activate.apply(this);
  },
  
  deactivate: function() {
    if (this.map) {
      this.map.events.unregister('click', this.map, this.request_info);
    }
    
    // clear existing feature info
    $("#featureinfo").empty();
    
    //alert('deactivate');
    return OpenLayers.Control.prototype.deactivate.apply(this);
  },
  
  request_info: function(e) {
    //alert('Feature info not implemented');
    
    //OpenLayers.Util.getElement('nodeList').innerHTML = "Loading... please wait...";
    
    // clear existing feature info
    $("#featureinfo").empty();
    
    // determine query layers
    // info formats geoserver: application/vnd.ogc.gml, text/html, text/plain
    // umn mapserver: MIME, GML.1
    var count = 0;
    MappingKit.FeatureInfo = {};
    for (var i = 0; i < this.layers.length; i++) {
      var layer = this.layers[i];
      if (layer instanceof OpenLayers.Layer.WMS
        && layer.visibility && layer.queryable) {
        
        var requestOptions = {
          REQUEST: "GetFeatureInfo",
          EXCEPTIONS: "application/vnd.ogc.se_xml",
          BBOX: this.getExtent().toBBOX(),
          X: e.xy.x,
          Y: e.xy.y,
          QUERY_LAYERS: layer.params.LAYERS,
          WIDTH: this.size.w,
          HEIGHT: this.size.h
        };
        if (layer.info_formats && layer.info_formats.length > 0) {
          requestOptions.INFO_FORMAT = layer.info_formats[0];
        }
        else {
          requestOptions.INFO_FORMAT = 'text/plain';
        }
        var url = layer.getFullRequestString(requestOptions);
        
        // Openlayers call
        //OpenLayers.loadURL(url, '', layer, MappingKit.show_info, MappingKit.fail_info);
        
        // jQuery call
        url = OpenLayers.ProxyHost + escape(url);
        MappingKit.FeatureInfo[layer.id] = { 'requestOptions': requestOptions, 'layer': layer };
        var xhr = jQuery.ajax({type: 'GET'
          , 'url': url
          , 'complete': MappingKit.complete
          , 'data': {'featureinfo_id': layer.id}
          //, 'processData': false
          , 'dataType': 'html'
        });
        
        count += 1;
      }
    }
    
    OpenLayers.Event.stop(e);
    
    if (count == 0) {
      alert(Drupal.t('No queryable layers'));
    }
  },
  
  CLASS_NAME: 'mk.Control.FeatureInfo'
});

MappingKit.complete = function(xhr, textStatus) {
  //this; // the options for this ajax request
  // extract info_format from url?
  var params = {};
  var parts = this.url.split('?');
  params.service = parts[0];
  var list = parts[1].split('&');
  for (var i = 0; i < list.length; i++) {
    var tmp = list[i].split('=');
    params[tmp[0]] = tmp[1];
  }
  var info = MappingKit.FeatureInfo[params.featureinfo_id];
  
  var str = textStatus;
  if (xhr.status == 200) {
    var text = xhr.responseText;
    
    // check if empty
    switch (info.requestOptions.INFO_FORMAT) {
    case 'text/html':
      if (text.search(/<body>\s*<\/body>/i) >= 0) {
        // empty body
        return;
      }
      break;
    default:
      if (text == 'GetFeatureInfo results:\n\n  Search returned no results.\n') {
        // no results to show
        return;
      }
      break;
    }
    
    var output = '<div class="featureinfo title">' + info.layer.name + '</div>';
    switch (info.requestOptions.INFO_FORMAT) {
    case 'text/html':
      break;
    default:
      text = '<pre>' + text + '</pre>';
    }
    output += text;
    $("#featureinfo").append(output);
  }
  else {
    // other status
    alert(Drupal.t('Error: @text (@code)', {'@text': xhr.statusText, '@code': xhr.status}));
  }
}

