//AJAX here
/* This code is (c) By Marios Nicolaou, 5B4WN/G0WWW. Please acknowledge the author if you decide to use any of the functions
Written as part of the logsearch applet for Clublog:  a free service provided by Michael G7VJR
The great circle code was inspired from Jarkko Hietaniemi, Raphael Manfredi code for perl

*/

var	req=GetXmlHttpObject();
var pathX=Array();
var pathY=Array();

var loadingStatus="Loading.... <img src='/charts/images/loading.gif'>";

function myHandler() 
{
    if (req.readyState == 4 ) 
    {
        snippet=req.responseText.split('<!--');
        document.getElementById('qsoResults').innerHTML=snippet[0];
        defineWorked(snippet[2]);
        defineNotWorked(snippet[3]);
        assignOp(snippet[4]);
        qra2mapcoords(snippet[1], 'pin2');
        coords1=qra2mapcoords(myLocator);
        coords2=qra2mapcoords(snippet[1]);
        

        distBear=workOutDistance2(coords1, coords2);
        if ((180+Math.round(distBear[1],0))>360) 
        {
            lp=Math.round(distBear[1],0)-180;
        } 
        else 
        {
            lp=Math.round(distBear[1],0)+180;
        }


		//show('themap');
		document.qrz.hisCall.value=document.qrz.hisCall.value.toUpperCase();
        document.getElementById('info').innerHTML='QSO with:'+document.qrz.hisCall.value+'<br>Distance: '+distBear[0]+'km [LP: '+(40000-distBear[0])+'km]<br> Bearing: '+Math.round(distBear[1],0)+'&deg;  [LP: '+lp+'&deg;]';
         document.getElementById('pin2').title= document.qrz.hisCall.value;
        workOutGeodesicPoints(coords1, coords2);

    }
}

function defineNotWorked(objList) 
{
    objArray=objList.split(",");
    for (x=0; x<objArray.length; x++) 
    {
        if (document.getElementById(objArray[x]) !=null) 
        {
            var spanElement = document.getElementById(objArray[x]);
            spanElement.setAttribute("style", "background-color : red; ");
            spanElement.style.cssText = "background-color : red; ";
        }
    }
}

function defineWorked(objList) 
{
    objArray=objList.split(",");
    for (x=0; x<objArray.length; x++) 
    {
        if (document.getElementById(objArray[x]) !=null) 
        {
            var spanElement = document.getElementById(objArray[x]);
            spanElement.setAttribute("style", "background-color : green; background-image: url(/charts/images/t.png); background-repeat: no-repeat; background-position: center; text-align:center;");
            // spanElement.innerHTML="<span class='tick'>&#10003;</span>"; 
            spanElement.innerHTML="&nbsp;";
            spanElement.style.cssText = "background-color : green; background-image: url(/charts/images/t.png); background-repeat: no-repeat; background-position: center; text-align:center;";
        }
    }
}

function myHandlerSpots() 
{
    if (req.readyState == 4 ) {
        document.getElementById('spots').innerHTML=req.responseText;
    }
}

function myHandlerCQZ() 
{
    if (req.readyState == 4 ) 
    {
        document.getElementById('results').innerHTML=req.responseText;
		document.getElementById('results').style.display='block';
    }
}

function myHandlerQSL() 
{
    if (req.readyState == 4 ) 
    {
        document.getElementById('results').innerHTML=req.responseText;
		document.getElementById('results').style.display='block';
    }
}


function assignOp(opString)
{
    opLines=opString.split('#');
    for (x=0; x<opLines.length; x++) 
    {
        if (opLines[x].length>1) 
        {
            qsoId=opLines[x].split(':');
            opDetails=qsoId[1].split(',');
            if (document.getElementById(qsoId[0])!= null) 
            {
                document.getElementById(qsoId[0]).title="cssbody=[white]  cssheader=[blue] header=[<center>Operator: "+opDetails[0]+"</center>] body=[<center><img src=ops/"+opDetails[1].toLowerCase()+".jpg></center>]";
				if (opDetails[2]>0) {
					
					document.getElementById(qsoId[0]).qsoId=opDetails[2];
					document.getElementById(qsoId[0]).style.backgroundImage="url(/charts/images/tp.png)";
					document.getElementById(qsoId[0]).onclick= function () {  play(this.qsoId);  }
					document.getElementById(qsoId[0]).ondblclick= function () { play(this.qsoId, 1); }	
				}
            }
        }
    }
}




