lbgm.plp = {
    plplayer: null,
    plpLayerPrepared: false,
    plpPoisArray : null,
    plpSelected: null,

    init: function() {
        
    },

    preparePlpLayer: function() {
        if(!lbgm.point.pointslayerPrepared) lbgm.point.preparePointLayer();
        
        this.plplayer = new OpenLayers.Layer.Vector("PLP", {
            displayInLayerSwitcher: false,
            'transparent': true
        });
        
        lbgm.maplets.mapobject.map.addLayer(this.plplayer);
        this.plplayer.setVisibility(true);
        // Move Behind Points
        lbgm.maplets.mapobject.map.raiseLayer(this.plplayer, -1000);

        //add the second select for tooltips:
        /*var selectControl = new OpenLayers.Control.SelectFeature([lbgm.point.pointslayer, this.plplayer],
            {
                multiple: false,
                clickout: true
            }
        );

        var hoverControl = new OpenLayers.Control.SelectFeature([this.plplayer,lbgm.point.pointslayer],
            {
                hover: true,
                clickout: true,
                highlightOnly: true,
                renderIntent: "temporary",
                multiple: false,
                eventListeners: {
                    featurehighlighted: this.onHoverOn,
                    featureunhighlighted: this.onHoverOut
                }
            }
        );

        lbgm.maplets.mapobject.map.removeControl(lbgm.point.pointslayer);
        lbgm.maplets.mapobject.map.removeControl(lbgm.point.hoverControl);

        
        lbgm.maplets.mapobject.map.addControl(selectControl);
        lbgm.maplets.mapobject.map.addControl(hoverControl);
        selectControl.activate();
        hoverControl.activate();

        this.plplayer.events.on({
            "featureselected": this.onPointSelect,
            "featureunselected": this.onPointUnselect
        });*/

        this.plpLayerPrepared = true;

    },

    showLoading: function() {
        var tabPanel = Ext.getCmp('search-panel');
        if(tabPanel.getTabEl(1).id == 'search-panel__plpPanel')
            tabPanel.setActiveTab(1);

        // Show Loading
        var ld = "<div class='search-selected' style='text-align: center;'><p>Loading... <img src = 'src/images/popup_loader.gif' /></p></div>";
        Ext.get('plp-search-results').dom.innerHTML = ld;
    },

    hideLoading: function() {
        var tabPanel = Ext.getCmp('search-panel');
        if(tabPanel.getTabEl(1).id == 'search-panel__plpPanel')
            tabPanel.setActiveTab(1);
        
        Ext.get('plp-search-results').dom.innerHTML = '';
    },

    showSinglePlpByCode: function(plpcode, plpaltcode, zoomToExtent ) {

        if(zoomToExtent == undefined) zoomToExtent = false;
        
        this.showLoading();
        OpenLayers.Request.POST({
            url: 'src/php/conn/plp.conn.php',
            data: OpenLayers.Util.getParameterString({request: "loadPlpByCode", code: plpcode, altcode: plpaltcode}),
            success: function(responseObject) {
                obj = Ext.util.JSON.decode(responseObject.responseText);

                lbgm.plp.showPlps(obj.results[0].plpid, zoomToExtent);
            },
            failure: function() {
               //Ext.Msg.alert(lbgm.options.appname, 'Unable to load layout.');
            },
            headers: {
                "Content-Type": "application/x-www-form-urlencoded"
            }
        });
    },

    showPlps: function(plpids, zoomToExtent) {
        this.showLoading();
        
        // Clear All Plps
        lbgm.plp.clearPlps();
        lbgm.plp.clearSearchFields();
        this.removeSearchRes();
        
        var plpIdArr = plpids.split(",");

        var zoomlvl = 0;
        if(lbgm.maplets.mapobject.map) zoomlvl = lbgm.maplets.mapobject.getZoomLevel();

        OpenLayers.Request.POST({
            url: 'src/php/conn/plp.conn.php',
            data: OpenLayers.Util.getParameterString({request: "loadPlps", ids: plpids, zoomlevel: zoomlvl, key: lbgm.layout.key}),
            success: function(responseObject) {
               //alert(responseObject.responseText);
               obj = Ext.util.JSON.decode(responseObject.responseText);


               if(obj.success) {
                    var geoJson = new OpenLayers.Format.GeoJSON();

                    var features = new Array();
                    var plpgidArray = new Array();
                    var bounds;
                    for(var rs=0; rs<obj.results.length; rs++) {
                        var plp = obj.results[rs];

                        lbgm.plp.plpSelected = plp.plpgid;

                        var plpFeatures = geoJson.read(plp.geom);

                        plpgidArray = plpgidArray.concat(plp.plpgid);

                        for(var t=0; t<plpFeatures.length; t++) {
                            plpFeatures[t].style = {
                                strokeColor: plp.strokecolor,
                                strokeOpacity: parseFloat(plp.strokeopacity),
                                strokeWidth: parseInt(plp.strokewidth),
                                strokeLinecap: plp.strokelinecap,
                                strokeDashstyle: plp.strokedashstyle,
                                cursor: "pointer"
                            };

                            plpFeatures[t].attributes.code = plp.code;
                            plpFeatures[t].attributes.id = plp.plpgid;
                        }

                        if(plpFeatures) {
                            if(plpFeatures.constructor != Array) {
                                features = features.concat([plpFeatures]);
                            }
                            else {
                                features = features.concat(plpFeatures);
                            }
                        }

                        // ADD Description
                        lbgm.plp.hideLoading();
                        
                        var tabPanel = Ext.getCmp('search-panel');
                        if(tabPanel.getTabEl(1).id == 'search-panel__plpPanel')
                            tabPanel.setActiveTab(1);
                        //Ext.get('plp-search-results').dom.innerHTML = plp.plpdescription;
                        var tplTxt = '<tpl for="."><div class="route-desc" style="float:left; width: 100%; padding: 10px 2; font-family: tahoma; font-size: 11px;">\n\
                                                                    <span style="color:{strokecolor}; float:left; width: 15%; font-weight: bold;font-size: 15px;">{code}</span>\n\
                                                                    <span style="float:left; width: 83%;"><b>{plpname}</b><p>{plpdescription}</p></span>\n\
                                                                    <p>{zoomtoextend}</p>\n\
                                                                    <p>{toA}</p>\n\
                                                                    <p>{toB}</p>\n\
                                                                 </div></tpl>';
                        var tpl = new Ext.XTemplate(tplTxt);
                        tpl.compile();
                        lbgm.plp.removeSearchRes();
                        tpl.append('plp-search-results', plp);
                    }
                    
                    for(var i=0; i<features.length; ++i) {
                        if (!bounds) {
                            bounds = features[i].geometry.getBounds();
                        } else {
                            bounds.extend(features[i].geometry.getBounds());
                        }
                    }
                        
                    if(!lbgm.plp.plpLayerPrepared) lbgm.plp.preparePlpLayer();
                    lbgm.plp.plplayer.addFeatures(features);
                    if(zoomToExtent) lbgm.maplets.mapobject.map.zoomToExtent(bounds);

                    var displayPois = Ext.get('plpdisplaypois').dom.checked;
                    if(displayPois) {
                        for(var j=0; j<plpgidArray.length; j++) {
                            lbgm.plp.showPlpPois(plpgidArray[j]);
                        }
                    }

                    //lbgm.plp.hideLoading();
               }

            },
            failure: function() {
               //Ext.Msg.alert(lbgm.options.appname, 'Unable to load layout.');
            },
            headers: {
                "Content-Type": "application/x-www-form-urlencoded"
            }

        });
    },

    clearPlps: function() {
        //lbgm.maplets.mapobject.markers.clearMarkers();
        if(lbgm.plp.plplayer != null) {
            //this.clearPopups();

            //lbgm.point.pointslayer.clearMarkers();
            lbgm.plp.plplayer.removeFeatures(lbgm.plp.plplayer.features, null);
            lbgm.plp.clearPlpPois();            
        }
    },

    clearPlpPois: function() {
        //lbgm.maplets.mapobject.markers.clearMarkers();
        if(lbgm.point.pointslayer != null) {
            lbgm.point.clearPopups();

            //lbgm.point.pointslayer.clearMarkers();
            lbgm.point.pointslayer.removeFeatures(this.plpPoisArray, null);
            this.plpPoisArray = [];
            //alert('here');
        }
    },

    showPoiPlp: function(plpid, zoomToExtent) {
       // Clear All Plps
       lbgm.plp.clearPlps();
       lbgm.plp.clearSearchFields();
       
        var zoomlvl = 0;
        if(lbgm.maplets.mapobject.map) zoomlvl = lbgm.maplets.mapobject.getZoomLevel();

        OpenLayers.Request.POST({
            url: 'src/php/conn/plp.conn.php',
            data: OpenLayers.Util.getParameterString({request: "loadPlps", ids: plpid, zoomlevel: zoomlvl, key: lbgm.layout.key}),
            success: function(responseObject) {
               //alert(responseObject.responseText);
               obj = Ext.util.JSON.decode(responseObject.responseText);

               if(obj.success) {
                    var geoJson = new OpenLayers.Format.GeoJSON();

                    var features = new Array();
                    var plpgidArray = new Array();
                    var bounds;
                    for(var rs=0; rs<obj.results.length; rs++) {
                        var plp = obj.results[rs];
                        var plpFeatures = geoJson.read(plp.geom);
                        lbgm.plp.plpSelected = plp.plpgid;
                        plpgidArray = plpgidArray.concat(plp.plpgid);

                        for(var t=0; t<plpFeatures.length; t++) {
                            plpFeatures[t].style = {
                                strokeColor: plp.strokecolor,
                                strokeOpacity: parseFloat(plp.strokeopacity),
                                strokeWidth: parseInt(plp.strokewidth),
                                strokeLinecap: plp.strokelinecap,
                                strokeDashstyle: plp.strokedashstyle,
                                cursor: "pointer"
                            };

                            plpFeatures[t].attributes.code = plp.code;
                        }

                        if(plpFeatures) {
                            if(plpFeatures.constructor != Array) {
                                features = features.concat([plpFeatures]);
                            }
                            else {
                                features = features.concat(plpFeatures);
                            }
                        }
                    }

                    for(var i=0; i<features.length; ++i) {
                        if (!bounds) {
                            bounds = features[i].geometry.getBounds();
                        } else {
                            bounds.extend(features[i].geometry.getBounds());
                        }
                    }

                    if(!lbgm.plp.plpLayerPrepared) lbgm.plp.preparePlpLayer();
                    lbgm.plp.plplayer.addFeatures(features);
                    if(zoomToExtent) lbgm.maplets.mapobject.map.zoomToExtent(bounds);

                    var displayPois = Ext.get('plpdisplaypois').dom.checked;
                    if(displayPois) {
                        for(var j=0; j<plpgidArray.length; j++) {
                            lbgm.plp.showPlpPois(plpgidArray[j]);
                        }
                    }
               }

            },
            failure: function() {
               //Ext.Msg.alert(lbgm.options.appname, 'Unable to load layout.');
            },
            headers: {
                "Content-Type": "application/x-www-form-urlencoded"
            }

        });
    },

    showPlpPois: function(plpgid) {

        OpenLayers.Request.POST({
            url: 'src/php/conn/plp.conn.php',
            data: OpenLayers.Util.getParameterString({request: "loadPlpPois", plpgid: plpgid, key: lbgm.layout.key}),
            success: function(responseObject) {
               //alert(responseObject.responseText);
               obj = Ext.util.JSON.decode(responseObject.responseText);
               //eval(obj.results);
               
               //var features = new Array();
               var f = null;
               Ext.each(obj.results, function(poi){
                  f = lbgm.point.featureFromPoint(poi);
                  if(lbgm.plp.plpPoisArray == null) lbgm.plp.plpPoisArray = [];
                  lbgm.plp.plpPoisArray.push(f);
               });

               if(lbgm.plp.plpPoisArray != null && lbgm.plp.plpPoisArray.length > 0) {
                   if(!lbgm.point.pointslayerPrepared) lbgm.point.preparePointLayer();
                   lbgm.point.pointslayer.addFeatures(lbgm.plp.plpPoisArray);
               }

            },
            failure: function() {
               //Ext.Msg.alert(lbgm.options.appname, 'Unable to load layout.');
            },
            headers: {
                "Content-Type": "application/x-www-form-urlencoded"
            }
        });
    },

    onMouseMove: function(event) {
        lbgm.plp.plplayer.events.fallThrough = true;
    },

    onHoverOn: function(event) {
        var feature = event.feature;
        lbgm.maplets.mapobject.ttips.show({html:"<p style='font-family:tahoma;color:#333;'><b>" + feature.attributes.code + "</b></p>"});
    },

    onHoverOut: function(event) {
        lbgm.maplets.mapobject.ttips.hide();
    },

    onPointSelect: function(event) {
        
    },
    onPointUnselect: function(event) {
        //alert('closed');
    },

    removeSearchRes: function() {
        Ext.get('plp-search-results').dom.innerHTML = "";
    },

    displayNearPoints: function(obj) {
        if(obj.success) {
            this.hideLoading();

            //lbgm.point.preparePointLayer();

            var tplTxt = '<tpl for="."><div class="search-selected" id="search-selected-poi{id}">\n\
                    <div class="search-sel-close"><a href="#" onClick="lbgm.plp.removeSingleSearchPoint(\'poi{id}\');">Remove</a></div>\n\
                    <a class="search-selected-item-a" href="#" onClick="lbgm.plp.displayPointById(\'{id}\', \'{plpid}\');">\n\
                        <div class="search-selected-item">\n\
                            <p>{name} {postcode} {area} {district} {distance}</p>\n\
                        </div>\n\
                    </a>';

            if(lbgm.layout.enablenavigation == 1) {
                tplTxt += '<div class="search-sel-links"><div class="sButton">\n\
                        <a href="#" onClick="lbgm.navigation.setNaviFrom(lbgm.point.pointslayer.getFeatureById(\'poi{id}\'));lbgm.point.removeSearchPoint(\'poi{id}\');">\n\
                            <div id="sButtonCont">\n\
                                <div id="sButtonIcon"><img src="gmadmin/images/icons/flag_green.png" /></div>\n\
                                <div id="sButtonText">From Here</div>\n\
                            </div>\n\
                        </a>\n\
                     </div>\n\
                     <div class="sButton">\n\
                        <a href="#" onClick="lbgm.navigation.setNaviTo(lbgm.point.pointslayer.getFeatureById(\'poi{id}\'));lbgm.point.removeSearchPoint(\'poi{id}\');">\n\
                            <div id="sButtonCont">\n\
                                <div id="sButtonIcon"><img src="gmadmin/images/icons/flag_red.png" /></div>\n\
                                <div id="sButtonText">To Here</div>\n\
                            </div>\n\
                        </a>\n\
                     </div></div>';
            }

            tplTxt += '</div></tpl>';

            /*var tabPanel = Ext.getCmp('plp-panel');
            if(tabPanel.getTabEl(0).id == 'plp-panel__plpPanel') {
                tabPanel.setActiveTab(0);
            }*/

            var tpl = new Ext.XTemplate(tplTxt);

            tpl.compile();
            this.removeSearchRes();

            var points = obj.points;
            for(var i=0; i<points.length; i++) {
                tpl.append('plp-search-results', points[i]);
            }
        }
        else {
            Ext.Msg.alert(lbgm.options.appname, obj.reason);
        }
    },

    displayNearPois: function(obj) {
        if(obj.success) {
            this.hideLoading();
            this.clearPlps();
            this.removeSearchRes();

            var points = obj.points;
            for(var i=0; i<points.length; i++) {
                var f = lbgm.point.featureFromPoint(points[i]);

                if(lbgm.plp.plpPoisArray == null) lbgm.plp.plpPoisArray = [];
                  lbgm.plp.plpPoisArray.push(f);
            }

           if(lbgm.plp.plpPoisArray != null && lbgm.plp.plpPoisArray.length > 0) {
               if(!lbgm.point.pointslayerPrepared) lbgm.point.preparePointLayer();
               lbgm.point.pointslayer.addFeatures(lbgm.plp.plpPoisArray);
           }
        }
        else {
            Ext.Msg.alert(lbgm.options.appname, obj.reason);
        }
    },

    nearPoints: function(lonlat, displayVal) {
        if(displayVal == undefined) displayVal = "pois";

        OpenLayers.Request.POST({
            url: 'src/php/conn/rgeoc_plp.php',
            data: OpenLayers.Util.getParameterString({lat: lonlat.lat, lon: lonlat.lon, appid: lbgm.layout.appid, display: displayVal}),
            success: function(responseObject) {
               //alert(responseObject.responseText);
               obj = Ext.util.JSON.decode(responseObject.responseText);

               if(displayVal == 'pois') {
                   /* DISPLAY POIS ON MAP */
                   lbgm.plp.displayNearPois(obj);
                   //lbgm.plp.displayNearPoints(obj);
               }
               else {
                   lbgm.plp.displayNearPlp(obj);
               }
            },
            failure: function() {
               Ext.Msg.alert(lbgm.options.appname, 'Unable to identify');
               // Move it back to its original position
            },
            headers: {
                "Content-Type": "application/x-www-form-urlencoded"
            }

        });
    },

    popupNearPoints: function(pointid) {
        var feature = lbgm.point.pointslayer.getFeatureById(pointid);
        var lonlat = feature.geometry.getBounds().getCenterLonLat().clone();
        lonlat.transform(lbgm.maplets.mapobject.map.getProjectionObject(), lbgm.maplets.mapobject.map.displayProjection);
        this.nearPoints(lonlat);
    },

    displayNearPlp: function(obj) {
        if(obj.success) {
            this.hideLoading();
            
            var tplTxt = '<tpl for="."><div class="search-selected" id="search-selected-poi{id}">\n\
                                                <div class="search-selected-item">\n\
                                                    <p>{code} - To: <a href="javascript:" onClick="lbgm.plp.showSinglePlpByCode(\'{code}\', \'{altcode1}\');">{name1}</a> To: <a href="javascript:" onClick="lbgm.plp.showSinglePlpByCode(\'{code}\', \'{altcode2}\');">{name2}</a></p>\n\
                                                </div>\n\
                                            </tpl>';

            var tpl = new Ext.XTemplate(tplTxt);
            tpl.compile();
            var tabPanel = Ext.getCmp('plp-panel');
            if(tabPanel.getTabEl(0).id == 'plp-panel__plpPanel') {
                tabPanel.setActiveTab(0);
            }
            Ext.get('plp-search-results').dom.innerHTML = "<p style='margin-top: 7px; border-bottom: 1px solid #CCC;'font-size:12px;font-family:tahoma;><b>Nearest Routes</b></p>";

            for(var i=0; i<obj.routes.length; i++) {
                tpl.append('plp-search-results', obj.routes[i]);
            }
        }
        else {
            Ext.Msg.alert(lbgm.options.appname, obj.reason);
        }
    },
    
    displayPointById: function(id, plpid) {
        var conn = new Ext.data.Connection();
        conn.request({
            url: 'src/php/conn/poimarkers.conn.php',
            method: 'POST',
            params: {
                "request": "displayPointById",
                "point": id,
                "allowNavi": lbgm.layout.enablenavigation,
                key: lbgm.layout.key
            },
            success: function(responseObject) {
                obj = Ext.util.JSON.decode(responseObject.responseText);
                //eval(obj.results);
                if(obj.results != null && obj.results.length != 0) {

                    lbgm.plp.showPoiPlp(plpid, false);

                    var pointRes = obj.results[0];
                    //this.displayPoint(pointRes, true, true);
                    var feature = lbgm.point.featureFromPoint(pointRes);

                    if(lbgm.plp.plpPoisArray == null) this.plpPoisArray = [];
                    lbgm.plp.plpPoisArray.push(feature);
                    lbgm.point.displayFeature(feature, true, true, true);
                }
            },
            failure: function() {
            //Ext.Msg.alert(lbgm.options.appname, 'Unable to load layout.');
            },
            scope: this
        });
    },

    removeSingleSearchPoint: function(pointid) {
        var feat = lbgm.point.pointslayer.getFeatureById(pointid);
        if(feat != null) {
            lbgm.popup.hidePopup(pointid);
            lbgm.point.pointslayer.removeFeatures([feat], null);
            //Ext.get('search-results').dom.innerHTML = '';
        }
        Ext.get('search-selected-' + pointid).dom.innerHTML = '';

    },

    clearSearchFields: function() {
        Ext.getCmp("plpsearchbox").setValue('');
        Ext.getCmp("plpsearch").setValue('');
        Ext.getCmp("plpaltsearch").setValue('');
        Ext.getCmp("plpcategories").setValue('');
    },

    clearAll: function() {
        Ext.getCmp("plpdisplaypois").setValue(false);
        lbgm.plp.clearPlps();
        lbgm.plp.clearSearchFields();
        lbgm.plp.removeSearchRes();
        lbgm.plp.plpPoisArray = null;
        lbgm.plp.plpSelected = null;
    },

    zoomToExtend: function(plpgid) {
        if(!lbgm.plp.plpLayerPrepared) lbgm.plp.preparePlpLayer();

        var bounds = '';
        var layerfeatures = lbgm.plp.plplayer.features;

        for(var i=0; i<layerfeatures.length; ++i) {
            if(layerfeatures[i].attributes.id == plpgid) {
                bounds = layerfeatures[i].geometry.getBounds();
            }
        }

        if(bounds) lbgm.maplets.mapobject.map.zoomToExtent(bounds);
    }


    
};
