(function($) { var cultures = $.cultures, en = cultures.en, standard = en.calendars.standard, culture = cultures["ar-QA"] = $.extend(true, {}, en, { name: "ar-QA", englishName: "Arabic (Qatar)", nativeName: "العربية (قطر)", language: "ar", isRTL: true, numberFormat: { pattern: ["n-"], currency: { pattern: ["$n-","$ n"], symbol: "ر.ق.‏" } }, calendars: { standard: $.extend(true, {}, standard, { firstDay: 6, days: { names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"], namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"], namesShort: ["ح","ن","ث","ر","خ","ج","س"] }, months: { names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليه","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""], namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليه","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""] }, AM: ["ص","ص","ص"], PM: ["م","م","م"], patterns: { d: "dd/MM/yyyy", D: "dd MMMM, yyyy", t: "hh:mm tt", T: "hh:mm:ss tt", f: "dd MMMM, yyyy hh:mm tt", F: "dd MMMM, yyyy hh:mm:ss tt", M: "dd MMMM" } }), UmAlQura: $.extend(true, {}, standard, { name: "UmAlQura", firstDay: 6, days: { names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"], namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"], namesShort: ["ح","ن","ث","ر","خ","ج","س"] }, months: { names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""], namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""] }, AM: ["ص","ص","ص"], PM: ["م","م","م"], eras: [{"name":"بعد الهجرة","start":null,"offset":0}], twoDigitYearMax: 1451, patterns: { d: "dd/MM/yy", D: "dd/MMMM/yyyy", t: "hh:mm tt", T: "hh:mm:ss tt", f: "dd/MMMM/yyyy hh:mm tt", F: "dd/MMMM/yyyy hh:mm:ss tt", M: "dd MMMM" }, convert: { _yearInfo: [ // MonthLengthFlags, Gregorian Date [746, -2198707200000], [1769, -2168121600000], [3794, -2137449600000], [3748, -2106777600000], [3402, -2076192000000], [2710, -2045606400000], [1334, -2015020800000], [2741, -1984435200000], [3498, -1953763200000], [2980, -1923091200000], [2889, -1892505600000], [2707, -1861920000000], [1323, -1831334400000], [2647, -1800748800000], [1206, -1770076800000], [2741, -1739491200000], [1450, -1708819200000], [3413, -1678233600000], [3370, -1647561600000], [2646, -1616976000000], [1198, -1586390400000], [2397, -1555804800000], [748, -1525132800000], [1749, -1494547200000], [1706, -1463875200000], [1365, -1433289600000], [1195, -1402704000000], [2395, -1372118400000], [698, -1341446400000], [1397, -1310860800000], [2994, -1280188800000], [1892, -1249516800000], [1865, -1218931200000], [1621, -1188345600000], [683, -1157760000000], [1371, -1127174400000], [2778, -1096502400000], [1748, -1065830400000], [3785, -1035244800000], [3474, -1004572800000], [3365, -973987200000], [2637, -943401600000], [685, -912816000000], [1389, -882230400000], [2922, -851558400000], [2898, -820886400000], [2725, -790300800000], [2635, -759715200000], [1175, -729129600000], [2359, -698544000000], [694, -667872000000], [1397, -637286400000], [3434, -606614400000], [3410, -575942400000], [2710, -545356800000], [2349, -514771200000], [605, -484185600000], [1245, -453600000000], [2778, -422928000000], [1492, -392256000000], [3497, -361670400000], [3410, -330998400000], [2730, -300412800000], [1238, -269827200000], [2486, -239241600000], [884, -208569600000], [1897, -177984000000], [1874, -147312000000], [1701, -116726400000], [1355, -86140800000], [2731, -55555200000], [1370, -24883200000], [2773, 5702400000], [3538, 36374400000], [3492, 67046400000], [3401, 97632000000], [2709, 128217600000], [1325, 158803200000], [2653, 189388800000], [1370, 220060800000], [2773, 250646400000], [1706, 281318400000], [1685, 311904000000], [1323, 342489600000], [2647, 373075200000], [1198, 403747200000], [2422, 434332800000], [1388, 465004800000], [2901, 495590400000], [2730, 526262400000], [2645, 556848000000], [1197, 587433600000], [2397, 618019200000], [730, 648691200000], [1497, 679276800000], [3506, 709948800000], [2980, 740620800000], [2890, 771206400000], [2645, 801792000000], [693, 832377600000], [1397, 862963200000], [2922, 893635200000], [3026, 924307200000], [3012, 954979200000], [2953, 985564800000], [2709, 1016150400000], [1325, 1046736000000], [1453, 1077321600000], [2922, 1107993600000], [1748, 1138665600000], [3529, 1169251200000], [3474, 1199923200000], [2726, 1230508800000], [2390, 1261094400000], [686, 1291680000000], [1389, 1322265600000], [874, 1352937600000], [2901, 1383523200000], [2730, 1414195200000], [2381, 1444780800000], [1181, 1475366400000], [2397, 1505952000000], [698, 1536624000000], [1461, 1567209600000], [1450, 1597881600000], [3413, 1628467200000], [2714, 1659139200000], [2350, 1689724800000], [622, 1720310400000], [1373, 1750896000000], [2778, 1781568000000], [1748, 1812240000000], [1701, 1842825600000], [0, 1873411200000] ], minDate: -2198707200000, maxDate: 1873411199999, toGregorian: function(hyear, hmonth, hday) { var days = hday - 1, gyear = hyear - 1318; if (gyear < 0 || gyear >= this._yearInfo.length) return null; var info = this._yearInfo[gyear], gdate = new Date(info[1]), monthLength = info[0]; // Date's ticks in javascript are always from the GMT time, // but we are interested in the gregorian date in the same timezone, // not what the gregorian date was at GMT time, so we adjust for the offset. gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset()); for (var i = 0; i < hmonth; i++) { days += 29 + (monthLength & 1); monthLength = monthLength >> 1; } gdate.setDate(gdate.getDate() + days); return gdate; }, fromGregorian: function(gdate) { // Date's ticks in javascript are always from the GMT time, // but we are interested in the hijri date in the same timezone, // not what the hijri date was at GMT time, so we adjust for the offset. var ticks = gdate - gdate.getTimezoneOffset() * 60000; if (ticks < this.minDate || ticks > this.maxDate) return null; var hyear = 0, hmonth = 1; // find the earliest gregorian date in the array that is greater than or equal to the given date while (ticks > this._yearInfo[++hyear][1]) { } if (ticks !== this._yearInfo[hyear][1]) { hyear--; } var info = this._yearInfo[hyear], // how many days has it been since the date we found in the array? // 86400000 = ticks per day days = Math.floor((ticks - info[1]) / 86400000), monthLength = info[0]; hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N // now increment day/month based on the total days, considering // how many days are in each month. We cannot run past the year // mark since we would have found a different array entry in that case. var daysInMonth = 29 + (monthLength & 1); while (days >= daysInMonth) { days -= daysInMonth; monthLength = monthLength >> 1; daysInMonth = 29 + (monthLength & 1); hmonth++; } // remaining days is less than is in one month, thus is the day of the month we landed on // hmonth-1 because in javascript months are zero based, stay consistent with that. return [hyear, hmonth - 1, days + 1]; } } }), Hijri: $.extend(true, {}, standard, { name: "Hijri", firstDay: 6, days: { names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"], namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"], namesShort: ["ح","ن","ث","ر","خ","ج","س"] }, months: { names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""], namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""] }, AM: ["ص","ص","ص"], PM: ["م","م","م"], eras: [{"name":"بعد الهجرة","start":null,"offset":0}], twoDigitYearMax: 1451, patterns: { d: "dd/MM/yy", D: "dd/MM/yyyy", t: "hh:mm tt", T: "hh:mm:ss tt", f: "dd/MM/yyyy hh:mm tt", F: "dd/MM/yyyy hh:mm:ss tt", M: "dd MMMM" }, convert: { // Adapted to Script from System.Globalization.HijriCalendar ticks1970: 62135596800000, // number of days leading up to each month monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355], minDate: -42521673600000, maxDate: 253402300799999, // The number of days to add or subtract from the calendar to accommodate the variances // in the start and the end of Ramadan and to accommodate the date difference between // countries/regions. May be dynamically adjusted based on user preference, but should // remain in the range of -2 to 2, inclusive. hijriAdjustment: 0, toGregorian: function(hyear, hmonth, hday) { var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment; // 86400000 = ticks per day var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970); // adjust for timezone, because we are interested in the gregorian date for the same timezone // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base // date in the current timezone. gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset()); return gdate; }, fromGregorian: function(gdate) { if ((gdate < this.minDate) || (gdate > this.maxDate)) return null; var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000, daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment; // very particular formula determined by someone smart, adapted from the server-side implementation. // it approximates the hijri year. var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1, absDays = this.daysToYear(hyear), daysInYear = this.isLeapYear(hyear) ? 355 : 354; // hyear is just approximate, it may need adjustment up or down by 1. if (daysSinceJan0101 < absDays) { hyear--; absDays -= daysInYear; } else if (daysSinceJan0101 === absDays) { hyear--; absDays = this.daysToYear(hyear); } else { if (daysSinceJan0101 > (absDays + daysInYear)) { absDays += daysInYear; hyear++; } } // determine month by looking at how many days into the hyear we are // monthDays contains the number of days up to each month. hmonth = 0; var daysIntoYear = daysSinceJan0101 - absDays; while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) { hmonth++; } hmonth--; hday = daysIntoYear - this.monthDays[hmonth]; return [hyear, hmonth, hday]; }, daysToYear: function(year) { // calculates how many days since Jan 1, 0001 var yearsToYear30 = Math.floor((year - 1) / 30) * 30, yearsInto30 = year - yearsToYear30 - 1, days = Math.floor((yearsToYear30 * 10631) / 30) + 227013; while (yearsInto30 > 0) { days += (this.isLeapYear(yearsInto30) ? 355 : 354); yearsInto30--; } return days; }, isLeapYear: function(year) { return ((((year * 11) + 14) % 30) < 11); } } }), Gregorian_MiddleEastFrench: $.extend(true, {}, standard, { name: "Gregorian_MiddleEastFrench", firstDay: 6, days: { names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"], namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."], namesShort: ["di","lu","ma","me","je","ve","sa"] }, months: { names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""], namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""] }, AM: ["ص","ص","ص"], PM: ["م","م","م"], eras: [{"name":"ap. J.-C.","start":null,"offset":0}], patterns: { d: "MM/dd/yyyy", t: "hh:mm tt", T: "hh:mm:ss tt", f: "dddd, MMMM dd, yyyy hh:mm tt", F: "dddd, MMMM dd, yyyy hh:mm:ss tt", M: "dd MMMM" } }), Gregorian_Arabic: $.extend(true, {}, standard, { name: "Gregorian_Arabic", firstDay: 6, days: { names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"], namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"], namesShort: ["ح","ن","ث","ر","خ","ج","س"] }, months: { names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""], namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""] }, AM: ["ص","ص","ص"], PM: ["م","م","م"], eras: [{"name":"م","start":null,"offset":0}], patterns: { d: "MM/dd/yyyy", t: "hh:mm tt", T: "hh:mm:ss tt", f: "dddd, MMMM dd, yyyy hh:mm tt", F: "dddd, MMMM dd, yyyy hh:mm:ss tt" } }), Gregorian_TransliteratedFrench: $.extend(true, {}, standard, { name: "Gregorian_TransliteratedFrench", firstDay: 6, days: { names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"], namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"], namesShort: ["ح","ن","ث","ر","خ","ج","س"] }, months: { names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""], namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""] }, AM: ["ص","ص","ص"], PM: ["م","م","م"], eras: [{"name":"م","start":null,"offset":0}], patterns: { d: "MM/dd/yyyy", t: "hh:mm tt", T: "hh:mm:ss tt", f: "dddd, MMMM dd, yyyy hh:mm tt", F: "dddd, MMMM dd, yyyy hh:mm:ss tt" } }) } }, cultures["ar-QA"]); culture.calendar = culture.calendars.standard; })(jQuery);