/**
 * Copyright (c) 2008-2010 The Open Source Geospatial Foundation
 *
 * Published under the BSD license.
 * See http://svn.geoext.org/core/trunk/geoext/license.txt for the full text
 * of the license.
 */

/** api: example[wms-tree]
 *  WMS Capabilities Tree
 *  ---------------------
 *  Create a tree loader from WMS capabilities documents.
 */
var tree, mapPanel;

Ext.onReady(function() {
   var extent = new OpenLayers.Bounds(59999.999999998,5091176.4705883,684999.99999986,5458823.5294117);
   var map = new OpenLayers.Map('map', {projection: 'epsg:32633', units: 'm', 
                                       maxResolution: 1050.420168067, 
                                       maxExtent: extent,
                                       restrictedExtent: extent, 
                                       numZoomLevels: 3, controls: []});
     
    map.addControl(new OpenLayers.Control.Navigation());
    map.addControl(new OpenLayers.Control.MouseDefaults());
    //map.addControl(new OpenLayers.Control.LayerSwitcher());
    map.addControl(new OpenLayers.Control.PanZoomBar({zoomWorldIcon: true, forceFixedZoomLevel: true}));

    var kompasbase = new OpenLayers.Layer.WMS( "ZAMG_Base",
            "http://wms1.zamg.ac.at/fcgi-bin/zamgbaseWMS.fcgi?", {layers: 'zamgbase', format: 'pngagg' },
            {singleTile: true, ratio: 1.0} );
    var kompasoverlay = new OpenLayers.Layer.WMS( "ZAMGOverlay",
            "http://wms1.zamg.ac.at/fcgi-bin/zamgbaseWMS.fcgi?", {layers: 'zamgoverlay', transparent: true, format: 'pngagg' },
            {singleTile: true, ratio: 1.0} );

    var activetreenode = null;
    var slider         = null;
    var times          = [];
    var selectedtime   = undefined;

    var buildAvailableTimes = function(timevalues) {
      Ext.each(timevalues, function(timevalue){
        var timeparts = timevalue.split("/");
        var startyear = parseInt(timeparts[0]);
        var endyear   = parseInt(timeparts[1]);
        var period    = (timeparts[2]) ? parseInt(timeparts[2].substring(1,3)) : undefined;

        if( period != undefined ) {
          var tmpstartyear = startyear;
          var tmpendyear   = startyear + period - 1;
          while( tmpstartyear < endyear ) {
            times.push(tmpstartyear + '/' + tmpendyear);
            tmpstartyear += period;
            tmpendyear   += period;
          }
        } else {
          times.push(startyear + '/' + endyear);
        }
      });
    }

    var root = new Ext.tree.AsyncTreeNode({
        text: 'Kompas WMS',
        expanded: true,
        loader: new GeoExt.tree.WMSCapabilitiesLoader({
            //url: '/fcgi-bin/kompasWMS.fcgi?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities',
            url: '/kompas_capabilities.php',
            layerOptions: {buffer: 0, singleTile: true, ratio: 1},
            layerParams: {'FORMAT': 'pngagg', 'TRANSPARENT': 'TRUE'},
            // customize the createNode method to add a checkbox to nodes
            createNode: function(attr) {
                attr.checked = attr.leaf ? false : undefined;
                return GeoExt.tree.WMSCapabilitiesLoader.prototype.createNode.apply(this, [attr]);
            }
        }),
        listeners: {
          'load': function(node) {
            node.expandChildNodes();
          }
        }
    });
    
    var removeKompasLayer = function(layer) {
       mapPanel.map.removeLayer(layer);
       activetreenode = null;
       Ext.get('legendgfx').hide();
       Ext.get('wmslegendgfx').set({
         src: ''
       });
       Ext.get('layertitle').update('');
       Ext.get('layerabstract').update('');
       slider.destroy();
       Ext.get('timeinfo').update('');
       times=[];
    }

    tree = new Ext.tree.TreePanel({
        border: false,
        autoScroll: true,
        root: root,
        rootVisible: false,
        renderTo: 'wmslayertree',
        //width: 185,
        height: 350,
        listeners: {
            // Add layers to the map when ckecked, remove when unchecked.
            // Note that this does not take care of maintaining the layer
            // order on the map.
            'checkchange': function(node, checked) { 
                if (checked === true) {
                    if( activetreenode != null ) {
                      activetreenode.attributes.checked  = false;
                      activetreenode.ui.checkbox.checked = false;
                      removeKompasLayer(activetreenode.attributes.layer);
                    }
                    activetreenode = node;
                    mapPanel.map.addLayer(node.attributes.layer); 
                    var layeridx = mapPanel.map.getLayerIndex(node.attributes.layer);
                    mapPanel.map.setLayerIndex(kompasoverlay, (layeridx + 1));
                    Ext.get('wmslegendgfx').set({
                      src: node.attributes.layer.metadata.styles[0].legend.href
                    });
                    Ext.get('legendgfx').show();
                    Ext.get('layertitle').update(node.attributes.layer.metadata.title);
                    Ext.get('layerabstract').update(node.attributes.layer.metadata.abstract);
                    buildAvailableTimes(node.attributes.layer.metadata.dimensions.time.values);
                    buildTimeSlider();
                    slider.focus();
                } else {
                    removeKompasLayer(activetreenode.attributes.layer);
                }
            }
        }
    });

    var buildTimeSlider = function() {
      var setTime = function(s, v) {
        activetreenode.attributes.layer.mergeNewParams({
          TIME: times[v]          
        });
        Ext.get('timeinfo').update(times[v].replace('/', ' bis '));
        selectedtime = times[v];
      };

      slider = new Ext.slider.SingleSlider({
        renderTo: 'timeslider',
        width: 595,
        value: 0,
        increment: 1,
        minValue: 0,
        maxValue: (times.length - 1),
        listeners: {
          'afterrender': function(s) {
            var value = -1;
            if( selectedtime != undefined ) {
              value = times.indexOf(selectedtime);
            }
            if( value == -1 ) {
              var deftime = activetreenode.attributes.layer.metadata.dimensions.time['default'];
              value = times.indexOf(deftime);
            }
            setTime(s, value);
            s.setValue(value);
            if( times.length > 1 ) {
              s.enable();
            } else {
              s.disable();
            }
          },
          'change': setTime
        }
      });
    };

    mapPanel = new GeoExt.MapPanel({
        border: false,
        map: map,
        layers: [
          kompasbase,
          kompasoverlay
        ],
        renderTo: 'map',
        width: 595,
        height: 350
    });
});
