//the file contains misc functions used by the WebGUI mapping portion of SailView
//copyright 2008 Samuel C Grant

var degreesPerRadian = 180.0 / Math.PI;
var radiansPerDegree = Math.PI / 180.0;
var km2feet = 3280.8399;
var feet2nm = 6076.11549;

var BDiff = 0.00;

function DDDtoDMS( decDeg )
{
 var rdeg = 0;
 var rmin = 0;
 var rsec = 0.00;
 var myDecDeg = decDeg;

 decDeg = Math.abs(decDeg);

 rdeg = Math.floor(decDeg);
 decDeg = decDeg - rdeg;
 rmin = Math.floor(decDeg * 60);
 decDeg = (decDeg * 60) - rmin;
 rsec = decDeg * 60;

 if( myDecDeg < 0.00 ) rdeg = rdeg * -1.0;

 var DegMinSec = "("+rdeg+" "+rmin+" "+rsec.toFixed(2)+")";

 return DegMinSec
}

function dist( from, to )
{
 var d = (to.distanceFrom(from)/1000.00) * +km2feet;

 return d;
}

function figureRND( oldB, newB, oldQ, newQ )
{
 var RNDING = "UNKNOWN";

 if( +oldB < +newB )
 {
     BDiff = +newB - +oldB;
 }
 else
 {
     if( +oldB > +newB )
     {
         BDiff = +oldB - +newB;
     }
 }

 //coming from QUAD 1 (NE)
 if( +oldQ == 1 )
 {
    if( (+newQ == 1) )
    {
        if( +oldB < +newB )
        {
            RNDING = "STARBOARD";
        }
        else
        {
            if( +oldB > +newB )
            {
                RNDING = "PORT";
            }
        }
    }
    if( (+newQ == 2) )
    {
        RNDING = "STARBOARD";
    }
    if( (+newQ == 3) )
    {
        if( +BDiff < 180.00 )
        {
            RNDING = "STARBOARD";
        }
        else
        {
            if( +BDiff >= 180.00 )
            {
                RNDING = "PORT";
            }
        }
    }
    if( (+newQ == 4) )
    {
        RNDING = "PORT";
    }
 }
 else
 {
     //coming from QUAD 2 (SE)
     if( +oldQ == 2 )
     {
        if( (+newQ == 2) )
        {
            if( +oldB < +newB )
            {
                RNDING = "STARBOARD";
            }
            else
            {
                if( +oldB > +newB )
                {
                    RNDING = "PORT";
                }
            }
        }
        if( (+newQ == 3) )
        {
            RNDING = "STARBOARD";
        }
        if( (+newQ == 4) )
        {
            if( +BDiff < 180.00 )
            {
                RNDING = "STARBOARD";
            }
            else
            {
                if( +BDiff >= 180.00 )
                {
                    RNDING = "PORT";
                }
            }
        }
        if( (+newQ == 1) )
        {
            RNDING = "PORT";
        }
     }
     else
     {
         //coming from QUAD 3 (SW)
         if( +oldQ == 3 )
         {
            if( (+newQ == 3) )
            {
                if( +oldB < +newB )
                {
                    RNDING = "STARBOARD";
                }
                else
                {
                    if( +oldB > +newB )
                    {
                        RNDING = "PORT";
                    }
                }
            }
            if( (+newQ == 4) )
            {
                RNDING = "STARBOARD";
            }
            if( (+newQ == 1) )
            {
                if( +BDiff <= 180.00 )
                {
                    RNDING = "PORT";
                }
                else
                {
                    if( +BDiff > 180.00 )
                    {
                        RNDING = "STARBOARD";
                    }
                }
            }
            if( (+newQ == 2) )
            {
                RNDING = "PORT";
            }
         }
         else
         {
             //coming from QUAD 4 (NW)
             if( +oldQ == 4 )
             {
                if( (+newQ == 4) )
                {
                    if( +oldB < +newB )
                    {
                        RNDING = "STARBOARD";
                    }
                    else
                    {
                        if( +oldB > +newB )
                        {
                            RNDING = "PORT";
                        }
                    }
                }
                if( (+newQ == 1) )
                {
                    RNDING = "STARBOARD";
                }
                if( (+newQ == 2) )
                {
                    if( +BDiff <= 180.00 )
                    {
                        RNDING = "PORT";
                    }
                    else
                    {
                        if( +BDiff > 180.00 )
                        {
                            RNDING = "STARBOARD";
                        }
                    }
                }
                if( (+newQ == 3) )
                {
                    RNDING = "PORT";
                }
             }
         }
     }
 }

 return RNDING;
}

