﻿function _gregorian_to_islamic(g_y,g_m,g_d){
    this.intPart=_intPart;
	if ((g_y>1582)||((g_y==1582)&&(g_m>10))||((g_y==1582)&&(g_m==10)&&(g_d>14))) 
	{
		jd = this.intPart((1461*(g_y+4800+ this.intPart((g_m-14)/12)))/4)+this.intPart((367*(g_m-2-12*(this.intPart((g_m-14)/12))))/12)-
		this.intPart( (3* (this.intPart(  (g_y+4900+    this.intPart( (g_m-14)/12)     )/100)    )   ) /4)+g_d-32075
	}
	else
	{
		jd = 367*g_y-this.intPart((7*(g_y+5001+this.intPart((g_m-9)/7)))/4)+this.intPart((275*g_m)/9)+g_d+1729777
	}
	l=jd-1948440+10632

	n=this.intPart((l-1)/10631)
	l=l-10631*n+354
	j=(this.intPart((10985-l)/5316))*(this.intPart((50*l)/17719))+(this.intPart(l/5670))*(this.intPart((43*l)/15238))
	l=l-(this.intPart((30-j)/15))*(this.intPart((17719*j)/50))-(this.intPart(j/16))*(this.intPart((15238*j)/43))+29
	i_m=this.intPart((24*l)/709)
	i_d=l-this.intPart((709*i_m)/24)
	i_y=30*n+j-30
	return Array(i_y,i_m,i_d)
}

function _islamic_to_gregorian(i_y,i_m,i_d){
   this.intPart=_intPart;
	jd=this.intPart((11*i_y+3)/30)+354*i_y+30*i_m-this.intPart((i_m-1)/2)+i_d+1948440-385
	if (jd> 2299160 )
	{
		l=jd+68569
		n=this.intPart((4*l)/146097)
		l=l-this.intPart((146097*n+3)/4)
		i=this.intPart((4000*(l+1))/1461001)
		l=l-this.intPart((1461*i)/4)+31
		j=this.intPart((80*l)/2447)
		g_d=l-this.intPart((2447*j)/80)
		l=this.intPart(j/11)
		g_m=j+2-12*l
		g_y=100*(n-49)+i+l
	}	
	else	
	{
		j=jd+1402
		k=this.intPart((j-1)/1461)
		l=j-1461*k
		n=this.intPart((l-1)/365)-this.intPart(l/1461)
		i=l-365*n+30
		j=this.intPart((80*i)/2447)
		g_d=i-this.intPart((2447*j)/80)
		i=this.intPart(j/11)
		g_m=j+2-12*i
		g_y=4*k+n+i-4716
	}
	return Array(g_y , g_m , g_d,jd)
}

function _gregorian_to_jalali (g_y, g_m, g_d){
    g_days_in_month = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); 
    j_days_in_month = new Array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);     
   gy = g_y-1600; 
   gm = g_m-1; 
   gd = g_d-1; 
    this.div=_div;
   g_day_no = 365*gy+this.div(gy+3,4)-this.div(gy+99,100)+this.div(gy+399,400); 
   for (i=0; i < gm; ++i) g_day_no += g_days_in_month[i]; 
   if (gm>1 && ((gy%4==0 && gy%100!=0) || (gy%400==0))) 
      g_day_no++; 
   g_day_no += gd; 
   j_day_no = g_day_no-79; 
   j_np = this.div(j_day_no, 12053);
   j_day_no = j_day_no % 12053; 
   jy = 979+33*j_np+4*this.div(j_day_no,1461);
   j_day_no %= 1461; 
   if (j_day_no >= 366) { 
      jy += this.div(j_day_no-1, 365); 
      j_day_no = (j_day_no-1)%365; 
   } 
   for (i = 0; i < 11 && j_day_no >= j_days_in_month[i]; ++i) 
      j_day_no -= j_days_in_month[i]; 
   jm = i+1; 
   jd = j_day_no+1;
return Array(jy,jm,jd)
} 
function _jalali_to_gregorian(j_y, j_m, j_d){ 
    g_days_in_month =new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); 
	g_days_in_month_kabise =new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); 
    j_days_in_month =new Array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
	j_days_in_month_kabise =new Array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 30);
   jy = j_y-979; 
   jm = j_m-1; 
   jd = j_d-1; 
   j_day_no = 365*jy + this.div(jy, 33)*8 + this.div(jy%33+3, 4); 
   for (i=0; i < jm; ++i) 
      j_day_no += j_days_in_month[i]; 
   j_day_no += jd; 
   g_day_no = j_day_no+79; 
   gy = 1600 + 400 * this.div(g_day_no, 146097);
   g_day_no = g_day_no % 146097; 
   leap = true; 
   if (g_day_no >= 36525)
   { 
      g_day_no--; 
      gy += 100*this.div(g_day_no,  36524);
      g_day_no = g_day_no % 36524; 
      if (g_day_no >= 365) 
         g_day_no++; 
      else 
         leap = false; 
   } 
   gy += 4*this.div(g_day_no, 1461); 
   g_day_no %= 1461; 
   if (g_day_no >= 366) { 
      leap = false; 
      g_day_no--; 
      gy += this.div(g_day_no, 365); 
      g_day_no = g_day_no % 365; 
   } 
   for (i = 0; g_day_no >= g_days_in_month[i] + (i == 1 && leap); i++) 
      g_day_no -= g_days_in_month[i] + (i == 1 && leap); 
   gm = i+1; 
   gd = g_day_no+1; 
   return Array(gy, gm, gd); 
}
function chbg(id,divCal){

        document.getElementById(divCal+"_"+id).bgColor="#efefff"
}
function nbg(id,divCal){

        document.getElementById(divCal+"_"+id).bgColor=""
}
function _div(a,b){
    return (Math.floor(a / b));
}
function _intPart(floatNum){
	if (floatNum< -0.0000001){
		 return Math.ceil(floatNum-0.0000001)
		}
	return Math.floor(floatNum+0.0000001)	
}

