function CopyToStartPoint()
{
    document.getElementById('Deg1Lat').value = document.getElementById('Deg2Lat').value;
    document.getElementById('Min1Lat').value = document.getElementById('Min2Lat').value;
    document.getElementById('Sec1Lat').value = document.getElementById('Sec2Lat').value;
    document.getElementById('Side1LatN').checked = document.getElementById('Side2LatN').checked;
    document.getElementById('Side1LatS').checked = document.getElementById('Side2LatS').checked;
    
    document.getElementById('Deg1Lon').value = document.getElementById('Deg2Lon').value;
    document.getElementById('Min1Lon').value = document.getElementById('Min2Lon').value;
    document.getElementById('Sec1Lon').value = document.getElementById('Sec2Lon').value;
    document.getElementById('Side1LonW').checked = document.getElementById('Side2LonW').checked;
    document.getElementById('Side1LonE').checked = document.getElementById('Side2LonE').checked;       
}

function CopyToEndPoint()
{
    document.getElementById('Deg2Lat').value = document.getElementById('Deg1Lat').value;
    document.getElementById('Min2Lat').value = document.getElementById('Min1Lat').value;
    document.getElementById('Sec2Lat').value = document.getElementById('Sec1Lat').value;
    document.getElementById('Side2LatN').checked = document.getElementById('Side1LatN').checked;
    document.getElementById('Side2LatS').checked = document.getElementById('Side1LatS').checked;
    
    document.getElementById('Deg2Lon').value = document.getElementById('Deg1Lon').value;
    document.getElementById('Min2Lon').value = document.getElementById('Min1Lon').value;
    document.getElementById('Sec2Lon').value = document.getElementById('Sec1Lon').value;
    document.getElementById('Side2LonW').checked = document.getElementById('Side1LonW').checked;
    document.getElementById('Side2LonE').checked = document.getElementById('Side1LonE').checked;       
}