function figureQUAD(myBr)
{
 var QUAD = 0;

     if( (myBr == 0.0) ) QUAD = 1;
     if( (myBr == 360.0) ) QUAD = 1;
     if( (0.0<myBr) && (myBr<=90.0) ) QUAD = 1;
     if( (90.0<myBr) && (myBr<=180.0) ) QUAD = 2;
     if( (180.0<myBr) && (myBr<=270.0) ) QUAD = 3;
     if( (270.0<myBr) && (myBr<=360.0) ) QUAD = 4;

 return QUAD;
}

function avgCoord( fromLAT, fromLNG, toLAT, toLNG, divisor )
{
    var lat1 = fromLAT;
    var lon1 = fromLNG;
    var lat2 = toLAT;
    var lon2 = toLNG;

    var avglat = (lat1+lat2)/divisor;
    var avglng = (lon1+lon2)/divisor;

    var avgC = new GLatLng(avglat,avglng);

    return avgC;
}
 
// Returns the bearing in degrees between two points.
// North = 0, East = 90, South = 180, West = 270.
function bearing( from, to ) 
{
    // See T. Vincenty, Survey Review, 23, No 176, p 88-93,1975.
    // Convert to radians.
    var lat1 = from.latRadians();
    var lon1 = from.lngRadians();
    var lat2 = to.latRadians();
    var lon2 = to.lngRadians();

    // Compute the angle.
    var angle = - Math.atan2( Math.sin( lon1 - lon2 ) * Math.cos( lat2 ), Math.cos( lat1 ) * Math.sin( lat2 ) - Math.sin( lat1 ) * Math.cos( lat2 ) * Math.cos( lon1 - lon2 ) );
    if ( angle < 0.0 ) angle  += Math.PI * 2.0;

    // And convert result to degrees.
    angle = angle * degreesPerRadian;
    angle = angle.toFixed(2);

    return angle;
}

