/*
	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.islamic"]){
dojo._hasResource["dojox.date.islamic"]=true;
dojo.provide("dojox.date.islamic");
dojo.experimental("dojox.date.islamic");
dojo.require("dojox.date.islamic.Date");
dojo.require("dojo.date");
dojox.date.islamic.getDaysInMonth=function(_1){
return _1.getDaysInIslamicMonth(_1.getMonth(),_1.getFullYear());
};
dojox.date.islamic.compare=function(_2,_3,_4){
if(_2 instanceof dojox.date.islamic.Date){
_2=_2.toGregorian();
}
if(_3 instanceof dojox.date.islamic.Date){
_3=_3.toGregorian();
}
return dojo.date.compare.apply(null,arguments);
};
dojox.date.islamic.add=function(_5,_6,_7){
var _8=new dojox.date.islamic.Date(_5);
switch(_6){
case "day":
_8.setDate(_5.getDate()+_7);
break;
case "weekday":
var _9=_5.getDay();
if(((_9+_7)<5)&&((_9+_7)>0)){
_8.setDate(_5.getDate()+_7);
}else{
var _a=0,_b=0;
if(_9==5){
_9=4;
_b=(_7>0)?-1:1;
}else{
if(_9==6){
_9=4;
_b=(_7>0)?-2:2;
}
}
var _c=(_7>0)?(5-_9-1):-_9;
var _d=_7-_c;
var _e=parseInt(_d/5);
if(_d%5!=0){
_a=(_7>0)?2:-2;
}
_a=_a+_e*7+_d%5+_c;
_8.setDate(_5.getDate()+_a+_b);
}
break;
case "year":
_8.setFullYear(_5.getFullYear()+_7);
break;
case "week":
_7*=7;
_8.setDate(_5.getDate()+_7);
break;
case "month":
var _f=_5.getMonth();
_8.setMonth(_f+_7);
break;
case "hour":
_8.setHours(_5.getHours()+_7);
break;
case "minute":
_8.setMinutes(_5.getMinutes()+_7);
break;
case "second":
_8.setSeconds(_5.getSeconds()+_7);
break;
case "millisecond":
_8.setMilliseconds(_5.getMilliseconds()+_7);
break;
}
return _8;
};
dojox.date.islamic.difference=function(_10,_11,_12){
_11=_11||new dojox.date.islamic.Date();
_12=_12||"day";
var _13=_10.getFullYear()-_11.getFullYear();
var _14=1;
switch(_12){
case "weekday":
var _15=Math.round(dojox.date.islamic.difference(_10,_11,"day"));
var _16=parseInt(dojox.date.islamic.difference(_10,_11,"week"));
var mod=_15%7;
if(mod==0){
_15=_16*5;
}else{
var adj=0;
var _17=_11.getDay();
var _18=_10.getDay();
_16=parseInt(_15/7);
mod=_15%7;
var _19=new dojox.date.islamic.Date(_11);
_19.setDate(_19.getDate()+(_16*7));
var _1a=_19.getDay();
if(_15>0){
switch(true){
case _17==5:
adj=-1;
break;
case _17==6:
adj=0;
break;
case _18==5:
adj=-1;
break;
case _18==6:
adj=-2;
break;
case (_1a+mod)>5:
adj=-2;
}
}else{
if(_15<0){
switch(true){
case _17==5:
adj=0;
break;
case _17==6:
adj=1;
break;
case _18==5:
adj=2;
break;
case _18==6:
adj=1;
break;
case (_1a+mod)<0:
adj=2;
}
}
}
_15+=adj;
_15-=(_16*2);
}
_14=_15;
break;
case "year":
_14=_13;
break;
case "month":
var _1b=(_10.toGregorian()>_11.toGregorian())?_10:_11;
var _1c=(_10.toGregorian()>_11.toGregorian())?_11:_10;
var _1d=_1b.getMonth();
var _1e=_1c.getMonth();
if(_13==0){
_14=_1b.getMonth()-_1c.getMonth();
}else{
_14=12-_1e;
_14+=_1d;
var i=_1c.getFullYear()+1;
var e=_1b.getFullYear();
for(i;i<e;i++){
_14+=12;
}
}
if(_10.toGregorian()<_11.toGregorian()){
_14=-_14;
}
break;
case "week":
_14=parseInt(dojox.date.islamic.difference(_10,_11,"day")/7);
break;
case "day":
_14/=24;
case "hour":
_14/=60;
case "minute":
_14/=60;
case "second":
_14/=1000;
case "millisecond":
_14*=_10.toGregorian().getTime()-_11.toGregorian().getTime();
}
return Math.round(_14);
};
}
