875 lines
44 KiB
JavaScript
875 lines
44 KiB
JavaScript
/*
|
||
* @fileOverview NepaliDatePicker - jQuery Plugin
|
||
* @version 2.0.1
|
||
*
|
||
* @author Sanish Maharjan https://github.com/sanishmaharjan
|
||
* @see https://github.com/sanishmaharjan/
|
||
*/
|
||
var calendarFunctions = {};
|
||
(function ($) {
|
||
var calendarData = {
|
||
bsMonths: ["बैशाख", "जेठ", "असार", "सावन", "भदौ", "असोज", "कार्तिक", "मंसिर", "पौष", "माघ", "फागुन", "चैत"],
|
||
bsDays: ["आईत", "सोम", "मंगल", "बुध", "बिही", "शुक्र", "शनि"],
|
||
nepaliNumbers: ["०", "१", "२", "३", "४", "५", "६", "७", "८", "९"],
|
||
bsMonthUpperDays: [
|
||
[30, 31],
|
||
[31, 32],
|
||
[31, 32],
|
||
[31, 32],
|
||
[31, 32],
|
||
[30, 31],
|
||
[29, 30],
|
||
[29, 30],
|
||
[29, 30],
|
||
[29, 30],
|
||
[29, 30],
|
||
[30, 31]
|
||
],
|
||
extractedBsMonthData: [
|
||
[0, 1, 1, 22, 1, 3, 1, 1, 1, 3, 1, 22, 1, 3, 1, 3, 1, 22, 1, 3, 1, 19, 1, 3, 1, 1, 3, 1, 2, 2, 1, 3, 1],
|
||
[1, 2, 2, 2, 2, 2, 2, 1, 3, 1, 3, 1, 2, 2, 2, 3, 2, 2, 2, 1, 3, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 1, 3, 1, 1, 2],
|
||
[0, 1, 2, 1, 3, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 3, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 3, 1, 1, 2],
|
||
[1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 2, 2, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 2, 2, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 2, 2, 1, 3, 1, 2, 2, 2, 1, 2],
|
||
[59, 1, 26, 1, 28, 1, 2, 1, 12],
|
||
[0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 3, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 1, 1, 2, 2, 1, 3, 1, 2, 1, 2],
|
||
[0, 12, 1, 3, 1, 3, 1, 5, 1, 11, 1, 3, 1, 3, 1, 18, 1, 3, 1, 3, 1, 18, 1, 3, 1, 3, 1, 27, 1, 2],
|
||
[1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 1, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 15, 2, 4],
|
||
[0, 1, 2, 2, 2, 2, 1, 3, 1, 3, 1, 3, 1, 2, 2, 2, 3, 2, 2, 2, 1, 3, 1, 3, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 3, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 3, 1, 2, 2, 2, 15, 2, 4],
|
||
[1, 1, 3, 1, 3, 1, 14, 1, 3, 1, 1, 1, 3, 1, 14, 1, 3, 1, 3, 1, 3, 1, 18, 1, 3, 1, 3, 1, 3, 1, 14, 1, 3, 15, 1, 2, 1, 1],
|
||
[0, 1, 1, 3, 1, 3, 1, 10, 1, 3, 1, 3, 1, 1, 1, 3, 1, 3, 1, 10, 1, 3, 1, 3, 1, 3, 1, 3, 1, 14, 1, 3, 1, 3, 1, 3, 1, 3, 1, 10, 1, 20, 1, 1, 1],
|
||
[1, 2, 2, 1, 3, 1, 3, 1, 3, 1, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 1, 3, 1, 3, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 3, 1, 20, 3]
|
||
],
|
||
minBsYear: 1970,
|
||
maxBsYear: 2100,
|
||
minAdDateEqBsDate: {
|
||
"ad": {
|
||
"year": 1913, "month": 3, "date": 13
|
||
},
|
||
"bs": {
|
||
"year": 1970, "month": 1, "date": 1
|
||
}
|
||
}
|
||
};
|
||
|
||
var validationFunctions = {
|
||
validateRequiredParameters: function (requiredParameters) {
|
||
$.each(requiredParameters, function (key, value) {
|
||
if (typeof value === "undefined" || value === null) {
|
||
throw new ReferenceError("Missing required parameters: " + Object.keys(requiredParameters).join(", "));
|
||
}
|
||
});
|
||
},
|
||
validateBsYear: function (bsYear) {
|
||
if (typeof bsYear !== "number" || bsYear === null) {
|
||
throw new TypeError("Invalid parameter bsYear value");
|
||
} else if (bsYear < calendarData.minBsYear || bsYear > calendarData.maxBsYear) {
|
||
throw new RangeError("Parameter bsYear value should be in range of " + calendarData.minBsYear + " to " + calendarData.maxBsYear);
|
||
}
|
||
},
|
||
validateAdYear: function (adYear) {
|
||
if (typeof adYear !== "number" || adYear === null) {
|
||
throw new TypeError("Invalid parameter adYear value");
|
||
} else if (adYear < calendarData.minBsYear - 57 || adYear > calendarData.maxBsYear - 57) {
|
||
throw new RangeError("Parameter adYear value should be in range of " + (calendarData.minBsYear - 57) + " to " + (calendarData.maxBsYear - 57));
|
||
}
|
||
},
|
||
validateBsMonth: function (bsMonth) {
|
||
if (typeof bsMonth !== "number" || bsMonth === null) {
|
||
throw new TypeError("Invalid parameter bsMonth value");
|
||
} else if (bsMonth < 1 || bsMonth > 12) {
|
||
throw new RangeError("Parameter bsMonth value should be in range of 1 to 12");
|
||
}
|
||
},
|
||
validateAdMonth: function (adMonth) {
|
||
if (typeof adMonth !== "number" || adMonth === null) {
|
||
throw new TypeError("Invalid parameter adMonth value");
|
||
} else if (adMonth < 1 || adMonth > 12) {
|
||
throw new RangeError("Parameter adMonth value should be in range of 1 to 12");
|
||
}
|
||
},
|
||
validateBsDate: function (bsDate) {
|
||
if (typeof bsDate !== "number" || bsDate === null) {
|
||
throw new TypeError("Invalid parameter bsDate value");
|
||
} else if (bsDate < 1 || bsDate > 32) {
|
||
throw new RangeError("Parameter bsDate value should be in range of 1 to 32");
|
||
}
|
||
},
|
||
validateAdDate: function (adDate) {
|
||
if (typeof adDate !== "number" || adDate === null) {
|
||
throw new TypeError("Invalid parameter adDate value");
|
||
} else if (adDate < 1 || adDate > 31) {
|
||
throw new RangeError("Parameter adDate value should be in range of 1 to 31");
|
||
}
|
||
},
|
||
validatePositiveNumber: function (numberParameters) {
|
||
$.each(numberParameters, function (key, value) {
|
||
if (typeof value !== "number" || value === null || value < 0) {
|
||
throw new ReferenceError("Invalid parameters: " + Object.keys(numberParameters).join(", "));
|
||
} else if (key === "yearDiff" && value > (calendarData.maxBsYear - calendarData.minBsYear + 1)) {
|
||
throw new RangeError("Parameter yearDiff value should be in range of 0 to " + (calendarData.maxBsYear - calendarData.minBsYear + 1));
|
||
}
|
||
});
|
||
}
|
||
};
|
||
|
||
$.extend(calendarFunctions, {
|
||
/**
|
||
* Return equivalent number in nepaliNumber
|
||
* @param {Number} number
|
||
* @returns {String} nepaliNumber
|
||
*/
|
||
getNepaliNumber: function (number) {
|
||
if (typeof number === "undefined") {
|
||
throw new Error("Parameter number is required");
|
||
} else if (typeof number != "number" || number < 0) {
|
||
throw new Error("Number should be positive integer");
|
||
}
|
||
|
||
var prefixNum = Math.floor(number / 10);
|
||
var suffixNum = number % 10;
|
||
if (prefixNum !== 0) {
|
||
return calendarFunctions.getNepaliNumber(prefixNum) + calendarData.nepaliNumbers[suffixNum];
|
||
} else {
|
||
return calendarData.nepaliNumbers[suffixNum];
|
||
}
|
||
},
|
||
/**
|
||
* Return equivalent number from nepaliNumber
|
||
* @param {String} nepaliNumber
|
||
* @returns {Number} number
|
||
*/
|
||
getNumberByNepaliNumber: function (nepaliNumber) {
|
||
if (typeof nepaliNumber === "undefined") {
|
||
throw new Error("Parameter nepaliNumber is required");
|
||
} else if (typeof nepaliNumber !== "string") {
|
||
throw new Error("Parameter nepaliNumber should be in string");
|
||
}
|
||
|
||
var number = 0;
|
||
for (var i = 0; i < nepaliNumber.length; i++) {
|
||
var numIndex = calendarData.nepaliNumbers.indexOf(nepaliNumber.charAt(i));
|
||
if (numIndex === -1) {
|
||
throw new Error("Invalid nepali number");
|
||
}
|
||
number = number * 10 + numIndex;
|
||
}
|
||
|
||
return number;
|
||
},
|
||
getBsMonthInfoByBsDate: function (bsYear, bsMonth, bsDate, dateFormatPattern) {
|
||
validationFunctions.validateRequiredParameters({"bsYear": bsYear, "bsMonth": bsMonth, "bsDate": bsDate});
|
||
validationFunctions.validateBsYear(bsYear);
|
||
validationFunctions.validateBsMonth(bsMonth);
|
||
validationFunctions.validateBsDate(bsDate);
|
||
if (dateFormatPattern === null) {
|
||
dateFormatPattern = "%D, %M %d, %y";
|
||
} else if (typeof dateFormatPattern != "string") {
|
||
throw new TypeError("Invalid parameter dateFormatPattern value");
|
||
}
|
||
|
||
var daysNumFromMinBsYear = calendarFunctions.getTotalDaysNumFromMinBsYear(bsYear, bsMonth, bsDate);
|
||
var adDate = new Date(calendarData.minAdDateEqBsDate.ad.year, calendarData.minAdDateEqBsDate.ad.month, calendarData.minAdDateEqBsDate.ad.date - 1);
|
||
adDate.setDate(adDate.getDate() + daysNumFromMinBsYear);
|
||
|
||
var bsMonthFirstAdDate = calendarFunctions.getAdDateByBsDate(bsYear, bsMonth, 1);
|
||
var bsMonthDays = calendarFunctions.getBsMonthDays(bsYear, bsMonth);
|
||
bsDate = (bsDate > bsMonthDays) ? bsMonthDays : bsDate;
|
||
var eqAdDate = calendarFunctions.getAdDateByBsDate(bsYear, bsMonth, bsDate);
|
||
var weekDay = eqAdDate.getDay() + 1;
|
||
var formattedDate = calendarFunctions.bsDateFormat(dateFormatPattern, bsYear, bsMonth, bsDate);
|
||
return {
|
||
bsYear: bsYear,
|
||
bsMonth: bsMonth,
|
||
bsDate: bsDate,
|
||
weekDay: weekDay,
|
||
formattedDate: formattedDate,
|
||
adDate: eqAdDate,
|
||
bsMonthFirstAdDate: bsMonthFirstAdDate,
|
||
bsMonthDays: bsMonthDays
|
||
};
|
||
},
|
||
getAdDateByBsDate: function (bsYear, bsMonth, bsDate) {
|
||
validationFunctions.validateRequiredParameters({"bsYear": bsYear, "bsMonth": bsMonth, "bsDate": bsDate});
|
||
validationFunctions.validateBsYear(bsYear);
|
||
validationFunctions.validateBsMonth(bsMonth);
|
||
validationFunctions.validateBsDate(bsDate);
|
||
var daysNumFromMinBsYear = calendarFunctions.getTotalDaysNumFromMinBsYear(bsYear, bsMonth, bsDate);
|
||
var adDate = new Date(calendarData.minAdDateEqBsDate.ad.year, calendarData.minAdDateEqBsDate.ad.month, calendarData.minAdDateEqBsDate.ad.date - 1);
|
||
adDate.setDate(adDate.getDate() + daysNumFromMinBsYear);
|
||
return adDate;
|
||
},
|
||
getTotalDaysNumFromMinBsYear: function (bsYear, bsMonth, bsDate) {
|
||
validationFunctions.validateRequiredParameters({"bsYear": bsYear, "bsMonth": bsMonth, "bsDate": bsDate});
|
||
validationFunctions.validateBsYear(bsYear);
|
||
validationFunctions.validateBsMonth(bsMonth);
|
||
validationFunctions.validateBsDate(bsDate);
|
||
|
||
if (bsYear < calendarData.minBsYear || bsYear > calendarData.maxBsYear) {
|
||
return null;
|
||
}
|
||
|
||
var daysNumFromMinBsYear = 0;
|
||
var diffYears = bsYear - calendarData.minBsYear;
|
||
for (var month = 1; month <= 12; month++) {
|
||
if (month < bsMonth) {
|
||
daysNumFromMinBsYear += calendarFunctions.getMonthDaysNumFormMinBsYear(month, diffYears + 1);
|
||
} else {
|
||
daysNumFromMinBsYear += calendarFunctions.getMonthDaysNumFormMinBsYear(month, diffYears);
|
||
}
|
||
}
|
||
|
||
if (bsYear > 2085 && bsYear < 2088) {
|
||
daysNumFromMinBsYear += bsDate - 2;
|
||
} else if (bsYear === 2085 && bsMonth > 5) {
|
||
daysNumFromMinBsYear += bsDate - 2;
|
||
} else if (bsYear > 2088) {
|
||
daysNumFromMinBsYear += bsDate - 4;
|
||
} else if (bsYear === 2088 && bsMonth > 5) {
|
||
daysNumFromMinBsYear += bsDate - 4;
|
||
} else {
|
||
daysNumFromMinBsYear += bsDate;
|
||
}
|
||
|
||
return daysNumFromMinBsYear;
|
||
},
|
||
/**
|
||
* Return total number of bsMonth days from minYear
|
||
* @param {int} bsMonth
|
||
* @param {int} yearDiff
|
||
* @returns {int}
|
||
*/
|
||
getMonthDaysNumFormMinBsYear: function (bsMonth, yearDiff) {
|
||
validationFunctions.validateRequiredParameters({"bsMonth": bsMonth, "yearDiff": yearDiff});
|
||
validationFunctions.validateBsMonth(bsMonth);
|
||
validationFunctions.validatePositiveNumber({"yearDiff": yearDiff});
|
||
|
||
var yearCount = 0;
|
||
var monthDaysFromMinBsYear = 0;
|
||
if (yearDiff === 0) {
|
||
return 0;
|
||
}
|
||
|
||
var bsMonthData = calendarData.extractedBsMonthData[bsMonth - 1];
|
||
for (var i = 0; i < bsMonthData.length; i++) {
|
||
if (bsMonthData[i] === 0) {
|
||
continue;
|
||
}
|
||
|
||
var bsMonthUpperDaysIndex = i % 2;
|
||
if (yearDiff > yearCount + bsMonthData[i]) {
|
||
yearCount += bsMonthData[i];
|
||
monthDaysFromMinBsYear += calendarData.bsMonthUpperDays[bsMonth - 1][bsMonthUpperDaysIndex] * bsMonthData[i];
|
||
} else {
|
||
monthDaysFromMinBsYear += calendarData.bsMonthUpperDays[bsMonth - 1][bsMonthUpperDaysIndex] * (yearDiff - yearCount);
|
||
yearCount = yearDiff - yearCount;
|
||
break;
|
||
}
|
||
}
|
||
|
||
return monthDaysFromMinBsYear;
|
||
},
|
||
/**
|
||
* Return number of bsMonth days
|
||
* @param {int} bsYear
|
||
* @param {int} bsMonth
|
||
* @returns {int} days
|
||
*/
|
||
getBsMonthDays: function (bsYear, bsMonth) {
|
||
validationFunctions.validateRequiredParameters({"bsYear": bsYear, "bsMonth": bsMonth});
|
||
validationFunctions.validateBsYear(bsYear);
|
||
validationFunctions.validateBsMonth(bsMonth);
|
||
|
||
var yearCount = 0;
|
||
var totalYears = (bsYear + 1) - calendarData.minBsYear;
|
||
var bsMonthData = calendarData.extractedBsMonthData[bsMonth - 1];
|
||
for (var i = 0; i < bsMonthData.length; i++) {
|
||
if (bsMonthData[i] === 0) {
|
||
continue;
|
||
}
|
||
|
||
var bsMonthUpperDaysIndex = i % 2;
|
||
yearCount += bsMonthData[i];
|
||
if (totalYears <= yearCount) {
|
||
if ((bsYear === 2085 && bsMonth === 5) || (bsYear === 2088 && bsMonth === 5)) {
|
||
return calendarData.bsMonthUpperDays[bsMonth - 1][bsMonthUpperDaysIndex] - 2;
|
||
} else {
|
||
return calendarData.bsMonthUpperDays[bsMonth - 1][bsMonthUpperDaysIndex];
|
||
}
|
||
}
|
||
}
|
||
|
||
return null;
|
||
},
|
||
getBsDateByAdDate: function (adYear, adMonth, adDate) {
|
||
validationFunctions.validateRequiredParameters({"adYear": adYear, "adMonth": adMonth, "adDate": adDate});
|
||
validationFunctions.validateAdYear(adYear);
|
||
validationFunctions.validateAdMonth(adMonth);
|
||
validationFunctions.validateAdDate(adDate);
|
||
|
||
var bsYear = adYear + 57;
|
||
var bsMonth = (adMonth + 9 ) % 12;
|
||
bsMonth = bsMonth === 0 ? 12 : bsMonth;
|
||
var bsDate = 1;
|
||
|
||
if (adMonth < 4) {
|
||
bsYear -= 1;
|
||
} else if (adMonth === 4) {
|
||
var bsYearFirstAdDate = calendarFunctions.getAdDateByBsDate(bsYear, 1, 1);
|
||
if (adDate < bsYearFirstAdDate.getDate()) {
|
||
bsYear -= 1;
|
||
}
|
||
}
|
||
|
||
var bsMonthFirstAdDate = calendarFunctions.getAdDateByBsDate(bsYear, bsMonth, 1);
|
||
if (adDate >= 1 && adDate < bsMonthFirstAdDate.getDate()) {
|
||
bsMonth = (bsMonth !== 1) ? bsMonth - 1 : 12;
|
||
var bsMonthDays = calendarFunctions.getBsMonthDays(bsYear, bsMonth);
|
||
bsDate = bsMonthDays - (bsMonthFirstAdDate.getDate() - adDate) + 1;
|
||
} else {
|
||
bsDate = adDate - bsMonthFirstAdDate.getDate() + 1;
|
||
}
|
||
|
||
return {
|
||
bsYear: bsYear,
|
||
bsMonth: bsMonth,
|
||
bsDate: bsDate
|
||
};
|
||
},
|
||
getBsYearByAdDate: function (adYear, adMonth, adDate) {
|
||
validationFunctions.validateRequiredParameters({"adYear": adYear, "adMonth": adMonth, "adDate": adDate});
|
||
validationFunctions.validateAdYear(adYear);
|
||
validationFunctions.validateAdMonth(adMonth);
|
||
validationFunctions.validateAdDate(adDate);
|
||
|
||
var bsDate = calendarFunctions.getBsDateByAdDate(adYear, adMonth, adDate);
|
||
return bsDate.bsYear;
|
||
},
|
||
getBsMonthByAdDate: function (adYear, adMonth, adDate) {
|
||
validationFunctions.validateRequiredParameters({"adYear": adYear, "adMonth": adMonth, "adDate": adDate});
|
||
validationFunctions.validateAdYear(adYear);
|
||
validationFunctions.validateAdMonth(adMonth);
|
||
validationFunctions.validateAdDate(adDate);
|
||
|
||
var bsDate = calendarFunctions.getBsDateByAdDate(adYear, adMonth, adDate);
|
||
return bsDate.bsMonth;
|
||
},
|
||
bsDateFormat: function (dateFormatPattern, bsYear, bsMonth, bsDate) {
|
||
validationFunctions.validateRequiredParameters({
|
||
"dateFormatPattern": dateFormatPattern,
|
||
"bsYear": bsYear,
|
||
"bsMonth": bsMonth,
|
||
"bsDate": bsDate
|
||
});
|
||
validationFunctions.validateBsYear(bsYear);
|
||
validationFunctions.validateBsMonth(bsMonth);
|
||
validationFunctions.validateBsDate(bsDate);
|
||
|
||
var eqAdDate = calendarFunctions.getAdDateByBsDate(bsYear, bsMonth, bsDate);
|
||
var weekDay = eqAdDate.getDay() + 1;
|
||
var formattedDate = dateFormatPattern;
|
||
formattedDate = formattedDate.replace(/%d/g, calendarFunctions.getNepaliNumber(bsDate));
|
||
formattedDate = formattedDate.replace(/%y/g, calendarFunctions.getNepaliNumber(bsYear));
|
||
formattedDate = formattedDate.replace(/%m/g, calendarFunctions.getNepaliNumber(bsMonth));
|
||
formattedDate = formattedDate.replace(/%M/g, calendarData.bsMonths[bsMonth - 1]);
|
||
formattedDate = formattedDate.replace(/%D/g, calendarData.bsDays[weekDay - 1]);
|
||
return formattedDate;
|
||
},
|
||
parseFormattedBsDate: function (dateFormat, dateFormattedText) {
|
||
validationFunctions.validateRequiredParameters({
|
||
"dateFormat": dateFormat,
|
||
"dateFormattedText": dateFormattedText
|
||
});
|
||
|
||
var diffTextNum = 0;
|
||
var extractedFormattedBsDate = {
|
||
"bsYear": null,
|
||
"bsMonth": null,
|
||
"bsDate": null,
|
||
"bsDay": null
|
||
};
|
||
|
||
for (var i = 0; i < dateFormat.length; i++) {
|
||
if (dateFormat.charAt(i) === '%') {
|
||
var valueOf = dateFormat.substring(i, i + 2);
|
||
var endChar = dateFormat.charAt(i + 2);
|
||
var tempText = dateFormattedText.substring(i + diffTextNum);
|
||
var endIndex = (endChar !== '') ? tempText.indexOf(endChar) : tempText.length;
|
||
var value = tempText.substring(0, endIndex);
|
||
|
||
if (valueOf === "%y") {
|
||
extractedFormattedBsDate.bsYear = calendarFunctions.getNumberByNepaliNumber(value);
|
||
diffTextNum += value.length - 2;
|
||
} else if (valueOf === "%d") {
|
||
extractedFormattedBsDate.bsDate = calendarFunctions.getNumberByNepaliNumber(value);
|
||
diffTextNum += value.length - 2;
|
||
} else if (valueOf === "%D") {
|
||
extractedFormattedBsDate.bsDay = calendarData.bsDays.indexOf(value) + 1;
|
||
diffTextNum += value.length - 2;
|
||
} else if (valueOf === "%m") {
|
||
extractedFormattedBsDate.bsMonth = calendarFunctions.getNumberByNepaliNumber(value);
|
||
diffTextNum += value.length - 2;
|
||
} else if (valueOf === "%M") {
|
||
extractedFormattedBsDate.bsMonth = calendarData.bsMonths.indexOf(value) + 1;
|
||
diffTextNum += value.length - 2;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!extractedFormattedBsDate.bsDay) {
|
||
var eqAdDate = calendarFunctions.getAdDateByBsDate(extractedFormattedBsDate.bsYear, extractedFormattedBsDate.bsMonth, extractedFormattedBsDate.bsDate);
|
||
extractedFormattedBsDate.bsDay = eqAdDate.getDay() + 1;
|
||
}
|
||
|
||
return extractedFormattedBsDate;
|
||
}
|
||
});
|
||
|
||
$.fn.nepaliDatePicker = function (options) {
|
||
var datePickerPlugin = {
|
||
options: $.extend({
|
||
dateFormat: "%D, %M %d, %y",
|
||
closeOnDateSelect: true,
|
||
defaultDate: "",
|
||
minDate: null,
|
||
maxDate: null,
|
||
yearStart: calendarData.minBsYear,
|
||
yearEnd: calendarData.maxBsYear
|
||
}, options),
|
||
init: function ($element) {
|
||
$element.prop("readonly", true);
|
||
var $nepaliDatePicker = $('<div class="nepali-date-picker">');
|
||
$('body').append($nepaliDatePicker);
|
||
if ($element.val() !== '') {
|
||
datePickerPlugin.renderFormattedSpecificDateCalendar($nepaliDatePicker, datePickerPlugin.options.dateFormat, $element.val());
|
||
} else {
|
||
datePickerPlugin.renderCurrentMonthCalendar($nepaliDatePicker);
|
||
}
|
||
datePickerPlugin.addEventHandler($element, $nepaliDatePicker);
|
||
datePickerPlugin.addCommonEventHandler($nepaliDatePicker);
|
||
},
|
||
addCommonEventHandler: function () {
|
||
var $datePickerWrapper = $(".nepali-date-picker");
|
||
$(document).click(function (event) {
|
||
var $targetElement = $(event.target);
|
||
if (!$targetElement.is($(".nepali-date-picker"))) {
|
||
$datePickerWrapper.hide();
|
||
$datePickerWrapper.find(".drop-down-content").hide();
|
||
}
|
||
});
|
||
},
|
||
addEventHandler: function ($element, $nepaliDatePicker) {
|
||
$element.click(function () {
|
||
if ($(".nepali-date-picker").is(":visible")) {
|
||
$(".nepali-date-picker").hide();
|
||
return;
|
||
}
|
||
|
||
var inputFieldPosition = $(this).offset();
|
||
$nepaliDatePicker.css({
|
||
"top": inputFieldPosition.top + $(this).outerHeight(true),
|
||
"left": inputFieldPosition.left
|
||
});
|
||
|
||
if ($element.val()) {
|
||
datePickerPlugin.renderFormattedSpecificDateCalendar($nepaliDatePicker, datePickerPlugin.options.dateFormat, $element.val());
|
||
}
|
||
$nepaliDatePicker.show();
|
||
datePickerPlugin.eventFire($element, $nepaliDatePicker, "show");
|
||
|
||
return false;
|
||
});
|
||
|
||
$nepaliDatePicker.on("click", ".next-btn", function (event) {
|
||
event.preventDefault();
|
||
var preCalendarData = {
|
||
"bsYear": $nepaliDatePicker.data().bsYear,
|
||
"bsMonth": $nepaliDatePicker.data().bsMonth,
|
||
"bsDate": $nepaliDatePicker.data().bsDate
|
||
};
|
||
datePickerPlugin.renderNextMonthCalendar($nepaliDatePicker);
|
||
datePickerPlugin.triggerChangeEvent($element, $nepaliDatePicker, preCalendarData);
|
||
$nepaliDatePicker.show();
|
||
|
||
return false;
|
||
});
|
||
|
||
$nepaliDatePicker.on("click", ".prev-btn", function (event) {
|
||
event.preventDefault();
|
||
var preCalendarData = {
|
||
"bsYear": $nepaliDatePicker.data().bsYear,
|
||
"bsMonth": $nepaliDatePicker.data().bsMonth,
|
||
"bsDate": $nepaliDatePicker.data().bsDate
|
||
};
|
||
datePickerPlugin.renderPreviousMonthCalendar($nepaliDatePicker);
|
||
var calendarData = $nepaliDatePicker.data();
|
||
datePickerPlugin.triggerChangeEvent($element, $nepaliDatePicker, preCalendarData);
|
||
$nepaliDatePicker.show();
|
||
|
||
return false;
|
||
});
|
||
|
||
$nepaliDatePicker.on("click", ".today-btn", function (event) {
|
||
event.preventDefault();
|
||
var preCalendarData = {
|
||
"bsYear": $nepaliDatePicker.data().bsYear,
|
||
"bsMonth": $nepaliDatePicker.data().bsMonth,
|
||
"bsDate": $nepaliDatePicker.data().bsDate
|
||
};
|
||
datePickerPlugin.renderCurrentMonthCalendar($nepaliDatePicker);
|
||
var calendarData = $nepaliDatePicker.data();
|
||
datePickerPlugin.triggerChangeEvent($element, $nepaliDatePicker, preCalendarData);
|
||
$nepaliDatePicker.show();
|
||
|
||
return false;
|
||
});
|
||
|
||
$nepaliDatePicker.on("click", ".current-year-txt, .current-month-txt", function () {
|
||
if (!$(this).find(".drop-down-content").is(":visible")) {
|
||
$nepaliDatePicker.find(".drop-down-content").hide();
|
||
$(this).find(".drop-down-content").show();
|
||
var $optionWrapper = $(this).find(".option-wrapper");
|
||
$optionWrapper.scrollTop(0);
|
||
var scrollTopTo = $optionWrapper.find(".active").position().top;
|
||
$optionWrapper.scrollTop(scrollTopTo);
|
||
} else {
|
||
$(this).find(".drop-down-content").hide();
|
||
}
|
||
|
||
return false;
|
||
});
|
||
|
||
$nepaliDatePicker.on("click", ".current-month-date", function () {
|
||
if ($(this).hasClass("disable")) {
|
||
return;
|
||
}
|
||
|
||
var datePickerData = $nepaliDatePicker.data();
|
||
var bsYear = datePickerData.bsYear;
|
||
var bsMonth = datePickerData.bsMonth;
|
||
var preDate = datePickerData.bsDate;
|
||
var bsDate = $(this).data("date");
|
||
var dateText = calendarFunctions.bsDateFormat(datePickerPlugin.options.dateFormat, bsYear, bsMonth, bsDate);
|
||
$element.val(dateText);
|
||
datePickerPlugin.setCalendarDate($nepaliDatePicker, bsYear, bsMonth, bsDate);
|
||
datePickerPlugin.renderMonthCalendar($nepaliDatePicker);
|
||
|
||
|
||
if (preDate !== bsDate)
|
||
datePickerPlugin.eventFire($element, $nepaliDatePicker, "dateChange");
|
||
datePickerPlugin.eventFire($element, $nepaliDatePicker, "dateSelect");
|
||
|
||
if (datePickerPlugin.options.closeOnDateSelect) {
|
||
$nepaliDatePicker.hide();
|
||
} else {
|
||
$nepaliDatePicker.show();
|
||
}
|
||
|
||
return false;
|
||
});
|
||
|
||
$nepaliDatePicker.on("click", ".drop-down-content li", function () {
|
||
var $dropDown = $(this).parents(".drop-down-content");
|
||
$dropDown.data("value", $(this).data("value"));
|
||
$dropDown.attr("data-value", $(this).data("value"));
|
||
|
||
var preCalendarData = {
|
||
"bsYear": $nepaliDatePicker.data().bsYear,
|
||
"bsMonth": $nepaliDatePicker.data().bsMonth,
|
||
"bsDate": $nepaliDatePicker.data().bsDate
|
||
};
|
||
var bsMonth = $nepaliDatePicker.find(".month-drop-down").data("value");
|
||
var bsYear = $nepaliDatePicker.find(".year-drop-down").data("value");
|
||
var bsDate = preCalendarData.bsDate;
|
||
datePickerPlugin.setCalendarDate($nepaliDatePicker, bsYear, bsMonth, bsDate);
|
||
datePickerPlugin.renderMonthCalendar($nepaliDatePicker);
|
||
var calendarData = $nepaliDatePicker.data();
|
||
datePickerPlugin.triggerChangeEvent($element, $nepaliDatePicker, preCalendarData);
|
||
$nepaliDatePicker.show();
|
||
|
||
return false;
|
||
});
|
||
},
|
||
triggerChangeEvent: function ($element, $nepaliDatePicker, preCalendarData) {
|
||
var calendarData = $nepaliDatePicker.data();
|
||
if (preCalendarData.bsYear !== calendarData.bsYear) {
|
||
datePickerPlugin.eventFire($element, $nepaliDatePicker, "yearChange");
|
||
}
|
||
|
||
if (preCalendarData.bsMonth !== calendarData.bsMonth) {
|
||
datePickerPlugin.eventFire($element, $nepaliDatePicker, "monthChange");
|
||
}
|
||
|
||
if (preCalendarData.bsDate !== calendarData.bsDate) {
|
||
datePickerPlugin.eventFire($element, $nepaliDatePicker, "dateChange");
|
||
}
|
||
},
|
||
eventFire: function ($element, $nepaliDatePicker, eventType) {
|
||
switch (eventType) {
|
||
case "generate":
|
||
$element.trigger({
|
||
type: eventType,
|
||
message: 'Nepali date picker initialize',
|
||
datePickerData: $nepaliDatePicker.data(),
|
||
time: new Date()
|
||
});
|
||
break;
|
||
case "show":
|
||
$element.trigger({
|
||
type: eventType,
|
||
message: 'Show nepali date picker',
|
||
datePickerData: $nepaliDatePicker.data(),
|
||
time: new Date()
|
||
});
|
||
break;
|
||
case "close":
|
||
$element.trigger({
|
||
type: eventType,
|
||
message: 'close nepali date picker',
|
||
datePickerData: $nepaliDatePicker.data(),
|
||
time: new Date()
|
||
});
|
||
break;
|
||
case "dateSelect" :
|
||
$element.trigger({
|
||
type: eventType,
|
||
message: 'Select date',
|
||
datePickerData: $nepaliDatePicker.data(),
|
||
time: new Date()
|
||
});
|
||
break;
|
||
case "dateChange" :
|
||
$element.trigger({
|
||
type: eventType,
|
||
message: 'Change date',
|
||
datePickerData: $nepaliDatePicker.data(),
|
||
time: new Date()
|
||
});
|
||
break;
|
||
case "monthChange" :
|
||
$element.trigger({
|
||
type: eventType,
|
||
message: 'Change month',
|
||
datePickerData: $nepaliDatePicker.data(),
|
||
time: new Date()
|
||
});
|
||
break;
|
||
case "yearChange":
|
||
$element.trigger({
|
||
type: eventType,
|
||
message: 'Change year',
|
||
datePickerData: $nepaliDatePicker.data(),
|
||
time: new Date()
|
||
});
|
||
break;
|
||
default :
|
||
break;
|
||
}
|
||
},
|
||
setCalendarDate: function ($nepaliDatePicker, bsYear, bsMonth, BsDate) {
|
||
$nepaliDatePicker.data(calendarFunctions.getBsMonthInfoByBsDate(bsYear, bsMonth, BsDate, datePickerPlugin.options.dateFormat));
|
||
},
|
||
renderMonthCalendar: function ($nepaliDatePicker) {
|
||
$nepaliDatePicker.find(".calendar-wrapper").remove();
|
||
$nepaliDatePicker.append(datePickerPlugin.getCalendar($nepaliDatePicker)).hide();
|
||
},
|
||
getCalendar: function ($nepaliDatePicker) {
|
||
var calendarWrapper = $('<div class="calendar-wrapper">');
|
||
calendarWrapper.append(datePickerPlugin.getCalendarController($nepaliDatePicker));
|
||
var calendarTable = $("<table>");
|
||
calendarTable.append(datePickerPlugin.getCalendarHeader());
|
||
calendarTable.append(datePickerPlugin.getCalendarBody($nepaliDatePicker));
|
||
calendarWrapper.append(calendarTable);
|
||
|
||
return calendarWrapper;
|
||
},
|
||
getCalendarController: function ($nepaliDatePicker) {
|
||
var calendarController = $("<div class='calendar-controller'>");
|
||
calendarController.append('<a href="javascript:void(0);" class="prev-btn icon" title="prev"></a>');
|
||
calendarController.append('<a href="javascript:void(0);" class="today-btn icon" title=""></a>');
|
||
calendarController.append(datePickerPlugin.getMonthDropOption($nepaliDatePicker));
|
||
calendarController.append(datePickerPlugin.getYearDropOption($nepaliDatePicker));
|
||
calendarController.append('<a href="javascript:void(0);" class="next-btn icon" title="next"></a>');
|
||
|
||
return calendarController;
|
||
},
|
||
getMonthDropOption: function ($nepaliDatePicker) {
|
||
var datePickerData = $nepaliDatePicker.data();
|
||
var $monthSpan = $('<div class="current-month-txt">');
|
||
$monthSpan.text(calendarData.bsMonths[datePickerData.bsMonth - 1]);
|
||
$monthSpan.append('<i class="icon icon-drop-down">');
|
||
|
||
var data = [];
|
||
for (var i = 0; i < 12; i++) {
|
||
data.push({
|
||
"label": calendarData.bsMonths[i],
|
||
"value": i + 1
|
||
});
|
||
}
|
||
|
||
var $monthDropOption = datePickerPlugin.getCustomSelectOption(data, datePickerData.bsMonth).addClass("month-drop-down");
|
||
$monthSpan.append($monthDropOption);
|
||
|
||
return $monthSpan;
|
||
},
|
||
getYearDropOption: function ($nepaliDatePicker) {
|
||
var datePickerData = $nepaliDatePicker.data();
|
||
var $yearSpan = $('<div class="current-year-txt">');
|
||
$yearSpan.text(calendarFunctions.getNepaliNumber(datePickerData.bsYear));
|
||
$yearSpan.append('<i class="icon icon-drop-down">');
|
||
var data = [];
|
||
for (var i = datePickerPlugin.options.yearStart; i <= datePickerPlugin.options.yearEnd; i++) {
|
||
data.push({
|
||
"label": calendarFunctions.getNepaliNumber(i),
|
||
"value": i
|
||
});
|
||
}
|
||
|
||
var $yearDropOption = datePickerPlugin.getCustomSelectOption(data, datePickerData.bsYear).addClass("year-drop-down");
|
||
$yearSpan.append($yearDropOption);
|
||
|
||
return $yearSpan;
|
||
},
|
||
getCustomSelectOption: function (datas, activeValue) {
|
||
var $dropDown = $('<div class="drop-down-content" data-value="' + activeValue + '">');
|
||
var $dropDownWrapper = $('<div class="option-wrapper">');
|
||
var $ul = $('<ul>');
|
||
$.each(datas, function (index, data) {
|
||
$ul.append('<li data-value="' + data.value + '">' + data.label + '</li>');
|
||
});
|
||
|
||
$dropDownWrapper.append($ul);
|
||
$ul.find('li[data-value="' + activeValue + '"]').addClass("active");
|
||
$dropDown.append($dropDownWrapper);
|
||
|
||
return $dropDown;
|
||
},
|
||
getCalendarHeader: function () {
|
||
var calendarHeader = $("<thead>");
|
||
var tableRow = $("<tr>");
|
||
for (var i = 0; i < 7; i++) {
|
||
tableRow.append("<td>" + calendarData.bsDays[i] + "</td>");
|
||
}
|
||
|
||
calendarHeader.append(tableRow);
|
||
return calendarHeader;
|
||
},
|
||
getCalendarBody: function ($nepaliDatePicker) {
|
||
var datePickerData = $nepaliDatePicker.data();
|
||
var weekCoverInMonth = Math.ceil((datePickerData.bsMonthFirstAdDate.getDay() + datePickerData.bsMonthDays) / 7);
|
||
var preMonth = (datePickerData.bsMonth - 1 !== 0) ? datePickerData.bsMonth - 1 : 12;
|
||
var preYear = preMonth === 12 ? datePickerData.bsYear - 1 : datePickerData.bsYear;
|
||
var preMonthDays = preYear >= calendarData.minBsYear ? calendarFunctions.getBsMonthDays(preYear, preMonth) : 30;
|
||
var minBsDate = null;
|
||
var maxBsDate = null;
|
||
|
||
if (datePickerPlugin.options.minDate !== null) {
|
||
minBsDate = calendarFunctions.parseFormattedBsDate(datePickerPlugin.options.dateFormat, datePickerPlugin.options.minDate);
|
||
}
|
||
if (datePickerPlugin.options.maxDate !== null) {
|
||
maxBsDate = calendarFunctions.parseFormattedBsDate(datePickerPlugin.options.dateFormat, datePickerPlugin.options.maxDate);
|
||
}
|
||
var calendarBody = $("<tbody>");
|
||
for (var i = 0; i < weekCoverInMonth; i++) {
|
||
var tableRow = $("<tr>");
|
||
for (var k = 1; k <= 7; k++) {
|
||
var calendarDate = (i * 7 ) + k - datePickerData.bsMonthFirstAdDate.getDay();
|
||
var isCurrentMonthDate = true;
|
||
if (calendarDate <= 0) {
|
||
calendarDate = preMonthDays + calendarDate;
|
||
isCurrentMonthDate = false;
|
||
} else if (calendarDate > datePickerData.bsMonthDays) {
|
||
calendarDate = calendarDate - datePickerData.bsMonthDays;
|
||
isCurrentMonthDate = false;
|
||
}
|
||
|
||
if (isCurrentMonthDate) {
|
||
var $td = $('<td class="current-month-date" data-date="' + calendarDate + '" data-weekDay="' + (k - 1) + '">' +
|
||
calendarFunctions.getNepaliNumber(calendarDate) + '</td>');
|
||
if (calendarDate == datePickerData.bsDate) {
|
||
$td.addClass("active");
|
||
}
|
||
datePickerPlugin.disableIfOutOfRange($td, datePickerData, minBsDate, maxBsDate, calendarDate);
|
||
tableRow.append($td);
|
||
} else {
|
||
tableRow.append('<td class="other-month-date">' + calendarFunctions.getNepaliNumber(calendarDate) + '</td>');
|
||
}
|
||
}
|
||
|
||
|
||
calendarBody.append(tableRow);
|
||
}
|
||
|
||
|
||
return calendarBody;
|
||
},
|
||
disableIfOutOfRange: function ($td, datePickerData, minBsDate, maxBsDate, calendarDate) {
|
||
if (minBsDate !== null) {
|
||
if (datePickerData.bsYear < minBsDate.bsYear) {
|
||
$td.addClass("disable");
|
||
} else if (datePickerData.bsYear === minBsDate.bsYear && datePickerData.bsMonth < minBsDate.bsMonth) {
|
||
$td.addClass("disable");
|
||
} else if (datePickerData.bsYear === minBsDate.bsYear && datePickerData.bsMonth === minBsDate.bsMonth && calendarDate < minBsDate.bsDate) {
|
||
$td.addClass("disable");
|
||
}
|
||
}
|
||
|
||
if (maxBsDate !== null) {
|
||
if (datePickerData.bsYear > maxBsDate.bsYear) {
|
||
$td.addClass("disable");
|
||
} else if (datePickerData.bsYear === maxBsDate.bsYear && datePickerData.bsMonth > maxBsDate.bsMonth) {
|
||
$td.addClass("disable");
|
||
} else if (datePickerData.bsYear === maxBsDate.bsYear && datePickerData.bsMonth === maxBsDate.bsMonth && calendarDate > maxBsDate.bsDate) {
|
||
$td.addClass("disable");
|
||
}
|
||
}
|
||
|
||
return $td;
|
||
},
|
||
renderCurrentMonthCalendar: function ($nepaliDatePicker) {
|
||
var currentDate = new Date();
|
||
var currentBsDate = calendarFunctions.getBsDateByAdDate(currentDate.getFullYear(), currentDate.getMonth() + 1, currentDate.getDate());
|
||
var bsYear = currentBsDate.bsYear;
|
||
var bsMonth = currentBsDate.bsMonth;
|
||
var bsDate = currentBsDate.bsDate;
|
||
datePickerPlugin.setCalendarDate($nepaliDatePicker, bsYear, bsMonth, bsDate);
|
||
datePickerPlugin.renderMonthCalendar($nepaliDatePicker);
|
||
},
|
||
renderPreviousMonthCalendar: function ($nepaliDatePicker) {
|
||
var datePickerData = $nepaliDatePicker.data();
|
||
var prevMonth = (datePickerData.bsMonth - 1 > 0) ? datePickerData.bsMonth - 1 : 12;
|
||
var prevYear = (prevMonth !== 12) ? datePickerData.bsYear : datePickerData.bsYear - 1;
|
||
var prevDate = datePickerData.bsDate;
|
||
if (prevYear < datePickerPlugin.options.yearStart || prevYear > datePickerPlugin.options.yearEnd) {
|
||
return null;
|
||
}
|
||
datePickerPlugin.setCalendarDate($nepaliDatePicker, prevYear, prevMonth, prevDate);
|
||
datePickerPlugin.renderMonthCalendar($nepaliDatePicker);
|
||
},
|
||
renderNextMonthCalendar: function ($nepaliDatePicker) {
|
||
var datePickerData = $nepaliDatePicker.data();
|
||
var nextMonth = (datePickerData.bsMonth + 1 <= 12) ? datePickerData.bsMonth + 1 : 1;
|
||
var nextYear = (nextMonth !== 1) ? datePickerData.bsYear : datePickerData.bsYear + 1;
|
||
var nextDate = datePickerData.bsDate;
|
||
if (nextYear < datePickerPlugin.options.yearStart || nextYear > datePickerPlugin.options.yearEnd) {
|
||
return null;
|
||
}
|
||
datePickerPlugin.setCalendarDate($nepaliDatePicker, nextYear, nextMonth, nextDate);
|
||
datePickerPlugin.renderMonthCalendar($nepaliDatePicker);
|
||
},
|
||
renderFormattedSpecificDateCalendar: function ($nepaliDatePicker, dateFormat, dateFormattedText) {
|
||
var datePickerDate = calendarFunctions.parseFormattedBsDate(dateFormat, dateFormattedText);
|
||
datePickerPlugin.setCalendarDate($nepaliDatePicker, datePickerDate.bsYear, datePickerDate.bsMonth, datePickerDate.bsDate);
|
||
datePickerPlugin.renderMonthCalendar($nepaliDatePicker);
|
||
}
|
||
};
|
||
|
||
this.each(function () {
|
||
var $element = $(this);
|
||
datePickerPlugin.init($element);
|
||
});
|
||
|
||
datePickerPlugin.addCommonEventHandler();
|
||
return this;
|
||
};
|
||
}(jQuery, calendarFunctions));
|