// update distance/bearing info on main data panel
//      also change the remote icon to the appropriate one based on
//          the current heading
function updateDistBear()
{
    var angle;
    info_html = Rmarkers[0].myTitle+"<br>";
    info_html += "Distances & Bearings to:<br>";

    for (var j=1; j<Rmarkers.length; j++) 
    {
        //var d=(Rmarkers[0].getPoint().distanceFrom(Rmarkers[j].getPoint())/1000) * km2feet;
       var d=dist(Rmarkers[0],Rmarkers[j]);

        var html = Rmarkers[j].myTitle;
        html += " : "+ d.toFixed(2) +" feet @";
        angle = bearing(Rmarkers[0].getPoint(),Rmarkers[j].getPoint());
        html += "</br>-----"+angle+" degrees<br>";
        info_html += html;

        if( (angle>354.00) || (angle<5.00) ) 
        {
            if( Rmarkers[j].myColor == "Red" )   Rmarkers[j].setImage("images/red_zero.png");
            if( Rmarkers[j].myColor == "Blue" )  Rmarkers[j].setImage("images/red_zero.png");
            if( Rmarkers[j].myColor == "Green" ) Rmarkers[j].setImage("images/red_zero.png");
        }
        if( (angle>4.00) && (angle<15.00) )
        {
            if( Rmarkers[j].myColor == "Red" )   Rmarkers[j].setImage("images/red_ten.png");
            if( Rmarkers[j].myColor == "Blue" )  Rmarkers[j].setImage("images/red_ten.png");
            if( Rmarkers[j].myColor == "Green" ) Rmarkers[j].setImage("images/red_ten.png");
        }
        if( (angle>14.00) && (angle<25.00) )
        {
            if( Rmarkers[j].myColor == "Red" )   Rmarkers[j].setImage("images/red_twenty.png");
            if( Rmarkers[j].myColor == "Blue" )  Rmarkers[j].setImage("images/red_twenty.png");
            if( Rmarkers[j].myColor == "Green" ) Rmarkers[j].setImage("images/red_twenty.png");
        }
        if( (angle>24.00) && (angle<35.00) )
        {
            if( Rmarkers[j].myColor == "Red" )   Rmarkers[j].setImage("images/red_thirty.png");
            if( Rmarkers[j].myColor == "Blue" )  Rmarkers[j].setImage("images/red_thirty.png");
            if( Rmarkers[j].myColor == "Green" ) Rmarkers[j].setImage("images/red_thirty.png");
        }
        if( (angle>34.00) && (angle<45.00) )
        {
            if( Rmarkers[j].myColor == "Red" )   Rmarkers[j].setImage("images/red_fourty.png");
            if( Rmarkers[j].myColor == "Blue" )  Rmarkers[j].setImage("images/red_fourty.png");
            if( Rmarkers[j].myColor == "Green" ) Rmarkers[j].setImage("images/red_fourty.png");
        }
        if( (angle>44.00) && (angle<55.00) )
        {
            if( Rmarkers[j].myColor == "Red" )   Rmarkers[j].setImage("images/red_fifty.png");
            if( Rmarkers[j].myColor == "Blue" )  Rmarkers[j].setImage("images/red_fifty.png");
            if( Rmarkers[j].myColor == "Green" ) Rmarkers[j].setImage("images/red_fifty.png");
        }
        if( (angle>54.00) && (angle<65.00) )
        {
            if( Rmarkers[j].myColor == "Red" )   Rmarkers[j].setImage("images/red_sixty.png");
            if( Rmarkers[j].myColor == "Blue" )  Rmarkers[j].setImage("images/red_sixty.png");
            if( Rmarkers[j].myColor == "Green" ) Rmarkers[j].setImage("images/red_sixty.png");
        }
        if( (angle>64.00) && (angle<75.00) )
        {
            if( Rmarkers[j].myColor == "Red" )   Rmarkers[j].setImage("images/red_seventy.png");
            if( Rmarkers[j].myColor == "Blue" )  Rmarkers[j].setImage("images/red_seventy.png");
            if( Rmarkers[j].myColor == "Green" ) Rmarkers[j].setImage("images/red_seventy.png");
        }
        if( (angle>74.00) && (angle<85.00) )
        {
            if( Rmarkers[j].myColor == "Red" )   Rmarkers[j].setImage("images/red_eighty.png");
            if( Rmarkers[j].myColor == "Blue" )  Rmarkers[j].setImage("images/red_eighty.png");
            if( Rmarkers[j].myColor == "Green" ) Rmarkers[j].setImage("images/red_eighty.png");
        }
        if( (angle>84.00) && (angle<95.00) )
        {
            if( Rmarkers[j].myColor == "Red" )   Rmarkers[j].setImage("images/red_ninety.png");
            if( Rmarkers[j].myColor == "Blue" )  Rmarkers[j].setImage("images/red_ninety.png");
            if( Rmarkers[j].myColor == "Green" ) Rmarkers[j].setImage("images/red_ninety.png");
        }
        if( (angle>94.00) && (angle<355.00) )
        {
            if( Rmarkers[j].myColor == "Red" )   Rmarkers[j].setImage("images/red_zero.png");
            if( Rmarkers[j].myColor == "Blue" )  Rmarkers[j].setImage("images/red_zero.png");
            if( Rmarkers[j].myColor == "Green" ) Rmarkers[j].setImage("images/red_zero.png");
        }
    } 

}