function CalcEndPoint()
{
    // Variables
    var longSigned = new LongLat();
    var latSigned = new LongLat();    
    var startPoint = new DMSPoint();
    var endPoint = new DMSPoint();
    var course = new LongLat();
    coord = new LongLat();
    averageLatitudeCoord = new LatitudeCoord();
    distance = 0;    
    
    // test data
    //SetDMS( 32.5, startPoint.latitude) ;
    //SetDMS( 2, startPoint.longitude ) ;    
    //SetDMS( 40, course  ) ;
    //distance = 60; 
    
    // Get form data
    GetData( startPoint.latitude, 'Deg1Lat', 'Min1Lat', 'Sec1Lat', 'Side1LatS' );
    GetData( startPoint.longitude, 'Deg1Lon', 'Min1Lon', 'Sec1Lon', 'Side1LonW' );
    GetData( course, 'DegCourse', 'MinCourse', 'SecCourse', '' );
    if ( document.getElementById('Distance').value != "" )
        distance = parseFloat( document.getElementById('Distance').value );
    
    // ****************************************************
    // Calculation
    // Step 0: show signed data:
    SetDMS( GetDegrees( startPoint.latitude ), latSigned );
    SetDMS( GetDegrees( startPoint.longitude ), longSigned );
    if( latSigned.sign < 0 ) 
        document.getElementById('ResultEndPointLat1').innerHTML = "<em>" + GetDMSString( latSigned ) + "</em>";
    else
        document.getElementById('ResultEndPointLat1').innerHTML = GetDMSString( latSigned );    
    if( longSigned.sign < 0 ) 
        document.getElementById('ResultEndPointLong1').innerHTML = "<em>" + GetDMSString( longSigned ) + "</em>";    
    else
        document.getElementById('ResultEndPointLong1').innerHTML = GetDMSString( longSigned );        
    
    // Step 1: Latitude Increment
    alpha = GetDegrees( course );
    incrLatitude = distance * Math.cos( alpha * Math.PI / 180 );
    SetDMS( incrLatitude / 60.0, coord ); 
    document.getElementById('ResultEndPoint1').innerHTML = Round( incrLatitude, 8 ) + "' = " + GetDMSString( coord ) + " = " + GetDMString( coord );
    incrLatitude = incrLatitude / 60.0 ;

    // Step 2: Local Longitude Increment (Apartamiento)
    A = distance * Math.sin( alpha * Math.PI / 180 );
    SetDMS( A / 60.0, coord );     
    document.getElementById('ResultEndPoint2').innerHTML = Round( A, 8 ) + "' = " + GetDMSString( coord ) + " = " + GetDMString( coord );
    A = A / 60.0;

    // Step 3: End Point Latitude
    endLatitude = GetDegrees( startPoint.latitude ) + incrLatitude;
    SetDMS( endLatitude, endPoint.latitude ); 
    document.getElementById('ResultEndPoint3').innerHTML = Round( endLatitude, 8 ) + "&deg = <strong>" + GetDMSString( endPoint.latitude ) + " = " + GetDMString( endPoint.latitude ) + "</strong>";
    SetData( endPoint.latitude, 'Deg2Lat', 'Min2Lat', 'Sec2Lat', 'Side2LatS', 'Side2LatN' );
    
    // Step 4: Average Latitude
    averageLatitude = ( GetDegrees( startPoint.latitude ) + endLatitude ) / 2;
    SetDMS( averageLatitude, averageLatitudeCoord );     
    document.getElementById('ResultEndPoint4').innerHTML = Round( averageLatitude, 8 ) + "&deg = " + GetDMSString( averageLatitudeCoord ) + " = " + GetDMString( averageLatitudeCoord );

    // Step 5: Longitude Increment
    longitudeIncr = A / Math.cos( averageLatitude * Math.PI / 180 );
    document.getElementById('ResultEndPoint5').innerHTML = Round( longitudeIncr, 8 ) + "&deg";

    // Step 6: End Point Longitude
    endLongitude = GetDegrees( startPoint.longitude ) + longitudeIncr;
    while( endLongitude > 180 )
        endLongitude = endLongitude - 360;
    while( endLongitude < -180 )
        endLongitude = endLongitude + 360;

    SetDMS( endLongitude, endPoint.longitude );
    document.getElementById('ResultEndPoint6').innerHTML = Round( endLongitude, 8 ) + "&deg = <strong>" + GetDMSString( endPoint.longitude ) + " = " + GetDMString( endPoint.longitude ) + "</strong>";
    SetData( endPoint.longitude, 'Deg2Lon', 'Min2Lon', 'Sec2Lon', 'Side2LonW', 'Side2LonE' );

    // set image
    if ( incrLatitude >= 0 )
    {
        if ( A >= 0 )
            document.getElementById('ResultEndPointImage').innerHTML = '<img src="images/c1.gif"/>';
        else
            document.getElementById('ResultEndPointImage').innerHTML = '<img src="images/c4.gif"/>';        
    }
    else
    {
        if ( A > 0 )
            document.getElementById('ResultEndPointImage').innerHTML = '<img src="images/c2.gif"/>';        
        else
            document.getElementById('ResultEndPointImage').innerHTML = '<img src="images/c3.gif"/>';        
    }

    // ****************************************************

    // Hide CourseDistance Result
    a = document.getElementById('ResultCourseDistance');
    a.style.display = 'none';

    // Show EndPoint Result    
    a = document.getElementById('ResultEndPoint');
    a.style.display = 'block';
    
    // Hide CourseDistanceOrto Result
    a = document.getElementById('ResultCourseDistanceOrto');
    a.style.display = 'none';    
}

