// google/position.js  2008 0105 1138
var PIo2=(Math.PI/2.),PIx2=(Math.PI+Math.PI);
var CentIncr,SqCentIncr,Xaxis,Yaxis,PolarAngle,DistanceVector;
var aPos=new Array();
var aOrbEl=new Array();
function position(pYear,pMonth,pDay,pHour){
  aOrbEl.push(358.4758,35999.0498,-0.0002,0.01675,-0.00004,0.,1.,101.2208,1.7192,0.00045, 0.,0.,0.,0.,0.,0.);
  aOrbEl.push(102.2794,149472.515,0.,0.205614,0.00002,0.,0.3871,28.7538,0.3703,0.0001,47.1459,1.1852, 0.0002,7.009,0.00186,0.);
  aOrbEl.push(212.6032,58517.8039,0.0013,0.00682,-0.00005,0.,0.7233,54.3841,0.5082,-0.0014,75.7796,0.8998, 0.0004,3.3936,0.001,0.);
  aOrbEl.push(319.5294,19139.8585,0.0018,0.09331,0.000092,0.,1.5237,285.4318,1.0697,0.0001,48.7864,0.77099, 0.,1.8503,-0.0007,0.00001);
  aOrbEl.push(225.4928,3033.6879,0.,0.04838,-0.000015,0.,5.2029,273.393,1.3383,0.,99.4198,1.0583,0., 1.3097,-0.0052,0.,-0.001,-0.0005,0.0045,0.0051,581.7,-9.7,-0.0005,2510.7,-12.5,-0.0026, 1313.7,-61.4,0.0013,2370.79,-24.6,-0.0013,3599.3,37.7,-0.001,2574.7,31.4,-0.00096,6708.2, -114.5,-0.0006,5499.4,-74.97,-0.0013,1419.,54.2,0.0006,6339.3,-109.,0.0007,4824.5,-50.9,0.002, -0.0134,0.0127,-0.0023,676.2,0.9,0.00045,2361.4,174.9,0.0015,1427.5,-188.8,0.0006,2110.1, 153.6,0.0014,3606.8,-57.7,0.0017,2540.2,121.7,-0.00099,6704.8,-22.3,-0.0006,5480.2,24.5, 0.00096,1651.3,-118.3,0.0006,6310.8,-4.8,0.0007,4826.6,36.2);
  aOrbEl.push(174.2153,1223.50796,0.,0.05423,-0.0002,0.,9.5525,338.9117,-0.3167,0.,112.8261,0.8259,0., 2.4908,-0.0047,0.,-0.0009,0.0037,0.,0.0134,1238.9,-16.4,-0.00426,3040.9,-25.2,0.0064,1835.3, 36.1,-0.0153,610.8,-44.2,-0.0015,2480.5,-69.4,-0.0014,0.0026,0.,0.0111,1242.2,78.3,-0.0045, 3034.96,62.8,-0.0066,1829.2,-51.5,-0.0078,640.6,24.2,-0.0016,2363.4,-141.4,0.0006,-0.0002,0., -0.0005,1251.1,43.7,0.0005,622.8,13.7,0.0003,1824.7,-71.1,0.0001,2997.1,78.2);
  aOrbEl.push(74.1757,427.2742,0.,0.04681,0.00042,0.,19.2215,95.6863,2.0508,0.,73.5222,0.5242,0.,0.7726, 0.0001,0.,-0.0021,-0.0159,0.,0.0299,422.3,-17.7,-0.0049,3035.1,-31.3,-0.0038,945.3,60.1, -0.0023,1227.,-4.99,0.0134,-0.02186,0.,0.0317,404.3,81.9,-0.00495,3037.9,57.3,0.004,993.5,-54.4, -0.0018,1249.4,79.2,-0.0003,0.0005,0.,0.0005,352.5,-54.99,0.0001,3027.5,54.2,-0.0001,1150.3,-88.);
  aOrbEl.push(30.13294,240.45516,0.,0.00913,-0.00127,0.,30.11375,284.1683,-21.6329,0.,130.68415,1.1005,0., 1.7794,-0.0098,0.,0.1832,-0.6718,0.2726,-0.1923,175.7,31.8,0.0122,542.1,189.6,0.0027,1219.4, 178.1,-0.00496,3035.6,-31.3,-0.1122,0.166,-0.0544,-0.00496,3035.3,58.7,0.0961,177.1,-68.8, -0.0073,630.9,51.,-0.0025,1236.6,78.,0.00196,-0.0119,0.0111,0.0001,3049.3,44.2,-0.0002,893.9,48.5, 0.00007,1416.5,-25.2);
  aOrbEl.push(229.781,145.1781,0.,0.24797,0.002898,0.,39.539,113.5366,0.2086,0.,108.9441,1.3739,0.,17.1514, -0.0161,0.,-0.0426,0.073,-0.029,0.0371,372.,-331.3,-0.0049,3049.6,-39.2,-0.0108,566.2,318.3, 0.0003,1746.5,-238.3,-0.0603,0.5002,-0.6126,0.049,273.97,89.97,-0.0049,3030.6,61.3,0.0027,1075.3, -28.1,-0.0007,1402.3,20.3,0.0145,-0.0928,0.1195,0.0117,302.6,-77.3,0.00198,528.1,48.6,-0.0002, 1000.4,-46.1);
  aHarmonicTerm=new Array();
  aHarmonicTerm[1]=0.;
  aHarmonicTerm[2]=0.;
  aHarmonicTerm[3]=0.;
  aHarmonicTerms=new Array();//integers
  sYear=parseFloat(pYear);
  sMonth=parseFloat(pMonth);
//  sDay=parseFloat(pDay);
  sDay=parseFloat(pDay)+(parseFloat(pHour)/24);
  JulianDay=(367.*sYear)-Math.floor(7.*(sYear+Math.floor((sMonth+9.)/12.))/4.);
  JulianDay+=Math.floor(275.*sMonth/9.)+sDay+1721013.5-(0.5*Sgn(100.*sYear+sMonth-190002.5))+0.5;
  CentIncr=(JulianDay-2415020.)/36525.;
  SqCentIncr=CentIncr*CentIncr;
  for(iPlanet=1;iPlanet<11;iPlanet++){
    if(iPlanet==2){
      MoonPos=3600.;
      Aberration=973563.+(1732564379.*CentIncr)-(4.*SqCentIncr);
      Zaxis=1012395.+(6189.*CentIncr);
      Yaxis=1203586.+(14648523.*CentIncr)-(37.*SqCentIncr);
      MoonSunElongation=1262655.+(1602961611.*CentIncr)-(5.*SqCentIncr);
      Obliquity=(Math.PI/180.)/MoonPos;
      MeanLunarNode=933060.-(6962911.*CentIncr)+(7.5*SqCentIncr);
      Longitude=(Aberration-Yaxis)*Obliquity;
      Z=(Aberration-MoonSunElongation-Zaxis)*Obliquity;
      F=(Aberration-MeanLunarNode)*Obliquity;
      MoonSunElongation=MoonSunElongation*Obliquity;
      Yaxis=2.*MoonSunElongation;
      Vertex=22639.6*Math.sin(Longitude)-4586.4*Math.sin(Longitude-Yaxis)+2369.9*Math.sin(Yaxis);
      Vertex+=769.*Math.sin(2.*Longitude)-669.*Math.sin(Z);
      Vertex-=411.6*Math.sin(2.*F)-212.*Math.sin(2.*Longitude-Yaxis)-206.*Math.sin(Longitude+Z-Yaxis);
      Vertex+=192.*Math.sin(Longitude+Yaxis)-165.*Math.sin(Z-Yaxis);
      Vertex+=148.*Math.sin(Longitude-Z)-125.*Math.sin(MoonSunElongation)-110.*Math.sin(Longitude+Z);
      Vertex-=55.*Math.sin(2.*F-Yaxis);
      Vertex-=45.*Math.sin(Longitude+2.*F)+40.*Math.sin(Longitude-2.*F);
      aPos[2]=MOD360((Aberration+Vertex)/MoonPos);
    }else{
      Vertex=MOD2PI(OrbEl());
      Obliquity=Vertex;
      Eccentricity=Rad2Deg(OrbEl());
      MeanAnomaly=Obliquity;
      for(P=1;P<=5;P++){
        MeanAnomaly=Obliquity+Eccentricity*Math.sin(MeanAnomaly);
      }
      SemiMajorAxis=aOrbEl.shift();
      Velocity=0.01720209/( (Math.pow(SemiMajorAxis,1.5)) *(1.-Eccentricity*Math.cos(MeanAnomaly)));
      PerifocalX=-SemiMajorAxis*Velocity*Math.sin(MeanAnomaly);
      if((1.-Eccentricity*Eccentricity)<0.){
        PerifocalY=0.;
      }else{
        PerifocalY=SemiMajorAxis*Velocity*Math.sqrt(1.-Eccentricity*Eccentricity)*Math.cos(MeanAnomaly);
      }
      Perihelion=OrbEl();
      AscendingNode=OrbEl();
      Inclination=OrbEl();
      if(Math.sin(MeanAnomaly)<.000001){
        PerifocalX=0.;
      }
      Xaxis=PerifocalX;
      Yaxis=PerifocalY;
      RectToPolar(Xaxis,Yaxis);
      PolarAngle=PolarAngle+Perihelion;
      PolarToRect(PolarAngle,DistanceVector);
      MoonSunElongation=Xaxis;
      Xaxis=Yaxis;
      Yaxis=0.;
      RectToPolar(Xaxis,Yaxis);
      PolarAngle=PolarAngle+Inclination;
      PolarToRect(PolarAngle,DistanceVector);
      Zaxis=Yaxis;
      Yaxis=Xaxis;
      Xaxis=MoonSunElongation;
      RectToPolar(Xaxis,Yaxis);
      PolarAngle+=AscendingNode;
      if(PolarAngle<0.){
        PolarAngle+=PIx2;
      }
      PolarToRect(PolarAngle,DistanceVector);
      HelioEclipticX=Xaxis;
      HelioEclipticY=Yaxis;
      HelioEclipticZ=Zaxis;
      if(iPlanet==1){
        SunX=-HelioEclipticX;
        SunY=-HelioEclipticY;
        SunZ=-HelioEclipticZ;
      }else{
        PerifocalX=HelioEclipticX+SunX;
        PerifocalY=HelioEclipticY+SunY;
      }
      Xaxis=SemiMajorAxis*(Math.cos(MeanAnomaly)-Eccentricity);
      Yaxis=SemiMajorAxis*Math.sin(MeanAnomaly)*Math.sqrt(1.-Eccentricity*Eccentricity);
      RectToPolar(Xaxis,Yaxis);
      PolarAngle=PolarAngle+Perihelion;
      PolarToRect(PolarAngle,DistanceVector);
      MoonSunElongation=Xaxis;
      Xaxis=Yaxis;
      Yaxis=0.;
      RectToPolar(Xaxis,Yaxis);
      PolarAngle=PolarAngle+Inclination;
      PolarToRect(PolarAngle,DistanceVector);
      Zaxis=Yaxis;
      Yaxis=Xaxis;
      Xaxis=MoonSunElongation;
      RectToPolar(Xaxis,Yaxis);
      PolarAngle=PolarAngle+AscendingNode;
      if(PolarAngle<0.){
        PolarAngle=PolarAngle+PIx2;
      }
      PolarToRect(PolarAngle,DistanceVector);
      HarmonicX=Xaxis;
      HarmonicY=Yaxis;
      HarmonicZ=Zaxis;
      if(iPlanet>5){
        aHarmonicTerms[1]=11;
        aHarmonicTerms[2]=5;
        aHarmonicTerms[3]=4;
        aHarmonicTerms[4]=4;
        aHarmonicTerms[5]=4;
        for(IK=1;IK<=3;IK++){
          if((iPlanet==6)&&(IK==3)){
            aHarmonicTerm[3]=0.;
          }else{
            if(IK==3){
              aHarmonicTerms[iPlanet-5]=aHarmonicTerms[iPlanet-5]-1;
            }
            SemiMajorAxis=OrbEl();
            PolarAngle=0.;
            for(IJ=1;IJ<=aHarmonicTerms[iPlanet-5];IJ++){
              Aberration=aOrbEl.shift();
              Vertex=aOrbEl.shift();
              HelioDailyMotion=aOrbEl.shift();
              PolarAngle=Deg2Rad(PolarAngle+Aberration)*Math.cos(Deg2Rad(Vertex*CentIncr+HelioDailyMotion));
            }
            aHarmonicTerm[IK]=Rad2Deg(SemiMajorAxis+PolarAngle);
          }
        }
        HarmonicX=HarmonicX+aHarmonicTerm[2];
        HarmonicY=HarmonicY+aHarmonicTerm[1];
        HarmonicZ=HarmonicZ+aHarmonicTerm[3];
      }
      HelioDailyMotion=(HarmonicX*HelioEclipticY-HarmonicY*HelioEclipticX);
      HelioDailyMotion/=(HarmonicX*HarmonicX+HarmonicY*HarmonicY);
      if(iPlanet==1){
        EarthSunX=HarmonicX;
        EarthSunY=HarmonicY;
        EarthSunZ=HarmonicZ;
      }else{
        HarmonicX=HarmonicX-EarthSunX;
        HarmonicY=HarmonicY-EarthSunY;
        HarmonicZ=HarmonicZ-EarthSunZ;
        HelioDailyMotion=(HarmonicX*PerifocalY-HarmonicY*PerifocalX)/(HarmonicX*HarmonicX+HarmonicY*HarmonicY);
      }
      if((HarmonicX*HarmonicX+HarmonicY*HarmonicY+HarmonicZ*HarmonicZ)<0.){
        Aberration=0.;
      }else{
        Aberration=Math.sqrt(HarmonicX*HarmonicX+HarmonicY*HarmonicY+HarmonicZ*HarmonicZ);
        Aberration=Rad2Deg(0.0057756*Aberration*HelioDailyMotion);
      }
      if(iPlanet==1){
        Longitude=MOD360(259.18328-1934.1419*CentIncr);
        MoonPos=MOD360(279.69668+36000.76*CentIncr);
        NU=(-(17.2327+0.01737*CentIncr)*Math.sin(Deg2Rad(Longitude))-1.273*Math.sin(Deg2Rad(2.*MoonPos)));
        NU/=3600.;
      }
      RectToPolar(HarmonicX,HarmonicY);
      Vertex=Rad2Deg(PolarAngle)+NU-Aberration;
      if(iPlanet==1){
        Vertex+=180.;
      }
      aPos[iPlanet]=MOD360(Vertex);
    }
  }
  //returns aPos
}
function OrbEl(){
  lVertex=aOrbEl.shift();
  lAberration=aOrbEl.shift();
  lLongitude=aOrbEl.shift();
  lOrbEl=Deg2Rad(lVertex+(lAberration*CentIncr)+(lLongitude*SqCentIncr));
  return lOrbEl;
}
function MOD2PI(pDegrees){
  return pDegrees-(Math.floor(pDegrees/PIx2)*PIx2);
}
function MOD360(pDegrees){
  return pDegrees-(Math.floor(pDegrees/360.)*360.);
}
function MOD30(pDegrees){
  return pDegrees-(Math.floor(pDegrees/30.)*30.);
}
function PolarToRect(pPolarAngle,pDistanceVector){
  lPolarAngle=pPolarAngle;
  if(lPolarAngle==0.){
    lPolarAngle=0.0000000017;
  }
  Xaxis=pDistanceVector*Math.cos(lPolarAngle);
  Yaxis=pDistanceVector*Math.sin(lPolarAngle);
  //returns Xaxis,Yaxis
  return;
}
function RectToPolar(pXaxis,pYaxis){
  lYaxis=pYaxis;
  if((lYaxis==0.)||(isNaN(lYaxis))){
    lYaxis=0.0000000017;
  }
  lXaxis=pXaxis;
  DistanceVector=Math.sqrt((lXaxis*lXaxis)+(lYaxis*lYaxis));
  PolarAngle=Math.atan(lYaxis/lXaxis);
  if(PolarAngle<0.){
    PolarAngle=PolarAngle+Math.PI;
  }
  if(lYaxis<0.){
    PolarAngle=PolarAngle+Math.PI;
  }
  //returns DistanceVector,PolarAngle
  return;
}
function Sgn(pNumber){
  lSgn=((pNumber<0.) ? -1. : 1.);
  return lSgn;
}
function Deg2Rad(pDegree){
  return (pDegree*PIx2/360.);
}
function Rad2Deg(pRadian){
  return (360.*pRadian/PIx2);
}
function SecToDeg(pSec){
  lX=Sgn(pSec)*((Math.abs(pSec)-Math.floor(Math.abs(pSec)))*0.6+Math.floor(Math.abs(pSec)))*100.+0.5;
W('SecToDeg pSec='+pSec+' return='+(Math.floor(lX)/100.) );
  return (Math.floor(lX)/100.);
}

