var cll = document.calcll;
var d2r = Math.PI/180.0;
var r2d = 180.0/Math.PI;
var dinm = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
cll.status.value="Ready...";
var dom = new Array(0,31,59,90,120,151,181,212,243,273,304,334);
dayinmon();
var time=new Array();
var uth=new Array();
var utm=new Array();
var uts=new Array();
var slength=new Array();
var nsample=document.calcll.npts.selectedIndex+5;
var postz=0.0;
//var test=new Array(16,20,1,122.5,16,32,36,119.4,16,44,53,117.5,16,53,23,116.5,17,5,6,115.2,17,12,43,113.9,17,21,17,114.3,17,28,53,114.2,17,39,5,114.1,17,56,47,116.8,18,6,6,118.8,18,14,23,120.7,18,21,35,122.3,18,34,20,126.2,18,48,40,132.4,19,9,19,141.5,19,47,20,166.1);
//setdefault();

//===============
function setdefault() {
//===============
  nsample=17;
  document.calcll.mon.selectedIndex=1;
  document.calcll.day.selectedIndex=15;
  document.calcll.npts.selectedIndex=nsample-5;
  document.calcll.postz.value=91.7;
  setcount();
  for (var i=0; i<nsample; i++) {
    uth[i]=test[4*i];
    utm[i]=test[4*i+1];
    uts[i]=test[4*i+2];
    slength[i]=test[4*i+3];
    time[i]=uth[i]+(utm[i]/60.0)+(uts[i]/3600.0);
  }
  showdata();
}

//==================
function denter() {
//==================
  var i=document.calcll.ipts.selectedIndex;
  postz=document.calcll.postz.value;
  var sl=document.calcll.slen.value;
  var xsl=parseFloat(sl);
  var xpostz=parseFloat(postz);
  if ((isNaN(xsl)) || (isNaN(xpostz))) {
    if (isNaN(xpostz)) {alert("Invalid post height.\nEdit the value and reenter.");}
    if (isNaN(xsl)) {alert("Invalid shadow length.\nEdit the value and reenter.");}
  } else  {
    uth[i]=document.calcll.uth.selectedIndex;
    utm[i]=document.calcll.utm.selectedIndex;
    uts[i]=document.calcll.uts.selectedIndex;
    time[i]=uth[i]+(utm[i]/60.0)+(uts[i]/3600.0);
    slength[i]=xsl;
    showdata();
  }
}

//====================
function setcount() {
//====================
  nsample=document.calcll.npts.selectedIndex+5;
  time.length=0;
  uth.length=0;
  utm.length=0;
  uts.length=0;
  slength.length=0;
  time.length=nsample;
  uth.length=nsample;
  utm.length=nsample;
  uts.length=nsample;
  slength.length=nsample;
  document.calcll.ipts.options.length=0;
  document.calcll.ipts.options.length=nsample;
  for (var i=0; i<nsample;i++) {
    document.calcll.ipts.options[i].text=(i+1).toString(10);
    uth[i]=-1;
  }
  showdata();
}

//====================
function showdata() {
//====================
  var ss="#\tUT Hr\tUT min\tUT sec\tShadow Length";
  for (var i=0; i<nsample; i++) {
    if (uth[i]>= 0) { 
      ss=ss+"\n"+(i+1).toString(10)+".\t"+uth[i].toString(10)+"\t"+utm[i].toString(10)+"\t"+uts[i].toString(10)+"\t"+slength[i].toString(10);
    } else {
      ss=ss+"\n"+(i+1).toString(10)+".\tNo Data";
    }
  }
  document.calcll.log.value=ss;
} 

//======================
function  lond2dms(qdeg) {
//======================
  if (qdeg < 0.0) {
    var qew = "W";
    }
  else {
    var qew = "E";
    }
  qdeg = Math.abs(qdeg);
  var q1 = Math.floor(qdeg);
  var q2 = Math.floor((qdeg-q1)*60.0);
  var q3 = Math.floor((qdeg-q1-(q2/60.0))*3600.0);
  return q1.toString()+"  "+q2.toString()+"\' "+q3.toString()+"\" "+qew;
  }
//======================
function  latd2dms(qdeg) {
//======================
  if (qdeg < 0.0) {
    var qns = "S";
    }
  else {
    var qns = "N";
    }
  qdeg = Math.abs(qdeg);
  var q1 = Math.floor(qdeg);
  var q2 = Math.floor((qdeg-q1)*60.0);
  var q3 = Math.floor((qdeg-q1-(q2/60.0))*3600.0);
  return q1.toString()+"  "+q2.toString()+"\' "+q3.toString()+"\" "+qns;
  }

//=======================
function doy() {
//=======================
  var cll = document.calcll;
  var iday = cll.day.selectedIndex+1;
  var imon = cll.mon.selectedIndex;
  return iday+dom[imon];
  
  }
//=======================
function dayinmon() {
//=======================
  var kk = document.calcll.mon.selectedIndex;
  document.calcll.day.options.length=0;
  document.calcll.day.options.length=dinm[kk];
  var jj=dinm[kk];
  for (var i=0; i<jj; i++) {
    si = (i+1).toString(10);
    document.calcll.day.options[i].text=si;
  }
}

//=====================
function str2int() {
//=====================
  var ixx = 0;
  if (isNaN(parseInt(qsxx))) {
    alert("DE Data Error!\nNot an Integer: "+qsxx);
    ixx = -999;
    }
  else {
    ixx = parseInt(qsxx);
    }
  return ixx;
  }

