/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.date.hebrew.Date"]){
dojo._hasResource["dojox.date.hebrew.Date"]=true;
dojo.provide("dojox.date.hebrew.Date");
dojo.require("dojox.date.hebrew.numerals");
dojo.declare("dojox.date.hebrew.Date",null,{_MONTH_LENGTH:[[30,30,30],[29,29,30],[29,30,30],[29,29,29],[30,30,30],[30,30,30],[29,29,29],[30,30,30],[29,29,29],[30,30,30],[29,29,29],[30,30,30],[29,29,29]],_MONTH_START:[[0,0,0],[30,30,30],[59,59,60],[88,89,90],[117,118,119],[147,148,149],[147,148,149],[176,177,178],[206,207,208],[235,236,237],[265,266,267],[294,295,296],[324,325,326],[353,354,355]],_LEAP_MONTH_START:[[0,0,0],[30,30,30],[59,59,60],[88,89,90],[117,118,119],[147,148,149],[177,178,179],[206,207,208],[236,237,238],[265,266,267],[295,296,297],[324,325,326],[354,355,356],[383,384,385]],_GREGORIAN_MONTH_COUNT:[[31,31,0,0],[28,29,31,31],[31,31,59,60],[30,30,90,91],[31,31,120,121],[30,30,151,152],[31,31,181,182],[31,31,212,213],[30,30,243,244],[31,31,273,274],[30,30,304,305],[31,31,334,335]],_date:0,_month:0,_year:0,_hours:0,_minutes:0,_seconds:0,_milliseconds:0,_day:0,constructor:function(){
var _1=arguments.length;
if(!_1){
this.fromGregorian(new Date());
}else{
if(_1==1){
var _2=arguments[0];
if(typeof _2=="number"){
_2=new Date(_2);
}
if(_2 instanceof Date){
this.fromGregorian(_2);
}else{
if(_2==""){
this._date=new Date("");
}else{
this._year=_2._year;
this._month=_2._month;
this._date=_2._date;
this._hours=_2._hours;
this._minutes=_2._minutes;
this._seconds=_2._seconds;
this._milliseconds=_2._milliseconds;
}
}
}else{
if(_1>=3){
this._year+=arguments[0];
this._month+=arguments[1];
this._date+=arguments[2];
if(this._month>12){
console.warn("the month is incorrect , set 0  "+this._month+"   "+this._year);
this._month=0;
}
this._hours+=arguments[3]||0;
this._minutes+=arguments[4]||0;
this._seconds+=arguments[5]||0;
this._milliseconds+=arguments[6]||0;
}
}
}
this._setDay();
},getDate:function(){
return this._date;
},getDateLocalized:function(_3){
return (_3||dojo.locale).match(/^he(?:-.+)?$/)?dojox.date.hebrew.numerals.getDayHebrewLetters(this._date):this.getDate();
},getMonth:function(){
return this._month;
},getFullYear:function(){
return this._year;
},getHours:function(){
return this._hours;
},getMinutes:function(){
return this._minutes;
},getSeconds:function(){
return this._seconds;
},getMilliseconds:function(){
return this._milliseconds;
},setDate:function(_4){
_4=+_4;
var _5;
if(_4>0){
while(_4>(_5=this.getDaysInHebrewMonth(this._month,this._year))){
_4-=_5;
this._month++;
if(this._month>=13){
this._year++;
this._month-=13;
}
}
}else{
while(_4<=0){
_5=this.getDaysInHebrewMonth((this._month-1)>=0?(this._month-1):12,((this._month-1)>=0)?this._year:this._year-1);
this._month--;
if(this._month<0){
this._year--;
this._month+=13;
}
_4+=_5;
}
}
this._date=_4;
this._setDay();
return this;
},setFullYear:function(_6,_7,_8){
this._year=_6=+_6;
if(!this.isLeapYear(_6)&&this._month==5){
this._month++;
}
if(_7!==undefined){
this.setMonth(_7);
}
if(_8!==undefined){
this.setDate(_8);
}
var _9=this.getDaysInHebrewMonth(this._month,this._year);
if(_9<this._date){
this._date=_9;
}
this._setDay();
return this;
},setMonth:function(_a){
_a=+_a;
if(!this.isLeapYear(this._year)&&_a==5){
_a++;
}
if(_a>=0){
while(_a>12){
this._year++;
_a-=13;
if(!this.isLeapYear(this._year)&&_a>=5){
_a++;
}
}
}else{
while(_a<0){
this._year--;
_a+=(!this.isLeapYear(this._year)&&_a<-7)?12:13;
}
}
this._month=_a;
var _b=this.getDaysInHebrewMonth(this._month,this._year);
if(_b<this._date){
this._date=_b;
}
this._setDay();
return this;
},setHours:function(){
var _c=arguments.length;
var _d=0;
if(_c>=1){
_d+=+arguments[0];
}
if(_c>=2){
this._minutes+=+arguments[1];
}
if(_c>=3){
this._seconds+=+arguments[2];
}
if(_c==4){
this._milliseconds+=+arguments[3];
}
while(_d>=24){
this._date++;
var _e=this.getDaysInHebrewMonth(this._month,this._year);
if(this._date>_e){
this._month++;
if(!this.isLeapYear(this._year)&&this._month==5){
this._month++;
}
if(this._month>=13){
this._year++;
this._month-=13;
}
this._date-=_e;
}
_d-=24;
}
this._hours=_d;
this._setDay();
return this;
},setMinutes:function(_f){
_f=+_f;
this._minutes=_f%60;
this.setHours(parseInt(_f/60));
this._setDay();
return this;
},setSeconds:function(_10){
_10=+_10;
this._seconds=_10%60;
this.setMinutes(parseInt(_10/60));
this._setDay();
return this;
},setMilliseconds:function(_11){
_11=+_11;
this._milliseconds=_11%1000;
this.setSeconds(parseInt(_11/1000));
this._setDay();
return this;
},_setDay:function(){
var day=this._startOfYear(this._year);
if(this._month!=0){
day+=(this.isLeapYear(this._year)?this._LEAP_MONTH_START:this._MONTH_START)[this._month][this._yearType(this._year)];
}
day+=this._date-1;
this._day=(day+1)%7;
},toString:function(){
return this._date+", "+this._month+", "+this._year+"  "+this._hours+":"+this._minutes+":"+this._seconds;
},getDaysInHebrewMonth:function(_12,_13){
var _14=(_12==1||_12==2)?this._yearType(_13):0;
return (!this.isLeapYear(this._year)&&_12==5)?0:this._MONTH_LENGTH[_12][_14];
},_yearType:function(_15){
var _16=this._handleGetYearLength(Number(_15));
if(_16>380){
_16-=30;
}
var _17=_16-353;
if(_17<0||_17>2){
throw new Error("Illegal year length "+_16+" in year "+_15);
}
return _17;
},_handleGetYearLength:function(_18){
return this._startOfYear(_18+1)-this._startOfYear(_18);
},_startOfYear:function(_19){
var _1a=Math.floor((235*_19-234)/19),_1b=_1a*(12*1080+793)+11*1080+204,day=_1a*29+Math.floor(_1b/(24*1080));
_1b%=24*1080;
var wd=day%7;
if(wd==2||wd==4||wd==6){
day+=1;
wd=day%7;
}
if(wd==1&&_1b>15*1080+204&&!this.isLeapYear(_19)){
day+=2;
}else{
if(wd==0&&_1b>21*1080+589&&this.isLeapYear(_19-1)){
day+=1;
}
}
return day;
},isLeapYear:function(_1c){
var x=(_1c*12+17)%19;
return x>=((x<0)?-7:12);
},fromGregorian:function(_1d){
var _1e=this._computeHebrewFields(_1d);
this._year=_1e[0];
this._month=_1e[1];
this._date=_1e[2];
this._hours=_1d.getHours();
this._milliseconds=_1d.getMilliseconds();
this._minutes=_1d.getMinutes();
this._seconds=_1d.getSeconds();
this._setDay();
return this;
},_computeHebrewFields:function(_1f){
var _20=this._getJulianDayFromGregorianDate(_1f),d=_20-347997,m=Math.floor((d*24*1080)/(29*24*1080+12*1080+793)),_21=Math.floor((19*m+234)/235)+1,ys=this._startOfYear(_21),_22=(d-ys);
while(_22<1){
_21--;
ys=this._startOfYear(_21);
_22=d-ys;
}
var _23=this._yearType(_21),_24=this.isLeapYear(_21)?this._LEAP_MONTH_START:this._MONTH_START,_25=0;
while(_22>_24[_25][_23]){
_25++;
}
_25--;
var _26=_22-_24[_25][_23];
return [_21,_25,_26];
},toGregorian:function(){
var _27=this._year,_28=this._month,_29=this._date,day=this._startOfYear(_27);
if(_28!=0){
day+=(this.isLeapYear(_27)?this._LEAP_MONTH_START:this._MONTH_START)[_28][this._yearType(_27)];
}
var _2a=(_29+day+347997),_2b=_2a-1721426;
var rem=[];
var _2c=this._floorDivide(_2b,146097,rem),_2d=this._floorDivide(rem[0],36524,rem),n4=this._floorDivide(rem[0],1461,rem),n1=this._floorDivide(rem[0],365,rem),_2e=400*_2c+100*_2d+4*n4+n1,_2f=rem[0];
if(_2d==4||n1==4){
_2f=365;
}else{
++_2e;
}
var _30=!(_2e%4)&&(_2e%100||!(_2e%400)),_31=0,_32=_30?60:59;
if(_2f>=_32){
_31=_30?1:2;
}
var _33=Math.floor((12*(_2f+_31)+6)/367);
var _34=_2f-this._GREGORIAN_MONTH_COUNT[_33][_30?3:2]+1;
return new Date(_2e,_33,_34,this._hours,this._minutes,this._seconds,this._milliseconds);
},_floorDivide:function(_35,_36,_37){
if(_35>=0){
_37[0]=(_35%_36);
return Math.floor(_35/_36);
}
var _38=Math.floor(_35/_36);
_37[0]=_35-(_38*_36);
return _38;
},getDay:function(){
var _39=this._year,_3a=this._month,_3b=this._date,day=this._startOfYear(_39);
if(_3a!=0){
day+=(this.isLeapYear(_39)?this._LEAP_MONTH_START:this._MONTH_START)[_3a][this._yearType(_39)];
}
day+=_3b-1;
return (day+1)%7;
},_getJulianDayFromGregorianDate:function(_3c){
var _3d=_3c.getFullYear(),_3e=_3c.getMonth(),d=_3c.getDate(),_3f=!(_3d%4)&&(_3d%100||!(_3d%400)),y=_3d-1;
var _40=365*y+Math.floor(y/4)-Math.floor(y/100)+Math.floor(y/400)+1721426-1;
if(_3e!=0){
_40+=this._GREGORIAN_MONTH_COUNT[_3e][_3f?3:2];
}
_40+=d;
return _40;
}});
dojox.date.hebrew.Date.prototype.valueOf=function(){
return this.toGregorian().valueOf();
};
}