function ltrim(str, chars) 
{
   chars = chars || "\\s";
   return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
function sind(x){return(Math.sin(Math.PI/180.0*x));}
function cosd(x){return(Math.cos(Math.PI/180.0*x));}
function tand(x){return(Math.tan(Math.PI/180.0*x));}
function atand(x){return(Math.atan(x)*180.0/Math.PI);}
function asind(x){return(Math.asin(x)*180.0/Math.PI);}
function acosd(x){return(Math.acos(x)*180.0/Math.PI);}
function sqrt(x){return(Math.sqrt(x));}
function frac(x){return(x%1);}
function floor(x){return(Math.floor(x));}
function ceil(x){return(Math.ceil(x));}

function loc2hor(z,d,p)
{
    return(acosd((cosd(z)-sind(d)*sind(p))/cosd(d)/cosd(p))/15);
}
function Round(x,a)
{
    var tmp=x%a;
    if(tmp<0)
        tmp+=a;
    return(tmp)
}
        
        
        
function owghat(ClientID)
{
    this.ClientID="";
    this.ClientID=ClientID;
    this.longitude=0;
    this.latitude =0;
    this.city=0;
    this.datePicker;
    this.Cultcure='fa-IR';
    
    this.SetCultcure=_SetCultcure;
    this.getDataDate=_getDataDate;
    this.main=_main;
    this.sun=_sun;
    this.SetSharie=_SetSharie;
    this.coord=_coord;
    this.hms=_hms;
}
        
        function _SetCultcure(cul,datepicker)
        {
            
            Cultcure=cul;
            Today = new Date();
            var _date;
            switch(Cultcure)
            {
                case 'fa-IR':
                _date = _gregorian_to_jalali(Today.getFullYear(),
                              parseInt(Today.getMonth()+1),
                              Today.getDate());	
                            
                break; 
                
                case 'ar-SA':
                _date = _gregorian_to_islamic(Today.getFullYear(),
                              parseInt(Today.getMonth()+1),
                              Today.getDate());	
                break;
                
                default:
                
                _date= Array(Today.getFullYear(),
                              parseInt(Today.getMonth()+1),
                           Today.getDate());
  	
                break;
            }
            datepicker.value=_date[0]+"-"+(parseInt(_date[1]))+"-"+_date[2];                    
        }
        
       
        function _getDataDate(date) 
        {

	        if(date == '')	
	        {
		        Today = new Date();
		        _date = _gregorian_to_jalali(Today.getFullYear(),
                                  Today.getMonth()+1,
                                  Today.getDate());	
		        return _date[0]+"-"+(parseInt(_date[1])+1)+"-"+_date[2];
	        }
	        else
	        {
		        if(Cultcure == 'fa-IR') {return date.split("-")}
        				
		        if(Cultcure == 'ar-SA') 
		        {
		            _date = date.split("-");
		            if (_date[1]<10)_date[1]=ltrim(_date[1],'0');
		            _date = _islamic_to_gregorian(parseInt(_date[0]), parseInt(_date[1]), parseInt(_date[2]));
			        _date = _gregorian_to_jalali(parseInt(_date[0]), parseInt(_date[1]), parseInt(_date[2]));
			        return _date;
		        }
		        else
		        {
		            _date = date.split("-");
			        _date = _gregorian_to_jalali(parseInt(_date[0]), parseInt(ltrim(_date[1],'0')), parseInt(_date[2]));	
			        return _date;
		        }
	        }
        }


        function _main()
        {
        
            date=this.datePicker.value;
           
            var i = document.getElementById("cities"+this.ClientID).selectedIndex;
            
            if(i==0)
                return
                
            date = this.getDataDate(date);
            
            var m = parseInt(date[1],10);
            
	        var d=parseInt(date[2],10);
	        
            var lg=this.longitude;
            var lat=this.latitude;
        //    var lg=52.5125;
        //    var lat=29.635;
       
           
            var ep=this.sun(m,d,4,lg)
             
            var zr=ep[0];
            
            delta=ep[1];
            ha=loc2hor(108.0,delta,lat)
            var t1=Round(zr-ha,24)
            
            ep=this.sun(m,d,t1,lg)
            zr=ep[0];
            delta=ep[1];
            ha=loc2hor(108.0,delta,lat)
            var t1=Round(zr-ha,24)
             
            document.getElementById("t1"+this.ClientID).innerHTML=this.hms(t1,m);
        //
        //   t2= Sun rise
        //
            ep=this.sun(m,d,6,lg)
            zr=ep[0];
            delta=ep[1];
            ha=loc2hor(90.833,delta,lat)
            var t2=Round(zr-ha,24)
            ep=this.sun(m,d,t2,lg)
            zr=ep[0];
            delta=ep[1];
            ha=loc2hor(90.833,delta,lat)
            t2=Round(zr-ha,24)
            document.getElementById("t2"+this.ClientID).innerHTML=this.hms(t2,m);
        //    
        //    zr=Zohr
        //
            ep=this.sun(m,d,12,lg)
            ep=this.sun(m,d,ep[0],lg)
            zr=ep[0];
            document.getElementById("zr"+this.ClientID).innerHTML=this.hms(zr,m);
        //
        //   t2= Sun set
        //
            ep=this.sun(m,d,18,lg)
            zr=ep[0];
            delta=ep[1];
            ha=loc2hor(90.833,delta,lat)
            var t3=Round(zr+ha,24)
            ep=this.sun(m,d,t3,lg)
            zr=ep[0];
            delta=ep[1];
            ha=loc2hor(90.833,delta,lat)
            t3=Round(zr+ha,24)
            document.getElementById("t3"+this.ClientID).innerHTML=this.hms(t3,m);
        //
        //   t2= Maghreb
        //
            ep=this.sun(m,d,18.5,lg)
            zr=ep[0];
            delta=ep[1];
            ha=loc2hor(94.3,delta,lat)
            var t4=Round(zr+ha,24)
            ep=this.sun(m,d,t4,lg)
            zr=ep[0];
            delta=ep[1];
            ha=loc2hor(94.3,delta,lat)
            t4=Round(zr+ha,24)
            document.getElementById("t4"+this.ClientID).innerHTML=this.hms(t4,m);
           
        }
        
        
        
        function _sun(m,d,h,lg)
        {
            if(m<7)
                d= 31*(m-1)+d+h/24;
            else
                d=6+30*(m-1)+d+h/24;
            var M=74.2023+0.98560026*d;
            var L=-2.75043+0.98564735*d;
            var lst=8.3162159+0.065709824*Math.floor(d)+1.00273791*24*(d%1)+lg/15;    
            var e=0.0167065;
            var omega=4.85131-0.052954*d;
            var ep=23.4384717+0.00256*cosd(omega);
            var ed=180.0/Math.PI*e;
            var u=M;
            for(var i=1;i<5;i++)
                u=u-(u-ed*sind(u)-M)/(1-e*cosd(u));
            var v=2*atand(tand(u/2)*Math.sqrt((1+e)/(1-e)));
            var theta=L+v-M-0.00569-0.00479*sind(omega);
            var delta=asind(sind(ep)*sind(theta));
            var alpha=180.0/Math.PI*Math.atan2(cosd(ep)*sind(theta),cosd(theta));
            if(alpha>=360)
                alpha-=360;
            var ha=lst-alpha/15;
            var zr=Round(h-ha,24);
            return ([zr,delta])
        }

        function _SetSharie(id)
        {

            document.getElementById('cities'+this.ClientID).selectedIndex=(parseInt(id));
            this.coord();
            
            this.main(this.datePicker);
        }
               
        function _coord()
        {

           lgs= [0,49.70,48.30,45.07,51.64,48.68,46.42,57.33,56.29,50.84,59.21,46.28,51.41,48.34,49.59,60.86,48.50,53.06,53.39,47.00,50.86,52.52,50.00,50.88,57.06,47.09,54.44,59.58,48.52,51.59,54.35];
           lats=[0,34.09,38.25,37.55,32.68,31.32,33.64,37.47,27.19,28.97,32.86,38.08,35.70,33.46,37.28,29.50,36.68,36.57,35.58,35.31,32.33,29.62,36.28,34.64,30.29,34.34,36.84,36.31,34.80,30.67,31.89];

            var c=document.getElementById("cities"+this.ClientID);
            var i = c.selectedIndex;
            
           if(i==0)
            {
                this.longitude=0;
		        this.latitude =0;
            }
            else
            {
                this.longitude=lgs[i].toString()
                this.latitude=lats[i].toString()
            }
        }
        
        function _hms(x,month)
        {
            x=Math.floor(3600*x);
            h=Math.floor(x/3600);
            mp=x-3600*h;
            m=Math.floor(mp/60);
            s=Math.floor(mp-60*m);
            if (month < 7)
                h = h + 1;
            return(((h<10)? "0" : "")+h.toString()+":"+((m<10)? "0" : "")+m.toString()+":"+((s<10)? "0" : "")+s.toString())
        }

