(function($)
{
    var settings;
    var container;
    var layer_style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);

    OpenLayers.Control.Hover = OpenLayers.Class(OpenLayers.Control,
    {
                defaultHandlerOptions:
                {
                    'delay': 500,
                    'pixelTolerance': 15,
                    'stopMove': false
                },
                initialize: function(options)
                {
                    this.handlerOptions = OpenLayers.Util.extend(
                        {}, this.defaultHandlerOptions
                    );
                    OpenLayers.Control.prototype.initialize.apply(
                        this, arguments
                    );
                    this.handler = new OpenLayers.Handler.Hover(
                        this,
                        {'pause': this.onPause, 'move': this.onMove},
                        this.handlerOptions
                    );
                    if (geoinfo.vars.vector_l_animate == null)
                    {
                        geoinfo.vars.vector_l_animate = new OpenLayers.Layer.Vector("anim_info", {style: layer_style});
                        settings.map.addLayer(geoinfo.vars.vector_l_animate);
                    }
                },
                onPause: function(evt)
                {
                   if (settings.map.getZoom() >= settings.minZoom && settings.map.getZoom() <= settings.maxZoom  )
                   {
                      geoinfo.info(evt);
                   }
                },
                onMove: function(evt)
                {
                    $('body').css("cursor","default");
                    geoinfo.vars.m = null;
                    if (geoinfo.vars.vector_l_animate != null)
                    {
                        geoinfo.vars.vector_l_animate.destroyFeatures();
                    }

                    if (geoinfo.vars.popup != null)
                    {
                        settings.map.removePopup(geoinfo.vars.popup)
                        geoinfo.vars.popup = null;
                    }
                }
    });


    $.fn.info = function($options)
    {
        container = this;
        var defaults =
        {
            //layers:'eu_svn:streets,eu_aut:streets,eu_ben:streets,eu_bgr:streets,eu_blk:streets,eu_blt:streets,eu_cze:streets,eu_deu:streets,eu_esp:streets,eu_fra:streets,eu_gbr:streets,eu_grc:streets,eu_hrv:streets,eu_hun:streets,eu_ita:streets,eu_mub:streets,eu_pol:streets,eu_rou:streets,eu_rus:streets,eu_scn:streets,eu_srb:streets,eu_svk:streets',
            layers:'svn_group,poi_slo_group',
            fields:{'st_name':'name','polygon_nm':'name','railway_nm':'name','poi_name':'name'},
            minZoom:3,
            maxZoom:10
        };
        settings = $.extend({}, defaults, $options);
        var control =  new OpenLayers.Control.Hover({
                        handlerOptions: {
                            'delay': 200
                        }
                    });
        
        settings.map.addControl(control);
        control.activate();
    }

    

    //private  Variables and Methods
    geoinfo =
    {
        vars : {e:null,m:null,popup:null,vector_l_animate:null},
        parse:function(r)
        {
           infostr='';
           g =  new OpenLayers.Format.GML(
            {
            'internalProjection': new OpenLayers.Projection("EPSG:900913"),
            'externalProjection': new OpenLayers.Projection("EPSG:4326")
            }
           );
           geom = null;
           features = g.read(r.responseText);
           for(var feat in features)
           {
               
                geom =  features[feat].geometry;
                for (var j in features[feat].attributes)
                {
                   if (settings.fields[j])
                   {
                       atri=  features[feat].attributes[j];
                       infostr+="<li class='info'>"+atri+"</li>";
                   }

                }
                if (infostr.length > 0)
                {
                    this.select(geom);
                    this.vars.m = infostr;
                }
          }
          this.showHint();
          
        },
        info:function(e)
        {
             this.vars.e = e;
             var params =
                        {
                            REQUEST: "GetFeatureInfo",
                            EXCEPTIONS: "application/vnd.ogc.se_xml",
                            BBOX: settings.map.getExtent().toBBOX(),
                            X: e.xy.x,
                            Y: e.xy.y,
                            INFO_FORMAT: 'application/vnd.ogc.gml',
                            QUERY_LAYERS: settings.layers,
                            LAYERS : settings.layers,
                            Srs: 'EPSG:900913',
                            FEATURE_COUNT: 1,
                            BUFFER : 16,
                            WIDTH:   settings.map.size.w,
                            HEIGHT:  settings.map.size.h     
                        };

             OpenLayers.loadURL(settings.wms, params, this, geoinfo.parse, geoinfo.parse);
        },
        showHint:function()
        {
            lonlat =  settings.map.getLonLatFromViewPortPx(new OpenLayers.Pixel(this.vars.e.xy.x,this.vars.e.xy.y));

            if  (this.vars.m != null && this.vars.m.length > 0 && this.vars.popup == null)
            {

                this.vars.popup = new OpenLayers.Popup("InfoMap",
                           lonlat,
                           null,
                           "<div class='info'>"+this.vars.m+"</div>",
                           false);

                this.vars.popup.autoSize = true;
                this.vars.popup.setOpacity(0.5);
                settings.map.addPopup(this.vars.popup);
            }
        },
        select:function(geom)
        {
            $('body').css("cursor","help");
           
            layer_style.fillOpacity     = 0.1;
            layer_style.strokeWidth     = 6;
            layer_style.strokeColor     = "#008bae";
            layer_style.fillColor       = "#008bae";
            layer_style.cursor          = "pointer";
            layer_style.strokeOpacity   = 0.1;

          
            
            var  vector_l_animate_feature =  new OpenLayers.Feature.Vector(geom);
            this.vars.vector_l_animate.addFeatures([vector_l_animate_feature]);
        }
    };

    // Public Variables and Methods
    $.geoinfo =
    {
        getInfo:function(){}
    };

})(jQuery);



