// SunObject
function SunObject(def){
 this.def=def;
 this.sun0={ishidden:true};
 this.sun1={ishidden:true};
 this.pos={x:0,y:0};
 this.te=0;
 this.d=0;
 this.dawn={astr:0,naut:0};
 this.dusk={astr:0,naut:0};
 this.rise={time:0,azim:0,dir:""};
 this.down={time:0,azim:0,dir:""};
 this.noon={time:0,elev:0};
 this.base={x:400,y:300};
 this.sky={fsdusk:1,fsdawn:-1,r:0,g:0,b:0};
 return true;
}

{var Sun=SunObject.prototype;

Sun.moveSun=function(){
 s0=findObj(document,"sun_0");
 s1=findObj(document,"sun_1");
 sun0=this.sun0;
 sun1=this.sun1;
 var tm=Math.floor(this.dawn.naut*60)+z;
 if(tm<this.rise.time*60){
  this.fadeSky(54,105,183,true);
 }else if(tm>=Math.floor(this.rise.time*60)&&tm<=Math.floor(this.down.time*60)){
  this.setSunPos(tm);
  if(sun0.ishidden&&sun1.ishidden){
   moveObj(s0,this.pos.x,this.pos.y);
   sun0.ishidden=false;
  }else if(!sun0.ishidden&&sun1.ishidden){
   moveObj(s1,this.pos.x,this.pos.y);
   s0.style.visibility='hidden';
   sun1.ishidden=false;
   sun0.ishidden=true;
  }else if(!sun1.ishidden&&sun0.ishidden){
   moveObj(s0,this.pos.x,this.pos.y);
   s1.style.visibility='hidden';
   sun0.ishidden=false;
   sun1.ishidden=true;
  }
 }else if(tm>this.down.time){
  this.fadeSky(54,105,183,false);
 }
 z++;
 if(tm>this.dusk.naut*60){
  window.clearInterval(aktiv);
  alert("ende");
 }
};

Sun.fadeSky=function(r,g,b,s){
 var d=this.sky.fsdusk;
 if(s)d=this.sky.fsdawn;
 this.sky.r+=r/d;
 this.sky.g+=g/d;
 this.sky.b+=b/d;
 this.sky.r=this.sky.r<0?0:this.sky.r;
 this.sky.g=this.sky.g<0?0:this.sky.g;
 this.sky.b=this.sky.b<0?0:this.sky.b;
 window.sky.style.backgroundColor="rgb("+Math.floor(this.sky.r)+","+Math.floor(this.sky.g)+","+Math.floor(this.sky.b)+")";
};

Sun.calcTime=function(el,m){
 with(Math){
  var rad=PI/180;
  var t=(sin(el)-sin(this.def.lati*rad)*sin(this.d))/(cos(this.def.lati*rad)*cos(this.d));
  t=t<-1?-1:t;
  t=t>1?1:t;
  if(m){
   return 11+(15-this.def.longi)/15+this.tz-this.te-12/PI*acos(t);
  }else{
   return 11+(15-this.def.longi)/15+this.tz-this.te+12/PI*acos(t);
  }
 }
};

Sun.initSun=function(Y,M,D){
 window.sunobj=this;
 this.calcSpaceVars(Y,M,D);
};
Sun.calcSpaceVars=function(Y,M,D){
 var rad=Math.PI/180;
 var def=this.def;
 var tz=def.tz;
 this.date=new Date(Y,M,D,12);
 var tmp=new Date(Y-1,11,31);
 var days=Math.floor((this.date.getTime()-tmp.getTime())/24/3600000);
 var da=(Y%4)?(days*360/365):(days*360/366);
 this.d=(3948/10000-232559/10000*Math.cos((da+91/10)*rad)-3915/10000*Math.cos((2*da+54/10)*rad)-1764/10000*Math.cos((3*da+26)*rad))*rad;
 this.te=(66/10000+73525/10000*Math.cos((da+859/10)*rad)+99359/10000*Math.cos((2*da+1089/10)*rad)+3387/10000*Math.cos((3*da+1052/10)*rad))/60;
 this.tz=((M==2&&D>=this.findDLS(Y,2))||(M==9&&D<this.findDLS(Y,9))||(M<9&&M>2))?tz+1:tz;
};

Sun.setSunPos=function(m){
 var ha=this.calcHourAngle(m);
 var elev=this.calcElev(ha);
 var azim=this.calcAzim(ha);
 this.convToCoords(elev,azim);
};

Sun.findDLS=function(y,m){
 for (i=31;i>24;i--) {
  var t=new Date(y,m,i);
  if(t.getDay()==0)break;
 }
 return t.getDate();
};

Sun.convToCoords=function(e,a){
 with(Math){
  var rad=PI/180;
  this.pos.x=floor(this.base.x/2-cos(e)*cos((4*a-PI)/6)*this.base.x/2);
  this.pos.y=floor(this.base.y-(sin(e)+sin((4*a-PI)/6)*sin(this.def.tilt*rad))*this.base.x/2);
 }
};

Sun.setHorizons=function(){
 this.dawn.civil=this.calcTime(0-Math.PI/30,true);
 this.dawn.naut=this.calcTime(0-Math.PI/15,true);
 this.dusk.civil=this.calcTime(0-Math.PI/30,false);
 this.dusk.naut=this.calcTime(0-Math.PI/15,false);
 this.rise.time=this.calcTime(0,true);
 this.rise.azim=this.calcAzim(this.calcHourAngle(this.rise.time*60));
 this.rise.dir=this.getDirection(this.rise.azim);
 this.down.time=this.calcTime(0,false);
 this.down.azim=this.calcAzim(this.calcHourAngle(this.down.time*60));
 this.down.dir=this.getDirection(this.down.azim);
 this.noon.time=11+(15-this.def.longi)/15+this.tz-this.te;
 this.noon.elev=this.calcElev(this.calcHourAngle(this.noon.time*60));
 this.sky.fsdawn=Math.floor((this.rise.time-this.dawn.astr)*60);
 this.sky.fsdusk=0-Math.floor((this.dusk.astr-this.down.time)*60);
};

Sun.calcElev=function(ha){
 with(Math){
  var rad=PI/180;
  var lati=this.def.lati*rad;
  return asin(cos(ha)*cos(lati)*cos(this.d)+sin(lati)*sin(this.d));
 }
};
Sun.getDirection=function(a){
  var d=this.def.cp;
  return d[Math.round(a*8/Math.PI)];
};

Sun.calcAzim=function(ha){
 var el=this.calcElev(ha);
 with(Math){
  var rad=PI/180;
  var lati=this.def.lati*rad;
  if(ha>=0){
   return PI-acos((sin(el)*sin(lati)-sin(this.d))/(cos(el)*cos(lati)));
  }else{
   return PI+acos((sin(el)*sin(lati)-sin(this.d))/(cos(el)*cos(lati)));
  }
 }
};

Sun.calcHourAngle=function(m){
 var alt=m/60-this.tz+1-(15-this.def.longi)/15;
 return (12-alt-this.te)*Math.PI/12;
};
Sun.updateData=function(c,d,ifr,l){
 var df=c.def.dtype;
 if(d==null||!d){
  errorOut(this.def.e,1,"");
  return;
 }
 var dd=d.substr(df.indexOf("dd"),2);
 var MM=d.substr(df.indexOf("MM"),2);
 var yy=d.substr(df.indexOf("yyyy"),4);
 if(!checkDate(yy,MM-1,dd)){
  errorOut(this.def.e,2,"");
  return;
 }
 this.calcSpaceVars(yy,MM-1,dd);
 this.setHorizons();
 var w=findObj(document,ifr);
 if(ua.oldOpera){
  w=document.frames[ifr];
  w.location.reload();
 }else{
  w.src=l;
 }
};

} 