function makeAJAXrequest($url, $type, $qsos)  {
	
	  
    if (req==null)
    {
        alert ("Your browser does not support AJAX!");
        return;
    }
    
    
    req.open("GET", $url , /*async*/true);
    if ($type=='spots') 
    {
        
        req.onreadystatechange = myHandlerSpots;
		
    } else if ($type=='cqz') 
    {
         document.getElementById('results').innerHTML=loadingStatus;
        req.onreadystatechange = myHandlerCQZ;
		    show('none');
    } 	 else if ($type=='qsl') 

	    {
	        
	        document.getElementById('results').innerHTML=loadingStatus;
	        $height=160+$qsos*40;
			if ($height==0) {
				$height=160;
			}
			document.getElementById('results').innerHTML="<iframe src='"+$url+"' height='"+$height+"' style='border: 0pt none;' width='100%' style='overflow: hidden; ' ALLOWTRANSPARENCY=true frameborder=0></iframe>";
			show('none');
			return false;
	    }
     else 
    {
				
        req.onreadystatechange = myHandler;
    }
    req.send(/*no params*/null);
}

function sendRequest() 
{
    hisCall=document.qrz.hisCall.value;
    if (document.qrz.hisCall.value.length>2){
        makeAJAXrequest("/charts/index.php?c="+myCall+"&a=find&sa=findCall&hisCall="+hisCall);
    }
}


function sendRequest2(hisCall) {
	//for leaderboard clicks
    if (hisCall.length>2){
        makeAJAXrequest("/charts/index.php?c="+myCall+"&a=find&sa=findCall&hisCall="+hisCall);
    }

}

function getZone(cqz) 
{
    makeAJAXrequest("/charts/index.php?c="+myCall+"&a=propagation&sa=cqz&saa="+cqz, 'cqz');
}

function getPropagation(mode, call) 
{
    makeAJAXrequest("/charts/index.php?c="+myCall+"&a=propagation&sa="+mode+"&saa="+call, 'cqz');
}

function getLeaderboard(mode, call) 
{
    makeAJAXrequest("/charts/index.php?c="+myCall+"&a=leaderboards&sa="+mode+"&saa="+call, 'cqz');
}

function show(label)
{
    var labels=Array('themap','leaders','spots', 'qsoStats', 'clubs');

    for (i=0; i<labels.length; i++) 
    {
        if (labels[i]==label)	
        {
			document.getElementById('results').style.display='none';
            document.getElementById(labels[i]).style.display='block';
            if (label=='spots' && allowSpotUpdate==true) 
            {
                document.getElementById('spots').innerHTML=loadingStatus;
                makeAJAXrequest('index.php?c='+myCall+'&a=spots&'+Math.random(), 'spots');
				         allowSpotUpdate=false;
				
            } else 
            {

            }
        } else 
        {
            document.getElementById(labels[i]).style.display='none';
        }
    }
	
}