function CalcCourseDistance()
{
    // Variables
    var longSigned = new LongLat();
    var latSigned = new LongLat();
    var startPoint = new DMSPoint();
    var endPoint = new DMSPoint();
    var course = new LongLat();
    var coord = new LongLat();
    averageLatitudeCoord = new LatitudeCoord();
    distance = 0;    

    // Get form data
    GetData( startPoint.latitude, 'Deg1Lat', 'Min1Lat', 'Sec1Lat', 'Side1LatS' );
    GetData( startPoint.longitude, 'Deg1Lon', 'Min1Lon', 'Sec1Lon', 'Side1LonW' );
    GetData( endPoint.latitude, 'Deg2Lat', 'Min2Lat', 'Sec2Lat', 'Side2LatS' );
    GetData( endPoint.longitude, 'Deg2Lon', 'Min2Lon', 'Sec2Lon', 'Side2LonW' );
    
    // ****************************************************
    // Calculation
    // Step 0: show signed data:
    SetDMS( GetDegrees( startPoint.latitude ), latSigned );
    SetDMS( GetDegrees( startPoint.longitude ), longSigned );
    if( latSigned.sign < 0 ) 
        document.getElementById('ResultCourseDistanceLat1').innerHTML = "<em>" + GetDMSString( latSigned ) + "</em>";
    else
        document.getElementById('ResultCourseDistanceLat1').innerHTML = GetDMSString( latSigned );    
    if( longSigned.sign < 0 ) 
        document.getElementById('ResultCourseDistanceLong1').innerHTML = "<em>" + GetDMSString( longSigned ) + "</em>";    
    else
        document.getElementById('ResultCourseDistanceLong1').innerHTML = GetDMSString( longSigned );        

    SetDMS( GetDegrees( endPoint.latitude ), latSigned );
    SetDMS( GetDegrees( endPoint.longitude ), longSigned );
    if( latSigned.sign < 0 ) 
        document.getElementById('ResultCourseDistanceLat2').innerHTML = "<em>" + GetDMSString( latSigned ) + "</em>";
    else
        document.getElementById('ResultCourseDistanceLat2').innerHTML = GetDMSString( latSigned );    
    if( longSigned.sign < 0 ) 
        document.getElementById('ResultCourseDistanceLong2').innerHTML = "<em>" + GetDMSString( longSigned ) + "</em>";    
    else
        document.getElementById('ResultCourseDistanceLong2').innerHTML = GetDMSString( longSigned );        

    // Step 1: Latitude Increment
    incrLatitude = GetDegrees( endPoint.latitude ) - GetDegrees( startPoint.latitude ) ;
    document.getElementById('ResultCourseDistance1').innerHTML = Round( incrLatitude, 8 ) + "&deg = " + Round( incrLatitude * 60 , 8 ) + "'";
    incrLatitude = incrLatitude * 60; //conversion to minutes
    
    // Step 2: Longitude Increment
    incrLongitude = GetDegrees( endPoint.longitude ) - GetDegrees( startPoint.longitude ) ;
    if ( incrLongitude < 180 ) 
        incrLongitude = 360 + incrLongitude ;
    if ( incrLongitude > 180 ) 
        incrLongitude = incrLongitude - 360 ;        
    document.getElementById('ResultCourseDistance2').innerHTML = Round( incrLongitude, 8 ) + "&deg = " + Round( incrLongitude * 60 , 8 ) + "'";
    
    // Step 3: End Point Latitude
    averageLatitude = ( GetDegrees( endPoint.latitude ) + GetDegrees( startPoint.latitude ) ) / 2;
    document.getElementById('ResultCourseDistance3').innerHTML = Round( averageLatitude, 8 ) + "&deg";
    
    // Step 4: Average Latitude
    A = incrLongitude * 60 * Math.cos( averageLatitude * Math.PI / 180 ); 
    document.getElementById('ResultCourseDistance4').innerHTML = Round( A , 8 ) + "'";

    // Step 5: Longitude Increment
    D = Math.sqrt( A * A + incrLatitude * incrLatitude ) ;
    document.getElementById('ResultCourseDistance5').innerHTML = "<strong>" + Round( D , 6 ) + "'" + "</strong>";
    document.getElementById( 'Distance' ).value = Round( D , 6 );

    // Step 6: End Point Latitude
    if ( incrLatitude == 0 )
    {
        if ( A > 0 ) 
            R1 = 90.0;
        else
            R1 = -90.0;
    }
    else
        R1 = Round( Math.atan( A / incrLatitude ) * 180 / Math.PI, 6 );
    R = Math.atan2( A, incrLatitude ) * 180 / Math.PI;
    if( R < 0 ) 
        R = 360 + R;
    SetDMS( R, coord ) ;

    // set image
    sCommentMark = "";
    sAlphaFormula = "";
    if ( incrLatitude >= 0 )
    {
        if ( A >= 0 )
        {
            document.getElementById('ResultCourseDistanceImage').innerHTML = '<img src="images/c1.gif"/>';
            sAlphaFormula = "&alpha; = ";
        }
        else
        {
            document.getElementById('ResultCourseDistanceImage').innerHTML = '<img src="images/c4.gif"/>';        
            sAlphaFormula = "360&deg; + &alpha; = ";            
        }
        
        document.getElementById('ResultCourseDistanceComment1').style.display = 'none';
    }
    else
    {
        sCommentMark = "&nbsp;<font color='red'><strong>(*)</strong></font>";
        document.getElementById('ResultCourseDistanceComment1').style.display = 'block';
        if ( A >= 0 )
        {
            sAlphaFormula = "&alpha; + 180&deg; = ";            
            document.getElementById('ResultCourseDistanceImage').innerHTML = '<img src="images/c2.gif"/>';        
        }
        else
        {
            document.getElementById('ResultCourseDistanceImage').innerHTML = '<img src="images/c3.gif"/>';        
            sAlphaFormula = "&alpha; + 180&deg; = ";                        
        }
    }
    
    //set data
    courseQuadrant = new LongLat();
    SetQuadrantCourse( R, courseQuadrant )
    sQuadrantCourse = GetQuadrantCourseString( courseQuadrant )
    document.getElementById('ResultCourseDistance6').innerHTML = R1 + "&deg;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;R = " + sAlphaFormula + "<strong>" + GetDMSString( coord ) + " = " + sQuadrantCourse + " = " + GetDMString( coord ) + "</strong>" + sCommentMark;
    SetData( coord, 'DegCourse', 'MinCourse', 'SecCourse', '', '' );
    
    // ****************************************************


    // Show CourseDistance Result
    a = document.getElementById('ResultCourseDistance');
    a.style.display = 'block';
    // Hide EndPoint Result
    a = document.getElementById('ResultEndPoint');
    a.style.display = 'none';

    // Hide CourseDistanceOrto Result
    a = document.getElementById('ResultCourseDistanceOrto');
    a.style.display = 'none';
}