//======================
function str2real() {
//======================
  var xxx = 0.0;
  if (isNaN(parseFloat(qsxx))) {
    alert("DE Data Error!\nNot an Real Number: "+qsxx);
    xxx = -1.0E30;
    }
  else {
    xxx = parseFloat(qsxx);
    }
  return xxx;
  }

//====================
function sorttime() {
//====================
var temp=0.0;
for (var i=0; i<(nsample-1); i++) {
  for (var j=i+1; j<nsample; j++)
    if (time[j]<time[i]) {
      temp=time[i];
      time[i]=time[j]
      time[j]=temp;
      temp=slength[i];
      slength[i]=slength[j]
      slength[j]=temp;
      temp=uth[i];
      uth[i]=uth[j]
      uth[j]=temp;
      temp=utm[i];
      utm[i]=utm[j]
      utm[j]=temp;
      temp=uts[i];
      uts[i]=uts[j]
      uts[j]=temp;
    }
  }
}

//=====================
function checkdata() {
//=====================
  if (nsample > 0) {
    var ns=0;
    for (var i=0; i<nsample; i++) {
      if (uth[i] >= 0) {
        uth[ns]=uth[i];
        utm[ns]=utm[i];
        uts[ns]=uts[i];
        time[ns]=time[i];
        slength[ns]=slength[i];
        ns++;
      }
    }
    nsample=ns;
    uth.length=ns;
    utm.length=ns;
    uts.length=ns;
    time.length=ns;
    slength.length=ns;
    sorttime();
  } else {
    alert("No UT and shadow data available");
    nsample=0;
  }
}

//=============================
function compute() {
//=============================
cll.status.value="BUSY!";
checkdata();
if (nsample > 0) {
  var imon = cll.mon.selectedIndex;
  var iday = cll.day.selectedIndex+1;
  postz = cll.postz.value;
  var sx=0.0;
  var sx2=0.0;
  var sx3=0.0;
  var sx4=0.0;
  var sy=0.0;
  var sxy=0.0;
  var sx2y=0.0;
  var tmin=0.0;
  var smin=1.0E20;
  for (var i=0; i<nsample; i++) {
    if (smin > slength[i]) {
      smin=slength[i];
      tmin=time[i];
    }
  }
  var xx=0.0;
  var yy=0.0;
  for (var i=0; i<nsample; i++) {
    xx=time[i]-tmin;
    sx=sx+xx;
    sx2=sx2+Math.pow(xx,2);
    sx3=sx3+Math.pow(xx,3);
    sx4=sx4+Math.pow(xx,4);
    yy=slength[i];
    sy=sy+yy;
    sxy=sxy+xx*yy;
    sx2y=sx2y+xx*xx*yy;
  }
  var dqc=sx2*(sx2*sx2-sx3*sx)-sx3*(sx*sx2-nsample*sx3)+sx4*(sx*sx-nsample*sx2);
  var aqc=sy*(sx2*sx2-sx3*sx)-sxy*(sx*sx2-nsample*sx3)+sx2y*(sx*sx-nsample*sx2);
  var bqc=sx2*(sxy*sx2-sx2y*sx)-sx3*(sy*sx2-sx2y*nsample)+sx4*(sy*sx-nsample*sxy);
  var cqc=sx2*(sx2*sx2y-sx3*sxy)-sx3*(sx*sx2y-sx3*sy)+sx4*(sx*sxy-sx2*sy);
  aqc=aqc/dqc;
  bqc=bqc/dqc;
  cqc=cqc/dqc;
  var xt=0.0;
  var xs=0.0;
  var xtnoon = -bqc/(2.0*aqc);
  var xsnoon = aqc*xtnoon*xtnoon+bqc*xtnoon+cqc;;
  xtnoon=xtnoon+tmin;

// fit a line to cos(inc)=sin(decl)sin(lat)+cos(decl)cos(lat)cos(hr_ang)
//                 Y     =        A        +         B           X
  var sx = 0.0;
  var sy = 0.0;
  var sxy = 0.0;
  var sx2 = 0.0;
  var coshrang=0.0;
  var cosinang=0.0;
  for (var i=0; i<nsample; i++) {
    cos_hrang=Math.cos((xtnoon-time[i])*15.0*Math.PI/180.0);
    cos_inang=Math.cos(Math.atan2(slength[i],postz));
    sx=sx+cos_hrang;
    sy=sy+cos_inang;
    sxy=sxy+cos_hrang*cos_inang;
    sx2=sx2+cos_hrang*cos_hrang;
  }
  var slope = (nsample*sxy-sx*sy)/(nsample*sx2-sx*sx);
  var yint = (sy*sx2-sxy*sx)/(nsample*sx2-sx*sx);
  cll.slat.value = latd2dms(r2d*Math.acos(slope/Math.cos(soldecl()))); 
  var lonc=(12.0-xtnoon)/(4.0/60.0);
  cll.slon.value = lond2dms(lonc);
  cll.status.value="Ready...";
  }
}

//=============================
function soldecl() {
//=============================
// solar declination
//=============================
  return d2r*23.45*Math.sin(2.0*Math.PI*((284.0+doy())/365.0));
  }


//============================================
function eot() {
//============================================
  var xx = 2.0*Math.PI * ((doy() - 81.0) / 365.0);
  return (9.87 * Math.sin(2.0*xx) - 7.53 * Math.cos(xx) - 1.5 * Math.sin(xx))/60.0;
}