// read the course.xml and plot the current course on the map
//      we can have multiple courses in this file...just in case
//          we have multiple fleets out there being tracked
function addCourse()
{
    var bounds = new GLatLngBounds();
    var request3 = GXmlHttp.create();
    request3.open("GET", CourseFile, false);
    request3.onreadystatechange = function()
    {
        if (request3.readyState == 4)
        {
             for(var i = 0; i < courseTrack.length; i++ )
            {
                map.removeOverlay(courseTrack[i]);
            }

            // ========= Now process the Course ===========
            var xmlDoc3 = GXml.parse(request3.responseText);
            var CName = xmlDoc3.documentElement.getAttribute("name");
            var windSPD = xmlDoc3.documentElement.getAttribute("windSPD");  
            var windDIR = xmlDoc3.documentElement.getAttribute("windDIR");  
            var windBRG = xmlDoc3.documentElement.getAttribute("windBRG");
            var course = xmlDoc3.documentElement.getElementsByTagName("line");				
				
            // read each line
            for (var a = 0; a < course.length; a++)
            {
                var colour   = course[a].getAttribute("colour");
                var width    = parseFloat(course[a].getAttribute("width"));
                var coursePoints = course[a].getElementsByTagName("marker");
                var polyOptions = {geodesic:true};
                var pts = [];
                var newpts = [];
                var bears = [];
                var dists = [];
                var ids = [];
                var lats = [];  
                var lons = [];

                for (var z = 0; z < coursePoints.length; z++ )
                {

                    var id       = coursePoints[z].getAttribute("id");
                    var lat      = parseFloat(coursePoints[z].getAttribute("lat"));
                    var lon      = parseFloat(coursePoints[z].getAttribute("lon"));
                    var point    = new GLatLng(lat,lon);

                    pts[z]       = point;
                    
                    ids[z]       = id;
                    lats[z]      = lat;
                    lons[z]      = lon;

                    if( z > 0 )
                    {
                        dists[z] = dist(pts[z-1],pts[z]);
                        bears[z] = bearing(pts[z-1],pts[z]);
                    }

                    bounds.extend(point);
                } 
                var oldBear = 0.00;
                var newBear = 0.00;
                var nxtBear = 0.00;
                var bearOff = 0.00;
                var tBear   = 0.00;
                var bDiff   = 0.00;

                var oldQUAD = 0;
                var newQUAD = 0;

                var newROUNDING = "";
                var oldROUNDING = "";

                var DMS = "";

                var d = 0.00;
                var myIDX = -1;

                cDist = 0.00;

                for (var c = 0; c < coursePoints.length; c++ )
                {
                    myIDX++;

                    if( c==0 )
                    {
                        info_html = "";

                        if( +PRINTING == 1 )
                        {
                         info_html = "<p><center><font size=\"5\">SailView Course</font></center></p>";  
                         info_html += "<p><center><font size=\"5\">"+CName+"</font></center></p>"; 
                         info_html += "<center><font size=\"3\">Predicted Wind: " + (windSPD);
                         info_html += " knots at " + (windBRG) +" degrees.</center>";
                         info_html += "<center><font size=\"2\">\tRace Committee will broadcast and monitor VHF Channel 72.</center>"; 
                         info_html += "<hr width=\"100%\" size=\"2\">";
                         info_html += "<br><p><font size=\"4\">Start : "+ Smarkers[ids[0]].mySDesc+"</font></p>";
                        }
                        else
                        {
                         info_html = "<p><font size=\"4\">Start : "+ Smarkers[ids[0]].mySDesc+"</font></p>";
                        }

                        newpts[myIDX] = pts[c];
                    }

                    if( (c>0) && (c<(coursePoints.length)) )
                    {
                        d = dists[c];
                        cDist += d;
                        newBear = bears[c];
                        newQUAD = figureQUAD(newBear);
                        
                        if( c > 1 )
                        {
                            newROUNDING = figureRND(oldBear,newBear,oldQUAD,newQUAD);
                            info_html += "<br><left><font size=\"4\">"+Smarkers[ids[c-1]].mySDesc+" : "+
                                            newROUNDING+"</font></left>";
                            if( +PRINTING == 1 )
                            {
                             info_html += "<br><left><font size=\"3\">&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspBearing   : "+
                                            oldBear+" deg";
                             var oldD = dists[c-1];
                             info_html += "&nbsp&nbsp&nbspDistance : "+((oldD/feet2nm).toFixed(2))+" nm";
                             DMS = DDDtoDMS( lats[c-1] );
                             info_html += "<br>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspLatitude  : "+(lats[c-1])+" "+DMS;
                             DMS = DDDtoDMS( lons[c-1] );
                             info_html += "&nbsp&nbsp&nbspLongitude : "+(lons[c-1])+" "+DMS+"</font></left><br>";
                            }
                            
                            nxtBear = bearing(pts[c-2],pts[c]); 
                            
                            if( (+newBear) > (+oldBear) )
                            {
                                bDiff = newBear-oldBear;
                                if( +bDiff >= 180.00 )
                                {
                                    bDiff = 360.0-bDiff;
                                    tBear = +oldBear+(+bDiff/2)-90.0;
                                }
                                else
                                {
                                    if( +bDiff < 180.00 )
                                    {        
                                        tBear = +oldBear+(+bDiff/2)-90.0;
                                    }
                                    else
                                    {
                                        tBear = +oldBear+(+bDiff/2)+10.0;
                                    }
                                }

                                if( +tBear < 0.00 )
                                {
                                 tBear += 360.0;
                                }
                                else
                                { 
                                 if( +tBear > 360.00 )
                                 {
                                    tBear -= 360.0;
                                 }
                                }
                            }
                            else
                            {
                                if( (+oldBear) > (+newBear) )
                                {                      
                                    bDiff = oldBear-newBear;
                                    if( +bDiff >= 180.00 )
                                    {    
                                        bDiff = 360.0-bDiff;
                                        tBear = +newBear+(+bDiff/2)+90.0;
                                    }
                                    else
                                    {
                                        if( +bDiff < 180.00 )
                                        {   
                                            tBear = +newBear+(+bDiff/2)+90.0;
                                        }
                                        else
                                        {        
                                            tBear = +newBear+(+bDiff/2)-10.0;
                                        }                     
                                    }

                                    if( +tBear > 360.0 )
                                    {
                                     tBear -= 360.0;
                                    }
                                    else
                                    {
                                     if( +tBear < 0.00 )
                                     {
                                        tBear += 360.0;
                                     }
                                    }
                                }
                                else
                                {
                                    tBear = oldBear+90.0;
                                }
                            }

                            var offpt0 = new EOffsetBearing(pts[c-1],80,tBear);

                            var offpt1 = new EOffsetBearing(offpt0,40,tBear+((bDiff/8)+90));
                            var offpt2 = new EOffsetBearing(offpt0,40,tBear-((bDiff/8)+90));

                            var offpt3 = new EOffsetBearing(offpt0,60,tBear+((bDiff/6)+90));
                            var offpt4 = new EOffsetBearing(offpt0,60,tBear-((bDiff/6)+90));

                            var offpt5 = new EOffsetBearing(offpt0,80,tBear+((bDiff/4)+90));
                            var offpt6 = new EOffsetBearing(offpt0,80,tBear-((bDiff/4)+90));

                            if( newROUNDING == "STARBOARD" )
                            {                      
                                newpts[myIDX] = offpt6;

                                myIDX++;
                                newpts[myIDX] = offpt4;
                                myIDX++;
                                newpts[myIDX] = offpt2;
                                myIDX++;
                                newpts[myIDX] = offpt0;
                                myIDX++;
                                newpts[myIDX] = offpt1;
                                myIDX++;
                                newpts[myIDX] = offpt3;
                                myIDX++;
                                newpts[myIDX] = offpt5;
                            }
                            else
                            {
                                if( newROUNDING == "PORT" )
                                {
                                    newpts[myIDX] = offpt5;

                                    myIDX++;
                                    newpts[myIDX] = offpt3;
                                    myIDX++;
                                    newpts[myIDX] = offpt1;
                                    myIDX++;
                                    newpts[myIDX] = offpt0;
                                    myIDX++;
                                    newpts[myIDX] = offpt2;
                                    myIDX++;
                                    newpts[myIDX] = offpt4;
                                    myIDX++;
                                    newpts[myIDX] = offpt6;
                                }
                            }
                        }
                    }

                    if( c==coursePoints.length-1 )
                    {
                        myIDX++;

                        if( +PRINTING == 1 )
                        {
                            info_html += "<br><font size=\"4\">Finish : "+ Smarkers[ids[c]].mySDesc+"</font>";
                            d = dist(pts[c],pts[c-1]);
                            info_html += "<br><font size=\"3\">&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspBearing   : "+newBear+" deg";
                            info_html += "&nbsp&nbsp&nbspDistance : "+((d/(+feet2nm)).toFixed(2))+" nm<br />";
                            DMS = DDDtoDMS( lats[c] );
                            info_html += "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspLatitude  : "+(lats[c])+" "+DMS;
                            DMS = DDDtoDMS( lons[c] );
                            info_html += "&nbsp&nbsp&nbspLongitude : "+(lons[c])+" "+DMS+"</font>";
                        }
                        if( +PRINTING == 0 ) info_html += "<br><font size=\"4\">Finish : "+ Smarkers[ids[c]].mySDesc+"</font>";
                        info_html += "<hr width=\"100%\" size=\"2\">";
                        info_html += "<br><font size=\"4\">Course Distance" + " : "+ ((cDist/(+feet2nm)).toFixed(2)) +" nm</font></p>";

                        newpts[myIDX] = pts[c];
                    }                        

                    oldBear = newBear;
                    oldQUAD = newQUAD;
                    oldROUNDING = newROUNDING;
                }

                var poly = new GPolyline(newpts,colour,width,0.20,polyOptions);
                courseTrack.push(poly);
                map.addOverlay(courseTrack[courseTrack.length-1]);
            }  
            // ===== determine the zoom level from the bounds =====
            map.setZoom(map.getBoundsZoomLevel(bounds));
            map.setCenter(bounds.getCenter());
        }
    }		
    request3.send(null);

    //window.setTimeout(function(){ addCourse()},1500);
}  

