/*
    Document   : lbgm.navigation
    Created on : 13-Nov-2009, 14:28:57
    Author     : Andreas Hadjigeorgiou
    Description:
        Purpose of the stylesheet follows.
*/


lbgm.navigation = {
    naviFrom: null,
    naviTo: null,
    naviSearchFeature: null,
    naviFromNum: 0,
    naviToNum: 0,

    init: function() {
        this.naviTo = [];
    },

    setNaviFrom: function(from) {
        lbgm.popup.hidePopup(lbgm.popup.activepopupid);
        if(!lbgm.point.pointslayerPrepared) lbgm.point.preparePointLayer();

        if(this.naviFrom != null) {
            this.removeNaviFromPoint(this.naviFrom.id);
        }

        this.naviFrom = lbgm.point.cloneFeature(from, 'src/images/navigation/small_np_a.png');
        this.naviFrom.id = "naviFrom" + this.naviFrom.id ;
        this.naviFrom.style.cursor = "pointer";
        //this.naviFrom.geometry.getBounds().getCenterLonLat().transform(lbgm.maplets.mapobject.map.getProjectionObject(), lbgm.maplets.mapobject.map.displayProjection);

        this.naviFrom.attributes.oldtype = this.naviFrom.attributes.type;
        this.naviFrom.attributes.type = 'startNavi';
        this.naviFrom.attributes.instrimage = 'src/images/navigation/xlarge_np_a.png';

        lbgm.point.displayFeature(this.naviFrom, false, false, false);
        
        var tabPanel = Ext.getCmp('search-panel');

        //alert(tabPanel.getTabEl(1).id);
        if(tabPanel.getTabEl(1).id == 'search-panel__navigationPanel')
            tabPanel.setActiveTab(1);

        var selFromTpl = new Ext.XTemplate(
            '<tpl for="."><div id="naviFromDiv" class="search-selected">',
                '<div class="naviPosImg"><img src="src/images/navigation/small_np_a.png" /></div>',
                '<div class="naviPosTxt">' + from.attributes.name + '</div>',
                '<div class="naviPosRemove"><a href="#" onClick="lbgm.navigation.removeNaviFromPoint(\''+this.naviFrom.id+'\');"><img src="src/images/navigation/remove.png" /></a></div>',
             '</div></tpl>'
        );

        selFromTpl.compile();
        selFromTpl.insertFirst('navi-points', from);

        if(this.naviFrom != null && this.naviTo.length > 0) {
            this.navigate();
            this.addSwap(0);
            //Ext.get('naviToDiv0').insertBefore('<div class="naviSwap" id="swap0"><a href="#" onClick="lbgm.navigation.swap(0);"><img src="src/images/navigation/swap.png" /></a>');
        }

        // New navigation
        Ext.getCmp('mapNaviSearchFrom').disable();
        Ext.getCmp('mapNaviSearchTo').focus();
    },

    setNaviTo: function(to) {
        lbgm.popup.hidePopup(lbgm.popup.activepopupid);
        if(!lbgm.point.pointslayerPrepared) lbgm.point.preparePointLayer();

        var num = 0;//lbgm.navigation.naviTo.length; /* CHANGE THIS */
        var navToTmp = lbgm.point.cloneFeature(to, 'src/images/navigation/small_np_' + this.getToLetterFromNum(num+1) + '.png');

        navToTmp.attributes.oldtype = navToTmp.attributes.type;
        navToTmp.attributes.type = 'endNavi';
        //navToTmp.geometry.getBounds().getCenterLonLat().transform(lbgm.maplets.mapobject.map.getProjectionObject(), lbgm.maplets.mapobject.map.displayProjection);
//alert(navToTmp.id);
/**********************************************/
// Change this for multiple locations
/**********************************************/
        //this.naviTo.push(navToTmp);
        if(this.naviTo.length != 0) this.removeNaviToPoint(this.naviTo[0].id);
        this.naviTo[0] = navToTmp;
        this.naviTo[0].attributes.instrimage = 'src/images/navigation/xlarge_np_b.png';
        this.naviTo[0].id = "naviTo" + this.naviTo.id;
        this.naviTo[0].style.cursor = "pointer";
/**********************************************/

        //this.naviTo[this.naviTo.length-1].style.externalGraphic = lbgm.point.defaultIconPath;
        
        lbgm.point.displayFeature(navToTmp, false, false, false);

        var tabPanel = Ext.getCmp('search-panel');
        if(tabPanel.getTabEl(1).id == 'search-panel__navigationPanel')
            tabPanel.setActiveTab(1);

        var divTo = lbgm.navigation.naviTo.length - 1;
        var selFromTpl = new Ext.XTemplate(
             '<tpl for="."><div id="swapCont' + divTo + '"></div>\n\
               <div id="naviToDiv' + divTo + '" class="search-selected-to">',
                '<div class="naviPosImg"><img src="src/images/navigation/small_np_' + this.getToLetterFromNum(num+1) + '.png" /></div>',
                '<div class="naviPosTxt">' + to.attributes.name + '</div>',
                '<div class="naviPosRemove"><a href="#" onClick="lbgm.navigation.removeNaviToPoint(\''+this.naviTo[0].id+'\');"><img src="src/images/navigation/remove.png" /></a></div>',
             '</div></tpl>'
        );

        selFromTpl.compile();
        selFromTpl.append('navi-points', to);

        //this.toBottom();

        if(this.naviFrom != null) {
            // Call Navigation
            this.navigate();
            this.addSwap(num);
        }

        // New navigation
        Ext.getCmp('mapNaviSearchTo').disable();
        Ext.getCmp('mapNaviSearchFrom').focus();
    },

    navigate: function() {
        var from = null;

        if(this.naviTo.length > 1) {
            from = this.naviTo[this.naviTo.length-2].geometry.getBounds().getCenterLonLat().clone();
            this.naviFromNum = (this.naviTo.length-2) + 1;
        }
        else {
            from = this.naviFrom.geometry.getBounds().getCenterLonLat().clone();
            this.naviFromNum = 0;
        }
        from.transform(lbgm.maplets.mapobject.map.getProjectionObject(), lbgm.maplets.mapobject.map.displayProjection);

        // Add Loading Indicator
        Ext.get('navi-results').dom.innerHTML = "<div id='naviLoading'><img src='src/images/navigation/ajax-loader.gif' /></div>";

        //alert(this.naviTo.length);
        var to = this.naviTo[this.naviTo.length-1].geometry.getBounds().getCenterLonLat().clone();
        this.naviToNum = (this.naviTo.length-1) + 1;
        to.transform(lbgm.maplets.mapobject.map.getProjectionObject(), lbgm.maplets.mapobject.map.displayProjection);

        // CloudMade
        var scr = 'http://routes.cloudmade.com/' +
            'BC9A493B41014CAABB98F0471D759707/api/0.3/' +
            from.lat + ',' + from.lon + ',' + to.lat + ',' + to.lon +
            '/car.js?callback=lbgm.navigation.getRouteCM';
        //alert(scr);
        this.addScript(scr);
//alert(lbgm.layout.languageid);
/*
        OpenLayers.Request.GET({
            url: 'src/php/conn/navigation.php',
            params: {
                request: "navigate",
                NavFromX: from.lon,
                NavFromY: from.lat,
                NavToX: to.lon,
                NavToY: to.lat
            },
            success: function(responseObject) {
               //alert(responseObject.responseText);
               obj = Ext.util.JSON.decode(responseObject.responseText);
               //alert(obj.status);
               lbgm.navigation.getRouteCM(obj);
            },
            failure: function() {
               Ext.Msg.alert(lbgm.options.appname, 'Unable to load layout.');
            }

        });
*/
    },

    getRoute: function (response) {
        //alert(response.route_geometry.length);
        if(response == '') {
            this.removeNavigation();
            return;
        }

        if(response.status != 0) {
            //alert(response.status_message);
            Ext.Msg.alert(lbgm.options.appname, response.status_message);
            Ext.get('navi-results').dom.innerHtml = '';
            return;
        }

        this.buildNaviInstructions(response);

        if (response) {
            var rg = response.route_geometry;
            var features = [];
            //alert(rg.length);
            for (var i = 0; i < rg.length; i++) { // loop through sections
                var sect = rg[i];
                var points = [];
                //alert(sect.length);
                for(var j = 0; j < sect.length; j++) {
                    var point = new OpenLayers.Geometry.Point(
                            sect[j][1],
                            sect[j][0]);
                    points.push(point.transform(lbgm.maplets.mapobject.map.displayProjection, lbgm.maplets.mapobject.map.getProjectionObject()));
                }

                var geometry = new OpenLayers.Geometry.LineString(points);
                var feature = new OpenLayers.Feature.Vector(geometry, null, {
                    strokeColor: "#0033ff",
                    strokeOpacity: 0.7,
                    strokeWidth: 5,
                    graphicZIndex: 0
                });

                feature.id = "navigation";
                //feature.attributes.name = 'Segment' + i;
                feature.attributes.isLine = true;
                features.push(feature);
            }
            
            lbgm.point.pointslayer.addFeatures(features);
            this.redrawPoints();

            lbgm.maplets.mapobject.map.zoomToExtent(feature.geometry.getBounds());
        }
    },

    getRouteCM: function (response) {
        //alert(response.route_geometry.length);

        if(response.status != 0) {
            alert(response.status_message);
            Ext.get('navi-results').dom.innerHtml = '';
            return;
        }

        this.buildNaviInstructionsCM(response);

        if (response) {
            var points = [];
            for (var i = 0; i < response.route_geometry.length; i++) {
                var point = new OpenLayers.Geometry.Point(
                        response.route_geometry[i][1],
                        response.route_geometry[i][0]);
                points.push(point.transform(lbgm.maplets.mapobject.map.displayProjection, lbgm.maplets.mapobject.map.getProjectionObject()));
            }
            var geometry = new OpenLayers.Geometry.LineString(points);
            var feature = new OpenLayers.Feature.Vector(geometry, null, {
                strokeColor: "#0033ff",
                strokeOpacity: 0.7,
                strokeWidth: 5,
                graphicZIndex: 0
            });

            feature.id = "navigation";
            feature.attributes.isLine = true;
            lbgm.point.pointslayer.addFeatures([feature]);
            this.redrawPoints();
        }
    },

    buildNaviInstructions: function(response) {
        var dir = '';
        var route_summary = response.route_summary;
        //dir += "<b>Summary</b><br>";
        dir += "Distance: <b>"+ String(lbgm.helper.round(route_summary.total_distance / 1000, 2)) + " km</b><br>";
        dir += "Time: <b>"+ String(lbgm.helper.round(route_summary.total_time / 60, 2)) + " mins</b><br>";

        dir += "<dl class='navi-poinmts-list'>";
        // From Point
        var sPoint = route_summary.start_point;
        if(this.naviFrom.attributes.oldtype == 'point') sPoint = this.naviFrom.attributes.name;

        dir += "<dt>" + "<img src='src/images/navigation/large_np_" + this.getToLetterFromNum(this.naviFromNum) + ".png' width='38' height='42' />" + sPoint +  "</dt>";

        if(this.naviFromNum == 0) {
            if(this.naviFrom.attributes.oldtype == 'lonlat' ) {
                this.naviFrom.attributes.name = route_summary.start_point;
                document.getElementById('naviFromDiv').childNodes[1].innerHTML = route_summary.start_point;
            }
        }
        else  {
            if(this.naviTo[this.naviFromNum-1].attributes.oldtype == 'lonlat' ) {
                this.naviTo[this.naviFromNum-1].attributes.name = route_summary.start_point;
                document.getElementById('naviToDiv' + String(this.naviFromNum-1)).childNodes[1].innerHTML = route_summary.start_point;
            }
        }

        var inst = response.route_instructions;
        for (var i = 0; i < inst.length; i++) {
            instruction = inst[i];
            //alert(instruction[0]);


            // Get instraction start point
            //pointNum = instruction[2];
            point = instruction[2];//response.route_geometry[pointNum];
            dir += "<dd><a href='#' onClick='lbgm.navigation.showInstruction(" + String(point[1]) + ", " + String(point[0]) + ", \"" + instruction[0] + "\", \"" + instruction[7] + "\");'>";

            //dir += "<dd><a href='#' onClick=''>";

            if(instruction[7] != undefined && instruction[7] != '') {
                dir += '<img src="' + this.turnImgFromString(instruction[7]) + '" width="24px" height="24px" />';
            }

            dir += "<span class='navi_instruction'>" + instruction[0] + "  <b>" + instruction[4] + "</b></span>";
            dir += "</a></dd>";
        }

        // To Point
        var ePoint = route_summary.end_point;
        if(this.naviTo[this.naviToNum-1].attributes.oldtype == 'point' ) ePoint = this.naviTo[this.naviToNum-1].attributes.name;
        
        dir += "<dt>" + "<img src='src/images/navigation/large_np_" + this.getToLetterFromNum(this.naviToNum) + ".png' width='38' height='42' />" + ePoint +  "</dt>";
        dir += "</dl>";

        if(this.naviTo[this.naviToNum-1].attributes.oldtype == 'lonlat' ) {
            this.naviTo[this.naviToNum-1].attributes.name = route_summary.end_point;
            document.getElementById('naviToDiv' + String(this.naviToNum-1)).childNodes[1].innerHTML = route_summary.end_point;
        }

        var tplTxt = '<tpl for="."><div id="naviDirDiv" class="search-selected">\n\
                <div class="naviClear"><a href="#" onClick="lbgm.navigation.clearNavigation();">Clear Navigation</a></div>\n\
                    <div class="">' + dir + '</div>';
        if(lbgm.layout.enableshare == 1)
                tplTxt += '<div class="sButton" style="float:right"><a href="#" onClick="lbgm.navigation.share();"><div id="sButtonCont"><div id="sButtonIcon"><img src="gmadmin/images/icons/email.png" /></div><div id="sButtonText">Share</div></div></a></div>';

        tplTxt += '</div></tpl>';

        var dirTpl = new Ext.XTemplate(tplTxt);

        dirTpl.compile();

        dirTpl.overwrite('navi-results', '');
        //this.toBottom();
    },

    buildNaviInstructionsCM: function(response) {
        var dir = '';
        var route_summary = response.route_summary;
        //dir += "<b>Summary</b><br>";
        dir += "Distance: <b>"+ String(lbgm.helper.round(route_summary.total_distance / 1000, 2)) + " km</b><br>";
        dir += "Time: <b>"+ String(lbgm.helper.round(route_summary.total_time / 60, 2)) + " mins</b><br>";

        dir += "<dl class='navi-poinmts-list'>";
        // From Point
        dir += "<dt>" + "<img src='src/images/navigation/large_np_" + this.getToLetterFromNum(this.naviFromNum) + ".png' width='38' height='42' />" + route_summary.start_point +  "</dt>";

        var inst = response.route_instructions;
        for (var i = 0; i < inst.length; i++) {
            instruction = inst[i];

            // Get instraction start point
            pointNum = instruction[2];
            point = response.route_geometry[pointNum];
            dir += "<dd><a href='#' onClick='lbgm.navigation.showInstruction(" + String(point[1]) + ", " + String(point[0]) + ", \"" + instruction[0] + "\", \"" + instruction[7] + "\");'>";

            if(instruction[7] != undefined && instruction[7] != '') {
                dir += '<img src="' + this.turnImgFromString(instruction[7]) + '" width="24px" height="24px" />';
            }

            dir += "<span class='navi_instruction'>" + instruction[0] + "  <b>" + instruction[4] + "</b></span>";
            dir += "</a></dd>";
        }

        // To Point
        dir += "<dt>" + "<img src='src/images/navigation/large_np_" + this.getToLetterFromNum(this.naviToNum) + ".png' width='38' height='42' />" + route_summary.end_point +  "</dt>";
        dir += "</dl>";

        var dirTpl = new Ext.XTemplate(
            '<tpl for="."><div id="naviDirDiv" class="search-selected">',
                '<div class="naviClear"><a href="#" onClick="lbgm.navigation.clearNavigation();">Clear Navigation</a></div>',
                '<div class="">' + dir + '</div>',
             '</div></tpl>'
        );

        dirTpl.compile();

         dirTpl.overwrite('navi-results', '');
         //this.toBottom();
    },

    removeNaviFromPoint: function(id) {
        var feature  = lbgm.point.pointslayer.getFeatureById(id);
        if(feature != null) lbgm.point.pointslayer.removeFeatures([feature]);
        
        Ext.get('naviFromDiv').remove();
        this.naviFrom = null;

        this.removeNavigation();

        if(this.naviTo.length > 0) {
            this.removeSwap(0);
        }

        Ext.getCmp('mapNaviSearchFrom').enable();
        Ext.getCmp('mapNaviSearchFrom').focus();

    },

    removeNaviToPoint: function(id) {
        lbgm.point.pointslayer.removeFeatures([lbgm.point.pointslayer.getFeatureById(id)]);

        var pointNum = 0;
        for(var i=0; i<lbgm.navigation.naviTo.length; i++) {
            if(lbgm.navigation.naviTo[i].id == id) {
                pointNum = i;
                break;
            }
        }

        lbgm.navigation.naviTo.splice(pointNum, 1);

        //Ext.get('navi-points').dom.removeChild(Ext.get('naviToDiv'+pointNum));
        //Ext.get('naviToDiv'+pointNum).dom.innerHTML = '';
        Ext.get('naviToDiv'+pointNum).remove();
        this.removeSwap(pointNum);

        if(lbgm.navigation.naviTo.length == 0)
            this.removeNavigation();

        Ext.getCmp('mapNaviSearchTo').enable();
        Ext.getCmp('mapNaviSearchTo').focus();

    },

    removeNavigation: function() {
        var f = lbgm.point.pointslayer.getFeatureById('navigation');
        if(f != undefined) {
            while(f != undefined) {
                lbgm.point.pointslayer.removeFeatures([f]);
                f = lbgm.point.pointslayer.getFeatureById('navigation')
            }
            Ext.get('naviDirDiv').remove();
        }

    },

    clearNavigation: function() {
        lbgm.popup.hidePopup(lbgm.popup.activepopupid);
        lbgm.point.pointslayer.removeFeatures([this.naviFrom]);
        lbgm.point.pointslayer.removeFeatures(this.naviTo);

        for(var i=0; i<lbgm.navigation.naviTo.length; i++) {
            Ext.get('naviToDiv'+i).remove();
            //alert(lbgm.navigation.naviTo.length);
            this.removeSwap(i);
            
        }
        lbgm.navigation.naviTo.splice(0, lbgm.navigation.naviTo.length);
        this.navTo = [];

        Ext.get('naviFromDiv').remove();
        this.naviFrom = null;

        var ftmp = lbgm.point.pointslayer.getFeatureById("instruction");
        if(ftmp != undefined) lbgm.point.pointslayer.removeFeatures([ftmp]);

        this.removeNavigation();

        Ext.getCmp('mapNaviSearchFrom').enable();
        Ext.getCmp('mapNaviSearchTo').enable();
        Ext.getCmp('mapNaviSearchFrom').focus();

    },

    addScript: function (url) {
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = url;
        document.getElementsByTagName('head')[0].appendChild(script);
    },

    toBottom: function() {
        var myPanel = Ext.getCmp('navigationPanel');
        var d = myPanel.body.dom;
        d.scrollTop = d.scrollHeight - d.offsetHeight;
        //var nDiv = document.getElementById('navigationPanel');
        //nDiv.scrollTop =100000; //nDiv.scrollHeight;
    },

    redrawPoints: function() {
        lbgm.point.pointslayer.removeFeatures([this.naviFrom]);
        lbgm.point.pointslayer.removeFeatures(this.naviTo);
        lbgm.point.pointslayer.addFeatures([this.naviFrom]);
        lbgm.point.pointslayer.addFeatures(this.naviTo);
    },

    getToLetterFromNum: function(num) {
        switch(num) {
            case 0: return "a";
            case 1: return "b";
            case 2: return "c";
            case 3: return "d";
            case 4: return "e";
            case 5: return "f";
            case 6: return "g";
            case 7: return "h";
            case 8: return "i";
            case 9: return "j";
            case 10: return "k";
            case 11: return "l";
            case 12: return "m";
            case 13: return "n";
            case 14: return "o";
            case 15: return "p";
            case 16: return "q";
            case 17: return "r";
            case 18: return "s";
            case 19: return "t";
            case 20: return "u";
            case 21: return "v";
            case 22: return "w";
            case 23: return "x";
            case 24: return "y";
            case 25: return "z";
            default: return "";
        }
    },

    displaySearchPoint: function(point) {
        /*var tplTxt = '<tpl for="."><div class="search-selected">\n\
                <div class="search-sel-close"><a href="#" onClick="lbgm.navigation.removeSearchNaviPoint(\'poi{id}\');">Remove</a></div>\n\
                <a class="search-selected-item-a" href="#" onClick="lbgm.point.selectPoint(\'poi{id}\');">\n\
                    <div class="search-selected-item">\n\
                        <p>{name} {postcode} {area} {district}</p>\n\
                    </div>\n\
                </a>';

        if(lbgm.layout.enablenavigation == 1)
            tplTxt += '<div class="search-sel-links"><a href="#" onClick="lbgm.navigation.setNaviFrom(lbgm.navigation.naviSearchFeature);lbgm.navigation.removeSearchNaviPoint(\'poi{id}\');">From Here</a>&nbsp;\n\
                        <a href="#" onClick="lbgm.navigation.setNaviTo(lbgm.navigation.naviSearchFeature);lbgm.navigation.removeSearchNaviPoint(\'poi{id}\');">To Here</a></div>';
         tplTxt += '</div></tpl>';


        var selPoiTpl = new Ext.XTemplate(tplTxt);

        selPoiTpl.compile();
        selPoiTpl.overwrite('navi-search-results', point);*/

        point.icondisplay = lbgm.point.defaultIconPath;
        var feature = lbgm.point.featureFromPoint(point);
        this.naviSearchFeature = feature;
        lbgm.point.arSearchPoints.push(feature);
        lbgm.point.displayFeature(feature, false, true, true);

        if(point.naviPoint == 'from') lbgm.navigation.setNaviFrom(feature);
        else if(point.naviPoint == 'to') lbgm.navigation.setNaviTo(feature);

    },
    displayAddress: function(address) {
        /*var tplTxt = '<tpl for="."><div class="search-selected">\n\
                <div class="search-sel-close"><a href="#" onClick="lbgm.navigation.removeSearchNaviAddr({id});">Remove</a></div>\n\
                <a class="search-selected-item-a" href="#" onClick="lbgm.point.selectAddress({id});">\n\
                    <div class="search-selected-item">\n\
                        <p>{name} {postcode} {area} {district}</p>\n\
                    </div>\n\
                </a>';
        if(lbgm.layout.enablenavigation == 1)
            tplTxt += '<div class="search-sel-links"><a href="#" onClick="lbgm.navigation.setNaviFrom(lbgm.navigation.naviSearchFeature);lbgm.navigation.removeSearchNaviAddr({id});">From Here</a>&nbsp;\n\
                    <a href="#" onClick="lbgm.navigation.setNaviTo(lbgm.navigation.naviSearchFeature);lbgm.navigation.removeSearchNaviAddr({id});">To Here</a></div>';

        tplTxt += '</div></tpl>';

        var selAddressiTpl = new Ext.XTemplate(tplTxt);

        selAddressiTpl.compile();
        selAddressiTpl.overwrite('navi-search-results', address);*/

        address.icondisplay = lbgm.point.defaultIconPath;

        // Request  lon / lat from Yiannis
        OpenLayers.Request.GET({
            url: 'src/php/conn/geoc.php',
            params: {
                ad: address.name,
                ct: address.area,
                st: address.district,
                po: address.postcode,
                nm: address.addrnumber
            },
            success: function(responseObject) {

                var res = responseObject.responseXML.documentElement;
                var lat = res.getElementsByTagName('latitude')[0].firstChild.data;
                var lon = res.getElementsByTagName('longitude')[0].firstChild.data;


                //
                address.longitude = lon;
                address.latitude = lat;
                var feature = lbgm.point.featureFromPoint(address, 'addr');
                //lbgm.navigation.naviSearchFeature = feature;
                feature.attributes.type = 'address';
                feature.attributes.address = address.name;
                feature.attributes.postcode = address.postcode;
                feature.attributes.district = address.district;
                feature.attributes.area = address.area;

                lbgm.point.arSearchPoints.push(feature);
                lbgm.point.displayFeature(feature, false, true, true);
                
                if(address.naviPoint == 'from') lbgm.navigation.setNaviFrom(feature);
                else if(address.naviPoint == 'to') lbgm.navigation.setNaviTo(feature);

            },
            failure: function() {
               Ext.Msg.alert(lbgm.options.appname, 'Unable to load address.');
            }

        });
    },

    removeSearchNaviPoint: function(pointid) {
        var feat = lbgm.point.pointslayer.getFeatureById(pointid);
        if(feat != null) {
            lbgm.popup.hidePopup(pointid);
            lbgm.point.pointslayer.removeFeatures([feat], null);
            Ext.get('navi-search-results').dom.innerHTML = "";
        }
    },

    removeSearchNaviAddr: function(addrid) {
        var feat = lbgm.point.pointslayer.getFeatureById('addr' + addrid);
        if(feat != null) {
            lbgm.popup.hidePopup("addr"+addrid);
            lbgm.point.pointslayer.removeFeatures([feat], null);
            Ext.get('navi-search-results').dom.innerHTML = "";
        }
    },

    turnImgFromString: function(turnType, large) {
        //alert(turnType);

        if(turnType == '') return '';

        var path = 'src/images/navigation/';

        if(large != undefined && large == true)
            return path + turnType.toLowerCase() + '_large.png';
        else
            return path + turnType.toLowerCase() + '.png';

        /*switch(turnType) {
            case "TR": return path + 'tr.png';
            default: return "";
        }*/
    },


    showInstruction: function(lon, lat, instruction, turntype) {
        var lonlat  = new OpenLayers.LonLat(parseFloat(lon), parseFloat(lat));
        lonlat.transform(lbgm.maplets.mapobject.map.displayProjection,lbgm.maplets.mapobject.map.getProjectionObject());

        var ftmp = lbgm.point.pointslayer.getFeatureById("instruction");
        if(ftmp != undefined) lbgm.point.pointslayer.removeFeatures([ftmp]);

        var f = lbgm.point.featureFromLonLat(lonlat);
        f.attributes.type = 'instr';
        f.attributes.name = instruction;
        f.attributes.instrimage = this.turnImgFromString(turntype, true);
        //alert(f.id);
        f.id = "instruction";
        f.style.externalGraphic = lbgm.point.naviIconPath;

        lbgm.popup.hidePopup(lbgm.popup.activepopupid);
        lbgm.point.displayFeature(f, true, true, true, 17);
    },

    swap: function(num) {
        var tmp = "";
        var from = "", to = "";

        if(num == 0) from = this.naviFrom;
        else from = this.naviTo[this.naviFromNum - 1];

        to = this.naviTo[this.naviToNum - 1];

        this.clearNavigation();

        this.setNaviFrom(to);
        this.setNaviTo(from);
    },

    addSwap: function(num) {
        var swapTpl = new Ext.XTemplate(
             '<tpl for="."><div class="naviSwap" id="swap' + num + '"><a href="#" onClick="lbgm.navigation.swap('+num+');"><img src="src/images/navigation/swap.png" /></a></div></tpl>'
        );

        swapTpl.compile();
        swapTpl.append('swapCont'+ num, '');
    },

    removeSwap: function(num) {
        if(Ext.get('swap' + num) != null)
            Ext.get('swap' + num).remove();
    },

    share: function() {
        var from = null;
        if(this.naviTo.length > 1) {
            from = this.naviTo[this.naviTo.length-2].geometry.getBounds().getCenterLonLat().clone();
            this.naviFromNum = (this.naviTo.length-2) + 1;
        }
        else {
            from = this.naviFrom.geometry.getBounds().getCenterLonLat().clone();
            this.naviFromNum = 0;
        }
        from.transform(lbgm.maplets.mapobject.map.getProjectionObject(), lbgm.maplets.mapobject.map.displayProjection);

        //alert(this.naviTo.length);
        var to = this.naviTo[this.naviTo.length-1].geometry.getBounds().getCenterLonLat().clone();
        this.naviToNum = (this.naviTo.length-1) + 1;
        to.transform(lbgm.maplets.mapobject.map.getProjectionObject(), lbgm.maplets.mapobject.map.displayProjection);

        
        var data = "&nvf_lat=" + from.lat + "&nvf_lon=" + from.lon + "&nvt_lat=" + to.lat + "&nvt_lon=" + to.lon;
        lbgm.point.share(data);
    },

    showInitNavigation: function(nvf_lat, nvf_lon, nvt_lat, nvt_lon) {
        var flonlat  = new OpenLayers.LonLat(parseFloat(nvf_lon), parseFloat(nvf_lat));
        flonlat.transform(lbgm.maplets.mapobject.map.displayProjection,lbgm.maplets.mapobject.map.getProjectionObject());

        var tlonlat  = new OpenLayers.LonLat(parseFloat(nvt_lon), parseFloat(nvt_lat));
        tlonlat.transform(lbgm.maplets.mapobject.map.displayProjection,lbgm.maplets.mapobject.map.getProjectionObject());

        var f = lbgm.point.featureFromLonLat(flonlat);
        var t = lbgm.point.featureFromLonLat(tlonlat);

        this.setNaviFrom(f);
        this.setNaviTo(t);
    }
};

lbgm.navigation.init();
