﻿if (!Poseidon.Controls) {
    Poseidon.Controls = {};
}

Poseidon.Controls.Le34AddressSearch = Ext.extend(Ext.Window, {
    //style: 'background-color: transparent;',
    //bodyStyle: 'background-color: transparent; border: 0px solid transparent;',        

    layout: 'fit',
    width: 370,
    height: 150,
    resizable: false,
    closable: true,
    closeAction: 'hide',
    autoScroll: false,
    collapsible: true,
    title: 'Adressesøgning',
    addressLabel: 'Indtast adresse',
    addressNotFound: 'Den angivne adresse kunne ikke findes.',
    addressListEmpty: 'Der blev ikke fundet nogen adresser.',
    addressListEmptyText: 'Begynd indtastning',
    addressListLoadingText: 'Indlæser...',
    plain: true,

    initComponent: function () {

        var awsStore = new Ext.data.ArrayStore(
        {
            fields: ['id', 'displayName', 'x', 'y', 'isValidated', 'streetBuildingIdentifier', 'hasStreetBuildingIdentifier'],
            data: []
        });
        var config = {
            awsStore: awsStore,
            items:
            [
                {
                    xtype: 'panel',
                    layout: 'form',
                    plain: true,
                    bodyStyle: 'padding: 10px;',
                    items:
                    [
                        {
                            xtype: 'fieldset',
                            title: 'Eksempel',
                            items: [
                            {
                                xtype: 'box',
                                html: '<i>energivej 34, 2750 ballerup</i>'
                            }]
                        }, {
                            xtype: 'combo',
                            id: 'poseidon-controls-le34-address-search-combo',
                            fieldLabel: this.addressLabel,
                            displayField: 'displayName',
                            valueNotFoundText: this.addressNotFound,
                            listEmptyText: this.addressListEmpty,
                            loadingText: this.addressListloadingText,
                            emptyText: this.addressListEmptyText,
                            hideTrigger: true,
                            enableKeyEvents: true,
                            forceSelection: true,
                            anchor: '100%',
                            mode: 'local',
                            store: awsStore,
                            autoSelect: true,
                            listeners:
                            {
                                keyup: function (textfield, event) {
                                    if (event.getKey() == event.DOWN && awsStore.getCount() == 1) // pil ned
                                    {
                                        Ext.getCmp('poseidon-controls-le34-address-search-combo').select(0, true);
                                    }
                                    else if (textfield.lastQuery != textfield.getRawValue()) {
                                        this.requestSearch(textfield.getRawValue());
                                    }
                                    // hvis listen har et enkelt element, er det ellers umuligt at pile ned og vælge dette element - dette hjælper
                                    //if (event.button == 39 && awsStore.getCount()== 1) // pil ned
                                    //{
                                    //Ext.getCmp('poseidon-controls-le34-address-search-combo').select(0, true);
                                    //}

                                },
                                select: function (combo, record, index) {
                                    //this.selectEvent = true;


                                    //this.layer.destroyFeatures();
                                    //var x = record.get('x');
                                    //var y = record.get('y');
                                    //this.zoomToAddress(x, y);

                                    // The selected value might be an alias for a group of sub-addresses.
                                    // If so, a new request is needed.
                                    if (record.get('isValidated') === false) {



                                        //this.requestSearch(combo.getRawValue());

                                        if (record.get('hasStreetBuildingIdentifier') == true && record.data.displayName.indexOf(' ' + record.get('streetBuildingIdentifier') + ',') > 0) {
                                            //if (record.get('x') == record.get('x1') && record.get('x') == record.get('x2') && record.get('y') == record.get('y1') && record.get('y') == record.get('y2')) {
                                            this.selectEvent = true;
                                            this.requestSearch(combo.getRawValue());
                                        }
                                        else {
                                            this.zoomToStreet(record.data);
                                        }

                                        //else {
                                        //combo.lastQuery = record.data.displayName;
                                        //this.layer.destroyFeatures();
                                        //map.zoomToExtent(new OpenLayers.Bounds(record.data.x1, record.data.y1, record.data.x2, record.data.y2));
                                        //this.zoomToAddress(record.data.x, record.data.y);

                                        //var point = new OpenLayers.LonLat(record.data.x, record.data.y);
                                        //map.setCenter(point, (map.getZoomForResolution(map.minResolution)) - 2);



                                        //this.zoomToAddress(record.data.x, record.data.y, record.data.displayName);

                                        //this.zoomToStreet(record.data);


                                        //this.zoomToAddress(record.data.x, record.data.y);
                                        //this.requestSearch(combo.getRawValue());
                                        //}
                                    }
                                    else {
                                        //this.layer.destroyFeatures();
                                        var x = record.get('x');
                                        var y = record.get('y');
                                        var displayName = record.get('displayName');
                                        this.zoomToAddress(x, y, displayName);
                                    }
                                    combo.lastQuery = record.data.displayName;
                                },
                                scope: this
                            }
                        }
                    ]
                }
            ]
        };


        Ext.apply(this, Ext.apply(this.initialConfig, config));

        // Config object has already been applied to 'this' so properties can 
        // be overriden here or new properties (e.g. items, tools, buttons) 
        // can be added, eg:

        // Call parent (required)
        Poseidon.Controls.Le34AddressSearch.superclass.initComponent.apply(this, arguments);
    },

    requestSearch: function (searchTerm) {
        if (searchTerm && searchTerm.length > 2) {
            Ext.Ajax.request({
                url: '/Webservices/LE34AddressSearchWS.asmx/getKMSList',
                scope: this,
                jsonData:
                {
                    'userinput': searchTerm
                },
                method: 'POST',
                success: function (response, opts) {
                    response = Ext.decode(response.responseText).d;
                    response = Ext.util.JSON.decode(response);
                    this.fillSearchResults(response);
                },
                failure: function (response, opts) {
                    Ext.MessageBox.show({
                        msg: 'Der er opstået en uventet fejl i kommunikationen med Kort og Matrikelstyrelsen.',
                        buttons: Ext.MessageBox.OK,
                        icon: Ext.MessageBox.ERROR
                    });
                }
            });
        }
    },

    fillSearchResults: function (results) {
        var combo = Ext.getCmp('poseidon-controls-le34-address-search-combo');

        combo.store.removeAll();
        var recordType = combo.store.recordType;

        for (var index = 0; index < results.length; index++) {
            var result = results[index];
            // Check if the coordinate is within this case.
            //if (result.x && result.x >= map.maxExtent.left && result.x <= map.maxExtent.right && result.y && result.y >= map.maxExtent.bottom && result.y <= map.maxExtent.top) {
            var record = new recordType({
                id: index,
                displayName: result.displayName,
                x: result.x || 0,
                y: result.y || 0,
                x1: result.x1 || 0,
                y1: result.y1 || 0,
                x2: result.x2 || 0,
                y2: result.y2 || 0,
                isValidated: result.isValidated || false,
                streetName: result.streetName,
                streetBuildingIdentifier: result.streetBuildingIdentifier,
                hasStreetBuildingIdentifier: result.hasStreetBuildingIdentifier,
                postCodeIdentifier: result.postCodeIdentifier
            });
            combo.store.add(record);
            //}
        }

        if (results.length == 1 && results[0].isValidated === true) {
            if (this.selectEvent == true &&results[0].x == results[0].x1 && results[0].y == results[0].y1) {
                this.zoomToAddress(results[0].x, results[0].y, results[0].displayName);
            }
        }
        /*
        else {
        this.zoomToStreet(results[0]);
        }

        } else {
        combo.expand();
        combo.restrictHeight();
        }
        */
        else {
            combo.expand();
            combo.restrictHeight();
        }

        //reset selectEvent
        this.selectEvent = false;
    },

    afterRender: function (component) {
        Poseidon.Controls.Le34AddressSearch.superclass.afterRender.call(this);
        //load the municipality store when the tool is activated
        //Ext.getCmp('poseidon-controls-le34-address-search-combo').getStore().load();
    },
    hide: function (component) {
        Poseidon.Controls.Le34AddressSearch.superclass.hide.call(this);
        if (Ext.getCmp(this.toolbaritem).pressed) {
            Ext.getCmp(this.toolbaritem).toggle();
        }
        //delete the feature in the layer
        //this.layer.destroyFeatures();

        //visibillity
        this.layer.setVisibility(false);
    },
    show: function (component) {
        Poseidon.Controls.Le34AddressSearch.superclass.show.call(this);
        this.layer.setVisibility(true);
    },


    zoomToAddress: function (x, y, displayName) {
        this.layer.destroyFeatures();
        var maxExtent = map.getMaxExtent();
        if (maxExtent.left < x && maxExtent.right > x && maxExtent.bottom < y && maxExtent.top > y) {
            var pointGeom = new OpenLayers.Geometry.Point(x, y);
            var pointFeature = new OpenLayers.Feature.Vector(pointGeom);
            this.layer.addFeatures([pointFeature]);
            var point = new OpenLayers.LonLat(x, y);
            map.setCenter(point, (map.getZoomForResolution(map.minResolution)) - 2);
        }
        else {
            Ext.MessageBox.show({ title: 'Information', msg: displayName + ' er uden for kortområdet!', buttons: Ext.MessageBox.OK, icon: Ext.MessageBox.INFO });
        }
    },

    zoomToStreet: function (data) {
        this.layer.destroyFeatures();
        var maxExtent = map.getMaxExtent();
        if (maxExtent.left < data.x && maxExtent.right > data.x && maxExtent.bottom < data.y && maxExtent.top > data.y) {
            //var pointStreetStart = new OpenLayers.Geometry.Point(data.x1, data.y1);
            //var pointStreetFeatureStart = new OpenLayers.Feature.Vector(pointStreetStart);
            //this.layerStreet.addFeatures([pointStreetFeatureStart]);
            //var pointStreetEnd = new OpenLayers.Geometry.Point(data.x2, data.y2);
            //var pointStreetFeatureEnd = new OpenLayers.Feature.Vector(pointStreetEnd);
            //this.layerStreet.addFeatures([pointStreetFeatureStart, pointStreetFeatureEnd]);
            var llPoint = new OpenLayers.Geometry.Point(data.x1, data.y1)
            var lrPoint = new OpenLayers.Geometry.Point(data.x2, data.y1)
            var urPoint = new OpenLayers.Geometry.Point(data.x2, data.y2)
            var ulPoint = new OpenLayers.Geometry.Point(data.x1, data.y2)

            var pointList = [llPoint, lrPoint, urPoint, ulPoint, llPoint];
            var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
            var polygonStreet = new OpenLayers.Geometry.Polygon([linearRing]);
            var polygonStreetFeature = new OpenLayers.Feature.Vector(polygonStreet);


            this.layer.addFeatures([polygonStreetFeature]);

            var extent = this.layer.getDataExtent();
            if (extent) {
                //var bottom = Math.min(extent.bottom, data.y);
                //var left = Math.min(extent.left, data.x);
                //var right = Math.max(extent.right, data.x);
                //var top = Math.max(extent.top, data.y);
                //var newExtent = new OpenLayers.Bounds(left, bottom, right, top)

                //map.zoomToExtent(newExtent, false);


                map.zoomToExtent(extent, false);
            }
        }
        else {
            Ext.MessageBox.show({ title: 'Information', msg: data.displayName + ' er uden for kortområdet!', buttons: Ext.MessageBox.OK, icon: Ext.MessageBox.INFO });
        }
    }

});