function GetXmlHttpObject()
{
    var xmlHttp=null;
    try
    {
        // Firefox, Opera 8.0+, Safari
        xmlHttp=new XMLHttpRequest();
    }
    catch (e)
    {
        // Internet Explorer
        try
        {
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e)
        {
            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    return xmlHttp;
}

function qra2mapcoords(qra, obj)
{
    val=Array(0,0,0,0,0,0,0,0,0,0);

    for (x=0; x<qra.length; x++) 
    {
        val[x]=qra.charCodeAt(x)-65;
        if (x>1 && x<4) 
        {
            val[x] +=17;
        }
    }

    lon = (val[0] * 20 + val[2] * 2 + val[4] / 12 + val[6] / 120 + val[8] / 2880 - 180)*-1;
    lat = (val[1] * 10 + val[3] + val[5] / 24 + val[7] / 240 + val[9] /5760 - 90);
    if (obj) 
    {
        maptop=(lat*-1+90)*390/180-5;
        mapleft=((lon*-1)+180)*790/360-7;

        document.getElementById(obj).style.display='inline';
        document.getElementById(obj).style.top=maptop+"px";
        document.getElementById(obj).style.left=mapleft+"px";
    } 
    else 
    {
        coordinates=Array(lon, lat);
        return coordinates;
    }
}

function workOutDistance2(coordinates1, coordinates2) 
{
    lat1=coordinates1[1];
    lon1=coordinates1[0];
    returnedArray=[];
    lat2=coordinates2[1];
    lon2=coordinates2[0];

    FA=lat1;
    LA=lon1;
    FB=lat2;
    LB=lon2;

    d=Math.acos(Math.sin(FA.toRad())*Math.sin(FB.toRad())+Math.cos(FA.toRad())*Math.cos(FB.toRad())*Math.cos((LA-LB).toRad()))*6378.14;

    S=Math.cos(FB.toRad())*Math.sin((LA-LB).toRad());
    C=Math.cos(FA.toRad())*Math.sin(FB.toRad())-Math.sin(FA.toRad())*Math.cos(FB.toRad())*Math.cos((LA-LB).toRad());

    var bearing = Math.atan2(S, C).toBrng();

    returnedArray[0]=Math.round(d,2);
    returnedArray[1]=bearing;

    return returnedArray;
}

function great_circle_distance (theta0, phi0, theta1, phi1) 
{
    lat0 = Math.PI/2- phi0;
    lat1 = Math.PI/2- phi1;
    return acos_real( Math.cos( lat0 ) * Math.cos( lat1 ) * Math.cos( theta0 - theta1 ) +  Math.sin( lat0 ) * Math.sin( lat1 ) );
}

function great_circle_direction (theta0, phi0, theta1, phi1) 
{
    lat0= Math.PI/2-phi0;
    lat1= Math.PI/2-phi1;
    distance=great_circle_distance (theta0, phi0, theta1, phi1) ;
    direction= acos_real((Math.sin(lat1)-Math.sin(lat0)* Math.cos(distance))/(Math.cos(lat0)*Math.sin(distance)));
    if (Math.sin(theta1-theta0)<0) 
    {
        direction=Math.PI*2-direction
    }
    return (rad2rad(direction, Math.PI*2));
}

function acos_real(val) 
{
    if (val>=1) 
    {
        return 0;
    } 
    else if (val<= -1) 
    {
        return Math.PI;
    } 
    else  
    {
        return Math.acos(val);
    }
}

function rad2rad(val1, val2) 
{
    return (val1-val2* parseInt(val1/val2));
}

function workOutGeodesicPoints(coordinates1, coordinates2)
{
    //inspired from mapping hacks Hack 30
    step=0.5;
    points=new Array();
    x=0;
    rs='';

    while (Math.abs(coordinates1[0]-coordinates2[0]) >= step || Math.abs(coordinates1[1]-coordinates2[1]) >= step   ) 
    {
        x++;
        bearing=great_circle_direction(coordinates1[0].toRad(), (90-coordinates1[1]).toRad(), coordinates2[0].toRad(), (90-coordinates2[1]).toRad());
        
		//alert(bearing);
        coordinates1[0] +=Math.sin(bearing)* step/ Math.cos(coordinates1[1].toRad());
        coordinates1[1] +=Math.cos(bearing)* step;


		//coordinates on map should be from 180 to -180 
 	   if (coordinates1[0]<-180 )  //means is greater than right margin
        {
				//what if > -540
		   if (coordinates1[0]<-540) {
	             coordinates1[0] +=720;
			} else {
				coordinates1[0] +=180; //was 360 before
			}
			
		} 
		



        if (coordinates1[0]> 180) 
        {
            
				coordinates1[0] -=360;
				
        }

		


        maptop=(coordinates1[1]*-1+90)*390/180-1;
        mapleft=((coordinates1[0]*-1)+180)*790/360-1;
		
        rs  +=   "<img src='/charts/images/plot.png' style='position:absolute; top: "+Math.round(maptop)+"px; left: "+Math.round(mapleft)+"px;'>";
       //document.getElementById('results').innerHTML +=bearing;
		if (x>500) {
			break;
		}
    }

    document.getElementById('plot').style.display='inline';
    document.getElementById('plot').innerHTML=rs;

    //document.getElementById('results').innerHTML=points.join("<br>");
}

function mapCoords(lat, lon) 
{
    map=Array();
    map[0]=(lat*-1+90)*390/180-5;
    map[1]=((lon*-1)+180)*790/360-7;

    return map;
}

Number.prototype.toRad = function() 
{  // convert degrees to radians
    return this * Math.PI / 180;
}

Number.prototype.toDeg = function() 
{  // convert radians to degrees (signed)
    return this * 180 / Math.PI;
}

Number.prototype.toBrng = function() 
{  // convert radians to degrees (as bearing: 0...360)
    return (this.toDeg()+360) % 360;
}