function CalcCourseDistanceOrto()
{
    // Variables
    var incLongitude, absIncrLongitude;
    var latSigned = new LongLat();
    var longSigned = new LongLat();        
    var startPoint = new DMSPoint();
    var endPoint = new DMSPoint();
    var course = new LongLat();
    var distance;

    distance = 0;    

    // Get form data
    GetData( startPoint.latitude, 'Deg1Lat', 'Min1Lat', 'Sec1Lat', 'Side1LatS' );
    GetData( startPoint.longitude, 'Deg1Lon', 'Min1Lon', 'Sec1Lon', 'Side1LonW' );
    GetData( endPoint.latitude, 'Deg2Lat', 'Min2Lat', 'Sec2Lat', 'Side2LatS' );
    GetData( endPoint.longitude, 'Deg2Lon', 'Min2Lon', 'Sec2Lon', 'Side2LonW' );
    
    // ****************************************************
    // Calculation
    // Step 0: show signed data:
    SetDMS( GetDegrees( startPoint.latitude ), latSigned );
    SetDMS( GetDegrees( startPoint.longitude ), longSigned );
    if( latSigned.sign < 0 ) 
        document.getElementById('ResultCourseDistanceLatOrto1').innerHTML = "<em>" + GetDMSString( latSigned ) + "</em>";
    else
        document.getElementById('ResultCourseDistanceLatOrto1').innerHTML = GetDMSString( latSigned );    
    if( longSigned.sign < 0 ) 
        document.getElementById('ResultCourseDistanceLongOrto1').innerHTML = "<em>" + GetDMSString( longSigned ) + "</em>";    
    else
        document.getElementById('ResultCourseDistanceLongOrto1').innerHTML = GetDMSString( longSigned );        

    SetDMS( GetDegrees( endPoint.latitude ), latSigned );
    SetDMS( GetDegrees( endPoint.longitude ), longSigned );
    if( latSigned.sign < 0 ) 
        document.getElementById('ResultCourseDistanceLatOrto2').innerHTML = "<em>" + GetDMSString( latSigned ) + "</em>";
    else
        document.getElementById('ResultCourseDistanceLatOrto2').innerHTML = GetDMSString( latSigned );    
    if( longSigned.sign < 0 ) 
        document.getElementById('ResultCourseDistanceLongOrto2').innerHTML = "<em>" + GetDMSString( longSigned ) + "</em>";    
    else
        document.getElementById('ResultCourseDistanceLongOrto2').innerHTML = GetDMSString( longSigned );        
    
    // Step 1: Longitude Increment
    
    incrLongitude = GetDegrees( endPoint.longitude ) - GetDegrees( startPoint.longitude ) ;
    if ( incrLongitude < 180 ) 
        incrLongitude = 360 + incrLongitude ;
    if ( incrLongitude > 180 ) 
        incrLongitude = incrLongitude - 360 ;      
    
    var sIncrLonSide;
    if (incrLongitude >= 0) 
    {
        sIncrLonSide = endPoint.longitude.cardinalPositive;
        absIncrLongitude = incrLongitude;
    }
    else
    {
        sIncrLonSide = endPoint.longitude.cardinalNegative;
        absIncrLongitude = -incrLongitude;
    } 
        
    
    document.getElementById('ResultCourseDistanceOrto1').innerHTML = Round( incrLongitude, 8 ) + "&deg = " + Round( absIncrLongitude, 8) + "&deg;&nbsp;<strong>" + sIncrLonSide + "</strong>";
    document.getElementById('ResultCourseDistanceOrto3d').innerHTML = sIncrLonSide;

    // Step 2: Distance
    var li, lf, iL;

    lf = GetDegrees( endPoint.latitude ) * Math.PI / 180;
    li = GetDegrees( startPoint.latitude ) * Math.PI / 180;    
    iL = absIncrLongitude * Math.PI / 180;
    
    var cosd = Math.sin( lf ) * Math.sin( li ) +
               Math.cos( lf ) * Math.cos( li )* Math.cos( iL );
               
    document.getElementById('ResultCourseDistanceOrto2a').innerHTML = Round( cosd, 8 );
    document.getElementById('ResultCourseDistanceOrto2b').innerHTML = Round( cosd, 8 );
    distance = Math.acos( cosd ) * 180 / Math.PI; 
    document.getElementById('ResultCourseDistanceOrto2c').innerHTML = Round( distance, 6 ) + "&deg;&nbsp;=&nbsp;" + "<strong>" + Round( distance * 60, 2 ) + "'" + "</strong>";
    document.getElementById( 'Distance' ).value = Round( distance * 60, 2 );
    

    // Step 3: Course
    var cotanr;
    if (Math.abs(absIncrLongitude - 90) < 0.0000001) // prevent division by 0 exception
    {
        cotanr = (Math.tan(lf) / Math.sin(iL)) * Math.cos(li);
        // TODO : Add warning note for calculator error
    }
    else 
    {
        cotanr = ((Math.tan(lf) / Math.sin(iL)) - (Math.tan(li) / Math.tan(iL))) * Math.cos(li);
    }
    
    var sIncrLatSide, abscotanr, rQuad, R;
    if (cotanr >= 0) 
    {
        sIncrLatSide = endPoint.latitude.cardinalPositive;
    }
    else
    {
        sIncrLatSide = endPoint.latitude.cardinalNegative;
    } 
    
    abscotanr = Math.abs( cotanr );
    
    // TODO : Prevent division by 0 error and add warning note for calculator error
    rQuad = Math.atan( 1 / abscotanr ) * 180 / Math.PI;

    var R, R1;
    R = new LongLat();
    R1 = new LongLat();    
    if (incrLongitude >= 0) 
    {
        if (cotanr >= 0) //NE
        {
            SetQuadrantCourse(rQuad, R);
            SetDMS( rQuad, R1);            
        }
        else //SE        
        {
            SetQuadrantCourse(180 - rQuad, R);
            SetDMS( 180 - rQuad, R1);                        
        }
    }
    else
    {
        if (cotanr >= 0) //NW
        {
            SetQuadrantCourse(360 - rQuad, R);
            SetDMS( 360 - rQuad, R1);                        
        }
        else //SW        
        {
            SetQuadrantCourse(180 + rQuad, R);
            SetDMS( 180 + rQuad, R1);                        
        }
    }


    document.getElementById('ResultCourseDistanceOrto3a').innerHTML = Round( cotanr , 8 );
    document.getElementById('ResultCourseDistanceOrto3b').innerHTML = Round( rQuad , 8 ) + "&deg;";
    document.getElementById('ResultCourseDistanceOrto3c').innerHTML = "<strong>" + GetQuadrantCourseString( R ) + "&nbsp;=&nbsp;" +   GetDMString( R1 ) + "</strong>";
    document.getElementById('ResultCourseDistanceOrto3e').innerHTML = sIncrLatSide;
    if (cotanr >= 0) 
        document.getElementById('ResultCourseDistanceOrto3f').innerHTML = "&gt;";
    else
        document.getElementById('ResultCourseDistanceOrto3f').innerHTML = "&lt;";
    
    SetData( R1, 'DegCourse', 'MinCourse', 'SecCourse', '', '' );    

    // Hide CourseDistance Result
    a = document.getElementById('ResultCourseDistance');
    a.style.display = 'none';
    // Hide EndPoint Result
    a = document.getElementById('ResultEndPoint');
    a.style.display = 'none';
    // Show CourseDistanceOrto Result
    a = document.getElementById('ResultCourseDistanceOrto');
    a.style.display = 'block';

}