// clear the outdated track lines from the map
function removeLines()
{
    for(var i = 0; i < tracks.length; i++ )
    {
        map.removeOverlay(tracks[i]);
    }
}//  add new past-track lines to the map
function addLines(xmlDoc)
{		
    var id;
    var lat;
    var lon;
    var point;
				
    removeLines();

    // ========= Now process the polylines ===========
    var lines = xmlDoc.documentElement.getElementsByTagName("lines");
    // read each line
    for (var a = 0; a < lines.length; a++) 
    {
        var colour = lines[a].getAttribute("colour");
        var width  = parseFloat(lines[a].getAttribute("width"));
        // read each point on that line
        var Rlines = lines[a].getElementsByTagName("Rline");

        for (var b = 0; b < Rlines.length; b++) 
        {
            var polyOptions = {geodesic:true};
            var points = Rlines[b].getElementsByTagName("point");
            var pts = [];
            for (var c = 0; c < points.length; c++) 
            {
                lat       = parseFloat(points[c].getAttribute("lat"));
                lon       = parseFloat(points[c].getAttribute("lon"));
                point     = new GLatLng(lat,lon);
                pts[c]    = point;
            }
            var poly = new GPolyline(pts,colour,width,0.20,polyOptions);
            tracks.push(poly);
            map.addOverlay(tracks[tracks.length-1]);
        }
    }
}

//  add rhumb lines to the map
function addRhumbs()
{		
    var f_lat;
    var f_lon;    
    var t_lat;
    var t_lon;
    var f_point;
    var t_point;
    var f_id;
    var t_id;                  
    var rstate;
    var pt_idx;
				
    var request4 = GXmlHttp.create();

    request4.open("GET", RhumbFile, false);
    request4.onreadystatechange = function()
    { 
            
        rstate = request4.readyState;
        if (rstate == 4)
        {             
            // ========= Now process the Course ===========
            var xmlDoc4 = GXml.parse(request4.responseText);

            // ========= Now process the polylines ===========
            var rhumbs = xmlDoc4.documentElement.getElementsByTagName("rhumbs");
            
            pt_idx = 0;

            // read each line
            for (var a = 0; a < rhumbs.length; a++) 
            {
                var colour = rhumbs[a].getAttribute("colour");
                var width  = parseFloat(rhumbs[a].getAttribute("width"));
                // read each point on that line
                var Rlines = rhumbs[a].getElementsByTagName("rline"); 

                for (var b = 0; b < Rlines.length; b++) 
                {
                    var polyOptions = {geodesic:true};
                    var pts = [];

                    f_id        = parseInt(Rlines[b].getAttribute("f_id"));
                    f_lat       = Smarkers[f_id].myLat;
                    f_lon       = Smarkers[f_id].myLon;
                    f_point     = new GLatLng(parseFloat(f_lat),parseFloat(f_lon));
                    pts[0]      = f_point;


                    t_id        = parseInt(Rlines[b].getAttribute("t_id"));
                    t_lat       = Smarkers[t_id].myLat;
                    t_lon       = Smarkers[t_id].myLon;
                    t_point     = new GLatLng(parseFloat(t_lat),parseFloat(t_lon));
                    pts[1]      = t_point;
 
                    var ttip1   = "From: "+Smarkers[f_id].mySDesc+"\nTo: "+Smarkers[t_id].mySDesc;
                    var tDist   = dist( pts[0], pts[1] );
                        tDist   = (+tDist/(+feet2nm)).toFixed(2);
                    var tBear   = bearing( pts[0], pts[1] );
                    var ttip    = "<font style='FONT-SIZE:12pt' color='#000000' face='Arial'>";
                        ttip    = ttip+Smarkers[f_id].mySDesc+" ---> "+Smarkers[t_id].mySDesc;
                        ttip    = ttip+"<br />Dist:&nbsp;&nbsp;&nbsp;&nbsp;"+tDist+"nm"+"<br />Bear:&nbsp;&nbsp;&nbsp;&nbsp;"+tBear;
                        ttip    = ttip+"</font>";

                    tips[pt_idx]  = ttip;

                    var poly = createPolyline(pts,colour,width,0.20,f_id,ttip);
                    //var poly = new GPolyline(pts, colour, width, 0.20); 

                    rhumblines.push(poly);
                    pt_idx++;
                }
            }
        }
    }
    request4.send(null);
}
